From 4a9c444b102a99b509f1216a98709384371d81b0 Mon Sep 17 00:00:00 2001 From: strepsiades Date: Mon, 9 Mar 2026 16:31:42 +0800 Subject: [PATCH] first commit --- .../test_push_system.instructions.md | 16 + .gitignore | 97 + README.md | 90 + docs/architecture.md | 66 + docs/archive/README.md | 11 + docs/archive/conflict_log.md | 10 + docs/archive/docs/api_datasource_design.md | 706 ++++ .../datasource_handler_architecture_v2.md | 518 +++ .../archive/docs/node_id_data_id_lifecycle.md | 150 + docs/archive/docs/skip_sync_behavior_fix.md | 232 ++ docs/archive/docs/业务流程与依赖关系.md | 72 + docs/archive/docs/代码重构提纲.md | 1028 +++++ docs/archive/docs/持久化与人工介入规范.md | 152 + docs/archive/docs/架构分层设计.md | 112 + docs/archive/docs/状态定义规范.md | 342 ++ docs/archive/docs/状态机形式化规范.md | 498 +++ docs/archive/docs/编排流程规范.md | 534 +++ docs/archive/docs/节点生命周期状态转移.md | 492 +++ docs/archive/from_root_docs/README.md | 14 + .../from_root_docs/api_datasource_design.md | 706 ++++ .../datasource_handler_architecture_v2.md | 518 +++ .../node_id_data_id_lifecycle.md | 150 + .../from_root_docs/skip_sync_behavior_fix.md | 232 ++ .../from_root_docs/业务流程与依赖关系.md | 72 + docs/archive/from_root_docs/代码重构提纲.md | 1028 +++++ .../from_root_docs/持久化与人工介入规范.md | 152 + docs/archive/from_root_docs/架构分层设计.md | 112 + docs/archive/from_root_docs/状态定义规范.md | 342 ++ .../from_root_docs/状态机形式化规范.md | 498 +++ docs/archive/from_root_docs/编排流程规范.md | 534 +++ .../from_root_docs/节点生命周期状态转移.md | 492 +++ docs/archive/goals.md | 11 + docs/archive/migration_map.md | 15 + docs/auto_test_spec/agent_auto_test_method.md | 454 +++ .../large_scale_test_control.md | 143 + docs/auto_test_spec/差异字段汇总清单.md | 42 + docs/collection_query_and_upgrade_plan.md | 165 + docs/datasource_guide.md | 243 ++ docs/library_integration_guide.md | 360 ++ docs/node_state_definition.md | 79 + docs/operations.md | 81 + docs/runtime_config_guide.md | 143 + docs/state_machine.md | 93 + docs/state_machine.mmd | 68 + docs/state_machine.svg | 67 + docs/sync_flow.md | 107 + docs/sync_issue_analysis_20260305.md | 158 + .../datasource/filtered/company_1.jsonl | 1 + .../filtered/construction_task_1.jsonl | 63 + .../filtered/construction_task_detail_1.jsonl | 87 + .../datasource/filtered/contract_1.jsonl | 65 + .../filtered/contract_change_1.jsonl | 1 + .../filtered/contract_settlement_1.jsonl | 65 + .../contract_settlement_detail_1.jsonl | 44 + .../datasource/filtered/lar_1.jsonl | 2 + .../datasource/filtered/lar_change_1.jsonl | 0 .../datasource/filtered/material_1.jsonl | 38 + .../filtered/material_detail_1.jsonl | 21 + .../datasource/filtered/personnel_1.jsonl | 2 + .../filtered/personnel_detail_1.jsonl | 0 .../datasource/filtered/preparation_1.jsonl | 40 + .../datasource/filtered/production_1.jsonl | 28 + .../datasource/filtered/project_1.jsonl | 2 + .../filtered/project_detail_data_1.jsonl | 8 + .../datasource/filtered/region_1.jsonl | 3463 +++++++++++++++++ .../datasource/filtered/supplier_1.jsonl | 28 + .../datasource/filtered/units_1.jsonl | 12 + pyproject.toml | 41 + pytest.ini | 13 + run.py | 64 + run_profiles/README.md | 18 + run_profiles/preset/README.md | 18 + run_profiles/preset/jsonl_to_api.default.yaml | 290 ++ .../preset/jsonl_to_jsonl.default.yaml | 284 ++ schemas/common/base.py | 108 + schemas/common/datetime.py | 13 + schemas/common/enums.py | 9 + schemas/common/push_system.py | 178 + schemas/common/validators.py | 85 + schemas/company/company.py | 40 + schemas/construction/construction.py | 121 + schemas/construction/construction_detail.py | 133 + schemas/contract/contract.py | 122 + .../contract_settlement.py | 101 + .../contract_settlement_detail.py | 128 + schemas/material/material.py | 147 + schemas/material/material_detail.py | 132 + schemas/power/power.py | 144 + schemas/power/power_detail.py | 133 + schemas/project/enums.py | 30 + schemas/project/project.py | 76 + schemas/project/project_base.py | 355 ++ schemas/project_extensions/contract_change.py | 75 + schemas/project_extensions/generator_unit.py | 34 + schemas/project_extensions/lar.py | 206 + schemas/project_extensions/preparation.py | 39 + schemas/project_extensions/production.py | 39 + schemas/project_extensions/project_detail.py | 33 + schemas/project_multi_type/__init__.py | 7 + schemas/project_multi_type/gas_turbine.py | 9 + schemas/project_multi_type/hydropower.py | 26 + schemas/project_multi_type/offshore_wind.py | 17 + schemas/project_multi_type/onshore_wind.py | 18 + schemas/project_multi_type/photovotaic.py | 15 + schemas/project_multi_type/pumped_storage.py | 29 + schemas/project_multi_type/thermal_power.py | 10 + schemas/supplier/supplier.py | 43 + schemas/user/user.py | 49 + scripts/README.md | 44 + scripts/analyze_state_signatures.py | 211 + scripts/auto_test_clear.py | 24 + scripts/auto_test_domains/base.py | 595 +++ scripts/auto_test_domains/company_case.py | 60 + .../construction_task_case.py | 98 + .../construction_task_detail_case.py | 93 + scripts/auto_test_domains/contract_case.py | 106 + .../auto_test_domains/contract_change_case.py | 135 + .../contract_settlement_case.py | 104 + .../contract_settlement_detail_case.py | 130 + scripts/auto_test_domains/lar_case.py | 122 + scripts/auto_test_domains/lar_change_case.py | 130 + scripts/auto_test_domains/material_case.py | 95 + .../auto_test_domains/material_detail_case.py | 94 + scripts/auto_test_domains/personnel_case.py | 123 + .../personnel_detail_case.py | 129 + scripts/auto_test_domains/preparation_case.py | 102 + scripts/auto_test_domains/production_case.py | 102 + scripts/auto_test_domains/project_case.py | 192 + .../project_detail_data_case.py | 427 ++ scripts/auto_test_domains/supplier_case.py | 57 + scripts/auto_test_domains/units_case.py | 110 + scripts/auto_test_init.py | 173 + scripts/auto_test_lib.py | 499 +++ .../build_filtered_datasource_for_projects.py | 232 ++ .../legacy/run_full_sync_pipeline_jsonl.py | 208 + .../legacy/run_full_sync_pipeline_jsonl_sm.py | 153 + .../legacy/run_full_sync_pipeline_simple.py | 179 + .../run_full_sync_pipeline_simple_sm.py | 143 + scripts/run_auto_test.py | 553 +++ scripts/run_auto_test_all_domains.py | 253 ++ scripts/run_copy_pipeline_jsonl.py | 33 + scripts/run_full_sync_pipeline_jsonl_sm.py | 53 + scripts/run_full_sync_pipeline_simple_sm.py | 53 + scripts/run_large_scale_auto_test.py | 444 +++ sync_state_machine/__init__.py | 57 + sync_state_machine/cli.py | 65 + sync_state_machine/common/__init__.py | 15 + sync_state_machine/common/binding.py | 161 + sync_state_machine/common/collection.py | 540 +++ sync_state_machine/common/persistence.py | 411 ++ sync_state_machine/common/registry.py | 267 ++ sync_state_machine/common/sync_node.py | 435 +++ sync_state_machine/common/type_safety.py | 15 + sync_state_machine/common/types.py | 48 + sync_state_machine/config/__init__.py | 51 + sync_state_machine/config/builder.py | 189 + .../config/datasource_config.py | 34 + sync_state_machine/config/logging_config.py | 30 + .../config/node_state_machine.yaml | 600 +++ sync_state_machine/config/persist_config.py | 13 + sync_state_machine/config/pipeline_config.py | 48 + sync_state_machine/config/run_presets.py | 86 + sync_state_machine/config/runtime_config.py | 43 + sync_state_machine/config/strategy_config.py | 113 + sync_state_machine/datasource/README.md | 252 ++ sync_state_machine/datasource/__init__.py | 41 + sync_state_machine/datasource/api/__init__.py | 15 + sync_state_machine/datasource/api/client.py | 627 +++ .../datasource/api/datasource.py | 264 ++ sync_state_machine/datasource/api/errors.py | 25 + sync_state_machine/datasource/api/handler.py | 538 +++ sync_state_machine/datasource/datasource.py | 962 +++++ sync_state_machine/datasource/handler.py | 579 +++ .../datasource/jsonl/__init__.py | 13 + .../datasource/jsonl/datasource.py | 67 + .../datasource/jsonl/handler.py | 350 ++ sync_state_machine/datasource/task_result.py | 122 + sync_state_machine/domain/__init__.py | 32 + .../domain/attachment/__init__.py | 8 + .../domain/attachment/api_handler.py | 102 + .../domain/attachment/jsonl_handler.py | 12 + .../domain/attachment/register.py | 16 + .../domain/attachment/sync_node.py | 17 + .../domain/attachment/sync_strategy.py | 20 + sync_state_machine/domain/company/__init__.py | 6 + .../domain/company/api_handler.py | 131 + .../domain/company/jsonl_handler.py | 11 + sync_state_machine/domain/company/register.py | 17 + .../domain/company/sync_node.py | 11 + .../domain/company/sync_strategy.py | 29 + .../domain/construction/__init__.py | 6 + .../domain/construction/api_handler.py | 321 ++ .../domain/construction/jsonl_handler.py | 10 + .../domain/construction/register.py | 17 + .../domain/construction/sync_node.py | 11 + .../domain/construction/sync_strategy.py | 20 + .../construction_task_detail/__init__.py | 8 + .../construction_task_detail/api_handler.py | 283 ++ .../construction_task_detail/jsonl_handler.py | 12 + .../construction_task_detail/register.py | 17 + .../construction_task_detail/sync_node.py | 11 + .../construction_task_detail/sync_strategy.py | 20 + .../domain/contract/__init__.py | 7 + .../domain/contract/api_handler.py | 329 ++ .../domain/contract/jsonl_handler.py | 14 + .../domain/contract/register.py | 17 + .../domain/contract/sync_node.py | 11 + .../domain/contract/sync_strategy.py | 30 + .../domain/contract_change/__init__.py | 13 + .../domain/contract_change/api_handler.py | 171 + .../domain/contract_change/jsonl_handler.py | 10 + .../domain/contract_change/register.py | 17 + .../domain/contract_change/sync_node.py | 10 + .../domain/contract_change/sync_strategy.py | 20 + .../domain/contract_settlement/__init__.py | 6 + .../domain/contract_settlement/api_handler.py | 313 ++ .../contract_settlement/jsonl_handler.py | 10 + .../domain/contract_settlement/register.py | 17 + .../domain/contract_settlement/sync_node.py | 11 + .../contract_settlement/sync_strategy.py | 20 + .../contract_settlement_detail/__init__.py | 8 + .../contract_settlement_detail/api_handler.py | 288 ++ .../jsonl_handler.py | 12 + .../contract_settlement_detail/register.py | 17 + .../contract_settlement_detail/sync_node.py | 11 + .../sync_strategy.py | 20 + sync_state_machine/domain/lar/__init__.py | 6 + sync_state_machine/domain/lar/api_handler.py | 218 ++ .../domain/lar/jsonl_handler.py | 10 + sync_state_machine/domain/lar/register.py | 17 + sync_state_machine/domain/lar/sync_node.py | 14 + .../domain/lar/sync_strategy.py | 20 + .../domain/lar_change/__init__.py | 8 + .../domain/lar_change/api_handler.py | 180 + .../domain/lar_change/jsonl_handler.py | 12 + .../domain/lar_change/register.py | 17 + .../domain/lar_change/sync_node.py | 10 + .../domain/lar_change/sync_strategy.py | 20 + .../domain/material/__init__.py | 6 + .../domain/material/api_handler.py | 355 ++ .../domain/material/jsonl_handler.py | 10 + .../domain/material/register.py | 17 + .../domain/material/sync_node.py | 11 + .../domain/material/sync_strategy.py | 20 + .../domain/material_detail/__init__.py | 8 + .../domain/material_detail/api_handler.py | 331 ++ .../domain/material_detail/jsonl_handler.py | 12 + .../domain/material_detail/register.py | 17 + .../domain/material_detail/sync_node.py | 11 + .../domain/material_detail/sync_strategy.py | 20 + .../domain/personnel/__init__.py | 6 + .../domain/personnel/api_handler.py | 260 ++ .../domain/personnel/jsonl_handler.py | 10 + .../domain/personnel/register.py | 17 + .../domain/personnel/sync_node.py | 11 + .../domain/personnel/sync_strategy.py | 20 + .../domain/personnel_detail/__init__.py | 8 + .../domain/personnel_detail/api_handler.py | 224 ++ .../domain/personnel_detail/jsonl_handler.py | 12 + .../domain/personnel_detail/register.py | 17 + .../domain/personnel_detail/sync_node.py | 11 + .../domain/personnel_detail/sync_strategy.py | 20 + .../domain/preparation/__init__.py | 6 + .../domain/preparation/api_handler.py | 153 + .../domain/preparation/jsonl_handler.py | 11 + .../domain/preparation/register.py | 23 + .../domain/preparation/sync_node.py | 14 + .../domain/preparation/sync_strategy.py | 38 + .../domain/production/__init__.py | 6 + .../domain/production/api_handler.py | 166 + .../domain/production/jsonl_handler.py | 10 + .../domain/production/register.py | 17 + .../domain/production/sync_node.py | 13 + .../domain/production/sync_strategy.py | 38 + sync_state_machine/domain/project/__init__.py | 6 + .../domain/project/api_handler.py | 395 ++ .../domain/project/jsonl_handler.py | 12 + sync_state_machine/domain/project/register.py | 17 + .../domain/project/sync_node.py | 11 + .../domain/project/sync_strategy.py | 29 + .../domain/project_detail/__init__.py | 6 + .../domain/project_detail/api_handler.py | 535 +++ .../domain/project_detail/jsonl_handler.py | 10 + .../domain/project_detail/register.py | 17 + .../domain/project_detail/sync_node.py | 41 + .../domain/project_detail/sync_strategy.py | 30 + sync_state_machine/domain/registry.py | 113 + .../domain/supplier/__init__.py | 9 + .../domain/supplier/api_handler.py | 145 + .../domain/supplier/jsonl_handler.py | 12 + .../domain/supplier/register.py | 17 + .../domain/supplier/sync_node.py | 11 + .../domain/supplier/sync_strategy.py | 55 + sync_state_machine/domain/units/__init__.py | 6 + .../domain/units/api_handler.py | 159 + .../domain/units/jsonl_handler.py | 60 + sync_state_machine/domain/units/register.py | 17 + sync_state_machine/domain/units/sync_node.py | 13 + .../domain/units/sync_strategy.py | 20 + sync_state_machine/domain/user/__init__.py | 6 + sync_state_machine/domain/user/api_handler.py | 132 + .../domain/user/jsonl_handler.py | 10 + sync_state_machine/domain/user/register.py | 17 + sync_state_machine/domain/user/sync_node.py | 14 + .../domain/user/sync_strategy.py | 20 + sync_state_machine/engine/__init__.py | 36 + sync_state_machine/engine/dispatcher.py | 88 + sync_state_machine/engine/evaluator.py | 10 + sync_state_machine/engine/events.py | 675 ++++ sync_state_machine/engine/invariants.py | 10 + sync_state_machine/engine/model.py | 72 + sync_state_machine/engine/semantics.py | 121 + sync_state_machine/engine/state_apply.py | 118 + sync_state_machine/pipeline/__init__.py | 47 + .../pipeline/copy_data_pipeline.py | 247 ++ sync_state_machine/pipeline/factory.py | 578 +++ .../pipeline/full_sync_pipeline.py | 488 +++ sync_state_machine/pipeline/run_logger.py | 65 + sync_state_machine/pipeline/summary_report.py | 150 + sync_state_machine/sync_system/__init__.py | 4 + sync_state_machine/sync_system/config.py | 20 + .../sync_system/error_formatter.py | 168 + sync_state_machine/sync_system/registry.py | 29 + sync_state_machine/sync_system/resolve_ids.py | 358 ++ sync_state_machine/sync_system/strategy.py | 291 ++ .../sync_system/strategy_ops/__init__.py | 31 + .../sync_system/strategy_ops/bind_ops.py | 560 +++ .../sync_system/strategy_ops/compare_ops.py | 89 + .../sync_system/strategy_ops/create_ops.py | 204 + .../sync_system/strategy_ops/delete_ops.py | 10 + .../strategy_ops/post_check_ops.py | 159 + .../sync_system/strategy_ops/reset_ops.py | 131 + .../sync_system/strategy_ops/update_ops.py | 302 ++ sync_state_machine/sync_system/utils.py | 128 + tests/README.md | 29 + tests/__init__.py | 1 + tests/conftest.py | 8 + .../fixtures/auto_sync/auto_test_config.yaml | 69 + .../common_baseline/company_1.jsonl | 1 + .../common_baseline/supplier_1.jsonl | 28 + .../round_1_create/company_1.jsonl | 1 + .../round_1_create/construction_task_1.jsonl | 1 + .../round_1_create/contract_1.jsonl | 2 + .../round_1_create/project_1.jsonl | 1 + .../round_2_update/company_1.jsonl | 1 + .../round_2_update/construction_task_1.jsonl | 1 + .../round_2_update/contract_1.jsonl | 2 + .../round_2_update/project_1.jsonl | 1 + .../round_1_create/construction_task_1.jsonl | 1 + .../construction_task_detail_1.jsonl | 2 + .../round_1_create/contract_1.jsonl | 2 + .../contract_settlement_1.jsonl | 1 + .../round_2_update/construction_task_1.jsonl | 1 + .../construction_task_detail_1.jsonl | 2 + .../round_2_update/contract_1.jsonl | 2 + .../contract_settlement_1.jsonl | 1 + .../contract/round_1_create/company_1.jsonl | 1 + .../contract/round_1_create/contract_1.jsonl | 3 + .../contract/round_1_create/project_1.jsonl | 1 + .../contract/round_1_create/supplier_1.jsonl | 28 + .../contract/round_2_update/company_1.jsonl | 1 + .../contract/round_2_update/contract_1.jsonl | 3 + .../contract/round_2_update/project_1.jsonl | 1 + .../round_1_create/contract_change_1.jsonl | 1 + .../round_2_update/contract_change_1.jsonl | 1 + .../round_1_create/company_1.jsonl | 1 + .../round_1_create/contract_1.jsonl | 4 + .../contract_settlement_1.jsonl | 2 + .../round_1_create/project_1.jsonl | 1 + .../round_1_create/supplier_1.jsonl | 1 + .../round_2_update/company_1.jsonl | 1 + .../round_2_update/contract_1.jsonl | 4 + .../contract_settlement_1.jsonl | 2 + .../round_2_update/project_1.jsonl | 1 + .../round_2_update/supplier_1.jsonl | 1 + .../contract_settlement_detail_1.jsonl | 2 + .../contract_settlement_detail_1.jsonl | 2 + .../datasource/lar/round_1_create/lar_1.jsonl | 1 + .../datasource/lar/round_2_update/lar_1.jsonl | 1 + .../round_1_create/lar_change_1.jsonl | 1 + .../round_2_update/lar_change_1.jsonl | 1 + .../material/round_1_create/contract_1.jsonl | 5 + .../contract_settlement_1.jsonl | 2 + .../material/round_1_create/material_1.jsonl | 1 + .../material/round_2_update/contract_1.jsonl | 5 + .../contract_settlement_1.jsonl | 2 + .../material/round_2_update/material_1.jsonl | 1 + .../round_1_create/contract_1.jsonl | 3 + .../contract_settlement_1.jsonl | 2 + .../round_1_create/material_1.jsonl | 1 + .../round_1_create/material_detail_1.jsonl | 1 + .../round_2_update/contract_1.jsonl | 3 + .../contract_settlement_1.jsonl | 2 + .../round_2_update/material_1.jsonl | 1 + .../round_2_update/material_detail_1.jsonl | 1 + .../round_1_create/personnel_1.jsonl | 1 + .../round_2_update/personnel_1.jsonl | 1 + .../ecm_sync_system.code-workspace | 11 + .../round_1_create/personnel_1.jsonl | 1 + .../round_1_create/personnel_detail_1.jsonl | 2 + .../round_2_update/personnel_1.jsonl | 1 + .../round_2_update/personnel_detail_1.jsonl | 2 + .../round_1_create/preparation_1.jsonl | 1 + .../round_1_create/production_1.jsonl | 1 + .../round_2_update/preparation_1.jsonl | 1 + .../round_2_update/production_1.jsonl | 1 + .../round_1_create/preparation_1.jsonl | 1 + .../round_1_create/production_1.jsonl | 3 + .../round_2_update/preparation_1.jsonl | 1 + .../round_2_update/production_1.jsonl | 3 + .../project/round_1_bind/project_1.jsonl | 1 + .../round_2_base_info_update/project_1.jsonl | 1 + .../round_3_investment_update/project_1.jsonl | 1 + .../round_1_create/preparation_1.jsonl | 1 + .../round_1_create/production_1.jsonl | 2 + .../round_1_create/project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../round_2_update/preparation_1.jsonl | 1 + .../round_2_update/production_1.jsonl | 2 + .../round_2_update/project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../preparation_1.jsonl | 1 + .../production_1.jsonl | 2 + .../project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../round_4_production_update/project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../project_1.jsonl | 1 + .../project_detail_data_1.jsonl | 1 + .../units/round_1_create/units_1.jsonl | 1 + .../units/round_2_update/units_1.jsonl | 1 + .../fixtures/auto_sync/domains/contract.yaml | 31 + tests/fixtures/mock_domain.py | 228 ++ tests/integration/test_copy_pipeline_jsonl.py | 74 + .../test_full_pipeline_multinode_mock.py | 508 +++ ...st_full_pipeline_multinode_persisted_db.py | 175 + .../test_mock_datasource_state_machine.py | 134 + .../test_mock_full_event_state_coverage.py | 686 ++++ .../integration/test_state_event_coverage.py | 31 + .../test_strategy_business_points_migrated.py | 395 ++ .../test_toolchain_config_and_graph.py | 27 + tests/integration/test_ui_api_smoke.py | 23 + tests/mocks/__init__.py | 1 + tests/mocks/mock_datasource.py | 113 + .../test_project_detail_upsert_poll.py | 357 ++ tests/unit/test_api_client_rate_limit.py | 50 + .../test_api_trace_and_load_source_logs.py | 148 + ...build_filtered_datasource_supplier_refs.py | 29 + tests/unit/test_collection_project_filter.py | 36 + .../test_construction_plan_update_fallback.py | 90 + tests/unit/test_create_data_id_contract.py | 68 + .../test_datasource_load_continue_on_error.py | 108 + ...atasource_target_project_ids_resolution.py | 103 + tests/unit/test_e01_bootstrap_matrix.py | 68 + tests/unit/test_engine_semantics.py | 22 + .../unit/test_events_invariant_enforcement.py | 63 + .../test_factory_remote_jsonl_dir_creation.py | 30 + tests/unit/test_invariants_runtime.py | 31 + tests/unit/test_module_import_surface.py | 34 + tests/unit/test_peer_creating_finalize.py | 140 + ...est_pipeline_strategy_continue_on_error.py | 87 + ..._post_check_dependency_id_normalization.py | 154 + tests/unit/test_project_detail_api_handler.py | 49 + tests/unit/test_run_logger_node_filter.py | 40 + tests/unit/test_run_presets_yaml_loader.py | 31 + tests/unit/test_state_machine_outcomes.py | 32 + .../unit/test_strategy_dependency_helpers.py | 85 + .../test_target_project_preload_filter.py | 77 + .../test_units_jsonl_handler_alias_files.py | 36 + tests/unit/test_update_ops.py | 67 + tests/unit/test_validate_config_strictness.py | 33 + tools/__init__.py | 1 + tools/render_graph.py | 376 ++ tools/validate_config.py | 524 +++ ui/__init__.py | 3 + ui/__main__.py | 5 + ui/app.py | 155 + ui/config_models.py | 141 + ui/main.py | 20 + ui/runner.py | 208 + ui/web/index.html | 449 +++ uv.lock | 723 ++++ 486 files changed, 52479 insertions(+) create mode 100644 .github/instructions/test_push_system.instructions.md create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docs/architecture.md create mode 100644 docs/archive/README.md create mode 100644 docs/archive/conflict_log.md create mode 100644 docs/archive/docs/api_datasource_design.md create mode 100644 docs/archive/docs/datasource_handler_architecture_v2.md create mode 100644 docs/archive/docs/node_id_data_id_lifecycle.md create mode 100644 docs/archive/docs/skip_sync_behavior_fix.md create mode 100644 docs/archive/docs/业务流程与依赖关系.md create mode 100644 docs/archive/docs/代码重构提纲.md create mode 100644 docs/archive/docs/持久化与人工介入规范.md create mode 100644 docs/archive/docs/架构分层设计.md create mode 100644 docs/archive/docs/状态定义规范.md create mode 100644 docs/archive/docs/状态机形式化规范.md create mode 100644 docs/archive/docs/编排流程规范.md create mode 100644 docs/archive/docs/节点生命周期状态转移.md create mode 100644 docs/archive/from_root_docs/README.md create mode 100644 docs/archive/from_root_docs/api_datasource_design.md create mode 100644 docs/archive/from_root_docs/datasource_handler_architecture_v2.md create mode 100644 docs/archive/from_root_docs/node_id_data_id_lifecycle.md create mode 100644 docs/archive/from_root_docs/skip_sync_behavior_fix.md create mode 100644 docs/archive/from_root_docs/业务流程与依赖关系.md create mode 100644 docs/archive/from_root_docs/代码重构提纲.md create mode 100644 docs/archive/from_root_docs/持久化与人工介入规范.md create mode 100644 docs/archive/from_root_docs/架构分层设计.md create mode 100644 docs/archive/from_root_docs/状态定义规范.md create mode 100644 docs/archive/from_root_docs/状态机形式化规范.md create mode 100644 docs/archive/from_root_docs/编排流程规范.md create mode 100644 docs/archive/from_root_docs/节点生命周期状态转移.md create mode 100644 docs/archive/goals.md create mode 100644 docs/archive/migration_map.md create mode 100644 docs/auto_test_spec/agent_auto_test_method.md create mode 100644 docs/auto_test_spec/large_scale_test_control.md create mode 100644 docs/auto_test_spec/差异字段汇总清单.md create mode 100644 docs/collection_query_and_upgrade_plan.md create mode 100644 docs/datasource_guide.md create mode 100644 docs/library_integration_guide.md create mode 100644 docs/node_state_definition.md create mode 100644 docs/operations.md create mode 100644 docs/runtime_config_guide.md create mode 100644 docs/state_machine.md create mode 100644 docs/state_machine.mmd create mode 100644 docs/state_machine.svg create mode 100644 docs/sync_flow.md create mode 100644 docs/sync_issue_analysis_20260305.md create mode 100644 filtered_datasource/datasource/filtered/company_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/construction_task_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/construction_task_detail_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/contract_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/contract_change_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/contract_settlement_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/contract_settlement_detail_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/lar_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/lar_change_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/material_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/material_detail_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/personnel_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/personnel_detail_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/preparation_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/production_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/project_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/project_detail_data_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/region_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/supplier_1.jsonl create mode 100644 filtered_datasource/datasource/filtered/units_1.jsonl create mode 100644 pyproject.toml create mode 100644 pytest.ini create mode 100644 run.py create mode 100644 run_profiles/README.md create mode 100644 run_profiles/preset/README.md create mode 100644 run_profiles/preset/jsonl_to_api.default.yaml create mode 100644 run_profiles/preset/jsonl_to_jsonl.default.yaml create mode 100644 schemas/common/base.py create mode 100644 schemas/common/datetime.py create mode 100644 schemas/common/enums.py create mode 100644 schemas/common/push_system.py create mode 100644 schemas/common/validators.py create mode 100644 schemas/company/company.py create mode 100644 schemas/construction/construction.py create mode 100644 schemas/construction/construction_detail.py create mode 100644 schemas/contract/contract.py create mode 100644 schemas/contract_settlement/contract_settlement.py create mode 100644 schemas/contract_settlement/contract_settlement_detail.py create mode 100644 schemas/material/material.py create mode 100644 schemas/material/material_detail.py create mode 100644 schemas/power/power.py create mode 100644 schemas/power/power_detail.py create mode 100644 schemas/project/enums.py create mode 100644 schemas/project/project.py create mode 100644 schemas/project/project_base.py create mode 100644 schemas/project_extensions/contract_change.py create mode 100644 schemas/project_extensions/generator_unit.py create mode 100644 schemas/project_extensions/lar.py create mode 100644 schemas/project_extensions/preparation.py create mode 100644 schemas/project_extensions/production.py create mode 100644 schemas/project_extensions/project_detail.py create mode 100644 schemas/project_multi_type/__init__.py create mode 100644 schemas/project_multi_type/gas_turbine.py create mode 100644 schemas/project_multi_type/hydropower.py create mode 100644 schemas/project_multi_type/offshore_wind.py create mode 100644 schemas/project_multi_type/onshore_wind.py create mode 100644 schemas/project_multi_type/photovotaic.py create mode 100644 schemas/project_multi_type/pumped_storage.py create mode 100644 schemas/project_multi_type/thermal_power.py create mode 100644 schemas/supplier/supplier.py create mode 100644 schemas/user/user.py create mode 100644 scripts/README.md create mode 100644 scripts/analyze_state_signatures.py create mode 100644 scripts/auto_test_clear.py create mode 100644 scripts/auto_test_domains/base.py create mode 100644 scripts/auto_test_domains/company_case.py create mode 100644 scripts/auto_test_domains/construction_task_case.py create mode 100644 scripts/auto_test_domains/construction_task_detail_case.py create mode 100644 scripts/auto_test_domains/contract_case.py create mode 100644 scripts/auto_test_domains/contract_change_case.py create mode 100644 scripts/auto_test_domains/contract_settlement_case.py create mode 100644 scripts/auto_test_domains/contract_settlement_detail_case.py create mode 100644 scripts/auto_test_domains/lar_case.py create mode 100644 scripts/auto_test_domains/lar_change_case.py create mode 100644 scripts/auto_test_domains/material_case.py create mode 100644 scripts/auto_test_domains/material_detail_case.py create mode 100644 scripts/auto_test_domains/personnel_case.py create mode 100644 scripts/auto_test_domains/personnel_detail_case.py create mode 100644 scripts/auto_test_domains/preparation_case.py create mode 100644 scripts/auto_test_domains/production_case.py create mode 100644 scripts/auto_test_domains/project_case.py create mode 100644 scripts/auto_test_domains/project_detail_data_case.py create mode 100644 scripts/auto_test_domains/supplier_case.py create mode 100644 scripts/auto_test_domains/units_case.py create mode 100644 scripts/auto_test_init.py create mode 100644 scripts/auto_test_lib.py create mode 100644 scripts/build_filtered_datasource_for_projects.py create mode 100644 scripts/legacy/run_full_sync_pipeline_jsonl.py create mode 100644 scripts/legacy/run_full_sync_pipeline_jsonl_sm.py create mode 100644 scripts/legacy/run_full_sync_pipeline_simple.py create mode 100644 scripts/legacy/run_full_sync_pipeline_simple_sm.py create mode 100644 scripts/run_auto_test.py create mode 100644 scripts/run_auto_test_all_domains.py create mode 100644 scripts/run_copy_pipeline_jsonl.py create mode 100644 scripts/run_full_sync_pipeline_jsonl_sm.py create mode 100644 scripts/run_full_sync_pipeline_simple_sm.py create mode 100644 scripts/run_large_scale_auto_test.py create mode 100644 sync_state_machine/__init__.py create mode 100644 sync_state_machine/cli.py create mode 100644 sync_state_machine/common/__init__.py create mode 100644 sync_state_machine/common/binding.py create mode 100644 sync_state_machine/common/collection.py create mode 100644 sync_state_machine/common/persistence.py create mode 100644 sync_state_machine/common/registry.py create mode 100644 sync_state_machine/common/sync_node.py create mode 100644 sync_state_machine/common/type_safety.py create mode 100644 sync_state_machine/common/types.py create mode 100644 sync_state_machine/config/__init__.py create mode 100644 sync_state_machine/config/builder.py create mode 100644 sync_state_machine/config/datasource_config.py create mode 100644 sync_state_machine/config/logging_config.py create mode 100644 sync_state_machine/config/node_state_machine.yaml create mode 100644 sync_state_machine/config/persist_config.py create mode 100644 sync_state_machine/config/pipeline_config.py create mode 100644 sync_state_machine/config/run_presets.py create mode 100644 sync_state_machine/config/runtime_config.py create mode 100644 sync_state_machine/config/strategy_config.py create mode 100644 sync_state_machine/datasource/README.md create mode 100644 sync_state_machine/datasource/__init__.py create mode 100644 sync_state_machine/datasource/api/__init__.py create mode 100644 sync_state_machine/datasource/api/client.py create mode 100644 sync_state_machine/datasource/api/datasource.py create mode 100644 sync_state_machine/datasource/api/errors.py create mode 100644 sync_state_machine/datasource/api/handler.py create mode 100644 sync_state_machine/datasource/datasource.py create mode 100644 sync_state_machine/datasource/handler.py create mode 100644 sync_state_machine/datasource/jsonl/__init__.py create mode 100644 sync_state_machine/datasource/jsonl/datasource.py create mode 100644 sync_state_machine/datasource/jsonl/handler.py create mode 100644 sync_state_machine/datasource/task_result.py create mode 100644 sync_state_machine/domain/__init__.py create mode 100644 sync_state_machine/domain/attachment/__init__.py create mode 100644 sync_state_machine/domain/attachment/api_handler.py create mode 100644 sync_state_machine/domain/attachment/jsonl_handler.py create mode 100644 sync_state_machine/domain/attachment/register.py create mode 100644 sync_state_machine/domain/attachment/sync_node.py create mode 100644 sync_state_machine/domain/attachment/sync_strategy.py create mode 100644 sync_state_machine/domain/company/__init__.py create mode 100644 sync_state_machine/domain/company/api_handler.py create mode 100644 sync_state_machine/domain/company/jsonl_handler.py create mode 100644 sync_state_machine/domain/company/register.py create mode 100644 sync_state_machine/domain/company/sync_node.py create mode 100644 sync_state_machine/domain/company/sync_strategy.py create mode 100644 sync_state_machine/domain/construction/__init__.py create mode 100644 sync_state_machine/domain/construction/api_handler.py create mode 100644 sync_state_machine/domain/construction/jsonl_handler.py create mode 100644 sync_state_machine/domain/construction/register.py create mode 100644 sync_state_machine/domain/construction/sync_node.py create mode 100644 sync_state_machine/domain/construction/sync_strategy.py create mode 100644 sync_state_machine/domain/construction_task_detail/__init__.py create mode 100644 sync_state_machine/domain/construction_task_detail/api_handler.py create mode 100644 sync_state_machine/domain/construction_task_detail/jsonl_handler.py create mode 100644 sync_state_machine/domain/construction_task_detail/register.py create mode 100644 sync_state_machine/domain/construction_task_detail/sync_node.py create mode 100644 sync_state_machine/domain/construction_task_detail/sync_strategy.py create mode 100644 sync_state_machine/domain/contract/__init__.py create mode 100644 sync_state_machine/domain/contract/api_handler.py create mode 100644 sync_state_machine/domain/contract/jsonl_handler.py create mode 100644 sync_state_machine/domain/contract/register.py create mode 100644 sync_state_machine/domain/contract/sync_node.py create mode 100644 sync_state_machine/domain/contract/sync_strategy.py create mode 100644 sync_state_machine/domain/contract_change/__init__.py create mode 100644 sync_state_machine/domain/contract_change/api_handler.py create mode 100644 sync_state_machine/domain/contract_change/jsonl_handler.py create mode 100644 sync_state_machine/domain/contract_change/register.py create mode 100644 sync_state_machine/domain/contract_change/sync_node.py create mode 100644 sync_state_machine/domain/contract_change/sync_strategy.py create mode 100644 sync_state_machine/domain/contract_settlement/__init__.py create mode 100644 sync_state_machine/domain/contract_settlement/api_handler.py create mode 100644 sync_state_machine/domain/contract_settlement/jsonl_handler.py create mode 100644 sync_state_machine/domain/contract_settlement/register.py create mode 100644 sync_state_machine/domain/contract_settlement/sync_node.py create mode 100644 sync_state_machine/domain/contract_settlement/sync_strategy.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/__init__.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/api_handler.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/jsonl_handler.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/register.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/sync_node.py create mode 100644 sync_state_machine/domain/contract_settlement_detail/sync_strategy.py create mode 100644 sync_state_machine/domain/lar/__init__.py create mode 100644 sync_state_machine/domain/lar/api_handler.py create mode 100644 sync_state_machine/domain/lar/jsonl_handler.py create mode 100644 sync_state_machine/domain/lar/register.py create mode 100644 sync_state_machine/domain/lar/sync_node.py create mode 100644 sync_state_machine/domain/lar/sync_strategy.py create mode 100644 sync_state_machine/domain/lar_change/__init__.py create mode 100644 sync_state_machine/domain/lar_change/api_handler.py create mode 100644 sync_state_machine/domain/lar_change/jsonl_handler.py create mode 100644 sync_state_machine/domain/lar_change/register.py create mode 100644 sync_state_machine/domain/lar_change/sync_node.py create mode 100644 sync_state_machine/domain/lar_change/sync_strategy.py create mode 100644 sync_state_machine/domain/material/__init__.py create mode 100644 sync_state_machine/domain/material/api_handler.py create mode 100644 sync_state_machine/domain/material/jsonl_handler.py create mode 100644 sync_state_machine/domain/material/register.py create mode 100644 sync_state_machine/domain/material/sync_node.py create mode 100644 sync_state_machine/domain/material/sync_strategy.py create mode 100644 sync_state_machine/domain/material_detail/__init__.py create mode 100644 sync_state_machine/domain/material_detail/api_handler.py create mode 100644 sync_state_machine/domain/material_detail/jsonl_handler.py create mode 100644 sync_state_machine/domain/material_detail/register.py create mode 100644 sync_state_machine/domain/material_detail/sync_node.py create mode 100644 sync_state_machine/domain/material_detail/sync_strategy.py create mode 100644 sync_state_machine/domain/personnel/__init__.py create mode 100644 sync_state_machine/domain/personnel/api_handler.py create mode 100644 sync_state_machine/domain/personnel/jsonl_handler.py create mode 100644 sync_state_machine/domain/personnel/register.py create mode 100644 sync_state_machine/domain/personnel/sync_node.py create mode 100644 sync_state_machine/domain/personnel/sync_strategy.py create mode 100644 sync_state_machine/domain/personnel_detail/__init__.py create mode 100644 sync_state_machine/domain/personnel_detail/api_handler.py create mode 100644 sync_state_machine/domain/personnel_detail/jsonl_handler.py create mode 100644 sync_state_machine/domain/personnel_detail/register.py create mode 100644 sync_state_machine/domain/personnel_detail/sync_node.py create mode 100644 sync_state_machine/domain/personnel_detail/sync_strategy.py create mode 100644 sync_state_machine/domain/preparation/__init__.py create mode 100644 sync_state_machine/domain/preparation/api_handler.py create mode 100644 sync_state_machine/domain/preparation/jsonl_handler.py create mode 100644 sync_state_machine/domain/preparation/register.py create mode 100644 sync_state_machine/domain/preparation/sync_node.py create mode 100644 sync_state_machine/domain/preparation/sync_strategy.py create mode 100644 sync_state_machine/domain/production/__init__.py create mode 100644 sync_state_machine/domain/production/api_handler.py create mode 100644 sync_state_machine/domain/production/jsonl_handler.py create mode 100644 sync_state_machine/domain/production/register.py create mode 100644 sync_state_machine/domain/production/sync_node.py create mode 100644 sync_state_machine/domain/production/sync_strategy.py create mode 100644 sync_state_machine/domain/project/__init__.py create mode 100644 sync_state_machine/domain/project/api_handler.py create mode 100644 sync_state_machine/domain/project/jsonl_handler.py create mode 100644 sync_state_machine/domain/project/register.py create mode 100644 sync_state_machine/domain/project/sync_node.py create mode 100644 sync_state_machine/domain/project/sync_strategy.py create mode 100644 sync_state_machine/domain/project_detail/__init__.py create mode 100644 sync_state_machine/domain/project_detail/api_handler.py create mode 100644 sync_state_machine/domain/project_detail/jsonl_handler.py create mode 100644 sync_state_machine/domain/project_detail/register.py create mode 100644 sync_state_machine/domain/project_detail/sync_node.py create mode 100644 sync_state_machine/domain/project_detail/sync_strategy.py create mode 100644 sync_state_machine/domain/registry.py create mode 100644 sync_state_machine/domain/supplier/__init__.py create mode 100644 sync_state_machine/domain/supplier/api_handler.py create mode 100644 sync_state_machine/domain/supplier/jsonl_handler.py create mode 100644 sync_state_machine/domain/supplier/register.py create mode 100644 sync_state_machine/domain/supplier/sync_node.py create mode 100644 sync_state_machine/domain/supplier/sync_strategy.py create mode 100644 sync_state_machine/domain/units/__init__.py create mode 100644 sync_state_machine/domain/units/api_handler.py create mode 100644 sync_state_machine/domain/units/jsonl_handler.py create mode 100644 sync_state_machine/domain/units/register.py create mode 100644 sync_state_machine/domain/units/sync_node.py create mode 100644 sync_state_machine/domain/units/sync_strategy.py create mode 100644 sync_state_machine/domain/user/__init__.py create mode 100644 sync_state_machine/domain/user/api_handler.py create mode 100644 sync_state_machine/domain/user/jsonl_handler.py create mode 100644 sync_state_machine/domain/user/register.py create mode 100644 sync_state_machine/domain/user/sync_node.py create mode 100644 sync_state_machine/domain/user/sync_strategy.py create mode 100644 sync_state_machine/engine/__init__.py create mode 100644 sync_state_machine/engine/dispatcher.py create mode 100644 sync_state_machine/engine/evaluator.py create mode 100644 sync_state_machine/engine/events.py create mode 100644 sync_state_machine/engine/invariants.py create mode 100644 sync_state_machine/engine/model.py create mode 100644 sync_state_machine/engine/semantics.py create mode 100644 sync_state_machine/engine/state_apply.py create mode 100644 sync_state_machine/pipeline/__init__.py create mode 100644 sync_state_machine/pipeline/copy_data_pipeline.py create mode 100644 sync_state_machine/pipeline/factory.py create mode 100644 sync_state_machine/pipeline/full_sync_pipeline.py create mode 100644 sync_state_machine/pipeline/run_logger.py create mode 100644 sync_state_machine/pipeline/summary_report.py create mode 100644 sync_state_machine/sync_system/__init__.py create mode 100644 sync_state_machine/sync_system/config.py create mode 100644 sync_state_machine/sync_system/error_formatter.py create mode 100644 sync_state_machine/sync_system/registry.py create mode 100644 sync_state_machine/sync_system/resolve_ids.py create mode 100644 sync_state_machine/sync_system/strategy.py create mode 100644 sync_state_machine/sync_system/strategy_ops/__init__.py create mode 100644 sync_state_machine/sync_system/strategy_ops/bind_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/compare_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/create_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/delete_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/post_check_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/reset_ops.py create mode 100644 sync_state_machine/sync_system/strategy_ops/update_ops.py create mode 100644 sync_state_machine/sync_system/utils.py create mode 100644 tests/README.md create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/fixtures/auto_sync/auto_test_config.yaml create mode 100644 tests/fixtures/auto_sync/datasource/common_baseline/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/common_baseline/supplier_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_1_create/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_1_create/construction_task_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_1_create/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_2_update/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_2_update/construction_task_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task/round_2_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_1_create/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_1_create/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_1_create/supplier_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_2_update/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract/round_2_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_change/round_1_create/contract_change_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_change/round_2_update/contract_change_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/supplier_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/company_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/supplier_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_1_create/contract_settlement_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_2_update/contract_settlement_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/lar/round_1_create/lar_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/lar/round_2_update/lar_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/lar_change/round_1_create/lar_change_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/lar_change/round_2_update/lar_change_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_1_create/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_1_create/material_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_2_update/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material/round_2_update/material_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_settlement_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel/round_1_create/personnel_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel/round_2_update/personnel_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/ecm_sync_system.code-workspace create mode 100644 tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_detail_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/preparation/round_1_create/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/preparation/round_1_create/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/preparation/round_2_update/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/preparation/round_2_update/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/production/round_1_create/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/production/round_1_create/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/production/round_2_update/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/production/round_2_update/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project/round_1_bind/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project/round_2_base_info_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project/round_3_investment_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/preparation_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/production_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_detail_data_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/units/round_1_create/units_1.jsonl create mode 100644 tests/fixtures/auto_sync/datasource/units/round_2_update/units_1.jsonl create mode 100644 tests/fixtures/auto_sync/domains/contract.yaml create mode 100644 tests/fixtures/mock_domain.py create mode 100644 tests/integration/test_copy_pipeline_jsonl.py create mode 100644 tests/integration/test_full_pipeline_multinode_mock.py create mode 100644 tests/integration/test_full_pipeline_multinode_persisted_db.py create mode 100644 tests/integration/test_mock_datasource_state_machine.py create mode 100644 tests/integration/test_mock_full_event_state_coverage.py create mode 100644 tests/integration/test_state_event_coverage.py create mode 100644 tests/integration/test_strategy_business_points_migrated.py create mode 100644 tests/integration/test_toolchain_config_and_graph.py create mode 100644 tests/integration/test_ui_api_smoke.py create mode 100644 tests/mocks/__init__.py create mode 100644 tests/mocks/mock_datasource.py create mode 100644 tests/unit/project_detail_upsert/test_project_detail_upsert_poll.py create mode 100644 tests/unit/test_api_client_rate_limit.py create mode 100644 tests/unit/test_api_trace_and_load_source_logs.py create mode 100644 tests/unit/test_build_filtered_datasource_supplier_refs.py create mode 100644 tests/unit/test_collection_project_filter.py create mode 100644 tests/unit/test_construction_plan_update_fallback.py create mode 100644 tests/unit/test_create_data_id_contract.py create mode 100644 tests/unit/test_datasource_load_continue_on_error.py create mode 100644 tests/unit/test_datasource_target_project_ids_resolution.py create mode 100644 tests/unit/test_e01_bootstrap_matrix.py create mode 100644 tests/unit/test_engine_semantics.py create mode 100644 tests/unit/test_events_invariant_enforcement.py create mode 100644 tests/unit/test_factory_remote_jsonl_dir_creation.py create mode 100644 tests/unit/test_invariants_runtime.py create mode 100644 tests/unit/test_module_import_surface.py create mode 100644 tests/unit/test_peer_creating_finalize.py create mode 100644 tests/unit/test_pipeline_strategy_continue_on_error.py create mode 100644 tests/unit/test_post_check_dependency_id_normalization.py create mode 100644 tests/unit/test_project_detail_api_handler.py create mode 100644 tests/unit/test_run_logger_node_filter.py create mode 100644 tests/unit/test_run_presets_yaml_loader.py create mode 100644 tests/unit/test_state_machine_outcomes.py create mode 100644 tests/unit/test_strategy_dependency_helpers.py create mode 100644 tests/unit/test_target_project_preload_filter.py create mode 100644 tests/unit/test_units_jsonl_handler_alias_files.py create mode 100644 tests/unit/test_update_ops.py create mode 100644 tests/unit/test_validate_config_strictness.py create mode 100644 tools/__init__.py create mode 100644 tools/render_graph.py create mode 100644 tools/validate_config.py create mode 100644 ui/__init__.py create mode 100644 ui/__main__.py create mode 100644 ui/app.py create mode 100644 ui/config_models.py create mode 100644 ui/main.py create mode 100644 ui/runner.py create mode 100644 ui/web/index.html create mode 100644 uv.lock diff --git a/.github/instructions/test_push_system.instructions.md b/.github/instructions/test_push_system.instructions.md new file mode 100644 index 0000000..dd5cf9d --- /dev/null +++ b/.github/instructions/test_push_system.instructions.md @@ -0,0 +1,16 @@ +--- +applyTo: '**' +--- +在任何情况系下, 禁止修改schemas文件夹的内容! + +你的目标是基于它,生成一个类型安全的推送系统测试脚本,而不是修改类型系统! + +也不要改filtered_datasource。这个是测试用的数据源。 + +也不要因为报错就绕过schema校验。如果schema校验报错,那就让它报,我自然会去修。 + +遇到报错或者走不通的路,不要轻易偏离文档,做降级处理,而是要多报错,直到我说可以降级处理再说。 + +不要在项目根目录乱写测试。测试写到tests里。 + +不要乱加fallback,所有fallback类的逻辑都需要让我确认过了才行。 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f0c8e43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,97 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# mypy +.mypy_cache/ +.dmypy.json + +# VS Code +.vscode/ + +# Local data +*.sqlite3 +*.db +*.log +*.pot +*.mo +*.pkl +# *.jsonl + +# OS files +.DS_Store +Thumbs.db + +# User-specific +*.swp +*.swo +*~ + +# Ignore data and filtered data +# filtered_datasource/ +remote_datasource/ +working_local_datasource/ +tmp_remote_datasource/ +tmp_jsonl_ds/ + +# Ignore test outputs +*.out + +# ignore examples +v2/ +temp_test_output/ +zerocoach/ +Zerocoach/ +.env +# User-created run profiles +run_profiles/*.json +run_profiles/*.yaml +run_profiles/*.yml +# Sync System Runtime Data +_runtime/ +test_results/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..05bd787 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# test_push_system + +## 1. 项目简介 + +本项目用于实现异构系统之间的数据推送:将项目侧管理平台的十余种业务数据,稳定推送到集团侧管理平台。 + +核心复杂点包括: +- 数据接口复杂且会随业务变化。 +- 业务之间依赖关系复杂(跨业务、跨阶段)。 +- 同业务数据的双侧对应关系判定复杂(绑定/自动绑定)。 +- 同步流程各步骤可能出错,系统需要自动处理,必要时允许人工介入。 +- 字段多且杂,且可能由不同更新接口共同影响同一业务信息。 + +## 2. 项目架构 + +项目采用:`schema` 严格约束 + 状态机 + 节点模型 + 分层架构 + 注册式 `domain` + 数据源与同步系统解耦。 + +架构详见: +- `docs/architecture.md` +- `docs/node_state_definition.md` +- `docs/state_machine.md` + +## 3. 同步过程简述 + +整体流程可理解为: +1. Pipeline 读取配置并初始化数据源、策略、状态机运行时。 +2. 加载本地与远端节点,进入绑定/依赖检查/自动绑定阶段。 +3. 按状态机判定进入 create / update / delete 准备与执行阶段。 +4. 执行结果回写节点状态并持久化,失败进入可观测、可重试或可人工处理状态。 + +状态机的作用: +- 把复杂业务规则收敛为可验证、可追踪的事件迁移。 +- 保证不变量(invariant)在运行期可检查。 +- 统一错误处理路径,避免“隐式分支”造成不一致。 + +示意图: +- `docs/state_machine.svg` + +流程与时序详见: +- `docs/state_machine.md` +- `docs/sync_flow.md` + +## 4. 后续开发(扩展新数据源) + +建议路径: +1. 在 `sync_state_machine/domain/` 增加业务 `schema / node / strategy` 并注册到 DomainRegistry。 +2. 在 `sync_state_machine/datasource/` 实现新数据源 handler(load/create/update/delete/poll)。 +3. 参考 `run_profiles/preset/` 模板,在 `run_profiles/` 自建对应运行配置,先走 JSONL/Mock 集成测试,再接真实接口。 +4. 根据业务特性补充状态机上下文字段与测试用例,确保状态迁移可验证。 + +可参考: +- `sync_state_machine/datasource/README.md` +- `docs/runtime_config_guide.md` +- `tests/README.md` + +## 5. 使用方法 + +### JSONL 同步 +- 基线配置(优先):`python run.py --config_path=run_profiles/preset/jsonl_to_jsonl.default.yaml` +- 使用自定义配置:先从 `run_profiles/preset/jsonl_to_jsonl.default.yaml` 复制到 `run_profiles/jsonl_to_jsonl.local.yaml`,按需修改后运行:`python run.py --config_path=run_profiles/jsonl_to_jsonl.local.yaml` + +### API 同步 +- 基线配置:`python run.py --config_path=run_profiles/preset/jsonl_to_api.default.yaml` +- 使用自定义配置:先从 `run_profiles/preset/jsonl_to_api.default.yaml` 复制到 `run_profiles/jsonl_to_api.local.yaml`,按需修改后运行:`python run.py --config_path=run_profiles/jsonl_to_api.local.yaml` + +### 配置与校验 +- 模板配置:`run_profiles/preset/*.default.yaml` +- 建议先跑 default,再在 `run_profiles/*.local.yaml` 做覆盖(该目录 YAML 已默认忽略) +- 状态机配置校验:`python tools/validate_config.py --config sync_state_machine/config/node_state_machine.yaml` +- 状态机图生成:`python tools/render_graph.py --format mermaid --out docs/state_machine.mmd` + +### 测试 +- 全量:`pytest tests -q` +- 说明:`tests/README.md` + +### 其他工具 +- UI 调试:`python -m ui.main --host 127.0.0.1 --port 8765` +- 运维与排障:`docs/operations.md` + +## 文档导航 + +- 总体架构:`docs/architecture.md` +- 状态定义:`docs/node_state_definition.md` +- 状态机规则:`docs/state_machine.md` +- 同步流程:`docs/sync_flow.md` +- 运行配置:`docs/runtime_config_guide.md` +- Collection 查询与升级:`docs/collection_query_and_upgrade_plan.md` +- 运维迭代:`docs/operations.md` + +历史资料已归档到 `docs/archive/`。 diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..2893386 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,66 @@ +# 同步系统整体框架 + +## 1. 分层职责(pipeline + strategy + datasource + domain) + +### pipeline(编排层) +- 入口:`pipeline/full_sync_pipeline.py` +- 负责组装并驱动整条流程:加载持久化、执行 bind/create/update、调用 datasource 同步、持久化结果。 +- reset 语义: + - 加载阶段仅恢复持久化状态(不做状态重置); + - 加载后通过 `BaseSyncStrategy.run_reset()` 触发 `E01`: + - `create_zombie=true` -> `S15`(随后删除); + - `create_zombie=false` -> `S00`(归并为 `UNCHECKED/NONE/PENDING`,并清空 `error`)。 + - 若持久化核心枚举非法(`action/status/binding_status`),节点进入加载异常隔离态 `S17`: + - 保留错误信息供人工介入; + - 不参与 `E01` 与后续 bind/create/update/sync 自动流程。 + +### pipeline 运行语境(人工介入 + 可变配置) +- 运行前可按批次调整策略配置(例如“首轮先拉取、后续只推送”),属于 pipeline 的一次性运行参数。 +- 人工介入分两段: + - **运行前**:可手工修复数据、手工绑定、调整策略参数; + - **运行后**:根据节点 `status/error/sync_log` 处理异常(为未来 GUI 介入提供依据)。 +- 若上轮异常未人工处理,本轮在 `E01` 先做归并/清理: + - CREATE 僵尸节点自动删除并解除绑定残留; + - 非僵尸节点统一进入 `S00`,再进入本轮 bind/create/update 判定。 + +### strategy(决策组织层) +- 外部入口:`sync_system/strategy.py` +- 具体实现下沉:`sync_system/strategy_ops/` + - `bind_ops.py`: `run_bind()` + `phase_core_state()/phase_dependency_check()/phase_auto_binding()` + - `create_ops.py`: `run_create()` + - `update_ops.py`: `run_update()` + - `delete_ops.py`: `run_delete()` + - `reset_ops.py`: `get_phase1_reset_defaults()/run_phase2_cleanup()` +- strategy 负责收集上下文并调用状态机事件函数,不直接硬编码状态值。 + +### datasource(执行与回写层) +- 入口:`datasource/datasource.py` +- 执行 handler(create/update/delete),并结合 `E40` 将执行结果落地到节点状态。 + +### domain(业务适配层) +- 目录:`domain/*` +- 负责业务字段映射、handler 细节与 schema 约束,不承担状态迁移判定。 + +## 2. 运行时契约(Runtime Contract) + +### 真源 +- 状态机配置真源:`config/node_state_machine.yaml` +- 事件执行入口:`engine/events.py` +- 状态落地入口:`engine/state_apply.py` + +### 执行规则 +1. 业务层构造 `context`。 +2. 调用 `StateMachineRuntime.dispatch(current_state, event_id, context)`。 +3. 依据 `Decision.to_state` 从 YAML `states[Sxx]` 落地 `binding_status/action/status`。 +4. `Decision.emit` 只用于状态外副作用(spawn、绑定、调用 handler 等)。 +5. 每次事件落地后,`events._apply_decision` 调用 `runtime.check_invariants()`;违反直接抛错。 + +## 3. 边界与约束 +- `strategy/datasource` 不应绕过状态机直接写最终状态。 +- `PRECONDITION_FAILED` 必须满足 `action=UPDATE`(YAML invariant 强约束)。 +- 依赖语义由 strategy 计算(如 `dep_satisfied/dep_errors`),状态机只消费语义结果并迁移。 + +## 4. 相关文档 +- 框架与流程:`docs/sync_flow.md` +- 节点状态定义:`docs/node_state_definition.md` +- 状态机形式化说明:`docs/state_machine.md` diff --git a/docs/archive/README.md b/docs/archive/README.md new file mode 100644 index 0000000..fad00cf --- /dev/null +++ b/docs/archive/README.md @@ -0,0 +1,11 @@ +# 文档归档说明 + +本目录存放历史文档,不作为当前实现规范。 + +- `from_root_docs/`:从旧位置迁移的历史文档快照。 +- `conflict_log.md` / `goals.md` / `migration_map.md`:重构过程文档。 + +遇到冲突时,请以 `docs/` 根目录下现行文档和代码真源为准: +- `config/node_state_machine.yaml` +- `engine/events.py` +- `sync_system/strategy_ops/*` diff --git a/docs/archive/conflict_log.md b/docs/archive/conflict_log.md new file mode 100644 index 0000000..44aae96 --- /dev/null +++ b/docs/archive/conflict_log.md @@ -0,0 +1,10 @@ +# 文档/实现冲突记录 + +## 已确认冲突 +- 旧文档中存在 E11x 编号残留,与当前 YAML(E08/E09/E10/E12..E20) 不一致。 +- `PRECONDITION_FAILED` 在旧实现中可能出现 `action=NONE`,重构目标改为强制 `action=UPDATE`。 + +## 处理原则 +1. 以 `config/node_state_machine.yaml` 为唯一真源。 +2. 文档必须由配置和测试结果反向校验。 +3. 冲突先记录,再通过测试保护修复。 diff --git a/docs/archive/docs/api_datasource_design.md b/docs/archive/docs/api_datasource_design.md new file mode 100644 index 0000000..5b3db2c --- /dev/null +++ b/docs/archive/docs/api_datasource_design.md @@ -0,0 +1,706 @@ +# API DataSource 架构设计 + +## 架构总览 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Pipeline │ +│ (同步流程编排) │ +└───────────────────────────┬─────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ ApiDataSource │ +│ (数据源协调层) │ +│ │ +│ - 持有 ApiClient 实例 │ +│ - 注册和管理 Handler │ +│ - 实现 load_all / execute_batch │ +│ - 注入 api_client 到 Handler │ +└───────────────────────────┬─────────────────────────────────┘ + │ + ┌───────────────────┼───────────────────┐ + ▼ ▼ ▼ +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ Handler │ │ Handler │ │ Handler │ +│ Project │ │ Contract │ │ Material │ +│ │ │ │ │ │ +│ 业务逻辑层 │ │ 业务逻辑层 │ │ 业务逻辑层 │ +└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ + │ │ │ + └───────────────────┼───────────────────┘ + │ 使用 self.api_client + ▼ + ┌──────────────┐ + │ ApiClient │ + │ (HTTP 通信层) │ + │ │ + │ - 签名生成 │ + │ - HTTP 请求 │ + │ - Push Log │ + └──────────────┘ +``` + +**调用流程**: +1. Pipeline 创建 ApiDataSource,传入 base_url, uid, secret +2. ApiDataSource 内部创建 ApiClient 实例 +3. ApiDataSource 注册各业务 Handler,并注入 api_client +4. Handler 使用 `self.api_client.get/post/put()` 发送请求 +5. ApiClient 自动处理签名、push_log 查询、错误处理 + +**优势**: +- ✅ **职责清晰**:ApiClient(通信)、DataSource(协调)、Handler(业务) +- ✅ **避免循环依赖**:Handler → ApiClient(单向依赖) +- ✅ **易于测试**:ApiClient 可 mock,Handler 独立测试 +- ✅ **易于扩展**:新业务只需实现 Handler + +## 1. 问题分析:旧方案的复杂性 + +旧方案 `sync_system/datasource/api` 存在的问题: + +1. **过度抽象**:引入了 `ApiDataSource` → `Repository` → `ResponseHandle` → `Cache` 多层封装,每个业务需要独立 Repository 类,Protocol 定义繁琐 +2. **状态管理混乱**:缓存策略不清晰,ResponseHandle 封装异步结果但使用困难,缺少统一的 push_log 查询机制 +3. **依赖关系困难**:Repository 之间互相传递引用,难以从 collection 获取已有数据 +4. **API 路由分散**:每个 Repository 手动实现多个 update 方法,缺少自动路由机制 + +## 2. 新方案设计原则 + +- **简单直接**:Handler 直接调用 HTTP API,不过度封装 +- **状态透明**:DataSource 统一管理 session、签名、push_log 查询 +- **依赖清晰**:通过 collection 获取依赖数据,使用 context 存储额外信息 +- **智能路由**:根据数据字段自动选择 API endpoint + +## 3. 核心组件职责 + +### 3.1 ApiClient - HTTP 通信层 + +**职责**: +- 封装所有 HTTP 通信逻辑 +- 管理 httpx.AsyncClient,维护连接池和 session +- 生成请求签名(timestamp, nonce, sign) +- 统一请求入口,自动注入 uid +- 批量 Push Log 查询 + +**核心方法**: +```python +class ApiClient: + def __init__(self, base_url: str, uid: str, secret: str): + self._client = httpx.AsyncClient() + self._base_url = base_url + self._uid = uid + self._secret = secret + + async def request(self, method: str, url: str, **kwargs) -> httpx.Response + """统一请求入口,自动签名""" + + async def get(self, url: str, params: dict = None) -> httpx.Response + """GET 请求""" + + async def post(self, url: str, data: dict) -> httpx.Response + """POST 请求,data 中已包含 push_id/biz_id(由 Handler 生成)""" + + async def put(self, url: str, data: dict) -> httpx.Response + """PUT 请求,data 中已包含 push_id/biz_id""" + + async def delete(self, url: str, data: dict) -> httpx.Response + """DELETE 请求,data 中已包含 push_id/biz_id""" + + async def get_push_logs(self, push_ids: List[str]) -> Dict[str, dict] + """批量查询 push_log 状态,返回 {push_id: push_log_data} + 注意:单个查询也传单元素列表 + 当前实现:用 for 循环模拟,后续等后端实现批量接口 + """ + + def _generate_signature(self, params: dict) -> dict + """生成签名参数(timestamp, nonce, sign)""" +``` + +### 3.2 ApiDataSource - 数据源协调层 + +**职责**: +- 持有 ApiClient 实例,提供给 Handler 使用 +- 实现 DataSource 接口(load_all, sync_all) +- 协调多个 Handler 的执行顺序(通过 sync_all) +- Handler 内部负责:生成 push_id/biz_id、调用 poll 轮询、提取 created_id +- 统一异常处理和日志记录 + +**核心属性和方法**: +```python +class ApiDataSource(DataSource): + def __init__(self, base_url: str, uid: str, secret: str): + self.client = ApiClient(base_url, uid, secret) + self._handlers: Dict[str, BaseApiHandler] = {} + + def register_handler(self, node_type: str, handler: BaseApiHandler): + """注册业务 Handler""" + handler.api_client = self.client # 注入 client + self._handlers[node_type] = handler + + async def load_all(self, collection: DataCollection, order: List[str]) -> None: + """调用基类的 load_all,按顺序加载数据""" + + async def sync_all(self, collection: DataCollection, order: List[str]) -> None: + """调用基类的 sync_all,按顺序执行同步""" +``` + +### 3.3 BaseApiHandler - 业务逻辑基类 + +**职责**: +- 实现 Handler 接口(load, create, update, delete, poll) +- 使用 self.api_client 发送 HTTP 请求 +- 生成 push_id 和 biz_id(业务标识) +- 从 collection 获取依赖节点数据 +- 管理节点的 context(存储 project_id, contract_id 等) +- 实现 poll 方法,调用 api_client.get_push_logs 批量查询 +- 提取 created_id(因为不同业务的 id 字段名和位置可能不同) +- 返回 TaskResult(SUCCESS/FAILED/IN_PROGRESS) + +**核心方法**: +```python +class BaseApiHandler(NodeHandler): + def __init__(self): + self.api_client: ApiClient = None # 由 DataSource 注入 + self.collection: DataCollection = None # 由 DataSource 注入 + + async def load(self, collection: DataCollection) -> List[dict] + async def create(self, node: SyncNode) -> TaskResult + async def update(self, node: SyncNode) -> TaskResult + async def delete(self, node: SyncNode) -> TaskResult + async def poll(self, node: SyncNode, task_id: str) -> TaskResult + + def extract_created_id(self, push_log: dict) -> str + """从 push_log 提取 created_id,子类可重写""" + + # 重试逻辑(可选,子类可重写) + async def _execute_with_retry(self, operation, max_retries: int = 3) -> Any + """通用重试逻辑,子类可自定义重试策略""" +``` + +**重试策略说明**: +- **重试在 Handler 内部**:create/update/delete 内部可调用 _execute_with_retry +- **返回给 DataSource**:最终只返回 SUCCESS/FAILED/IN_PROGRESS +- **灵活控制**:不同业务可重写 _execute_with_retry 实现自定义策略 +- **默认策略**:网络错误/5xx 重试 3 次,4xx 不重试 + +**未实现 API 的处理**: +- 部分业务可能没有实现 create 或 delete API +- 此时 Handler 应在对应方法中直接返回 FAILED 状态,并在 error 中说明原因 +- 示例:`return TaskResult(status=TaskStatus.FAILED, error="Create API not implemented for this business")` + +### 3.4 具体业务 Handler + +**职责**: +- 实现具体业务的 load 逻辑(调用 self.api_client.get()) +- 创建节点时设置 context +- 重写 API endpoint 选择逻辑(可选) +- 定制 created_id 提取逻辑(可选) + +每个业务 Handler 位于 `sync_system_new/domain/{业务}/api_handler.py` + +## 4. HTTP 请求状态管理 + +### 4.0 状态系统概述 + +**通用状态枚举**(适用于所有 DataSource): + +```python +class TaskStatus(Enum): + """Handler 返回的任务执行状态""" + SUCCESS = "success" # 同步完成,立即成功 + FAILED = "failed" # 同步失败 + IN_PROGRESS = "in_progress" # 异步任务进行中 + +class SyncStatus(Enum): + """SyncNode 的同步执行状态""" + PENDING = "PENDING" + IN_PROGRESS = "IN_PROGRESS" + SUCCESS = "SUCCESS" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + PRECONDITION_FAILED = "PRECONDITION_FAILED" +``` + +**状态映射规则**: +- TaskStatus 是 Handler 执行操作后的返回值 +- SyncStatus 是 SyncNode 的最终状态,由 DataSource 根据 TaskStatus 更新 +- 普通 DataSource(FileDataSource)和 API DataSource 使用相同的状态枚举 +- 区别在于:**API DataSource 的网络操作如何转化为 TaskStatus** + +**重要说明:Load 阶段 vs 执行阶段的状态**: +- **Load 阶段**(Handler.load()):从 API 拉取数据创建 SyncNode + - 此时节点状态为 `PENDING`(等待后续 bind/create/update) + - GET 请求失败不影响节点创建,只是该节点不存在于 collection +- **执行阶段**(Handler.create/update/delete):执行同步操作 + - DataSource 在调用前设置 `node.status = IN_PROGRESS` + - Handler 返回 TaskResult,DataSource 据此更新 node.status + - POST/PUT/DELETE 成功后才设置为 SUCCESS + +**核心映射逻辑**(在 DataSource 中): +```python +# 执行前:DataSource 设置状态 +node.status = SyncStatus.IN_PROGRESS + +# 调用 Handler(Handler 内部可能重试多次) +result = await handler.create(node) + +# 执行后:DataSource 根据最终结果更新状态 +if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + node.data_id = result.data_id +elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error +elif result.status == TaskStatus.IN_PROGRESS: + # 记录 task_id 等待轮询 + async_tasks[node.node_id] = result.task_id +``` + +**重要**:Handler 负责重试,最终只返回确定的结果(SUCCESS/FAILED/IN_PROGRESS) + +### 4.1 请求类型与状态流转 + +**API DataSource 的特殊性**: +- **Load 阶段**:GET 请求拉取数据,创建 PENDING 节点(失败则不创建节点) +- **执行阶段**:POST/PUT/DELETE 先设置 IN_PROGRESS,通过 poll() 轮询变为 SUCCESS/FAILED + +#### Load 阶段 - 数据拉取 + +**目的**:从 API 获取数据,创建 SyncNode 放入 collection + +| 阶段 | HTTP 操作 | 成功行为 | 失败行为 | 节点状态 | +|------|----------|---------|---------|---------| +| 1. 调用 load() | GET /api/list | 返回数据列表 | 返回空列表或抛异常 | - | +| 2. 创建节点 | - | 为每条数据创建 SyncNode | 不创建节点 | PENDING | + +**代码示例**: +```python +async def load(self, collection: DataCollection) -> List[dict]: + """加载数据 - GET 阶段不涉及状态转换""" + try: + response = await self.api_client.get("project/list") + if response.status_code == 200: + data_list = response.json().get("list", []) + # 返回数据,由 DataSource 创建 PENDING 节点 + return data_list + else: + # 失败:返回空列表,不创建节点 + logger.error(f"Load failed: {response.status_code}") + return [] + except Exception as e: + logger.error(f"Load exception: {e}") + return [] # 或者抛出异常,由调用方处理 +``` + +#### Mutation 请求(POST/PUT/DELETE) - 执行阶段 + +**状态变化时机**: +1. **执行前**:DataSource 设置 `node.status = IN_PROGRESS` +2. **Handler 执行**:内部可能重试,最终返回 SUCCESS/FAILED/IN_PROGRESS +3. **轮询完成**:poll() 返回 SUCCESS/FAILED + +| 阶段 | Push Log | TaskStatus | SyncStatus | 说明 | +|------|---------|-----------|-----------|------| +| 执行前 | - | - | PENDING → IN_PROGRESS | DataSource 设置 | +| 提交 | pending | IN_PROGRESS | IN_PROGRESS | 任务已提交 | +| 轮询 | processing | IN_PROGRESS | IN_PROGRESS | 后端处理中 | +| 成功 | success | SUCCESS | SUCCESS | 同步完成 | +| 失败 | failed | FAILED | FAILED | 同步失败 | + +**示例**: +```python +async def create(self, node: SyncNode) -> TaskResult: + """Handler 内部可重试,最终返回确定结果""" + response = await self.api_client.post(url, node.data) + if response.status_code == 202: + return TaskResult.in_progress(task_id=response.json()["push_id"]) + else: + return TaskResult.failed(error=f"HTTP {response.status_code}") + +async def poll(self, node: SyncNode, task_id: str) -> TaskResult: + push_logs = await self.api_client.get_push_logs([task_id]) + status = push_logs.get(task_id, {}).get("status") + if status == "success": + return TaskResult.success(data_id=self.extract_created_id(push_logs[task_id])) + elif status == "failed": + return TaskResult.failed(error="Backend processing failed") + else: + return TaskResult.in_progress(task_id=task_id) +``` + +### 4.2 状态转换完整流程 + +``` +Load 阶段: + Handler.load() → 返回数据列表 → DataSource 创建 PENDING 节点 + +执行阶段(同步操作): + DataSource: node.status = IN_PROGRESS + → Handler.create() → TaskResult.success/failed() + → DataSource: node.status = SUCCESS/FAILED + +执行阶段(异步操作): + DataSource: node.status = IN_PROGRESS + → Handler.create() → TaskResult.in_progress(push_id) + → DataSource 轮询: Handler.poll(push_id) + → TaskResult.success/failed() + → DataSource: node.status = SUCCESS/FAILED +``` + +**关键点**: +- Handler 负责重试,DataSource 只处理最终结果 +- 不同业务可在 BaseApiHandler._execute_with_retry 中自定义重试策略 +- FileDataSource 和 ApiDataSource 使用相同的状态枚举和转换逻辑 + +### 4.3 Push Log 状态机 + +``` +pending → processing → success/failed +``` + +- 轮询间隔:0.5秒 +- 超时:30秒 +- 成功:提取 created_id +- 失败:获取 error_message + +### 4.4 状态总结表 + +**Load 阶段(数据拉取)**: + +| HTTP 操作 | 响应码 | 行为 | 创建节点 | 节点状态 | 说明 | +|---------|-------|-----|---------|---------|------| +| GET /list | 200 | 返回数据列表 | ✅ 是 | PENDING | 等待后续 bind/create/update | +| GET /list | 4xx/5xx | 返回空列表 | ❌ 否 | - | 不创建节点 | + +**执行阶段(POST/PUT/DELETE)**: + +| HTTP 操作 | 响应码 | Push Log | TaskStatus | SyncStatus | 说明 | +|---------|-------|---------|-----------|-----------|------| +| POST/PUT | 202 | pending | IN_PROGRESS | IN_PROGRESS | 异步开始 | +| - | - | processing | IN_PROGRESS | IN_PROGRESS | 异步处理中 | +| - | - | success | SUCCESS | SUCCESS | 异步成功 | +| - | - | failed | FAILED | FAILED | 异步失败 | +| - | - | timeout | FAILED | FAILED | 轮询超时 | + +## 5. Context 机制 + +### 5.1 Context 的作用 + +Context 是 SyncNode 的字典字段,用于存储业务数据之外的上下文信息,例如: +- `project_id`: 当前对象所属的项目ID +- `contract_id`: 合同变更所属的合同ID +- `parent_id`: 父对象ID +- 其他 API 调用需要但 schema 中没有的信息 + +### 5.2 Context 使用流程 + +**场景:加载合同数据** + +1. **Handler.load()** 从 self._collection 获取所有 project +2. 遍历每个 project,调用 `GET contract/list?project_id=xxx` +3. 为每个返回的 contract 数据添加临时标记 `_context = {"project_id": xxx}` +4. **Handler.create_node()** 创建 SyncNode 时,提取 `_context` 并设置到 `node.context` +5. **Handler.update()** 更新时,从 `node.context["project_id"]` 获取 project_id 并添加到请求数据 + +### 5.3 Context 传递规则 + +- 父 → 子:从依赖的父节点继承 context +- 横向传递:同级节点不共享 context +- 更新时使用:从 context 提取必要信息添加到请求 payload + +## 6. 智能 API 路由 + +### 6.1 路由策略 + +根据节点数据的字段,自动选择正确的 API endpoint: + +**方案1:字段匹配** +- 检查 node.data 中的字段集合 +- 匹配预定义的 endpoint → required_fields 映射表 +- 选择第一个匹配的 endpoint + +**方案2:Schema 类型** +- 根据 node.schema 的类型 +- 查找 schema_type → endpoint 映射表 + +**默认规则**: +- CREATE: `{node_type}` +- UPDATE: 子类重写 `_select_update_endpoint()` +- DELETE: `{node_type}` + +### 6.2 Project 示例 + +Project 有多个更新接口: +- `project/key_constraints` - 需要字段:key_constraints, key_constraints_remark +- `project/complete_investment` - 需要字段:complete_investment +- `project/dynamic_investment` - 需要字段:dynamic_investment +- `project/plan_construction` - 需要字段:plan_construction_capacity, plan_construction_date +- ... 等 + +Handler 定义映射表,根据实际数据字段自动选择。 + +## 7. 依赖数据获取 + +### 7.1 获取模式 + +Handler 通过 `collection.filter(node_type="xxx")` 获取依赖数据: + +**加载顺序**(按依赖关系): +1. Project(无依赖) +2. Contract(依赖 Project) +3. Contract Change(依赖 Project + Contract) + +### 7.2 数据流 + +``` +Pipeline + → 按拓扑序加载 + → ProjectHandler.load() + → GET project/list + → 创建 ProjectSyncNode + → ContractHandler.load() + → collection.filter(node_type="project") + → 遍历 project,GET contract/list?project_id=xxx + → 创建 ContractSyncNode,设置 context["project_id"] + → ContractChangeHandler.load() + → collection.filter(node_type="contract") + → 遍历 contract,从 context 获取 project_id + → GET contract_change/list?project_id=xxx&contract_id=yyy + → 创建节点,设置 context +``` + +## 8. 实现计划 + +### Phase 1: HTTP 通信层 +- 实现 **ApiClient** 类 + - HTTP Client 封装(httpx.AsyncClient) + - 签名生成(_generate_signature) + - 统一请求方法(get/post/put/delete) + - **批量 Push Log 查询**(get_push_logs,单个也传列表) + - ~~wait_for_push_log~~(不实现,由 DataSource 调用 poll) + +### Phase 2: DataSource 协调层 +- 实现 **ApiDataSource** 类 + - 持有 ApiClient 实例 + - Handler 注册和管理 + - 实现 DataSource 接口(load_all, execute_batch) + - 注入 api_client 到 Handler + - 实现轮询逻辑(_poll_async_tasks) + +### Phase 3: Handler 基类 +- 实现 **BaseApiHandler** 类 + - load/create/update/delete/poll 方法 + - 使用 self.api_client 发送请求 + - **extract_created_id**(子类可重写) + - **_execute_with_retry**(可选,子类可重写重试策略) + - Context 管理 + +### Phase 4: 业务验证 +- 实现 **ProjectApiHandler**(无依赖,简单场景) + - 实现 load:GET project/list + - 实现 create:POST project + - 实现 poll:查询 push_log +- 实现 **ContractApiHandler**(依赖 Project,验证 context) + - 实现 load:遍历 project,GET contract/list?project_id=xxx + - 设置 context["project_id"] +- 编写测试验证设计 + +### Phase 5: 完善功能 +- 批量 Push Log 查询优化(等待后端实现批量接口) +- 超时控制(可配置) +- 请求日志和调试 + +### Phase 6: 推广 +- 实现剩余业务 Handler +- 性能优化(并发控制) +- 文档和示例 + +## 9. 与现有系统集成 + +**调用关系**: +``` +Pipeline + ↓ +ApiDataSource (持有 ApiClient) + ↓ +BaseApiHandler (使用 api_client) + ↓ +ApiClient (发送 HTTP 请求) +``` + +**职责分离**: +- **ApiClient**: 纯粹的 HTTP 通信,无业务逻辑 +- **ApiDataSource**: 协调 Handler,管理执行流程 +- **BaseApiHandler**: 业务逻辑,调用 ApiClient 完成网络操作 +- **具体 Handler**: 实现特定业务的 load/create/update/delete + +**优点**: +- ApiClient 和 Handler 解耦,避免循环依赖 +- Handler 通过 self.api_client 访问 HTTP 功能 +- DataSource 统一管理 ApiClient 生命周期 +- Handler 内部灵活控制重试策略 + +## 10. 关键优势 + +1. **简化架构**:去掉 Repository 层,代码量减少 50% +2. **职责清晰**: + - ApiClient:HTTP 通信 + - DataSource:协调和轮询 + - Handler:业务逻辑和重试 +3. **重试灵活**:Handler 内部实现,不同业务可自定义策略 +4. **状态清晰**:Load 阶段创建 PENDING 节点,执行阶段明确状态转换 +5. **批量优化**:Push Log 批量查询,减少 HTTP 请求 +6. **易于扩展**:新业务只需实现 Handler,复用 Client 和 DataSource +7. **易于测试**:ApiClient 可 mock,Handler 独立测试 + +## 11. 设计改进总结 + +| 改进点 | 初始设计 | 最终设计 | 理由 | +|-------|---------|---------|------| +| Push Log 查询 | get_push_log(id) | get_push_logs([ids]) | 批量查询 | +| 轮询逻辑 | wait_for_push_log 在 Client | 移除,DataSource 调用 poll | 职责清晰 | +| created_id 提取 | 在 Client | 在 Handler 基类 | 业务差异 | +| 重试逻辑 | 在 DataSource | **在 Handler** | 业务灵活性 | +| Load 状态 | GET 成功 → SUCCESS | GET 成功 → PENDING | Load ≠ 同步完成 | +| 执行状态 | 不明确 | 执行前设置 IN_PROGRESS | 状态清晰 | +7. **易于测试**:ApiClient 可以 mock,Handler 单独测试业务逻辑 + +## 12. 使用示例 + +### 12.1 基本使用流程 + +```python +# 1. 创建 DataSource +datasource = ApiDataSource( + base_url="https://api.example.com", + uid="user123", + secret="secret_key" +) + +# 2. 初始化(必须调用) +await datasource.initialize() + +# 3. 注册 Handler +datasource.register_handler(ProjectApiHandler()) +datasource.register_handler(ContractApiHandler()) + +# 4. 创建 Collection +collection = DataCollection() + +# 5. 加载数据(自动处理异常,不会抛出) +await datasource.load_all(collection, order=["project", "contract"]) + +# 6. 执行同步(自动处理异常,不会抛出) +await datasource.sync_all(collection, order=["project", "contract"]) + +# 7. 关闭连接(必须调用) +await datasource.close() +``` + +### 12.2 异常处理说明 + +**设计原则**: +- ✅ **load_all 和 sync_all 不会抛出异常** +- ✅ **Handler 的 create/update/delete 捕获所有 HTTP 异常** +- ✅ **所有错误转换为状态(SyncStatus.FAILED)和错误信息(node.error)** + +**为什么不需要 try-finally?** + +```python +# ❌ 不需要这样做 +try: + await datasource.load_all(collection, order=["project"]) +finally: + await datasource.close() + +# ✅ 直接调用即可 +await datasource.initialize() +await datasource.load_all(collection, order=["project"]) # 内部已处理异常 +await datasource.sync_all(collection, order=["project"]) # 内部已处理异常 +await datasource.close() +``` + +**异常处理机制**: + +1. **load_all 异常处理**: + ```python + # 加载某个类型失败,记录错误但继续处理其他类型 + for node_type in order: + try: + raw_items = await handler.load(collection) + # ... 创建节点 + except Exception as e: + print(f"Error loading {node_type}: {e}") + # 继续处理下一个类型 + ``` + +2. **sync_all 异常处理**: + ```python + # Handler 返回的异常已被捕获转为 TaskResult + for node in nodes: + try: + result = await handler.create(node) # Handler 内部捕获异常 + # 根据 result.status 更新节点状态 + except Exception as e: + # DataSource 的最后保护 + node.status = SyncStatus.FAILED + node.error = str(e) + ``` + +3. **Handler 异常处理**: + ```python + async def create(self, node: SyncNode) -> TaskResult: + try: + # 生成参数 + push_id = self._generate_push_id() + data = {..., "push_id": push_id, "biz_id": self._generate_biz_id(node)} + + # 调用 API + response = await self.api_client.post("/api/v2/project", data) + + # 返回成功 + return TaskResult(status=TaskStatus.SUCCESS, data_id=response['data']['id']) + + except httpx.HTTPStatusError as e: + # HTTP 错误(4xx, 5xx) + return TaskResult(status=TaskStatus.FAILED, error=f"HTTP {e.response.status_code}: {e}") + except httpx.NetworkError as e: + # 网络错误 + return TaskResult(status=TaskStatus.FAILED, error=f"Network error: {e}") + except Exception as e: + # 其他异常 + return TaskResult(status=TaskStatus.FAILED, error=f"Unexpected error: {e}") + ``` + +### 12.3 Pipeline 集成示例 + +```python +async def sync_pipeline(datasource: ApiDataSource): + """同步流程编排""" + + # 初始化 + await datasource.initialize() + + # 创建 Collection + collection = DataCollection() + + # 执行同步流程(所有错误都被内部处理) + await datasource.load_all(collection, order=["project", "contract", "material"]) + await datasource.sync_all(collection, order=["project", "contract", "material"]) + + # 检查结果 + failed_nodes = collection.filter(status=SyncStatus.FAILED) + if failed_nodes: + print(f"Failed nodes: {len(failed_nodes)}") + for node in failed_nodes: + print(f" - {node.node_type}:{node.node_id}: {node.error}") + + # 清理 + await datasource.close() +``` + +**关键点**: +- ✅ 不需要 try-except 包裹 load_all/sync_all +- ✅ 通过检查节点状态判断成功/失败 +- ✅ 错误信息保存在 node.error 中 +- ✅ Pipeline 专注于流程编排,不处理异常细节 + diff --git a/docs/archive/docs/datasource_handler_architecture_v2.md b/docs/archive/docs/datasource_handler_architecture_v2.md new file mode 100644 index 0000000..f23dd93 --- /dev/null +++ b/docs/archive/docs/datasource_handler_architecture_v2.md @@ -0,0 +1,518 @@ +# DataSource + Handler 架构设计 V2 + +## 核心原则 + +### **职责分离** + +```text +Strategy (业务逻辑层) + ↓ 设置 action, 完成 ID 映射 +DataSource (状态管理 + 编排层) + ↓ 调用 Handler, 管理状态流转 +Handler (纯执行层) + ↓ 调用后端 API, 返回结果 +Backend API +``` + +### **关键设计决策** + +1. **ID 映射在 Strategy 完成** ✅ + - `Strategy.create()` / `Strategy.update()` 时,已将依赖字段的本地 ID 替换为远程 ID + - DataSource 拿到的 `node.data` 已经是映射好的数据 + - Handler 直接使用 `node.data`,不需要关心 ID 映射 + +2. **状态管理在 DataSource** ✅ + - 所有 `node.status` 的转换由 DataSource 负责 + - Handler 只返回 `TaskResult`(成功/失败/进行中) + - DataSource 根据 `TaskResult` 更新 `node.status` + +3. **Handler 只负责执行** ✅ + - 调用后端 API(load/create/update/delete) + - 返回执行结果(TaskResult) + - 提供异步任务轮询(poll_tasks) + - 提供数据质量检查(validate) + +--- + +## Handler 接口设计 + +### **核心方法** + +```python +class NodeHandler(Protocol[T]): + # ===== 数据加载 ===== + async def load(self, collection: Optional[DataCollection] = None) -> List[Dict[str, Any]]: + """ + 从后端加载全部数据 + + Args: + collection: Collection 上下文(可选,用于依赖查询) + + Returns: + 原始数据列表 + + 示例: + # Contract Handler(依赖 Project) + async def load(self, collection=None): + # 从 collection 获取 project 列表 + if collection: + projects = collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + else: + project_ids = [] + + # 只加载这些项目的合同 + response = await self.api.get_contracts(project_ids=project_ids) + return response["data"] + """ + + # ===== 数据操作 ===== + async def create(self, node: SyncNode[T]) -> TaskResult: + """ + 创建节点 + + 注意:node.data 已经过 ID 映射,直接使用即可 + + Returns: + TaskResult: + - SUCCESS: 同步完成,返回 data_id + - IN_PROGRESS: 异步任务,返回 task_id + - FAILED: 失败,返回 error + + 示例: + # 同步接口 + async def create(self, node): + try: + response = await self.api.create_contract(node.data) + return TaskResult.success(data_id=response["id"]) + except Exception as e: + return TaskResult.failed(error=str(e)) + + # 异步接口 + async def create(self, node): + try: + response = await self.api.submit_contract_async(node.data) + return TaskResult.in_progress(task_id=response["task_id"]) + except Exception as e: + return TaskResult.failed(error=str(e)) + """ + + async def update(self, node: SyncNode[T]) -> TaskResult: + """更新节点(同 create)""" + + async def delete(self, node: SyncNode[T]) -> TaskResult: + """删除节点(同 create)""" + + # ===== 异步任务轮询 ===== + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """ + 批量轮询异步任务状态 + + Args: + task_ids: 任务 ID 列表 + + Returns: + {task_id: TaskResult} 字典 + + 示例: + async def poll_tasks(self, task_ids): + response = await self.api.batch_query_tasks(task_ids) + results = {} + for task in response["tasks"]: + if task["status"] == "completed": + results[task["id"]] = TaskResult.success( + data_id=task["result"]["contract_id"] + ) + elif task["status"] == "failed": + results[task["id"]] = TaskResult.failed( + error=task["error"] + ) + else: # running + results[task["id"]] = TaskResult.in_progress( + task_id=task["id"] + ) + return results + """ + + # ===== 数据质量检查 ===== + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + """ + 数据质量检查 + + Args: + data: 原始数据 + + Returns: + ValidationResult(是否有效 + 错误列表) + + 示例: + async def validate(self, data): + errors = [] + if not data.get("code"): + errors.append("合同编码为空") + if not data.get("project_id"): + errors.append("项目 ID 为空") + + return ValidationResult( + is_valid=len(errors) == 0, + errors=errors + ) + """ + + # ===== 辅助方法 ===== + def extract_id(self, data: Dict[str, Any]) -> str: + """从原始数据提取 ID""" + + def create_node(self, data: Dict[str, Any]) -> SyncNode[T]: + """从原始数据创建 SyncNode""" +``` + +### **TaskResult 设计** + +```python +class TaskStatus(Enum): + SUCCESS = "success" # 同步完成 + FAILED = "failed" # 失败 + IN_PROGRESS = "in_progress" # 异步任务进行中 + + +class TaskResult: + def __init__( + self, + status: TaskStatus, + data_id: Optional[str] = None, # 成功时返回的 ID + task_id: Optional[str] = None, # 异步任务 ID + error: Optional[str] = None, # 失败原因 + metadata: Optional[Dict] = None # 其他元数据 + ): + ... + + @classmethod + def success(cls, data_id: Optional[str] = None) -> TaskResult: + """创建成功结果""" + + @classmethod + def failed(cls, error: str) -> TaskResult: + """创建失败结果""" + + @classmethod + def in_progress(cls, task_id: str) -> TaskResult: + """创建进行中结果""" +``` + +--- + +## DataSource 接口设计 + +### **接口方法** + +```python +class BaseDataSource(ABC): + # ===== Handler 管理 ===== + def register_handler(self, handler: NodeHandler) -> None: + """注册 Handler""" + + def get_handler(self, node_type: str) -> NodeHandler: + """获取 Handler""" + + # ===== 数据加载 ===== + async def load_all( + self, + order: List[str] + ) -> None: + """ + 按依赖顺序加载所有数据 + + 注意:调用前需先 set_collection() + + Args: + order: 节点类型顺序(如 ["project", "contract", "construction"]) + + 工作流程: + 1. 按顺序遍历每个节点类型 + 2. 调用 Handler.load() + 3. Handler 可以从 self._collection 查询依赖节点 + 4. 使用 Handler.create_node() 创建 SyncNode + 5. 添加到 Collection + """ + + # ===== 同步执行 ===== + async def sync_all( + self, + order: List[str] + ) -> None: + """ + 按依赖顺序执行同步 + + 流程: + 1. 按顺序遍历每个节点类型 + 2. 筛选需要同步的节点(status=PENDING, action!=NONE) + 3. 调用 Handler 的 create/update/delete + 4. 根据 TaskResult 更新节点状态 + 5. 处理异步任务轮询 + """ + + # ===== 统计信息 ===== + def get_sync_summary(self, collection: DataCollection) -> Dict[str, Any]: + """获取同步统计信息""" +``` + +### **状态流转逻辑** + +```python +async def _sync_nodes(self, handler, nodes): + async_tasks = {} # {node_id: task_id} + + for node in nodes: + # 1. 跳过不需要处理的节点 + if node.action == SyncAction.NONE: + continue + + # 2. 跳过异常状态节点 + if node.binding_status in [DEPENDENCY_ERROR, ABNORMAL, WARNING]: + node.status = SyncStatus.SKIPPED + continue + + # 3. 只处理 PENDING 节点 + if node.status != SyncStatus.PENDING: + continue + + # 4. 执行操作 + try: + node.status = SyncStatus.IN_PROGRESS + + if node.action == SyncAction.CREATE: + result = await handler.create(node) + elif node.action == SyncAction.UPDATE: + result = await handler.update(node) + elif node.action == SyncAction.DELETE: + result = await handler.delete(node) + + # 5. 处理结果 + if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + if result.data_id: + node.data_id = result.data_id # 回填 ID + + elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error + + elif result.status == TaskStatus.IN_PROGRESS: + async_tasks[node.node_id] = result.task_id + + except Exception as e: + node.status = SyncStatus.FAILED + node.error = str(e) + + # 6. 轮询异步任务 + if async_tasks: + await self._poll_async_tasks(handler, nodes, async_tasks) +``` + +### **异步任务轮询** + +```python +async def _poll_async_tasks(self, handler, nodes, async_tasks): + node_map = {n.node_id: n for n in nodes} + + max_retries = poll_max_retries # 默认轮询 1 次,可配置 + retry_count = 0 + + while async_tasks and retry_count < max_retries: + # 批量查询 + task_ids = list(async_tasks.values()) + results = await handler.poll_tasks(task_ids) + + # 处理结果 + for node_id, task_id in list(async_tasks.items()): + if task_id not in results: + continue + + result = results[task_id] + node = node_map[node_id] + + if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + if result.data_id: + node.data_id = result.data_id + async_tasks.pop(node_id) + + elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error + async_tasks.pop(node_id) + + # 还有未完成任务,等待后重试 + if async_tasks: + await asyncio.sleep(2) + retry_count += 1 + + # 超时未完成的任务标记为失败 + for node_id in async_tasks: + node = node_map[node_id] + node.status = SyncStatus.FAILED + node.error = "Async task timeout" +``` + +--- + +## 完整流程示例 + +### **Pipeline 编排** + +```python +# Stage 0: 初始化 +collection = DataCollection() +datasource = ApiDataSource(api_client) + +# 注册 Handler +datasource.register_handler(ProjectNodeHandler(api_client)) +datasource.register_handler(ContractNodeHandler(api_client)) + +# Stage 1: 加载数据 +datasource.set_collection(collection) +await datasource.load_all( + order=["project", "contract"] # 依赖顺序 +) + +# Stage 2: Strategy 执行 +for strategy in [project_strategy, contract_strategy]: + await strategy.bind() # 设置 binding_status + await strategy.create() # 设置 action=CREATE + ID 映射 + await strategy.update() # 设置 action=UPDATE + ID 映射 + await strategy.pre_sync_check() + +# Stage 3: 物理同步 +await datasource.sync_all( + order=["project", "contract"] +) + +# Stage 4: 检查结果 +summary = datasource.get_sync_summary(collection) +print(f"Success: {summary['success']}, Failed: {summary['failed']}") +``` + +### **Contract Handler 实现** + +```python +class ContractNodeHandler(BaseNodeHandler[ContractResponse]): + def __init__(self, api_client): + super().__init__( + node_type="contract", + node_class=ContractSyncNode, + schema=ContractResponse + ) + self.api = api_client + + async def load(self): + """加载合同(依赖 Project)""" + if self._collection: + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + else: + project_ids = [] + + response = await self.api.get_contracts(project_ids=project_ids) + return response["data"] + + async def create(self, node): + """创建合同(异步接口)""" + try: + # node.data 已经过 ID 映射,直接使用 + response = await self.api.create_contract_async(node.data) + + if response.get("async"): + return TaskResult.in_progress(task_id=response["task_id"]) + else: + return TaskResult.success(data_id=response["id"]) + + except Exception as e: + return TaskResult.failed(error=str(e)) + + async def update(self, node): + """更新合同(同步接口)""" + try: + response = await self.api.update_contract(node.data_id, node.data) + return TaskResult.success() + except Exception as e: + return TaskResult.failed(error=str(e)) + + async def poll_tasks(self, task_ids): + """轮询异步任务""" + response = await self.api.batch_query_tasks(task_ids) + results = {} + for task in response["tasks"]: + if task["status"] == "completed": + results[task["id"]] = TaskResult.success( + data_id=task["result"]["contract_id"] + ) + elif task["status"] == "failed": + results[task["id"]] = TaskResult.failed(error=task["error"]) + else: + results[task["id"]] = TaskResult.in_progress(task_id=task["id"]) + return results + + async def validate(self, data): + """数据质量检查""" + errors = [] + if not data.get("code"): + errors.append("合同编码为空") + if not data.get("project_id"): + errors.append("项目 ID 为空") + + return ValidationResult(is_valid=len(errors) == 0, errors=errors) + + def extract_id(self, data): + return data["id"] +``` + +--- + +## 核心优势 + +### **1. 职责清晰** + +- **Strategy**: 业务逻辑 + ID 映射 +- **DataSource**: 状态管理 + 编排 +- **Handler**: 纯执行(后端 API 调用) + +### **2. ID 映射前置** + +- ID 映射在 Strategy 完成,DataSource 和 Handler 无需关心 +- `node.data` 已经是映射好的数据,直接使用 + +### **3. 状态统一管理** + +- 所有状态流转由 DataSource 负责 +- Handler 只返回结果,不改变节点状态 + +### **4. 异步任务支持** + +- Handler 返回 `TaskResult.in_progress(task_id)` +- DataSource 自动轮询直到完成 + +### **5. 数据质量保障** + + +- Handler 提供 `validate()` 方法 +- DataSource 在加载时检查数据质量 + +### **6. 易于测试** + +- Handler 可以 Mock(返回假 TaskResult) +- DataSource 可以单独测试状态流转逻辑 +- Strategy 可以单独测试 ID 映射逻辑 + +--- + +## 与现有架构的兼容性 + +完全符合 [架构分层设计.md](./架构分层设计.md) 的四层模型: + +1. **Common 层**: SyncNode, DataCollection, BindingManager +2. **Sync System 层**: SyncStrategy(负责 bind/create/update + ID 映射) +3. **DataSource 层**: BaseDataSource + NodeHandler(状态管理 + 执行) +4. **Pipeline 层**: 流程编排 + 依赖顺序 + +符合 [状态定义规范.md](./状态定义规范.md) 的状态流转逻辑。 diff --git a/docs/archive/docs/node_id_data_id_lifecycle.md b/docs/archive/docs/node_id_data_id_lifecycle.md new file mode 100644 index 0000000..fb6b102 --- /dev/null +++ b/docs/archive/docs/node_id_data_id_lifecycle.md @@ -0,0 +1,150 @@ +# node_id / data_id / 持久化与生命周期说明 + +本文档说明同步系统中 `node_id` 与 `data_id` 的职责、生成时机、持久化行为,以及同步流程中“创建/绑定/回填”的完整生命周期。目标是避免“重复生成 node_id 导致绑定失效”的问题,并明确各层职责。 + +--- + +## 1. 基础概念 + +- **data_id** + - 业务主键(来自数据源/远端系统的资源 ID)。 + - 在加载阶段通常已存在;在 CREATE 场景下初始为空,成功后由 DataSource 回填。 + +- **node_id** + - 同步系统内部的**稳定标识符**(绑定与持久化的主键)。 + - 用于绑定表、持久化节点、依赖追踪等。 + - 设计目标:**跨同步周期稳定**,不能随每次加载而变化。 + +--- + +## 2. 核心结论(必须遵守) + +1. **node_id 一旦建立,不应再被数据源“重新生成”。** + - 绑定关系与持久化状态依赖 `node_id`;若每次加载都重新生成,会导致历史绑定失效。 +2. **加载阶段应先恢复 Collection(持久化节点),再加载 DataSource 数据。** + - 数据源加载出的 `data_id` 应优先匹配已持久化的节点;匹配到则复用旧 `node_id`。 +3. **CREATE 场景允许临时/新建 node_id**,但必须通过后续回填与绑定更新保持一致性。 + +--- + +## 3. 正确的初始化/加载顺序 + +### 推荐流程(Pipeline 前半段) + +1. **持久化恢复阶段** + - 必须同时恢复 `node_id` 与 `data_id`(以及状态字段),否则无法建立稳定的映射关系。 + - Collection 可能为空,这属于合法情况。 + +2. **数据源加载阶段(DataSource.load_all)** + - 对每一条业务数据(含 `data_id`): + - **若 Collection 内已存在该 `data_id` 对应节点**:将数据写回原节点(保留旧 `node_id`)。 + - **若不存在**:由 **Collection** 生成新的 `node_id`,并创建新节点。 + +> 这样可避免“第二次同步时重建节点,导致旧绑定丢失”。 + +--- + +## 4. node_id 的来源与稳定性 + +### A. 持久化恢复阶段 + +- **恢复时必须包含 `node_id` 与 `data_id`**: + - 两者成对恢复,才能保证后续 load 阶段按 `data_id` 命中旧节点。 + +### B. 数据源加载阶段 + +- **优先复用持久化 node_id**: + - 通过 `data_id` 在 Collection 中查找并更新已有节点。 +- **仅在未知 data_id 时新建 node_id**: + - 新节点 `node_id` 必须由 **Collection** 生成,而非 DataSource/Handler 直接拼接。 + +### C. 创建阶段(Strategy.create) + +- 新建“目标端”节点时,**必须有 node_id**: + - 用于写入 Collection、记录状态、建立临时绑定。 +- 成功后回填 `data_id`,**node_id 不变**。 + +--- + +## 5. data_id 的来源与回填 + +本节按阶段拆分说明 `data_id` 的来源与写回。 + +### A. 持久化恢复阶段 + +- `data_id` 从持久化数据中恢复(与 `node_id` 一起恢复)。 + +### B. 数据源加载阶段 + +- `data_id` 来自数据源原始数据(`id` / `_id`)。 +- 若命中已有节点,则仅更新数据与状态,不改变 `node_id`。 + +### C. 同步创建与轮询阶段 + +- CREATE 提交后,DataSource 从响应/轮询结果提取 `biz_id`。 +- 成功时回填到 `node.data_id`,并回写 `node.data` 的主键字段(仅 `id` / `_id`)。 + +### D. 持久化阶段 + +- 将更新后的 `node_id` / `data_id` / 状态字段持久化,供下次同步恢复使用。 + +--- + +## 6. 绑定与 node_id 的关系 + +- 绑定表的 key 为 `node_id`,绑定记录是 `local_node_id <-> remote_node_id`。 +- 因此:**node_id 必须稳定**,才能保证绑定长期有效。 +- 绑定可在创建前建立“临时关系”,但成功后不应更换 node_id。 + +--- + +## 7. 同步周期中的典型场景 + +### 场景 1:第一次同步(无持久化) +- Collection 为空 → DataSource load 新节点 → 生成新 `node_id`。 +- Strategy bind / create / update 执行。 +- 持久化后,下次同步可复用 `node_id`。 + +### 场景 2:第二次同步(已有持久化) +- 先恢复 Collection(已有 `node_id`)。 +- DataSource load 时按 `data_id` 匹配旧节点并更新数据。 +- 绑定关系仍有效。 + +### 场景 3:创建新数据(CREATE) +- Strategy 产生目标端节点(`node_id` 新生成)。 +- DataSource 执行创建,回填 `data_id`。 +- 绑定记录更新为真实 `data_id`(但 node_id 保持不变)。 + +--- + +## 8. 关键规则总结 + +- **node_id 是“同步系统内的稳定 ID”,必须持久化与复用。** +- **data_id 是“业务系统的资源 ID”,由数据源加载或创建后回填。** +- **加载顺序:先恢复持久化节点 → 再 load 数据源。** +- **遇到已存在 data_id:复用 node_id;否则创建新节点。** +- **CREATE 成功后只更新 data_id,不更换 node_id。** + +--- + +## 9. 相关文件参考 + +- 绑定与状态定义:见 [docs/状态定义规范.md](状态定义规范.md) +- 编排流程:见 [docs/编排流程规范.md](编排流程规范.md) +- BaseDataSource:见 [sync_system_new/datasource/datasource.py](../sync_system_new/datasource/datasource.py) +- BaseApiHandler:见 [sync_system_new/datasource/api/handler.py](../sync_system_new/datasource/api/handler.py) + +--- + +## 10. 明确规则与建议实现 + +- **DataSource.load_all 必须先按 `data_id` 命中已有节点并更新**,未命中时再由 Collection 创建新节点并分配新的 `node_id`。 +- **推荐实现方式**:先 `find_by_data_id`,命中走通用更新;未命中再创建新节点(无需强制 `upsert_by_data_id` 接口)。 +- **创建流程中的临时绑定/成功更新规则**: + - CREATE 节点创建时:`binding_status = NORMAL`,`action = CREATE`,`status = PENDING`,`data_id = ""`。 + - 执行提交前置为 `status = IN_PROGRESS`(异步)或保持 `PENDING`(同步接口待执行)。 + - 成功回填后:`status = SUCCESS`,`data_id` 回填并写回主键字段,绑定记录保持 `node_id` 不变。 + - 过程中出现错误:`status = FAILED`,`error` 记录原因。 +- **异常节点持久化/恢复策略**: + - 持久化时保留异常节点与错误信息。 + - 恢复时是否保留/清理异常节点应通过策略配置控制(默认建议保留以便人工修复)。 diff --git a/docs/archive/docs/skip_sync_behavior_fix.md b/docs/archive/docs/skip_sync_behavior_fix.md new file mode 100644 index 0000000..311b0cb --- /dev/null +++ b/docs/archive/docs/skip_sync_behavior_fix.md @@ -0,0 +1,232 @@ +# Skip Sync 行为修复说明 + +## 问题分析 + +### 1. **绑定失败的根本原因** + +**问题现象**: +- Company: 1/39 绑定 +- Supplier: 0/65202 绑定(完全没绑定!) +- 导致依赖supplier的业务(contract, material等)也绑不上 +- 远程异常创建了74条数据 + +**根本原因有两个**: + +#### 原因1:skip_sync 跳过了整个策略(包括 bind) + +```python +# 旧逻辑:skip_sync=True 时跳过整个策略 +if getattr(strategy, 'skip_sync', False): + continue # ← 跳过了 bind/create/update 全部! +``` + +修复后: +```python +# 新逻辑:bind() 始终执行,skip_sync 只跳过 create/update/sync +await strategy.bind() # ← 始终执行 + +if getattr(strategy, 'skip_sync', False): + continue # ← 只跳过 create/update +``` + +#### 原因2:自动绑定ID解析失败没有设置DEPENDENCY_ERROR + +```python +# 旧逻辑:ID解析失败只是跳过 +if not resolved_key_dict: + continue # ← 节点保持 MISSING,会被误创建! +``` + +修复后: +```python +# 新逻辑:ID解析失败设置DEPENDENCY_ERROR +if not resolved_key_dict: + node.set_binding_status(BindingStatus.DEPENDENCY_ERROR, "业务键中的ID字段解析失败") + continue # ← 节点为 DEPENDENCY_ERROR,不会被创建 +``` + +### 2. **状态与创建的关系** + +| 状态 | 来源 | 允许创建 | 说明 | +|------|------|:---:|------| +| **UNCHECKED** | 加载后初始状态 | ❌ | bind() 未执行 | +| **NORMAL** | 有绑定记录 | ❌ | 已绑定 | +| **MISSING** | 无绑定记录 | ✅ | 真正的孤儿 | +| **WARNING** | 业务键字段缺失 | ❌ | 数据不完整 | +| **DEPENDENCY_ERROR** | 依赖不满足 | ❌ | 父节点未就绪 | +| **ABNORMAL** | 数据损坏 | ❌ | 需人工处理 | + +**关键原则**: +- `create()` 只查找 `binding_status == MISSING` 的节点 +- 如果 bind() 没执行,状态是 UNCHECKED → 不会创建 +- 如果 bind() 执行了但依赖不满足 → DEPENDENCY_ERROR → 不会创建 + +### 3. **Supplier 默认行为变更** + +**旧行为**: +- `default_skip_sync = True` → 默认跳过同步 +- 需要在调用层设置 `force_sync_types=["supplier"]` + +**新行为**: +- `default_skip_sync` 已移除(使用基类默认值 False) +- Supplier 默认会执行完整同步(bind/create/update) +- 如需跳过,在调用层配置 `skip_sync_types=["supplier"]` + +## 解决方案 + +### 修改 1:分离 bind() 和 skip_sync + +**新逻辑**: +```python +# sync_system_new/pipeline/full_sync_pipeline.py + +# Step 1a: 绑定(始终执行) +await strategy.bind() + +# Step 1b: 检查是否跳过 create/update/sync +if getattr(strategy, 'skip_sync', False): + print(f"⏭️ Skipping create/update/sync for {node_type}") + # 继续执行 pre_sync_check,但跳过 create/update/sync + if hasattr(strategy, "pre_sync_check"): + ok = await strategy.pre_sync_check() + ... + continue + +# Step 1c: 正常的 create/update +await strategy.create() +await strategy.update() +``` + +**效果**: +- ✅ **bind() 始终执行**(建立绑定关系) +- ✅ **skip_sync=True 只跳过 create/update/sync**(避免昂贵操作) +- ✅ **pre_sync_check 仍然执行**(依赖检查) + +### 修改 2:添加 force_sync_types 配置 + +**配置示例**: +```python +# tests/run_full_sync_pipeline_simple.py +CONFIG = { + # 第一次运行:从 API 加载 + 绑定 + 创建 + "force_sync_types": ["supplier"], + "wipe_persistence_on_start": True, + + # 第二次运行:从持久化加载 + 跳过同步 + # "handler_configs": {"supplier": {"load_mode": "persisted_only"}}, + # "skip_sync_types": ["supplier"], + # "wipe_persistence_on_start": False, +} +``` + +**优先级**: +1. **force_sync_types**(最高)→ `skip_sync = False` +2. **skip_sync_types** → `skip_sync = True` +3. **策略默认值** (default_skip_sync) + +### 修改 3:添加测试日志保存 + +**功能**: +```python +# tests/run_full_sync_pipeline_simple.py +log_path = log_dir / f"simple_pipeline_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" +sys.stdout = Tee(original_stdout, log_file) +``` + +**输出位置**: +``` +test_results/simple_pipeline_20260204_162345.log +``` + +## 使用指南 + +### Phase 1: 首次运行(API + 绑定 + 创建) + +```python +CONFIG = { + # 不需要特殊配置,所有类型默认都会同步 + "wipe_persistence_on_start": True, # 清空数据库 +} +``` + +**预期结果**: +- Supplier: 从API加载60000条 → 自动绑定(credit_code) → 拉取到本地 → 持久化 +- Company: 自动绑定 → 拉取 +- Contract等: 通过supplier_id/project_id绑定 → 创建 + +### Phase 2: 后续运行(持久化 + 跳过同步) + +```python +CONFIG = { + "handler_configs": { + "supplier": {"load_mode": "persisted_only"} # 从DB加载 + }, + "skip_sync_types": ["supplier"], # 跳过create/update(但仍执行bind) + "wipe_persistence_on_start": False, # 保留数据 +} +``` + +**预期结果**: +- Supplier: 从DB加载(带绑定关系) → 执行bind(验证状态) → 跳过create/update +- 其他业务: 正常同步 + +## 测试验证 + +### 1. 删除远程异常创建的数据 + +```bash +# TODO: 通过API删除远程的74条测试数据 +``` + +### 2. 清空数据库重新测试 + +```bash +rm _runtime/test_simple.db +python scripts/legacy/run_full_sync_pipeline_simple.py +``` + +### 3. 验证绑定统计 + +**期望输出**: +``` +Local Summary: + company: 39/39 bindings ← 全部绑定 + supplier: 60000+/65202 bindings ← 大量绑定 + contract: XX/34 bindings ← 通过supplier_id绑定 + +Remote Summary: + company: 39/39 bindings + supplier: 60000+/60000 bindings + contract: XX/155 bindings (XX creates) +``` + +### 4. 检查日志文件 + +```bash +cat test_results/simple_pipeline_*.log | grep "Skipping" +``` + +**期望**: +- 第一次运行:**不应该有** "Skipping" 输出 +- 第二次运行:`⏭️ Skipping create/update/sync for supplier` + +## 风险评估 + +### 影响范围 +- ✅ 修复了 supplier/company 绑定失败问题 +- ✅ 防止未绑定节点异常创建 +- ✅ 保持了两阶段工作流(首次API+绑定,后续持久化) +- ⚠️ 可能影响其他使用 skip_sync 的场景(需要测试) + +### 向后兼容性 +- ✅ 原始脚本 (run_full_sync_pipeline_api.py) 不受影响 +- ✅ 没有 skip_sync 属性的策略行为不变 +- ✅ 新增的 force_sync_types 是可选参数 + +## 待办事项 + +- [ ] 测试所有业务类型的绑定统计 +- [ ] 验证依赖关系链(project → contract → material → detail) +- [ ] 检查 construction_task 为什么没绑定(0/32) +- [ ] 测试第二次运行的持久化加载逻辑 +- [ ] 更新文档说明 skip_sync 的新语义 diff --git a/docs/archive/docs/业务流程与依赖关系.md b/docs/archive/docs/业务流程与依赖关系.md new file mode 100644 index 0000000..58c8b8f --- /dev/null +++ b/docs/archive/docs/业务流程与依赖关系.md @@ -0,0 +1,72 @@ +# 业务流程与依赖关系 + +本文档描述推送系统涉及的业务实体及其依赖关系,用于指导同步顺序编排。 + +--- + +## 业务实体分类 + +### 1. 基础数据(仅拉取) + +- **用户(User)**:拉取集团管理员、区域公司管理员及特定用户信息,用于跨平台穿透。其他用户需手动创建。 +- **公司(Company)**:仅拉取,不推送。 +- **供应商(Supplier)**:仅拉取,不推送。 + +### 2. 项目及扩展数据 + +**项目(Project)** +- **绑定方式**:必须手动绑定(根节点) +- **同步操作**:允许更新和拉取 +- **依赖项**:公司、附件(Attachment) + +**项目扩展业务** +- 通过 `(project_id, key)` 或 `(project_id, code)` 自动绑定 +- 允许创建、更新、拉取 +- 依赖项目 + +### 3. 合同及子业务 + +**合同(Contract)** +- **绑定方式**:通过业务键自动绑定(需与 ECP 平台数据交叉检验) +- **同步操作**:允许拉取、创建、更新、删除 +- **依赖项**:项目 + +**合同子业务**(施工任务、物资、结算、力能) +- **绑定方式**:通过 `(contract_id, code)` 自动绑定 +- **同步操作**:允许拉取、创建、更新、删除 +- **特殊规则**:首次绑定后,项目侧不会同步创建远程已有的数据 +- **依赖项**:合同 + +**合同子业务明细**(施工明细、物资明细、结算明细、力能明细) +- **绑定方式**:通过 `(parent_id, date)` 自动绑定 +- **同步操作**:允许拉取、创建、更新、删除 +- **特殊规则**:首次绑定后,项目侧不会同步创建远程已有的数据 +- **依赖项**:对应的合同子业务 + +--- + +## 依赖关系图 + +``` +Company (基础) + ↓ +Project (手动绑定) + ↓ +Contract (自动绑定) + ↓ +Contract Sub-Business (施工/物资/结算/力能) + ↓ +Details (明细) +``` + +--- + +## 同步顺序原则 + +1. **依赖优先**:父节点必须先于子节点同步 +2. **绑定传递**:子节点的业务键构建依赖父节点的 ID 映射 +3. **故障隔离**:父节点同步失败时,子节点标记为 `DEPENDENCY_ERROR` 并跳过 + +详细状态定义参见:[sync_system_new/sync_system/STATE_DEFINITIONS.md](../sync_system_new/sync_system/STATE_DEFINITIONS.md) + +详细架构设计参见:[sync_system_new/architecture_layers.md](../sync_system_new/architecture_layers.md) diff --git a/docs/archive/docs/代码重构提纲.md b/docs/archive/docs/代码重构提纲.md new file mode 100644 index 0000000..fa726d1 --- /dev/null +++ b/docs/archive/docs/代码重构提纲.md @@ -0,0 +1,1028 @@ +# 代码重构提纲 + +> **目标**:删繁就简,将状态机、日志、持久化部分写扎实,提升代码质量 +> +> **当前状态**:基本功能已打通,所有业务类型可以从零推送,但代码存在重复、错误、不严谨、赘余、与文档不符等问题 + +--- + +## 重构原则 + +1. **严格遵循文档**:以 `docs/` 文件夹中的架构文档为准 +2. **类型安全优先**:充分利用 Python 类型系统和 Pydantic +3. **单一职责**:每个模块、类、方法只做一件事 +4. **可测试性**:重构后的代码应该更易测试 +5. **可观测性**:完善的日志和错误处理 + +--- + +## 第一阶段:核心状态机强化(最高优先级) + +### 1.1 状态转换规范化 + +**问题诊断**: +- [ ] 检查状态转换是否严格遵循 `状态定义规范.md` +- [ ] 检查是否有非法的状态转换路径 +- [ ] 检查状态转换是否都有日志记录 + +**重构任务**: + +#### Task 1.1.1: 状态转换集中管理 +```python +# sync_system_new/common/state_machine.py (新建) +class StateMachine: + """集中管理所有合法的状态转换""" + + @staticmethod + def can_transition( + from_status: SyncStatus, + to_status: SyncStatus + ) -> bool: + """检查状态转换是否合法""" + pass + + @staticmethod + def validate_binding_status_transition( + from_status: BindingStatus, + to_status: BindingStatus + ) -> bool: + """检查绑定状态转换是否合法""" + pass +``` + +**操作步骤**: +1. 创建 `state_machine.py`,定义状态转换矩阵 +2. 在 `SyncNode` 的状态设置方法中调用验证 +3. 添加状态转换日志(包含 from/to/reason) +4. 更新所有修改状态的代码,使用统一的转换方法 + +**验收标准**: +- 所有状态转换都经过 `StateMachine` 验证 +- 非法转换会抛出明确的异常 +- 每次转换都有日志记录 + +--- + +### 1.2 BindingStatus 判定逻辑强化 + +**问题诊断**: +- [ ] 检查 `BaseSyncStrategy.bind()` 是否严格遵循核心状态判定表(状态定义规范 § 1) +- [ ] 检查依赖解析逻辑是否符合规范(状态定义规范 § 2) +- [ ] 检查自动绑定逻辑是否符合 1:1 原则(状态定义规范 § 3) + +**重构任务**: + +#### Task 1.2.1: 核心状态判定表实现 +```python +# sync_system_new/sync_system/binding_matrix.py (新建) +class BindingMatrix: + """实现核心状态判定表(状态定义规范 § 1)""" + + @staticmethod + def determine_binding_status( + has_binding: bool, + local_data_valid: bool, + remote_data_valid: bool + ) -> Tuple[Optional[BindingStatus], Optional[BindingStatus]]: + """ + 返回 (local_status, remote_status) + + 实现状态定义规范 § 1 的判定表 + """ + pass +``` + +#### Task 1.2.2: 依赖解析逻辑分离 +```python +# sync_system_new/sync_system/dependency_checker.py (已存在,需强化) +class DependencyChecker: + """依赖检查与业务键解析(状态定义规范 § 2)""" + + @staticmethod + def check_dependencies( + node: SyncNode, + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager + ) -> Tuple[bool, Optional[str]]: + """ + 返回 (can_proceed, error_message) + + 检查: + 1. 依赖节点是否存在 + 2. 依赖节点的绑定状态是否为 NORMAL + 3. 依赖节点的 data_id 是否非空 + """ + pass +``` + +#### Task 1.2.3: 自动绑定逻辑重写 +```python +# sync_system_new/sync_system/auto_binder.py (新建) +class AutoBinder: + """自动绑定逻辑(状态定义规范 § 3)""" + + @staticmethod + def try_auto_bind( + local_nodes: List[SyncNode], + remote_nodes: List[SyncNode], + biz_key: tuple, + binding_manager: BindingManager + ) -> AutoBindResult: + """ + 实现去噪后 1:1 自动绑定 + + 算法: + 1. 全集搜索:寻找共享相同业务键的记录 + 2. 排除稳态对:移除成对且互绑的 NORMAL 记录 + 3. 判定剩余:L_remain=1 且 R_remain=1 才执行绑定 + """ + pass +``` + +**操作步骤**: +1. 创建 `binding_matrix.py`,实现核心判定表 +2. 强化 `dependency_checker.py`,严格按规范检查依赖 +3. 创建 `auto_binder.py`,将自动绑定逻辑从 `strategy.py` 中分离 +4. 重构 `BaseSyncStrategy.bind()` 方法,调用上述三个模块 +5. 添加详细的日志和错误信息(特别是 DEPENDENCY_ERROR 的格式) + +**验收标准**: +- `bind()` 方法逻辑清晰,不超过 50 行 +- 每个判定步骤都有日志记录 +- DEPENDENCY_ERROR 的 error 字段格式符合文档规范 +- 自动绑定只在 1:1 场景下触发 + +--- + +### 1.3 CREATE/UPDATE 逻辑规范化 + +**问题诊断**: +- [ ] 检查 CREATE 阶段的 ID 替换逻辑是否完整 +- [ ] 检查 UPDATE 阶段是否正确跳过 FAILED 节点 +- [ ] 检查是否正确处理空数据(业务键缺失) + +**重构任务**: + +#### Task 1.3.1: ID 替换逻辑统一 +```python +# sync_system_new/sync_system/id_replacer.py (新建) +class IDReplacer: + """ID 替换逻辑(架构分层设计 § 6)""" + + @staticmethod + def replace_ids_for_create( + data: Dict[str, Any], + id_fields: List[str], + binding_manager: BindingManager, + direction: str # "local_to_remote" or "remote_to_local" + ) -> Dict[str, Any]: + """ + 创建新节点时,将依赖字段的本地 ID 替换为远程 ID + + 示例: + data = {"project_id": "P1", "code": "C01"} + -> {"project_id": "RP_99", "code": "C01"} + """ + pass + + @staticmethod + def replace_ids_for_update( + data: Dict[str, Any], + id_fields: List[str], + binding_manager: BindingManager, + direction: str + ) -> Dict[str, Any]: + """准备更新数据时,替换数据中的依赖 ID""" + pass +``` + +#### Task 1.3.2: UPDATE 阶段保护逻辑 +```python +# sync_system_new/sync_system/strategy.py +class BaseSyncStrategy: + def update(self): + """UPDATE 操作必须跳过 FAILED 节点""" + # 过滤掉 status == FAILED 的节点 + # 详见:持久化与人工介入规范 § 1.2 (UPDATE 阶段保护) + pass +``` + +**操作步骤**: +1. 创建 `id_replacer.py`,集中管理 ID 替换逻辑 +2. 从 `strategy.py` 中提取 ID 替换代码,迁移到 `IDReplacer` +3. 在 `update()` 方法开头添加 FAILED 节点过滤 +4. 添加空数据检查(业务键缺失标记为 WARNING) + +**验收标准**: +- CREATE/UPDATE 使用统一的 ID 替换逻辑 +- UPDATE 不会覆盖 FAILED 节点的状态 +- 空数据不参与同步,状态为 WARNING + +--- + +## 第二阶段:持久化与状态重置强化 + +### 2.1 持久化规则严格执行 + +**问题诊断**: +- [x] ~~depend_ids 是否已移除持久化~~ ✅ 已修复 +- [ ] 检查阶段1重置是否正确实现 +- [ ] 检查阶段2清理是否正确实现 + +**重构任务**: + +#### Task 2.1.1: 阶段1重置逻辑审查 +```python +# sync_system_new/common/state_reset.py +def get_phase1_reset_defaults() -> Dict[str, Any]: + """ + 阶段1:加载时重置(持久化与人工介入规范 § 1.2) + + 必须重置: + - data/origin_data → None(等待重新加载) + - depend_ids → [] + - binding_status → UNCHECKED + - error → None + + 必须保留: + - node_id, data_id + - action(用于识别 CREATE 失败节点) + - status(只保留 FAILED,其他重置为 PENDING) + - context + """ + pass +``` + +#### Task 2.1.2: 阶段2清理逻辑审查 +```python +# sync_system_new/pipeline/full_sync_pipeline.py +async def _cleanup_create_failed_zombies(self): + """ + 阶段2:数据加载后清理(持久化与人工介入规范 § 1.2) + + 清理步骤: + 1. 检测:action == CREATE && status == FAILED + 2. 删除本地失败节点 + 3. 解除绑定记录 + 4. 删除远程僵尸节点 + 5. 重置所有剩余节点的 action 为 NONE + """ + pass +``` + +**操作步骤**: +1. 审查 `state_reset.py`,确保阶段1重置符合规范 +2. 审查 `_cleanup_create_failed_zombies()`,确保清理逻辑完整 +3. 添加详细的日志(清理了哪些节点,原因是什么) +4. 编写单元测试,验证重置和清理逻辑 + +**验收标准**: +- 阶段1重置字段完全符合文档表格 +- 阶段2清理逻辑不遗漏任何步骤 +- 每次重置/清理都有明确的日志 + +--- + +### 2.2 绑定记录持久性保证 + +**问题诊断**: +- [ ] 检查绑定记录是否真的"永久保留" +- [ ] 检查是否有意外修改绑定记录的代码 + +**重构任务**: + +#### Task 2.2.1: 绑定记录保护机制 +```python +# sync_system_new/common/binding.py +class BindingManager: + """ + 绑定记录持久性规则(持久化与人工介入规范 § 1.3): + + - 只能手工 bind/unbind + - 或 CREATE 失败自动清理 + - 其他情况绝不修改 + """ + + def bind(self, local_node_id: str, remote_node_id: str, manual: bool = False): + """ + 建立绑定记录 + + Args: + manual: 是否为手工绑定(用于审计日志) + """ + pass + + def unbind(self, node_id: str, manual: bool = False): + """解除绑定(只在手工或 CREATE 失败时调用)""" + pass +``` + +**操作步骤**: +1. 审查所有调用 `bind()/unbind()` 的地方 +2. 添加 `manual` 参数,区分手工和自动操作 +3. 添加审计日志(谁在何时为何修改了绑定) +4. 确保只有允许的场景才能修改绑定 + +**验收标准**: +- 绑定记录修改有完整的审计日志 +- 自动绑定只在 1:1 场景触发 +- CREATE 失败清理有明确的日志 + +--- + +## 第三阶段:日志与可观测性 + +### 3.1 结构化日志体系 + +**问题诊断**: +- [ ] 检查当前日志是否足够定位问题 +- [ ] 检查日志格式是否统一 +- [ ] 检查是否缺少关键操作的日志 + +**重构任务**: + +#### Task 3.1.1: 统一日志格式 +```python +# sync_system_new/common/logger.py (新建) +import logging +from typing import Optional, Dict, Any + +class SyncLogger: + """统一的结构化日志工具""" + + @staticmethod + def log_state_transition( + logger: logging.Logger, + node_type: str, + node_id: str, + from_status: str, + to_status: str, + reason: str, + extra: Optional[Dict[str, Any]] = None + ): + """状态转换日志""" + logger.info( + f"[{node_type}] State transition: {node_id} " + f"{from_status} -> {to_status} | Reason: {reason}", + extra=extra or {} + ) + + @staticmethod + def log_binding_operation( + logger: logging.Logger, + operation: str, # "bind", "unbind", "auto_bind" + local_node_id: str, + remote_node_id: Optional[str], + reason: str, + manual: bool = False + ): + """绑定操作日志""" + op_type = "MANUAL" if manual else "AUTO" + logger.info( + f"[{op_type}] Binding {operation}: " + f"local={local_node_id} <-> remote={remote_node_id} | {reason}" + ) + + @staticmethod + def log_sync_action( + logger: logging.Logger, + action: str, # "CREATE", "UPDATE", "DELETE" + node_type: str, + node_id: str, + data_id: str, + success: bool, + error: Optional[str] = None + ): + """同步操作日志""" + status = "SUCCESS" if success else "FAILED" + msg = f"[{node_type}] {action} {status}: node_id={node_id}, data_id={data_id}" + if error: + msg += f" | Error: {error}" + + if success: + logger.info(msg) + else: + logger.error(msg) + + @staticmethod + def log_dependency_error( + logger: logging.Logger, + node_type: str, + node_id: str, + dependency_errors: List[str] + ): + """依赖错误日志""" + logger.warning( + f"[{node_type}] DEPENDENCY_ERROR: {node_id} | " + f"Errors: {'; '.join(dependency_errors)}" + ) +``` + +**操作步骤**: +1. 创建 `logger.py`,定义结构化日志方法 +2. 在关键模块引入 `SyncLogger` +3. 替换所有 `logger.info/warning/error` 为结构化方法 +4. 添加日志级别配置(DEBUG/INFO/WARNING/ERROR) + +**验收标准**: +- 所有状态转换都有日志 +- 所有绑定操作都有日志 +- 所有同步操作(CREATE/UPDATE/DELETE)都有成功/失败日志 +- 日志格式统一,易于搜索和过滤 + +--- + +### 3.2 关键路径日志补充 + +**问题诊断**: +- [ ] bind() 阶段是否记录了每个判定步骤 +- [ ] create()/update() 是否记录了 ID 替换细节 +- [ ] cleanup 阶段是否记录了清理的节点 + +**重构任务**: + +#### Task 3.2.1: bind() 阶段日志强化 +```python +# sync_system_new/sync_system/strategy.py +class BaseSyncStrategy: + def bind(self): + # 1. 核心状态判定 + logger.debug(f"[{self.node_type}] Checking binding records...") + + # 2. 依赖检查 + logger.debug(f"[{self.node_type}] Checking dependencies for {node_id}...") + + # 3. 自动绑定尝试 + logger.info(f"[{self.node_type}] Auto-bind attempt: L_remain={L}, R_remain={R}") + + # 4. 状态转换 + SyncLogger.log_state_transition(...) +``` + +#### Task 3.2.2: create()/update() 日志强化 +```python +class BaseSyncStrategy: + def create(self): + # 1. 孤儿节点识别 + logger.info(f"[{self.node_type}] Found {len(orphans)} orphan nodes") + + # 2. ID 替换 + logger.debug(f"[{self.node_type}] Replacing IDs: {old_ids} -> {new_ids}") + + # 3. action 设置 + SyncLogger.log_state_transition(...) +``` + +**操作步骤**: +1. 在 `bind()` 的每个判定步骤添加日志 +2. 在 `create()/update()` 的关键操作添加日志 +3. 在 `_cleanup_create_failed_zombies()` 添加详细日志 +4. 设置合理的日志级别(DEBUG/INFO/WARNING) + +**验收标准**: +- 开启 DEBUG 日志时,可以完整追踪每个节点的处理过程 +- 生产环境只需 INFO 日志即可定位问题 +- 关键错误都有 ERROR 级别日志 + +--- + +### 3.3 sync_log 字段利用 + +**问题诊断**: +- [ ] 检查 `SyncNode.sync_log` 是否被使用 +- [ ] 检查是否记录了完整的处理历史 + +**重构任务**: + +#### Task 3.3.1: sync_log 结构定义 +```python +# sync_system_new/common/sync_node.py +class SyncNode: + """ + sync_log 格式: + [ + { + "timestamp": "2025-01-15T10:30:00", + "phase": "bind", + "from_status": "UNCHECKED", + "to_status": "NORMAL", + "reason": "Found binding record", + "details": {} + }, + { + "timestamp": "2025-01-15T10:30:05", + "phase": "update", + "action": "UPDATE", + "reason": "Data diff detected", + "details": {"changed_fields": ["name", "amount"]} + } + ] + """ + + def append_log(self, phase: str, action: str, reason: str, details: Optional[Dict] = None): + """向 sync_log 添加记录""" + pass +``` + +**操作步骤**: +1. 定义 `sync_log` 的 JSON 结构 +2. 在每个阶段(bind/create/update/sync)添加日志记录 +3. 持久化 `sync_log`,用于审计和调试 +4. 提供查询接口,筛选特定类型的日志 + +**验收标准**: +- 每个节点的 `sync_log` 记录了完整的处理历史 +- 可以通过 `sync_log` 回溯任何状态变化 +- 失败节点的 `sync_log` 包含详细的错误信息 + +--- + +## 第四阶段:代码质量与结构优化 + +### 4.1 代码重复消除 + +**问题诊断**: +- [ ] 搜索重复的业务键提取逻辑 +- [ ] 搜索重复的 ID 解析逻辑 +- [ ] 搜索重复的数据校验逻辑 + +**重构任务**: + +#### Task 4.1.1: 业务键处理统一 +```python +# sync_system_new/sync_system/biz_key.py (新建) +class BizKeyExtractor: + """业务键提取与处理""" + + @staticmethod + def extract_from_data( + data: Dict[str, Any], + fields: List[str] + ) -> Optional[Dict[str, Any]]: + """从数据中提取业务键""" + pass + + @staticmethod + def to_tuple(biz_key: Dict[str, Any]) -> tuple: + """转换为可哈希的 tuple""" + pass + + @staticmethod + def is_complete(biz_key: Dict[str, Any]) -> bool: + """检查业务键是否完整(无空值)""" + pass +``` + +**操作步骤**: +1. 创建 `biz_key.py`,集中业务键处理逻辑 +2. 从各个 Strategy 中提取重复代码 +3. 统一业务键的提取、验证、比较逻辑 +4. 添加单元测试 + +**验收标准**: +- 业务键处理逻辑在一个文件中 +- 各 Strategy 调用统一的工具方法 +- 代码行数减少 20% 以上 + +--- + +### 4.2 错误处理统一 + +**问题诊断**: +- [ ] 检查是否有裸露的 try-except +- [ ] 检查异常类型是否明确 +- [ ] 检查错误信息是否包含足够的上下文 + +**重构任务**: + +#### Task 4.2.1: 自定义异常体系 +```python +# sync_system_new/common/exceptions.py (新建) +class SyncSystemException(Exception): + """同步系统基础异常""" + pass + +class StateTransitionError(SyncSystemException): + """非法状态转换""" + def __init__(self, from_status, to_status, reason): + self.from_status = from_status + self.to_status = to_status + super().__init__( + f"Illegal state transition: {from_status} -> {to_status} | {reason}" + ) + +class DependencyError(SyncSystemException): + """依赖错误""" + def __init__(self, node_id, dependency_errors): + self.node_id = node_id + self.dependency_errors = dependency_errors + super().__init__( + f"Dependency error for {node_id}: {'; '.join(dependency_errors)}" + ) + +class DataValidationError(SyncSystemException): + """数据校验错误""" + pass + +class BindingConflictError(SyncSystemException): + """绑定冲突(如 N:N)""" + pass +``` + +**操作步骤**: +1. 创建 `exceptions.py`,定义异常类型 +2. 替换通用异常为自定义异常 +3. 在异常中包含足够的上下文信息 +4. 在顶层捕获并记录异常 + +**验收标准**: +- 所有业务异常都是 `SyncSystemException` 的子类 +- 异常信息包含 node_id、node_type 等上下文 +- 顶层有统一的异常处理和日志记录 + +--- + +### 4.3 类型注解完善 + +**问题诊断**: +- [ ] 检查是否所有方法都有类型注解 +- [ ] 检查返回值是否都有明确类型 +- [ ] 运行 mypy 检查类型错误 + +**重构任务**: + +#### Task 4.3.1: 类型注解审查 +```bash +# 运行 mypy 检查 +mypy sync_system_new/ --strict +``` + +**操作步骤**: +1. 为所有公共方法添加类型注解 +2. 为复杂的返回值定义 TypedDict 或 Pydantic 模型 +3. 修复 mypy 报告的类型错误 +4. 添加 mypy 到 CI/CD 流程 + +**验收标准**: +- mypy 检查通过(允许少量 type: ignore) +- 所有公共 API 都有完整的类型注解 +- IDE 可以提供准确的类型提示 + +--- + +### 4.4 文档字符串完善 + +**问题诊断**: +- [ ] 检查关键类/方法是否有 docstring +- [ ] 检查 docstring 是否符合 Google/Numpy 风格 + +**重构任务**: + +#### Task 4.4.1: Docstring 补充 +```python +class BaseSyncStrategy: + """ + 同步策略基类。 + + 职责: + 1. bind(): 判定 binding_status + 2. create(): 处理孤儿节点 + 3. update(): 处理差异节点 + 4. pre_sync_check() / post_sync_check(): 状态验证 + + 子类使用示例: + ```python + class ProjectStrategy(DefaultSyncStrategy): + default_config = StrategyConfig( + auto_bind_fields=["code"], + local_orphan_action=OrphanAction.CREATE_REMOTE + ) + schema = ProjectResponse + ``` + + 参考文档: + - 架构分层设计.md § 3 + - 状态定义规范.md § 1-4 + """ + + def bind(self): + """ + 判定绑定状态。 + + 执行步骤: + 1. 核心状态判定(状态定义规范 § 1) + 2. 依赖检查(状态定义规范 § 2) + 3. 自动绑定尝试(状态定义规范 § 3) + + 状态转换: + - UNCHECKED -> NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR + + Raises: + DependencyError: 依赖节点未就绪 + BindingConflictError: 出现 N:N 绑定冲突 + """ + pass +``` + +**操作步骤**: +1. 为所有公共类添加类级别 docstring +2. 为所有公共方法添加方法级别 docstring +3. 在 docstring 中引用相关文档章节 +4. 添加使用示例和注意事项 + +**验收标准**: +- 核心类(SyncNode, BaseSyncStrategy, FullSyncPipeline 等)都有完整的 docstring +- 关键方法都有参数说明、返回值说明、异常说明 +- 文档引用链接正确 + +--- + +## 第五阶段:测试覆盖与 pytest 修复 + +### 5.1 单元测试强化 + +**问题诊断**: +- [ ] 运行 pytest,检查失败的测试 +- [ ] 检查测试覆盖率(目标 >80%) + +**重构任务**: + +#### Task 5.1.1: 修复现有测试 +```bash +# 运行测试并查看失败原因 +pytest sync_system_new/tests/ -v --tb=short + +# 检查覆盖率 +pytest sync_system_new/tests/ --cov=sync_system_new --cov-report=html +``` + +**操作步骤**: +1. 运行 pytest,逐个修复失败的测试 +2. 更新测试用例,匹配重构后的代码 +3. 添加缺失的测试(特别是状态转换、绑定逻辑) +4. 确保测试覆盖所有关键路径 + +**验收标准**: +- 所有测试通过 +- 核心模块测试覆盖率 >80% +- 关键逻辑(状态判定、依赖检查、自动绑定)有完整的单元测试 + +--- + +### 5.2 集成测试补充 + +**问题诊断**: +- [ ] 检查是否有端到端的集成测试 +- [ ] 检查集成测试是否覆盖主要场景 + +**重构任务**: + +#### Task 5.2.1: 端到端测试场景 +```python +# tests/integration/test_full_workflow.py +async def test_full_sync_workflow(): + """ + 完整同步流程测试: + 1. 加载 JSONL 数据 + 2. 执行策略(bind/create/update) + 3. 推送到 API + 4. 验证结果 + """ + pass + +async def test_create_failed_recovery(): + """ + CREATE 失败恢复测试: + 1. 模拟 CREATE 失败 + 2. 下次同步自动清理僵尸节点 + 3. 重新尝试 CREATE + """ + pass + +async def test_dependency_blocking(): + """ + 依赖阻断测试: + 1. 父节点 CREATE 失败 + 2. 子节点标记为 DEPENDENCY_ERROR + 3. 修复父节点后,子节点自动恢复 + """ + pass +``` + +**操作步骤**: +1. 创建 `tests/integration/` 目录 +2. 编写端到端集成测试 +3. 使用真实的 JSONL 数据和 Mock API +4. 验证关键场景(自动绑定、CREATE 失败恢复、依赖阻断) + +**验收标准**: +- 有至少 5 个集成测试场景 +- 集成测试覆盖主要业务流程 +- 集成测试可以在 CI/CD 中自动运行 + +--- + +## 第六阶段:文档与代码对齐 + +### 6.1 文档与代码对齐检查 + +**问题诊断**: +- [ ] 逐个对照文档,检查代码实现是否一致 +- [ ] 检查文档中的示例代码是否可运行 + +**重构任务**: + +#### Task 6.1.1: 对齐检查清单 + +| 文档章节 | 代码位置 | 对齐状态 | 备注 | +|---------|---------|---------|------| +| 架构分层设计 § 2 | common/sync_node.py | ✅ | SyncNode 定义 | +| 架构分层设计 § 3 | sync_system/strategy.py | ⚠️ | 需补充 ID 替换逻辑 | +| 状态定义规范 § 1 | sync_system/binding_matrix.py | ❌ | 需新建 | +| 状态定义规范 § 2 | sync_system/dependency_checker.py | ⚠️ | 需强化 | +| 状态定义规范 § 3 | sync_system/auto_binder.py | ❌ | 需新建 | +| 编排流程规范 | pipeline/full_sync_pipeline.py | ✅ | 流程正确 | +| 持久化与人工介入规范 § 1.2 | common/state_reset.py | ✅ | 阶段1/2 重置 | + +**操作步骤**: +1. 创建对齐检查表 +2. 逐个章节对照代码 +3. 标记不一致的地方 +4. 更新代码或文档,确保一致 + +**验收标准**: +- 所有文档章节都有对应的代码实现 +- 代码实现严格遵循文档规范 +- 文档示例代码可以直接运行 + +--- + +### 6.2 文档更新 + +**问题诊断**: +- [ ] 检查重构后的代码是否需要更新文档 +- [ ] 检查是否有新增的设计决策需要文档化 + +**重构任务**: + +#### Task 6.2.1: 文档更新清单 +- [ ] 更新 `架构分层设计.md`,补充新模块说明 +- [ ] 更新 `状态定义规范.md`,补充状态转换图 +- [ ] 创建 `日志规范.md`,说明日志格式和级别 +- [ ] 创建 `异常处理规范.md`,说明异常类型和处理 +- [ ] 更新 `README.md`,补充使用示例 + +**操作步骤**: +1. 根据重构内容,识别需要更新的文档 +2. 更新或创建文档 +3. 添加架构图和流程图(使用 Mermaid) +4. 添加代码示例和最佳实践 + +**验收标准**: +- 文档完整覆盖重构后的架构 +- 文档包含清晰的架构图和流程图 +- 文档包含可运行的示例代码 + +--- + +## 执行计划与优先级 + +### 优先级定义 + +- **P0 (关键)**:影响正确性,必须立即修复 +- **P1 (高)**:影响可维护性,应尽快完成 +- **P2 (中)**:改善代码质量,可以分批完成 +- **P3 (低)**:锦上添花,时间允许时完成 + +### 阶段划分 + +| 阶段 | 优先级 | 预计工时 | 依赖关系 | +|------|--------|---------|---------| +| 第一阶段:核心状态机强化 | P0 | 3-4 天 | 无 | +| 第二阶段:持久化与状态重置 | P0 | 1-2 天 | 第一阶段 | +| 第三阶段:日志与可观测性 | P1 | 2-3 天 | 第一、二阶段 | +| 第四阶段:代码质量优化 | P2 | 2-3 天 | 第一阶段 | +| 第五阶段:测试覆盖 | P1 | 2-3 天 | 第一、二阶段 | +| 第六阶段:文档对齐 | P2 | 1-2 天 | 所有阶段 | + +### 建议执行顺序(3天计划) + +**Day 1**: +1. 完成第一阶段(状态机强化)- P0 +2. 完成第二阶段(持久化审查)- P0 + +**Day 2**: +3. 完成第三阶段(日志强化)- P1 +4. 完成第五阶段(pytest 修复)- P1 + +**Day 3**: +5. 完成第四阶段(代码优化)- P2 +6. 完成第六阶段(文档对齐)- P2 +7. 全面回归测试 + +--- + +## 验收标准 + +### 代码质量指标 + +- [ ] **pytest 通过率**: 100% +- [ ] **测试覆盖率**: 核心模块 >80% +- [ ] **mypy 类型检查**: 通过(允许 <10 个 type: ignore) +- [ ] **代码重复率**: <5% (使用 pylint 检查) +- [ ] **文档覆盖率**: 所有公共 API 都有 docstring + +### 功能完整性 + +- [ ] 所有业务类型可以从零推送 +- [ ] CREATE 失败自动恢复 +- [ ] 依赖阻断正确工作 +- [ ] 自动绑定只在 1:1 场景触发 +- [ ] 手工绑定永不自动修改 + +### 可观测性 + +- [ ] 每个节点都有完整的 sync_log +- [ ] 关键操作都有结构化日志 +- [ ] 错误信息包含足够的上下文 +- [ ] 可以通过日志快速定位问题 + +### 文档一致性 + +- [ ] 代码实现与文档规范一致 +- [ ] 文档示例代码可运行 +- [ ] 架构图和流程图准确 + +--- + +## 附录:重构检查清单 + +### 状态机检查 + +- [ ] 状态转换是否经过 `StateMachine` 验证 +- [ ] 每次转换是否都有日志 +- [ ] 是否有非法的状态路径 + +### 绑定逻辑检查 + +- [ ] 核心判定表是否实现(状态定义规范 § 1) +- [ ] 依赖检查是否完整(状态定义规范 § 2) +- [ ] 自动绑定是否只在 1:1 场景触发(状态定义规范 § 3) +- [ ] DEPENDENCY_ERROR 格式是否符合规范 + +### 持久化检查 + +- [ ] depend_ids 是否不持久化 ✅ +- [ ] 阶段1重置是否正确 +- [ ] 阶段2清理是否完整 +- [ ] 绑定记录是否永久保留 + +### 日志检查 + +- [ ] 是否使用结构化日志 +- [ ] 关键操作是否都有日志 +- [ ] 日志级别是否合理 +- [ ] sync_log 是否记录完整历史 + +### 错误处理检查 + +- [ ] 是否使用自定义异常 +- [ ] 异常信息是否包含上下文 +- [ ] 是否有顶层异常处理 +- [ ] 错误是否正确传播 + +### 代码质量检查 + +- [ ] 是否有重复代码 +- [ ] 是否有明确的类型注解 +- [ ] 是否有完整的 docstring +- [ ] 是否通过 mypy 检查 + +--- + +## 总结 + +本重构提纲基于以下文档制定: + +1. **架构分层设计.md** - 四层架构模型 +2. **状态定义规范.md** - 状态机逻辑 +3. **编排流程规范.md** - Pipeline 流程 +4. **持久化与人工介入规范.md** - 持久化和重置规则 +5. **业务流程与依赖关系.md** - 业务实体依赖 + +**核心目标**: +- 删繁就简:消除重复,提取公共逻辑 +- 状态机强化:严格遵循状态定义规范 +- 日志完善:结构化日志,完整的 sync_log +- 持久化规范:阶段1/2 重置,绑定记录保护 +- 代码质量:类型安全,错误处理,文档完善 + +**关键原则**: +- 以文档为准,代码严格遵循规范 +- 类型安全优先,充分利用 Python 类型系统 +- 可观测性优先,完善的日志和错误信息 +- 单一职责,每个模块只做一件事 +- 可测试性,易于编写和维护测试 + +按照此提纲逐步执行,可以系统性地提升代码质量,同时保持与文档的一致性。 diff --git a/docs/archive/docs/持久化与人工介入规范.md b/docs/archive/docs/持久化与人工介入规范.md new file mode 100644 index 0000000..e551f21 --- /dev/null +++ b/docs/archive/docs/持久化与人工介入规范.md @@ -0,0 +1,152 @@ +# 节点状态持久化与人工介入规范 + +> **代码实现**:`sync_system_new/common/state_reset.py` + +--- + +## 1. 持久化规则 + +### 1.1 持久化目标 + +| 目标 | 说明 | +|------|------| +| **可恢复性** | 系统重启后能从上次状态继续 | +| **可观测性** | 失败和异常状态要保留,供人工查看 | +| **可追溯性** | 失败信息持久化,不自动重试,需人工确认 | +| **绑定稳定性** | 手工绑定一旦建立,永不自动改变 | + +### 1.2 分阶段重置设计 + +状态重置分为两个阶段执行: + +#### 阶段1:加载时重置(Collection.load_from_persistence) + +| 字段 | 性质 | 持久化 | 阶段1重置 | +|------|------|--------|-----------| +| `node_id` | 恒定标识 | ✅ 必须 | ❌ 不重置 | +| `data_id` | 业务主键 | ✅ 必须 | ❌ 不重置 | +| `data` | 业务数据 | ✅ 必须 | ✅ **重置**(每次重新取数) | +| `origin_data` | 原始快照 | ✅ 必须 | ✅ **重置**(每次重新取数) | +| `depend_ids` | 依赖列表 | ❌ **不持久化** | ✅ **初始化为[]**(bind 阶段从 data 实时计算) | +| `binding_status` | 绑定状态 | ✅ 必须 | ✅ **重置为 UNCHECKED** | +| `action` | 同步意图 | ✅ 保存 | ❌ **保留**(用于阶段2判断) | +| `status` | 执行状态 | ✅ 保存 | ❌ **保留**(全部保留,不重置) | +| `error` | 错误信息 | ✅ 保存 | ✅ **重置为None**(清空上次错误) | +| `context` | 扩展上下文 | ✅ 保存 | ❌ 不重置 | + +#### 阶段2:数据加载后清理(Pipeline._cleanup_create_failed_zombies) + +在数据加载完成后、策略执行前,执行CREATE失败节点清理: + +1. **检查条件**: + - 本地节点 `action == CREATE`(上次尝试创建) + - 本地节点 `status == FAILED`(创建失败) + +2. **清理动作**: + - **删除本地失败节点**(从 collection 中移除) + - 如果有绑定记录: + - 解除绑定关系 + - 删除远程 collection 中的僵尸节点 + +3. **最后重置 action**: + - 所有剩余节点的 `action` 重置为 NONE + - 准备进入策略阶段 + +4. **下次同步的自动恢复**: + - 被删除的节点会从数据源重新加载 + - 如果远程实际已创建成功(网络波动导致未获取到结果)→ 绑定阶段会自动绑定上 + - 如果远程实际也失败了 → 重新尝试创建 + +5. **UPDATE 阶段保护**: + - UPDATE 操作会跳过所有 `status == FAILED` 的节点 + - 防止 UPDATE 阶段覆盖 CREATE/UPDATE 失败的状态和错误信息 + - 确保失败节点的 action 和 error 信息保持不变,直到下次同步清理 + +> **说明**: +> - `data` / `origin_data`:每次运行从数据源重新获取,保证数据最新 +> - `depend_ids`:**不持久化**,每次 bind 阶段从 data 的业务字段(如 contract_id, project_id)实时提取 +> - `binding_status`:持久化用于审计,加载时重置为 `UNCHECKED`,由 bind() 重新判定 +> - `error`:**阶段1清空**,避免上次错误影响本次运行,新错误会在各阶段重新生成 +> - `action`:**阶段1保留**用于识别 CREATE 失败的节点,**阶段2清理后重置** +> - `status`:**阶段1全部保留**(包括 FAILED、PRECONDITION_FAILED 等),不自动重置 +> - **CREATE 失败节点会被自动删除并重新加载**,UPDATE/DELETE 失败保留需人工处理 +> - **UPDATE 操作会跳过 FAILED 节点**,避免覆盖失败状态和错误信息 + +### 1.3 绑定记录 vs binding_status + +| 概念 | 存储位置 | 持久性 | 如何改变 | +|------|---------|--------|---------| +| **绑定记录** | `bindings` 表 | **永久保留** | 只能手工 bind/unbind,或 CREATE 失败自动清理 | +| **binding_status** | `nodes` 表 | 保存但可重判 | 每次 bind() 重新判定 | + +### 1.4 CREATE 失败的自动恢复 + +当 CREATE 操作失败时,会产生"僵尸绑定": +- 绑定记录已建立(local_id → remote_node_id) +- 但远程节点的 `data_id` 为空(API 未返回真实 ID) + +**下次同步时的自动恢复流程**: +1. 阶段1加载:保留 `action=CREATE` +2. 阶段2清理:检测到僵尸绑定,自动清理 +3. 本地节点恢复为 MISSING 状态 +4. 策略阶段重新判定,再次尝试 CREATE + +--- + +## 2. 人工介入规范 + +### 2.1 介入时机 + +| 时机 | 场景 | 操作 | +|------|------|------| +| **运行前** | 查看上次失败记录 | 查看持久化的 error,决定是否修复后重试 | +| **bind() 后** | 出现 ABNORMAL/WARNING | 检查数据一致性,手工修复或确认 | +| **bind() 后** | 1:N / N:N 映射 | 手工绑定指定远程记录 | +| **sync() 后** | 批量失败 | 分析失败原因,决定重试策略 | + +### 2.2 binding_status 与介入需求 + +| binding_status | 含义 | 需要介入 | 说明 | +|----------------|------|---------|------| +| `UNCHECKED` | 未检查 | ❌ | 等待 bind() 判定 | +| `NORMAL` | 绑定正常 | ❌ | 自动处理 | +| `MISSING` | 无绑定记录 | ❌ | 自动创建 | +| `WARNING` | 本地有绑定但远程无数据 | ⚠️ 可选 | 可能是远程删除,需确认 | +| `ABNORMAL` | 状态不一致 | ✅ **必须** | 需人工排查 | +| `DEPENDENCY_ERROR` | 依赖未就绪 | ❌ | 等依赖解决后自动重试 | + +### 2.3 人工绑定操作 + +```python +# 手工绑定(1:N 场景) +binding_manager.bind(node_id="local_xxx", data_id="remote_xxx") + +# 手工解绑 +binding_manager.unbind(node_id="local_xxx") +``` + +绑定记录一旦建立,永不自动改变,只能手工操作。 + +### 2.4 职责分工 + +| 职责 | 系统自动 | 人工介入 | +|------|---------|---------| +| 1:1 自动绑定 | ✅ | - | +| 1:N / N:N 绑定 | ❌ | ✅ | +| NORMAL 节点同步 | ✅ | - | +| MISSING 节点创建 | ✅ | - | +| CREATE 失败重试 | ✅(自动清理僵尸) | ⚠️(需确认后手动重置) | +| UPDATE 失败重试 | ❌(保留FAILED状态) | ✅(需确认后手动重置) | +| ABNORMAL 处理 | ❌ | ✅ | +| WARNING 确认 | ❌ | ✅(可选) | + +--- + +## 3. 总结 + +1. **分阶段重置**: + - 阶段1(加载时):只重置 binding_status,**保留 action/status/error** + - 阶段2(数据加载后):清理 CREATE 失败僵尸,然后重置 action +2. **失败状态持久化**:FAILED 状态和 error 信息保留,不自动重试 +3. **绑定记录**:永久保留,除非 CREATE 失败自动清理或手工操作 +4. **人工介入**:失败需确认后手动重置,ABNORMAL/WARNING 需人工处理,1:N 绑定需手工指定 diff --git a/docs/archive/docs/架构分层设计.md b/docs/archive/docs/架构分层设计.md new file mode 100644 index 0000000..9fd8728 --- /dev/null +++ b/docs/archive/docs/架构分层设计.md @@ -0,0 +1,112 @@ +# 架构分层设计:四层模型 + +本架构旨在将同步系统的**数据容器**、**同步逻辑**、**执行层**与**编排流程**完全解耦,提供极简且类型安全的开发体验。 + +--- + +## 1. 架构概览 + +系统分为四层,依赖关系严格从上到下: + +1. **通用层 (Common)**: 定义纯数据结构(Data Container)和基础工具。 +2. **同步系统层 (Sync System)**: 定义同步行为接口(SyncStrategy)与业务规则。 +3. **数据源层 (DataSource)**: 实现数据的加载与持久化,属于盲目执行层。 +4. **编排层 (Pipeline)**: 应用层逻辑,硬编码同步顺序,协调 ID 映射与错误传播。 + +--- + +## 2. 通用层 (Layer 0: Common) + +本层不包含业务逻辑,仅定义数据契约。 + +- **SyncNode[T]**: 核心状态机容器。 + - `origin_data`: 原始数据(对应 `data_id`)。 + - `data`: 计算后的最新目标数据。 + - `data_id`: 业务主键ID。加载时必定有值,CREATE 节点初始为空字符串 `""`(布尔值为 False,可通过校验)。 + - `action`: 同步意图 (NONE, CREATE, UPDATE, DELETE)。 + - `status`: 执行状态 (PENDING, IN_PROGRESS, SUCCESS, FAILED, SKIPPED, PRECONDITION_FAILED)。 + - 详见 [状态定义规范 § 5.A](./状态定义规范.md#5-执行同步状态转换-physical-sync-state-transitions) + - `binding_status`: 绑定状态 (UNCHECKED, NORMAL, MISSING, DEPENDENCY_ERROR, ABNORMAL, WARNING)。 + - 详见 [状态定义规范 § 1](./状态定义规范.md#1-核心状态判定表-core-binding-matrix) + - `error`: 异常详情。 +- **DataCollection**: 节点的集合,提供类型安全的查询和过滤方法。 +- **BindingManager**: + - **ID 映射**: 维护 `local_node_id` <-> `remote_node_id` 的双向映射。 + - **绑定键**: 使用 `node_id` 作为绑定记录的键,**一致不变**。CREATE 成功后只更新节点的 `data_id`,绑定记录不变。 + - **持久化**: 将映射关系持久化到存储(如 JSON/数据库)。 +- **Enums**: `SyncAction`, `SyncStatus`, `BindingStatus` 等。 + +--- + +## 3. 同步系统层 (Layer 1: Sync System) + +核心业务逻辑层。通过实现 `SyncStrategy` 接口来定义特定实体的同步逻辑。 + +- **SyncStrategy[T] 接口**: + - `bind()`: + - 职责:判定 `binding_status` (NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR) + - 详见 [状态定义规范 § 1-3](./状态定义规范.md) + - `create()`: + - 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置 `action=CREATE` + - **ID 替换**: 创建新节点时,复制数据并将依赖字段的本地 ID 替换为远程 ID + - **内联检查**: 通过 `IDResolver.resolve_and_validate()` 验证依赖 ID 解析 + - 详见 [状态定义规范 § 4.C](./状态定义规范.md) + - `update()`: + - 职责:处理差异节点(NORMAL 且有 diff),设置 `action=UPDATE` + - **ID 替换**: 准备更新数据时,替换数据中的依赖 ID + - **内联检查**: 验证目标节点 data_id 完整性,失败则设置 `PRECONDITION_FAILED` + - **FAILED 保护**: 自动跳过 `status=FAILED` 的节点 + - 详见 [状态定义规范 § 4.A](./状态定义规范.md) +--- + +## 4. 数据源层 (Layer 2: DataSource) + +作为各个后端的适配器,负责数据加载与持久化。 + +- **职责**: + - `load_nodes(node_type)`: 从后端加载并返回 `SyncNode` 集合,自动添加到 `DataCollection`。 + - `save_nodes(nodes)`: + - 遍历节点,仅处理 `status == PENDING` 且 `action != NONE` 的节点。 + - 根据 `action` 执行相应的 CREATE/UPDATE/DELETE 操作。 + - 执行成功后,更新节点的 `status` 和相关信息(如新生成的 remote_id)。 + +--- + +## 5. 编排层 (Layer 3: Pipeline) + +最高层级,负责流程编排。 + +- **职责**: + - **显式顺序**: 直接在代码中按顺序调用同步逻辑(例如:先同步项目,再同步合同)。 + - **故障传播**: 若前置实体某节点同步失败(`FAILED`),编排器在处理后续依赖节点时可将其标记为 `DEPENDENCY_ERROR`。 + - **生命周期管理**: 初始化 `BindingManager` 和 `DataCollection`,同步结束后调用持久化方法。 + +--- + +## 6. ID 映射与对齐:核心流程 + +为了解决本地数据引用本地 ID 与远程数据引用远程 ID 的冲突,系统采用以下映射逻辑: + +### 绑定阶段 (Binding) +- **时机**: `Strategy.bind` +- **目标**: 在 `BindingManager` 中确定 local_id ↔ remote_id 映射 +- **手段**: 业务键匹配(如 Code 匹配)、历史记录恢复等 + +### 执行阶段 (Execution) +- **时机**: `Strategy.create()` / `Strategy.update()` 阶段 +- **目标**: 在创建新节点或准备更新时,将依赖字段的本地 ID 替换为远程 ID +- **手段**: + - `create()`: 创建对方节点时,复制数据并替换所有依赖 ID + - `update()`: 准备更新数据时,替换数据中的依赖 ID +- **验证**: `_pre_commit_check` 在 create/update 最后检查,确保所有依赖节点都已有远程 ID + +**注意**: ID 替换在 Strategy 的 create/update 阶段完成,DataSource 只负责盲目执行已准备好的数据。 + +--- + +## 7. 关键设计原则 + +- **删除类型依赖配置**: 依赖关系通过 `Pipeline` 中的代码调用顺序自然表达。 +- **无状态 DataSource**: 数据源不了解绑定逻辑,只看到 `action`、`status` 和 `binding_status`。 +- **BindingManager 为核心**: 负责 ID 空间映射和持久化。 +- **配置驱动**: 通过 `StrategyConfig` 和预设配置(ConfigPresets)灵活控制同步行为。 diff --git a/docs/archive/docs/状态定义规范.md b/docs/archive/docs/状态定义规范.md new file mode 100644 index 0000000..bcc5efc --- /dev/null +++ b/docs/archive/docs/状态定义规范.md @@ -0,0 +1,342 @@ +# 同步系统状态定义 (Final Spec) + +本文档定义了同步系统的状态机逻辑。逻辑流转遵循以下顺序: +1. **核心状态判定** (Core State) +2. **依赖检查与ID解析** (Dependency) +3. **自动绑定/发现** (Discovery) +4. **策略执行** (Action) + +--- + +## 0. 绑定状态枚举 (BindingStatus) + +| 状态值 | 含义 | 来源 | 允许创建 | +| :--- | :--- | :--- | :---: | +| **UNCHECKED** | 未执行绑定检查 | 加载后的初始状态 | ❌ | +| **NORMAL** | 绑定正常 | 核心状态判定 | ❌ | +| **MISSING** | 无绑定记录(孤儿) | 核心状态判定 | ✅ | +| **WARNING** | 业务键不完整 | 自动绑定阶段 | ❌ | +| **ABNORMAL** | 数据损坏 | 核心状态判定 | ❌ | +| **DEPENDENCY_ERROR** | 依赖未就绪 | 依赖检查或自动绑定 | ❌ | + +**关键原则**: +- **UNCHECKED 阻止创建**:加载后节点状态为 UNCHECKED,只有执行了 `bind()` 后才会转为其他状态 +- **只有 MISSING 状态才能触发 CREATE**:`create()` 方法只查找 `binding_status == MISSING` 的节点 +- **如果 bind() 被跳过**(如 skip_sync=True),节点保持 UNCHECKED,不会被创建 + +--- + +## 1. 核心状态判定表 (Core Binding Matrix) + +**说明**: +* **Binding Record Pair**: 数据库中的绑定记录 (必须成对出现,已排除单边绑定)。 +* **Data Valid**: 指数据是否可读、Schema校验是否通过。 +* **Warning vs Abnormal**: + * `ABNORMAL`: 自身数据损坏。 + * `WARNING`: 自身健康,但因为对方损坏导致**连接不可用**。 + +| Bind Pair (Record) | Local Data (Valid?) | Remote Data (Valid?) | -> | **Local Status** | **Remote Status** | **说明** | +| :---: | :---: | :---: | :--- | :--- | :--- | :--- | +| **YES** | **YES** | **YES** | -> | **NORMAL** | **NORMAL** | **稳态**。链路完整,数据健康,可进行 Diff/Update。 | +| **YES** | **YES** | **NO** | -> | **WARNING** | **ABNORMAL** | **远程损坏**。本地虽好,但链路已断 (Link Degraded)。禁止同步。 | +| **YES** | **NO** | **YES** | -> | **ABNORMAL** | **WARNING** | **本地损坏**。远程虽好,但链路已断。禁止同步。 | +| **YES** | **NO** | **NO** | -> | **ABNORMAL** | **ABNORMAL** | **双向损坏**。 | +| **NO** | **YES** | N/A | -> | **MISSING** | N/A | **本地孤儿**。进入“依赖与发现”流程。 | +| **NO** | N/A | **YES** | -> | N/A | **MISSING** | **远程孤儿**。进入“依赖与发现”流程。 | + +--- + +## 2. 依赖与业务键解析 (Dependency & ID Resolution) + +**适用范围**: 所有涉及外键依赖 (Foreign Key) 的节点。 +**前置条件**: 核心状态 = `MISSING` (准备进行自动绑定或新建)。 + +在进行 `Auto-Bind` 或 `Create` 之前,必须先尝试构建**远程业务键**。 +例如:本地 `Contract(proj_id="P1", code="C01")` 想找远程对象,必须先查询 `P1` 对应的远程 ID `RP_99`,转换成 `(RP_99, "C01")` 才能去远程搜索。 + +| 依赖项 (Dependency) | 依赖项绑定状态 | -> | **能否构建业务键** | **节点状态** | **说明** | +| :--- | :--- | :--- | :--- | :--- | :--- | +| **无依赖** | N/A | -> | ✅ Yes | **MISSING** | 根节点 (如 Project),直接进入下一阶段。 | +| **有依赖** | **NORMAL** 且 `data_id` 非空(`status` 任意) | -> | ✅ Yes | **MISSING** | 依赖项已获得远程ID,可进入下一阶段。 | +| **有依赖** | **NORMAL** 且 `data_id` 为空("",含 `status = FAILED`) | -> | ❌ No | **DEPENDENCY_ERROR** | 依赖项未回填ID,阻断绑定与同步。 | +| **有依赖** | **MISSING / ABNORMAL** | -> | ❌ No | **DEPENDENCY_ERROR** | **依赖阻断**。父节点未同步或损坏,无法计算远程键,无法绑定,无法创建。 | +| **有依赖** | **WARNING** | -> | ❌ No | **DEPENDENCY_ERROR** | 父节点状态不确定(如连接降级),禁止基于此建立新关系。 | + +> **处理策略**: 处于 `DEPENDENCY_ERROR` 状态的节点,其动作强制为 **SKIP** (或 PENDING)。必须先修复父节点。 +> +> **错误信息格式**: `DEPENDENCY_ERROR` 节点的 `error` 字段会包含详细的依赖失败信息: +> - `dep_err: not_found: field_name(node_type)=value` - 依赖节点未找到 +> - `dep_err: field_name: status=FAILED` - 依赖节点状态为 FAILED +> - 多个依赖失败时用分号分隔:`dep_err: not_found: project_id(project)=P1; contract_id: status=FAILED` + +--- + +## 3. 自动绑定状态处理 (Auto-Binding State Handling) + +此逻辑遵循“去噪后 1:1”原则:只有在排除掉所有健康同步对后,若剩余节点形成绝对的 1:1 关系,才允许自动绑定。 + +**配置说明与触发机制**: +- **初始化场景**: 通常在系统第一次初始化或首次接入新实体时,配置 `auto_bind = True` 来对齐历史数据。 +- **后续同步**: 系统在日常同步中不建议开启全局自动绑定。自动绑定仅作为“发现”手段,一旦建立过关系的节点,其后续绑定操作通常仅在“自动创建”逻辑中伴随产生(详见第 4 节孤儿处理)。 +- **执行前提**: 只有当节点状态为 `MISSING` 且依赖解析成功(`DEPENDENCY_ERROR = False`)时,才会尝试以下探测逻辑。 +- **业务键完整性**: 若业务键字段缺失(如 `serial_number = null`),直接标记 `binding_status = WARNING`,并在 `node.error` 记录原因(`Auto-bind skipped: missing fields ...`),不参与自动绑定与孤儿创建判定。- **ID字段解析失败**: 若业务键包含ID字段(如 `supplier_id`)且依赖节点未绑定,ID解析失败,标记 `binding_status = DEPENDENCY_ERROR`,阻止孤儿创建。 +**核心算法**: +1. **全集搜索**: 寻找本地/远端所有共享同一个业务键(Business Key)的记录。 +2. **排除稳态对**: 识别并移除**成对且互绑**的 `NORMAL` 记录。 + - 只有当本地 A 与远端 B 互为绑定对象,且状态皆为 `NORMAL` 时,才将这一对记录从待判定集合中剔除。 + - 若出现单边 `NORMAL` 记录(即其配对项不在本次搜索范围内或状态不属于另一端的 `NORMAL`),则不予剔除,视为环境污染项。 +3. **判定剩余**: 检查排除上述稳态对后的剩余集合(包含 `MISSING`, `ABNORMAL`, `WARNING` 及单边已占用的 `NORMAL` 记录)。 + +> **术语**: +> - `L_remain` = 本地记录中,排除“成对稳态”后剩余的数量。 +> - `R_remain` = 远端记录中,排除“成对稳态”后剩余的数量。 + +| `L_remain` | `R_remain` | -> | **动作** | **说明** | +| :---: | :---: | :--- | :--- | :--- | +| **1** | **1** | -> | **BIND (Link)** | **1对1 自动对齐**:仅当两端剩余记录皆为 `MISSING` 且绝对 1:1 时,执行自动绑定。 | +| **1** | **1** | -> | **SKIP** | **带障不处理**:若剩余记录中包含 `ABNORMAL` 等异常状态,说明存在历史冲突,不执行自动动作。 | +| **N** | **0** | -> | **CREATE** | **可判定缺失**:业务键完整且唯一,本地存在而远端不存在(N:0)时,才允许进入孤儿创建策略。 | +| 其他 | 其他 | -> | **SKIP** | **非 1:1 不处理**:存在多对多、多对一或无候选情况,系统保持原状。 | + +**设计优势**: +1. **对故障极端敏感**:环境中存在任何 `ABNORMAL` 记录都会阻断自动绑定,强制人工介入处理异常。 +2. **状态纯净**:失败时不产生任何中间态(如已废弃的 `AMBIGUOUS`),保持语义清晰。 +3. **静默自愈**: 当外界清理了环境且满足 1:1 条件后,系统下次同步会自动完成绑定。 + +### 3.1 空数据处理策略 + +**原则**:**空数据不推送**。 + +**空数据定义**: +- 初始化时创建但未编辑的业务记录(如空合同、空施工任务) +- 业务键字段为空或关键字段缺失的记录 + +**处理方式**: +- 在自动绑定阶段,若业务键字段缺失,标记 `binding_status = WARNING`,记录原因 +- 不参与自动绑定与孤儿创建判定 +- 不推送到远程系统 + +**设计理由**: +1. **远程系统简化**:远程只需处理完整数据,无需兼容空数据校验逻辑 +2. **避免垃圾数据**:空数据通常会被本地删除,若已推送则清理复杂 +3. **数据质量保障**:远程系统只能看到本地已正确编辑保存的业务 + +**配置方式**(Strategy 层): +```python +# 在 Strategy 配置中指定必填字段 +default_config = StrategyConfig( + auto_bind_fields=["contract_id", "task_type"], # 业务键字段 + # 如果这些字段为空,节点将被标记为 WARNING 而非 MISSING +) +``` + +--- + +## 4. 动作策略表 (Action Policy Matrix) + +此表定义了在特定状态下,`execute` 阶段允许产生的 **意图行动 (`SyncAction`)**。 + +#### A. 稳态更新 (NORMAL) +适用于已有绑定关系且链路健康的节点。 + +| 状态 | 动作条件 | 执行动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **NORMAL** | `compute_diff` 判定存在差异 | **UPDATE** | +| **NORMAL** | `compute_diff` 判定无差异 | **NONE** | + +#### B. 异常处理 (阻断态) +处于这些状态的节点,引擎会自动中止后续的读写操作。 + +| 状态 | 说明 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **DEPENDENCY_ERROR** | 父节点缺失/异常同步导致阻断 | **NONE** | +| **ABNORMAL / WARNING** | 数据损坏或链路降级,需人工修复 | **NONE** | + +#### C. 孤儿处理 (Create Only) +适用于最终探测状态为 **MISSING** 且无法/不满足自动绑定的节点。 + +**本地孤儿 (Local Orphan)**: 本地有,远程无。 +| 策略配置 (`local_orphan_action`) | 对应的同步模式 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **"create_remote"** | Push (本地推远端) | **CREATE** | +| **"delete_local"** | Pull (远端拉本地) | **报错 (未实现)** | +| **"none"** | Any | **NONE** | + +**远程孤儿 (Remote Orphan)**: 远程有,本地无。 +| 策略配置 (`remote_orphan_action`) | 对应的同步模式 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **"create_local"** | Pull (远端拉本地) | **CREATE** | +| **"delete_remote"** | Push (本地推远端) | **报错 (未实现)** | +| **"none"** | Any | **NONE** | + +--- + +## 5. 执行同步状态转换 (Physical Sync State Transitions) + +在策略执行完成、设置好 `action` 后,DataSource 层负责执行实际的同步操作并更新 `status` 字段。 + +### A. 执行状态枚举 (SyncStatus) + +| 状态值 | 含义 | 适用场景 | +| :--- | :--- | :--- | +| **PENDING** | 待执行 | 初始状态、无动作的节点 | +| **IN_PROGRESS** | 执行中 | 异步接口已提交,等待结果回调 | +| **SUCCESS** | 执行成功 | 同步操作完成且成功 | +| **FAILED** | 执行失败 | 同步操作失败,`error` 字段记录原因 | +| **SKIPPED** | 已跳过 | 节点被主动跳过(如依赖未满足) | +| **PRECONDITION_FAILED** | 前置条件失败 | create/update 内部验证发现问题 | + +### B. 执行转换矩阵 + +#### 同步接口(一步式) + +适用于同步 API(调用后立即返回成功/失败)。 + +| 输入: action | API 调用结果 | → | 输出: status | 副作用 | +| :--- | :--- | :--- | :--- | :--- | +| **CREATE** | 成功返回 (200/201) | → | **SUCCESS** | `data_id` 设置为远程返回的ID | +| **CREATE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **UPDATE** | 成功返回 (200) | → | **SUCCESS** | - | +| **UPDATE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **DELETE** | 成功返回 (200/204) | → | **SUCCESS** | 节点可能被移除 | +| **DELETE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **NONE** | - | → | **PENDING** | 不执行,保持原状 | + +#### 异步接口(两步式) + +适用于异步 API(提交后需要轮询或回调获取结果)。 + +| 输入: action | API 提交结果 | → | 输出: status | 后续操作 | +| :--- | :--- | :--- | :--- | :--- | +| **CREATE** | 提交成功 (202 Accepted) | → | **IN_PROGRESS** | 记录 task_id,等待轮询 | +| **CREATE** | 提交失败 (4xx/5xx) | → | **FAILED** | `error` 记录错误 | +| **IN_PROGRESS** | 轮询返回成功 | → | **SUCCESS** | `data_id` 设置为远程ID | +| **IN_PROGRESS** | 轮询返回失败 | → | **FAILED** | `error` 记录错误 | +| **IN_PROGRESS** | 超时未完成 | → | **FAILED** | `error` 记录 "Timeout" | + +### B+. Handler 降级(action 取消) + +> **代码实现**:各 `domain/*/api_handler.py` 中的 `update()` 方法。 + +当 Handler 在构建 API 请求数据时,发现实际无需更新的字段(如 schema 校验后所有字段与远程一致), +Handler 会主动将节点的 `action` 从 `UPDATE` 降级为 `NONE`: + +``` +action=UPDATE → Handler 校验 → 无实际变更字段 → action=NONE(不提交 API) +``` + +此机制确保 DataSource 不会向远程发送无意义的空更新请求。 + +### C. 关键副作用 + +| 动作 | 成功时的副作用 | 说明 | +| :--- | :--- | :--- | +| **CREATE** | 临时绑定已建立 | 绑定关系可在提交前创建,用于推送与追踪;是否成功不影响该绑定存在 | +| **CREATE** | 设置 `data_id` | 成功后从API响应中提取远程分配的ID,更新到节点 | +| **CREATE** | 回写 `data` 主键 | DataSource 将远程返回的ID写回 `SyncNode.data`(如 `id`/`*_id` 字段) | +| **CREATE** | 更新绑定记录 | 若使用临时ID,成功后替换为真实的远程ID | +| **UPDATE** | 更新 `origin_data` | 将当前 `data` 保存为新的 `origin_data` | +| **DELETE** | 移除绑定记录 | 删除成功后,清除对应的绑定关系 | + +### D. 错误处理 + +| 错误类型 | 记录方式 | 重试策略 | +| :--- | :--- | :--- | +| **网络错误** | `error = "Network timeout"` | 可重试 | +| **权限错误** | `error = "403 Forbidden"` | 不可重试,需人工介入 | +| **数据校验错误** | `error = "Validation failed: ..."` | 不可重试,需修复数据 | +| **依赖缺失** | `status = PRECONDITION_FAILED` | 不执行,等待依赖修复 | + +--- + +## 6. 同步检查规范 (Sync Check Specification) + +在执行同步前后,需要进行状态检查以确保操作的合法性和完整性。 + +### A. 内联前置检查(create/update 阶段) + +> **实现说明**:原 `_pre_commit_check` 方法已移除(保留空壳兼容接口)。 +> 所有有效检查已内联到 `_add_create_action()` 和 `_add_update_action()` 中。 + +**create() 阶段内联检查**: + +| 检查类别 | 检查条件 | 不通过时 | 说明 | +| :--- | :--- | :--- | :--- | +| **数据完整性** | `src_node.get_data()` 不为空 | 跳过该节点,记录日志 | MISSING 但数据为空 | +| **依赖 ID 解析** | `id_resolver.resolve_and_validate()` 成功 | `binding_status → DEPENDENCY_ERROR` | 依赖字段无法解析到目标系统 ID | + +**update() 阶段内联检查**: + +| 检查类别 | 检查条件 | 不通过时 | 说明 | +| :--- | :--- | :--- | :--- | +| **FAILED 保护** | `src_node.status != FAILED` | 跳过该节点 | 不覆盖上次失败的状态和错误 | +| **数据完整性** | `src_node.get_data()` 不为空 | 跳过该节点 | NORMAL 但数据为空 | +| **目标节点存在** | 通过绑定找到目标节点 | 跳过该节点 | 绑定记录指向的节点不在集合中 | +| **data_id 完整性** | `target_node.data_id` 非空 | `status → PRECONDITION_FAILED` | UPDATE 必须有业务主键 | +| **依赖 ID 解析** | `id_resolver.resolve_and_validate()` 成功 | `status → PRECONDITION_FAILED` | 依赖字段无法解析到目标系统 ID | +| **差异检测** | `_needs_update()` 返回 True | 跳过该节点 | 无差异则不更新 | + +> **注意**:以下检查项在当前实现中 **未覆盖**【未实现】: +> - 状态合法性:`binding_status` 必须是已知状态 +> - 动作合法性:`CREATE/UPDATE` 只能用于 `NORMAL` 节点 +> - 绑定一致性:`NORMAL` 节点必须有绑定记录 + +### B. 同步后检查 (Post-Sync Check) + +**目标**: 验证同步结果的完整性,发现残留问题。 + +> **实现说明**:当前 `_stage4_post_sync_check` 只打印摘要表格,不做异常检测。以下检查项均为【未实现】。 + +#### 检查项清单【未实现】 + +| 检查类别 | 检查条件 | 异常情况 | 严重程度 | +| :--- | :--- | :--- | :--- | +| **CREATE 完成性** | CREATE 节点应该有 `data_id` | `action = CREATE, status = SUCCESS` 但 `data_id = ""` | 🔴 ERROR | +| **CREATE 绑定** | CREATE 节点应该有绑定记录 | CREATE 成功但无绑定 | 🔴 ERROR | +| **UPDATE 完成性** | UPDATE 节点应该成功 | `action = UPDATE` 但 `status = FAILED` | ⚠️ WARNING | +| **绑定保持** | UPDATE 节点的绑定应该保持 | UPDATE 后绑定记录丢失 | 🔴 ERROR | +| **残留异常** | 不应有 ABNORMAL 节点 | 同步后仍有 `binding_status = ABNORMAL` | ⚠️ WARNING | +| **残留依赖错误** | 不应有 DEPENDENCY_ERROR | 同步后仍有依赖阻断 | ⚠️ WARNING | + +#### 统计指标 + +| 指标 | 计算方式 | 用途 | +| :--- | :--- | :--- | +| **成功率** | `SUCCESS / (CREATE + UPDATE)` | 评估同步质量 | +| **异常率** | `(ABNORMAL + WARNING) / total` | 发现数据质量问题 | +| **阻断率** | `DEPENDENCY_ERROR / total` | 发现依赖关系问题 | + +#### 决策规则 + +| 检查结果 | ERROR 数量 | 决策 | +| :--- | :--- | :--- | +| ✅ 通过 | 0 | **继续持久化**,正常结束 | +| ⚠️ 有警告 | 0, WARNING ≥1 | **继续持久化**,打印警告报告 | +| ❌ 有错误 | ≥1 | **继续持久化**(已同步无法回滚),打印错误报告 | + +> **注意**: Post-Sync Check 即使有 ERROR 也不会终止流程,因为同步已经执行,无法回滚。检查目的是发现问题并记录,供后续修复。 + +--- + +## 附录: 状态字段说明 + +### SyncNode 核心字段 + +| 字段 | 类型 | 设置阶段 | 含义 | +| :--- | :--- | :--- | :--- | +| `binding_status` | BindingStatus | Bind 阶段 | 绑定健康状态 | +| `action` | SyncAction | Create/Update 阶段 | 待执行动作 | +| `status` | SyncStatus | Physical Sync 阶段 | 执行结果状态 | +| `data_id` | str | 数据加载 / CREATE 后 | 业务主键ID(CREATE 前为 "") | +| `depend_ids` | List[str] | 数据加载 | 依赖节点的 node_id 列表 | +| `error` | str \| None | Physical Sync 阶段 | 错误信息(失败时) | + +### 状态流转时序 + +``` +[数据加载] [Bind] [Create/Update] [Physical Sync] +binding_status: UNCHECKED → NORMAL/MISSING/... → (保持) → (保持) +action: NONE → NONE → CREATE/UPDATE → (保持) +status: PENDING → PENDING → PENDING → SUCCESS/FAILED +data_id: 从源加载 → (保持) → 可能为 "" → CREATE 后设置 +``` \ No newline at end of file diff --git a/docs/archive/docs/状态机形式化规范.md b/docs/archive/docs/状态机形式化规范.md new file mode 100644 index 0000000..fd752ff --- /dev/null +++ b/docs/archive/docs/状态机形式化规范.md @@ -0,0 +1,498 @@ +# 状态机形式化规范 + +本文档用 **Guard-Event-Action (GEA)** 形式严格定义节点状态机。 +所有转换以代码实现为准,模糊之处在文档中显式标注。 + +> **代码基线** +> - 枚举: `sync_system_new/common/types.py` +> - 决策引擎: `sync_system_new/sync_system/decision.py` +> - 重置策略: `sync_system_new/common/state_reset.py` +> - 同步策略: `sync_system_new/sync_system/strategy.py` +> - 物理同步: `sync_system_new/datasource/datasource.py` + +> **配置基线(状态机真源)** +> - `sync_system_new/state_machine/node_state_machine.yaml` + +### 2026-02 对齐说明(重构前必读) + +以下语义以 `node_state_machine.yaml` 为准,用于修正文档中易混淆点: + +1. **E12a 为什么从 S01 出发?** + - `S01` 只约束**源节点**是 NORMAL/NONE/PENDING 且有 `data_id`。 + - `E12a` 的 guard 是 `target_has_data_id=false`,检查对象是**目标节点**。 + - 所以“源节点在 S01”与“E12a 触发前置失败”并不冲突。 + +2. **S01 会不会触发创建?** + - 当前配置中,create 的入口状态是 `S02(MISSING)`,不是 `S01`。 + - `S01` 进入的是 update_prepare(E12/E13/E14)。 + +3. **N:0 + create_enabled=true 的当前行为** + - 自动绑定分支 `E08f`:`S02 -> S01`,并 `emit spawn_target_node_state: S06`。 + - create_prepare 分支 `E09b` 也可在检查成功后 `S02 -> S01 + spawn S06`。 + - 即:源节点不会停在“等待创建结果”的专用状态;创建执行结果体现在目标创建节点链路 `S06 -> S10/S11/S12/S13`。 + +4. **旧章节中的事件编号偏差** + - 本文后续仍有部分“E11a/E11b/…”旧编号描述,已与当前 YAML 不一致。 + - 进行代码重构时,优先依据 YAML 的 `E08/E09/E10/E12/E13/E14/E15..E20`。 + +--- + +## §1 状态空间定义 + +### §1.1 状态维度 + +节点携带 **三个独立的状态字段** 和 **两个辅助字段**: + +| 字段 | 枚举 | 值域 | 语义 | +|------|------|------|------| +| **B** – `binding_status` | `BindingStatus` | `UNCHECKED` · `NORMAL` · `MISSING` · `ABNORMAL` · `WARNING` · `DEPENDENCY_ERROR` | 绑定健康度 | +| **A** – `action` | `SyncAction` | `NONE` · `CREATE` · `UPDATE` · `DELETE` | 待执行动作 | +| **S** – `status` | `SyncStatus` | `PENDING` · `IN_PROGRESS` · `SUCCESS` · `FAILED` · `SKIPPED` · `PRECONDITION_FAILED` | 执行结果 | + +辅助字段(影响 Guard 但不是状态维度): + +| 字段 | 类型 | 语义 | +|------|------|------| +| `data_id` | `str` | 业务主键(空串 `""` = 尚未从远程获取) | +| `error` | `str \| None` | 最近一次错误信息 | + +理论组合 = 6 × 4 × 6 = **144**,实际可达 ≈ **23** 种。 + +### §1.2 可达状态枚举 + +以下列出所有在正常流程中可以到达的 `(binding_status, action, status)` 三元组。 + +| # | binding_status | action | status | 语义 | 产生阶段 | +|---|---|---|---|------|---------| +| R1 | UNCHECKED | NONE | PENDING | 首次加载 | 数据加载 | +| R2 | UNCHECKED | NONE | SUCCESS | 从持久化恢复(上轮成功)后重置 | 阶段1/2重置 | +| R3 | UNCHECKED | NONE | FAILED | 从持久化恢复(上轮失败)后重置 | 阶段1/2重置 | +| R4 | UNCHECKED | NONE | SKIPPED | 从持久化恢复(上轮跳过)后重置 | 阶段1/2重置 | +| R5 | UNCHECKED | NONE | PRECONDITION_FAILED | 从持久化恢复(上轮前置失败)后重置 | 阶段1/2重置 | +| R6 | NORMAL | NONE | PENDING | 绑定正常,无需操作(首次) | bind.p1 | +| R7 | NORMAL | NONE | SUCCESS | 绑定正常,无需操作(历史成功) | bind.p1 | +| R8 | NORMAL | NONE | FAILED | 绑定正常但上次失败,被 FAILED 保护 | bind.p1 | +| R9 | MISSING | NONE | PENDING | 孤儿,等待自动绑定或创建(首次) | bind.p1 | +| R10 | MISSING | NONE | SUCCESS | 孤儿(历史成功但绑定丢失?) | bind.p1 | +| R11 | ABNORMAL | NONE | * | 数据损坏,需人工 | bind.p1 | +| R12 | WARNING | NONE | * | 多候选/对方损坏,需人工 | bind.p1/p3 | +| R13 | DEPENDENCY_ERROR | NONE | PENDING | 依赖不满足 | bind.p2/p3/create | +| R14 | NORMAL | CREATE | PENDING | 准备创建(目标节点) | create | +| R15 | NORMAL | CREATE | IN_PROGRESS | 异步创建进行中 | sync | +| R16 | NORMAL | CREATE | SUCCESS | 创建成功 | sync | +| R17 | NORMAL | CREATE | FAILED | 创建失败 | sync | +| R18 | NORMAL | UPDATE | PENDING | 准备更新(目标节点) | update | +| R19 | NORMAL | UPDATE | IN_PROGRESS | 异步更新进行中 | sync | +| R20 | NORMAL | UPDATE | SUCCESS | 更新成功 | sync | +| R21 | NORMAL | UPDATE | FAILED | 更新失败 | sync | +| R22 | NORMAL | UPDATE | PRECONDITION_FAILED | 更新前置条件失败 | update | +| R23 | NORMAL | CREATE | SKIPPED | 创建被 Handler 跳过 | sync | + +> **不可达组合(示例)**: +> - `(MISSING, UPDATE, *)` — MISSING 节点不可能被安排 UPDATE +> - `(ABNORMAL, CREATE, *)` — ABNORMAL 节点不可能被安排 CREATE +> - `(*, DELETE, *)` — DELETE 尚未实现 +> - `(UNCHECKED, CREATE, *)` — UNCHECKED 是瞬态,在 bind 之前不会有 CREATE +> - `(DEPENDENCY_ERROR, UPDATE, *)` — DEPENDENCY_ERROR 节点不可能进入 update 流程 + +### §1.3 辅助字段约束 + +| 对应状态 | binding_status | action | status | data_id 约束 | error 约束 | +|---------|---|---|---|-------------|-----------| +| R14 | NORMAL | CREATE | PENDING | `""` (待远程返回) | None | +| R16 | NORMAL | CREATE | SUCCESS | 非空 (远程回填) | None | +| R17 | NORMAL | CREATE | FAILED | `""` (未回填) | 非空 | +| R22 | NORMAL | UPDATE | PRECONDITION_FAILED | * | 非空 | +| R13 | DEPENDENCY_ERROR | NONE | PENDING | * | 非空 | + +--- + +## §2 不变量 (Invariants) + +以下约束在**任何事件执行后**都必须成立。违反即为 Bug。 + +``` +INV-1 B = UNCHECKED ⟹ A = NONE + (UNCHECKED 是瞬态,在 bind 之前不允许有动作) + +INV-2 B ∈ {ABNORMAL, WARNING, DEPENDENCY_ERROR} ⟹ A = NONE + (阻断态节点不允许执行任何同步动作) + +INV-3 B = MISSING ⟹ A ∈ {NONE, CREATE} + (MISSING 节点只能等待创建或保持不动) + +INV-4 A = CREATE ⟹ B = NORMAL + (CREATE 动作只出现在目标节点上,其 binding_status 已被设为 NORMAL) + +INV-5 A = UPDATE ⟹ B = NORMAL + (UPDATE 动作只对 NORMAL 节点执行) + +INV-6 S = IN_PROGRESS ⟹ A ∈ {CREATE, UPDATE, DELETE} + (只有提交过 API 的节点才可能处于 IN_PROGRESS) + +INV-7 S = PRECONDITION_FAILED ⟹ A = UPDATE + (PRECONDITION_FAILED 只在 update 阶段产生) + +INV-8 A = CREATE ∧ S = SUCCESS ⟹ data_id ≠ "" + (创建成功必须回填 data_id) + +INV-9 S = FAILED ⟹ error ≠ None + (失败必须有错误信息) + +INV-10 B = DEPENDENCY_ERROR ⟹ error ≠ None + (依赖阻断必须有错误信息) +``` + +--- + +## §3 事件与转换 + +### §3.1 事件总览图 + +``` + ┌─────────────────────────────────────────────────────┐ + │ 节点生命周期事件流 │ + └─────────────────────────────────────────────────────┘ + + 持久化恢复 策略层 (Strategy) 执行层 (DataSource) + ═══════════ ══════════════════════════════════ ══════════════════════════ + ┌──────────────────────────────┐ + ┌──────┐ │ bind() │ ┌──────────────────────┐ + │E01 │──────────▶│ E04 ─┐ │ │ sync_all() │ + │RESET1│ │ E05 ├─ phase1: core_state │ │ │ + └──┬───┘ │ E06 ─┘ │ │ E12 SYNC_OK │ + │ │ E07 ── phase2: dep_check │ ┌───▶│ E13 SYNC_FAIL │ + ┌──▼───┐ │ E08 ─┐ │ │ │ E14 SYNC_ASYNC │ + │E02 │ │ E09 ├─ phase3: auto_bind │ │ │ E15 SYNC_TIMEOUT │ + │ZOMBIE│ │ E10 ─┘ │ │ │ E16 HANDLER_SKIP │ + └──┬───┘ └──────────────────────────────┘ │ │ E17 HANDLER_DOWN │ + │ ┌──────────────────────────────┐ │ └──────────────────────┘ + ┌──▼───┐ │ create() / update() │ │ + │E03 │──────────▶│ E11a CREATE_OK │────┘ + │RESET2│ │ E11b CREATE_DEP_FAIL │ + └──────┘ │ E11c UPDATE_DIFF │ + │ E11d UPDATE_PRECOND_FAIL │ + │ E11e UPDATE_SKIP_FAILED │ + └──────────────────────────────┘ +``` + + +### §3.2 状态转换详解 + +本节按 Pipeline 执行阶段组织。每个阶段包含: +1. **状态转换图**:状态(R 编号)为节点,事件(E 编号)为有向边 +2. **转换表**:每个事件的精确规格——起始状态、判断条件、结束状态、副作用 + +--- + +#### 🔄 阶段 0:重置 + +**状态转换图:** + +``` + ╔═══════════════════════════════════════╗ + ║ 任意持久化终态 (R6 ~ R23) ║ + ╚═══════════════════╤═══════════════════╝ + │ E01 + ▼ + ┌────────────────────────────────────────┐ E02 + │ 瞬态: UNCHECKED │────────────▶ [节点删除 + 解除绑定] + │ (action 保留, status 保留, error=None) │ + └────────────────────┬──────────────────┘ + │ E03 (存活节点) + ▼ + ╔══════════════════════════════════════════════════════════════╗ + ║ [R1] UNCHECKED, NONE, PENDING ← 首次加载 ║ + ║ [R2] UNCHECKED, NONE, SUCCESS ← 上轮成功 ║ + ║ [R3] UNCHECKED, NONE, FAILED ← 上轮失败 ║ + ║ [R4] UNCHECKED, NONE, SKIPPED ← 上轮跳过 ║ + ║ [R5] UNCHECKED, NONE, PRECONDITION_FAILED ← 上轮前置 ║ + ╚══════════════════════════════════════════════════════════════╝ +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E01**: PHASE1_RESET | R6~R23 (任意持久化终态) | 节点从持久化加载 | 瞬态 (UNCHECKED, action 保留, status 保留) | error → None; data/origin_data → None | +| **E02**: ZOMBIE_KILL | 瞬态 | action = CREATE ∧ (status = FAILED ∨ data_id = "") | **节点删除** | 解除绑定关系; 对 local/remote 两侧都扫描 | +| **E03**: ACTION_RESET | 瞬态 (存活节点) | E02 完成后所有存活节点 | R1 / R2 / R3 / R4 / R5 (按原 status 分) | action → NONE | + +> **代码**: `NodeStateReset.get_phase1_reset_defaults()` · `cleanup_create_failed_zombies()` · `reset_action_for_nodes()` + +--- + +#### 🔗 阶段 1:Bind + +Bind 由三个子阶段串行执行。后一阶段只处理前一阶段的遗留 MISSING 节点。 + +**状态转换图:** + +``` + [R1~R5] UNCHECKED, NONE, * + │ + │ ══════════ Phase 1: 核心状态判定 ══════════ + │ + ├── E04 (有绑定, 双方数据 VALID) ───────────▶ [R6/R7/R8] NORMAL ──────▶ 出口 ✅ + ├── E04 (有绑定, 自身数据缺失/损坏) ────────▶ [R11] ABNORMAL ─────────▶ 出口 🔒 + ├── E04 (有绑定, 对方数据缺失/损坏) ────────▶ [R12] WARNING ──────────▶ 出口 🔒 + │ + └── E05 (无绑定记录) ───────────────────────▶ [R9] MISSING + │ + ══════════ Phase 2: 依赖检查 ══════════ │ + │ + ├── E06 (data = None) ──────────────────────▶ [R11] ABNORMAL ──────▶ 出口 🔒 + ├── E07 (依赖节点不满足) ───────────────────▶ [R13] DEP_ERROR ─────▶ 出口 🔒 + │ (无依赖配置 或 依赖全部满足 → 继续 ▼) + │ + ══════════ Phase 3: 自动绑定 ══════════ + │ + ├── E08 (auto_bind 关闭) ──────────────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E09 (去噪后 1:1 匹配成功) ─────────────▶ [R6] NORMAL ─────────▶ 出口 ✅ + ├── E10a (去噪后非 1:1, 多候选) ───────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E10b (业务键字段缺失) ─────────────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E10c (业务键中 ID 字段解析失败) ───────▶ [R13] DEP_ERROR ─────▶ 出口 🔒 + │ + └── (1:0 无远程匹配) + ├── create_enabled = True → [R9] MISSING ──────────────▶ 进入 create + └── create_enabled = False → [R12] WARNING ─────────────▶ 出口 🔒 +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E04**: BIND_PAIRED | R1~R5 | 有绑定记录 ∧ 双方数据 VALID | R6 (PENDING) / R7 (SUCCESS) / R8 (FAILED) — status 保持 | 远程节点同步设置 binding_status | +| **E04**: BIND_PAIRED (自身异常) | R1~R5 | 有绑定记录 ∧ 本方数据缺失或损坏 | R11 (ABNORMAL) | 对方节点设为 WARNING | +| **E04**: BIND_PAIRED (对方异常) | R1~R5 | 有绑定记录 ∧ 对方数据缺失或损坏 | R12 (WARNING) | 对方节点设为 ABNORMAL | +| **E05**: BIND_ORPHAN | R1~R5 | 无绑定记录 | R9 (MISSING, NONE, status 保持) | — | +| **E06**: DATA_NULL | R9 | binding_status = MISSING ∧ data = None | R11 (ABNORMAL) | error = "数据损坏: 节点数据为空或不存在" | +| **E07**: DEP_CHECK_FAIL | R9 | depend_fields 配置非空 ∧ ∃依赖节点: 不存在 ∨ status ≠ NORMAL ∨ data_id 为空 | R13 (DEPENDENCY_ERROR) | error = "依赖项不满足: ..."; depend_ids 填充 | +| **E08**: AUTOBIND_DISABLED | R9 | auto_bind = False 或 auto_bind_fields 为空 | R12 (WARNING) | — | +| **E09**: AUTOBIND_OK | R9 | 去噪后 local:remote = 1:1 ∧ 双方都是 MISSING | R6 (NORMAL) | 建立绑定记录; 双方都设为 NORMAL | +| **E10a**: AUTOBIND_AMBIGUOUS | R9 | 去噪后非 1:1 (多候选) | R12 (WARNING) | error += "存在多个候选节点" | +| **E10b**: AUTOBIND_KEY_MISSING | R9 | auto_bind_fields 中有字段不存在于 data | R12 (WARNING) | error += "缺少业务键字段: ..." | +| **E10c**: AUTOBIND_ID_FAIL | R9 | 业务键包含 ID 字段 ∧ ID 解析失败 | R13 (DEPENDENCY_ERROR) | error = "业务键中的ID字段解析失败: ..." | +| **E10d**: ORPHAN_CREATE_DISABLED | R9 | 去噪后 1:0 ∧ create_enabled = False | R12 (WARNING) | error += "孤儿且不允许自动创建" | + +> **E04 核心状态矩阵** (完整查表): +> +> | | 远程: VALID | 远程: ABSENT | 远程: INVALID | +> |---|---|---|---| +> | **本地: VALID** | 本:NORMAL 远:NORMAL | 本:WARNING 远:ABNORMAL | 本:WARNING 远:ABNORMAL | +> | **本地: ABSENT** | 本:ABNORMAL 远:WARNING | 本:ABNORMAL 远:ABNORMAL | — | +> | **本地: INVALID** | 本:ABNORMAL 远:WARNING | — | 本:ABNORMAL 远:ABNORMAL | +> +> 不在矩阵中的组合 → 默认 (ABNORMAL, ABNORMAL) + +> **代码**: `SyncDecisionEngine.determine_core_status()` · `_phase_core_state()` · `_check_dependencies_for_nodes()` · `_phase_auto_binding()` + +--- + +#### ⚡ 阶段 2:Create / Update + +**状态转换图:** + +``` + ═══════════════ Create ═══════════════ + + [R9] MISSING, NONE, PENDING (源节点, data ≠ None) + │ + ├── E11a (ID 解析成功) ────▶ 源节点: [R9] → [R6] NORMAL + │ 新建目标节点: → [R14] NORMAL, CREATE, PENDING + │ + 建立绑定记录, 目标 data_id = "" + │ + └── E11b (ID 解析失败) ────▶ 源节点: [R9] → [R13] DEPENDENCY_ERROR + + + ═══════════════ Update ═══════════════ + + [R6/R7] NORMAL, NONE, PENDING/SUCCESS (源节点, status ≠ FAILED) + │ + ├── E11c (差异检测通过) ────▶ 目标节点 → [R18] NORMAL, UPDATE, PENDING + ├── E11d.1 (目标 data_id="") ▶ 目标节点 → [R22] status = PRECONDITION_FAILED + ├── E11d.2 (ID 解析失败) ───▶ 目标节点 → [R22] action = UPDATE, status = PRECOND_FAIL + └── (无差异) ──────────────▶ 保持不变 + + + ═══════════════ FAILED 保护 ═══════════════ + + [R8] NORMAL, NONE, FAILED (源节点) + │ + └── E11e ──────────────────▶ 跳过,保持 [R8] 不变 +``` + +**转换表:** + +| 事件 | 起始状态 (源节点) | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E11a**: CREATE_OK | R9 (MISSING) | data ≠ None ∧ IDResolver.resolve_and_validate() = OK | 源 → R6 (NORMAL); **新建**目标 → R14 | 建立绑定; 新节点 data = 已替换 ID 的副本, data_id = "" | +| **E11b**: CREATE_DEP_FAIL | R9 (MISSING) | data ≠ None ∧ IDResolver.resolve_and_validate() = FAIL | R13 (DEPENDENCY_ERROR) | error = "创建时依赖 ID 未解析: ..." | +| **E11c**: UPDATE_DIFF | R6/R7 (NORMAL, status≠FAILED) | 目标存在 ∧ 目标 data_id ≠ "" ∧ ID 解析 OK ∧ _needs_update() = True | 目标 → R18 (UPDATE, PENDING) | 目标: data 替换, error = None | +| **E11d**: UPDATE_PRECOND_FAIL | R6/R7 (NORMAL, status≠FAILED) | 目标 data_id = "" (d1) 或 ID 解析失败 (d2) | 目标 → R22 (UPDATE, PRECONDITION_FAILED) | error = "目标缺少 data_id" 或 "依赖 ID 未解析" | +| **E11e**: UPDATE_SKIP_FAILED | R8 (NORMAL, FAILED) | status = FAILED | R8 不变 | 保护上次的 error 和 FAILED 状态,不做任何修改 | + +> **代码**: `_add_create_action()` · `_add_update_action()` + +--- + +#### 📡 阶段 3:Sync(物理同步) + +**状态转换图:** + +``` + [R14] NORMAL, CREATE, PENDING [R18] NORMAL, UPDATE, PENDING + │ │ + └───────────────┬───────────────────┘ + │ + ├── E12 (API 成功) ──────▶ [R16] CREATE,SUCCESS / [R20] UPDATE,SUCCESS + ├── E13 (API 失败) ──────▶ [R17] CREATE,FAILED / [R21] UPDATE,FAILED + ├── E16 (Handler 跳过) ──▶ [R23] CREATE, SKIPPED + ├── E17 (Handler 降级) ──▶ [R6] NORMAL, NONE, PENDING (仅 UPDATE) + │ + └── E14 (异步提交) ──────▶ [R15] CREATE,IN_PROGRESS / [R19] UPDATE,INP + │ + ├── (轮询成功) ──▶ [R16] / [R20] SUCCESS + └── E15 (超时) ──▶ [R17] / [R21] FAILED +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E12**: SYNC_OK | R14 或 R18 | Handler API 返回 SUCCESS | R16 (CREATE) 或 R20 (UPDATE) | error → None; data_id 回填 (CREATE); origin_data 更新 (UPDATE) | +| **E13**: SYNC_FAIL | R14 或 R18 | Handler API 返回 FAILED | R17 (CREATE) 或 R21 (UPDATE) | error = Handler 返回的错误信息 | +| **E14**: SYNC_ASYNC | R14 或 R18 | Handler API 返回 IN_PROGRESS | R15 (CREATE) 或 R19 (UPDATE) | 记录 task_id, 进入轮询队列 | +| **E15**: SYNC_TIMEOUT | R15 或 R19 | 轮询次数 > max_retries | R17 (CREATE) 或 R21 (UPDATE) | error = "Async task timeout after N seconds" | +| **E16**: HANDLER_SKIP | R14 或 R18 | Handler API 返回 SKIPPED | R23 (CREATE,SKIPPED) | error → None | +| **E17**: HANDLER_DOWNGRADE | R18 (仅 UPDATE) | Handler 运行时发现无实际变更字段 | R6 (NORMAL, NONE, PENDING) | action: UPDATE → NONE; 不提交 API; 统计列从 update 移入 none | + +> **代码**: `BaseDataSource._handle_task_result()` · `_poll_async_tasks()` · `domain/*/api_handler.py` + +--- + +## §4 终态分类与死胡同 + +### §4.1 终态分类 + +| 分类 | 状态 | (binding_status, action, status) | 语义 | 下一轮行为 | +|------|------|------|------|---------| +| ✅ 成功 | R16 | (NORMAL, CREATE, SUCCESS) | 创建成功 | →R2→bind→R7→update 检查 | +| ✅ 成功 | R20 | (NORMAL, UPDATE, SUCCESS) | 更新成功 | →R2→bind→R7→update 检查 | +| ❌ 失败 | R17 | (NORMAL, CREATE, FAILED) | 创建失败 | E02 zombie 判定→删除节点→对方回到 R9 重建 | +| ❌ 失败 | R21 | (NORMAL, UPDATE, FAILED) | 更新失败 | →R3→bind→R8→FAILED 保护(E11e)→保持 | +| 🔒 阻断 | R11 | (ABNORMAL, NONE, \*) | 数据损坏 | 每轮重新 bind 检查; 需人工修复数据 | +| 🔒 阻断 | R12 | (WARNING, NONE, \*) | 多候选/对方异常 | 每轮重新 bind 检查; 需人工绑定或修复 | +| 🔒 阻断 | R13 | (DEPENDENCY_ERROR, NONE, PENDING) | 依赖不满足 | 每轮重新检查依赖; 依赖修复后自动恢复 | +| ⏭ 跳过 | R23 | (NORMAL, CREATE, SKIPPED) | Handler 跳过创建 | →R4→bind→R6→update 检查(无绑定则再 create) | +| 🔄 异步 | R15 | (NORMAL, CREATE, IN\_PROGRESS) | 创建异步中 | 轮询直到 SUCCESS 或超时→FAILED | +| 🔄 异步 | R19 | (NORMAL, UPDATE, IN\_PROGRESS) | 更新异步中 | 轮询直到 SUCCESS 或超时→FAILED | +| 🔄 前置失败 | R22 | (NORMAL, UPDATE, PRECONDITION\_FAILED) | 前置条件不满足 | →R5→bind→R6/R7→update 重试 | + +### §4.2 恢复路径 + +``` +R17 (CREATE, FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, CREATE, FAILED) + → E02: action=CREATE ∧ (status=FAILED ∨ data_id="") → 满足 zombie 条件 + → 删除节点 + 解除绑定 + → 对方节点回到 R9 (MISSING) → 重新进入 create 流程 + +R21 (UPDATE, FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, UPDATE, FAILED) + → E02: action=UPDATE ≠ CREATE → 非 zombie,存活 + → E03: action → NONE → R3 (UNCHECKED, NONE, FAILED) + → bind → R8 (NORMAL, NONE, FAILED) + → E11e: FAILED 保护 → 跳过 update → 保持 R8 + ⚠ 需人工清除 FAILED 才能恢复 + +R22 (UPDATE, PRECONDITION_FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, UPDATE, PRECONDITION_FAILED) + → E02: action=UPDATE ≠ CREATE → 非 zombie,存活 + → E03: action → NONE → R5 (UNCHECKED, NONE, PRECONDITION_FAILED) + → bind → R6/R7 (NORMAL) → update 流程重试 + +R11 (ABNORMAL): + 每轮 E01 重置 → bind 重新检查 + → 若数据被人工修复 → E04 → R6/R7/R8 (NORMAL) + → 若数据仍损坏 → 再次 R11 + +R12 (WARNING): + 每轮 E01 重置 → bind 重新检查 + → 若人工建立了绑定 → E04 → R6/R7 (NORMAL) + → 若对方数据被修复 → E04 → R6/R7 (NORMAL) + +R13 (DEPENDENCY_ERROR): + 每轮 E01 重置 → bind 重新检查依赖 + → 依赖节点达到 NORMAL 且 data_id 非空后 + → E07 通过 → 继续 auto_bind 或 create 流程 +``` + +### §4.3 FAILED 保护机制详解 + +FAILED 保护确保失败节点不会被后续流程静默覆盖,保留 error 信息供人工调查。 + +``` +进入条件: + 节点经过 bind 后为 R8 (NORMAL, NONE, FAILED) + 即: 绑定关系正常,但上一轮执行失败 + +保护行为: + strategy._add_update_action() 中: + if source.status == SyncStatus.FAILED: + skip (→ 事件 E11e) + 结果: R8 原样保持 → 持久化 → 下一轮依然 R8 + +解除条件 (需人工介入): + 1. 清除 error 字段 (→ None) + 2. 将 status 改为 PENDING 或 SUCCESS + 3. 下轮 bind 后 → R6 或 R7 → 正常进入 update 流程 +``` + +--- + +## §5 完备性分析 + +### §5.1 状态 × 事件矩阵 + +行 = 当前状态,列 = 可能触发的事件。`→Rx` = 转换到目标状态,`—` = 不可能触发。 + +| 状态 | E01 | E02 | E03 | E04/E05 | E06~E10 | E11a/b | E11c/d/e | E12~E17 | +|------|-----|-----|-----|---------|---------|--------|----------|---------| +| R1~R5 | — | — | — | →R6~R13 | — | — | — | — | +| R6/R7 | →瞬态 | — | — | — | — | — | →R18/R22 | — | +| R8 | →瞬态 | — | — | — | — | — | →R8(skip) | — | +| R9 | →瞬态 | — | — | — | →R6/R11~R13 | →R6+R14/R13 | — | — | +| R11~R13 | →瞬态 | — | — | — | — | — | — | — | +| R14 | →瞬态 | — | — | — | — | — | — | →R15~R17/R23 | +| R15 | →瞬态 | — | — | — | — | — | — | →R16/R17 | +| R18 | →瞬态 | — | — | — | — | — | — | →R6/R19~R21/R23 | +| R19 | →瞬态 | — | — | — | — | — | — | →R20/R21 | +| R16/R17 | →瞬态 | — | — | — | — | — | — | — | +| R20~R23 | →瞬态 | — | — | — | — | — | — | — | + +> **读表方式**: 找到当前状态行和事件列组的交叉点,即可得到目标状态。`—` 表示该状态不可能触发该事件。 + +### §5.2 已知 GAP + +| GAP | 描述 | 风险 | 建议 | +|-----|------|------|------| +| GAP-1 | `set_binding_status()` / `set_action()` / `set_status()` 是纯 setter,不验证转换合法性 | 中 | 加入前置断言:检查 (当前状态, 新状态) 是否匹配某条已知转换 | +| GAP-2 | INV-1 ~ INV-10 未在代码中 assert | 中 | 每次 setter 调用后或阶段结束时断言所有不变量 | +| GAP-3 | R22 (PRECONDITION\_FAILED) 节点下一轮行为路径需验证 | 低 | 已补充恢复路径: R22→E01→E03→R5→bind→R6/R7→update 重试 | +| GAP-4 | Handler 降级 (E17) 后 status 残留为 PENDING 但 action 已清零 | 低 | 可考虑降级时同时重置 status 为 SUCCESS(当前保持 PENDING) | +| GAP-5 | 物理同步后缺少整体一致性检查 (post-sync invariant check) | 低 | 在 `sync_all()` 结束后遍历所有节点验证 INV-1 ~ INV-10 | + +--- + +## §6 引用 + +| 文档 | 路径 | +|------|------| +| 枚举定义 | `sync_system_new/common/types.py` | +| 决策引擎 | `sync_system_new/sync_system/decision.py` | +| 重置策略 | `sync_system_new/common/state_reset.py` | +| 同步策略 | `sync_system_new/sync_system/strategy.py` | +| 物理同步 | `sync_system_new/datasource/datasource.py` | +| ID 解析 | `sync_system_new/sync_system/resolve_ids.py` | +| 节点生命周期(叙事) | [节点生命周期状态转移](./节点生命周期状态转移.md) | diff --git a/docs/archive/docs/编排流程规范.md b/docs/archive/docs/编排流程规范.md new file mode 100644 index 0000000..f9dda84 --- /dev/null +++ b/docs/archive/docs/编排流程规范.md @@ -0,0 +1,534 @@ +# 同步编排流程规范 (Pipeline Specification) + +本文档定义了完整的同步编排流程,包括各阶段的职责、节点状态转换和检查点。 + +> **详细的状态定义和转换规则,请参考**: [STATE_DEFINITIONS.md](../sync_system/STATE_DEFINITIONS.md) + +--- + +## 流程概览 + +同步系统的完整执行流程分为 5 个阶段: + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Stage 0: 初始化 (Initialization) │ +├─────────────────────────────────────────────────────────────┤ +│ - 创建 Collection (Local/Remote) │ +│ - 创建 BindingManager │ +│ - 注册 SyncStrategy (各业务类型) │ +│ - 创建 DataSource (Local/Remote) │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 1: 数据加载 (Data Loading) │ +├─────────────────────────────────────────────────────────────┤ +│ 节点状态: binding_status=UNCHECKED, action=NONE, status=PENDING │ +│ - Persistence.load_nodes() → 从持久化恢复 │ +│ - DataSource.load_all() → 从数据源加载 │ +│ - BindingManager.load_bindings() → 加载绑定关系 │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 2 & 3: 策略执行与同步 (按 node_type 顺序) │ +├─────────────────────────────────────────────────────────────┤ +│ For each node_type in sync_order: │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 2.1 bind() → 绑定判定 │ │ +│ │ 2.2 create() → 设置 CREATE action │ │ +│ │ └─ 内联 ID 解析 + 前置检查 │ │ +│ │ 2.3 Commit Creates → 立即同步 CREATE 节点 │ │ +│ │ └─ DataSource.sync_all(poll_async=True) │ │ +│ │ 2.4 update() → 设置 UPDATE action │ │ +│ │ └─ 内联 ID 解析 + 前置检查 │ │ +│ │ 2.5 Commit Updates → 立即同步 UPDATE 节点 │ │ +│ │ └─ DataSource.sync_all(poll_async=True) │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ 说明: │ +│ - 每个 node_type 完整同步后才处理下一个(保证依赖顺序) │ +│ - commit 操作内部包含异步轮询,无需独立轮询阶段 │ +│ - sync_all() 自动过滤 action=CREATE/UPDATE 的节点 │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 4: 同步结果报告 (Summary Report) │ +├─────────────────────────────────────────────────────────────┤ +│ - 打印同步结果摘要 │ +│ * 节点统计(按 action/status 分类) │ +│ * 绑定关系统计 │ +│ * 异常节点检查(data_id 缺失、绑定缺失等) │ +│ - 收集统计信息(成功/失败/残留问题) │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 5: 状态持久化 (State Persistence) │ +├─────────────────────────────────────────────────────────────┤ +│ - Collection.persist() → 保存节点状态 │ +│ - BindingManager.persist() → 保存绑定关系 │ +└─────────────────────────────────────────────────────────────┘ + ↓ + 【流程完成】 +``` + +--- + +## 各阶段节点状态 + +### Stage 0: 初始化 + +**输出**: 所有组件实例化完成。 + +--- + +### Stage 1: 数据加载 + +**节点状态**: +```python +binding_status = BindingStatus.UNCHECKED # 未判定 +action = SyncAction.NONE # 无动作 +status = SyncStatus.PENDING # 待处理 +data_id = <从数据源加载> # 已有业务ID +origin_data = <从数据源加载> # 原始数据快照 +data = <从数据源加载> # 当前数据 +depend_ids = <从数据源加载> # 依赖节点列表 +``` + +**关键点**: +- `data_id` 在加载时**必定有值**(来自数据源) +- 只有待创建的新节点 `data_id` 才可能为 ""(空字符串) +- 从持久化恢复时应重置所有 `action` 为 `NONE` +- `binding_status` 初始值是 `UNCHECKED`,不是 `None` + +--- + +### Stage 2.1: Bind (状态判定) + +**状态转换**: `binding_status: UNCHECKED → NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR` + +**可能的结果状态**: + +| 结果状态 | 含义 | 占比 | +|---------|------|-----| +| **NORMAL** | 有绑定,数据健康 | 大部分 | +| **MISSING** | 无绑定,孤儿节点 | 少量 | +| **ABNORMAL** | 有绑定,自身数据损坏 | 极少 | +| **WARNING** | 有绑定,对方数据损坏 | 极少 | +| **DEPENDENCY_ERROR** | 依赖未满足 | 少量 | + +**详细规则**: 参考 [STATE_DEFINITIONS.md § 1-3](../sync_system/STATE_DEFINITIONS.md) + +**补充约束**: +- 若依赖节点 `binding_status = NORMAL` 但 `data_id` 为空(含 `status = FAILED`),视为依赖阻断。 +- 只要依赖节点已回填 `data_id`,即使其 `status = FAILED`,后续类型仍允许进入 Create/Update。 +- 自动绑定只在**业务键完整且唯一**时才尝试: + - 若业务键字段缺失(如 `serial_number = null`),设置 `binding_status = WARNING`,并在 `node.error` 记录原因:`Auto-bind skipped: missing fields ...`。 + - 若同一业务键出现多对多/多对一,设置 `binding_status = WARNING`,并在 `node.error` 记录原因:`Auto-bind skipped: ambiguous candidates`。 + - 以上情况仅记录 **Warning**,不进行自动绑定。 + +--- + +### Stage 2.2: Create (孤儿处理) + +**状态转换**: `action: NONE → CREATE` (对 MISSING 节点) + +**补充约束**: +- `binding_status = WARNING` 的节点不会进入 CREATE(`create()` 只查找 MISSING 节点) +- 创建时会通过 `IDResolver.resolve_and_validate()` 二次验证依赖 ID,失败则设置 `DEPENDENCY_ERROR` + +**副作用**: +- 在对方 Collection 创建新节点 +- 新节点的 `binding_status = NORMAL, action = CREATE, data_id = ""` +- 建立绑定记录 +- 原 MISSING 节点也变为 `NORMAL` + +**示例**: +``` +Before: + local_node: binding_status=MISSING, action=NONE + +After Create: + local_node: binding_status=NORMAL, action=NONE + remote_node (新建): binding_status=NORMAL, action=CREATE, data_id="" + 绑定记录: local_id ↔ remote_temp_id +``` + +--- + +### Stage 2.3: Update (差异同步) + +**状态转换**: `action: NONE → UPDATE` (对 NORMAL 且有差异的节点) + +**前提条件**: +- `binding_status = NORMAL` +- `status != FAILED`(保护上次失败的状态和错误信息) +- `compute_diff()` 判定有差异 +- 配置的 `update_direction` 决定哪一方节点设置 UPDATE + +**内联检查**: +- 目标节点 `data_id` 为空 → `status = PRECONDITION_FAILED` +- `IDResolver.resolve_and_validate()` 失败 → `status = PRECONDITION_FAILED` +- Handler 校验后无实际变更字段 → `action` 降级为 `NONE`(不提交) + +--- + +### Stage 2 & 3: 策略执行与同步 + +**执行顺序**: 按 `sync_order` 顺序逐个处理 node_type + +**单个 node_type 的完整流程**: + +``` +For node_type in sync_order: + ┌─────────────────────────────────────────────┐ + │ 2.1 Bind - 绑定判定 │ + │ - 设置 binding_status: NORMAL/MISSING/... │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.2 Create - 创建策略 │ + │ - 处理 MISSING 节点,设置 action=CREATE │ + │ - 内联 ID 解析验证 (resolve_and_validate) │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.3 Commit Creates - 立即同步 CREATE │ + │ - DataSource.sync_all(poll_async=True) │ + │ - 自动过滤 action=CREATE 的节点 │ + │ - 内部包含异步轮询(IN_PROGRESS→SUCCESS)│ + │ - ⭐ 执行 data_id 回填和绑定更新 │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.4 Update - 更新策略 │ + │ - 处理差异节点,设置 action=UPDATE │ + │ - 内联 ID 解析验证 + data_id 检查 │ + │ - FAILED 节点自动跳过 │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.5 Commit Updates - 立即同步 UPDATE │ + │ - DataSource.sync_all(poll_async=True) │ + │ - 自动过滤 action=UPDATE 的节点 │ + │ - 内部包含异步轮询(IN_PROGRESS→SUCCESS)│ + └─────────────────────────────────────────────┘ + ↓ + 下一个 node_type +``` + +**关键特性**: +1. **按类型顺序**: 每个 node_type 完全同步后才处理下一个(保证依赖顺序) +2. **立即提交**: create/update 后立即同步,不等待所有策略执行完 +3. **内置轮询**: `sync_all(poll_async=True)` 内部自动轮询异步任务 +4. **data_id 回填**: CREATE 成功后立即回填 data_id,下游依赖可用 + +**同步状态转换**: + +**同步接口(一步式)**: +``` +action=CREATE, API 成功 → status=SUCCESS, data_id=<远程ID> +action=CREATE, API 失败 → status=FAILED, error=<错误信息> +action=UPDATE, API 成功 → status=SUCCESS +action=UPDATE, API 失败 → status=FAILED, error=<错误信息> +action=NONE → status=PENDING (不执行) +``` + +**异步接口(两步式,内置轮询)**: +``` +action=CREATE, 提交成功 → status=IN_PROGRESS, task_id=<任务ID> +status=IN_PROGRESS, 轮询中... → status=IN_PROGRESS (保持) +status=IN_PROGRESS, 轮询成功 → status=SUCCESS, data_id=<远程ID> +status=IN_PROGRESS, 轮询失败 → status=FAILED, error=<错误信息> +status=IN_PROGRESS, 超时 → status=FAILED, error="Timeout" +``` + +**关键副作用**(由 DataSource 在 sync_all 中执行): +- CREATE 成功: `data_id` 从 "" 更新为远程分配的 ID,并回写 `data` 主键字段 +- CREATE 成功: 绑定记录从临时ID更新为真实ID +- UPDATE 成功: `origin_data` 更新为当前 `data` +- DELETE 成功: 移除绑定记录 + +**skip_sync 处理**: +- 如果 `strategy.skip_sync = True`,跳过 create/update/commit 步骤 +- bind 步骤始终执行(用于状态判定) + +**详细规则**: 参考 [STATE_DEFINITIONS.md § 5](../sync_system/STATE_DEFINITIONS.md) + +--- + +### Stage 4: 同步结果报告 + +**目标**: 打印同步结果摘要,帮助用户了解同步情况 + +**报告内容**: +1. **节点统计**:按 node_type 统计各种 action/status 的节点数量 +2. **绑定关系**:每个 node_type 的绑定记录数 +3. **异常检查**:扫描并报告异常情况: + - CREATE 成功但 data_id 为空(DataSource 回填失败) + - CREATE 成功但绑定记录缺失 + - UPDATE/CREATE 失败的节点及错误原因 + +**输出示例**: +``` +================================================================================ +📊 Local Collection Summary +================================================================================ +Node Type Bindings Create Update Delete None Total +-------------------------------------------------------------------------------- +project 5/5 0(0/0/0) 2(2/0/0) 0(0/0/0) 3 5(5/0/0) +contract 10/12 2(2/0/0) 5(5/0/0) 0(0/0/0) 5 12(12/0/0) +``` + +**注意**: 此阶段不修改任何状态,仅作为信息展示。 + +--- + +### Stage 5: 状态持久化 + +**持久化内容**: +- `binding_status`, `action`, `status` 的最终值 +- `data_id` (可能在 CREATE 后更新) +- `error` (如果失败) +- 绑定关系的完整映射 + +--- + +## 错误处理策略 + +| 阶段 | 失败类型 | 处理策略 | +|------|---------|---------| +| Stage 0 | 初始化失败 | **终止流程**,抛出异常 | +| Stage 1 | 数据加载失败 | **终止流程**,抛出异常 | +| Stage 2 & 3 | 代码异常 | **终止流程**,抛出异常 | +| Stage 2: create/update 内联检查 | 依赖ID未解析、data_id缺失 | **继续流程**,节点标记为 DEPENDENCY_ERROR 或 PRECONDITION_FAILED | +| Stage 2 & 3 | API 调用失败 | **继续流程**,标记节点 FAILED | +| Stage 4 | - | 总是继续,仅作为报告 | +| Stage 5 | 持久化失败 | **记录错误**,不影响内存状态 | + +--- + +## 节点状态完整时间线 + +``` +┌──────────────┬─────────────┬────────┬────────┬─────────┐ +│ 阶段 │ binding_ │ action │ status │ data_id │ +│ │ status │ │ │ │ +├──────────────┼─────────────┼────────┼────────┼─────────┤ +│ 数据加载 │ UNCHECKED │ NONE │PENDING │ 已加载 │ +│ Bind │ NORMAL/... │ NONE │PENDING │ 已加载 │ +│ Create │ NORMAL │ CREATE │PENDING │ ""* │ +│ Commit Create│ NORMAL │ CREATE │SUCCESS │ 远程ID** │ +│ Update │ NORMAL │ UPDATE │PENDING │ 已加载 │ +│ Commit Update│ NORMAL │ UPDATE │SUCCESS │ 已加载 │ +└──────────────┴─────────────┴────────┴────────┴─────────┘ + +* 新创建的节点 data_id 初始为 "" +** CREATE 成功后 data_id 立即更新为远程分配的ID,下游依赖可用 +``` + +--- + +## 配置驱动的流程控制 + +### 跳过某些阶段 + +```python +pipeline_config = { + "skip_bind": False, # 是否跳过 bind + "skip_create": False, # 是否跳过 create + "skip_update": False, # 是否跳过 update + "skip_post_check": False, # 是否跳过同步后检查 + "fail_on_warning": False, # Pre-Check 时是否将 WARNING 视为失败 +} +``` + +> **注意**:`skip_pre_check` 已移除,原 `_pre_commit_check` 逻辑已内联到 create/update 方法中。 +``` + +### 策略预设应用 + +```python +# 首次同步:启用自动绑定,双向创建 +for strategy in strategies: + strategy.apply_preset("first_sync") + +# 日常同步:仅推送更新 +for strategy in strategies: + strategy.apply_preset("push_only") +``` + +--- + +## 幂等性保证 + +**要求**: 同一个 Collection 的多次同步应该是幂等的。 + +**设计保证**: +1. **Bind 阶段**: 基于绑定记录判定,已绑定节点不会重复绑定 +2. **Create 阶段**: 已有绑定的节点 (NORMAL) 不会重复创建 +3. **Update 阶段**: 基于 `compute_diff()` 判定,无差异则不执行 +4. **Sync 阶段**: `action=NONE` 的节点跳过执行 + +**前提条件**: +- 绑定记录正确持久化 +- 节点的 `binding_status` 正确保存和加载 +- `compute_diff()` 逻辑准确 + +--- + +## 监控和日志 + +### 关键指标 + +| 指标 | 含义 | 阶段 | +|------|------|-----| +| `nodes_loaded` | 加载的节点总数 | Stage 1 | +| `nodes_normal` | NORMAL 状态节点数 | Stage 2.1 | +| `nodes_missing` | MISSING 状态节点数 | Stage 2.1 | +| `nodes_abnormal` | ABNORMAL+WARNING 节点数 | Stage 2.1 | +| `nodes_dep_error` | DEPENDENCY_ERROR 节点数 | Stage 2.1 | +| `actions_create` | CREATE 动作节点数 | Stage 2.2 | +| `actions_update` | UPDATE 动作节点数 | Stage 2.3 | +| `sync_success` | 同步成功节点数 | Stage 3 | +| `sync_failed` | 同步失败节点数 | Stage 3 | +| `success_rate` | 成功率 (success/total) | Stage 4 | + +### 日志级别 + +``` +INFO: 流程阶段切换、统计信息 +DEBUG: 节点级别的详细操作 +WARN: 检查发现的警告、同步失败 +ERROR: 检查发现的错误、致命异常 +``` + +--- + +## 参考文档 + +- [STATE_DEFINITIONS.md](../sync_system/STATE_DEFINITIONS.md) - 详细的状态定义和转换规则 +- [CHECK_SPEC.md](./CHECK_SPEC.md) - 检查点的实现细节和代码示例(可选) +# 1. 持久化 Collection +await local_collection.persist() +await remote_collection.persist() + +# 2. 持久化 Binding +await binding_manager.persist() +``` + +**持久化内容**: +- 节点的 `binding_status`, `action`, `status`, `error` +- 节点的 `data_id`(可能在 CREATE 后更新) +- 绑定关系的完整映射 + +--- + +## 错误处理策略 + +### 各阶段的失败处理 + +| 阶段 | 失败原因示例 | 处理策略 | +|------|------------|---------| +| Stage 1: 数据加载 | 网络错误、文件缺失 | **终止流程**,抛出异常 | +| Stage 2.1: Bind | 代码bug | **终止流程**,抛出异常 | +| Stage 2.2-2.3: Create/Update | 代码bug | **终止流程**,抛出异常 | +| Stage 2: create/update 内联检查 | 依赖ID未解析、data_id缺失 | **继续流程**,节点标记为 DEPENDENCY_ERROR 或 PRECONDITION_FAILED | +| Stage 3: Physical Sync | API错误、权限不足 | **继续流程**,标记节点为 FAILED | +| Stage 4: Post-Sync Check | 部分节点同步失败 | **继续流程**,打印警告 | +| Stage 5: Persistence | 磁盘满、权限错误 | **记录错误**,但不影响内存状态 | + +### 部分成功的处理 + +在 Stage 3 中,允许部分节点成功、部分失败: +- 成功的节点: `status = SUCCESS` +- 失败的节点: `status = FAILED`, `error = "错误信息"` + +Post-Sync Check 会统计成功率并给出警告。 + +--- + +## 配置驱动的流程控制 + +### 跳过某些阶段 + +通过配置控制哪些阶段执行: + +```python +pipeline_config = { + "skip_bind": False, # 是否跳过 bind + "skip_create": False, # 是否跳过 create + "skip_update": False, # 是否跳过 update + "skip_post_check": False, # 是否跳过同步后检查 + "fail_on_warning": False, # 是否将 WARNING 也视为失败 +} +``` + +### 策略预设应用 + +在 Stage 2 之前,可以应用策略预设: + +```python +# 首次同步:启用自动绑定,双向创建 +for strategy in strategies: + strategy.apply_preset("first_sync") + +# 日常同步:仅推送更新 +for strategy in strategies: + strategy.apply_preset("push_only") +``` + +--- + +## 监控和日志 + +### 关键指标 + +在各阶段收集以下指标: + +| 指标 | 含义 | +|------|------| +| `nodes_loaded` | 加载的节点总数 | +| `nodes_bound` | 成功绑定的节点数 | +| `nodes_missing` | MISSING 状态的节点数 | +| `nodes_abnormal` | ABNORMAL/WARNING 状态的节点数 | +| `nodes_created` | CREATE 动作的节点数 | +| `nodes_updated` | UPDATE 动作的节点数 | +| `sync_success` | 同步成功的节点数 | +| `sync_failed` | 同步失败的节点数 | +| `errors_count` | 检查发现的 ERROR 数量 | +| `warnings_count` | 检查发现的 WARNING 数量 | + +### 日志级别 + +``` +INFO: 流程阶段切换、统计信息 +DEBUG: 节点级别的详细操作 +WARN: 检查发现的警告 +ERROR: 检查发现的错误、异常 +``` + +--- + +## 幂等性保证 + +**要求**: 同一个 Collection 的多次同步应该是幂等的。 + +**设计保证**: +1. **Bind 阶段**: 基于绑定记录判定状态,已绑定的节点不会重复绑定 +2. **Create 阶段**: 已有绑定的节点(NORMAL)不会重复创建 +3. **Update 阶段**: 基于 `compute_diff()` 判定,无差异则不执行 +4. **Sync 阶段**: DataSource 根据 `action` 执行,`action=NONE` 的节点跳过 + +**前提条件**: +- Binding 记录正确持久化 +- 节点的 `binding_status` 正确保存和加载 +- `compute_diff()` 逻辑准确 + +--- + +## 下一步 + +详细的检查规范和状态转换规则,请参考: +- [CHECK_SPEC.md](./CHECK_SPEC.md) - 检查点详细规范 +- [STATE_TRANSITIONS.md](./STATE_TRANSITIONS.md) - 状态转换表 + diff --git a/docs/archive/docs/节点生命周期状态转移.md b/docs/archive/docs/节点生命周期状态转移.md new file mode 100644 index 0000000..0d2ec10 --- /dev/null +++ b/docs/archive/docs/节点生命周期状态转移.md @@ -0,0 +1,492 @@ +# 节点生命周期状态转移 (Node Lifecycle State Transitions) + +本文档从一个**单节点视角**出发,完整描述一个 `SyncNode` 从诞生到持久化的全部状态变化。 + +> **代码映射**: +> - 持久化重置:`sync_system_new/common/state_reset.py` → `NodeStateReset` +> - 绑定判定:`sync_system_new/sync_system/decision.py` → `SyncDecisionEngine` +> - 策略执行:`sync_system_new/sync_system/strategy.py` → `DefaultSyncStrategy` +> - ID 解析:`sync_system_new/sync_system/resolve_ids.py` → `IDResolver` +> - 物理同步:`sync_system_new/datasource/datasource.py` → `BaseDataSource` +> - Handler 降级:`sync_system_new/domain/*/api_handler.py` + +--- + +## 状态字段一览 + +| 字段 | 类型 | 含义 | 谁负责设置 | +|------|------|------|-----------| +| `binding_status` | BindingStatus | 绑定健康状态 | Strategy.bind() | +| `action` | SyncAction | 待执行动作 | Strategy.create() / update() | +| `status` | SyncStatus | 执行结果状态 | DataSource.sync_all() | +| `data_id` | str | 业务主键ID | 数据加载 / DataSource 回填 | +| `error` | str \| None | 错误信息 | 各阶段 | + +--- + +## 完整生命周期 + +### 第一次运行(无持久化数据) + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 节点尚不存在 │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 数据源加载 (Stage 1) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 节点诞生 │ +│ │ +│ binding_status = UNCHECKED ← Collection 创建节点时的初始值 │ +│ action = NONE │ +│ status = PENDING │ +│ data_id = "abc-123" ← 从数据源获取的业务主键 │ +│ data = {...} ← 从数据源获取的业务数据 │ +│ origin_data = {...} ← 同上,原始快照 │ +│ depend_ids = [] ← 空,待 bind 阶段填充 │ +│ error = None │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +### 第二次及后续运行(有持久化数据) + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 从持久化恢复(原始值) │ +│ │ +│ binding_status = NORMAL (上次值) │ +│ action = UPDATE (上次值) │ +│ status = SUCCESS (上次值) │ +│ data_id = "abc-123" │ +│ error = None (上次值) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 阶段1:加载时重置 (NodeStateReset) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 阶段1重置后 │ +│ │ +│ binding_status = UNCHECKED ← 重置(每次重新判定) │ +│ action = UPDATE ← 保留!(用于阶段2识别 CREATE 失败) │ +│ status = SUCCESS ← 保留!(不自动重置) │ +│ data_id = "abc-123" ← 不变 │ +│ data = None ← 重置(等待数据源覆盖) │ +│ origin_data = None ← 重置(等待数据源覆盖) │ +│ error = None ← 清空(避免上次错误干扰) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 阶段2:CREATE 僵尸清理 + (只影响 action=CREATE 且 status=FAILED 或 data_id="" 的节点) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 阶段2清理后(正常节点) │ +│ │ +│ action = NONE ← 全部重置为 NONE,准备进入策略阶段 │ +│ 其他字段不变 │ +│ │ +│ (若为 CREATE 僵尸节点:直接从 Collection 删除 + 解除绑定) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 数据源加载覆盖 (Stage 1 后半) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 数据源加载后 │ +│ │ +│ data = {...} ← 数据源最新数据覆盖 │ +│ origin_data = {...} ← 数据源最新数据覆盖 │ +│ 其他字段不变 │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Bind 阶段状态转移 (Stage 2.1) + +Bind 分三个子阶段顺序执行,每个子阶段只修改 `binding_status`。 + +### Phase 1: 核心状态判定 + +> **代码**:`_phase_core_state()` → `SyncDecisionEngine.determine_core_status()` + +``` +输入:binding_status = UNCHECKED + + ┌─ 有绑定记录? + │ + ┌─────┤ + │ YES │ + │ └─── 本地数据 + 远程数据 都健康? + │ │ + │ ┌────┴────┐ + │ │ YES │ NO + │ ▼ ▼ + │ NORMAL WARNING / ABNORMAL + │ + │ NO + └──────────────► MISSING +``` + +| 输入条件 | binding_status 输出 | +|---------|-------------------| +| 有绑定,双方数据健康 | **NORMAL** | +| 有绑定,自身数据损坏 | **ABNORMAL** | +| 有绑定,对方数据损坏 | **WARNING** | +| 无绑定记录 | **MISSING** | + +### Phase 2: 依赖检查 + +> **代码**:`_phase_dependency_check()` → `_check_dependencies_for_nodes()` + +**仅处理 `binding_status = MISSING` 的节点**,其他状态跳过。 + +``` +输入:binding_status = MISSING + + ┌─ 有配置 depend_fields? + │ + ┌─────┤ + │ NO └──► 保持 MISSING(无依赖,直接通过) + │ + │ YES ──► 逐一检查依赖节点: + │ │ + │ ┌────┴────────────────────────┐ + │ │ 全部依赖节点: │ + │ │ - 存在? ✅ │ + │ │ - binding_status=NORMAL? ✅ │ + │ │ - data_id 非空? ✅ │ + │ └────┬────────────────────────┘ + │ │ + │ ┌────┴────┐ + │ │ 全通过 │ 任一失败 + │ ▼ ▼ + │ MISSING DEPENDENCY_ERROR + │ + error = "依赖项不满足: ..." + │ + depend_ids 已填充 +``` + +**副作用**:无论检查是否通过,都会填充 `node.depend_ids`。 + +### Phase 3: 自动绑定 + +> **代码**:`_phase_auto_binding()` + +**仅处理 `binding_status = MISSING` 且依赖已通过的节点**。 + +``` +输入:binding_status = MISSING + +auto_bind = False? + └──► MISSING → WARNING("跳过自动绑定,无法确认是否需要创建") + +auto_bind = True: + │ + ├─ 业务键字段缺失? + │ └──► MISSING → WARNING("缺少业务键字段: ...") + │ + ├─ 业务键中 ID 字段解析失败? + │ └──► MISSING → DEPENDENCY_ERROR("业务键中的ID字段解析失败") + │ + ├─ 去噪后 1:1 匹配? + │ └──► MISSING → NORMAL(执行自动绑定,建立绑定记录) + │ + ├─ N:0(无远程匹配)? + │ ├──► create_enabled = True → MISSING → NORMAL,并 spawn 目标 CREATE 节点(S06) + │ └──► create_enabled = False → MISSING → WARNING(孤儿且不允许自动创建,需人工处理) + │ + └─ N:M / 多对多 / 多对一? + └──► MISSING → WARNING("存在多个候选节点,无法自动绑定") +``` + +### Bind 阶段结束后可能的状态 + +| binding_status | 后续可执行的操作 | +|---------------|----------------| +| **NORMAL** | UPDATE(如有差异)| +| **MISSING** | CREATE | +| **ABNORMAL** | 无(需人工) | +| **WARNING** | 无(阻止自动操作) | +| **DEPENDENCY_ERROR** | 无(等待依赖修复) | + +--- + +## Create 阶段状态转移 (Stage 2.2) + +> **代码**:`create()` → `_add_create_action()` + +> **对齐说明(与状态机配置一致)**: +> - create_prepare 的入口仍是源节点 `binding_status = MISSING`。 +> - 但当前配置下,`N:0 + create_enabled=true` 可以在自动绑定阶段直接把源节点转为 `NORMAL`,并 `emit spawn_target_node_state=S06`。 +> - 因此“触发创建”的入口有两条: +> 1) auto_bind 分支(E08f)直接 spawn; +> 2) create_prepare 分支(E09b)在 create 检查成功后 spawn。 + +**仅处理 `binding_status = MISSING` 的节点**。 + +``` +输入:源节点 binding_status = MISSING, action = NONE + + ┌─ 源节点数据为空? + │ └──► 跳过,记录日志 + │ + ├─ IDResolver.resolve_and_validate() 失败? + │ └──► binding_status → DEPENDENCY_ERROR + │ error = "创建时依赖 ID 未解析: ..." + │ + └─ 成功 ──► 在目标 Collection 创建新节点 + │ + ├─ 源节点: + │ binding_status → NORMAL("从本地创建到远程") + │ action 不变(仍为 NONE) + │ + └─ 新建目标节点: + binding_status = NORMAL + action = CREATE + status = PENDING + data_id = ""(待远程返回) + data = 已替换 ID 的数据副本 + │ + └─ 同时建立绑定记录:local_id ↔ remote_id +``` + +--- + +## Commit Creates — 物理同步 (Stage 2.3) + +> **代码**:`DataSource.sync_all()` → Handler.create() + +``` +输入:action = CREATE, status = PENDING + + ┌─ Handler 执行 API 调用 + │ + ├─ 同步 API 成功(200/201) + │ └──► status → SUCCESS + │ data_id = "remote-xyz"(远程分配的 ID 回填) + │ data["id"] = "remote-xyz"(主键字段回写) + │ + ├─ 异步 API 提交成功(202) + │ └──► status → IN_PROGRESS + │ context.task_id = "task-xxx" + │ │ + │ └─ 轮询结果: + │ ├─ 成功 → status → SUCCESS, data_id 回填 + │ ├─ 失败 → status → FAILED, error = "..." + │ └─ 超时 → status → FAILED, error = "Timeout" + │ + └─ API 失败(4xx/5xx) + └──► status → FAILED + error = "远程操作失败: ..." +``` + +--- + +## Update 阶段状态转移 (Stage 2.4) + +> **代码**:`update()` → `_add_update_action()` + +> **对齐说明**:图里的 `E12a` 从 `S01` 出发并不矛盾。`S01` 约束的是“源节点”有 `data_id`; +> `E12a` 检查的是“目标节点”是否有 `data_id`(guard: `target_has_data_id=false`),两者不是同一个对象。 + +**过滤条件**:`binding_status = NORMAL` 且 `status != FAILED` + +``` +输入:源节点 binding_status = NORMAL, action = NONE + + ┌─ status == FAILED? + │ └──► 跳过(保护上次失败的状态和错误信息) + │ + ├─ 源节点数据为空? + │ └──► 跳过 + │ + ├─ 通过绑定找不到目标节点? + │ └──► 跳过,记录日志 + │ + ├─ 目标节点 data_id 为空? + │ └──► 目标节点 status → PRECONDITION_FAILED + │ ("目标节点缺少 data_id") + │ + ├─ IDResolver.resolve_and_validate() 失败? + │ └──► 目标节点 action → UPDATE + │ 目标节点 status → PRECONDITION_FAILED + │ 目标节点 error = "依赖 ID 未解析: ..." + │ + ├─ _needs_update() 判定无差异? + │ └──► 跳过(不设置 action) + │ + └─ 有差异 ──► 更新目标节点: + action → UPDATE + status → PENDING + data = 已替换 ID 的数据副本 + error = None +``` + +--- + +## Commit Updates — 物理同步 (Stage 2.5) + +> **代码**:`DataSource.sync_all()` → Handler.update() + +``` +输入:action = UPDATE, status = PENDING + + ┌─ Handler 构建 API 请求 + │ + ├─ Handler 发现无实际变更字段 + │ └──► action → NONE(Handler 降级,不提交 API) + │ + ├─ 同步 API 成功(200) + │ └──► status → SUCCESS + │ + ├─ 异步 API 提交成功(202) + │ └──► status → IN_PROGRESS → (轮询)→ SUCCESS / FAILED + │ + └─ API 失败 + └──► status → FAILED + error = "远程操作失败: ..." +``` + +--- + +## 持久化阶段 (Stage 5) + +``` +节点当前状态原样写入存储。 + +持久化字段: + ✅ node_id, data_id, data, origin_data + ✅ binding_status, action, status, error, context + ❌ depend_ids(不持久化,下次 bind 时从 data 实时计算) +``` + +--- + +## 全景时间线表 + +下表展示**一个节点在典型场景中的状态变化**: + +### 场景 A:首次创建(本地 → 远程) + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 数据加载 | UNCHECKED | NONE | PENDING | "abc-123" | None | +| bind phase1 | **MISSING** | NONE | PENDING | "abc-123" | None | +| bind phase2 | MISSING | NONE | PENDING | "abc-123" | None | +| bind phase3 | MISSING | NONE | PENDING | "abc-123" | None | +| create | **NORMAL** | NONE | PENDING | "abc-123" | None | +| _(新建远程节点)_ | NORMAL | **CREATE** | PENDING | **""** | None | +| commit create | NORMAL | CREATE | **SUCCESS** | **"remote-456"** | None | +| 持久化 | NORMAL | CREATE | SUCCESS | "remote-456" | None | + +### 场景 B:日常更新 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 持久化恢复 | NORMAL→**UNCHECKED** | CREATE→保留 | SUCCESS→保留 | "abc-123" | 清空 | +| 阶段2 action重置 | UNCHECKED | **NONE** | SUCCESS | "abc-123" | None | +| 数据源覆盖 | UNCHECKED | NONE | SUCCESS | "abc-123" | None | +| bind phase1 | **NORMAL** | NONE | SUCCESS | "abc-123" | None | +| update 检测差异 | NORMAL | NONE | SUCCESS | "abc-123" | None | +| _(目标节点)_ | NORMAL | **UPDATE** | **PENDING** | "remote-456" | None | +| commit update | NORMAL | UPDATE | **SUCCESS** | "remote-456" | None | + +### 场景 C:依赖阻断 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 数据加载 | UNCHECKED | NONE | PENDING | "contract-789" | None | +| bind phase1 | **MISSING** | NONE | PENDING | "contract-789" | None | +| bind phase2 | **DEPENDENCY_ERROR** | NONE | PENDING | "contract-789" | "依赖项不满足: project_id: 状态=dep_err" | +| _(后续阶段不处理)_ | | | | | | +| 持久化 | DEPENDENCY_ERROR | NONE | PENDING | "contract-789" | "依赖项不满足..." | + +### 场景 D:CREATE 失败 → 下次自动恢复 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| **第 1 次运行** | | | | | | +| create | NORMAL | CREATE | PENDING | "" | None | +| commit create 失败 | NORMAL | CREATE | **FAILED** | "" | "远程操作失败: 500" | +| 持久化 | NORMAL | CREATE | FAILED | "" | "远程操作失败: 500" | +| **第 2 次运行** | | | | | | +| 阶段1恢复 | **UNCHECKED** | CREATE | FAILED | "" | **None** | +| 阶段2僵尸清理 | _(节点被删除,绑定被解除)_ | | | | | +| 数据源重新加载 | UNCHECKED | NONE | PENDING | "" → 新 node_id | None | +| bind → create | 重新走首次创建流程 | | | | | + +### 场景 E:UPDATE 失败 → 保留供人工处理 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| **第 1 次运行** | | | | | | +| update | NORMAL | UPDATE | PENDING | "remote-456" | None | +| commit update 失败 | NORMAL | UPDATE | **FAILED** | "remote-456" | "403 Forbidden" | +| 持久化 | NORMAL | UPDATE | FAILED | "remote-456" | "403 Forbidden" | +| **第 2 次运行** | | | | | | +| 阶段1恢复 | UNCHECKED | UPDATE | FAILED | "remote-456" | None | +| 阶段2 action重置 | UNCHECKED | **NONE** | **FAILED** | "remote-456" | None | +| bind | NORMAL | NONE | FAILED | "remote-456" | None | +| update 跳过 | _(status=FAILED,自动跳过)_ | | | | | +| 持久化 | NORMAL | NONE | FAILED | "remote-456" | None | +| _(需人工重置 status 后才能重新更新)_ | | | | | | + +--- + +## 状态转换合法性约束 + +### binding_status 允许的转换 + +``` +UNCHECKED → NORMAL (核心判定: 有绑定且健康) +UNCHECKED → MISSING (核心判定: 无绑定记录) +UNCHECKED → ABNORMAL (核心判定: 自身数据损坏) +UNCHECKED → WARNING (核心判定: 对方数据损坏) + +MISSING → DEPENDENCY_ERROR (依赖检查: 父节点不满足) +MISSING → WARNING (自动绑定: 业务键缺失 / 多候选 / auto_bind=False) +MISSING → DEPENDENCY_ERROR (自动绑定: ID 字段解析失败) +MISSING → NORMAL (自动绑定: 1:1 成功) +MISSING → NORMAL (create: 源节点创建成功后) +MISSING → DEPENDENCY_ERROR (create: ID 解析失败) +``` + +> **注意**:当前 `SyncNode.set_binding_status()` 不做转换合法性校验【未实现】。 + +### action 允许的转换 + +``` +NONE → CREATE (create: 新建目标节点) +NONE → UPDATE (update: 检测到差异) +UPDATE → NONE (Handler 降级: 实际无变更字段) +``` + +### status 允许的转换 + +``` +PENDING → IN_PROGRESS (DataSource: 异步提交成功) +PENDING → SUCCESS (DataSource: 同步执行成功) +PENDING → FAILED (DataSource: 执行失败) +PENDING → SKIPPED (DataSource: 被跳过) + (常见于 CREATE/UPDATE:Handler 返回 SKIPPED(无可执行操作/业务条件不满足),对应状态机里的 E19→S13 或 E20→S14) +PENDING → PRECONDITION_FAILED (Strategy: 前置条件不满足) +IN_PROGRESS → SUCCESS (DataSource: 异步轮询成功) +IN_PROGRESS → FAILED (DataSource: 异步轮询失败/超时) +``` + +> **注意**:当前 `SyncNode.set_status()` 不做转换合法性校验【未实现】。 + +--- + +## 参考文档 + +- [状态定义规范](./状态定义规范.md) — 状态枚举和判定规则 +- [持久化与人工介入规范](./持久化与人工介入规范.md) — 持久化重置策略 +- [编排流程规范](./编排流程规范.md) — Pipeline 阶段定义 +- [架构分层设计](./架构分层设计.md) — 各层职责 +- [node_id_data_id_lifecycle](./node_id_data_id_lifecycle.md) — ID 生命周期 diff --git a/docs/archive/from_root_docs/README.md b/docs/archive/from_root_docs/README.md new file mode 100644 index 0000000..8199c29 --- /dev/null +++ b/docs/archive/from_root_docs/README.md @@ -0,0 +1,14 @@ +# Root docs migration note + +本目录为从项目根目录 `docs/` 迁移过来的文档快照(全量复制,不跳过)。 + +目的: +- 保留原始设计背景与历史规范,便于在 `sync_state_machine` 目录内就地查阅; +- 与当前 `sync_state_machine/docs/` 的“现行实现文档”并存。 + +使用建议: +- 以 `sync_state_machine/docs/` 下现行文档(如 `state_machine.md`、`sync_flow.md`、`architecture.md`)作为运行时真义; +- 本目录文档作为历史参考来源,遇到冲突时以现行实现与状态机配置为准: + - `sync_state_machine/config/node_state_machine.yaml` + - `sync_state_machine/sync_system/strategy.py` + - `sync_state_machine/engine/semantics.py` diff --git a/docs/archive/from_root_docs/api_datasource_design.md b/docs/archive/from_root_docs/api_datasource_design.md new file mode 100644 index 0000000..5b3db2c --- /dev/null +++ b/docs/archive/from_root_docs/api_datasource_design.md @@ -0,0 +1,706 @@ +# API DataSource 架构设计 + +## 架构总览 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Pipeline │ +│ (同步流程编排) │ +└───────────────────────────┬─────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ ApiDataSource │ +│ (数据源协调层) │ +│ │ +│ - 持有 ApiClient 实例 │ +│ - 注册和管理 Handler │ +│ - 实现 load_all / execute_batch │ +│ - 注入 api_client 到 Handler │ +└───────────────────────────┬─────────────────────────────────┘ + │ + ┌───────────────────┼───────────────────┐ + ▼ ▼ ▼ +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ Handler │ │ Handler │ │ Handler │ +│ Project │ │ Contract │ │ Material │ +│ │ │ │ │ │ +│ 业务逻辑层 │ │ 业务逻辑层 │ │ 业务逻辑层 │ +└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ + │ │ │ + └───────────────────┼───────────────────┘ + │ 使用 self.api_client + ▼ + ┌──────────────┐ + │ ApiClient │ + │ (HTTP 通信层) │ + │ │ + │ - 签名生成 │ + │ - HTTP 请求 │ + │ - Push Log │ + └──────────────┘ +``` + +**调用流程**: +1. Pipeline 创建 ApiDataSource,传入 base_url, uid, secret +2. ApiDataSource 内部创建 ApiClient 实例 +3. ApiDataSource 注册各业务 Handler,并注入 api_client +4. Handler 使用 `self.api_client.get/post/put()` 发送请求 +5. ApiClient 自动处理签名、push_log 查询、错误处理 + +**优势**: +- ✅ **职责清晰**:ApiClient(通信)、DataSource(协调)、Handler(业务) +- ✅ **避免循环依赖**:Handler → ApiClient(单向依赖) +- ✅ **易于测试**:ApiClient 可 mock,Handler 独立测试 +- ✅ **易于扩展**:新业务只需实现 Handler + +## 1. 问题分析:旧方案的复杂性 + +旧方案 `sync_system/datasource/api` 存在的问题: + +1. **过度抽象**:引入了 `ApiDataSource` → `Repository` → `ResponseHandle` → `Cache` 多层封装,每个业务需要独立 Repository 类,Protocol 定义繁琐 +2. **状态管理混乱**:缓存策略不清晰,ResponseHandle 封装异步结果但使用困难,缺少统一的 push_log 查询机制 +3. **依赖关系困难**:Repository 之间互相传递引用,难以从 collection 获取已有数据 +4. **API 路由分散**:每个 Repository 手动实现多个 update 方法,缺少自动路由机制 + +## 2. 新方案设计原则 + +- **简单直接**:Handler 直接调用 HTTP API,不过度封装 +- **状态透明**:DataSource 统一管理 session、签名、push_log 查询 +- **依赖清晰**:通过 collection 获取依赖数据,使用 context 存储额外信息 +- **智能路由**:根据数据字段自动选择 API endpoint + +## 3. 核心组件职责 + +### 3.1 ApiClient - HTTP 通信层 + +**职责**: +- 封装所有 HTTP 通信逻辑 +- 管理 httpx.AsyncClient,维护连接池和 session +- 生成请求签名(timestamp, nonce, sign) +- 统一请求入口,自动注入 uid +- 批量 Push Log 查询 + +**核心方法**: +```python +class ApiClient: + def __init__(self, base_url: str, uid: str, secret: str): + self._client = httpx.AsyncClient() + self._base_url = base_url + self._uid = uid + self._secret = secret + + async def request(self, method: str, url: str, **kwargs) -> httpx.Response + """统一请求入口,自动签名""" + + async def get(self, url: str, params: dict = None) -> httpx.Response + """GET 请求""" + + async def post(self, url: str, data: dict) -> httpx.Response + """POST 请求,data 中已包含 push_id/biz_id(由 Handler 生成)""" + + async def put(self, url: str, data: dict) -> httpx.Response + """PUT 请求,data 中已包含 push_id/biz_id""" + + async def delete(self, url: str, data: dict) -> httpx.Response + """DELETE 请求,data 中已包含 push_id/biz_id""" + + async def get_push_logs(self, push_ids: List[str]) -> Dict[str, dict] + """批量查询 push_log 状态,返回 {push_id: push_log_data} + 注意:单个查询也传单元素列表 + 当前实现:用 for 循环模拟,后续等后端实现批量接口 + """ + + def _generate_signature(self, params: dict) -> dict + """生成签名参数(timestamp, nonce, sign)""" +``` + +### 3.2 ApiDataSource - 数据源协调层 + +**职责**: +- 持有 ApiClient 实例,提供给 Handler 使用 +- 实现 DataSource 接口(load_all, sync_all) +- 协调多个 Handler 的执行顺序(通过 sync_all) +- Handler 内部负责:生成 push_id/biz_id、调用 poll 轮询、提取 created_id +- 统一异常处理和日志记录 + +**核心属性和方法**: +```python +class ApiDataSource(DataSource): + def __init__(self, base_url: str, uid: str, secret: str): + self.client = ApiClient(base_url, uid, secret) + self._handlers: Dict[str, BaseApiHandler] = {} + + def register_handler(self, node_type: str, handler: BaseApiHandler): + """注册业务 Handler""" + handler.api_client = self.client # 注入 client + self._handlers[node_type] = handler + + async def load_all(self, collection: DataCollection, order: List[str]) -> None: + """调用基类的 load_all,按顺序加载数据""" + + async def sync_all(self, collection: DataCollection, order: List[str]) -> None: + """调用基类的 sync_all,按顺序执行同步""" +``` + +### 3.3 BaseApiHandler - 业务逻辑基类 + +**职责**: +- 实现 Handler 接口(load, create, update, delete, poll) +- 使用 self.api_client 发送 HTTP 请求 +- 生成 push_id 和 biz_id(业务标识) +- 从 collection 获取依赖节点数据 +- 管理节点的 context(存储 project_id, contract_id 等) +- 实现 poll 方法,调用 api_client.get_push_logs 批量查询 +- 提取 created_id(因为不同业务的 id 字段名和位置可能不同) +- 返回 TaskResult(SUCCESS/FAILED/IN_PROGRESS) + +**核心方法**: +```python +class BaseApiHandler(NodeHandler): + def __init__(self): + self.api_client: ApiClient = None # 由 DataSource 注入 + self.collection: DataCollection = None # 由 DataSource 注入 + + async def load(self, collection: DataCollection) -> List[dict] + async def create(self, node: SyncNode) -> TaskResult + async def update(self, node: SyncNode) -> TaskResult + async def delete(self, node: SyncNode) -> TaskResult + async def poll(self, node: SyncNode, task_id: str) -> TaskResult + + def extract_created_id(self, push_log: dict) -> str + """从 push_log 提取 created_id,子类可重写""" + + # 重试逻辑(可选,子类可重写) + async def _execute_with_retry(self, operation, max_retries: int = 3) -> Any + """通用重试逻辑,子类可自定义重试策略""" +``` + +**重试策略说明**: +- **重试在 Handler 内部**:create/update/delete 内部可调用 _execute_with_retry +- **返回给 DataSource**:最终只返回 SUCCESS/FAILED/IN_PROGRESS +- **灵活控制**:不同业务可重写 _execute_with_retry 实现自定义策略 +- **默认策略**:网络错误/5xx 重试 3 次,4xx 不重试 + +**未实现 API 的处理**: +- 部分业务可能没有实现 create 或 delete API +- 此时 Handler 应在对应方法中直接返回 FAILED 状态,并在 error 中说明原因 +- 示例:`return TaskResult(status=TaskStatus.FAILED, error="Create API not implemented for this business")` + +### 3.4 具体业务 Handler + +**职责**: +- 实现具体业务的 load 逻辑(调用 self.api_client.get()) +- 创建节点时设置 context +- 重写 API endpoint 选择逻辑(可选) +- 定制 created_id 提取逻辑(可选) + +每个业务 Handler 位于 `sync_system_new/domain/{业务}/api_handler.py` + +## 4. HTTP 请求状态管理 + +### 4.0 状态系统概述 + +**通用状态枚举**(适用于所有 DataSource): + +```python +class TaskStatus(Enum): + """Handler 返回的任务执行状态""" + SUCCESS = "success" # 同步完成,立即成功 + FAILED = "failed" # 同步失败 + IN_PROGRESS = "in_progress" # 异步任务进行中 + +class SyncStatus(Enum): + """SyncNode 的同步执行状态""" + PENDING = "PENDING" + IN_PROGRESS = "IN_PROGRESS" + SUCCESS = "SUCCESS" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + PRECONDITION_FAILED = "PRECONDITION_FAILED" +``` + +**状态映射规则**: +- TaskStatus 是 Handler 执行操作后的返回值 +- SyncStatus 是 SyncNode 的最终状态,由 DataSource 根据 TaskStatus 更新 +- 普通 DataSource(FileDataSource)和 API DataSource 使用相同的状态枚举 +- 区别在于:**API DataSource 的网络操作如何转化为 TaskStatus** + +**重要说明:Load 阶段 vs 执行阶段的状态**: +- **Load 阶段**(Handler.load()):从 API 拉取数据创建 SyncNode + - 此时节点状态为 `PENDING`(等待后续 bind/create/update) + - GET 请求失败不影响节点创建,只是该节点不存在于 collection +- **执行阶段**(Handler.create/update/delete):执行同步操作 + - DataSource 在调用前设置 `node.status = IN_PROGRESS` + - Handler 返回 TaskResult,DataSource 据此更新 node.status + - POST/PUT/DELETE 成功后才设置为 SUCCESS + +**核心映射逻辑**(在 DataSource 中): +```python +# 执行前:DataSource 设置状态 +node.status = SyncStatus.IN_PROGRESS + +# 调用 Handler(Handler 内部可能重试多次) +result = await handler.create(node) + +# 执行后:DataSource 根据最终结果更新状态 +if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + node.data_id = result.data_id +elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error +elif result.status == TaskStatus.IN_PROGRESS: + # 记录 task_id 等待轮询 + async_tasks[node.node_id] = result.task_id +``` + +**重要**:Handler 负责重试,最终只返回确定的结果(SUCCESS/FAILED/IN_PROGRESS) + +### 4.1 请求类型与状态流转 + +**API DataSource 的特殊性**: +- **Load 阶段**:GET 请求拉取数据,创建 PENDING 节点(失败则不创建节点) +- **执行阶段**:POST/PUT/DELETE 先设置 IN_PROGRESS,通过 poll() 轮询变为 SUCCESS/FAILED + +#### Load 阶段 - 数据拉取 + +**目的**:从 API 获取数据,创建 SyncNode 放入 collection + +| 阶段 | HTTP 操作 | 成功行为 | 失败行为 | 节点状态 | +|------|----------|---------|---------|---------| +| 1. 调用 load() | GET /api/list | 返回数据列表 | 返回空列表或抛异常 | - | +| 2. 创建节点 | - | 为每条数据创建 SyncNode | 不创建节点 | PENDING | + +**代码示例**: +```python +async def load(self, collection: DataCollection) -> List[dict]: + """加载数据 - GET 阶段不涉及状态转换""" + try: + response = await self.api_client.get("project/list") + if response.status_code == 200: + data_list = response.json().get("list", []) + # 返回数据,由 DataSource 创建 PENDING 节点 + return data_list + else: + # 失败:返回空列表,不创建节点 + logger.error(f"Load failed: {response.status_code}") + return [] + except Exception as e: + logger.error(f"Load exception: {e}") + return [] # 或者抛出异常,由调用方处理 +``` + +#### Mutation 请求(POST/PUT/DELETE) - 执行阶段 + +**状态变化时机**: +1. **执行前**:DataSource 设置 `node.status = IN_PROGRESS` +2. **Handler 执行**:内部可能重试,最终返回 SUCCESS/FAILED/IN_PROGRESS +3. **轮询完成**:poll() 返回 SUCCESS/FAILED + +| 阶段 | Push Log | TaskStatus | SyncStatus | 说明 | +|------|---------|-----------|-----------|------| +| 执行前 | - | - | PENDING → IN_PROGRESS | DataSource 设置 | +| 提交 | pending | IN_PROGRESS | IN_PROGRESS | 任务已提交 | +| 轮询 | processing | IN_PROGRESS | IN_PROGRESS | 后端处理中 | +| 成功 | success | SUCCESS | SUCCESS | 同步完成 | +| 失败 | failed | FAILED | FAILED | 同步失败 | + +**示例**: +```python +async def create(self, node: SyncNode) -> TaskResult: + """Handler 内部可重试,最终返回确定结果""" + response = await self.api_client.post(url, node.data) + if response.status_code == 202: + return TaskResult.in_progress(task_id=response.json()["push_id"]) + else: + return TaskResult.failed(error=f"HTTP {response.status_code}") + +async def poll(self, node: SyncNode, task_id: str) -> TaskResult: + push_logs = await self.api_client.get_push_logs([task_id]) + status = push_logs.get(task_id, {}).get("status") + if status == "success": + return TaskResult.success(data_id=self.extract_created_id(push_logs[task_id])) + elif status == "failed": + return TaskResult.failed(error="Backend processing failed") + else: + return TaskResult.in_progress(task_id=task_id) +``` + +### 4.2 状态转换完整流程 + +``` +Load 阶段: + Handler.load() → 返回数据列表 → DataSource 创建 PENDING 节点 + +执行阶段(同步操作): + DataSource: node.status = IN_PROGRESS + → Handler.create() → TaskResult.success/failed() + → DataSource: node.status = SUCCESS/FAILED + +执行阶段(异步操作): + DataSource: node.status = IN_PROGRESS + → Handler.create() → TaskResult.in_progress(push_id) + → DataSource 轮询: Handler.poll(push_id) + → TaskResult.success/failed() + → DataSource: node.status = SUCCESS/FAILED +``` + +**关键点**: +- Handler 负责重试,DataSource 只处理最终结果 +- 不同业务可在 BaseApiHandler._execute_with_retry 中自定义重试策略 +- FileDataSource 和 ApiDataSource 使用相同的状态枚举和转换逻辑 + +### 4.3 Push Log 状态机 + +``` +pending → processing → success/failed +``` + +- 轮询间隔:0.5秒 +- 超时:30秒 +- 成功:提取 created_id +- 失败:获取 error_message + +### 4.4 状态总结表 + +**Load 阶段(数据拉取)**: + +| HTTP 操作 | 响应码 | 行为 | 创建节点 | 节点状态 | 说明 | +|---------|-------|-----|---------|---------|------| +| GET /list | 200 | 返回数据列表 | ✅ 是 | PENDING | 等待后续 bind/create/update | +| GET /list | 4xx/5xx | 返回空列表 | ❌ 否 | - | 不创建节点 | + +**执行阶段(POST/PUT/DELETE)**: + +| HTTP 操作 | 响应码 | Push Log | TaskStatus | SyncStatus | 说明 | +|---------|-------|---------|-----------|-----------|------| +| POST/PUT | 202 | pending | IN_PROGRESS | IN_PROGRESS | 异步开始 | +| - | - | processing | IN_PROGRESS | IN_PROGRESS | 异步处理中 | +| - | - | success | SUCCESS | SUCCESS | 异步成功 | +| - | - | failed | FAILED | FAILED | 异步失败 | +| - | - | timeout | FAILED | FAILED | 轮询超时 | + +## 5. Context 机制 + +### 5.1 Context 的作用 + +Context 是 SyncNode 的字典字段,用于存储业务数据之外的上下文信息,例如: +- `project_id`: 当前对象所属的项目ID +- `contract_id`: 合同变更所属的合同ID +- `parent_id`: 父对象ID +- 其他 API 调用需要但 schema 中没有的信息 + +### 5.2 Context 使用流程 + +**场景:加载合同数据** + +1. **Handler.load()** 从 self._collection 获取所有 project +2. 遍历每个 project,调用 `GET contract/list?project_id=xxx` +3. 为每个返回的 contract 数据添加临时标记 `_context = {"project_id": xxx}` +4. **Handler.create_node()** 创建 SyncNode 时,提取 `_context` 并设置到 `node.context` +5. **Handler.update()** 更新时,从 `node.context["project_id"]` 获取 project_id 并添加到请求数据 + +### 5.3 Context 传递规则 + +- 父 → 子:从依赖的父节点继承 context +- 横向传递:同级节点不共享 context +- 更新时使用:从 context 提取必要信息添加到请求 payload + +## 6. 智能 API 路由 + +### 6.1 路由策略 + +根据节点数据的字段,自动选择正确的 API endpoint: + +**方案1:字段匹配** +- 检查 node.data 中的字段集合 +- 匹配预定义的 endpoint → required_fields 映射表 +- 选择第一个匹配的 endpoint + +**方案2:Schema 类型** +- 根据 node.schema 的类型 +- 查找 schema_type → endpoint 映射表 + +**默认规则**: +- CREATE: `{node_type}` +- UPDATE: 子类重写 `_select_update_endpoint()` +- DELETE: `{node_type}` + +### 6.2 Project 示例 + +Project 有多个更新接口: +- `project/key_constraints` - 需要字段:key_constraints, key_constraints_remark +- `project/complete_investment` - 需要字段:complete_investment +- `project/dynamic_investment` - 需要字段:dynamic_investment +- `project/plan_construction` - 需要字段:plan_construction_capacity, plan_construction_date +- ... 等 + +Handler 定义映射表,根据实际数据字段自动选择。 + +## 7. 依赖数据获取 + +### 7.1 获取模式 + +Handler 通过 `collection.filter(node_type="xxx")` 获取依赖数据: + +**加载顺序**(按依赖关系): +1. Project(无依赖) +2. Contract(依赖 Project) +3. Contract Change(依赖 Project + Contract) + +### 7.2 数据流 + +``` +Pipeline + → 按拓扑序加载 + → ProjectHandler.load() + → GET project/list + → 创建 ProjectSyncNode + → ContractHandler.load() + → collection.filter(node_type="project") + → 遍历 project,GET contract/list?project_id=xxx + → 创建 ContractSyncNode,设置 context["project_id"] + → ContractChangeHandler.load() + → collection.filter(node_type="contract") + → 遍历 contract,从 context 获取 project_id + → GET contract_change/list?project_id=xxx&contract_id=yyy + → 创建节点,设置 context +``` + +## 8. 实现计划 + +### Phase 1: HTTP 通信层 +- 实现 **ApiClient** 类 + - HTTP Client 封装(httpx.AsyncClient) + - 签名生成(_generate_signature) + - 统一请求方法(get/post/put/delete) + - **批量 Push Log 查询**(get_push_logs,单个也传列表) + - ~~wait_for_push_log~~(不实现,由 DataSource 调用 poll) + +### Phase 2: DataSource 协调层 +- 实现 **ApiDataSource** 类 + - 持有 ApiClient 实例 + - Handler 注册和管理 + - 实现 DataSource 接口(load_all, execute_batch) + - 注入 api_client 到 Handler + - 实现轮询逻辑(_poll_async_tasks) + +### Phase 3: Handler 基类 +- 实现 **BaseApiHandler** 类 + - load/create/update/delete/poll 方法 + - 使用 self.api_client 发送请求 + - **extract_created_id**(子类可重写) + - **_execute_with_retry**(可选,子类可重写重试策略) + - Context 管理 + +### Phase 4: 业务验证 +- 实现 **ProjectApiHandler**(无依赖,简单场景) + - 实现 load:GET project/list + - 实现 create:POST project + - 实现 poll:查询 push_log +- 实现 **ContractApiHandler**(依赖 Project,验证 context) + - 实现 load:遍历 project,GET contract/list?project_id=xxx + - 设置 context["project_id"] +- 编写测试验证设计 + +### Phase 5: 完善功能 +- 批量 Push Log 查询优化(等待后端实现批量接口) +- 超时控制(可配置) +- 请求日志和调试 + +### Phase 6: 推广 +- 实现剩余业务 Handler +- 性能优化(并发控制) +- 文档和示例 + +## 9. 与现有系统集成 + +**调用关系**: +``` +Pipeline + ↓ +ApiDataSource (持有 ApiClient) + ↓ +BaseApiHandler (使用 api_client) + ↓ +ApiClient (发送 HTTP 请求) +``` + +**职责分离**: +- **ApiClient**: 纯粹的 HTTP 通信,无业务逻辑 +- **ApiDataSource**: 协调 Handler,管理执行流程 +- **BaseApiHandler**: 业务逻辑,调用 ApiClient 完成网络操作 +- **具体 Handler**: 实现特定业务的 load/create/update/delete + +**优点**: +- ApiClient 和 Handler 解耦,避免循环依赖 +- Handler 通过 self.api_client 访问 HTTP 功能 +- DataSource 统一管理 ApiClient 生命周期 +- Handler 内部灵活控制重试策略 + +## 10. 关键优势 + +1. **简化架构**:去掉 Repository 层,代码量减少 50% +2. **职责清晰**: + - ApiClient:HTTP 通信 + - DataSource:协调和轮询 + - Handler:业务逻辑和重试 +3. **重试灵活**:Handler 内部实现,不同业务可自定义策略 +4. **状态清晰**:Load 阶段创建 PENDING 节点,执行阶段明确状态转换 +5. **批量优化**:Push Log 批量查询,减少 HTTP 请求 +6. **易于扩展**:新业务只需实现 Handler,复用 Client 和 DataSource +7. **易于测试**:ApiClient 可 mock,Handler 独立测试 + +## 11. 设计改进总结 + +| 改进点 | 初始设计 | 最终设计 | 理由 | +|-------|---------|---------|------| +| Push Log 查询 | get_push_log(id) | get_push_logs([ids]) | 批量查询 | +| 轮询逻辑 | wait_for_push_log 在 Client | 移除,DataSource 调用 poll | 职责清晰 | +| created_id 提取 | 在 Client | 在 Handler 基类 | 业务差异 | +| 重试逻辑 | 在 DataSource | **在 Handler** | 业务灵活性 | +| Load 状态 | GET 成功 → SUCCESS | GET 成功 → PENDING | Load ≠ 同步完成 | +| 执行状态 | 不明确 | 执行前设置 IN_PROGRESS | 状态清晰 | +7. **易于测试**:ApiClient 可以 mock,Handler 单独测试业务逻辑 + +## 12. 使用示例 + +### 12.1 基本使用流程 + +```python +# 1. 创建 DataSource +datasource = ApiDataSource( + base_url="https://api.example.com", + uid="user123", + secret="secret_key" +) + +# 2. 初始化(必须调用) +await datasource.initialize() + +# 3. 注册 Handler +datasource.register_handler(ProjectApiHandler()) +datasource.register_handler(ContractApiHandler()) + +# 4. 创建 Collection +collection = DataCollection() + +# 5. 加载数据(自动处理异常,不会抛出) +await datasource.load_all(collection, order=["project", "contract"]) + +# 6. 执行同步(自动处理异常,不会抛出) +await datasource.sync_all(collection, order=["project", "contract"]) + +# 7. 关闭连接(必须调用) +await datasource.close() +``` + +### 12.2 异常处理说明 + +**设计原则**: +- ✅ **load_all 和 sync_all 不会抛出异常** +- ✅ **Handler 的 create/update/delete 捕获所有 HTTP 异常** +- ✅ **所有错误转换为状态(SyncStatus.FAILED)和错误信息(node.error)** + +**为什么不需要 try-finally?** + +```python +# ❌ 不需要这样做 +try: + await datasource.load_all(collection, order=["project"]) +finally: + await datasource.close() + +# ✅ 直接调用即可 +await datasource.initialize() +await datasource.load_all(collection, order=["project"]) # 内部已处理异常 +await datasource.sync_all(collection, order=["project"]) # 内部已处理异常 +await datasource.close() +``` + +**异常处理机制**: + +1. **load_all 异常处理**: + ```python + # 加载某个类型失败,记录错误但继续处理其他类型 + for node_type in order: + try: + raw_items = await handler.load(collection) + # ... 创建节点 + except Exception as e: + print(f"Error loading {node_type}: {e}") + # 继续处理下一个类型 + ``` + +2. **sync_all 异常处理**: + ```python + # Handler 返回的异常已被捕获转为 TaskResult + for node in nodes: + try: + result = await handler.create(node) # Handler 内部捕获异常 + # 根据 result.status 更新节点状态 + except Exception as e: + # DataSource 的最后保护 + node.status = SyncStatus.FAILED + node.error = str(e) + ``` + +3. **Handler 异常处理**: + ```python + async def create(self, node: SyncNode) -> TaskResult: + try: + # 生成参数 + push_id = self._generate_push_id() + data = {..., "push_id": push_id, "biz_id": self._generate_biz_id(node)} + + # 调用 API + response = await self.api_client.post("/api/v2/project", data) + + # 返回成功 + return TaskResult(status=TaskStatus.SUCCESS, data_id=response['data']['id']) + + except httpx.HTTPStatusError as e: + # HTTP 错误(4xx, 5xx) + return TaskResult(status=TaskStatus.FAILED, error=f"HTTP {e.response.status_code}: {e}") + except httpx.NetworkError as e: + # 网络错误 + return TaskResult(status=TaskStatus.FAILED, error=f"Network error: {e}") + except Exception as e: + # 其他异常 + return TaskResult(status=TaskStatus.FAILED, error=f"Unexpected error: {e}") + ``` + +### 12.3 Pipeline 集成示例 + +```python +async def sync_pipeline(datasource: ApiDataSource): + """同步流程编排""" + + # 初始化 + await datasource.initialize() + + # 创建 Collection + collection = DataCollection() + + # 执行同步流程(所有错误都被内部处理) + await datasource.load_all(collection, order=["project", "contract", "material"]) + await datasource.sync_all(collection, order=["project", "contract", "material"]) + + # 检查结果 + failed_nodes = collection.filter(status=SyncStatus.FAILED) + if failed_nodes: + print(f"Failed nodes: {len(failed_nodes)}") + for node in failed_nodes: + print(f" - {node.node_type}:{node.node_id}: {node.error}") + + # 清理 + await datasource.close() +``` + +**关键点**: +- ✅ 不需要 try-except 包裹 load_all/sync_all +- ✅ 通过检查节点状态判断成功/失败 +- ✅ 错误信息保存在 node.error 中 +- ✅ Pipeline 专注于流程编排,不处理异常细节 + diff --git a/docs/archive/from_root_docs/datasource_handler_architecture_v2.md b/docs/archive/from_root_docs/datasource_handler_architecture_v2.md new file mode 100644 index 0000000..f23dd93 --- /dev/null +++ b/docs/archive/from_root_docs/datasource_handler_architecture_v2.md @@ -0,0 +1,518 @@ +# DataSource + Handler 架构设计 V2 + +## 核心原则 + +### **职责分离** + +```text +Strategy (业务逻辑层) + ↓ 设置 action, 完成 ID 映射 +DataSource (状态管理 + 编排层) + ↓ 调用 Handler, 管理状态流转 +Handler (纯执行层) + ↓ 调用后端 API, 返回结果 +Backend API +``` + +### **关键设计决策** + +1. **ID 映射在 Strategy 完成** ✅ + - `Strategy.create()` / `Strategy.update()` 时,已将依赖字段的本地 ID 替换为远程 ID + - DataSource 拿到的 `node.data` 已经是映射好的数据 + - Handler 直接使用 `node.data`,不需要关心 ID 映射 + +2. **状态管理在 DataSource** ✅ + - 所有 `node.status` 的转换由 DataSource 负责 + - Handler 只返回 `TaskResult`(成功/失败/进行中) + - DataSource 根据 `TaskResult` 更新 `node.status` + +3. **Handler 只负责执行** ✅ + - 调用后端 API(load/create/update/delete) + - 返回执行结果(TaskResult) + - 提供异步任务轮询(poll_tasks) + - 提供数据质量检查(validate) + +--- + +## Handler 接口设计 + +### **核心方法** + +```python +class NodeHandler(Protocol[T]): + # ===== 数据加载 ===== + async def load(self, collection: Optional[DataCollection] = None) -> List[Dict[str, Any]]: + """ + 从后端加载全部数据 + + Args: + collection: Collection 上下文(可选,用于依赖查询) + + Returns: + 原始数据列表 + + 示例: + # Contract Handler(依赖 Project) + async def load(self, collection=None): + # 从 collection 获取 project 列表 + if collection: + projects = collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + else: + project_ids = [] + + # 只加载这些项目的合同 + response = await self.api.get_contracts(project_ids=project_ids) + return response["data"] + """ + + # ===== 数据操作 ===== + async def create(self, node: SyncNode[T]) -> TaskResult: + """ + 创建节点 + + 注意:node.data 已经过 ID 映射,直接使用即可 + + Returns: + TaskResult: + - SUCCESS: 同步完成,返回 data_id + - IN_PROGRESS: 异步任务,返回 task_id + - FAILED: 失败,返回 error + + 示例: + # 同步接口 + async def create(self, node): + try: + response = await self.api.create_contract(node.data) + return TaskResult.success(data_id=response["id"]) + except Exception as e: + return TaskResult.failed(error=str(e)) + + # 异步接口 + async def create(self, node): + try: + response = await self.api.submit_contract_async(node.data) + return TaskResult.in_progress(task_id=response["task_id"]) + except Exception as e: + return TaskResult.failed(error=str(e)) + """ + + async def update(self, node: SyncNode[T]) -> TaskResult: + """更新节点(同 create)""" + + async def delete(self, node: SyncNode[T]) -> TaskResult: + """删除节点(同 create)""" + + # ===== 异步任务轮询 ===== + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """ + 批量轮询异步任务状态 + + Args: + task_ids: 任务 ID 列表 + + Returns: + {task_id: TaskResult} 字典 + + 示例: + async def poll_tasks(self, task_ids): + response = await self.api.batch_query_tasks(task_ids) + results = {} + for task in response["tasks"]: + if task["status"] == "completed": + results[task["id"]] = TaskResult.success( + data_id=task["result"]["contract_id"] + ) + elif task["status"] == "failed": + results[task["id"]] = TaskResult.failed( + error=task["error"] + ) + else: # running + results[task["id"]] = TaskResult.in_progress( + task_id=task["id"] + ) + return results + """ + + # ===== 数据质量检查 ===== + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + """ + 数据质量检查 + + Args: + data: 原始数据 + + Returns: + ValidationResult(是否有效 + 错误列表) + + 示例: + async def validate(self, data): + errors = [] + if not data.get("code"): + errors.append("合同编码为空") + if not data.get("project_id"): + errors.append("项目 ID 为空") + + return ValidationResult( + is_valid=len(errors) == 0, + errors=errors + ) + """ + + # ===== 辅助方法 ===== + def extract_id(self, data: Dict[str, Any]) -> str: + """从原始数据提取 ID""" + + def create_node(self, data: Dict[str, Any]) -> SyncNode[T]: + """从原始数据创建 SyncNode""" +``` + +### **TaskResult 设计** + +```python +class TaskStatus(Enum): + SUCCESS = "success" # 同步完成 + FAILED = "failed" # 失败 + IN_PROGRESS = "in_progress" # 异步任务进行中 + + +class TaskResult: + def __init__( + self, + status: TaskStatus, + data_id: Optional[str] = None, # 成功时返回的 ID + task_id: Optional[str] = None, # 异步任务 ID + error: Optional[str] = None, # 失败原因 + metadata: Optional[Dict] = None # 其他元数据 + ): + ... + + @classmethod + def success(cls, data_id: Optional[str] = None) -> TaskResult: + """创建成功结果""" + + @classmethod + def failed(cls, error: str) -> TaskResult: + """创建失败结果""" + + @classmethod + def in_progress(cls, task_id: str) -> TaskResult: + """创建进行中结果""" +``` + +--- + +## DataSource 接口设计 + +### **接口方法** + +```python +class BaseDataSource(ABC): + # ===== Handler 管理 ===== + def register_handler(self, handler: NodeHandler) -> None: + """注册 Handler""" + + def get_handler(self, node_type: str) -> NodeHandler: + """获取 Handler""" + + # ===== 数据加载 ===== + async def load_all( + self, + order: List[str] + ) -> None: + """ + 按依赖顺序加载所有数据 + + 注意:调用前需先 set_collection() + + Args: + order: 节点类型顺序(如 ["project", "contract", "construction"]) + + 工作流程: + 1. 按顺序遍历每个节点类型 + 2. 调用 Handler.load() + 3. Handler 可以从 self._collection 查询依赖节点 + 4. 使用 Handler.create_node() 创建 SyncNode + 5. 添加到 Collection + """ + + # ===== 同步执行 ===== + async def sync_all( + self, + order: List[str] + ) -> None: + """ + 按依赖顺序执行同步 + + 流程: + 1. 按顺序遍历每个节点类型 + 2. 筛选需要同步的节点(status=PENDING, action!=NONE) + 3. 调用 Handler 的 create/update/delete + 4. 根据 TaskResult 更新节点状态 + 5. 处理异步任务轮询 + """ + + # ===== 统计信息 ===== + def get_sync_summary(self, collection: DataCollection) -> Dict[str, Any]: + """获取同步统计信息""" +``` + +### **状态流转逻辑** + +```python +async def _sync_nodes(self, handler, nodes): + async_tasks = {} # {node_id: task_id} + + for node in nodes: + # 1. 跳过不需要处理的节点 + if node.action == SyncAction.NONE: + continue + + # 2. 跳过异常状态节点 + if node.binding_status in [DEPENDENCY_ERROR, ABNORMAL, WARNING]: + node.status = SyncStatus.SKIPPED + continue + + # 3. 只处理 PENDING 节点 + if node.status != SyncStatus.PENDING: + continue + + # 4. 执行操作 + try: + node.status = SyncStatus.IN_PROGRESS + + if node.action == SyncAction.CREATE: + result = await handler.create(node) + elif node.action == SyncAction.UPDATE: + result = await handler.update(node) + elif node.action == SyncAction.DELETE: + result = await handler.delete(node) + + # 5. 处理结果 + if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + if result.data_id: + node.data_id = result.data_id # 回填 ID + + elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error + + elif result.status == TaskStatus.IN_PROGRESS: + async_tasks[node.node_id] = result.task_id + + except Exception as e: + node.status = SyncStatus.FAILED + node.error = str(e) + + # 6. 轮询异步任务 + if async_tasks: + await self._poll_async_tasks(handler, nodes, async_tasks) +``` + +### **异步任务轮询** + +```python +async def _poll_async_tasks(self, handler, nodes, async_tasks): + node_map = {n.node_id: n for n in nodes} + + max_retries = poll_max_retries # 默认轮询 1 次,可配置 + retry_count = 0 + + while async_tasks and retry_count < max_retries: + # 批量查询 + task_ids = list(async_tasks.values()) + results = await handler.poll_tasks(task_ids) + + # 处理结果 + for node_id, task_id in list(async_tasks.items()): + if task_id not in results: + continue + + result = results[task_id] + node = node_map[node_id] + + if result.status == TaskStatus.SUCCESS: + node.status = SyncStatus.SUCCESS + if result.data_id: + node.data_id = result.data_id + async_tasks.pop(node_id) + + elif result.status == TaskStatus.FAILED: + node.status = SyncStatus.FAILED + node.error = result.error + async_tasks.pop(node_id) + + # 还有未完成任务,等待后重试 + if async_tasks: + await asyncio.sleep(2) + retry_count += 1 + + # 超时未完成的任务标记为失败 + for node_id in async_tasks: + node = node_map[node_id] + node.status = SyncStatus.FAILED + node.error = "Async task timeout" +``` + +--- + +## 完整流程示例 + +### **Pipeline 编排** + +```python +# Stage 0: 初始化 +collection = DataCollection() +datasource = ApiDataSource(api_client) + +# 注册 Handler +datasource.register_handler(ProjectNodeHandler(api_client)) +datasource.register_handler(ContractNodeHandler(api_client)) + +# Stage 1: 加载数据 +datasource.set_collection(collection) +await datasource.load_all( + order=["project", "contract"] # 依赖顺序 +) + +# Stage 2: Strategy 执行 +for strategy in [project_strategy, contract_strategy]: + await strategy.bind() # 设置 binding_status + await strategy.create() # 设置 action=CREATE + ID 映射 + await strategy.update() # 设置 action=UPDATE + ID 映射 + await strategy.pre_sync_check() + +# Stage 3: 物理同步 +await datasource.sync_all( + order=["project", "contract"] +) + +# Stage 4: 检查结果 +summary = datasource.get_sync_summary(collection) +print(f"Success: {summary['success']}, Failed: {summary['failed']}") +``` + +### **Contract Handler 实现** + +```python +class ContractNodeHandler(BaseNodeHandler[ContractResponse]): + def __init__(self, api_client): + super().__init__( + node_type="contract", + node_class=ContractSyncNode, + schema=ContractResponse + ) + self.api = api_client + + async def load(self): + """加载合同(依赖 Project)""" + if self._collection: + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + else: + project_ids = [] + + response = await self.api.get_contracts(project_ids=project_ids) + return response["data"] + + async def create(self, node): + """创建合同(异步接口)""" + try: + # node.data 已经过 ID 映射,直接使用 + response = await self.api.create_contract_async(node.data) + + if response.get("async"): + return TaskResult.in_progress(task_id=response["task_id"]) + else: + return TaskResult.success(data_id=response["id"]) + + except Exception as e: + return TaskResult.failed(error=str(e)) + + async def update(self, node): + """更新合同(同步接口)""" + try: + response = await self.api.update_contract(node.data_id, node.data) + return TaskResult.success() + except Exception as e: + return TaskResult.failed(error=str(e)) + + async def poll_tasks(self, task_ids): + """轮询异步任务""" + response = await self.api.batch_query_tasks(task_ids) + results = {} + for task in response["tasks"]: + if task["status"] == "completed": + results[task["id"]] = TaskResult.success( + data_id=task["result"]["contract_id"] + ) + elif task["status"] == "failed": + results[task["id"]] = TaskResult.failed(error=task["error"]) + else: + results[task["id"]] = TaskResult.in_progress(task_id=task["id"]) + return results + + async def validate(self, data): + """数据质量检查""" + errors = [] + if not data.get("code"): + errors.append("合同编码为空") + if not data.get("project_id"): + errors.append("项目 ID 为空") + + return ValidationResult(is_valid=len(errors) == 0, errors=errors) + + def extract_id(self, data): + return data["id"] +``` + +--- + +## 核心优势 + +### **1. 职责清晰** + +- **Strategy**: 业务逻辑 + ID 映射 +- **DataSource**: 状态管理 + 编排 +- **Handler**: 纯执行(后端 API 调用) + +### **2. ID 映射前置** + +- ID 映射在 Strategy 完成,DataSource 和 Handler 无需关心 +- `node.data` 已经是映射好的数据,直接使用 + +### **3. 状态统一管理** + +- 所有状态流转由 DataSource 负责 +- Handler 只返回结果,不改变节点状态 + +### **4. 异步任务支持** + +- Handler 返回 `TaskResult.in_progress(task_id)` +- DataSource 自动轮询直到完成 + +### **5. 数据质量保障** + + +- Handler 提供 `validate()` 方法 +- DataSource 在加载时检查数据质量 + +### **6. 易于测试** + +- Handler 可以 Mock(返回假 TaskResult) +- DataSource 可以单独测试状态流转逻辑 +- Strategy 可以单独测试 ID 映射逻辑 + +--- + +## 与现有架构的兼容性 + +完全符合 [架构分层设计.md](./架构分层设计.md) 的四层模型: + +1. **Common 层**: SyncNode, DataCollection, BindingManager +2. **Sync System 层**: SyncStrategy(负责 bind/create/update + ID 映射) +3. **DataSource 层**: BaseDataSource + NodeHandler(状态管理 + 执行) +4. **Pipeline 层**: 流程编排 + 依赖顺序 + +符合 [状态定义规范.md](./状态定义规范.md) 的状态流转逻辑。 diff --git a/docs/archive/from_root_docs/node_id_data_id_lifecycle.md b/docs/archive/from_root_docs/node_id_data_id_lifecycle.md new file mode 100644 index 0000000..fb6b102 --- /dev/null +++ b/docs/archive/from_root_docs/node_id_data_id_lifecycle.md @@ -0,0 +1,150 @@ +# node_id / data_id / 持久化与生命周期说明 + +本文档说明同步系统中 `node_id` 与 `data_id` 的职责、生成时机、持久化行为,以及同步流程中“创建/绑定/回填”的完整生命周期。目标是避免“重复生成 node_id 导致绑定失效”的问题,并明确各层职责。 + +--- + +## 1. 基础概念 + +- **data_id** + - 业务主键(来自数据源/远端系统的资源 ID)。 + - 在加载阶段通常已存在;在 CREATE 场景下初始为空,成功后由 DataSource 回填。 + +- **node_id** + - 同步系统内部的**稳定标识符**(绑定与持久化的主键)。 + - 用于绑定表、持久化节点、依赖追踪等。 + - 设计目标:**跨同步周期稳定**,不能随每次加载而变化。 + +--- + +## 2. 核心结论(必须遵守) + +1. **node_id 一旦建立,不应再被数据源“重新生成”。** + - 绑定关系与持久化状态依赖 `node_id`;若每次加载都重新生成,会导致历史绑定失效。 +2. **加载阶段应先恢复 Collection(持久化节点),再加载 DataSource 数据。** + - 数据源加载出的 `data_id` 应优先匹配已持久化的节点;匹配到则复用旧 `node_id`。 +3. **CREATE 场景允许临时/新建 node_id**,但必须通过后续回填与绑定更新保持一致性。 + +--- + +## 3. 正确的初始化/加载顺序 + +### 推荐流程(Pipeline 前半段) + +1. **持久化恢复阶段** + - 必须同时恢复 `node_id` 与 `data_id`(以及状态字段),否则无法建立稳定的映射关系。 + - Collection 可能为空,这属于合法情况。 + +2. **数据源加载阶段(DataSource.load_all)** + - 对每一条业务数据(含 `data_id`): + - **若 Collection 内已存在该 `data_id` 对应节点**:将数据写回原节点(保留旧 `node_id`)。 + - **若不存在**:由 **Collection** 生成新的 `node_id`,并创建新节点。 + +> 这样可避免“第二次同步时重建节点,导致旧绑定丢失”。 + +--- + +## 4. node_id 的来源与稳定性 + +### A. 持久化恢复阶段 + +- **恢复时必须包含 `node_id` 与 `data_id`**: + - 两者成对恢复,才能保证后续 load 阶段按 `data_id` 命中旧节点。 + +### B. 数据源加载阶段 + +- **优先复用持久化 node_id**: + - 通过 `data_id` 在 Collection 中查找并更新已有节点。 +- **仅在未知 data_id 时新建 node_id**: + - 新节点 `node_id` 必须由 **Collection** 生成,而非 DataSource/Handler 直接拼接。 + +### C. 创建阶段(Strategy.create) + +- 新建“目标端”节点时,**必须有 node_id**: + - 用于写入 Collection、记录状态、建立临时绑定。 +- 成功后回填 `data_id`,**node_id 不变**。 + +--- + +## 5. data_id 的来源与回填 + +本节按阶段拆分说明 `data_id` 的来源与写回。 + +### A. 持久化恢复阶段 + +- `data_id` 从持久化数据中恢复(与 `node_id` 一起恢复)。 + +### B. 数据源加载阶段 + +- `data_id` 来自数据源原始数据(`id` / `_id`)。 +- 若命中已有节点,则仅更新数据与状态,不改变 `node_id`。 + +### C. 同步创建与轮询阶段 + +- CREATE 提交后,DataSource 从响应/轮询结果提取 `biz_id`。 +- 成功时回填到 `node.data_id`,并回写 `node.data` 的主键字段(仅 `id` / `_id`)。 + +### D. 持久化阶段 + +- 将更新后的 `node_id` / `data_id` / 状态字段持久化,供下次同步恢复使用。 + +--- + +## 6. 绑定与 node_id 的关系 + +- 绑定表的 key 为 `node_id`,绑定记录是 `local_node_id <-> remote_node_id`。 +- 因此:**node_id 必须稳定**,才能保证绑定长期有效。 +- 绑定可在创建前建立“临时关系”,但成功后不应更换 node_id。 + +--- + +## 7. 同步周期中的典型场景 + +### 场景 1:第一次同步(无持久化) +- Collection 为空 → DataSource load 新节点 → 生成新 `node_id`。 +- Strategy bind / create / update 执行。 +- 持久化后,下次同步可复用 `node_id`。 + +### 场景 2:第二次同步(已有持久化) +- 先恢复 Collection(已有 `node_id`)。 +- DataSource load 时按 `data_id` 匹配旧节点并更新数据。 +- 绑定关系仍有效。 + +### 场景 3:创建新数据(CREATE) +- Strategy 产生目标端节点(`node_id` 新生成)。 +- DataSource 执行创建,回填 `data_id`。 +- 绑定记录更新为真实 `data_id`(但 node_id 保持不变)。 + +--- + +## 8. 关键规则总结 + +- **node_id 是“同步系统内的稳定 ID”,必须持久化与复用。** +- **data_id 是“业务系统的资源 ID”,由数据源加载或创建后回填。** +- **加载顺序:先恢复持久化节点 → 再 load 数据源。** +- **遇到已存在 data_id:复用 node_id;否则创建新节点。** +- **CREATE 成功后只更新 data_id,不更换 node_id。** + +--- + +## 9. 相关文件参考 + +- 绑定与状态定义:见 [docs/状态定义规范.md](状态定义规范.md) +- 编排流程:见 [docs/编排流程规范.md](编排流程规范.md) +- BaseDataSource:见 [sync_system_new/datasource/datasource.py](../sync_system_new/datasource/datasource.py) +- BaseApiHandler:见 [sync_system_new/datasource/api/handler.py](../sync_system_new/datasource/api/handler.py) + +--- + +## 10. 明确规则与建议实现 + +- **DataSource.load_all 必须先按 `data_id` 命中已有节点并更新**,未命中时再由 Collection 创建新节点并分配新的 `node_id`。 +- **推荐实现方式**:先 `find_by_data_id`,命中走通用更新;未命中再创建新节点(无需强制 `upsert_by_data_id` 接口)。 +- **创建流程中的临时绑定/成功更新规则**: + - CREATE 节点创建时:`binding_status = NORMAL`,`action = CREATE`,`status = PENDING`,`data_id = ""`。 + - 执行提交前置为 `status = IN_PROGRESS`(异步)或保持 `PENDING`(同步接口待执行)。 + - 成功回填后:`status = SUCCESS`,`data_id` 回填并写回主键字段,绑定记录保持 `node_id` 不变。 + - 过程中出现错误:`status = FAILED`,`error` 记录原因。 +- **异常节点持久化/恢复策略**: + - 持久化时保留异常节点与错误信息。 + - 恢复时是否保留/清理异常节点应通过策略配置控制(默认建议保留以便人工修复)。 diff --git a/docs/archive/from_root_docs/skip_sync_behavior_fix.md b/docs/archive/from_root_docs/skip_sync_behavior_fix.md new file mode 100644 index 0000000..311b0cb --- /dev/null +++ b/docs/archive/from_root_docs/skip_sync_behavior_fix.md @@ -0,0 +1,232 @@ +# Skip Sync 行为修复说明 + +## 问题分析 + +### 1. **绑定失败的根本原因** + +**问题现象**: +- Company: 1/39 绑定 +- Supplier: 0/65202 绑定(完全没绑定!) +- 导致依赖supplier的业务(contract, material等)也绑不上 +- 远程异常创建了74条数据 + +**根本原因有两个**: + +#### 原因1:skip_sync 跳过了整个策略(包括 bind) + +```python +# 旧逻辑:skip_sync=True 时跳过整个策略 +if getattr(strategy, 'skip_sync', False): + continue # ← 跳过了 bind/create/update 全部! +``` + +修复后: +```python +# 新逻辑:bind() 始终执行,skip_sync 只跳过 create/update/sync +await strategy.bind() # ← 始终执行 + +if getattr(strategy, 'skip_sync', False): + continue # ← 只跳过 create/update +``` + +#### 原因2:自动绑定ID解析失败没有设置DEPENDENCY_ERROR + +```python +# 旧逻辑:ID解析失败只是跳过 +if not resolved_key_dict: + continue # ← 节点保持 MISSING,会被误创建! +``` + +修复后: +```python +# 新逻辑:ID解析失败设置DEPENDENCY_ERROR +if not resolved_key_dict: + node.set_binding_status(BindingStatus.DEPENDENCY_ERROR, "业务键中的ID字段解析失败") + continue # ← 节点为 DEPENDENCY_ERROR,不会被创建 +``` + +### 2. **状态与创建的关系** + +| 状态 | 来源 | 允许创建 | 说明 | +|------|------|:---:|------| +| **UNCHECKED** | 加载后初始状态 | ❌ | bind() 未执行 | +| **NORMAL** | 有绑定记录 | ❌ | 已绑定 | +| **MISSING** | 无绑定记录 | ✅ | 真正的孤儿 | +| **WARNING** | 业务键字段缺失 | ❌ | 数据不完整 | +| **DEPENDENCY_ERROR** | 依赖不满足 | ❌ | 父节点未就绪 | +| **ABNORMAL** | 数据损坏 | ❌ | 需人工处理 | + +**关键原则**: +- `create()` 只查找 `binding_status == MISSING` 的节点 +- 如果 bind() 没执行,状态是 UNCHECKED → 不会创建 +- 如果 bind() 执行了但依赖不满足 → DEPENDENCY_ERROR → 不会创建 + +### 3. **Supplier 默认行为变更** + +**旧行为**: +- `default_skip_sync = True` → 默认跳过同步 +- 需要在调用层设置 `force_sync_types=["supplier"]` + +**新行为**: +- `default_skip_sync` 已移除(使用基类默认值 False) +- Supplier 默认会执行完整同步(bind/create/update) +- 如需跳过,在调用层配置 `skip_sync_types=["supplier"]` + +## 解决方案 + +### 修改 1:分离 bind() 和 skip_sync + +**新逻辑**: +```python +# sync_system_new/pipeline/full_sync_pipeline.py + +# Step 1a: 绑定(始终执行) +await strategy.bind() + +# Step 1b: 检查是否跳过 create/update/sync +if getattr(strategy, 'skip_sync', False): + print(f"⏭️ Skipping create/update/sync for {node_type}") + # 继续执行 pre_sync_check,但跳过 create/update/sync + if hasattr(strategy, "pre_sync_check"): + ok = await strategy.pre_sync_check() + ... + continue + +# Step 1c: 正常的 create/update +await strategy.create() +await strategy.update() +``` + +**效果**: +- ✅ **bind() 始终执行**(建立绑定关系) +- ✅ **skip_sync=True 只跳过 create/update/sync**(避免昂贵操作) +- ✅ **pre_sync_check 仍然执行**(依赖检查) + +### 修改 2:添加 force_sync_types 配置 + +**配置示例**: +```python +# tests/run_full_sync_pipeline_simple.py +CONFIG = { + # 第一次运行:从 API 加载 + 绑定 + 创建 + "force_sync_types": ["supplier"], + "wipe_persistence_on_start": True, + + # 第二次运行:从持久化加载 + 跳过同步 + # "handler_configs": {"supplier": {"load_mode": "persisted_only"}}, + # "skip_sync_types": ["supplier"], + # "wipe_persistence_on_start": False, +} +``` + +**优先级**: +1. **force_sync_types**(最高)→ `skip_sync = False` +2. **skip_sync_types** → `skip_sync = True` +3. **策略默认值** (default_skip_sync) + +### 修改 3:添加测试日志保存 + +**功能**: +```python +# tests/run_full_sync_pipeline_simple.py +log_path = log_dir / f"simple_pipeline_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" +sys.stdout = Tee(original_stdout, log_file) +``` + +**输出位置**: +``` +test_results/simple_pipeline_20260204_162345.log +``` + +## 使用指南 + +### Phase 1: 首次运行(API + 绑定 + 创建) + +```python +CONFIG = { + # 不需要特殊配置,所有类型默认都会同步 + "wipe_persistence_on_start": True, # 清空数据库 +} +``` + +**预期结果**: +- Supplier: 从API加载60000条 → 自动绑定(credit_code) → 拉取到本地 → 持久化 +- Company: 自动绑定 → 拉取 +- Contract等: 通过supplier_id/project_id绑定 → 创建 + +### Phase 2: 后续运行(持久化 + 跳过同步) + +```python +CONFIG = { + "handler_configs": { + "supplier": {"load_mode": "persisted_only"} # 从DB加载 + }, + "skip_sync_types": ["supplier"], # 跳过create/update(但仍执行bind) + "wipe_persistence_on_start": False, # 保留数据 +} +``` + +**预期结果**: +- Supplier: 从DB加载(带绑定关系) → 执行bind(验证状态) → 跳过create/update +- 其他业务: 正常同步 + +## 测试验证 + +### 1. 删除远程异常创建的数据 + +```bash +# TODO: 通过API删除远程的74条测试数据 +``` + +### 2. 清空数据库重新测试 + +```bash +rm _runtime/test_simple.db +python scripts/legacy/run_full_sync_pipeline_simple.py +``` + +### 3. 验证绑定统计 + +**期望输出**: +``` +Local Summary: + company: 39/39 bindings ← 全部绑定 + supplier: 60000+/65202 bindings ← 大量绑定 + contract: XX/34 bindings ← 通过supplier_id绑定 + +Remote Summary: + company: 39/39 bindings + supplier: 60000+/60000 bindings + contract: XX/155 bindings (XX creates) +``` + +### 4. 检查日志文件 + +```bash +cat test_results/simple_pipeline_*.log | grep "Skipping" +``` + +**期望**: +- 第一次运行:**不应该有** "Skipping" 输出 +- 第二次运行:`⏭️ Skipping create/update/sync for supplier` + +## 风险评估 + +### 影响范围 +- ✅ 修复了 supplier/company 绑定失败问题 +- ✅ 防止未绑定节点异常创建 +- ✅ 保持了两阶段工作流(首次API+绑定,后续持久化) +- ⚠️ 可能影响其他使用 skip_sync 的场景(需要测试) + +### 向后兼容性 +- ✅ 原始脚本 (run_full_sync_pipeline_api.py) 不受影响 +- ✅ 没有 skip_sync 属性的策略行为不变 +- ✅ 新增的 force_sync_types 是可选参数 + +## 待办事项 + +- [ ] 测试所有业务类型的绑定统计 +- [ ] 验证依赖关系链(project → contract → material → detail) +- [ ] 检查 construction_task 为什么没绑定(0/32) +- [ ] 测试第二次运行的持久化加载逻辑 +- [ ] 更新文档说明 skip_sync 的新语义 diff --git a/docs/archive/from_root_docs/业务流程与依赖关系.md b/docs/archive/from_root_docs/业务流程与依赖关系.md new file mode 100644 index 0000000..58c8b8f --- /dev/null +++ b/docs/archive/from_root_docs/业务流程与依赖关系.md @@ -0,0 +1,72 @@ +# 业务流程与依赖关系 + +本文档描述推送系统涉及的业务实体及其依赖关系,用于指导同步顺序编排。 + +--- + +## 业务实体分类 + +### 1. 基础数据(仅拉取) + +- **用户(User)**:拉取集团管理员、区域公司管理员及特定用户信息,用于跨平台穿透。其他用户需手动创建。 +- **公司(Company)**:仅拉取,不推送。 +- **供应商(Supplier)**:仅拉取,不推送。 + +### 2. 项目及扩展数据 + +**项目(Project)** +- **绑定方式**:必须手动绑定(根节点) +- **同步操作**:允许更新和拉取 +- **依赖项**:公司、附件(Attachment) + +**项目扩展业务** +- 通过 `(project_id, key)` 或 `(project_id, code)` 自动绑定 +- 允许创建、更新、拉取 +- 依赖项目 + +### 3. 合同及子业务 + +**合同(Contract)** +- **绑定方式**:通过业务键自动绑定(需与 ECP 平台数据交叉检验) +- **同步操作**:允许拉取、创建、更新、删除 +- **依赖项**:项目 + +**合同子业务**(施工任务、物资、结算、力能) +- **绑定方式**:通过 `(contract_id, code)` 自动绑定 +- **同步操作**:允许拉取、创建、更新、删除 +- **特殊规则**:首次绑定后,项目侧不会同步创建远程已有的数据 +- **依赖项**:合同 + +**合同子业务明细**(施工明细、物资明细、结算明细、力能明细) +- **绑定方式**:通过 `(parent_id, date)` 自动绑定 +- **同步操作**:允许拉取、创建、更新、删除 +- **特殊规则**:首次绑定后,项目侧不会同步创建远程已有的数据 +- **依赖项**:对应的合同子业务 + +--- + +## 依赖关系图 + +``` +Company (基础) + ↓ +Project (手动绑定) + ↓ +Contract (自动绑定) + ↓ +Contract Sub-Business (施工/物资/结算/力能) + ↓ +Details (明细) +``` + +--- + +## 同步顺序原则 + +1. **依赖优先**:父节点必须先于子节点同步 +2. **绑定传递**:子节点的业务键构建依赖父节点的 ID 映射 +3. **故障隔离**:父节点同步失败时,子节点标记为 `DEPENDENCY_ERROR` 并跳过 + +详细状态定义参见:[sync_system_new/sync_system/STATE_DEFINITIONS.md](../sync_system_new/sync_system/STATE_DEFINITIONS.md) + +详细架构设计参见:[sync_system_new/architecture_layers.md](../sync_system_new/architecture_layers.md) diff --git a/docs/archive/from_root_docs/代码重构提纲.md b/docs/archive/from_root_docs/代码重构提纲.md new file mode 100644 index 0000000..fa726d1 --- /dev/null +++ b/docs/archive/from_root_docs/代码重构提纲.md @@ -0,0 +1,1028 @@ +# 代码重构提纲 + +> **目标**:删繁就简,将状态机、日志、持久化部分写扎实,提升代码质量 +> +> **当前状态**:基本功能已打通,所有业务类型可以从零推送,但代码存在重复、错误、不严谨、赘余、与文档不符等问题 + +--- + +## 重构原则 + +1. **严格遵循文档**:以 `docs/` 文件夹中的架构文档为准 +2. **类型安全优先**:充分利用 Python 类型系统和 Pydantic +3. **单一职责**:每个模块、类、方法只做一件事 +4. **可测试性**:重构后的代码应该更易测试 +5. **可观测性**:完善的日志和错误处理 + +--- + +## 第一阶段:核心状态机强化(最高优先级) + +### 1.1 状态转换规范化 + +**问题诊断**: +- [ ] 检查状态转换是否严格遵循 `状态定义规范.md` +- [ ] 检查是否有非法的状态转换路径 +- [ ] 检查状态转换是否都有日志记录 + +**重构任务**: + +#### Task 1.1.1: 状态转换集中管理 +```python +# sync_system_new/common/state_machine.py (新建) +class StateMachine: + """集中管理所有合法的状态转换""" + + @staticmethod + def can_transition( + from_status: SyncStatus, + to_status: SyncStatus + ) -> bool: + """检查状态转换是否合法""" + pass + + @staticmethod + def validate_binding_status_transition( + from_status: BindingStatus, + to_status: BindingStatus + ) -> bool: + """检查绑定状态转换是否合法""" + pass +``` + +**操作步骤**: +1. 创建 `state_machine.py`,定义状态转换矩阵 +2. 在 `SyncNode` 的状态设置方法中调用验证 +3. 添加状态转换日志(包含 from/to/reason) +4. 更新所有修改状态的代码,使用统一的转换方法 + +**验收标准**: +- 所有状态转换都经过 `StateMachine` 验证 +- 非法转换会抛出明确的异常 +- 每次转换都有日志记录 + +--- + +### 1.2 BindingStatus 判定逻辑强化 + +**问题诊断**: +- [ ] 检查 `BaseSyncStrategy.bind()` 是否严格遵循核心状态判定表(状态定义规范 § 1) +- [ ] 检查依赖解析逻辑是否符合规范(状态定义规范 § 2) +- [ ] 检查自动绑定逻辑是否符合 1:1 原则(状态定义规范 § 3) + +**重构任务**: + +#### Task 1.2.1: 核心状态判定表实现 +```python +# sync_system_new/sync_system/binding_matrix.py (新建) +class BindingMatrix: + """实现核心状态判定表(状态定义规范 § 1)""" + + @staticmethod + def determine_binding_status( + has_binding: bool, + local_data_valid: bool, + remote_data_valid: bool + ) -> Tuple[Optional[BindingStatus], Optional[BindingStatus]]: + """ + 返回 (local_status, remote_status) + + 实现状态定义规范 § 1 的判定表 + """ + pass +``` + +#### Task 1.2.2: 依赖解析逻辑分离 +```python +# sync_system_new/sync_system/dependency_checker.py (已存在,需强化) +class DependencyChecker: + """依赖检查与业务键解析(状态定义规范 § 2)""" + + @staticmethod + def check_dependencies( + node: SyncNode, + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager + ) -> Tuple[bool, Optional[str]]: + """ + 返回 (can_proceed, error_message) + + 检查: + 1. 依赖节点是否存在 + 2. 依赖节点的绑定状态是否为 NORMAL + 3. 依赖节点的 data_id 是否非空 + """ + pass +``` + +#### Task 1.2.3: 自动绑定逻辑重写 +```python +# sync_system_new/sync_system/auto_binder.py (新建) +class AutoBinder: + """自动绑定逻辑(状态定义规范 § 3)""" + + @staticmethod + def try_auto_bind( + local_nodes: List[SyncNode], + remote_nodes: List[SyncNode], + biz_key: tuple, + binding_manager: BindingManager + ) -> AutoBindResult: + """ + 实现去噪后 1:1 自动绑定 + + 算法: + 1. 全集搜索:寻找共享相同业务键的记录 + 2. 排除稳态对:移除成对且互绑的 NORMAL 记录 + 3. 判定剩余:L_remain=1 且 R_remain=1 才执行绑定 + """ + pass +``` + +**操作步骤**: +1. 创建 `binding_matrix.py`,实现核心判定表 +2. 强化 `dependency_checker.py`,严格按规范检查依赖 +3. 创建 `auto_binder.py`,将自动绑定逻辑从 `strategy.py` 中分离 +4. 重构 `BaseSyncStrategy.bind()` 方法,调用上述三个模块 +5. 添加详细的日志和错误信息(特别是 DEPENDENCY_ERROR 的格式) + +**验收标准**: +- `bind()` 方法逻辑清晰,不超过 50 行 +- 每个判定步骤都有日志记录 +- DEPENDENCY_ERROR 的 error 字段格式符合文档规范 +- 自动绑定只在 1:1 场景下触发 + +--- + +### 1.3 CREATE/UPDATE 逻辑规范化 + +**问题诊断**: +- [ ] 检查 CREATE 阶段的 ID 替换逻辑是否完整 +- [ ] 检查 UPDATE 阶段是否正确跳过 FAILED 节点 +- [ ] 检查是否正确处理空数据(业务键缺失) + +**重构任务**: + +#### Task 1.3.1: ID 替换逻辑统一 +```python +# sync_system_new/sync_system/id_replacer.py (新建) +class IDReplacer: + """ID 替换逻辑(架构分层设计 § 6)""" + + @staticmethod + def replace_ids_for_create( + data: Dict[str, Any], + id_fields: List[str], + binding_manager: BindingManager, + direction: str # "local_to_remote" or "remote_to_local" + ) -> Dict[str, Any]: + """ + 创建新节点时,将依赖字段的本地 ID 替换为远程 ID + + 示例: + data = {"project_id": "P1", "code": "C01"} + -> {"project_id": "RP_99", "code": "C01"} + """ + pass + + @staticmethod + def replace_ids_for_update( + data: Dict[str, Any], + id_fields: List[str], + binding_manager: BindingManager, + direction: str + ) -> Dict[str, Any]: + """准备更新数据时,替换数据中的依赖 ID""" + pass +``` + +#### Task 1.3.2: UPDATE 阶段保护逻辑 +```python +# sync_system_new/sync_system/strategy.py +class BaseSyncStrategy: + def update(self): + """UPDATE 操作必须跳过 FAILED 节点""" + # 过滤掉 status == FAILED 的节点 + # 详见:持久化与人工介入规范 § 1.2 (UPDATE 阶段保护) + pass +``` + +**操作步骤**: +1. 创建 `id_replacer.py`,集中管理 ID 替换逻辑 +2. 从 `strategy.py` 中提取 ID 替换代码,迁移到 `IDReplacer` +3. 在 `update()` 方法开头添加 FAILED 节点过滤 +4. 添加空数据检查(业务键缺失标记为 WARNING) + +**验收标准**: +- CREATE/UPDATE 使用统一的 ID 替换逻辑 +- UPDATE 不会覆盖 FAILED 节点的状态 +- 空数据不参与同步,状态为 WARNING + +--- + +## 第二阶段:持久化与状态重置强化 + +### 2.1 持久化规则严格执行 + +**问题诊断**: +- [x] ~~depend_ids 是否已移除持久化~~ ✅ 已修复 +- [ ] 检查阶段1重置是否正确实现 +- [ ] 检查阶段2清理是否正确实现 + +**重构任务**: + +#### Task 2.1.1: 阶段1重置逻辑审查 +```python +# sync_system_new/common/state_reset.py +def get_phase1_reset_defaults() -> Dict[str, Any]: + """ + 阶段1:加载时重置(持久化与人工介入规范 § 1.2) + + 必须重置: + - data/origin_data → None(等待重新加载) + - depend_ids → [] + - binding_status → UNCHECKED + - error → None + + 必须保留: + - node_id, data_id + - action(用于识别 CREATE 失败节点) + - status(只保留 FAILED,其他重置为 PENDING) + - context + """ + pass +``` + +#### Task 2.1.2: 阶段2清理逻辑审查 +```python +# sync_system_new/pipeline/full_sync_pipeline.py +async def _cleanup_create_failed_zombies(self): + """ + 阶段2:数据加载后清理(持久化与人工介入规范 § 1.2) + + 清理步骤: + 1. 检测:action == CREATE && status == FAILED + 2. 删除本地失败节点 + 3. 解除绑定记录 + 4. 删除远程僵尸节点 + 5. 重置所有剩余节点的 action 为 NONE + """ + pass +``` + +**操作步骤**: +1. 审查 `state_reset.py`,确保阶段1重置符合规范 +2. 审查 `_cleanup_create_failed_zombies()`,确保清理逻辑完整 +3. 添加详细的日志(清理了哪些节点,原因是什么) +4. 编写单元测试,验证重置和清理逻辑 + +**验收标准**: +- 阶段1重置字段完全符合文档表格 +- 阶段2清理逻辑不遗漏任何步骤 +- 每次重置/清理都有明确的日志 + +--- + +### 2.2 绑定记录持久性保证 + +**问题诊断**: +- [ ] 检查绑定记录是否真的"永久保留" +- [ ] 检查是否有意外修改绑定记录的代码 + +**重构任务**: + +#### Task 2.2.1: 绑定记录保护机制 +```python +# sync_system_new/common/binding.py +class BindingManager: + """ + 绑定记录持久性规则(持久化与人工介入规范 § 1.3): + + - 只能手工 bind/unbind + - 或 CREATE 失败自动清理 + - 其他情况绝不修改 + """ + + def bind(self, local_node_id: str, remote_node_id: str, manual: bool = False): + """ + 建立绑定记录 + + Args: + manual: 是否为手工绑定(用于审计日志) + """ + pass + + def unbind(self, node_id: str, manual: bool = False): + """解除绑定(只在手工或 CREATE 失败时调用)""" + pass +``` + +**操作步骤**: +1. 审查所有调用 `bind()/unbind()` 的地方 +2. 添加 `manual` 参数,区分手工和自动操作 +3. 添加审计日志(谁在何时为何修改了绑定) +4. 确保只有允许的场景才能修改绑定 + +**验收标准**: +- 绑定记录修改有完整的审计日志 +- 自动绑定只在 1:1 场景触发 +- CREATE 失败清理有明确的日志 + +--- + +## 第三阶段:日志与可观测性 + +### 3.1 结构化日志体系 + +**问题诊断**: +- [ ] 检查当前日志是否足够定位问题 +- [ ] 检查日志格式是否统一 +- [ ] 检查是否缺少关键操作的日志 + +**重构任务**: + +#### Task 3.1.1: 统一日志格式 +```python +# sync_system_new/common/logger.py (新建) +import logging +from typing import Optional, Dict, Any + +class SyncLogger: + """统一的结构化日志工具""" + + @staticmethod + def log_state_transition( + logger: logging.Logger, + node_type: str, + node_id: str, + from_status: str, + to_status: str, + reason: str, + extra: Optional[Dict[str, Any]] = None + ): + """状态转换日志""" + logger.info( + f"[{node_type}] State transition: {node_id} " + f"{from_status} -> {to_status} | Reason: {reason}", + extra=extra or {} + ) + + @staticmethod + def log_binding_operation( + logger: logging.Logger, + operation: str, # "bind", "unbind", "auto_bind" + local_node_id: str, + remote_node_id: Optional[str], + reason: str, + manual: bool = False + ): + """绑定操作日志""" + op_type = "MANUAL" if manual else "AUTO" + logger.info( + f"[{op_type}] Binding {operation}: " + f"local={local_node_id} <-> remote={remote_node_id} | {reason}" + ) + + @staticmethod + def log_sync_action( + logger: logging.Logger, + action: str, # "CREATE", "UPDATE", "DELETE" + node_type: str, + node_id: str, + data_id: str, + success: bool, + error: Optional[str] = None + ): + """同步操作日志""" + status = "SUCCESS" if success else "FAILED" + msg = f"[{node_type}] {action} {status}: node_id={node_id}, data_id={data_id}" + if error: + msg += f" | Error: {error}" + + if success: + logger.info(msg) + else: + logger.error(msg) + + @staticmethod + def log_dependency_error( + logger: logging.Logger, + node_type: str, + node_id: str, + dependency_errors: List[str] + ): + """依赖错误日志""" + logger.warning( + f"[{node_type}] DEPENDENCY_ERROR: {node_id} | " + f"Errors: {'; '.join(dependency_errors)}" + ) +``` + +**操作步骤**: +1. 创建 `logger.py`,定义结构化日志方法 +2. 在关键模块引入 `SyncLogger` +3. 替换所有 `logger.info/warning/error` 为结构化方法 +4. 添加日志级别配置(DEBUG/INFO/WARNING/ERROR) + +**验收标准**: +- 所有状态转换都有日志 +- 所有绑定操作都有日志 +- 所有同步操作(CREATE/UPDATE/DELETE)都有成功/失败日志 +- 日志格式统一,易于搜索和过滤 + +--- + +### 3.2 关键路径日志补充 + +**问题诊断**: +- [ ] bind() 阶段是否记录了每个判定步骤 +- [ ] create()/update() 是否记录了 ID 替换细节 +- [ ] cleanup 阶段是否记录了清理的节点 + +**重构任务**: + +#### Task 3.2.1: bind() 阶段日志强化 +```python +# sync_system_new/sync_system/strategy.py +class BaseSyncStrategy: + def bind(self): + # 1. 核心状态判定 + logger.debug(f"[{self.node_type}] Checking binding records...") + + # 2. 依赖检查 + logger.debug(f"[{self.node_type}] Checking dependencies for {node_id}...") + + # 3. 自动绑定尝试 + logger.info(f"[{self.node_type}] Auto-bind attempt: L_remain={L}, R_remain={R}") + + # 4. 状态转换 + SyncLogger.log_state_transition(...) +``` + +#### Task 3.2.2: create()/update() 日志强化 +```python +class BaseSyncStrategy: + def create(self): + # 1. 孤儿节点识别 + logger.info(f"[{self.node_type}] Found {len(orphans)} orphan nodes") + + # 2. ID 替换 + logger.debug(f"[{self.node_type}] Replacing IDs: {old_ids} -> {new_ids}") + + # 3. action 设置 + SyncLogger.log_state_transition(...) +``` + +**操作步骤**: +1. 在 `bind()` 的每个判定步骤添加日志 +2. 在 `create()/update()` 的关键操作添加日志 +3. 在 `_cleanup_create_failed_zombies()` 添加详细日志 +4. 设置合理的日志级别(DEBUG/INFO/WARNING) + +**验收标准**: +- 开启 DEBUG 日志时,可以完整追踪每个节点的处理过程 +- 生产环境只需 INFO 日志即可定位问题 +- 关键错误都有 ERROR 级别日志 + +--- + +### 3.3 sync_log 字段利用 + +**问题诊断**: +- [ ] 检查 `SyncNode.sync_log` 是否被使用 +- [ ] 检查是否记录了完整的处理历史 + +**重构任务**: + +#### Task 3.3.1: sync_log 结构定义 +```python +# sync_system_new/common/sync_node.py +class SyncNode: + """ + sync_log 格式: + [ + { + "timestamp": "2025-01-15T10:30:00", + "phase": "bind", + "from_status": "UNCHECKED", + "to_status": "NORMAL", + "reason": "Found binding record", + "details": {} + }, + { + "timestamp": "2025-01-15T10:30:05", + "phase": "update", + "action": "UPDATE", + "reason": "Data diff detected", + "details": {"changed_fields": ["name", "amount"]} + } + ] + """ + + def append_log(self, phase: str, action: str, reason: str, details: Optional[Dict] = None): + """向 sync_log 添加记录""" + pass +``` + +**操作步骤**: +1. 定义 `sync_log` 的 JSON 结构 +2. 在每个阶段(bind/create/update/sync)添加日志记录 +3. 持久化 `sync_log`,用于审计和调试 +4. 提供查询接口,筛选特定类型的日志 + +**验收标准**: +- 每个节点的 `sync_log` 记录了完整的处理历史 +- 可以通过 `sync_log` 回溯任何状态变化 +- 失败节点的 `sync_log` 包含详细的错误信息 + +--- + +## 第四阶段:代码质量与结构优化 + +### 4.1 代码重复消除 + +**问题诊断**: +- [ ] 搜索重复的业务键提取逻辑 +- [ ] 搜索重复的 ID 解析逻辑 +- [ ] 搜索重复的数据校验逻辑 + +**重构任务**: + +#### Task 4.1.1: 业务键处理统一 +```python +# sync_system_new/sync_system/biz_key.py (新建) +class BizKeyExtractor: + """业务键提取与处理""" + + @staticmethod + def extract_from_data( + data: Dict[str, Any], + fields: List[str] + ) -> Optional[Dict[str, Any]]: + """从数据中提取业务键""" + pass + + @staticmethod + def to_tuple(biz_key: Dict[str, Any]) -> tuple: + """转换为可哈希的 tuple""" + pass + + @staticmethod + def is_complete(biz_key: Dict[str, Any]) -> bool: + """检查业务键是否完整(无空值)""" + pass +``` + +**操作步骤**: +1. 创建 `biz_key.py`,集中业务键处理逻辑 +2. 从各个 Strategy 中提取重复代码 +3. 统一业务键的提取、验证、比较逻辑 +4. 添加单元测试 + +**验收标准**: +- 业务键处理逻辑在一个文件中 +- 各 Strategy 调用统一的工具方法 +- 代码行数减少 20% 以上 + +--- + +### 4.2 错误处理统一 + +**问题诊断**: +- [ ] 检查是否有裸露的 try-except +- [ ] 检查异常类型是否明确 +- [ ] 检查错误信息是否包含足够的上下文 + +**重构任务**: + +#### Task 4.2.1: 自定义异常体系 +```python +# sync_system_new/common/exceptions.py (新建) +class SyncSystemException(Exception): + """同步系统基础异常""" + pass + +class StateTransitionError(SyncSystemException): + """非法状态转换""" + def __init__(self, from_status, to_status, reason): + self.from_status = from_status + self.to_status = to_status + super().__init__( + f"Illegal state transition: {from_status} -> {to_status} | {reason}" + ) + +class DependencyError(SyncSystemException): + """依赖错误""" + def __init__(self, node_id, dependency_errors): + self.node_id = node_id + self.dependency_errors = dependency_errors + super().__init__( + f"Dependency error for {node_id}: {'; '.join(dependency_errors)}" + ) + +class DataValidationError(SyncSystemException): + """数据校验错误""" + pass + +class BindingConflictError(SyncSystemException): + """绑定冲突(如 N:N)""" + pass +``` + +**操作步骤**: +1. 创建 `exceptions.py`,定义异常类型 +2. 替换通用异常为自定义异常 +3. 在异常中包含足够的上下文信息 +4. 在顶层捕获并记录异常 + +**验收标准**: +- 所有业务异常都是 `SyncSystemException` 的子类 +- 异常信息包含 node_id、node_type 等上下文 +- 顶层有统一的异常处理和日志记录 + +--- + +### 4.3 类型注解完善 + +**问题诊断**: +- [ ] 检查是否所有方法都有类型注解 +- [ ] 检查返回值是否都有明确类型 +- [ ] 运行 mypy 检查类型错误 + +**重构任务**: + +#### Task 4.3.1: 类型注解审查 +```bash +# 运行 mypy 检查 +mypy sync_system_new/ --strict +``` + +**操作步骤**: +1. 为所有公共方法添加类型注解 +2. 为复杂的返回值定义 TypedDict 或 Pydantic 模型 +3. 修复 mypy 报告的类型错误 +4. 添加 mypy 到 CI/CD 流程 + +**验收标准**: +- mypy 检查通过(允许少量 type: ignore) +- 所有公共 API 都有完整的类型注解 +- IDE 可以提供准确的类型提示 + +--- + +### 4.4 文档字符串完善 + +**问题诊断**: +- [ ] 检查关键类/方法是否有 docstring +- [ ] 检查 docstring 是否符合 Google/Numpy 风格 + +**重构任务**: + +#### Task 4.4.1: Docstring 补充 +```python +class BaseSyncStrategy: + """ + 同步策略基类。 + + 职责: + 1. bind(): 判定 binding_status + 2. create(): 处理孤儿节点 + 3. update(): 处理差异节点 + 4. pre_sync_check() / post_sync_check(): 状态验证 + + 子类使用示例: + ```python + class ProjectStrategy(DefaultSyncStrategy): + default_config = StrategyConfig( + auto_bind_fields=["code"], + local_orphan_action=OrphanAction.CREATE_REMOTE + ) + schema = ProjectResponse + ``` + + 参考文档: + - 架构分层设计.md § 3 + - 状态定义规范.md § 1-4 + """ + + def bind(self): + """ + 判定绑定状态。 + + 执行步骤: + 1. 核心状态判定(状态定义规范 § 1) + 2. 依赖检查(状态定义规范 § 2) + 3. 自动绑定尝试(状态定义规范 § 3) + + 状态转换: + - UNCHECKED -> NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR + + Raises: + DependencyError: 依赖节点未就绪 + BindingConflictError: 出现 N:N 绑定冲突 + """ + pass +``` + +**操作步骤**: +1. 为所有公共类添加类级别 docstring +2. 为所有公共方法添加方法级别 docstring +3. 在 docstring 中引用相关文档章节 +4. 添加使用示例和注意事项 + +**验收标准**: +- 核心类(SyncNode, BaseSyncStrategy, FullSyncPipeline 等)都有完整的 docstring +- 关键方法都有参数说明、返回值说明、异常说明 +- 文档引用链接正确 + +--- + +## 第五阶段:测试覆盖与 pytest 修复 + +### 5.1 单元测试强化 + +**问题诊断**: +- [ ] 运行 pytest,检查失败的测试 +- [ ] 检查测试覆盖率(目标 >80%) + +**重构任务**: + +#### Task 5.1.1: 修复现有测试 +```bash +# 运行测试并查看失败原因 +pytest sync_system_new/tests/ -v --tb=short + +# 检查覆盖率 +pytest sync_system_new/tests/ --cov=sync_system_new --cov-report=html +``` + +**操作步骤**: +1. 运行 pytest,逐个修复失败的测试 +2. 更新测试用例,匹配重构后的代码 +3. 添加缺失的测试(特别是状态转换、绑定逻辑) +4. 确保测试覆盖所有关键路径 + +**验收标准**: +- 所有测试通过 +- 核心模块测试覆盖率 >80% +- 关键逻辑(状态判定、依赖检查、自动绑定)有完整的单元测试 + +--- + +### 5.2 集成测试补充 + +**问题诊断**: +- [ ] 检查是否有端到端的集成测试 +- [ ] 检查集成测试是否覆盖主要场景 + +**重构任务**: + +#### Task 5.2.1: 端到端测试场景 +```python +# tests/integration/test_full_workflow.py +async def test_full_sync_workflow(): + """ + 完整同步流程测试: + 1. 加载 JSONL 数据 + 2. 执行策略(bind/create/update) + 3. 推送到 API + 4. 验证结果 + """ + pass + +async def test_create_failed_recovery(): + """ + CREATE 失败恢复测试: + 1. 模拟 CREATE 失败 + 2. 下次同步自动清理僵尸节点 + 3. 重新尝试 CREATE + """ + pass + +async def test_dependency_blocking(): + """ + 依赖阻断测试: + 1. 父节点 CREATE 失败 + 2. 子节点标记为 DEPENDENCY_ERROR + 3. 修复父节点后,子节点自动恢复 + """ + pass +``` + +**操作步骤**: +1. 创建 `tests/integration/` 目录 +2. 编写端到端集成测试 +3. 使用真实的 JSONL 数据和 Mock API +4. 验证关键场景(自动绑定、CREATE 失败恢复、依赖阻断) + +**验收标准**: +- 有至少 5 个集成测试场景 +- 集成测试覆盖主要业务流程 +- 集成测试可以在 CI/CD 中自动运行 + +--- + +## 第六阶段:文档与代码对齐 + +### 6.1 文档与代码对齐检查 + +**问题诊断**: +- [ ] 逐个对照文档,检查代码实现是否一致 +- [ ] 检查文档中的示例代码是否可运行 + +**重构任务**: + +#### Task 6.1.1: 对齐检查清单 + +| 文档章节 | 代码位置 | 对齐状态 | 备注 | +|---------|---------|---------|------| +| 架构分层设计 § 2 | common/sync_node.py | ✅ | SyncNode 定义 | +| 架构分层设计 § 3 | sync_system/strategy.py | ⚠️ | 需补充 ID 替换逻辑 | +| 状态定义规范 § 1 | sync_system/binding_matrix.py | ❌ | 需新建 | +| 状态定义规范 § 2 | sync_system/dependency_checker.py | ⚠️ | 需强化 | +| 状态定义规范 § 3 | sync_system/auto_binder.py | ❌ | 需新建 | +| 编排流程规范 | pipeline/full_sync_pipeline.py | ✅ | 流程正确 | +| 持久化与人工介入规范 § 1.2 | common/state_reset.py | ✅ | 阶段1/2 重置 | + +**操作步骤**: +1. 创建对齐检查表 +2. 逐个章节对照代码 +3. 标记不一致的地方 +4. 更新代码或文档,确保一致 + +**验收标准**: +- 所有文档章节都有对应的代码实现 +- 代码实现严格遵循文档规范 +- 文档示例代码可以直接运行 + +--- + +### 6.2 文档更新 + +**问题诊断**: +- [ ] 检查重构后的代码是否需要更新文档 +- [ ] 检查是否有新增的设计决策需要文档化 + +**重构任务**: + +#### Task 6.2.1: 文档更新清单 +- [ ] 更新 `架构分层设计.md`,补充新模块说明 +- [ ] 更新 `状态定义规范.md`,补充状态转换图 +- [ ] 创建 `日志规范.md`,说明日志格式和级别 +- [ ] 创建 `异常处理规范.md`,说明异常类型和处理 +- [ ] 更新 `README.md`,补充使用示例 + +**操作步骤**: +1. 根据重构内容,识别需要更新的文档 +2. 更新或创建文档 +3. 添加架构图和流程图(使用 Mermaid) +4. 添加代码示例和最佳实践 + +**验收标准**: +- 文档完整覆盖重构后的架构 +- 文档包含清晰的架构图和流程图 +- 文档包含可运行的示例代码 + +--- + +## 执行计划与优先级 + +### 优先级定义 + +- **P0 (关键)**:影响正确性,必须立即修复 +- **P1 (高)**:影响可维护性,应尽快完成 +- **P2 (中)**:改善代码质量,可以分批完成 +- **P3 (低)**:锦上添花,时间允许时完成 + +### 阶段划分 + +| 阶段 | 优先级 | 预计工时 | 依赖关系 | +|------|--------|---------|---------| +| 第一阶段:核心状态机强化 | P0 | 3-4 天 | 无 | +| 第二阶段:持久化与状态重置 | P0 | 1-2 天 | 第一阶段 | +| 第三阶段:日志与可观测性 | P1 | 2-3 天 | 第一、二阶段 | +| 第四阶段:代码质量优化 | P2 | 2-3 天 | 第一阶段 | +| 第五阶段:测试覆盖 | P1 | 2-3 天 | 第一、二阶段 | +| 第六阶段:文档对齐 | P2 | 1-2 天 | 所有阶段 | + +### 建议执行顺序(3天计划) + +**Day 1**: +1. 完成第一阶段(状态机强化)- P0 +2. 完成第二阶段(持久化审查)- P0 + +**Day 2**: +3. 完成第三阶段(日志强化)- P1 +4. 完成第五阶段(pytest 修复)- P1 + +**Day 3**: +5. 完成第四阶段(代码优化)- P2 +6. 完成第六阶段(文档对齐)- P2 +7. 全面回归测试 + +--- + +## 验收标准 + +### 代码质量指标 + +- [ ] **pytest 通过率**: 100% +- [ ] **测试覆盖率**: 核心模块 >80% +- [ ] **mypy 类型检查**: 通过(允许 <10 个 type: ignore) +- [ ] **代码重复率**: <5% (使用 pylint 检查) +- [ ] **文档覆盖率**: 所有公共 API 都有 docstring + +### 功能完整性 + +- [ ] 所有业务类型可以从零推送 +- [ ] CREATE 失败自动恢复 +- [ ] 依赖阻断正确工作 +- [ ] 自动绑定只在 1:1 场景触发 +- [ ] 手工绑定永不自动修改 + +### 可观测性 + +- [ ] 每个节点都有完整的 sync_log +- [ ] 关键操作都有结构化日志 +- [ ] 错误信息包含足够的上下文 +- [ ] 可以通过日志快速定位问题 + +### 文档一致性 + +- [ ] 代码实现与文档规范一致 +- [ ] 文档示例代码可运行 +- [ ] 架构图和流程图准确 + +--- + +## 附录:重构检查清单 + +### 状态机检查 + +- [ ] 状态转换是否经过 `StateMachine` 验证 +- [ ] 每次转换是否都有日志 +- [ ] 是否有非法的状态路径 + +### 绑定逻辑检查 + +- [ ] 核心判定表是否实现(状态定义规范 § 1) +- [ ] 依赖检查是否完整(状态定义规范 § 2) +- [ ] 自动绑定是否只在 1:1 场景触发(状态定义规范 § 3) +- [ ] DEPENDENCY_ERROR 格式是否符合规范 + +### 持久化检查 + +- [ ] depend_ids 是否不持久化 ✅ +- [ ] 阶段1重置是否正确 +- [ ] 阶段2清理是否完整 +- [ ] 绑定记录是否永久保留 + +### 日志检查 + +- [ ] 是否使用结构化日志 +- [ ] 关键操作是否都有日志 +- [ ] 日志级别是否合理 +- [ ] sync_log 是否记录完整历史 + +### 错误处理检查 + +- [ ] 是否使用自定义异常 +- [ ] 异常信息是否包含上下文 +- [ ] 是否有顶层异常处理 +- [ ] 错误是否正确传播 + +### 代码质量检查 + +- [ ] 是否有重复代码 +- [ ] 是否有明确的类型注解 +- [ ] 是否有完整的 docstring +- [ ] 是否通过 mypy 检查 + +--- + +## 总结 + +本重构提纲基于以下文档制定: + +1. **架构分层设计.md** - 四层架构模型 +2. **状态定义规范.md** - 状态机逻辑 +3. **编排流程规范.md** - Pipeline 流程 +4. **持久化与人工介入规范.md** - 持久化和重置规则 +5. **业务流程与依赖关系.md** - 业务实体依赖 + +**核心目标**: +- 删繁就简:消除重复,提取公共逻辑 +- 状态机强化:严格遵循状态定义规范 +- 日志完善:结构化日志,完整的 sync_log +- 持久化规范:阶段1/2 重置,绑定记录保护 +- 代码质量:类型安全,错误处理,文档完善 + +**关键原则**: +- 以文档为准,代码严格遵循规范 +- 类型安全优先,充分利用 Python 类型系统 +- 可观测性优先,完善的日志和错误信息 +- 单一职责,每个模块只做一件事 +- 可测试性,易于编写和维护测试 + +按照此提纲逐步执行,可以系统性地提升代码质量,同时保持与文档的一致性。 diff --git a/docs/archive/from_root_docs/持久化与人工介入规范.md b/docs/archive/from_root_docs/持久化与人工介入规范.md new file mode 100644 index 0000000..e551f21 --- /dev/null +++ b/docs/archive/from_root_docs/持久化与人工介入规范.md @@ -0,0 +1,152 @@ +# 节点状态持久化与人工介入规范 + +> **代码实现**:`sync_system_new/common/state_reset.py` + +--- + +## 1. 持久化规则 + +### 1.1 持久化目标 + +| 目标 | 说明 | +|------|------| +| **可恢复性** | 系统重启后能从上次状态继续 | +| **可观测性** | 失败和异常状态要保留,供人工查看 | +| **可追溯性** | 失败信息持久化,不自动重试,需人工确认 | +| **绑定稳定性** | 手工绑定一旦建立,永不自动改变 | + +### 1.2 分阶段重置设计 + +状态重置分为两个阶段执行: + +#### 阶段1:加载时重置(Collection.load_from_persistence) + +| 字段 | 性质 | 持久化 | 阶段1重置 | +|------|------|--------|-----------| +| `node_id` | 恒定标识 | ✅ 必须 | ❌ 不重置 | +| `data_id` | 业务主键 | ✅ 必须 | ❌ 不重置 | +| `data` | 业务数据 | ✅ 必须 | ✅ **重置**(每次重新取数) | +| `origin_data` | 原始快照 | ✅ 必须 | ✅ **重置**(每次重新取数) | +| `depend_ids` | 依赖列表 | ❌ **不持久化** | ✅ **初始化为[]**(bind 阶段从 data 实时计算) | +| `binding_status` | 绑定状态 | ✅ 必须 | ✅ **重置为 UNCHECKED** | +| `action` | 同步意图 | ✅ 保存 | ❌ **保留**(用于阶段2判断) | +| `status` | 执行状态 | ✅ 保存 | ❌ **保留**(全部保留,不重置) | +| `error` | 错误信息 | ✅ 保存 | ✅ **重置为None**(清空上次错误) | +| `context` | 扩展上下文 | ✅ 保存 | ❌ 不重置 | + +#### 阶段2:数据加载后清理(Pipeline._cleanup_create_failed_zombies) + +在数据加载完成后、策略执行前,执行CREATE失败节点清理: + +1. **检查条件**: + - 本地节点 `action == CREATE`(上次尝试创建) + - 本地节点 `status == FAILED`(创建失败) + +2. **清理动作**: + - **删除本地失败节点**(从 collection 中移除) + - 如果有绑定记录: + - 解除绑定关系 + - 删除远程 collection 中的僵尸节点 + +3. **最后重置 action**: + - 所有剩余节点的 `action` 重置为 NONE + - 准备进入策略阶段 + +4. **下次同步的自动恢复**: + - 被删除的节点会从数据源重新加载 + - 如果远程实际已创建成功(网络波动导致未获取到结果)→ 绑定阶段会自动绑定上 + - 如果远程实际也失败了 → 重新尝试创建 + +5. **UPDATE 阶段保护**: + - UPDATE 操作会跳过所有 `status == FAILED` 的节点 + - 防止 UPDATE 阶段覆盖 CREATE/UPDATE 失败的状态和错误信息 + - 确保失败节点的 action 和 error 信息保持不变,直到下次同步清理 + +> **说明**: +> - `data` / `origin_data`:每次运行从数据源重新获取,保证数据最新 +> - `depend_ids`:**不持久化**,每次 bind 阶段从 data 的业务字段(如 contract_id, project_id)实时提取 +> - `binding_status`:持久化用于审计,加载时重置为 `UNCHECKED`,由 bind() 重新判定 +> - `error`:**阶段1清空**,避免上次错误影响本次运行,新错误会在各阶段重新生成 +> - `action`:**阶段1保留**用于识别 CREATE 失败的节点,**阶段2清理后重置** +> - `status`:**阶段1全部保留**(包括 FAILED、PRECONDITION_FAILED 等),不自动重置 +> - **CREATE 失败节点会被自动删除并重新加载**,UPDATE/DELETE 失败保留需人工处理 +> - **UPDATE 操作会跳过 FAILED 节点**,避免覆盖失败状态和错误信息 + +### 1.3 绑定记录 vs binding_status + +| 概念 | 存储位置 | 持久性 | 如何改变 | +|------|---------|--------|---------| +| **绑定记录** | `bindings` 表 | **永久保留** | 只能手工 bind/unbind,或 CREATE 失败自动清理 | +| **binding_status** | `nodes` 表 | 保存但可重判 | 每次 bind() 重新判定 | + +### 1.4 CREATE 失败的自动恢复 + +当 CREATE 操作失败时,会产生"僵尸绑定": +- 绑定记录已建立(local_id → remote_node_id) +- 但远程节点的 `data_id` 为空(API 未返回真实 ID) + +**下次同步时的自动恢复流程**: +1. 阶段1加载:保留 `action=CREATE` +2. 阶段2清理:检测到僵尸绑定,自动清理 +3. 本地节点恢复为 MISSING 状态 +4. 策略阶段重新判定,再次尝试 CREATE + +--- + +## 2. 人工介入规范 + +### 2.1 介入时机 + +| 时机 | 场景 | 操作 | +|------|------|------| +| **运行前** | 查看上次失败记录 | 查看持久化的 error,决定是否修复后重试 | +| **bind() 后** | 出现 ABNORMAL/WARNING | 检查数据一致性,手工修复或确认 | +| **bind() 后** | 1:N / N:N 映射 | 手工绑定指定远程记录 | +| **sync() 后** | 批量失败 | 分析失败原因,决定重试策略 | + +### 2.2 binding_status 与介入需求 + +| binding_status | 含义 | 需要介入 | 说明 | +|----------------|------|---------|------| +| `UNCHECKED` | 未检查 | ❌ | 等待 bind() 判定 | +| `NORMAL` | 绑定正常 | ❌ | 自动处理 | +| `MISSING` | 无绑定记录 | ❌ | 自动创建 | +| `WARNING` | 本地有绑定但远程无数据 | ⚠️ 可选 | 可能是远程删除,需确认 | +| `ABNORMAL` | 状态不一致 | ✅ **必须** | 需人工排查 | +| `DEPENDENCY_ERROR` | 依赖未就绪 | ❌ | 等依赖解决后自动重试 | + +### 2.3 人工绑定操作 + +```python +# 手工绑定(1:N 场景) +binding_manager.bind(node_id="local_xxx", data_id="remote_xxx") + +# 手工解绑 +binding_manager.unbind(node_id="local_xxx") +``` + +绑定记录一旦建立,永不自动改变,只能手工操作。 + +### 2.4 职责分工 + +| 职责 | 系统自动 | 人工介入 | +|------|---------|---------| +| 1:1 自动绑定 | ✅ | - | +| 1:N / N:N 绑定 | ❌ | ✅ | +| NORMAL 节点同步 | ✅ | - | +| MISSING 节点创建 | ✅ | - | +| CREATE 失败重试 | ✅(自动清理僵尸) | ⚠️(需确认后手动重置) | +| UPDATE 失败重试 | ❌(保留FAILED状态) | ✅(需确认后手动重置) | +| ABNORMAL 处理 | ❌ | ✅ | +| WARNING 确认 | ❌ | ✅(可选) | + +--- + +## 3. 总结 + +1. **分阶段重置**: + - 阶段1(加载时):只重置 binding_status,**保留 action/status/error** + - 阶段2(数据加载后):清理 CREATE 失败僵尸,然后重置 action +2. **失败状态持久化**:FAILED 状态和 error 信息保留,不自动重试 +3. **绑定记录**:永久保留,除非 CREATE 失败自动清理或手工操作 +4. **人工介入**:失败需确认后手动重置,ABNORMAL/WARNING 需人工处理,1:N 绑定需手工指定 diff --git a/docs/archive/from_root_docs/架构分层设计.md b/docs/archive/from_root_docs/架构分层设计.md new file mode 100644 index 0000000..9fd8728 --- /dev/null +++ b/docs/archive/from_root_docs/架构分层设计.md @@ -0,0 +1,112 @@ +# 架构分层设计:四层模型 + +本架构旨在将同步系统的**数据容器**、**同步逻辑**、**执行层**与**编排流程**完全解耦,提供极简且类型安全的开发体验。 + +--- + +## 1. 架构概览 + +系统分为四层,依赖关系严格从上到下: + +1. **通用层 (Common)**: 定义纯数据结构(Data Container)和基础工具。 +2. **同步系统层 (Sync System)**: 定义同步行为接口(SyncStrategy)与业务规则。 +3. **数据源层 (DataSource)**: 实现数据的加载与持久化,属于盲目执行层。 +4. **编排层 (Pipeline)**: 应用层逻辑,硬编码同步顺序,协调 ID 映射与错误传播。 + +--- + +## 2. 通用层 (Layer 0: Common) + +本层不包含业务逻辑,仅定义数据契约。 + +- **SyncNode[T]**: 核心状态机容器。 + - `origin_data`: 原始数据(对应 `data_id`)。 + - `data`: 计算后的最新目标数据。 + - `data_id`: 业务主键ID。加载时必定有值,CREATE 节点初始为空字符串 `""`(布尔值为 False,可通过校验)。 + - `action`: 同步意图 (NONE, CREATE, UPDATE, DELETE)。 + - `status`: 执行状态 (PENDING, IN_PROGRESS, SUCCESS, FAILED, SKIPPED, PRECONDITION_FAILED)。 + - 详见 [状态定义规范 § 5.A](./状态定义规范.md#5-执行同步状态转换-physical-sync-state-transitions) + - `binding_status`: 绑定状态 (UNCHECKED, NORMAL, MISSING, DEPENDENCY_ERROR, ABNORMAL, WARNING)。 + - 详见 [状态定义规范 § 1](./状态定义规范.md#1-核心状态判定表-core-binding-matrix) + - `error`: 异常详情。 +- **DataCollection**: 节点的集合,提供类型安全的查询和过滤方法。 +- **BindingManager**: + - **ID 映射**: 维护 `local_node_id` <-> `remote_node_id` 的双向映射。 + - **绑定键**: 使用 `node_id` 作为绑定记录的键,**一致不变**。CREATE 成功后只更新节点的 `data_id`,绑定记录不变。 + - **持久化**: 将映射关系持久化到存储(如 JSON/数据库)。 +- **Enums**: `SyncAction`, `SyncStatus`, `BindingStatus` 等。 + +--- + +## 3. 同步系统层 (Layer 1: Sync System) + +核心业务逻辑层。通过实现 `SyncStrategy` 接口来定义特定实体的同步逻辑。 + +- **SyncStrategy[T] 接口**: + - `bind()`: + - 职责:判定 `binding_status` (NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR) + - 详见 [状态定义规范 § 1-3](./状态定义规范.md) + - `create()`: + - 职责:处理孤儿节点(MISSING),在对方侧创建新节点并设置 `action=CREATE` + - **ID 替换**: 创建新节点时,复制数据并将依赖字段的本地 ID 替换为远程 ID + - **内联检查**: 通过 `IDResolver.resolve_and_validate()` 验证依赖 ID 解析 + - 详见 [状态定义规范 § 4.C](./状态定义规范.md) + - `update()`: + - 职责:处理差异节点(NORMAL 且有 diff),设置 `action=UPDATE` + - **ID 替换**: 准备更新数据时,替换数据中的依赖 ID + - **内联检查**: 验证目标节点 data_id 完整性,失败则设置 `PRECONDITION_FAILED` + - **FAILED 保护**: 自动跳过 `status=FAILED` 的节点 + - 详见 [状态定义规范 § 4.A](./状态定义规范.md) +--- + +## 4. 数据源层 (Layer 2: DataSource) + +作为各个后端的适配器,负责数据加载与持久化。 + +- **职责**: + - `load_nodes(node_type)`: 从后端加载并返回 `SyncNode` 集合,自动添加到 `DataCollection`。 + - `save_nodes(nodes)`: + - 遍历节点,仅处理 `status == PENDING` 且 `action != NONE` 的节点。 + - 根据 `action` 执行相应的 CREATE/UPDATE/DELETE 操作。 + - 执行成功后,更新节点的 `status` 和相关信息(如新生成的 remote_id)。 + +--- + +## 5. 编排层 (Layer 3: Pipeline) + +最高层级,负责流程编排。 + +- **职责**: + - **显式顺序**: 直接在代码中按顺序调用同步逻辑(例如:先同步项目,再同步合同)。 + - **故障传播**: 若前置实体某节点同步失败(`FAILED`),编排器在处理后续依赖节点时可将其标记为 `DEPENDENCY_ERROR`。 + - **生命周期管理**: 初始化 `BindingManager` 和 `DataCollection`,同步结束后调用持久化方法。 + +--- + +## 6. ID 映射与对齐:核心流程 + +为了解决本地数据引用本地 ID 与远程数据引用远程 ID 的冲突,系统采用以下映射逻辑: + +### 绑定阶段 (Binding) +- **时机**: `Strategy.bind` +- **目标**: 在 `BindingManager` 中确定 local_id ↔ remote_id 映射 +- **手段**: 业务键匹配(如 Code 匹配)、历史记录恢复等 + +### 执行阶段 (Execution) +- **时机**: `Strategy.create()` / `Strategy.update()` 阶段 +- **目标**: 在创建新节点或准备更新时,将依赖字段的本地 ID 替换为远程 ID +- **手段**: + - `create()`: 创建对方节点时,复制数据并替换所有依赖 ID + - `update()`: 准备更新数据时,替换数据中的依赖 ID +- **验证**: `_pre_commit_check` 在 create/update 最后检查,确保所有依赖节点都已有远程 ID + +**注意**: ID 替换在 Strategy 的 create/update 阶段完成,DataSource 只负责盲目执行已准备好的数据。 + +--- + +## 7. 关键设计原则 + +- **删除类型依赖配置**: 依赖关系通过 `Pipeline` 中的代码调用顺序自然表达。 +- **无状态 DataSource**: 数据源不了解绑定逻辑,只看到 `action`、`status` 和 `binding_status`。 +- **BindingManager 为核心**: 负责 ID 空间映射和持久化。 +- **配置驱动**: 通过 `StrategyConfig` 和预设配置(ConfigPresets)灵活控制同步行为。 diff --git a/docs/archive/from_root_docs/状态定义规范.md b/docs/archive/from_root_docs/状态定义规范.md new file mode 100644 index 0000000..6fc4f00 --- /dev/null +++ b/docs/archive/from_root_docs/状态定义规范.md @@ -0,0 +1,342 @@ +# 同步系统状态定义 (Final Spec) + +本文档定义了同步系统的状态机逻辑。逻辑流转遵循以下顺序: +1. **核心状态判定** (Core State) +2. **依赖检查与ID解析** (Dependency) +3. **自动绑定/发现** (Discovery) +4. **策略执行** (Action) + +--- + +## 0. 绑定状态枚举 (BindingStatus) + +| 状态值 | 含义 | 来源 | 允许创建 | +| :--- | :--- | :--- | :---: | +| **UNCHECKED** | 未执行绑定检查 | 加载后的初始状态 | ❌ | +| **NORMAL** | 绑定正常 | 核心状态判定 | ❌ | +| **MISSING** | 无绑定记录(孤儿) | 核心状态判定 | ✅ | +| **WARNING** | 业务键不完整 | 自动绑定阶段 | ❌ | +| **ABNORMAL** | 数据损坏 | 核心状态判定 | ❌ | +| **DEPENDENCY_ERROR** | 依赖未就绪 | 依赖检查或自动绑定 | ❌ | + +**关键原则**: +- **UNCHECKED 阻止创建**:加载后节点状态为 UNCHECKED,只有执行了 `bind()` 后才会转为其他状态 +- **只有 MISSING 状态才能触发 CREATE**:`create()` 方法只查找 `binding_status == MISSING` 的节点 +- **如果 bind() 被跳过**(如 skip_sync=True),节点保持 UNCHECKED,不会被创建 + +--- + +## 1. 核心状态判定表 (Core Binding Matrix) + +**说明**: +* **Binding Record Pair**: 数据库中的绑定记录 (必须成对出现,已排除单边绑定)。 +* **Data Valid**: 指数据是否可读、Schema校验是否通过。 +* **Warning vs Abnormal**: + * `ABNORMAL`: 自身数据损坏。 + * `WARNING`: 自身健康,但因为对方损坏导致**连接不可用**。 + +| Bind Pair (Record) | Local Data (Valid?) | Remote Data (Valid?) | -> | **Local Status** | **Remote Status** | **说明** | +| :---: | :---: | :---: | :--- | :--- | :--- | :--- | +| **YES** | **YES** | **YES** | -> | **NORMAL** | **NORMAL** | **稳态**。链路完整,数据健康,可进行 Diff/Update。 | +| **YES** | **YES** | **NO** | -> | **WARNING** | **ABNORMAL** | **远程损坏**。本地虽好,但链路已断 (Link Degraded)。禁止同步。 | +| **YES** | **NO** | **YES** | -> | **ABNORMAL** | **WARNING** | **本地损坏**。远程虽好,但链路已断。禁止同步。 | +| **YES** | **NO** | **NO** | -> | **ABNORMAL** | **ABNORMAL** | **双向损坏**。 | +| **NO** | **YES** | N/A | -> | **MISSING** | N/A | **本地孤儿**。进入“依赖与发现”流程。 | +| **NO** | N/A | **YES** | -> | N/A | **MISSING** | **远程孤儿**。进入“依赖与发现”流程。 | + +--- + +## 2. 依赖与业务键解析 (Dependency & ID Resolution) + +**适用范围**: 所有涉及外键依赖 (Foreign Key) 的节点。 +**前置条件**: 核心状态 = `MISSING` (准备进行自动绑定或新建)。 + +在进行 `Auto-Bind` 或 `Create` 之前,必须先尝试构建**远程业务键**。 +例如:本地 `Contract(proj_id="P1", code="C01")` 想找远程对象,必须先查询 `P1` 对应的远程 ID `RP_99`,转换成 `(RP_99, "C01")` 才能去远程搜索。 + +| 依赖项 (Dependency) | 依赖项绑定状态 | -> | **能否构建业务键** | **节点状态** | **说明** | +| :--- | :--- | :--- | :--- | :--- | :--- | +| **无依赖** | N/A | -> | ✅ Yes | **MISSING** | 根节点 (如 Project),直接进入下一阶段。 | +| **有依赖** | **NORMAL** 且 `data_id` 非空(`status` 任意) | -> | ✅ Yes | **MISSING** | 依赖项已获得远程ID,可进入下一阶段。 | +| **有依赖** | **NORMAL** 且 `data_id` 为空("",含 `status = FAILED`) | -> | ❌ No | **DEPENDENCY_ERROR** | 依赖项未回填ID,阻断绑定与同步。 | +| **有依赖** | **MISSING / ABNORMAL** | -> | ❌ No | **DEPENDENCY_ERROR** | **依赖阻断**。父节点未同步或损坏,无法计算远程键,无法绑定,无法创建。 | +| **有依赖** | **WARNING** | -> | ❌ No | **DEPENDENCY_ERROR** | 父节点状态不确定(如连接降级),禁止基于此建立新关系。 | + +> **处理策略**: 处于 `DEPENDENCY_ERROR` 状态的节点,其动作强制为 **SKIP** (或 PENDING)。必须先修复父节点。 +> +> **错误信息格式**: `DEPENDENCY_ERROR` 节点的 `error` 字段会包含详细的依赖失败信息: +> - `dep_err: not_found: field_name(node_type)=value` - 依赖节点未找到 +> - `dep_err: field_name: status=FAILED` - 依赖节点状态为 FAILED +> - 多个依赖失败时用分号分隔:`dep_err: not_found: project_id(project)=P1; contract_id: status=FAILED` + +--- + +## 3. 自动绑定状态处理 (Auto-Binding State Handling) + +此逻辑遵循“去噪后 1:1”原则:只有在排除掉所有健康同步对后,若剩余节点形成绝对的 1:1 关系,才允许自动绑定。 + +**配置说明与触发机制**: +- **初始化场景**: 通常在系统第一次初始化或首次接入新实体时,配置 `auto_bind = True` 来对齐历史数据。 +- **后续同步**: 系统在日常同步中不建议开启全局自动绑定。自动绑定仅作为“发现”手段,一旦建立过关系的节点,其后续绑定操作通常仅在“自动创建”逻辑中伴随产生(详见第 4 节孤儿处理)。 +- **执行前提**: 只有当节点状态为 `MISSING` 且依赖解析成功(`DEPENDENCY_ERROR = False`)时,才会尝试以下探测逻辑。 +- **业务键完整性**: 若业务键字段缺失(如 `serial_number = null`),直接标记 `binding_status = WARNING`,并在 `node.error` 记录原因(`Auto-bind skipped: missing fields ...`),不参与自动绑定与孤儿创建判定。- **ID字段解析失败**: 若业务键包含ID字段(如 `supplier_id`)且依赖节点未绑定,ID解析失败,标记 `binding_status = DEPENDENCY_ERROR`,阻止孤儿创建。 +**核心算法**: +1. **全集搜索**: 寻找本地/远端所有共享同一个业务键(Business Key)的记录。 +2. **排除稳态对**: 识别并移除**成对且互绑**的 `NORMAL` 记录。 + - 只有当本地 A 与远端 B 互为绑定对象,且状态皆为 `NORMAL` 时,才将这一对记录从待判定集合中剔除。 + - 若出现单边 `NORMAL` 记录(即其配对项不在本次搜索范围内或状态不属于另一端的 `NORMAL`),则不予剔除,视为环境污染项。 +3. **判定剩余**: 检查排除上述稳态对后的剩余集合(包含 `MISSING`, `ABNORMAL`, `WARNING` 及单边已占用的 `NORMAL` 记录)。 + +> **术语**: +> - `L_remain` = 本地记录中,排除“成对稳态”后剩余的数量。 +> - `R_remain` = 远端记录中,排除“成对稳态”后剩余的数量。 + +| `L_remain` | `R_remain` | -> | **动作** | **说明** | +| :---: | :---: | :--- | :--- | :--- | +| **1** | **1** | -> | **BIND (Link)** | **1对1 自动对齐**:仅当两端剩余记录皆为 `MISSING` 且绝对 1:1 时,执行自动绑定。 | +| **1** | **1** | -> | **SKIP** | **带障不处理**:若剩余记录中包含 `ABNORMAL` 等异常状态,说明存在历史冲突,不执行自动动作。 | +| **N** | **0** | -> | **CREATE** | **可判定缺失**:业务键完整且唯一,本地存在而远端不存在(N:0)时,才允许进入孤儿创建策略。 | +| 其他 | 其他 | -> | **SKIP** | **非 1:1 不处理**:存在多对多、多对一或无候选情况,系统保持原状。 | + +**设计优势**: +1. **对故障极端敏感**:环境中存在任何 `ABNORMAL` 记录都会阻断自动绑定,强制人工介入处理异常。 +2. **状态纯净**:失败时不产生任何中间态(如已废弃的 `AMBIGUOUS`),保持语义清晰。 +3. **静默自愈**: 当外界清理了环境且满足 1:1 条件后,系统下次同步会自动完成绑定。 + +### 3.1 空数据处理策略 + +**原则**:**空数据不推送**。 + +**空数据定义**: +- 初始化时创建但未编辑的业务记录(如空合同、空施工任务) +- 业务键字段为空或关键字段缺失的记录 + +**处理方式**: +- 在自动绑定阶段,若业务键字段缺失,标记 `binding_status = WARNING`,记录原因 +- 不参与自动绑定与孤儿创建判定 +- 不推送到远程系统 + +**设计理由**: +1. **远程系统简化**:远程只需处理完整数据,无需兼容空数据校验逻辑 +2. **避免垃圾数据**:空数据通常会被本地删除,若已推送则清理复杂 +3. **数据质量保障**:远程系统只能看到本地已正确编辑保存的业务 + +**配置方式**(Strategy 层): +```python +# 在 Strategy 配置中指定必填字段 +default_config = StrategyConfig( + auto_bind_fields=["contract_id", "task_type"], # 业务键字段 + # 如果这些字段为空,节点将被标记为 WARNING 而非 MISSING +) +``` + +--- + +## 4. 动作策略表 (Action Policy Matrix) + +此表定义了在特定状态下,`execute` 阶段允许产生的 **意图行动 (`SyncAction`)**。 + +#### A. 稳态更新 (NORMAL) +适用于已有绑定关系且链路健康的节点。 + +| 状态 | 动作条件 | 执行动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **NORMAL** | `compute_diff` 判定存在差异 | **UPDATE** | +| **NORMAL** | `compute_diff` 判定无差异 | **NONE** | + +#### B. 异常处理 (阻断态) +处于这些状态的节点,引擎会自动中止后续的读写操作。 + +| 状态 | 说明 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **DEPENDENCY_ERROR** | 父节点缺失/异常同步导致阻断 | **NONE** | +| **ABNORMAL / WARNING** | 数据损坏或链路降级,需人工修复 | **NONE** | + +#### C. 孤儿处理 (Create Only) +适用于最终探测状态为 **MISSING** 且无法/不满足自动绑定的节点。 + +**本地孤儿 (Local Orphan)**: 本地有,远程无。 +| 策略配置 (`local_orphan_action`) | 对应的同步模式 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **"create_remote"** | Push (本地推远端) | **CREATE** | +| **"delete_local"** | Pull (远端拉本地) | **报错 (未实现)** | +| **"none"** | Any | **NONE** | + +**远程孤儿 (Remote Orphan)**: 远程有,本地无。 +| 策略配置 (`remote_orphan_action`) | 对应的同步模式 | 动作 (`SyncAction`) | +| :--- | :--- | :--- | +| **"create_local"** | Pull (远端拉本地) | **CREATE** | +| **"delete_remote"** | Push (本地推远端) | **报错 (未实现)** | +| **"none"** | Any | **NONE** | + +--- + +## 5. 执行同步状态转换 (Physical Sync State Transitions) + +在策略执行完成、设置好 `action` 后,DataSource 层负责执行实际的同步操作并更新 `status` 字段。 + +### A. 执行状态枚举 (SyncStatus) + +| 状态值 | 含义 | 适用场景 | +| :--- | :--- | :--- | +| **PENDING** | 待执行 | 初始状态、无动作的节点 | +| **IN_PROGRESS** | 执行中 | 异步接口已提交,等待结果回调 | +| **SUCCESS** | 执行成功 | 同步操作完成且成功 | +| **FAILED** | 执行失败 | 同步操作失败,`error` 字段记录原因 | +| **SKIPPED** | 已跳过 | 节点被主动跳过(如依赖未满足) | +| **PRECONDITION_FAILED** | 前置条件失败 | create/update 内部验证发现问题 | + +### B. 执行转换矩阵 + +#### 同步接口(一步式) + +适用于同步 API(调用后立即返回成功/失败)。 + +| 输入: action | API 调用结果 | → | 输出: status | 副作用 | +| :--- | :--- | :--- | :--- | :--- | +| **CREATE** | 成功返回 (200/201) | → | **SUCCESS** | `data_id` 设置为远程返回的ID | +| **CREATE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **UPDATE** | 成功返回 (200) | → | **SUCCESS** | - | +| **UPDATE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **DELETE** | 成功返回 (200/204) | → | **SUCCESS** | 节点可能被移除 | +| **DELETE** | 失败返回 (4xx/5xx) | → | **FAILED** | `error` 记录错误信息 | +| **NONE** | - | → | **PENDING** | 不执行,保持原状 | + +#### 异步接口(两步式) + +适用于异步 API(提交后需要轮询或回调获取结果)。 + +| 输入: action | API 提交结果 | → | 输出: status | 后续操作 | +| :--- | :--- | :--- | :--- | :--- | +| **CREATE** | 提交成功 (202 Accepted) | → | **IN_PROGRESS** | 记录 task_id,等待轮询 | +| **CREATE** | 提交失败 (4xx/5xx) | → | **FAILED** | `error` 记录错误 | +| **IN_PROGRESS** | 轮询返回成功 | → | **SUCCESS** | `data_id` 设置为远程ID | +| **IN_PROGRESS** | 轮询返回失败 | → | **FAILED** | `error` 记录错误 | +| **IN_PROGRESS** | 超时未完成 | → | **FAILED** | `error` 记录 "Timeout" | + +### B+. Handler 降级(action 取消) + +> **代码实现**:各 `domain/*/api_handler.py` 中的 `update()` 方法。 + +当 Handler 在构建 API 请求数据时,发现实际无需更新的字段(如 schema 校验后所有字段与远程一致), +Handler 会主动将节点的 `action` 从 `UPDATE` 降级为 `NONE`: + +``` +action=UPDATE → Handler 校验 → 无实际变更字段 → action=NONE(不提交 API) +``` + +此机制确保 DataSource 不会向远程发送无意义的空更新请求。 + +### C. 关键副作用 + +| 动作 | 成功时的副作用 | 说明 | +| :--- | :--- | :--- | +| **CREATE** | 临时绑定已建立 | 绑定关系可在提交前创建,用于推送与追踪;是否成功不影响该绑定存在 | +| **CREATE** | 设置 `data_id` | 成功后从API响应中提取远程分配的ID,更新到节点 | +| **CREATE** | 回写 `data` 主键 | DataSource 将远程返回的ID写回 `SyncNode.data`(如 `id`/`*_id` 字段) | +| **CREATE** | 更新绑定记录 | 若使用临时ID,成功后替换为真实的远程ID | +| **UPDATE** | 更新 `origin_data` | 将当前 `data` 保存为新的 `origin_data` | +| **DELETE** | 移除绑定记录 | 删除成功后,清除对应的绑定关系 | + +### D. 错误处理 + +| 错误类型 | 记录方式 | 重试策略 | +| :--- | :--- | :--- | +| **网络错误** | `error = "Network timeout"` | 可重试 | +| **权限错误** | `error = "403 Forbidden"` | 不可重试,需人工介入 | +| **数据校验错误** | `error = "Validation failed: ..."` | 不可重试,需修复数据 | +| **依赖缺失** | `status = PRECONDITION_FAILED` | 不执行,等待依赖修复 | + +--- + +## 6. 同步检查规范 (Sync Check Specification) + +在执行同步前后,需要进行状态检查以确保操作的合法性和完整性。 + +### A. 内联前置检查(create/update 阶段) + +> **实现说明**:原 `_pre_commit_check` 方法已移除(保留空壳兼容接口)。 +> 所有有效检查已内联到 `strategy_ops/create_ops.py::add_create_action()` 和 `strategy_ops/update_ops.py::add_update_action()` 中。 + +**create() 阶段内联检查**: + +| 检查类别 | 检查条件 | 不通过时 | 说明 | +| :--- | :--- | :--- | :--- | +| **数据完整性** | `src_node.get_data()` 不为空 | 跳过该节点,记录日志 | MISSING 但数据为空 | +| **依赖 ID 解析** | `id_resolver.resolve_and_validate()` 成功 | `binding_status → DEPENDENCY_ERROR` | 依赖字段无法解析到目标系统 ID | + +**update() 阶段内联检查**: + +| 检查类别 | 检查条件 | 不通过时 | 说明 | +| :--- | :--- | :--- | :--- | +| **FAILED 保护** | `src_node.status != FAILED` | 跳过该节点 | 不覆盖上次失败的状态和错误 | +| **数据完整性** | `src_node.get_data()` 不为空 | 跳过该节点 | NORMAL 但数据为空 | +| **目标节点存在** | 通过绑定找到目标节点 | 跳过该节点 | 绑定记录指向的节点不在集合中 | +| **data_id 完整性** | `target_node.data_id` 非空 | `status → PRECONDITION_FAILED` | UPDATE 必须有业务主键 | +| **依赖 ID 解析** | `id_resolver.resolve_and_validate()` 成功 | `status → PRECONDITION_FAILED` | 依赖字段无法解析到目标系统 ID | +| **差异检测** | `_needs_update()` 返回 True | 跳过该节点 | 无差异则不更新 | + +> **注意**:以下检查项在当前实现中 **未覆盖**【未实现】: +> - 状态合法性:`binding_status` 必须是已知状态 +> - 动作合法性:`CREATE/UPDATE` 只能用于 `NORMAL` 节点 +> - 绑定一致性:`NORMAL` 节点必须有绑定记录 + +### B. 同步后检查 (Post-Sync Check) + +**目标**: 验证同步结果的完整性,发现残留问题。 + +> **实现说明**:当前 `_stage4_post_sync_check` 只打印摘要表格,不做异常检测。以下检查项均为【未实现】。 + +#### 检查项清单【未实现】 + +| 检查类别 | 检查条件 | 异常情况 | 严重程度 | +| :--- | :--- | :--- | :--- | +| **CREATE 完成性** | CREATE 节点应该有 `data_id` | `action = CREATE, status = SUCCESS` 但 `data_id = ""` | 🔴 ERROR | +| **CREATE 绑定** | CREATE 节点应该有绑定记录 | CREATE 成功但无绑定 | 🔴 ERROR | +| **UPDATE 完成性** | UPDATE 节点应该成功 | `action = UPDATE` 但 `status = FAILED` | ⚠️ WARNING | +| **绑定保持** | UPDATE 节点的绑定应该保持 | UPDATE 后绑定记录丢失 | 🔴 ERROR | +| **残留异常** | 不应有 ABNORMAL 节点 | 同步后仍有 `binding_status = ABNORMAL` | ⚠️ WARNING | +| **残留依赖错误** | 不应有 DEPENDENCY_ERROR | 同步后仍有依赖阻断 | ⚠️ WARNING | + +#### 统计指标 + +| 指标 | 计算方式 | 用途 | +| :--- | :--- | :--- | +| **成功率** | `SUCCESS / (CREATE + UPDATE)` | 评估同步质量 | +| **异常率** | `(ABNORMAL + WARNING) / total` | 发现数据质量问题 | +| **阻断率** | `DEPENDENCY_ERROR / total` | 发现依赖关系问题 | + +#### 决策规则 + +| 检查结果 | ERROR 数量 | 决策 | +| :--- | :--- | :--- | +| ✅ 通过 | 0 | **继续持久化**,正常结束 | +| ⚠️ 有警告 | 0, WARNING ≥1 | **继续持久化**,打印警告报告 | +| ❌ 有错误 | ≥1 | **继续持久化**(已同步无法回滚),打印错误报告 | + +> **注意**: Post-Sync Check 即使有 ERROR 也不会终止流程,因为同步已经执行,无法回滚。检查目的是发现问题并记录,供后续修复。 + +--- + +## 附录: 状态字段说明 + +### SyncNode 核心字段 + +| 字段 | 类型 | 设置阶段 | 含义 | +| :--- | :--- | :--- | :--- | +| `binding_status` | BindingStatus | Bind 阶段 | 绑定健康状态 | +| `action` | SyncAction | Create/Update 阶段 | 待执行动作 | +| `status` | SyncStatus | Physical Sync 阶段 | 执行结果状态 | +| `data_id` | str | 数据加载 / CREATE 后 | 业务主键ID(CREATE 前为 "") | +| `depend_ids` | List[str] | 数据加载 | 依赖节点的 node_id 列表 | +| `error` | str \| None | Physical Sync 阶段 | 错误信息(失败时) | + +### 状态流转时序 + +``` +[数据加载] [Bind] [Create/Update] [Physical Sync] +binding_status: UNCHECKED → NORMAL/MISSING/... → (保持) → (保持) +action: NONE → NONE → CREATE/UPDATE → (保持) +status: PENDING → PENDING → PENDING → SUCCESS/FAILED +data_id: 从源加载 → (保持) → 可能为 "" → CREATE 后设置 +``` \ No newline at end of file diff --git a/docs/archive/from_root_docs/状态机形式化规范.md b/docs/archive/from_root_docs/状态机形式化规范.md new file mode 100644 index 0000000..27b6b8e --- /dev/null +++ b/docs/archive/from_root_docs/状态机形式化规范.md @@ -0,0 +1,498 @@ +# 状态机形式化规范 + +本文档用 **Guard-Event-Action (GEA)** 形式严格定义节点状态机。 +所有转换以代码实现为准,模糊之处在文档中显式标注。 + +> **代码基线** +> - 枚举: `sync_system_new/common/types.py` +> - 决策引擎: `sync_system_new/sync_system/decision.py` +> - 重置策略: `sync_system_new/common/state_reset.py` +> - 同步策略: `sync_system_new/sync_system/strategy.py` +> - 物理同步: `sync_system_new/datasource/datasource.py` + +> **配置基线(状态机真源)** +> - `sync_system_new/state_machine/node_state_machine.yaml` + +### 2026-02 对齐说明(重构前必读) + +以下语义以 `node_state_machine.yaml` 为准,用于修正文档中易混淆点: + +1. **E12a 为什么从 S01 出发?** + - `S01` 只约束**源节点**是 NORMAL/NONE/PENDING 且有 `data_id`。 + - `E12a` 的 guard 是 `target_has_data_id=false`,检查对象是**目标节点**。 + - 所以“源节点在 S01”与“E12a 触发前置失败”并不冲突。 + +2. **S01 会不会触发创建?** + - 当前配置中,create 的入口状态是 `S02(MISSING)`,不是 `S01`。 + - `S01` 进入的是 update_prepare(E12/E13/E14)。 + +3. **N:0 + create_enabled=true 的当前行为** + - 自动绑定分支 `E08f`:`S02 -> S01`,并 `emit spawn_target_node_state: S06`。 + - create_prepare 分支 `E09b` 也可在检查成功后 `S02 -> S01 + spawn S06`。 + - 即:源节点不会停在“等待创建结果”的专用状态;创建执行结果体现在目标创建节点链路 `S06 -> S10/S11/S12/S13`。 + +4. **旧章节中的事件编号偏差** + - 本文后续仍有部分“E11a/E11b/…”旧编号描述,已与当前 YAML 不一致。 + - 进行代码重构时,优先依据 YAML 的 `E08/E09/E10/E12/E13/E14/E15..E20`。 + +--- + +## §1 状态空间定义 + +### §1.1 状态维度 + +节点携带 **三个独立的状态字段** 和 **两个辅助字段**: + +| 字段 | 枚举 | 值域 | 语义 | +|------|------|------|------| +| **B** – `binding_status` | `BindingStatus` | `UNCHECKED` · `NORMAL` · `MISSING` · `ABNORMAL` · `WARNING` · `DEPENDENCY_ERROR` | 绑定健康度 | +| **A** – `action` | `SyncAction` | `NONE` · `CREATE` · `UPDATE` · `DELETE` | 待执行动作 | +| **S** – `status` | `SyncStatus` | `PENDING` · `IN_PROGRESS` · `SUCCESS` · `FAILED` · `SKIPPED` · `PRECONDITION_FAILED` | 执行结果 | + +辅助字段(影响 Guard 但不是状态维度): + +| 字段 | 类型 | 语义 | +|------|------|------| +| `data_id` | `str` | 业务主键(空串 `""` = 尚未从远程获取) | +| `error` | `str \| None` | 最近一次错误信息 | + +理论组合 = 6 × 4 × 6 = **144**,实际可达 ≈ **23** 种。 + +### §1.2 可达状态枚举 + +以下列出所有在正常流程中可以到达的 `(binding_status, action, status)` 三元组。 + +| # | binding_status | action | status | 语义 | 产生阶段 | +|---|---|---|---|------|---------| +| R1 | UNCHECKED | NONE | PENDING | 首次加载 | 数据加载 | +| R2 | UNCHECKED | NONE | SUCCESS | 从持久化恢复(上轮成功)后重置 | 阶段1/2重置 | +| R3 | UNCHECKED | NONE | FAILED | 从持久化恢复(上轮失败)后重置 | 阶段1/2重置 | +| R4 | UNCHECKED | NONE | SKIPPED | 从持久化恢复(上轮跳过)后重置 | 阶段1/2重置 | +| R5 | UNCHECKED | NONE | PRECONDITION_FAILED | 从持久化恢复(上轮前置失败)后重置 | 阶段1/2重置 | +| R6 | NORMAL | NONE | PENDING | 绑定正常,无需操作(首次) | bind.p1 | +| R7 | NORMAL | NONE | SUCCESS | 绑定正常,无需操作(历史成功) | bind.p1 | +| R8 | NORMAL | NONE | FAILED | 绑定正常但上次失败,被 FAILED 保护 | bind.p1 | +| R9 | MISSING | NONE | PENDING | 孤儿,等待自动绑定或创建(首次) | bind.p1 | +| R10 | MISSING | NONE | SUCCESS | 孤儿(历史成功但绑定丢失?) | bind.p1 | +| R11 | ABNORMAL | NONE | * | 数据损坏,需人工 | bind.p1 | +| R12 | WARNING | NONE | * | 多候选/对方损坏,需人工 | bind.p1/p3 | +| R13 | DEPENDENCY_ERROR | NONE | PENDING | 依赖不满足 | bind.p2/p3/create | +| R14 | NORMAL | CREATE | PENDING | 准备创建(目标节点) | create | +| R15 | NORMAL | CREATE | IN_PROGRESS | 异步创建进行中 | sync | +| R16 | NORMAL | CREATE | SUCCESS | 创建成功 | sync | +| R17 | NORMAL | CREATE | FAILED | 创建失败 | sync | +| R18 | NORMAL | UPDATE | PENDING | 准备更新(目标节点) | update | +| R19 | NORMAL | UPDATE | IN_PROGRESS | 异步更新进行中 | sync | +| R20 | NORMAL | UPDATE | SUCCESS | 更新成功 | sync | +| R21 | NORMAL | UPDATE | FAILED | 更新失败 | sync | +| R22 | NORMAL | UPDATE | PRECONDITION_FAILED | 更新前置条件失败 | update | +| R23 | NORMAL | CREATE | SKIPPED | 创建被 Handler 跳过 | sync | + +> **不可达组合(示例)**: +> - `(MISSING, UPDATE, *)` — MISSING 节点不可能被安排 UPDATE +> - `(ABNORMAL, CREATE, *)` — ABNORMAL 节点不可能被安排 CREATE +> - `(*, DELETE, *)` — DELETE 尚未实现 +> - `(UNCHECKED, CREATE, *)` — UNCHECKED 是瞬态,在 bind 之前不会有 CREATE +> - `(DEPENDENCY_ERROR, UPDATE, *)` — DEPENDENCY_ERROR 节点不可能进入 update 流程 + +### §1.3 辅助字段约束 + +| 对应状态 | binding_status | action | status | data_id 约束 | error 约束 | +|---------|---|---|---|-------------|-----------| +| R14 | NORMAL | CREATE | PENDING | `""` (待远程返回) | None | +| R16 | NORMAL | CREATE | SUCCESS | 非空 (远程回填) | None | +| R17 | NORMAL | CREATE | FAILED | `""` (未回填) | 非空 | +| R22 | NORMAL | UPDATE | PRECONDITION_FAILED | * | 非空 | +| R13 | DEPENDENCY_ERROR | NONE | PENDING | * | 非空 | + +--- + +## §2 不变量 (Invariants) + +以下约束在**任何事件执行后**都必须成立。违反即为 Bug。 + +``` +INV-1 B = UNCHECKED ⟹ A = NONE + (UNCHECKED 是瞬态,在 bind 之前不允许有动作) + +INV-2 B ∈ {ABNORMAL, WARNING, DEPENDENCY_ERROR} ⟹ A = NONE + (阻断态节点不允许执行任何同步动作) + +INV-3 B = MISSING ⟹ A ∈ {NONE, CREATE} + (MISSING 节点只能等待创建或保持不动) + +INV-4 A = CREATE ⟹ B = NORMAL + (CREATE 动作只出现在目标节点上,其 binding_status 已被设为 NORMAL) + +INV-5 A = UPDATE ⟹ B = NORMAL + (UPDATE 动作只对 NORMAL 节点执行) + +INV-6 S = IN_PROGRESS ⟹ A ∈ {CREATE, UPDATE, DELETE} + (只有提交过 API 的节点才可能处于 IN_PROGRESS) + +INV-7 S = PRECONDITION_FAILED ⟹ A = UPDATE + (PRECONDITION_FAILED 只在 update 阶段产生) + +INV-8 A = CREATE ∧ S = SUCCESS ⟹ data_id ≠ "" + (创建成功必须回填 data_id) + +INV-9 S = FAILED ⟹ error ≠ None + (失败必须有错误信息) + +INV-10 B = DEPENDENCY_ERROR ⟹ error ≠ None + (依赖阻断必须有错误信息) +``` + +--- + +## §3 事件与转换 + +### §3.1 事件总览图 + +``` + ┌─────────────────────────────────────────────────────┐ + │ 节点生命周期事件流 │ + └─────────────────────────────────────────────────────┘ + + 持久化恢复 策略层 (Strategy) 执行层 (DataSource) + ═══════════ ══════════════════════════════════ ══════════════════════════ + ┌──────────────────────────────┐ + ┌──────┐ │ bind() │ ┌──────────────────────┐ + │E01 │──────────▶│ E04 ─┐ │ │ sync_all() │ + │RESET1│ │ E05 ├─ phase1: core_state │ │ │ + └──┬───┘ │ E06 ─┘ │ │ E12 SYNC_OK │ + │ │ E07 ── phase2: dep_check │ ┌───▶│ E13 SYNC_FAIL │ + ┌──▼───┐ │ E08 ─┐ │ │ │ E14 SYNC_ASYNC │ + │E02 │ │ E09 ├─ phase3: auto_bind │ │ │ E15 SYNC_TIMEOUT │ + │ZOMBIE│ │ E10 ─┘ │ │ │ E16 HANDLER_SKIP │ + └──┬───┘ └──────────────────────────────┘ │ │ E17 HANDLER_DOWN │ + │ ┌──────────────────────────────┐ │ └──────────────────────┘ + ┌──▼───┐ │ create() / update() │ │ + │E03 │──────────▶│ E11a CREATE_OK │────┘ + │RESET2│ │ E11b CREATE_DEP_FAIL │ + └──────┘ │ E11c UPDATE_DIFF │ + │ E11d UPDATE_PRECOND_FAIL │ + │ E11e UPDATE_SKIP_FAILED │ + └──────────────────────────────┘ +``` + + +### §3.2 状态转换详解 + +本节按 Pipeline 执行阶段组织。每个阶段包含: +1. **状态转换图**:状态(R 编号)为节点,事件(E 编号)为有向边 +2. **转换表**:每个事件的精确规格——起始状态、判断条件、结束状态、副作用 + +--- + +#### 🔄 阶段 0:重置 + +**状态转换图:** + +``` + ╔═══════════════════════════════════════╗ + ║ 任意持久化终态 (R6 ~ R23) ║ + ╚═══════════════════╤═══════════════════╝ + │ E01 + ▼ + ┌────────────────────────────────────────┐ E02 + │ 瞬态: UNCHECKED │────────────▶ [节点删除 + 解除绑定] + │ (action 保留, status 保留, error=None) │ + └────────────────────┬──────────────────┘ + │ E03 (存活节点) + ▼ + ╔══════════════════════════════════════════════════════════════╗ + ║ [R1] UNCHECKED, NONE, PENDING ← 首次加载 ║ + ║ [R2] UNCHECKED, NONE, SUCCESS ← 上轮成功 ║ + ║ [R3] UNCHECKED, NONE, FAILED ← 上轮失败 ║ + ║ [R4] UNCHECKED, NONE, SKIPPED ← 上轮跳过 ║ + ║ [R5] UNCHECKED, NONE, PRECONDITION_FAILED ← 上轮前置 ║ + ╚══════════════════════════════════════════════════════════════╝ +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E01**: PHASE1_RESET | R6~R23 (任意持久化终态) | 节点从持久化加载 | 瞬态 (UNCHECKED, action 保留, status 保留) | error → None; data/origin_data → None | +| **E02**: ZOMBIE_KILL | 瞬态 | action = CREATE ∧ (status = FAILED ∨ data_id = "") | **节点删除** | 解除绑定关系; 对 local/remote 两侧都扫描 | +| **E03**: ACTION_RESET | 瞬态 (存活节点) | E02 完成后所有存活节点 | R1 / R2 / R3 / R4 / R5 (按原 status 分) | action → NONE | + +> **代码**: `NodeStateReset.get_phase1_reset_defaults()` · `cleanup_create_failed_zombies()` · `reset_action_for_nodes()` + +--- + +#### 🔗 阶段 1:Bind + +Bind 由三个子阶段串行执行。后一阶段只处理前一阶段的遗留 MISSING 节点。 + +**状态转换图:** + +``` + [R1~R5] UNCHECKED, NONE, * + │ + │ ══════════ Phase 1: 核心状态判定 ══════════ + │ + ├── E04 (有绑定, 双方数据 VALID) ───────────▶ [R6/R7/R8] NORMAL ──────▶ 出口 ✅ + ├── E04 (有绑定, 自身数据缺失/损坏) ────────▶ [R11] ABNORMAL ─────────▶ 出口 🔒 + ├── E04 (有绑定, 对方数据缺失/损坏) ────────▶ [R12] WARNING ──────────▶ 出口 🔒 + │ + └── E05 (无绑定记录) ───────────────────────▶ [R9] MISSING + │ + ══════════ Phase 2: 依赖检查 ══════════ │ + │ + ├── E06 (data = None) ──────────────────────▶ [R11] ABNORMAL ──────▶ 出口 🔒 + ├── E07 (依赖节点不满足) ───────────────────▶ [R13] DEP_ERROR ─────▶ 出口 🔒 + │ (无依赖配置 或 依赖全部满足 → 继续 ▼) + │ + ══════════ Phase 3: 自动绑定 ══════════ + │ + ├── E08 (auto_bind 关闭) ──────────────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E09 (去噪后 1:1 匹配成功) ─────────────▶ [R6] NORMAL ─────────▶ 出口 ✅ + ├── E10a (去噪后非 1:1, 多候选) ───────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E10b (业务键字段缺失) ─────────────────▶ [R12] WARNING ────────▶ 出口 🔒 + ├── E10c (业务键中 ID 字段解析失败) ───────▶ [R13] DEP_ERROR ─────▶ 出口 🔒 + │ + └── (1:0 无远程匹配) + ├── create_enabled = True → [R9] MISSING ──────────────▶ 进入 create + └── create_enabled = False → [R12] WARNING ─────────────▶ 出口 🔒 +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E04**: BIND_PAIRED | R1~R5 | 有绑定记录 ∧ 双方数据 VALID | R6 (PENDING) / R7 (SUCCESS) / R8 (FAILED) — status 保持 | 远程节点同步设置 binding_status | +| **E04**: BIND_PAIRED (自身异常) | R1~R5 | 有绑定记录 ∧ 本方数据缺失或损坏 | R11 (ABNORMAL) | 对方节点设为 WARNING | +| **E04**: BIND_PAIRED (对方异常) | R1~R5 | 有绑定记录 ∧ 对方数据缺失或损坏 | R12 (WARNING) | 对方节点设为 ABNORMAL | +| **E05**: BIND_ORPHAN | R1~R5 | 无绑定记录 | R9 (MISSING, NONE, status 保持) | — | +| **E06**: DATA_NULL | R9 | binding_status = MISSING ∧ data = None | R11 (ABNORMAL) | error = "数据损坏: 节点数据为空或不存在" | +| **E07**: DEP_CHECK_FAIL | R9 | depend_fields 配置非空 ∧ ∃依赖节点: 不存在 ∨ status ≠ NORMAL ∨ data_id 为空 | R13 (DEPENDENCY_ERROR) | error = "依赖项不满足: ..."; depend_ids 填充 | +| **E08**: AUTOBIND_DISABLED | R9 | auto_bind = False 或 auto_bind_fields 为空 | R12 (WARNING) | — | +| **E09**: AUTOBIND_OK | R9 | 去噪后 local:remote = 1:1 ∧ 双方都是 MISSING | R6 (NORMAL) | 建立绑定记录; 双方都设为 NORMAL | +| **E10a**: AUTOBIND_AMBIGUOUS | R9 | 去噪后非 1:1 (多候选) | R12 (WARNING) | error += "存在多个候选节点" | +| **E10b**: AUTOBIND_KEY_MISSING | R9 | auto_bind_fields 中有字段不存在于 data | R12 (WARNING) | error += "缺少业务键字段: ..." | +| **E10c**: AUTOBIND_ID_FAIL | R9 | 业务键包含 ID 字段 ∧ ID 解析失败 | R13 (DEPENDENCY_ERROR) | error = "业务键中的ID字段解析失败: ..." | +| **E10d**: ORPHAN_CREATE_DISABLED | R9 | 去噪后 1:0 ∧ create_enabled = False | R12 (WARNING) | error += "孤儿且不允许自动创建" | + +> **E04 核心状态矩阵** (完整查表): +> +> | | 远程: VALID | 远程: ABSENT | 远程: INVALID | +> |---|---|---|---| +> | **本地: VALID** | 本:NORMAL 远:NORMAL | 本:WARNING 远:ABNORMAL | 本:WARNING 远:ABNORMAL | +> | **本地: ABSENT** | 本:ABNORMAL 远:WARNING | 本:ABNORMAL 远:ABNORMAL | — | +> | **本地: INVALID** | 本:ABNORMAL 远:WARNING | — | 本:ABNORMAL 远:ABNORMAL | +> +> 不在矩阵中的组合 → 默认 (ABNORMAL, ABNORMAL) + +> **代码**: `SyncDecisionEngine.determine_core_status()` · `strategy_ops/bind_ops.py::phase_core_state()` · `strategy_ops/bind_ops.py::check_dependencies_for_nodes()` · `strategy_ops/bind_ops.py::phase_auto_binding()` + +--- + +#### ⚡ 阶段 2:Create / Update + +**状态转换图:** + +``` + ═══════════════ Create ═══════════════ + + [R9] MISSING, NONE, PENDING (源节点, data ≠ None) + │ + ├── E11a (ID 解析成功) ────▶ 源节点: [R9] → [R6] NORMAL + │ 新建目标节点: → [R14] NORMAL, CREATE, PENDING + │ + 建立绑定记录, 目标 data_id = "" + │ + └── E11b (ID 解析失败) ────▶ 源节点: [R9] → [R13] DEPENDENCY_ERROR + + + ═══════════════ Update ═══════════════ + + [R6/R7] NORMAL, NONE, PENDING/SUCCESS (源节点, status ≠ FAILED) + │ + ├── E11c (差异检测通过) ────▶ 目标节点 → [R18] NORMAL, UPDATE, PENDING + ├── E11d.1 (目标 data_id="") ▶ 目标节点 → [R22] status = PRECONDITION_FAILED + ├── E11d.2 (ID 解析失败) ───▶ 目标节点 → [R22] action = UPDATE, status = PRECOND_FAIL + └── (无差异) ──────────────▶ 保持不变 + + + ═══════════════ FAILED 保护 ═══════════════ + + [R8] NORMAL, NONE, FAILED (源节点) + │ + └── E11e ──────────────────▶ 跳过,保持 [R8] 不变 +``` + +**转换表:** + +| 事件 | 起始状态 (源节点) | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E11a**: CREATE_OK | R9 (MISSING) | data ≠ None ∧ IDResolver.resolve_and_validate() = OK | 源 → R6 (NORMAL); **新建**目标 → R14 | 建立绑定; 新节点 data = 已替换 ID 的副本, data_id = "" | +| **E11b**: CREATE_DEP_FAIL | R9 (MISSING) | data ≠ None ∧ IDResolver.resolve_and_validate() = FAIL | R13 (DEPENDENCY_ERROR) | error = "创建时依赖 ID 未解析: ..." | +| **E11c**: UPDATE_DIFF | R6/R7 (NORMAL, status≠FAILED) | 目标存在 ∧ 目标 data_id ≠ "" ∧ ID 解析 OK ∧ _needs_update() = True | 目标 → R18 (UPDATE, PENDING) | 目标: data 替换, error = None | +| **E11d**: UPDATE_PRECOND_FAIL | R6/R7 (NORMAL, status≠FAILED) | 目标 data_id = "" (d1) 或 ID 解析失败 (d2) | 目标 → R22 (UPDATE, PRECONDITION_FAILED) | error = "目标缺少 data_id" 或 "依赖 ID 未解析" | +| **E11e**: UPDATE_SKIP_FAILED | R8 (NORMAL, FAILED) | status = FAILED | R8 不变 | 保护上次的 error 和 FAILED 状态,不做任何修改 | + +> **代码**: `strategy_ops/create_ops.py::add_create_action()` · `strategy_ops/update_ops.py::add_update_action()` + +--- + +#### 📡 阶段 3:Sync(物理同步) + +**状态转换图:** + +``` + [R14] NORMAL, CREATE, PENDING [R18] NORMAL, UPDATE, PENDING + │ │ + └───────────────┬───────────────────┘ + │ + ├── E12 (API 成功) ──────▶ [R16] CREATE,SUCCESS / [R20] UPDATE,SUCCESS + ├── E13 (API 失败) ──────▶ [R17] CREATE,FAILED / [R21] UPDATE,FAILED + ├── E16 (Handler 跳过) ──▶ [R23] CREATE, SKIPPED + ├── E17 (Handler 降级) ──▶ [R6] NORMAL, NONE, PENDING (仅 UPDATE) + │ + └── E14 (异步提交) ──────▶ [R15] CREATE,IN_PROGRESS / [R19] UPDATE,INP + │ + ├── (轮询成功) ──▶ [R16] / [R20] SUCCESS + └── E15 (超时) ──▶ [R17] / [R21] FAILED +``` + +**转换表:** + +| 事件 | 起始状态 | 判断条件 (Guard) | 结束状态 | 副作用 | +|------|---------|-----------------|---------|--------| +| **E12**: SYNC_OK | R14 或 R18 | Handler API 返回 SUCCESS | R16 (CREATE) 或 R20 (UPDATE) | error → None; data_id 回填 (CREATE); origin_data 更新 (UPDATE) | +| **E13**: SYNC_FAIL | R14 或 R18 | Handler API 返回 FAILED | R17 (CREATE) 或 R21 (UPDATE) | error = Handler 返回的错误信息 | +| **E14**: SYNC_ASYNC | R14 或 R18 | Handler API 返回 IN_PROGRESS | R15 (CREATE) 或 R19 (UPDATE) | 记录 task_id, 进入轮询队列 | +| **E15**: SYNC_TIMEOUT | R15 或 R19 | 轮询次数 > max_retries | R17 (CREATE) 或 R21 (UPDATE) | error = "Async task timeout after N seconds" | +| **E16**: HANDLER_SKIP | R14 或 R18 | Handler API 返回 SKIPPED | R23 (CREATE,SKIPPED) | error → None | +| **E17**: HANDLER_DOWNGRADE | R18 (仅 UPDATE) | Handler 运行时发现无实际变更字段 | R6 (NORMAL, NONE, PENDING) | action: UPDATE → NONE; 不提交 API; 统计列从 update 移入 none | + +> **代码**: `BaseDataSource._handle_task_result()` · `_poll_async_tasks()` · `domain/*/api_handler.py` + +--- + +## §4 终态分类与死胡同 + +### §4.1 终态分类 + +| 分类 | 状态 | (binding_status, action, status) | 语义 | 下一轮行为 | +|------|------|------|------|---------| +| ✅ 成功 | R16 | (NORMAL, CREATE, SUCCESS) | 创建成功 | →R2→bind→R7→update 检查 | +| ✅ 成功 | R20 | (NORMAL, UPDATE, SUCCESS) | 更新成功 | →R2→bind→R7→update 检查 | +| ❌ 失败 | R17 | (NORMAL, CREATE, FAILED) | 创建失败 | E02 zombie 判定→删除节点→对方回到 R9 重建 | +| ❌ 失败 | R21 | (NORMAL, UPDATE, FAILED) | 更新失败 | →R3→bind→R8→FAILED 保护(E11e)→保持 | +| 🔒 阻断 | R11 | (ABNORMAL, NONE, \*) | 数据损坏 | 每轮重新 bind 检查; 需人工修复数据 | +| 🔒 阻断 | R12 | (WARNING, NONE, \*) | 多候选/对方异常 | 每轮重新 bind 检查; 需人工绑定或修复 | +| 🔒 阻断 | R13 | (DEPENDENCY_ERROR, NONE, PENDING) | 依赖不满足 | 每轮重新检查依赖; 依赖修复后自动恢复 | +| ⏭ 跳过 | R23 | (NORMAL, CREATE, SKIPPED) | Handler 跳过创建 | →R4→bind→R6→update 检查(无绑定则再 create) | +| 🔄 异步 | R15 | (NORMAL, CREATE, IN\_PROGRESS) | 创建异步中 | 轮询直到 SUCCESS 或超时→FAILED | +| 🔄 异步 | R19 | (NORMAL, UPDATE, IN\_PROGRESS) | 更新异步中 | 轮询直到 SUCCESS 或超时→FAILED | +| 🔄 前置失败 | R22 | (NORMAL, UPDATE, PRECONDITION\_FAILED) | 前置条件不满足 | →R5→bind→R6/R7→update 重试 | + +### §4.2 恢复路径 + +``` +R17 (CREATE, FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, CREATE, FAILED) + → E02: action=CREATE ∧ (status=FAILED ∨ data_id="") → 满足 zombie 条件 + → 删除节点 + 解除绑定 + → 对方节点回到 R9 (MISSING) → 重新进入 create 流程 + +R21 (UPDATE, FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, UPDATE, FAILED) + → E02: action=UPDATE ≠ CREATE → 非 zombie,存活 + → E03: action → NONE → R3 (UNCHECKED, NONE, FAILED) + → bind → R8 (NORMAL, NONE, FAILED) + → E11e: FAILED 保护 → 跳过 update → 保持 R8 + ⚠ 需人工清除 FAILED 才能恢复 + +R22 (UPDATE, PRECONDITION_FAILED): + 持久化 → 下轮 E01 → 瞬态(UNCHECKED, UPDATE, PRECONDITION_FAILED) + → E02: action=UPDATE ≠ CREATE → 非 zombie,存活 + → E03: action → NONE → R5 (UNCHECKED, NONE, PRECONDITION_FAILED) + → bind → R6/R7 (NORMAL) → update 流程重试 + +R11 (ABNORMAL): + 每轮 E01 重置 → bind 重新检查 + → 若数据被人工修复 → E04 → R6/R7/R8 (NORMAL) + → 若数据仍损坏 → 再次 R11 + +R12 (WARNING): + 每轮 E01 重置 → bind 重新检查 + → 若人工建立了绑定 → E04 → R6/R7 (NORMAL) + → 若对方数据被修复 → E04 → R6/R7 (NORMAL) + +R13 (DEPENDENCY_ERROR): + 每轮 E01 重置 → bind 重新检查依赖 + → 依赖节点达到 NORMAL 且 data_id 非空后 + → E07 通过 → 继续 auto_bind 或 create 流程 +``` + +### §4.3 FAILED 保护机制详解 + +FAILED 保护确保失败节点不会被后续流程静默覆盖,保留 error 信息供人工调查。 + +``` +进入条件: + 节点经过 bind 后为 R8 (NORMAL, NONE, FAILED) + 即: 绑定关系正常,但上一轮执行失败 + +保护行为: + `strategy_ops/update_ops.py::add_update_action()` 中: + if source.status == SyncStatus.FAILED: + skip (→ 事件 E11e) + 结果: R8 原样保持 → 持久化 → 下一轮依然 R8 + +解除条件 (需人工介入): + 1. 清除 error 字段 (→ None) + 2. 将 status 改为 PENDING 或 SUCCESS + 3. 下轮 bind 后 → R6 或 R7 → 正常进入 update 流程 +``` + +--- + +## §5 完备性分析 + +### §5.1 状态 × 事件矩阵 + +行 = 当前状态,列 = 可能触发的事件。`→Rx` = 转换到目标状态,`—` = 不可能触发。 + +| 状态 | E01 | E02 | E03 | E04/E05 | E06~E10 | E11a/b | E11c/d/e | E12~E17 | +|------|-----|-----|-----|---------|---------|--------|----------|---------| +| R1~R5 | — | — | — | →R6~R13 | — | — | — | — | +| R6/R7 | →瞬态 | — | — | — | — | — | →R18/R22 | — | +| R8 | →瞬态 | — | — | — | — | — | →R8(skip) | — | +| R9 | →瞬态 | — | — | — | →R6/R11~R13 | →R6+R14/R13 | — | — | +| R11~R13 | →瞬态 | — | — | — | — | — | — | — | +| R14 | →瞬态 | — | — | — | — | — | — | →R15~R17/R23 | +| R15 | →瞬态 | — | — | — | — | — | — | →R16/R17 | +| R18 | →瞬态 | — | — | — | — | — | — | →R6/R19~R21/R23 | +| R19 | →瞬态 | — | — | — | — | — | — | →R20/R21 | +| R16/R17 | →瞬态 | — | — | — | — | — | — | — | +| R20~R23 | →瞬态 | — | — | — | — | — | — | — | + +> **读表方式**: 找到当前状态行和事件列组的交叉点,即可得到目标状态。`—` 表示该状态不可能触发该事件。 + +### §5.2 已知 GAP + +| GAP | 描述 | 风险 | 建议 | +|-----|------|------|------| +| GAP-1 | `set_binding_status()` / `set_action()` / `set_status()` 是纯 setter,不验证转换合法性 | 中 | 加入前置断言:检查 (当前状态, 新状态) 是否匹配某条已知转换 | +| GAP-2 | INV-1 ~ INV-10 未在代码中 assert | 中 | 每次 setter 调用后或阶段结束时断言所有不变量 | +| GAP-3 | R22 (PRECONDITION\_FAILED) 节点下一轮行为路径需验证 | 低 | 已补充恢复路径: R22→E01→E03→R5→bind→R6/R7→update 重试 | +| GAP-4 | Handler 降级 (E17) 后 status 残留为 PENDING 但 action 已清零 | 低 | 可考虑降级时同时重置 status 为 SUCCESS(当前保持 PENDING) | +| GAP-5 | 物理同步后缺少整体一致性检查 (post-sync invariant check) | 低 | 在 `sync_all()` 结束后遍历所有节点验证 INV-1 ~ INV-10 | + +--- + +## §6 引用 + +| 文档 | 路径 | +|------|------| +| 枚举定义 | `sync_system_new/common/types.py` | +| 决策引擎 | `sync_system_new/sync_system/decision.py` | +| 重置策略 | `sync_system_new/common/state_reset.py` | +| 同步策略 | `sync_system_new/sync_system/strategy.py` | +| 物理同步 | `sync_system_new/datasource/datasource.py` | +| ID 解析 | `sync_system_new/sync_system/resolve_ids.py` | +| 节点生命周期(叙事) | [节点生命周期状态转移](./节点生命周期状态转移.md) | diff --git a/docs/archive/from_root_docs/编排流程规范.md b/docs/archive/from_root_docs/编排流程规范.md new file mode 100644 index 0000000..f9dda84 --- /dev/null +++ b/docs/archive/from_root_docs/编排流程规范.md @@ -0,0 +1,534 @@ +# 同步编排流程规范 (Pipeline Specification) + +本文档定义了完整的同步编排流程,包括各阶段的职责、节点状态转换和检查点。 + +> **详细的状态定义和转换规则,请参考**: [STATE_DEFINITIONS.md](../sync_system/STATE_DEFINITIONS.md) + +--- + +## 流程概览 + +同步系统的完整执行流程分为 5 个阶段: + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Stage 0: 初始化 (Initialization) │ +├─────────────────────────────────────────────────────────────┤ +│ - 创建 Collection (Local/Remote) │ +│ - 创建 BindingManager │ +│ - 注册 SyncStrategy (各业务类型) │ +│ - 创建 DataSource (Local/Remote) │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 1: 数据加载 (Data Loading) │ +├─────────────────────────────────────────────────────────────┤ +│ 节点状态: binding_status=UNCHECKED, action=NONE, status=PENDING │ +│ - Persistence.load_nodes() → 从持久化恢复 │ +│ - DataSource.load_all() → 从数据源加载 │ +│ - BindingManager.load_bindings() → 加载绑定关系 │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 2 & 3: 策略执行与同步 (按 node_type 顺序) │ +├─────────────────────────────────────────────────────────────┤ +│ For each node_type in sync_order: │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 2.1 bind() → 绑定判定 │ │ +│ │ 2.2 create() → 设置 CREATE action │ │ +│ │ └─ 内联 ID 解析 + 前置检查 │ │ +│ │ 2.3 Commit Creates → 立即同步 CREATE 节点 │ │ +│ │ └─ DataSource.sync_all(poll_async=True) │ │ +│ │ 2.4 update() → 设置 UPDATE action │ │ +│ │ └─ 内联 ID 解析 + 前置检查 │ │ +│ │ 2.5 Commit Updates → 立即同步 UPDATE 节点 │ │ +│ │ └─ DataSource.sync_all(poll_async=True) │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ 说明: │ +│ - 每个 node_type 完整同步后才处理下一个(保证依赖顺序) │ +│ - commit 操作内部包含异步轮询,无需独立轮询阶段 │ +│ - sync_all() 自动过滤 action=CREATE/UPDATE 的节点 │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 4: 同步结果报告 (Summary Report) │ +├─────────────────────────────────────────────────────────────┤ +│ - 打印同步结果摘要 │ +│ * 节点统计(按 action/status 分类) │ +│ * 绑定关系统计 │ +│ * 异常节点检查(data_id 缺失、绑定缺失等) │ +│ - 收集统计信息(成功/失败/残留问题) │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Stage 5: 状态持久化 (State Persistence) │ +├─────────────────────────────────────────────────────────────┤ +│ - Collection.persist() → 保存节点状态 │ +│ - BindingManager.persist() → 保存绑定关系 │ +└─────────────────────────────────────────────────────────────┘ + ↓ + 【流程完成】 +``` + +--- + +## 各阶段节点状态 + +### Stage 0: 初始化 + +**输出**: 所有组件实例化完成。 + +--- + +### Stage 1: 数据加载 + +**节点状态**: +```python +binding_status = BindingStatus.UNCHECKED # 未判定 +action = SyncAction.NONE # 无动作 +status = SyncStatus.PENDING # 待处理 +data_id = <从数据源加载> # 已有业务ID +origin_data = <从数据源加载> # 原始数据快照 +data = <从数据源加载> # 当前数据 +depend_ids = <从数据源加载> # 依赖节点列表 +``` + +**关键点**: +- `data_id` 在加载时**必定有值**(来自数据源) +- 只有待创建的新节点 `data_id` 才可能为 ""(空字符串) +- 从持久化恢复时应重置所有 `action` 为 `NONE` +- `binding_status` 初始值是 `UNCHECKED`,不是 `None` + +--- + +### Stage 2.1: Bind (状态判定) + +**状态转换**: `binding_status: UNCHECKED → NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR` + +**可能的结果状态**: + +| 结果状态 | 含义 | 占比 | +|---------|------|-----| +| **NORMAL** | 有绑定,数据健康 | 大部分 | +| **MISSING** | 无绑定,孤儿节点 | 少量 | +| **ABNORMAL** | 有绑定,自身数据损坏 | 极少 | +| **WARNING** | 有绑定,对方数据损坏 | 极少 | +| **DEPENDENCY_ERROR** | 依赖未满足 | 少量 | + +**详细规则**: 参考 [STATE_DEFINITIONS.md § 1-3](../sync_system/STATE_DEFINITIONS.md) + +**补充约束**: +- 若依赖节点 `binding_status = NORMAL` 但 `data_id` 为空(含 `status = FAILED`),视为依赖阻断。 +- 只要依赖节点已回填 `data_id`,即使其 `status = FAILED`,后续类型仍允许进入 Create/Update。 +- 自动绑定只在**业务键完整且唯一**时才尝试: + - 若业务键字段缺失(如 `serial_number = null`),设置 `binding_status = WARNING`,并在 `node.error` 记录原因:`Auto-bind skipped: missing fields ...`。 + - 若同一业务键出现多对多/多对一,设置 `binding_status = WARNING`,并在 `node.error` 记录原因:`Auto-bind skipped: ambiguous candidates`。 + - 以上情况仅记录 **Warning**,不进行自动绑定。 + +--- + +### Stage 2.2: Create (孤儿处理) + +**状态转换**: `action: NONE → CREATE` (对 MISSING 节点) + +**补充约束**: +- `binding_status = WARNING` 的节点不会进入 CREATE(`create()` 只查找 MISSING 节点) +- 创建时会通过 `IDResolver.resolve_and_validate()` 二次验证依赖 ID,失败则设置 `DEPENDENCY_ERROR` + +**副作用**: +- 在对方 Collection 创建新节点 +- 新节点的 `binding_status = NORMAL, action = CREATE, data_id = ""` +- 建立绑定记录 +- 原 MISSING 节点也变为 `NORMAL` + +**示例**: +``` +Before: + local_node: binding_status=MISSING, action=NONE + +After Create: + local_node: binding_status=NORMAL, action=NONE + remote_node (新建): binding_status=NORMAL, action=CREATE, data_id="" + 绑定记录: local_id ↔ remote_temp_id +``` + +--- + +### Stage 2.3: Update (差异同步) + +**状态转换**: `action: NONE → UPDATE` (对 NORMAL 且有差异的节点) + +**前提条件**: +- `binding_status = NORMAL` +- `status != FAILED`(保护上次失败的状态和错误信息) +- `compute_diff()` 判定有差异 +- 配置的 `update_direction` 决定哪一方节点设置 UPDATE + +**内联检查**: +- 目标节点 `data_id` 为空 → `status = PRECONDITION_FAILED` +- `IDResolver.resolve_and_validate()` 失败 → `status = PRECONDITION_FAILED` +- Handler 校验后无实际变更字段 → `action` 降级为 `NONE`(不提交) + +--- + +### Stage 2 & 3: 策略执行与同步 + +**执行顺序**: 按 `sync_order` 顺序逐个处理 node_type + +**单个 node_type 的完整流程**: + +``` +For node_type in sync_order: + ┌─────────────────────────────────────────────┐ + │ 2.1 Bind - 绑定判定 │ + │ - 设置 binding_status: NORMAL/MISSING/... │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.2 Create - 创建策略 │ + │ - 处理 MISSING 节点,设置 action=CREATE │ + │ - 内联 ID 解析验证 (resolve_and_validate) │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.3 Commit Creates - 立即同步 CREATE │ + │ - DataSource.sync_all(poll_async=True) │ + │ - 自动过滤 action=CREATE 的节点 │ + │ - 内部包含异步轮询(IN_PROGRESS→SUCCESS)│ + │ - ⭐ 执行 data_id 回填和绑定更新 │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.4 Update - 更新策略 │ + │ - 处理差异节点,设置 action=UPDATE │ + │ - 内联 ID 解析验证 + data_id 检查 │ + │ - FAILED 节点自动跳过 │ + └─────────────────────────────────────────────┘ + ↓ + ┌─────────────────────────────────────────────┐ + │ 2.5 Commit Updates - 立即同步 UPDATE │ + │ - DataSource.sync_all(poll_async=True) │ + │ - 自动过滤 action=UPDATE 的节点 │ + │ - 内部包含异步轮询(IN_PROGRESS→SUCCESS)│ + └─────────────────────────────────────────────┘ + ↓ + 下一个 node_type +``` + +**关键特性**: +1. **按类型顺序**: 每个 node_type 完全同步后才处理下一个(保证依赖顺序) +2. **立即提交**: create/update 后立即同步,不等待所有策略执行完 +3. **内置轮询**: `sync_all(poll_async=True)` 内部自动轮询异步任务 +4. **data_id 回填**: CREATE 成功后立即回填 data_id,下游依赖可用 + +**同步状态转换**: + +**同步接口(一步式)**: +``` +action=CREATE, API 成功 → status=SUCCESS, data_id=<远程ID> +action=CREATE, API 失败 → status=FAILED, error=<错误信息> +action=UPDATE, API 成功 → status=SUCCESS +action=UPDATE, API 失败 → status=FAILED, error=<错误信息> +action=NONE → status=PENDING (不执行) +``` + +**异步接口(两步式,内置轮询)**: +``` +action=CREATE, 提交成功 → status=IN_PROGRESS, task_id=<任务ID> +status=IN_PROGRESS, 轮询中... → status=IN_PROGRESS (保持) +status=IN_PROGRESS, 轮询成功 → status=SUCCESS, data_id=<远程ID> +status=IN_PROGRESS, 轮询失败 → status=FAILED, error=<错误信息> +status=IN_PROGRESS, 超时 → status=FAILED, error="Timeout" +``` + +**关键副作用**(由 DataSource 在 sync_all 中执行): +- CREATE 成功: `data_id` 从 "" 更新为远程分配的 ID,并回写 `data` 主键字段 +- CREATE 成功: 绑定记录从临时ID更新为真实ID +- UPDATE 成功: `origin_data` 更新为当前 `data` +- DELETE 成功: 移除绑定记录 + +**skip_sync 处理**: +- 如果 `strategy.skip_sync = True`,跳过 create/update/commit 步骤 +- bind 步骤始终执行(用于状态判定) + +**详细规则**: 参考 [STATE_DEFINITIONS.md § 5](../sync_system/STATE_DEFINITIONS.md) + +--- + +### Stage 4: 同步结果报告 + +**目标**: 打印同步结果摘要,帮助用户了解同步情况 + +**报告内容**: +1. **节点统计**:按 node_type 统计各种 action/status 的节点数量 +2. **绑定关系**:每个 node_type 的绑定记录数 +3. **异常检查**:扫描并报告异常情况: + - CREATE 成功但 data_id 为空(DataSource 回填失败) + - CREATE 成功但绑定记录缺失 + - UPDATE/CREATE 失败的节点及错误原因 + +**输出示例**: +``` +================================================================================ +📊 Local Collection Summary +================================================================================ +Node Type Bindings Create Update Delete None Total +-------------------------------------------------------------------------------- +project 5/5 0(0/0/0) 2(2/0/0) 0(0/0/0) 3 5(5/0/0) +contract 10/12 2(2/0/0) 5(5/0/0) 0(0/0/0) 5 12(12/0/0) +``` + +**注意**: 此阶段不修改任何状态,仅作为信息展示。 + +--- + +### Stage 5: 状态持久化 + +**持久化内容**: +- `binding_status`, `action`, `status` 的最终值 +- `data_id` (可能在 CREATE 后更新) +- `error` (如果失败) +- 绑定关系的完整映射 + +--- + +## 错误处理策略 + +| 阶段 | 失败类型 | 处理策略 | +|------|---------|---------| +| Stage 0 | 初始化失败 | **终止流程**,抛出异常 | +| Stage 1 | 数据加载失败 | **终止流程**,抛出异常 | +| Stage 2 & 3 | 代码异常 | **终止流程**,抛出异常 | +| Stage 2: create/update 内联检查 | 依赖ID未解析、data_id缺失 | **继续流程**,节点标记为 DEPENDENCY_ERROR 或 PRECONDITION_FAILED | +| Stage 2 & 3 | API 调用失败 | **继续流程**,标记节点 FAILED | +| Stage 4 | - | 总是继续,仅作为报告 | +| Stage 5 | 持久化失败 | **记录错误**,不影响内存状态 | + +--- + +## 节点状态完整时间线 + +``` +┌──────────────┬─────────────┬────────┬────────┬─────────┐ +│ 阶段 │ binding_ │ action │ status │ data_id │ +│ │ status │ │ │ │ +├──────────────┼─────────────┼────────┼────────┼─────────┤ +│ 数据加载 │ UNCHECKED │ NONE │PENDING │ 已加载 │ +│ Bind │ NORMAL/... │ NONE │PENDING │ 已加载 │ +│ Create │ NORMAL │ CREATE │PENDING │ ""* │ +│ Commit Create│ NORMAL │ CREATE │SUCCESS │ 远程ID** │ +│ Update │ NORMAL │ UPDATE │PENDING │ 已加载 │ +│ Commit Update│ NORMAL │ UPDATE │SUCCESS │ 已加载 │ +└──────────────┴─────────────┴────────┴────────┴─────────┘ + +* 新创建的节点 data_id 初始为 "" +** CREATE 成功后 data_id 立即更新为远程分配的ID,下游依赖可用 +``` + +--- + +## 配置驱动的流程控制 + +### 跳过某些阶段 + +```python +pipeline_config = { + "skip_bind": False, # 是否跳过 bind + "skip_create": False, # 是否跳过 create + "skip_update": False, # 是否跳过 update + "skip_post_check": False, # 是否跳过同步后检查 + "fail_on_warning": False, # Pre-Check 时是否将 WARNING 视为失败 +} +``` + +> **注意**:`skip_pre_check` 已移除,原 `_pre_commit_check` 逻辑已内联到 create/update 方法中。 +``` + +### 策略预设应用 + +```python +# 首次同步:启用自动绑定,双向创建 +for strategy in strategies: + strategy.apply_preset("first_sync") + +# 日常同步:仅推送更新 +for strategy in strategies: + strategy.apply_preset("push_only") +``` + +--- + +## 幂等性保证 + +**要求**: 同一个 Collection 的多次同步应该是幂等的。 + +**设计保证**: +1. **Bind 阶段**: 基于绑定记录判定,已绑定节点不会重复绑定 +2. **Create 阶段**: 已有绑定的节点 (NORMAL) 不会重复创建 +3. **Update 阶段**: 基于 `compute_diff()` 判定,无差异则不执行 +4. **Sync 阶段**: `action=NONE` 的节点跳过执行 + +**前提条件**: +- 绑定记录正确持久化 +- 节点的 `binding_status` 正确保存和加载 +- `compute_diff()` 逻辑准确 + +--- + +## 监控和日志 + +### 关键指标 + +| 指标 | 含义 | 阶段 | +|------|------|-----| +| `nodes_loaded` | 加载的节点总数 | Stage 1 | +| `nodes_normal` | NORMAL 状态节点数 | Stage 2.1 | +| `nodes_missing` | MISSING 状态节点数 | Stage 2.1 | +| `nodes_abnormal` | ABNORMAL+WARNING 节点数 | Stage 2.1 | +| `nodes_dep_error` | DEPENDENCY_ERROR 节点数 | Stage 2.1 | +| `actions_create` | CREATE 动作节点数 | Stage 2.2 | +| `actions_update` | UPDATE 动作节点数 | Stage 2.3 | +| `sync_success` | 同步成功节点数 | Stage 3 | +| `sync_failed` | 同步失败节点数 | Stage 3 | +| `success_rate` | 成功率 (success/total) | Stage 4 | + +### 日志级别 + +``` +INFO: 流程阶段切换、统计信息 +DEBUG: 节点级别的详细操作 +WARN: 检查发现的警告、同步失败 +ERROR: 检查发现的错误、致命异常 +``` + +--- + +## 参考文档 + +- [STATE_DEFINITIONS.md](../sync_system/STATE_DEFINITIONS.md) - 详细的状态定义和转换规则 +- [CHECK_SPEC.md](./CHECK_SPEC.md) - 检查点的实现细节和代码示例(可选) +# 1. 持久化 Collection +await local_collection.persist() +await remote_collection.persist() + +# 2. 持久化 Binding +await binding_manager.persist() +``` + +**持久化内容**: +- 节点的 `binding_status`, `action`, `status`, `error` +- 节点的 `data_id`(可能在 CREATE 后更新) +- 绑定关系的完整映射 + +--- + +## 错误处理策略 + +### 各阶段的失败处理 + +| 阶段 | 失败原因示例 | 处理策略 | +|------|------------|---------| +| Stage 1: 数据加载 | 网络错误、文件缺失 | **终止流程**,抛出异常 | +| Stage 2.1: Bind | 代码bug | **终止流程**,抛出异常 | +| Stage 2.2-2.3: Create/Update | 代码bug | **终止流程**,抛出异常 | +| Stage 2: create/update 内联检查 | 依赖ID未解析、data_id缺失 | **继续流程**,节点标记为 DEPENDENCY_ERROR 或 PRECONDITION_FAILED | +| Stage 3: Physical Sync | API错误、权限不足 | **继续流程**,标记节点为 FAILED | +| Stage 4: Post-Sync Check | 部分节点同步失败 | **继续流程**,打印警告 | +| Stage 5: Persistence | 磁盘满、权限错误 | **记录错误**,但不影响内存状态 | + +### 部分成功的处理 + +在 Stage 3 中,允许部分节点成功、部分失败: +- 成功的节点: `status = SUCCESS` +- 失败的节点: `status = FAILED`, `error = "错误信息"` + +Post-Sync Check 会统计成功率并给出警告。 + +--- + +## 配置驱动的流程控制 + +### 跳过某些阶段 + +通过配置控制哪些阶段执行: + +```python +pipeline_config = { + "skip_bind": False, # 是否跳过 bind + "skip_create": False, # 是否跳过 create + "skip_update": False, # 是否跳过 update + "skip_post_check": False, # 是否跳过同步后检查 + "fail_on_warning": False, # 是否将 WARNING 也视为失败 +} +``` + +### 策略预设应用 + +在 Stage 2 之前,可以应用策略预设: + +```python +# 首次同步:启用自动绑定,双向创建 +for strategy in strategies: + strategy.apply_preset("first_sync") + +# 日常同步:仅推送更新 +for strategy in strategies: + strategy.apply_preset("push_only") +``` + +--- + +## 监控和日志 + +### 关键指标 + +在各阶段收集以下指标: + +| 指标 | 含义 | +|------|------| +| `nodes_loaded` | 加载的节点总数 | +| `nodes_bound` | 成功绑定的节点数 | +| `nodes_missing` | MISSING 状态的节点数 | +| `nodes_abnormal` | ABNORMAL/WARNING 状态的节点数 | +| `nodes_created` | CREATE 动作的节点数 | +| `nodes_updated` | UPDATE 动作的节点数 | +| `sync_success` | 同步成功的节点数 | +| `sync_failed` | 同步失败的节点数 | +| `errors_count` | 检查发现的 ERROR 数量 | +| `warnings_count` | 检查发现的 WARNING 数量 | + +### 日志级别 + +``` +INFO: 流程阶段切换、统计信息 +DEBUG: 节点级别的详细操作 +WARN: 检查发现的警告 +ERROR: 检查发现的错误、异常 +``` + +--- + +## 幂等性保证 + +**要求**: 同一个 Collection 的多次同步应该是幂等的。 + +**设计保证**: +1. **Bind 阶段**: 基于绑定记录判定状态,已绑定的节点不会重复绑定 +2. **Create 阶段**: 已有绑定的节点(NORMAL)不会重复创建 +3. **Update 阶段**: 基于 `compute_diff()` 判定,无差异则不执行 +4. **Sync 阶段**: DataSource 根据 `action` 执行,`action=NONE` 的节点跳过 + +**前提条件**: +- Binding 记录正确持久化 +- 节点的 `binding_status` 正确保存和加载 +- `compute_diff()` 逻辑准确 + +--- + +## 下一步 + +详细的检查规范和状态转换规则,请参考: +- [CHECK_SPEC.md](./CHECK_SPEC.md) - 检查点详细规范 +- [STATE_TRANSITIONS.md](./STATE_TRANSITIONS.md) - 状态转换表 + diff --git a/docs/archive/from_root_docs/节点生命周期状态转移.md b/docs/archive/from_root_docs/节点生命周期状态转移.md new file mode 100644 index 0000000..3cdab6f --- /dev/null +++ b/docs/archive/from_root_docs/节点生命周期状态转移.md @@ -0,0 +1,492 @@ +# 节点生命周期状态转移 (Node Lifecycle State Transitions) + +本文档从一个**单节点视角**出发,完整描述一个 `SyncNode` 从诞生到持久化的全部状态变化。 + +> **代码映射**: +> - 持久化重置:`sync_system_new/common/state_reset.py` → `NodeStateReset` +> - 绑定判定:`sync_system_new/sync_system/decision.py` → `SyncDecisionEngine` +> - 策略执行:`sync_system_new/sync_system/strategy.py` → `DefaultSyncStrategy` +> - ID 解析:`sync_system_new/sync_system/resolve_ids.py` → `IDResolver` +> - 物理同步:`sync_system_new/datasource/datasource.py` → `BaseDataSource` +> - Handler 降级:`sync_system_new/domain/*/api_handler.py` + +--- + +## 状态字段一览 + +| 字段 | 类型 | 含义 | 谁负责设置 | +|------|------|------|-----------| +| `binding_status` | BindingStatus | 绑定健康状态 | Strategy.bind() | +| `action` | SyncAction | 待执行动作 | Strategy.create() / update() | +| `status` | SyncStatus | 执行结果状态 | DataSource.sync_all() | +| `data_id` | str | 业务主键ID | 数据加载 / DataSource 回填 | +| `error` | str \| None | 错误信息 | 各阶段 | + +--- + +## 完整生命周期 + +### 第一次运行(无持久化数据) + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 节点尚不存在 │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 数据源加载 (Stage 1) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 节点诞生 │ +│ │ +│ binding_status = UNCHECKED ← Collection 创建节点时的初始值 │ +│ action = NONE │ +│ status = PENDING │ +│ data_id = "abc-123" ← 从数据源获取的业务主键 │ +│ data = {...} ← 从数据源获取的业务数据 │ +│ origin_data = {...} ← 同上,原始快照 │ +│ depend_ids = [] ← 空,待 bind 阶段填充 │ +│ error = None │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +### 第二次及后续运行(有持久化数据) + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 从持久化恢复(原始值) │ +│ │ +│ binding_status = NORMAL (上次值) │ +│ action = UPDATE (上次值) │ +│ status = SUCCESS (上次值) │ +│ data_id = "abc-123" │ +│ error = None (上次值) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 阶段1:加载时重置 (NodeStateReset) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 阶段1重置后 │ +│ │ +│ binding_status = UNCHECKED ← 重置(每次重新判定) │ +│ action = UPDATE ← 保留!(用于阶段2识别 CREATE 失败) │ +│ status = SUCCESS ← 保留!(不自动重置) │ +│ data_id = "abc-123" ← 不变 │ +│ data = None ← 重置(等待数据源覆盖) │ +│ origin_data = None ← 重置(等待数据源覆盖) │ +│ error = None ← 清空(避免上次错误干扰) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 阶段2:CREATE 僵尸清理 + (只影响 action=CREATE 且 status=FAILED 或 data_id="" 的节点) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 阶段2清理后(正常节点) │ +│ │ +│ action = NONE ← 全部重置为 NONE,准备进入策略阶段 │ +│ 其他字段不变 │ +│ │ +│ (若为 CREATE 僵尸节点:直接从 Collection 删除 + 解除绑定) │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + 数据源加载覆盖 (Stage 1 后半) + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 数据源加载后 │ +│ │ +│ data = {...} ← 数据源最新数据覆盖 │ +│ origin_data = {...} ← 数据源最新数据覆盖 │ +│ 其他字段不变 │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Bind 阶段状态转移 (Stage 2.1) + +Bind 分三个子阶段顺序执行,每个子阶段只修改 `binding_status`。 + +### Phase 1: 核心状态判定 + +> **代码**:`strategy_ops/bind_ops.py::phase_core_state()` → `SyncDecisionEngine.determine_core_status()` + +``` +输入:binding_status = UNCHECKED + + ┌─ 有绑定记录? + │ + ┌─────┤ + │ YES │ + │ └─── 本地数据 + 远程数据 都健康? + │ │ + │ ┌────┴────┐ + │ │ YES │ NO + │ ▼ ▼ + │ NORMAL WARNING / ABNORMAL + │ + │ NO + └──────────────► MISSING +``` + +| 输入条件 | binding_status 输出 | +|---------|-------------------| +| 有绑定,双方数据健康 | **NORMAL** | +| 有绑定,自身数据损坏 | **ABNORMAL** | +| 有绑定,对方数据损坏 | **WARNING** | +| 无绑定记录 | **MISSING** | + +### Phase 2: 依赖检查 + +> **代码**:`strategy_ops/bind_ops.py::phase_dependency_check()` → `strategy_ops/bind_ops.py::check_dependencies_for_nodes()` + +**仅处理 `binding_status = MISSING` 的节点**,其他状态跳过。 + +``` +输入:binding_status = MISSING + + ┌─ 有配置 depend_fields? + │ + ┌─────┤ + │ NO └──► 保持 MISSING(无依赖,直接通过) + │ + │ YES ──► 逐一检查依赖节点: + │ │ + │ ┌────┴────────────────────────┐ + │ │ 全部依赖节点: │ + │ │ - 存在? ✅ │ + │ │ - binding_status=NORMAL? ✅ │ + │ │ - data_id 非空? ✅ │ + │ └────┬────────────────────────┘ + │ │ + │ ┌────┴────┐ + │ │ 全通过 │ 任一失败 + │ ▼ ▼ + │ MISSING DEPENDENCY_ERROR + │ + error = "依赖项不满足: ..." + │ + depend_ids 已填充 +``` + +**副作用**:无论检查是否通过,都会填充 `node.depend_ids`。 + +### Phase 3: 自动绑定 + +> **代码**:`strategy_ops/bind_ops.py::phase_auto_binding()` + +**仅处理 `binding_status = MISSING` 且依赖已通过的节点**。 + +``` +输入:binding_status = MISSING + +auto_bind = False? + └──► MISSING → WARNING("跳过自动绑定,无法确认是否需要创建") + +auto_bind = True: + │ + ├─ 业务键字段缺失? + │ └──► MISSING → WARNING("缺少业务键字段: ...") + │ + ├─ 业务键中 ID 字段解析失败? + │ └──► MISSING → DEPENDENCY_ERROR("业务键中的ID字段解析失败") + │ + ├─ 去噪后 1:1 匹配? + │ └──► MISSING → NORMAL(执行自动绑定,建立绑定记录) + │ + ├─ N:0(无远程匹配)? + │ ├──► create_enabled = True → MISSING → NORMAL,并 spawn 目标 CREATE 节点(S06) + │ └──► create_enabled = False → MISSING → WARNING(孤儿且不允许自动创建,需人工处理) + │ + └─ N:M / 多对多 / 多对一? + └──► MISSING → WARNING("存在多个候选节点,无法自动绑定") +``` + +### Bind 阶段结束后可能的状态 + +| binding_status | 后续可执行的操作 | +|---------------|----------------| +| **NORMAL** | UPDATE(如有差异)| +| **MISSING** | CREATE | +| **ABNORMAL** | 无(需人工) | +| **WARNING** | 无(阻止自动操作) | +| **DEPENDENCY_ERROR** | 无(等待依赖修复) | + +--- + +## Create 阶段状态转移 (Stage 2.2) + +> **代码**:`create()` → `strategy_ops/create_ops.py::add_create_action()` + +> **对齐说明(与状态机配置一致)**: +> - create_prepare 的入口仍是源节点 `binding_status = MISSING`。 +> - 但当前配置下,`N:0 + create_enabled=true` 可以在自动绑定阶段直接把源节点转为 `NORMAL`,并 `emit spawn_target_node_state=S06`。 +> - 因此“触发创建”的入口有两条: +> 1) auto_bind 分支(E08f)直接 spawn; +> 2) create_prepare 分支(E09b)在 create 检查成功后 spawn。 + +**仅处理 `binding_status = MISSING` 的节点**。 + +``` +输入:源节点 binding_status = MISSING, action = NONE + + ┌─ 源节点数据为空? + │ └──► 跳过,记录日志 + │ + ├─ IDResolver.resolve_and_validate() 失败? + │ └──► binding_status → DEPENDENCY_ERROR + │ error = "创建时依赖 ID 未解析: ..." + │ + └─ 成功 ──► 在目标 Collection 创建新节点 + │ + ├─ 源节点: + │ binding_status → NORMAL("从本地创建到远程") + │ action 不变(仍为 NONE) + │ + └─ 新建目标节点: + binding_status = NORMAL + action = CREATE + status = PENDING + data_id = ""(待远程返回) + data = 已替换 ID 的数据副本 + │ + └─ 同时建立绑定记录:local_id ↔ remote_id +``` + +--- + +## Commit Creates — 物理同步 (Stage 2.3) + +> **代码**:`DataSource.sync_all()` → Handler.create() + +``` +输入:action = CREATE, status = PENDING + + ┌─ Handler 执行 API 调用 + │ + ├─ 同步 API 成功(200/201) + │ └──► status → SUCCESS + │ data_id = "remote-xyz"(远程分配的 ID 回填) + │ data["id"] = "remote-xyz"(主键字段回写) + │ + ├─ 异步 API 提交成功(202) + │ └──► status → IN_PROGRESS + │ context.task_id = "task-xxx" + │ │ + │ └─ 轮询结果: + │ ├─ 成功 → status → SUCCESS, data_id 回填 + │ ├─ 失败 → status → FAILED, error = "..." + │ └─ 超时 → status → FAILED, error = "Timeout" + │ + └─ API 失败(4xx/5xx) + └──► status → FAILED + error = "远程操作失败: ..." +``` + +--- + +## Update 阶段状态转移 (Stage 2.4) + +> **代码**:`update()` → `strategy_ops/update_ops.py::add_update_action()` + +> **对齐说明**:图里的 `E12a` 从 `S01` 出发并不矛盾。`S01` 约束的是“源节点”有 `data_id`; +> `E12a` 检查的是“目标节点”是否有 `data_id`(guard: `target_has_data_id=false`),两者不是同一个对象。 + +**过滤条件**:`binding_status = NORMAL` 且 `status != FAILED` + +``` +输入:源节点 binding_status = NORMAL, action = NONE + + ┌─ status == FAILED? + │ └──► 跳过(保护上次失败的状态和错误信息) + │ + ├─ 源节点数据为空? + │ └──► 跳过 + │ + ├─ 通过绑定找不到目标节点? + │ └──► 跳过,记录日志 + │ + ├─ 目标节点 data_id 为空? + │ └──► 目标节点 status → PRECONDITION_FAILED + │ ("目标节点缺少 data_id") + │ + ├─ IDResolver.resolve_and_validate() 失败? + │ └──► 目标节点 action → UPDATE + │ 目标节点 status → PRECONDITION_FAILED + │ 目标节点 error = "依赖 ID 未解析: ..." + │ + ├─ _needs_update() 判定无差异? + │ └──► 跳过(不设置 action) + │ + └─ 有差异 ──► 更新目标节点: + action → UPDATE + status → PENDING + data = 已替换 ID 的数据副本 + error = None +``` + +--- + +## Commit Updates — 物理同步 (Stage 2.5) + +> **代码**:`DataSource.sync_all()` → Handler.update() + +``` +输入:action = UPDATE, status = PENDING + + ┌─ Handler 构建 API 请求 + │ + ├─ Handler 发现无实际变更字段 + │ └──► action → NONE(Handler 降级,不提交 API) + │ + ├─ 同步 API 成功(200) + │ └──► status → SUCCESS + │ + ├─ 异步 API 提交成功(202) + │ └──► status → IN_PROGRESS → (轮询)→ SUCCESS / FAILED + │ + └─ API 失败 + └──► status → FAILED + error = "远程操作失败: ..." +``` + +--- + +## 持久化阶段 (Stage 5) + +``` +节点当前状态原样写入存储。 + +持久化字段: + ✅ node_id, data_id, data, origin_data + ✅ binding_status, action, status, error, context + ❌ depend_ids(不持久化,下次 bind 时从 data 实时计算) +``` + +--- + +## 全景时间线表 + +下表展示**一个节点在典型场景中的状态变化**: + +### 场景 A:首次创建(本地 → 远程) + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 数据加载 | UNCHECKED | NONE | PENDING | "abc-123" | None | +| bind phase1 | **MISSING** | NONE | PENDING | "abc-123" | None | +| bind phase2 | MISSING | NONE | PENDING | "abc-123" | None | +| bind phase3 | MISSING | NONE | PENDING | "abc-123" | None | +| create | **NORMAL** | NONE | PENDING | "abc-123" | None | +| _(新建远程节点)_ | NORMAL | **CREATE** | PENDING | **""** | None | +| commit create | NORMAL | CREATE | **SUCCESS** | **"remote-456"** | None | +| 持久化 | NORMAL | CREATE | SUCCESS | "remote-456" | None | + +### 场景 B:日常更新 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 持久化恢复 | NORMAL→**UNCHECKED** | CREATE→保留 | SUCCESS→保留 | "abc-123" | 清空 | +| 阶段2 action重置 | UNCHECKED | **NONE** | SUCCESS | "abc-123" | None | +| 数据源覆盖 | UNCHECKED | NONE | SUCCESS | "abc-123" | None | +| bind phase1 | **NORMAL** | NONE | SUCCESS | "abc-123" | None | +| update 检测差异 | NORMAL | NONE | SUCCESS | "abc-123" | None | +| _(目标节点)_ | NORMAL | **UPDATE** | **PENDING** | "remote-456" | None | +| commit update | NORMAL | UPDATE | **SUCCESS** | "remote-456" | None | + +### 场景 C:依赖阻断 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| 数据加载 | UNCHECKED | NONE | PENDING | "contract-789" | None | +| bind phase1 | **MISSING** | NONE | PENDING | "contract-789" | None | +| bind phase2 | **DEPENDENCY_ERROR** | NONE | PENDING | "contract-789" | "依赖项不满足: project_id: 状态=dep_err" | +| _(后续阶段不处理)_ | | | | | | +| 持久化 | DEPENDENCY_ERROR | NONE | PENDING | "contract-789" | "依赖项不满足..." | + +### 场景 D:CREATE 失败 → 下次自动恢复 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| **第 1 次运行** | | | | | | +| create | NORMAL | CREATE | PENDING | "" | None | +| commit create 失败 | NORMAL | CREATE | **FAILED** | "" | "远程操作失败: 500" | +| 持久化 | NORMAL | CREATE | FAILED | "" | "远程操作失败: 500" | +| **第 2 次运行** | | | | | | +| 阶段1恢复 | **UNCHECKED** | CREATE | FAILED | "" | **None** | +| 阶段2僵尸清理 | _(节点被删除,绑定被解除)_ | | | | | +| 数据源重新加载 | UNCHECKED | NONE | PENDING | "" → 新 node_id | None | +| bind → create | 重新走首次创建流程 | | | | | + +### 场景 E:UPDATE 失败 → 保留供人工处理 + +| 阶段 | binding_status | action | status | data_id | error | +|------|---------------|--------|--------|---------|-------| +| **第 1 次运行** | | | | | | +| update | NORMAL | UPDATE | PENDING | "remote-456" | None | +| commit update 失败 | NORMAL | UPDATE | **FAILED** | "remote-456" | "403 Forbidden" | +| 持久化 | NORMAL | UPDATE | FAILED | "remote-456" | "403 Forbidden" | +| **第 2 次运行** | | | | | | +| 阶段1恢复 | UNCHECKED | UPDATE | FAILED | "remote-456" | None | +| 阶段2 action重置 | UNCHECKED | **NONE** | **FAILED** | "remote-456" | None | +| bind | NORMAL | NONE | FAILED | "remote-456" | None | +| update 跳过 | _(status=FAILED,自动跳过)_ | | | | | +| 持久化 | NORMAL | NONE | FAILED | "remote-456" | None | +| _(需人工重置 status 后才能重新更新)_ | | | | | | + +--- + +## 状态转换合法性约束 + +### binding_status 允许的转换 + +``` +UNCHECKED → NORMAL (核心判定: 有绑定且健康) +UNCHECKED → MISSING (核心判定: 无绑定记录) +UNCHECKED → ABNORMAL (核心判定: 自身数据损坏) +UNCHECKED → WARNING (核心判定: 对方数据损坏) + +MISSING → DEPENDENCY_ERROR (依赖检查: 父节点不满足) +MISSING → WARNING (自动绑定: 业务键缺失 / 多候选 / auto_bind=False) +MISSING → DEPENDENCY_ERROR (自动绑定: ID 字段解析失败) +MISSING → NORMAL (自动绑定: 1:1 成功) +MISSING → NORMAL (create: 源节点创建成功后) +MISSING → DEPENDENCY_ERROR (create: ID 解析失败) +``` + +> **注意**:当前 `SyncNode.set_binding_status()` 不做转换合法性校验【未实现】。 + +### action 允许的转换 + +``` +NONE → CREATE (create: 新建目标节点) +NONE → UPDATE (update: 检测到差异) +UPDATE → NONE (Handler 降级: 实际无变更字段) +``` + +### status 允许的转换 + +``` +PENDING → IN_PROGRESS (DataSource: 异步提交成功) +PENDING → SUCCESS (DataSource: 同步执行成功) +PENDING → FAILED (DataSource: 执行失败) +PENDING → SKIPPED (DataSource: 被跳过) + (常见于 CREATE/UPDATE:Handler 返回 SKIPPED(无可执行操作/业务条件不满足),对应状态机里的 E19→S13 或 E20→S14) +PENDING → PRECONDITION_FAILED (Strategy: 前置条件不满足) +IN_PROGRESS → SUCCESS (DataSource: 异步轮询成功) +IN_PROGRESS → FAILED (DataSource: 异步轮询失败/超时) +``` + +> **注意**:当前 `SyncNode.set_status()` 不做转换合法性校验【未实现】。 + +--- + +## 参考文档 + +- [状态定义规范](./状态定义规范.md) — 状态枚举和判定规则 +- [持久化与人工介入规范](./持久化与人工介入规范.md) — 持久化重置策略 +- [编排流程规范](./编排流程规范.md) — Pipeline 阶段定义 +- [架构分层设计](./架构分层设计.md) — 各层职责 +- [node_id_data_id_lifecycle](./node_id_data_id_lifecycle.md) — ID 生命周期 diff --git a/docs/archive/goals.md b/docs/archive/goals.md new file mode 100644 index 0000000..fa580f4 --- /dev/null +++ b/docs/archive/goals.md @@ -0,0 +1,11 @@ +# 同步系统重构目标 + +## 范围 +- 在 `sync_state_machine/` 下实现新状态机运行时,不改 `sync_system_new/` 现有实现。 +- 第一阶段聚焦 JSONL 路径,API 路径后续接入。 + +## 成功标准 +- 状态机配置可独立校验与出图。 +- 运行时可根据事件与上下文输出迁移决策。 +- 自动化测试可覆盖所有事件(E00~E20)并统计状态覆盖。 +- domain 业务层不直接改状态,状态变更由状态机输出驱动。 diff --git a/docs/archive/migration_map.md b/docs/archive/migration_map.md new file mode 100644 index 0000000..de79084 --- /dev/null +++ b/docs/archive/migration_map.md @@ -0,0 +1,15 @@ +# 迁移映射 + +## 旧 -> 新 +- `sync_system_new/state_machine/*` -> `sync_state_machine/config|tools/*` +- `strategy.py` 决策逻辑 -> `sync_state_machine/engine/* + sync_state_machine/sync_system/strategy.py` +- `datasource.py` 状态写回 -> `sync_state_machine/datasource/datasource.py` +- bind/create/update 事件驱动 -> `sync_state_machine/sync_system/strategy.py` 直接 dispatch(无桥接层) + +## 不变项 +- `sync_system_new/domain/*` 业务处理逻辑保持不动。 +- `schemas/`、`filtered_datasource/` 不修改。 + +## 目录差异说明 +- `sync_state_machine/adapters/` 已移除,避免“新目录实现 + 适配桥接”双轨并存。 +- 状态机配置、执行、测试均在 `sync_state_machine` 内闭环。 diff --git a/docs/auto_test_spec/agent_auto_test_method.md b/docs/auto_test_spec/agent_auto_test_method.md new file mode 100644 index 0000000..cee0e60 --- /dev/null +++ b/docs/auto_test_spec/agent_auto_test_method.md @@ -0,0 +1,454 @@ +# 自动测试说明 + +## 1. 目标 + +这套测试只做一件事: + +- 用固定配置初始化测试环境; +- 一键运行测试; +- 验证同步系统能不能完成一轮正常同步; +- 验证常见的更新接口能不能工作; +- 能把问题大致分成三类:数据问题、推送系统问题、后端接口问题。 + +不追求把所有情况都测完,也不追求覆盖所有脏数据。测试深度控制在: + +- 能跑通一次正常流程; +- 能验证一批关键 update; +- 能处理一些基本异常; +- 每轮都能留下清楚的报告,供下一轮继续改。 + +## 2. 测试系统的组成 + +测试系统由 4 部分组成: + +1. **测试配置** +2. **初始化脚本** +3. **按 domain 拆分的用例** +4. **统一运行脚本** + +只要把这 4 部分准备好,后面就应该做到:**运行一个脚本,就自动完成初始化、执行、分析、出报告。** + +### 当前已落地的文件 + +目前已经先实现了一版最小骨架: + +- 测试总配置:[tests/fixtures/auto_sync/auto_test_config.yaml](tests/fixtures/auto_sync/auto_test_config.yaml) +- 流水线测试配置:[run_profiles/jsonl_to_api.test.yaml](run_profiles/jsonl_to_api.test.yaml) +- 初始化脚本:[scripts/auto_test_init.py](scripts/auto_test_init.py) +- 统一运行脚本:[scripts/run_auto_test.py](scripts/run_auto_test.py) +- 公共工具:[scripts/auto_test_lib.py](scripts/auto_test_lib.py) +- 第一个 domain 用例:[tests/fixtures/auto_sync/domains/contract.yaml](tests/fixtures/auto_sync/domains/contract.yaml) + +## 3. 配置管理 + +测试环境必须基于配置初始化,不能靠手工改路径。 + +配置里至少要能定义这些内容: + +- 后端代码目录; +- 后端启动命令; +- 后端恢复数据库命令; +- 测试使用的数据库名; +- CouchDB 连接信息; +- 本地同步状态数据库路径; +- 基础种子数据目录; +- 同步测试数据目录; +- 临时测试数据目录; +- 同步系统运行配置文件路径。 + +建议单独准备一个测试配置,例如: + +- `run_profiles/jsonl_to_api.test.yaml` +- `docs/auto_test_spec` 中再约定测试总配置文件 + +### 数据目录分工 + +测试里至少有 3 类数据目录: + +1. **基础种子数据** + - 用来恢复后端里那些不能通过同步创建的数据。 + - 例如:`company`、`project`、`design_doc`。 + - 这类数据先进入后端数据库,给后续同步提供依赖。 + +2. **同步测试数据** + - 用来测试可创建、可更新的业务数据。 + - 例如合同、结算、施工任务等。 + +3. **临时运行目录** + - 每次测试前,把测试数据复制到这里。 + - 后续每一轮如果要改数据,也只改这里,不改原始测试集。 + +## 4. 初始化方式 + +初始化必须自动完成,不能再靠手工执行几条命令。 + +目标流程如下: + +1. 读取测试配置; +2. 如有旧测试数据库,先自动删除; +3. 自动删除本地同步状态数据库; +4. 自动执行后端的数据库恢复命令,导入基础种子数据; +5. 自动启动后端; +6. 自动等待后端 ready; +7. 自动准备临时测试目录; +8. 开始跑测试。 + +### 运行后的要求 + +- **测试跑完以后,数据库保留**,方便查看结果; +- **下次再运行时,再自动清空旧库并重建**; +- 不要求每次结束自动销毁环境。 + +## 5. 运行方式 + +不强制使用 `pytest`。 + +当前更适合的方式是: + +- 用一个主脚本统一运行全部流程; +- domain 用例由脚本按顺序调度; +- 每个 domain 可以包含多轮 pipeline; +- 每轮的输入数据和检查点都由脚本控制。 + +也就是: + +- `测试配置 + 初始化脚本 + 分 domain 的用例 + 一个完整运行脚本` + +## 6. 测试轮次 + +一次完整测试,允许分成多轮 pipeline。 + +典型做法: + +### 第 1 轮:初始化后首次同步 + +目的: + +- 验证基础依赖准备正确; +- 验证 create 流程能跑通; +- 验证绑定关系是否正常。 + +### 第 2 轮:在临时目录修改部分数据后再次同步 + +目的: + +- 验证 update 接口; +- 验证哪些数据应该更新; +- 验证哪些数据应该保持不动。 + +### 第 3 轮:补充少量基本异常场景 + +目的: + +- 验证系统遇到常见错误时能不能给出清楚结果; +- 验证错误是否能定位到数据、推送系统或后端。 + +不要求无限轮次,也不要求复杂压力测试。 + +## 7. Domain 用例怎么设计 + +每个 domain 单独设计用例,例如: + +- `company` +- `project` +- `contract` +- `supplier` +- `construction_task` +- `contract_settlement` + +但不是所有 domain 都从创建开始测。 + +要根据业务真实情况决定: + +- 哪些 domain 只能作为基础种子存在; +- 哪些 domain 可以通过同步创建; +- 哪些 domain 要重点测 update。 + +### Domain 用例必须写清楚的内容 + +每个 domain 的用例说明都要先写文字,再写代码。文字说明必须经过你审定。 + +每组用例至少写清楚: + +1. 这个 domain 的前置依赖是什么; +2. 这个 domain 本轮准备哪些测试数据; +3. 第几轮会创建哪些记录; +4. 第几轮会修改哪些字段; +5. 预期通过什么方式判断结果; +6. 这个用例主要想识别哪类问题。 + +## 8. Domain 用例的测试原则 + +### 原则 1:优先覆盖大部分接口 + +目标不是追求完美覆盖,而是尽量覆盖大部分 create / update 接口,尤其是 update。 + +### 原则 2:只测明确的业务关系 + +用例里的依赖关系必须有文字说明,不能边跑边猜。 + +### 原则 3:可以通过改数据来构造用例 + +允许通过修改临时目录里的数据来构造 update 场景。 + +### 原则 4:判断结果不能只看日志 + +要结合下面几类证据一起判断: + +- 日志; +- collection 中的数据; +- 持久化数据库中的结果; +- 绑定记录; +- 同步状态数据库。 + +### 原则 5:用例要能分出问题归属 + +每个用例都应该尽量帮助判断问题属于: + +- 测试数据问题; +- 推送系统问题; +- 后端接口逻辑问题。 + +## 9. 建议的用例层次 + +每个 domain 的用例,优先按下面 4 类来补: + +1. **正常创建** +2. **正常更新** +3. **关键绑定关系检查** +4. **基本异常检查** + +这里的“基本异常”只做常见的、对当前系统最有价值的,例如: + +- 缺少依赖; +- 关键字段不合法; +- 远端返回明确错误; +- 本地状态和远端状态不一致。 + +## 10. 运行脚本应该负责什么 + +统一运行脚本应负责: + +1. 读取测试配置; +2. 清空旧测试环境; +3. 初始化后端数据库; +4. 启动后端并等待可用; +5. 准备临时测试数据; +6. 按 domain 顺序执行各轮用例; +7. 每轮运行 pipeline; +8. 收集结果; +9. 输出报告。 + +## 11. 测试报告要求 + +每轮都要有清晰报告,给下一轮继续优化使用。 + +报告至少包含: + +- 测试时间; +- 使用的配置; +- 运行了哪些 domain; +- 每个 domain 跑了几轮; +- 每轮改了哪些数据; +- 每轮成功 / 失败统计; +- 失败样本; +- 问题分类:数据 / 推送系统 / 后端; +- 下一轮建议。 + +## 12. 当前结论 + +当前最合适的方案不是全量自动化,也不是一次性测完所有东西。 + +而是: + +- 先做一套固定配置的测试环境; +- 用一个脚本跑完整个流程; +- 从少量 but 关键的 domain 开始; +- 每个 domain 先把 create 和主要 update 跑通; +- 每轮都留下明确报告; +- 再逐步扩展。 + +这样更容易维护,也更适合后续让 Agent 按计划继续写代码。 + +## 13. 当前执行计划(2026-03-07) + +当前轮次先处理两类目标: + +1. `project_detail_data` + - 继续确认可按统一 `project_detail_data` 语义验证的 key 与相关 update 接口在测试报告中可见、可追踪; + - 重点检查它与后续 project 级 domain 连跑时是否污染状态。 + - 当前水电项目下,`production` 先不混入这组统一回归:后端已确认该接口会直接更新 `project` 字段,但不保证创建/更新可轮询的 `project_detail_data.production` 记录;后续待业务确认后再单列测试方案。 + +2. 剩余 domain + - 当前优先处理:`contract_settlement_detail`、`personnel`、`personnel_detail` + - 已完成并保持回归:`preparation`、`production`、`contract`、`contract_settlement`、`construction_task`、`construction_task_detail`、`material`、`material_detail` + - 之后再继续:`units`、`contract_change`、`lar`、`lar_change` + +本轮执行顺序: + +1. 先补齐文字测试计划; +2. 再修改测试脚本与 `tests/` 下测试数据; +3. 逐个 domain 跑通; +4. 最后回到整套自动测试顺序验证全量可跑通。 + +### 本轮强约束 + +- **禁止修改 `schemas/` 下任何文件。** +- 不允许为了让测试通过而绕过 schema 校验。 +- 如果问题根因是后端接口/后端返回/后端数据模型不一致,应直接在报告里暴露并记录,不擅自改 schema。 +- 只有在确认是后端错误并得到明确指示后,才讨论是否调整类型定义。 + +### 本轮排查重点 + +1. `project_detail_data` 单跑已基本可用,但要继续验证与 `preparation`、`production` 连跑时是否造成绑定或状态污染; +2. `preparation`、`production` 当前更像是“整套顺序执行时失败、单独执行可通过”的问题,优先检查运行顺序、临时数据、持久化状态和绑定残留; +3. 其余 domain 按“先单 domain 跑通,再放回全量顺序”推进; + - 当前先按 `contract_settlement_detail -> personnel -> personnel_detail` 顺序落地; +4. 每修完一个 domain,都要保证报告中能看出本轮覆盖内容、绑定结果、字段变化和失败归因。 +5. 对 `project_detail_data.production`,禁止再用“接口没报错就直接记成功”的短路逻辑掩盖真实语义;当前阶段直接绕过该 key 的统一回归,保留差异说明。 + +## 14. 大规模测试方法:按轮迭代,而不是一次堆上下文 + +大规模测试的目标不是“把所有失败细节一次讲完”,而是: + +- 每一轮只有一个清晰基线; +- 每一轮只记录少量必须保留的信息; +- 每一轮都能看到总计变化; +- 每一轮都能区分“新问题、已修复问题、遗留问题”。 + +当前推荐固定采用 **单 domain 验证 + 全量聚合回归** 的两层节奏。 + +### 14.1 固定节奏 + +每一轮都按下面顺序执行: + +1. **选定本轮目标** + - 只选 1 个主问题,或者 1 组同类问题。 + - 例如: + - 一个 domain 的 update 接口失败; + - 一组共享 helper 导致的脚本设计问题; + - 一类后端读写不一致问题。 + +2. **先单 domain 复现** + - 用 [scripts/run_auto_test.py](scripts/run_auto_test.py) 只跑目标 domain。 + - 目的不是求“全绿”,而是先确认问题是否稳定复现。 + +3. **定位并修复一类根因** + - 如果是测试脚本问题,就只修脚本; + - 如果是后端问题,就在报告里明确标注为后端; + - 如果是数据问题,就保留失败,不用 fallback 掩盖。 + +4. **回跑目标 domain** + - 只看本 domain 是否改善; + - 记录这轮减少了多少失败 case。 + +5. **再跑聚合回归** + - 用 [scripts/run_auto_test_all_domains.py](scripts/run_auto_test_all_domains.py) 执行全量聚合; + - 当前聚合模式是“**每个 domain 独立初始化并单独执行**”,用于避免跨 domain 状态污染。 + +6. **输出轮次结论** + - 只保留: + - 总 case 数; + - 通过 / 失败数; + - 新增失败; + - 已修复失败; + - 遗留失败; + - 每个遗留失败的归因分类。 + +### 14.2 每轮只保留 4 份信息 + +为了避免上下文失控,每轮总结时只保留下面 4 份信息: + +1. **总计快照** + - `total_domains` + - `passed_domains` + - `failed_domains` + - `total_cases` + - `passed_cases` + - `failed_cases` + +2. **变化清单** + - 本轮修复了哪些 case; + - 本轮新增了哪些 case; + - 哪些 case 没变化。 + +3. **失败分类表** + - `script_design`:脚本设计 / 运行配置 / 断言策略问题; + - `push_system`:状态机、绑定、依赖、持久化、推送链路问题; + - `backend`:后端接口、后端读写模型、后端返回值问题; + - `data`:测试数据不满足前置条件或数据本身不合法; + - `flaky`:暂时只在聚合中出现、单跑不能稳定复现的问题。 + +4. **下一轮唯一目标** + - 下一轮最多列 1~3 个目标; + - 不把所有猜测都带到下一轮。 + +### 14.3 轮次汇总格式 + +每轮报告建议固定成下面的结构: + +1. **Round N 总计** +2. **与 Round N-1 对比** +3. **本轮修复** +4. **本轮新增** +5. **遗留问题分类** +6. **下一轮目标** + +建议直接从聚合报告的 `summary.json` 中抽取总计,避免手工整理时带入过多细节。 + +### 14.4 建议的对比口径 + +比较两轮结果时,统一只按 `domain::round_name` 比较,不按日志文本比较。 + +也就是把每个 case 视为一个稳定键,例如: + +- `project::round_2_base_info_update` +- `project::round_3_investment_update` +- `material_detail::round_2_update` + +这样做的好处是: + +- 总数稳定; +- 对比简单; +- 很容易看出某个 case 是“由失败转通过”,还是“仍然失败”。 + +### 14.5 建议的推进策略 + +对于 10+ domain、数十个 case 的回归,建议始终按下面方式推进: + +1. **先消灭稳定复现的单点失败** + - 先修能稳定复现的问题,不先追偶发问题。 + +2. **再处理共享根因** + - 如果多个 domain 共用同一个 helper、同一个运行配置、同一种绑定策略,优先处理这一层。 + +3. **最后单列 flaky** + - 聚合里偶发失败、单跑通过的问题,不直接混入主结论; + - 先标成 `flaky`,待重复出现后再升级处理。 + +### 14.6 当前这套系统中的实际判定方法 + +当前推荐把问题按下面顺序判定: + +1. **先看单 domain 是否稳定失败** + - 如果单跑失败,优先查该 domain 自身脚本、数据、后端接口。 + +2. **再看聚合回归是否额外引入失败** + - 如果单跑通过、聚合失败,优先怀疑: + - 运行顺序; + - 环境残留; + - 报告聚合方式; + - 偶发后端错误。 + +3. **最后看后端是否写了但读不出来** + - 如果 update 接口已命中,但回读字段缺失或不一致,要明确归类为 `backend`,而不是继续修改测试脚本绕过。 + +### 14.7 本文档要求的轮次目标 + +每一轮结束后,必须能一句话回答下面 3 个问题: + +1. **总计有没有变好?** +2. **变好是因为修了脚本、推送系统,还是确认了后端问题?** +3. **下一轮只追哪一个主问题?** + +如果一轮总结不能回答这 3 个问题,就说明这轮上下文保留得太多、结论还不够收敛。 diff --git a/docs/auto_test_spec/large_scale_test_control.md b/docs/auto_test_spec/large_scale_test_control.md new file mode 100644 index 0000000..ae99bba --- /dev/null +++ b/docs/auto_test_spec/large_scale_test_control.md @@ -0,0 +1,143 @@ +--- +large_scale_test: + config_path: tests/fixtures/auto_sync/auto_test_config.yaml + output_dir: test_results/auto_test/large_scale + fail_on_failed_cases: false + default_runner: aggregate + default_init_mode: fresh + classification: + project::round_3_investment_update: backend + material_detail::round_2_update: flaky + rounds: + - id: round_01_full_baseline + title: 全量隔离基线 + enabled: true + runner: aggregate + init_mode: fresh + objective: 建立当前 19 个 domain 的隔离回归基线,并确认遗留失败的分类。 + focus: + - 全量聚合仍使用每个 domain 独立初始化,避免跨 domain 状态污染。 + - 先确认 project 与 material_detail 的当前状态,不在本轮混入额外修复动作。 + next_goal: 在保持全量基线的前提下,单独复核 project 与 material_detail,区分后端遗留问题和聚合偶发问题。 + - id: round_02_project_recheck + title: project 后端复核 + enabled: true + runner: domains + init_mode: fresh + domains: + - project + objective: 单独复核 project,确认 round_2 已修复,round_3 仅剩后端读回字段缺失。 + focus: + - 只跑 project,避免无关上下文。 + - 明确区分脚本问题与后端问题。 + classification: + project::round_3_investment_update: backend + next_goal: 保留脚本侧修复结论,把 project round_3 作为后端待修项持续跟踪。 + - id: round_03_material_detail_recheck + title: material_detail 波动复核 + enabled: true + runner: domains + init_mode: fresh + domains: + - material_detail + objective: 单独复核 material_detail,确认聚合中的 round_2 失败是否只是偶发。 + focus: + - 只跑 material_detail。 + - 如果单跑通过,就把聚合中的失败归为 flaky,不扩大处理范围。 + classification: + material_detail::round_2_update: flaky + next_goal: 若后续聚合再次出现同类失败,再升级为可复现问题处理。 +--- +# 大规模测试控制文档 + +这个文档同时承担两件事: + +1. **控制大规模测试怎么跑** +2. **记录每轮测试的目标、结果和改进过程** + +## 使用方式 + +- 控制入口:调整本文档 frontmatter 中的 `rounds` +- 执行脚本:[scripts/run_large_scale_auto_test.py](scripts/run_large_scale_auto_test.py) +- 默认命令:`python scripts/run_large_scale_auto_test.py` + +## 设计约束 + +- 默认使用 `fresh` 初始化,优先保证每轮从干净环境开始。 +- `aggregate` runner 适合大规模基线回归;它内部会对每个 domain 独立初始化。 +- `domains` runner 适合小范围复核;它会按 [scripts/run_auto_test.py](scripts/run_auto_test.py) 的语义执行。 +- 失败不应靠 fallback 掩盖;应在轮次记录里明确分类。 + +## Runner 约定 + +### `aggregate` + +- 调用 [scripts/run_auto_test_all_domains.py](scripts/run_auto_test_all_domains.py) +- 适合建立全量基线 +- 最能避免跨 domain 污染 + +### `domains` + +- 调用 [scripts/run_auto_test.py](scripts/run_auto_test.py) +- 适合复核单个或少量 domain +- 用于缩小上下文,验证某个问题是否稳定复现 + +## Init 策略约定 + +### `fresh` + +- 默认策略 +- 每轮都从新的初始化开始 +- 优先用于正式大规模测试 + +### `reuse` + +- 透传 `--skip-init` +- 只适合排查“连续执行是否污染状态”这一类问题 +- 不建议作为大规模基线默认值 + +### `clear-only` + +- 只清空环境,不执行业务轮次 +- 用于单独校验清理逻辑 + +## 执行记录 + +下面这部分由脚本自动更新,不手工编辑。 + + + +## 最近一次执行 20260308-012707 + +- 控制文档: docs/auto_test_spec/large_scale_test_control.md +- 执行轮次数: 1 +- 说明: 默认优先使用 fresh 初始化;若使用 aggregate runner,则每个 domain 仍会独立初始化。 + +### 轮次总览 + +| Round | 标题 | Runner | Init | Cases | Failed | 对比轮次 | 报告 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| round_01_full_baseline | 全量隔离基线 | aggregate | fresh | 42 | 1 | - | test_results/auto_test/reports/20260308-012707/report.md | + +### round_01_full_baseline - 全量隔离基线 + +- 目标: 建立当前 19 个 domain 的隔离回归基线,并确认遗留失败的分类。 +- 运行方式: aggregate +- 初始化策略: fresh +- 执行命令: /Users/zyl/my_projects/ecm_sync_system/.venv/bin/python /Users/zyl/my_projects/ecm_sync_system/scripts/run_auto_test_all_domains.py --config tests/fixtures/auto_sync/auto_test_config.yaml +- 单轮结果: 41 passed / 1 failed / 42 total cases +- Domain 结果: 18 passed / 1 failed / 19 total domains +- 原始报告: test_results/auto_test/reports/20260308-012707/report.md +- 原始汇总: test_results/auto_test/reports/20260308-012707/summary.json +- 本轮关注点: + - 全量聚合仍使用每个 domain 独立初始化,避免跨 domain 状态污染。 + - 先确认 project 与 material_detail 的当前状态,不在本轮混入额外修复动作。 +- 对比轮次: 无可比较轮次 +- 可比较 case 数: 0 +- 对比结果: 本轮没有可比改进项,或与此前轮次无重叠 case。 +- 失败归因: + - project::round_3_investment_update | backend | issues=1 | remote.project 字段校验失败: local=de4dc6d2-ea32-5c04-8430-83145d5d0765 target=f3e02e84-e81c-4aa6-88d4-f5aa108c8227; implementation_estimate: actual=None expected=1225000.0; static_total_investment: actual=None expected=1224300.0; completed_investment: actual=None expected=194500.0 +- 下一轮目标: 在保持全量基线的前提下,单独复核 project 与 material_detail,区分后端遗留问题和聚合偶发问题。 +- 脚本返回码: 1 + + \ No newline at end of file diff --git a/docs/auto_test_spec/差异字段汇总清单.md b/docs/auto_test_spec/差异字段汇总清单.md new file mode 100644 index 0000000..654752e --- /dev/null +++ b/docs/auto_test_spec/差异字段汇总清单.md @@ -0,0 +1,42 @@ +# 差异字段汇总清单 + +本文档记录了在同步推流测试中,本地(Local payload)与远端(Remote API 响应/DB落库)产生明确差异的字段。这些差异通常是因为远端后端代码主动忽略了前端传值,并采用关联覆盖、自动计算或默认补全所致。 + +> **备注**: +> 1. 根据梳理,完全被远端忽略的、只作为返回展示的字段已经从本地/远端的 `Create`、`Update` Schema 中彻底**剔除 (已删)**,不再作为入参推送。 +> 2. 标有 **[🔥远端接收并参与逻辑计算,但最终与本地不一致]** 的字段没有被删,作为强逻辑关联字段保留。 + +## 1. contract_settlement (合同结算) + +### Create 请求 (`ContractSettlementCreate`) +- **`contract_type` (合同类型)**: **(从 Schema 彻底剔除)** 远端完全不接收本地传值,根据关联逻辑自动赋予了实际类别(如 `'PC'`, `'GJ'`, `'E'`)。 +- **`contract_price` (合同总额)**: Create不需要传(本地本身无该入参)。远端在创建时直接从近端 Contract 数据库查取并覆盖。 + +### Update / Plan Update 请求 (`ContractSettlementUpdate` 等) +- **`plan_complete_date`**: **[🔥远端接收并参与逻辑计算,但最终与本地不一致]** 远端接收该字段,主要作用于 `clean_plan_nodes` 数据清洗以保证非法边界节点被剔除,同时可能经过远端状态与明细上托更新,使得终值可能扭转。 +- **`complete_price` / `status` / `delay_days` / `statistic_date` / `actual_start_date`**: 远端自动计算累加的衍生只读字段,均不在 Create / Update Schema 范畴中,故不维护入参。 + +## 2. construction_task & construction_task_detail (施工任务及明细) + +### Create 请求 (`ConstructionTaskCreate`) +- **`contract_quantity` (合同工程量)**: **(已从 Create Schema 彻底剔除)** 远端由于 `create_construction` 函数底层逻辑完全不读此字段,现已被安全双端剪除。不在初始创建时推送。 +- **`plan_start_date` / `plan_complete_date`**: **[🔥远端接收并参与逻辑计算,但最终与本地不一致]** 远端校验WBS结构树约束时会接收这俩参数进行合规计算,如果超出父子节点范围,存在自动修正或打回改写的逻辑。 + +### Update / Plan Update 请求 (`ConstructionTaskUpdate` 及明细) +- **`contract_quantity` (合同工程量)**: **[🔥远端接收并参与逻辑计算,但最终与本地不一致]** 在针对 `ConstructionPlanUpdate` 更新计划节点时,远程接受本字段控制计算与校验完成率基准,但仍可能会受 WBS 重制。 +- **`complete_quantity` / `complete_rate` / `rate` / `status` / `actual_complete_date`**: 纯内部状态更新触发、只读汇总,本地本来就未放至 Update Schema 内进行提交。 + +## 3. supplier (供应商) + +### 字段表现 +- **`city_name`, `province_name`, `country_name`**: Response专用字段。本地不推,仅仅是远端依托外部库映射在接口返回中补全的只读显示。 + +## 4. company (组织/公司) + +### 字段表现 +- **`parent_name` (父级机构名称)**: Response专用显示字段。远端依赖 `parent_id` 自动向上追溯返回字段。 + +## 5. production (产值等) + +### Create / Update 请求 +- **`is_exist`**: **[🔥远端接收并参与逻辑计算,但最终与本地不一致]** 本地推流中有 `is_exist = True`,且远端后端提取了 `production_data.is_exist` 进行存入判断(确实参与了代码落库前置过滤逻辑),但最后远程抓回验证时为 `None`,这归因于远端的废弃映射和覆盖逻辑。该字段须保留不能删。 diff --git a/docs/collection_query_and_upgrade_plan.md b/docs/collection_query_and_upgrade_plan.md new file mode 100644 index 0000000..b398e46 --- /dev/null +++ b/docs/collection_query_and_upgrade_plan.md @@ -0,0 +1,165 @@ +# Collection 查询现状与升级方案 + +## 1. 当前实现梳理 + +核心代码: +- `sync_state_machine/common/collection.py` +- `sync_state_machine/common/binding.py` +- `sync_state_machine/datasource/datasource.py` +- `sync_state_machine/sync_system/strategy_ops/*.py` + +### 1.1 DataCollection 当前内存结构 + +`DataCollection` 目前核心是两张索引: +- `_nodes: Dict[node_id, SyncNode]` +- `_data_id_to_node_id: Dict[data_id, node_id]` + +特点: +- `node_id` 查找是 O(1) +- `data_id` 反查 node 是 O(1) +- 其他查询(按状态/动作/绑定状态/业务字段)目前主要依赖遍历 + +### 1.2 查询路径 + +#### A. 通用筛选 `filter(...)` +- 先取 `_nodes.values()` +- 可按 `node_type` 过滤 +- 可按 `node_filter`(节点顶层属性)过滤 +- 可按 `filter`(`node.data` 内字段)过滤 + +复杂度:最差接近 O(N) + +#### B. 状态筛选 `filter_by_state_ids(...)` +- 先调用 `filter(node_type=...)` +- 对每个候选节点,根据状态机配置逐条匹配 `binding_status/action/status/data_id_exist` +- `state_ids` 多个时,执行多次匹配 + +复杂度:约 O(N * |state_ids|) + +### 1.3 调用热点 + +在 pipeline 中,以下路径高频调用状态筛选: +- bind 阶段(S00) +- create 阶段(S06) +- update 阶段(S07) +- delete 检查(S09) + +对应代码: +- `sync_state_machine/datasource/datasource.py` 的 `_sync_nodes` +- `sync_state_machine/sync_system/strategy_ops/bind_ops.py` + +### 1.4 BindingManager 当前查询 + +`BindingManager` 当前结构: +- `_bindings: Dict[node_type, Dict[local_id, remote_id]]` + +其中: +- `get_remote_id`:O(1) +- `get_local_id`:当前是遍历同类型全部绑定,O(K) + +当绑定数量很大时,`get_local_id` 会成为热点。 + +--- + +## 2. 本次已修正项 + +### 2.1 `filter(data_filter)` 查询中的不必要深拷贝 + +原实现在 `filter` 的 data 过滤里每个节点调用 `node.get_data()`,会触发深拷贝,数据量大时会产生明显 CPU/内存开销。 + +已改为只读访问 `node.data`: +- 不改变返回语义 +- 降低过滤时的对象复制成本 + +变更文件: +- `sync_state_machine/common/collection.py` + +### 2.2 类型标注修正 + +`node_filter` 的注解从 `callable` 修正为 `Callable[[SyncNode], bool]`,增强类型可读性和 IDE 体验。 + +--- + +## 3. 升级方案(针对三类目标) + +目标: +1) 查询性能 +2) 架构明确 +3) 内存数据不过多 + +### 阶段 0(当前) +- 保持现有语义,先完成可观测性:记录各查询调用次数和耗时(尤其 `filter_by_state_ids` 与 `get_local_id`) + +### 阶段 1(低风险,优先) + +#### 1. 查询性能 +- 新增二级内存索引(不替换现有结构,仅并行维护): + - `by_node_type: Dict[str, Set[node_id]]` + - `by_status: Dict[SyncStatus, Set[node_id]]` + - `by_action: Dict[SyncAction, Set[node_id]]` + - `by_binding_status: Dict[BindingStatus, Set[node_id]]` + - `by_type_status_action: Dict[(node_type,status,action), Set[node_id]]` +- `filter_by_state_ids` 先用组合索引缩小候选,再做状态机细匹配 + +#### 2. 架构明确 +- 增加查询层接口(例如 `CollectionQueryEngine`),将“筛选逻辑”与“存储结构”分离 +- 业务侧只依赖查询接口,不直接依赖 `_nodes` + +#### 3. 内存控制 +- 新增按需字段索引,仅为高频字段建立(如 `project_id/company_id/contract_id`) +- 索引集采用 `set[node_id]`,避免复制节点对象 + +### 阶段 2(中风险) + +#### 1. 查询性能 +- `BindingManager` 增加反向索引: + - `remote_to_local: Dict[node_type, Dict[remote_id, local_id]]` +- 将 `get_local_id` 从 O(K) 降至 O(1) + +#### 2. 架构明确 +- 统一节点写路径(add/update/delete)触发索引增量更新 +- 明确“不允许绕过 Collection 写入节点” + +#### 3. 内存控制 +- 增加可配置的“弱索引模式”:在低内存场景关闭部分次级索引 + +### 阶段 3(可选,较高风险) + +#### 1. 查询性能 +- 引入 SQLite 热查询表(内存 SQLite 或磁盘 SQLite)承接复杂组合查询 +- 保留内存索引作为热点路径,DB 作为补充查询后端 + +#### 2. 架构明确 +- 形成分层: + - 热路径:内存索引 + - 冷路径:SQLite 查询 + - 归档:持久化 DB + +#### 3. 内存控制 +- 支持“分批加载 + 分批同步 + checkpoint” +- 将非活跃节点转冷存储,只在命中时回载 + +--- + +## 4. 启动/重置语义说明(避免误判) + +当前默认不是每次全清空: +- 启动会先加载持久化,再执行 E01 归并清理 +- 仅在 `persist.wipe_on_start=true` 时会在启动前删除持久化 DB + +因此若做“分批/多轮 pipeline”,建议: +- 保持 `wipe_on_start=false` +- 通过显式 checkpoint 与增量范围控制保证状态一致性 + +--- + +## 5. 结论 + +短期最优路径: +- 先完成阶段 1 + 阶段 2(低/中风险),通常能解决大部分查询性能问题 +- 再根据压测结果决定是否进入阶段 3(SQL 化冷查询) + +这条路线兼顾: +- 速度(热路径仍在内存) +- 清晰性(查询层解耦) +- 内存边界(按需索引 + 分批加载) diff --git a/docs/datasource_guide.md b/docs/datasource_guide.md new file mode 100644 index 0000000..08e3935 --- /dev/null +++ b/docs/datasource_guide.md @@ -0,0 +1,243 @@ +# 数据源指南(DataSource Guide) + +本文档记录当前项目中不同数据源的职责、能力与配置方式,并按数据源分类说明。 + +## 1. 总览 + +当前实现包含两类数据源: + +- JSONL 数据源:面向本地文件读写 +- API 数据源:面向远端 HTTP 接口推送与轮询 + +两者都基于统一编排层 `BaseDataSource`,具备一致的流程骨架: + +1. 注册 Handler(按节点类型) +2. load 阶段加载节点 +3. sync 阶段按动作执行 create/update/delete +4. 统一处理 TaskResult 与状态机写回 +5. 统一异步任务轮询(IN_PROGRESS -> SUCCESS/FAILED) + +这意味着: + +- 业务策略可复用,不需关心底层介质差异 +- 数据源差异主要落在 Handler 与传输/存储细节 + +--- + +## 2. JSONL 数据源 + +### 2.1 主要功能 + +JSONL 数据源对应实现: + +- `sync_state_machine/datasource/jsonl/datasource.py` +- `sync_state_machine/datasource/jsonl/handler.py` + +核心能力: + +- 从目录中按 `{node_type}_N.jsonl` 规则发现并加载数据 +- 批量 create/update/delete 时,先改内存缓存,再统一刷盘 +- 支持 `read_only`,在只读模式下禁止写回 +- 支持按项目过滤(`target_project_ids`)在 load 阶段预过滤 + +### 2.2 行为特点 + +- load:逐行解析 JSONL,单行坏数据仅警告并继续 +- create/update/delete:返回统一 `TaskResult`,由 DataSource 层统一更新状态 +- 写回:默认写到 `{node_type}_1.jsonl` + +### 2.3 关键配置 + +`JsonlDataSourceConfig` 字段: + +- `type: jsonl` +- `jsonl_dir`: 数据目录 +- `read_only`: 是否只读 +- `target_project_ids`: 项目过滤列表 +- `handler_configs`: 按节点类型的 handler 参数 + +--- + +## 3. API 数据源 + +### 3.1 主要功能 + +API 数据源对应实现: + +- `sync_state_machine/datasource/api/datasource.py` +- `sync_state_machine/datasource/api/client.py` +- `sync_state_machine/datasource/api/handler.py` + +核心能力: + +- 统一 HTTP 请求入口(签名、uid 注入、错误日志、trace) +- 统一 push 任务轮询(`/push/result`) +- 统一请求链路追踪(submit/poll/load) +- 统一限流(全局窗口限流) + +### 3.2 API 全局限流(重点) + +当前已支持全局异步限流,入口在 `ApiClient.request()` 前。 + +配置字段: + +- `api_rate_limit_max_requests`:窗口内最大请求数 +- `api_rate_limit_window_seconds`:窗口秒数 + +默认值: + +- `api_rate_limit_max_requests: 10` +- `api_rate_limit_window_seconds: 10.0` + +含义: + +- 任意 10 秒窗口内最多发 10 个请求 +- 超出后,后续请求在客户端侧等待,不直接打到服务端 + +实现机制(简述): + +- 全局 `asyncio.Lock` + 时间戳队列 +- 发送前清理窗口外时间戳 +- 若窗口未满,立即占位并发送 +- 若窗口已满,按最早时间戳计算等待时间后重试 + +禁用方式: + +- `api_rate_limit_max_requests <= 0` 或 `api_rate_limit_window_seconds <= 0` + +### 3.3 从 collection 按需提取数据(重点) + +在 API 模式下,Handler 不是盲目请求,而是从 `collection` 按依赖提取后再调用 API。 + +常见模式: + +1. load 前置依赖提取 + - 例如合同 Handler 先从 collection 取 project 节点,再按 project_id 拉合同列表 +2. create/update 提取上下文 + - 从 `node.context` 或 `node.get_data()` 中提取依赖字段(如 `project_id`) +3. 节点复用/更新 + - `_create_basic_node` 会优先按 `data_id` 命中已有节点,避免重复节点 + +好处: + +- 减少无效 API 调用(按依赖、按项目有选择地加载) +- 保持节点关系与上下文完整(project/contract 等依赖链) + +### 3.4 API 校验链路(重点) + +API 数据源中,校验分为三层: + +1. 领域 schema 校验(请求前/响应后) + - 例如 `ContractCreate.model_validate(...)`、`ContractUpdate.model_validate(...)` + - load 响应也会在解析后转为领域 schema +2. 通用更新过滤与差异识别 + - `_filter_update_data`:仅在 schema 相关字段有变化时提交更新 + - `_get_schema_diff`:用于差异字段识别与调试输出 +3. 轮询接口输入校验 + - `PushIdsSchema` 校验 push_ids 格式后再请求 `/push/result` + +设计原则: + +- 校验失败直接显式失败,不静默降级 +- 保持状态机与错误日志可追踪 + +### 3.5 轮询与结果回写 + +- create 可返回 IN_PROGRESS(异步)或 SUCCESS(同步) +- `BaseDataSource` 统一轮询并写回节点状态 +- 结果通过状态机事件落到 SUCCESS/FAILED +- create 成功后会进行 `data_id` 回写与 collection 更新(必要时) + +--- + +## 4. 配置说明(按数据源区分) + +### 4.1 JSONL 数据源配置示例 + +```yaml +local_datasource: + type: jsonl + jsonl_dir: ${PROJECT_ROOT}/filtered_datasource/datasource/filtered + read_only: false + target_project_ids: [] + handler_configs: {} +``` + +### 4.2 API 数据源配置示例(含限流) + +```yaml +remote_datasource: + type: api + api_base_url: http://localhost:8000/api/third/v2 + api_uid: your_uid + api_secret: your_secret + api_debug: true + + # 轮询配置 + poll_max_retries: 1 + poll_interval: 2.0 + + # 全局限流:10 秒最多 10 次请求 + api_rate_limit_max_requests: 10 + api_rate_limit_window_seconds: 10.0 + + target_project_ids: + - "project-id-1" + handler_configs: {} +``` + +### 4.3 配置模型位置 + +- `sync_state_machine/config/datasource_config.py` + - `JsonlDataSourceConfig` + - `ApiDataSourceConfig` + +配置是严格模式(`extra="forbid"`): + +- 未声明字段会报错 +- 避免运行时拼写错误导致“配置看起来生效、实际未生效” + +--- + +## 5. 运行建议与排障 + +### 5.1 API 触发限流(429)时 + +优先调整: + +- 降低 `api_rate_limit_max_requests` +- 提高 `api_rate_limit_window_seconds` + +例如: + +- `api_rate_limit_max_requests: 8` +- `api_rate_limit_window_seconds: 10.0` + +### 5.2 轮询超时 + +可调整: + +- `poll_max_retries` +- `poll_interval` + +总等待时长约为: + +- `poll_max_retries * poll_interval` + +### 5.3 校验失败 + +建议直接修数据或 schema,不建议绕过校验;当前链路会保留失败信息用于定位。 + +--- + +## 6. 相关文件索引 + +- `sync_state_machine/datasource/datasource.py` +- `sync_state_machine/datasource/jsonl/datasource.py` +- `sync_state_machine/datasource/jsonl/handler.py` +- `sync_state_machine/datasource/api/datasource.py` +- `sync_state_machine/datasource/api/client.py` +- `sync_state_machine/datasource/api/handler.py` +- `sync_state_machine/config/datasource_config.py` +- `run_profiles/jsonl_to_api.yaml` +- `run_profiles/preset/jsonl_to_api.default.yaml` diff --git a/docs/library_integration_guide.md b/docs/library_integration_guide.md new file mode 100644 index 0000000..7c5e049 --- /dev/null +++ b/docs/library_integration_guide.md @@ -0,0 +1,360 @@ +# sync_state_machine 接入手册 + +## 1. 目标 + +本项目现在可以作为可编辑安装库使用: + +- 源码开发:`pip install -e .` +- 代码引用:`import sync_state_machine` +- 命令行运行:`ecm-sync-run --config_path=...` + +推荐接入方式: + +- `sync_state_machine` 负责同步引擎、状态机、pipeline、datasource 抽象。 +- 业务系统负责提供自己的数据源适配层,不要反向让 `sync_state_machine` 依赖业务系统。 + +--- + +## 2. 安装方式 + +### 2.1 本仓库本地安装 + +在仓库根目录执行: + +```bash +pip install -e . +``` + +安装后可直接使用: + +```python +import sync_state_machine +print(sync_state_machine.__version__) +``` + +也可以直接走命令: + +```bash +ecm-sync-run --config_path=run_profiles/preset/jsonl_to_api.default.yaml +``` + +--- + +## 3. 对外可直接引用的入口 + +常用入口: + +- `sync_state_machine.build_config` +- `sync_state_machine.build_default_config` +- `sync_state_machine.run_pipeline_from_config` +- `sync_state_machine.create_pipeline_from_config` +- `sync_state_machine.PipelineRunConfig` +- `sync_state_machine.JsonlDataSourceConfig` +- `sync_state_machine.ApiDataSourceConfig` +- `sync_state_machine.DomainRegistry` + +内置 domain 注册会在导入包时自动完成。 + +--- + +## 4. 最小接入示例 + +### 4.1 直接运行现有 pipeline + +```python +from pathlib import Path + +from sync_state_machine import build_config, load_overrides_from_file, run_pipeline_from_config + + +async def main() -> None: + project_root = Path("/path/to/ecm_sync_system") + profile_path = project_root / "run_profiles" / "preset" / "jsonl_to_api.default.yaml" + + overrides = load_overrides_from_file(profile_path, project_root) + config = build_config(project_root=project_root, overrides=overrides) + await run_pipeline_from_config(config, title="demo", print_summary=True) +``` + +适合场景: + +- 仍沿用当前仓库的 domain 注册 +- 仍沿用当前仓库的 JSONL / API handler +- 外部系统只想“调用引擎” + +--- + +## 5. 数据源怎么引用 + +当前引擎的 datasource 分两层: + +1. `DataSource` + - 管理加载、批量执行、轮询、collection 注入、handler 注册。 +2. `Handler` + - 只处理某一个 `node_type` 的 I/O 逻辑。 + +因此接入时,不是“直接把业务 ORM 塞进 pipeline”,而是: + +- 先确定你的数据源类型 +- 再决定复用已有 datasource,还是只新增 handler + +### 5.1 已有两类 datasource + +#### JSONL + +可直接复用: + +- `sync_state_machine.datasource.JsonlDataSource` +- `sync_state_machine.datasource.BaseJsonlHandler` + +适合: + +- 本地 fixture +- 离线回放 +- 调试数据集 + +#### API + +可直接复用: + +- `sync_state_machine.datasource.ApiDataSource` +- `sync_state_machine.datasource.ApiClient` +- `sync_state_machine.datasource.BaseApiHandler` + +适合: + +- HTTP 接口推送 +- 异步 push + poll +- 远端系统同步 + +--- + +## 6. 怎么适配数据源 + +### 6.1 最推荐:复用已有 datasource,只写 handler + +这是最小成本方案。 + +比如你的本地数据来自 backend 的数据库,但你不想改引擎核心,可以: + +- 保持 `ApiDataSource` / `JsonlDataSource` 不变 +- 新增你自己的 handler +- 在 handler 里把 backend 数据模型转换成节点 schema + +如果是 HTTP 源:继承 `BaseApiHandler`。 + +如果是 JSONL 源:继承 `BaseJsonlHandler`。 + +#### API handler 示例 + +```python +from pydantic import BaseModel + +from sync_state_machine.datasource.api.handler import BaseApiHandler + + +class DemoSchema(BaseModel): + id: str + name: str + + +class DemoApiHandler(BaseApiHandler[DemoSchema]): + _node_type = "demo" + _node_class = DemoSyncNode + _schema = DemoSchema + + async def load(self): + payload = await self.api_client.get("/demo/list") + return [self._create_node(item) for item in payload["data"]] + + async def create_all(self, nodes): + ... + + async def update_all(self, nodes): + ... + + async def delete_all(self, nodes): + ... + + async def poll_tasks(self, task_ids): + ... +``` + +#### JSONL handler 示例 + +```python +from sync_state_machine.datasource.jsonl.handler import BaseJsonlHandler + + +class DemoJsonlHandler(BaseJsonlHandler): + def __init__(self, datasource): + super().__init__( + datasource=datasource, + node_type="demo", + node_class=DemoSyncNode, + schema=DemoSchema, + ) +``` + +然后把它注册到 `DomainRegistry`。 + +--- + +### 6.2 如果 backend 是数据库:建议写“数据库 handler / adapter”,不要让引擎直接依赖 ORM + +推荐结构: + +```text +backend/ + app/ + integrations/ + ecm_sync/ + datasource/ + user_db_handler.py + contract_db_handler.py + mapper/ + user_mapper.py + contract_mapper.py + services/ + sync_runner.py +``` + +职责建议: + +- `mapper/` + - backend model -> sync schema + - sync schema -> backend push payload +- `datasource/handler` + - 调 repository / service 获取数据 + - 转成 `SyncNode` +- `services/sync_runner.py` + - 组装配置并调用 pipeline + +不要这样做: + +- 不要在 `sync_state_machine` 包里 import backend 的 model/repository +- 不要让 `DomainRegistry` 注册逻辑散落在 backend 业务层之外 + +--- + +### 6.3 什么时候需要新增 DataSource 类 + +只有当你的 I/O 模型与当前两种 datasource 都不匹配时,才新增 `BaseDataSource` 子类。 + +例如: + +- MQ / Kafka 批量消费型源 +- 直接数据库快照源 +- 特殊 RPC 源 + +此时建议: + +1. 继承 `BaseDataSource` +2. 保持接口与现有 datasource 一致: + - `register_handler()` + - `set_collection()` + - `load_all()` + - `sync_all()` +3. 把“节点类型差异”仍下沉到 handler,不要写死在 datasource 里 + +--- + +## 7. Domain 怎么注册 + +引擎通过 `DomainRegistry` 查找: + +- `schema` +- `node_class` +- `strategy_class` +- `jsonl_handler_class` +- `api_handler_class` + +示例: + +```python +from sync_state_machine.common.registry import DomainRegistry + +DomainRegistry.register( + node_type="demo", + schema=DemoSchema, + node_class=DemoSyncNode, + strategy_class=DemoStrategy, + jsonl_handler_class=DemoJsonlHandler, + api_handler_class=DemoApiHandler, +) +``` + +如果是 backend 接入,建议在 backend 的 integration 启动阶段集中注册,而不是分散在 controller / service 里。 + +--- + +## 8. backend 里的推荐接法 + +建议 backend 只新增一层 integration: + +```python +from pathlib import Path + +from sync_state_machine import build_config, create_pipeline_from_config + + +async def run_demo_sync() -> None: + project_root = Path("/path/to/ecm_sync_system") + overrides = { + "node_types": ["project", "contract"], + "local_datasource": { + "type": "jsonl", + "jsonl_dir": str(project_root / "tests" / "fixtures" / "demo"), + }, + "remote_datasource": { + "type": "api", + "api_base_url": "https://example.com", + "api_uid": "xxx", + "api_secret": "xxx", + "target_project_ids": ["demo-project"], + }, + } + + config = build_config(project_root=project_root, overrides=overrides) + pipeline = await create_pipeline_from_config(config) + await pipeline.run() +``` + +如果 backend 自己提供本地数据库数据,不要把 backend model 直接灌进 pipeline;先经过 handler / mapper 转成 schema 再进入引擎。 + +--- + +## 9. 接入时的边界约束 + +建议保持下面的依赖方向: + +- `backend integration -> sync_state_machine` +- `sync_state_machine -X-> backend` + +这样做的好处: + +- 引擎能独立测试 +- backend 改 repository 不会直接污染引擎 +- 后续可以单独发布库 + +--- + +## 10. 当前阶段建议 + +如果项目还在高频迭代,推荐顺序: + +1. 先 `pip install -e .` +2. 先在 backend 做 integration 目录,不急着发私有包 +3. 先接 1~2 个 node_type,跑通完整链路 +4. 稳定后再考虑拆成正式发布包 + +--- + +## 11. 相关文件 + +- 包入口:[sync_state_machine/__init__.py](../sync_state_machine/__init__.py) +- CLI:[sync_state_machine/cli.py](../sync_state_machine/cli.py) +- 配置工厂:[sync_state_machine/config](../sync_state_machine/config) +- datasource 基础层:[sync_state_machine/datasource](../sync_state_machine/datasource) +- pipeline 工厂:[sync_state_machine/pipeline/factory.py](../sync_state_machine/pipeline/factory.py) +- domain 注册:[sync_state_machine/common/registry.py](../sync_state_machine/common/registry.py) \ No newline at end of file diff --git a/docs/node_state_definition.md b/docs/node_state_definition.md new file mode 100644 index 0000000..8e533f5 --- /dev/null +++ b/docs/node_state_definition.md @@ -0,0 +1,79 @@ +# 节点状态定义(业务核心) + +本文档定义 `SyncNode` 的状态字段语义,并说明状态机如何把这些语义形式化为可执行规则。 + +## 1. 节点状态字段 + +### `binding_status` +- 含义:绑定判定结果,决定节点是否允许进入 create/update。 +- 取值:`UNCHECKED | NORMAL | MISSING | PEER_CREATING | WARNING | ABNORMAL | DEPENDENCY_ERROR` + +### `action` +- 含义:本轮同步意图。 +- 取值:`NONE | CREATE | UPDATE | DELETE` +- 说明:本项目当前主路径使用 `NONE/CREATE/UPDATE`。 + +### `status` +- 含义:执行状态。 +- 取值:`PENDING | IN_PROGRESS | SUCCESS | FAILED | SKIPPED | PRECONDITION_FAILED` + +### `data_id` +- 含义:目标系统业务主键是否就绪。 +- 关键语义:`UPDATE` 路径要求目标节点具备 `data_id`,否则进入 `PRECONDITION_FAILED`。 + +### `error` +- 含义:阻断/失败原因。 +- 说明:依赖错误与执行错误都在该字段记录可读原因。 + +## 2. 绑定状态业务语义 + +| binding_status | 业务语义 | 是否允许进入 create/update | +|---|---|---| +| `UNCHECKED` | 尚未执行 bind 判定 | 否 | +| `NORMAL` | 绑定链路健康,可做差异检测与同步 | 是 | +| `MISSING` | 无绑定记录,需做依赖检查与自动绑定/创建策略 | 有条件 | +| `PEER_CREATING` | 对侧创建进行中(等待创建提交) | 否(等待 E20 提交) | +| `WARNING` | 风险态(如自动绑定歧义/关闭) | 否 | +| `ABNORMAL` | 数据损坏或核心绑定异常 | 否 | +| `DEPENDENCY_ERROR` | 依赖不可满足 | 否 | + +## 3. create / update 语义 + +### create +- 来源:`MISSING` 节点在策略允许时生成目标 `CREATE` 节点。 +- 形式化:`E20/E21` + `spawn_target_node_state: S06`。 + +### update +- 来源:`NORMAL` 节点差异检测后生成目标 `UPDATE`。 +- 形式化:`E30`。 +- 前置失败:目标缺 `data_id` 或依赖 ID 解析失败时进入 `S08`,且必须 `action=UPDATE`。 + +## 4. 执行状态语义(datasource) + +- `SUCCESS`:执行成功,必要时回填 `data_id`。 +- `FAILED`:执行失败,保留错误。 +- `IN_PROGRESS`:异步任务进行中。 +- `SKIPPED`:handler 决策跳过;若由 UPDATE 降级为 NONE,则进入 `S14`。 +- `PRECONDITION_FAILED`:准备阶段失败,不进入实际 API 提交。 + +## 5. 状态机形式化映射 + +状态机把“业务语义”变成“可执行迁移”: +- 语义输入:strategy/datasource 提供 `context`。 +- 迁移判断:`StateMachineRuntime.dispatch(current_state, event_id, context)`。 +- 状态落地:`Decision.to_state` 对应 YAML `states[Sxx]`。 +- 不变量:每次落地后执行 `runtime.check_invariants()`。 + +## 6. 关键一致性约束 + +- `UNCHECKED` 不允许带动作(`INV-1_UNCHECKED_ACTION_NONE`)。 +- 阻断态(`ABNORMAL/WARNING/DEPENDENCY_ERROR`)不允许动作(`INV-2_BLOCKING_NO_ACTION`)。 +- `PRECONDITION_FAILED` 必须 `action=UPDATE`(`INV-3_PRECOND_IMPLIES_UPDATE`)。 + +## 7. 当前默认依赖语义(业务取向) + +以下是当前代码默认策略,不是单纯命名差异: +- 空依赖引用允许放行(`allow_empty_dependency_ref=True`)。 +- 依赖节点缺失 `data_id` 默认允许放行(`allow_missing_dep_data_id=True`)。 + +这意味着:`DEPENDENCY_ERROR` 的触发更偏向“依赖节点不存在或状态异常”,而不是“依赖节点尚未回填 data_id”。如果要改为严格模式,需要在 strategy 语义层切换该策略并同步文档。 diff --git a/docs/operations.md b/docs/operations.md new file mode 100644 index 0000000..065f077 --- /dev/null +++ b/docs/operations.md @@ -0,0 +1,81 @@ +# 运维与排障手册(业务视角) + +本文档聚焦两件事: +- 出错时先看哪里。 +- 日志里的状态到底代表什么业务问题。 + +## 1. 先看什么(快速定位) + +1. 看运行日志(`sync_log`): + - 重点关注 `状态机流转`、`reason=`、`depends=[...]`。 +2. 看持久化数据库: + - 重点字段:`binding_status`、`action`、`status`、`error`。 +3. 对照状态机文档: + - `docs/state_machine.md` + - `docs/node_state_definition.md` + +## 2. 阶段化排障 + +### 2.1 bind 阶段 + +常见表现:节点停在 `S03/S04/S05/S13`。 + +- `S03(ABNORMAL)`:节点数据损坏或核心绑定异常。 +- `S04(WARNING)`:自动绑定关闭、键缺失、歧义等不可自动处理情况。 +- `S05(DEPENDENCY_ERROR)`:依赖节点不存在或依赖状态不正常。 +- `S13(PEER_CREATING)`:对侧创建进行中,尚未提交完成。 + +典型日志: +- `reason=依赖项不满足 | depends=[company_id status=peer_creating -> not_normal]` + +业务解释: +- 上游依赖还没进入 `NORMAL`,下游业务会被严格阻断。 + +### 2.2 create 阶段 + +常见表现:节点长时间停在 `S13` 或 `S10C`。 + +- `S13`:已判定需要创建,但创建提交未完成。 +- `S10C`:CREATE 异步执行中。 +- `S12C`:CREATE 失败。 + +优先检查: +- API 侧是否返回任务 ID 与成功回执。 +- 轮询参数(`poll_max_retries` / `poll_interval`)是否过小。 + +### 2.3 update 阶段 + +常见表现:节点进入 `S08` 或 `S12U`。 + +- `S08(PRECONDITION_FAILED)`:前置条件失败(如缺 data_id、依赖 ID 解析失败)。 +- `S12U`:UPDATE 调用失败。 +- `S14`:UPDATE 被 handler 降级为 NONE 并跳过。 + +优先检查: +- `update_direction` 是否符合预期。 +- 目标节点是否具备 `data_id`。 + +## 3. 常见配置误区与症状 + +- `auto_bind=false` + - 症状:MISSING 节点更容易进入 `WARNING`,不会走自动创建识别。 +- `skip_sync=true` + - 症状:该类型只加载不执行 bind/create/update,常被误以为“没生效”。 +- `load_mode=persisted_only` + - 症状:数据只来自持久化,不主动拉取新数据。 +- `update_direction=none` + - 症状:不做 update,即使有差异也不会提交更新。 + +## 4. 推荐操作顺序 + +1. 先用 `run_profiles/preset/jsonl_to_jsonl.default.yaml` 跑通基线。 +2. 再切到 `run_profiles/*.local.yaml` 做最小覆盖。 +3. 每次只改一类字段(比如只改 `project` 的依赖策略)。 +4. 改完看一次 `sync_log`,确认状态流转与预期一致。 + +## 5. UI 排障(可选) + +1. 启动:`python -m ui.main --host 127.0.0.1 --port 8765` +2. 打开:`http://127.0.0.1:8765` +3. 在“运行与日志”查看实时状态变化。 +4. 在“记录与数据库”检查节点状态与绑定记录。 diff --git a/docs/runtime_config_guide.md b/docs/runtime_config_guide.md new file mode 100644 index 0000000..bde57c8 --- /dev/null +++ b/docs/runtime_config_guide.md @@ -0,0 +1,143 @@ +# 运行配置业务说明 + +本文档从业务视角说明配置字段含义、对阶段行为的影响,以及推荐的覆盖方式。 + +## 1. 推荐使用方式(先 default,再覆盖) + +1. 先使用基线配置运行: + - `run_profiles/preset/jsonl_to_jsonl.default.yaml` +2. 若需项目定制,再复制为: + - `run_profiles/jsonl_to_jsonl.local.yaml` +3. 仅改有业务差异的字段,避免一次改太多导致排障困难。 + +占位符: +- `${PROJECT_ROOT}` 会在运行时替换为项目根目录绝对路径。 + +## 2. 顶层字段(你在改什么) + +- `node_types` + - 本轮参与同步的业务类型列表。 + - 顺序会影响依赖链执行时机(当前按 node_type 串行执行 bind/create/update)。 +- `target_project_ids` + - 兼容字段。作为两侧 datasource 的项目白名单兜底值。 + - 若 datasource 自身配置了 `target_project_ids`,则优先使用 datasource 级配置。 +- `local_datasource` / `remote_datasource` + - 分别定义两侧数据来源与执行端。 +- `strategies` + - 每个业务类型的行为策略(依赖、自动绑定、创建方向、更新方向、跳过等)。 +- `persist` + - 持久化开关与数据库位置。 +- `logging` + - 运行日志输出位置与级别。 + +## 3. 数据源字段(DataSource) + +### 3.1 JSONL 数据源 + +- `type=jsonl`:使用本地 JSONL 文件作为数据源。 +- `jsonl_dir`:JSONL 目录路径。 +- `read_only=false`:允许该侧执行 create/update 回写;若为 true,通常用于只读加载。 +- `target_project_ids=[]`:该侧项目白名单;为空时不进行项目筛选。 +- `handler_configs`:预留给各业务 handler 的扩展参数。 + +### 3.2 API 数据源 + +- `type=api`:对接 HTTP API。 +- `api_base_url` / `api_uid` / `api_secret`:接口访问参数。 +- `api_debug`:开启后输出更多调试信息。 +- `poll_max_retries` / `poll_interval`:异步任务轮询次数与间隔。 +- `target_project_ids`:**必填**,该侧项目白名单;至少需要指定一个项目ID,以避免加载过多远程数据。 +- `handler_configs`:业务 handler 扩展参数。 + +## 4. 策略字段(Strategy) + +每个 node_type 都建议显式写出以下字段,便于审阅与排障。 + +### 4.1 `update_direction` + +- `push`:本地变更推送到远端。 +- `pull`:远端变更拉取到本地。 +- `bidirectional`:双向更新(需要明确冲突策略,谨慎使用)。 +- `none`:关闭 update 阶段。 + +### 4.2 `local_orphan_action` / `remote_orphan_action` + +- `create_remote`:本地孤儿创建到远端。 +- `create_local`:远端孤儿创建到本地。 +- `none`:不自动创建。 +- `delete_local` / `delete_remote`:当前主流程未作为默认路径,谨慎使用。 + +### 4.3 `auto_bind` / `auto_bind_fields` / `pre_bind_data_id` + +- `auto_bind=true`:在 `S02(MISSING)` 上尝试自动匹配。 +- `auto_bind=false`:不会做自动匹配,也不会走自动创建识别路径;通常会进入阻断态等待人工处理。 +- `auto_bind_fields`:自动匹配使用的业务键字段。 +- `pre_bind_data_id`:显式 data_id 预绑定清单(通用能力),格式为: + - `- local_data_id: "..."` + ` remote_data_id: "..."` + - 规则:若两侧数据源都存在这对 data_id 对应节点,且当前无绑定记录,则直接绑定。 + - 不依赖 `auto_bind/auto_bind_fields`,即使 `auto_bind=false` 也会执行。 + - 不做业务键一对一匹配检查,按你给定的映射对优先执行。 + +### 4.4 `depend_fields` + +- 定义依赖字段到依赖 node_type 的映射,例如:`company_id -> company`。 +- 依赖节点状态非 `NORMAL` 时,会在 bind 的依赖检查阶段进入 `DEPENDENCY_ERROR`。 + +### 4.5 `skip_sync` + +- 运行配置中已不建议使用 `skip_sync`。 +- 推荐使用显式组合: + - `local_orphan_action: none` + - `remote_orphan_action: none` + - `update_direction: none` +- 当三者同时为 `none/none/none` 时,pipeline 会跳过该 node_type 的 bind/create/update。 + +### 4.6 Handler 级参数(`handler_configs`) + +- 建议将 handler 特有参数放在 datasource 的 `handler_configs.` 下。 +- 示例: + - `remote_datasource.handler_configs.supplier.load_mode: persisted_only` +- `persisted_only` 表示只使用已持久化数据,不主动从外部拉新数据(具体以对应 handler 实现为准)。 + +## 5. 阶段行为与配置关系 + +- bind 阶段 + - `depend_fields` 决定是否做依赖校验。 + - `pre_bind_data_id` 先按显式 local/remote data_id 映射做预绑定。 + - `auto_bind/auto_bind_fields` 决定是否继续进行业务键自动绑定。 +- create 阶段 + - `local_orphan_action` / `remote_orphan_action` 决定孤儿是否创建。 +- update 阶段 + - `update_direction` 决定是否和向哪侧更新。 +- 写入后 reload(Pipeline 内置) + - 当某个 node_type 的 create 或 update 发生实际写入成功后,pipeline 会自动对该 node_type 重新执行两侧 `load`。 + - 目的:让后续 update 判断基于最新远端/本地数据,支持“create 后再补一次 update”的链路。 +- 同步后一致性检查(Pipeline 内置) + - 每个 node_type 在本轮同步后会基于绑定对执行数据一致性校验(比较时忽略 `id/_id` 字段)。 + - 若发现差异,会在日志中打印差异样本,并在汇总表新增 `Consistent` 列展示 `Y` / `N(差异数)`。 +- 全局跳过 + - `local_orphan_action=none` + `remote_orphan_action=none` + `update_direction=none` + 可直接跳过该类型的 bind/create/update。 + +## 6. 覆盖配置建议 + +- 先在 default 跑通一轮,再做 local 覆盖。 +- 每次只改一类问题相关字段(例如只改 `project` 的依赖与自动绑定)。 +- 覆盖后优先看 `sync_log` 是否出现预期状态迁移。 + +## 7. 持久化与日志字段 + +### `persist` + +- `enable`:是否开启持久化。 +- `db_path`:SQLite 路径。 +- `wipe_on_start`:启动是否清理历史持久化。 + +### `logging` + +- `file_dir`:日志目录。 +- `file_name_pattern`:文件命名模板。 +- `level`:日志级别。 + +排障建议:运行失败时优先看日志中的 `状态机流转` 与 `reason=`,再对照 `docs/state_machine.md` 与 `docs/node_state_definition.md` 理解含义。 diff --git a/docs/state_machine.md b/docs/state_machine.md new file mode 100644 index 0000000..548fbf1 --- /dev/null +++ b/docs/state_machine.md @@ -0,0 +1,93 @@ +# 状态机形式化说明(与代码一致) + +## 1. 真源与执行入口 +- 配置真源:`sync_state_machine/config/node_state_machine.yaml` +- 事件入口:`sync_state_machine/engine/events.py` +- 状态落地:`sync_state_machine/engine/state_apply.py` +- 不变量校验:`events._apply_decision()` 内调用 `runtime.check_invariants()` + +## 2. 状态集合(Sxx) +- `S00`:bind 起点(`UNCHECKED/NONE/PENDING`) +- `S01`:NORMAL,待后续 create/update 判定 +- `S02`:MISSING,待依赖检查/自动绑定/create +- `S03`:ABNORMAL,阻断 +- `S04`:WARNING,阻断 +- `S05`:DEPENDENCY_ERROR,阻断 +- `S06`:CREATE 待执行(目标节点) +- `S07`:UPDATE 待执行(`action=UPDATE,status=PENDING`) +- `S08`:UPDATE 前置失败(`action=UPDATE,status=PRECONDITION_FAILED`) +- `S10C/S10U/S10D`:按动作拆分的执行中状态 +- `S11C/S11U/S11D`:按动作拆分的执行成功状态 +- `S12C/S12U/S12D`:按动作拆分的执行失败状态 +- `S13`:对侧创建等待态(`PEER_CREATING/NONE/PENDING`) +- `S14`:UPDATE 运行时降级为 `NONE` 并跳过 + +## 3. 事件到代码映射 + +### bootstrap +- `E01`:`engine/events.py::e01_bootstrap()` + +### bind +- `E10`:`engine/events.py::e10_bind_core()` +- `E15`:`engine/events.py::e15_bind_dependency()` +- `E16`:`engine/events.py::e16_bind_auto()`(自动绑定判定;`ZERO+create_enabled=true` 时进入 `S13`,等待创建副作用提交) + +### create/update prepare +- `E20`:`engine/events.py::e20_create_prepare()`(spawn 成功从 `S13` 提交到 `S01`;失败保持 `S13`) +- `E21`:`engine/events.py::e21_create_prepare()` +- `E30`:`engine/events.py::e30_update_prepare()` + +### sync execute +- `E40C_START/E40C`:CREATE 执行入口与结果回写 +- `E40U_START/E40U`:UPDATE 执行入口与结果回写 +- `E40D_START/E40D`:DELETE 执行入口与结果回写 + +## 4. strategy 调用链(当前) +- bind 主入口:`sync_system/strategy.py::DefaultSyncStrategy.bind()` -> `strategy_ops/bind_ops.py::run_bind()` +- create 主入口:`sync_system/strategy.py::DefaultSyncStrategy.create()` -> `strategy_ops/create_ops.py::run_create()` +- update 主入口:`sync_system/strategy.py::DefaultSyncStrategy.update()` -> `strategy_ops/update_ops.py::run_update()` +- reset 主入口:`sync_system/strategy.py::BaseSyncStrategy.run_reset()` -> `strategy_ops/reset_ops.py::run_phase2_cleanup()` + +## 5. context 字段(以 YAML 为准) + +### bind 相关 +- `has_binding_record` +- `core_binding_result` / `peer_core_binding_result` (`NORMAL|WARNING|ABNORMAL`) +- `data_present` +- `has_depend_fields` +- `dep_satisfied` +- `auto_bind_enabled` +- `auto_bind_outcome` (`ONE_TO_ONE|AMBIGUOUS|ZERO|KEY_MISSING|KEY_ID_RESOLVE_FAIL|DATA_MISSING`) + +### create/update 相关 +- `create_enabled` +- `create_id_resolve_ok` +- `spawn_success` +- `update_enabled` +- `target_has_data_id` +- `update_id_resolve_ok` +- `has_diff` + +### execute 相关 +- `handler_result` (`SUCCESS|FAILED|SKIPPED|IN_PROGRESS`) +- `poll_timeout` + +## 6. 语义边界 +- strategy 负责业务语义计算(如依赖是否满足、自动绑定结果、差异检测)。 +- 状态机只负责迁移判定与不变量校验,不直接访问数据源。 + +## 7. 不变量 +- `INV-1_UNCHECKED_ACTION_NONE` +- `INV-2_BLOCKING_NO_ACTION` +- `INV-3_PRECOND_IMPLIES_UPDATE` + +当状态落地后违反 invariant,运行时会直接抛错。 + +## 8. 校验与出图 +1. `python tools/validate_config.py --config sync_state_machine/config/node_state_machine.yaml` +2. `python tools/render_graph.py --config sync_state_machine/config/node_state_machine.yaml --format mermaid --out docs/state_machine.mmd` + +## 9. 事件意图命名(图示层) +- 为了让流程意图更直观,图示可使用 `E01.reset.* / E10.core.* / E20.create.* / E30.update.* / E40.* / E41.create.*` 这类别名。 +- 别名仅用于图标签;运行时事件 ID 仍以 YAML 中 `E01/E10/E15/E16/E20/E21/E30/E40C_START/E40C/E40U_START/E40U/E40D_START/E40D/E41` 为准。 +- `S10C/S10U/S10D` 与 `S11C/S11U/S11D` 现已是配置中的真实状态 ID(不再是图示别名)。 diff --git a/docs/state_machine.mmd b/docs/state_machine.mmd new file mode 100644 index 0000000..f2404a4 --- /dev/null +++ b/docs/state_machine.mmd @@ -0,0 +1,68 @@ +flowchart LR + + subgraph BOOT["Bootstrap / Reset"] + S00["S00
进入 bind 前的唯一起点
binding_status: UNCHECKED
action: NONE
status: PENDING
data_id_exist: true
"] + S15(["S15
节点被清理删除(zombie cleanup)"]) + S16(["S16
持久化加载输入态:本轮 E01 的输入节点集合(可包含上轮遗留与已稳定节点)"]) + S17(["S17
加载异常隔离态:持久化枚举非法,保留错误供人工处理,不进入自动流程"]) + end + + subgraph BIND["Binding"] + S01["S01
绑定正常(待后续 update 检查)
binding_status: NORMAL
action: NONE
status: PENDING
data_id_exist: true
"] + S02["S02
孤儿节点(可能进入 create / auto_bind / delete)
binding_status: MISSING
action: NONE
status: PENDING
data_id_exist: true
"] + S03["S03
数据损坏/缺失(阻断态,需人工)
binding_status: ABNORMAL
action: NONE
status: PENDING
data_id_exist: true
"] + S04["S04
不可自动处理(阻断态,需人工)
binding_status: WARNING
action: NONE
status: PENDING
data_id_exist: true
"] + S05["S05
依赖项不满足/ID解析失败(阻断态)
binding_status: DEPENDENCY_ERROR
action: NONE
status: PENDING
data_id_exist: true
"] + S13["S13
对侧创建进行中(本侧等待提交)
binding_status: PEER_CREATING
action: NONE
status: PENDING
data_id_exist: true
"] + end + + subgraph CREATE["Create"] + S06(["S06
待执行 CREATE(执行入口)
binding_status: NORMAL
action: CREATE
status: PENDING
data_id_exist: false
"]) + S10C["S10C
CREATE 异步执行中
binding_status: NORMAL
action: CREATE
status: IN_PROGRESS
data_id_exist: false
"] + S11C["S11C
CREATE 执行成功
binding_status: NORMAL
action: CREATE
status: SUCCESS
data_id_exist: true
"] + S12C["S12C
CREATE 执行失败
binding_status: NORMAL
action: CREATE
status: FAILED
data_id_exist: false | true
"] + end + + subgraph UPDATE["Update"] + S07["S07
准备更新
binding_status: NORMAL
action: UPDATE
status: PENDING
data_id_exist: true
"] + S08["S08
更新前置失败(缺 data_id / 依赖ID未解析等)
binding_status: NORMAL
action: UPDATE
status: PRECONDITION_FAILED
data_id_exist: false | true
"] + S10U["S10U
UPDATE 异步执行中
binding_status: NORMAL
action: UPDATE
status: IN_PROGRESS
data_id_exist: true
"] + S11U["S11U
UPDATE 执行成功
binding_status: NORMAL
action: UPDATE
status: SUCCESS
data_id_exist: true
"] + S12U["S12U
UPDATE 执行失败
binding_status: NORMAL
action: UPDATE
status: FAILED
data_id_exist: false | true
"] + S14["S14
更新被跳过(执行时降级为 NONE)
binding_status: NORMAL
action: NONE
status: SKIPPED
data_id_exist: true
"] + end + + subgraph DELETE["Delete"] + S09["S09
待执行 DELETE(执行入口)
binding_status: NORMAL
action: DELETE
status: PENDING
data_id_exist: true
"] + S10D["S10D
DELETE 异步执行中
binding_status: NORMAL
action: DELETE
status: IN_PROGRESS
data_id_exist: true
"] + S11D["S11D
DELETE 执行成功(随后删除节点)
binding_status: NORMAL
action: DELETE
status: SUCCESS
data_id_exist: true
"] + S12D["S12D
DELETE 执行失败
binding_status: NORMAL
action: DELETE
status: FAILED
data_id_exist: false | true
"] + end + + S00 -- "E10a 核心绑定判定" --> S01 + S00 -- "E10e 核心绑定判定" --> S02 + S00 -- "E10c 核心绑定判定, E10d 核心绑定判定" --> S03 + S00 -- "E10b 核心绑定判定" --> S04 + S01 -- "E30c 更新准备" --> S07 + S01 -- "E30a 更新准备, E30b 更新准备" --> S08 + S02 -- "E16c 自动绑定(1:1)" --> S01 + S02 -- "E15b 依赖检查" --> S03 + S02 -- "E15a 依赖检查, E16a 自动绑定, E16b 自动绑定, E16d 自动绑定, E16e 自动绑定, E16h 自动绑定(N:0)" --> S04 + S02 -- "E15c 依赖检查, E16f 自动绑定, E21a 创建依赖解析失败" --> S05 + S02 -- "E22a 孤儿自删准备" --> S09 + S02 -- "E16g 自动绑定(N:0)" --> S13 + S06 -- "E40C_STARTa CREATE 执行入口" --> S10C + S07 -- "E40U_STARTa UPDATE 执行入口" --> S10U + S09 -- "E40D_STARTa DELETE 执行入口" --> S10D + S10C -- "E40Ca CREATE 执行结果回写" --> S11C + S10C -- "E40Cb CREATE 执行结果回写" --> S12C + S10D -- "E40Da DELETE 执行结果回写" --> S11D + S10D -- "E40Db DELETE 执行结果回写" --> S12D + S10U -- "E40Ua UPDATE 执行结果回写" --> S11U + S10U -- "E40Ub UPDATE 执行结果回写" --> S12U + S10U -- "E40Uc UPDATE 执行结果回写" --> S14 + S11C -- "E41a 创建成功后归并到 update …" --> S01 + S13 -- "E20a 创建准备阶段2" --> S01 + S16 -- "E01b 初始化:删CREATE僵尸;其余…" --> S00 + S16 -- "E01a 初始化:删CREATE僵尸;其余…" --> S15 + S13 -. "副作用: E16识别需创建后,对侧spawn S06" .-> S06 \ No newline at end of file diff --git a/docs/state_machine.svg b/docs/state_machine.svg new file mode 100644 index 0000000..293fac9 --- /dev/null +++ b/docs/state_machine.svg @@ -0,0 +1,67 @@ +

Delete

Update

Create

Binding

Bootstrap / Reset

E10a 核心绑定判定

E10e 核心绑定判定

E10c 核心绑定判定, E10d 核心绑定判定

E10b 核心绑定判定

E30c 更新准备

E30a 更新准备, E30b 更新准备

E16c 自动绑定(1:1)

E15b 依赖检查

E15a 依赖检查, E16a 自动绑定, E16b 自动绑定, E16d 自动绑定, E16e 自动绑定, E16h 自动绑定(N:0)

E15c 依赖检查, E16f 自动绑定, E21a 创建依赖解析失败

E22a 孤儿自删准备

E16g 自动绑定(N:0)

E40C_STARTa CREATE 执行入口

E40U_STARTa UPDATE 执行入口

E40D_STARTa DELETE 执行入口

E40Ca CREATE 执行结果回写

E40Cb CREATE 执行结果回写

E40Da DELETE 执行结果回写

E40Db DELETE 执行结果回写

E40Ua UPDATE 执行结果回写

E40Ub UPDATE 执行结果回写

E40Uc UPDATE 执行结果回写

E41a 创建成功后归并到 update …

E20a 创建准备阶段2

E01b 初始化:删CREATE僵尸;其余…

E01a 初始化:删CREATE僵尸;其余…

副作用: E16识别需创建后,对侧spawn S06

S00
进入 bind 前的唯一起点
binding_status: UNCHECKED
action: NONE
status: PENDING
data_id_exist: true

S15
节点被清理删除(zombie cleanup)

S16
持久化加载输入态:本轮 E01 的输入节点集合(可包含上轮遗留与已稳定节点)

S17
加载异常隔离态:持久化枚举非法,保留错误供人工处理,不进入自动流程

S01
绑定正常(待后续 update 检查)
binding_status: NORMAL
action: NONE
status: PENDING
data_id_exist: true

S02
孤儿节点(可能进入 create / auto_bind / delete)
binding_status: MISSING
action: NONE
status: PENDING
data_id_exist: true

S03
数据损坏/缺失(阻断态,需人工)
binding_status: ABNORMAL
action: NONE
status: PENDING
data_id_exist: true

S04
不可自动处理(阻断态,需人工)
binding_status: WARNING
action: NONE
status: PENDING
data_id_exist: true

S05
依赖项不满足/ID解析失败(阻断态)
binding_status: DEPENDENCY_ERROR
action: NONE
status: PENDING
data_id_exist: true

S13
对侧创建进行中(本侧等待提交)
binding_status: PEER_CREATING
action: NONE
status: PENDING
data_id_exist: true

S06
待执行 CREATE(执行入口)
binding_status: NORMAL
action: CREATE
status: PENDING
data_id_exist: false

S10C
CREATE 异步执行中
binding_status: NORMAL
action: CREATE
status: IN_PROGRESS
data_id_exist: false

S11C
CREATE 执行成功
binding_status: NORMAL
action: CREATE
status: SUCCESS
data_id_exist: true

S12C
CREATE 执行失败
binding_status: NORMAL
action: CREATE
status: FAILED
data_id_exist: false | true

S07
准备更新
binding_status: NORMAL
action: UPDATE
status: PENDING
data_id_exist: true

S08
更新前置失败(缺 data_id / 依赖ID未解析等)
binding_status: NORMAL
action: UPDATE
status: PRECONDITION_FAILED
data_id_exist: false | true

S10U
UPDATE 异步执行中
binding_status: NORMAL
action: UPDATE
status: IN_PROGRESS
data_id_exist: true

S11U
UPDATE 执行成功
binding_status: NORMAL
action: UPDATE
status: SUCCESS
data_id_exist: true

S12U
UPDATE 执行失败
binding_status: NORMAL
action: UPDATE
status: FAILED
data_id_exist: false | true

S14
更新被跳过(执行时降级为 NONE)
binding_status: NORMAL
action: NONE
status: SKIPPED
data_id_exist: true

S09
待执行 DELETE(执行入口)
binding_status: NORMAL
action: DELETE
status: PENDING
data_id_exist: true

S10D
DELETE 异步执行中
binding_status: NORMAL
action: DELETE
status: IN_PROGRESS
data_id_exist: true

S11D
DELETE 执行成功(随后删除节点)
binding_status: NORMAL
action: DELETE
status: SUCCESS
data_id_exist: true

S12D
DELETE 执行失败
binding_status: NORMAL
action: DELETE
status: FAILED
data_id_exist: false | true

\ No newline at end of file diff --git a/docs/sync_flow.md b/docs/sync_flow.md new file mode 100644 index 0000000..0b12361 --- /dev/null +++ b/docs/sync_flow.md @@ -0,0 +1,107 @@ +# 同步流程(pipeline -> strategy -> datasource) + +## 1. 全流程主线 +1. pipeline 装配组件并加载持久化。 +2. pipeline 调用 `strategy.bind()`。 +3. pipeline 调用 `strategy.create()` / `strategy.update()` 生成动作节点。 +4. pipeline 调用 `datasource.sync_all()` 执行动作并回写执行状态。 +5. pipeline 输出统计并持久化。 + +## 2. reset 时序 + +### 2.1 加载时 reset(phase1 语义) +- 在 `common/collection.py::load_from_persistence()` 执行。 +- 语义:仅恢复持久化状态(不在此阶段做状态归并)。 + +### 2.2 加载后 cleanup(phase2 语义) +- pipeline 调用 `BaseSyncStrategy.run_reset()`。 +- 实际实现:`strategy_ops/reset_ops.py::run_phase2_cleanup()`。 +- 核心事件:`E01`(`S16 -> S00/S15`)。 +- `S16` 表示“持久化加载输入态”:本轮从持久化恢复出的节点集合(可包含上轮遗留节点,也可包含上轮已稳定节点)。 +- 判定: + - `is_create_zombie=true` -> `S15`,节点删除(并尝试解绑); + - `is_create_zombie=false` -> `S00`,节点归并为 `UNCHECKED/NONE/PENDING` 并清空 `error`。 + +### 2.2.1 `enable_persistence` 与 bootstrap 关系 +- `enable_persistence=true`:先 `load_from_persistence()`,再对加载出的节点执行 `E01`(`S16` 域内处理)。 +- `enable_persistence=false`:本轮没有持久化输入,`S16/E01` 不参与;随后 Stage1 新加载节点直接进入本轮 bind/create/update/sync 主流程。 + +### 2.3 加载异常隔离(S17) +- 持久化中若出现非法枚举值(`action/status/binding_status`),节点标记为 `bootstrap_blocked`(`S17` 语义)。 +- 这类节点保留 `error`,用于人工排查。 +- 这类节点不会进入 `E01`,也不会参与 bind/create/update/sync 自动流程。 + +## 3. bind 流程(strategy_ops) +- 入口:`strategy_ops/bind_ops.py::run_bind()` +- 入口状态:`S00` + +### 核心绑定判定 +- `phase_core_state()` 内触发 `E10`。 +- 有绑定记录:根据本端/对端有效性进入 `S01/S03/S04`。 +- 无绑定记录:进入 `S02`。 + +### 依赖检查 +- `phase_dependency_check()` -> `check_dependencies_for_nodes()` 内触发 `E15`。 +- `data_present=false` -> `S03`。 +- `dep_satisfied=false` -> `S05`。 +- `depend_fields` 为空 -> `S04`(无法自动处理,阻断后续自动创建)。 + +### 自动绑定 +- `phase_auto_binding()` 内触发 `E16`。 +- `ONE_TO_ONE` -> `S01`;`AMBIGUOUS/KEY_MISSING/DATA_MISSING` -> `S04`;`KEY_ID_RESOLVE_FAIL` -> `S05`。 +- `ZERO + create_enabled=true` -> `S13`(`PEER_CREATING/NONE/PENDING`,待对侧创建中间态);`ZERO + create_enabled=false` -> `S04`。 +- `auto_bind=false` 时,`E16` 直接落 `S04`(自动绑定未启用),不会进入自动创建路径。 + +## 4. create/update 准备 + +### create +- 入口:`strategy_ops/create_ops.py::run_create()` +- 运行时事件:`E20`(`E21/E22` 为配置保留分支,当前 strategy 未接入自动执行) +- 运行时入口状态:`S13` +- 说明:`E16` 负责识别“需自动创建”并将源节点置为 `S13`;业务代码执行对侧 spawn+bind 后,再通过 `E20` 将 `S13` 提交到 `S01`(成功);若 spawn 失败,`E20` 不迁移并保留在 `S13` 等待人工/重试。 +- `data_id` 约束: + - `S13/S01` 要求源节点 `data_id` 存在(`data_id_exist=true`)。 + - 新创建目标节点在 `S06/S10C` 阶段允许 `data_id` 为空;`CREATE SUCCESS`(`S11C`)必须携带非空 `result_data_id`,否则事件直接报错。 + +### update +- 入口:`strategy_ops/update_ops.py::run_update()` +- 事件:`E30` +- 入口状态(source 节点):`S01` +- `target_has_data_id=false` 或 `update_id_resolve_ok=false` -> `S08` +- `has_diff=true` -> `S07` + +### post-create 归并 +- 入口:`pipeline/full_sync_pipeline.py::normalize_create_success_to_update_entry()` +- 事件:`E41` +- 语义:`CREATE` 执行成功后,节点先落 `S11C`(SUCCESS),再归并 `S11C -> S01`,作为同轮 update 起点。 + +## 5. 执行回写(datasource) +- 入口:`datasource/datasource.py` +- 事件:`E40C_START/E40C`、`E40U_START/E40U`、`E40D_START/E40D` +- 当前约束:delete stage 尚未接入 strategy 主流程;若运行时检测到 `S09/DELETE` 节点,DataSource 会显式抛错阻断(避免散落删除执行)。 +- 执行准备入口状态: + - `CREATE`: `S06` + - `UPDATE`: `S07` + - `DELETE`: `S09` +- `S10` 为执行中状态(由本轮执行产生),执行流转固定为“入口 -> S10 -> 终态”,不再出现入口直接到成功/失败。 +- 结果: + - `SUCCESS -> S11C | S11U | S11D`(按动作) + - `FAILED -> S12C | S12U | S12D`(按动作) + - `IN_PROGRESS -> S10C | S10U | S10D`(按动作,支持异步 polling 闭环) + - `SKIPPED + action=UPDATE -> S14` + +## 6. 各阶段入口状态总表 + +| 阶段 | 入口状态 | 说明 | +|---|---|---| +| Reset(E01) | `S16` | create_zombie -> `S15`;其余 -> `S00` | +| Bind(E10/E15/E16) | `S00` | bind 三段统一从 `S00` 进入 | +| Create Prepare(E20/E21/E22) | `S02` / `S13` | 配置入口含 `S02/S13`;当前 strategy 运行时只处理 `S13` 的 `E20` 提交,`S02` 分支保留未接入 | +| Post-create Ready(E41) | `S11C` | `CREATE` 成功节点归并到 `S01`,进入同轮 update | +| Update Prepare(E30) | `S01` | 仅从 NORMAL 继续判定(create 成功先经 E41 归并) | +| Sync Execute(E40C/U/D) | `S06` / `S07` / `S09` / `S10C` / `S10U` / `S10D` | 执行与回写:按动作分事件;入口先进入 `S10*`,再由 `S10*` 进入 `S11*`/`S12*`;轮询返回 `IN_PROGRESS` 时只记录任务进度,不新增状态迁移;仅 UPDATE 可走 `S14` | +| 隔离(人工) | `S17` | 不参与自动阶段,仅人工处理 | + +## 7. 不变量保障 +- 每次事件落地后,`engine/events.py::_apply_decision()` 会执行 `runtime.check_invariants()`。 +- 违反 invariant 直接抛错,终止当前路径。 diff --git a/docs/sync_issue_analysis_20260305.md b/docs/sync_issue_analysis_20260305.md new file mode 100644 index 0000000..b774ed0 --- /dev/null +++ b/docs/sync_issue_analysis_20260305.md @@ -0,0 +1,158 @@ +# 同步问题分析(2026-03-05) + +## 背景 + +- 同步方式:先用 `working_local_datasource/filtered` 初始化远程数据库,再基于 `run_profiles/jsonl_to_api.yaml` 执行 `jsonl -> api` 同步。 +- 本文基于日志 `test_results/sync_state_machine/simple_pipeline_sm_20260305_102926.log` 与状态库 `test_results/sync_state_machine/simple_pipeline_sm.db`。 + +## 总体结果 + +- Pipeline 统计:`loaded=311, synced=204, failed=8, post_check_passed=True, mismatch_types=4` +- 不一致类型:`company`, `construction_task`, `material`, `contract_settlement` +- 其中失败(`failed=8`)全部集中在 `contract_settlement` 的 `UPDATE` 阶段。 + +## 自动绑定问题 + +> 注:本轮日志已降噪,自动绑定明细多数为 debug 级;以下结论来自 sqlite 状态库查询。 + +### 非 normal 绑定状态 + +1. `local.construction_task_detail` 1 条 `dep_err` + - 错误:依赖 `parent_id -> construction_task` 未找到 + - 现象:`depends=[parent_id:construction_task data_id=... -> not_found]` + - 结论:这是明确的依赖绑定失败(上游父节点缺失或 data_id 不可达)。 + +2. `local.project_detail_data` 2 条 `warning` + - 错误:`未匹配到候选节点且不允许创建` + - 结论:策略配置不允许创建,且自动匹配未命中,属于预期拦截,不是执行异常。 + +除上述 3 条外,主要业务类型绑定状态均为 `normal`。 + +## 更新后仍不一致(按类型) + +### 1) company(1/1 不一致) + +- 差异字段:`city_name`, `province_name`, `parent_name` +- 模式:本地有值,远端为 `None` +- 结论:远端 list 返回字段缺失/置空,导致 post-check 一定失败。 + +### 2) construction_task(12/32 不一致) + +- 典型残留字段: + - `status` + - `complete_quantity`, `complete_rate` + - `actual_complete_date`, `statistic_date`, `delay_days` + - `plan_node`(特别是 `is_audit` 值) +- 模式:远端回读为 `None`/`0.0`/默认值,而本地有业务值。 +- 结论:该类字段主要受后端计算/回写策略影响,当前 update API 无法完全收敛到本地口径。 + +### 3) material(3/20 不一致) + +- 典型残留字段: + - `complete_quantity`, `complete_rate` + - `actual_start_date`, `status`, `delay_days` + - `plan_node.is_audit` +- 模式与 construction_task 一致:部分字段被后端默认化或不回写。 +- 结论:属于“可更新字段集合与回读字段集合不一致”导致的残留差异。 + +### 4) contract_settlement(34/34 不一致,最严重) + +- 全量普遍差异:`contract_type`(本地 `None`,远端有值如 `DP/GP/...`) +- 伴随差异:`complete_price`, `contract_price`, `actual_start_date`, `plan_complete_date`, `plan_node`, `status` 等 +- 执行结果(remote):`UPDATE SUCCESS=1, FAILED=8, SKIPPED=25` +- 8 条失败统一报错:`API error: 计划节点时间必须 晚于计划开始时间` +- 结论: + - 一部分差异来自字段语义不一致(如 `contract_type`) + - 一部分差异来自计划节点 API 校验失败,导致更新无法落库 + - 因此该类型短期内无法靠重跑自动收敛 + +## 根因归类 + +### A. 后端返回口径与本地模型口径不一致 + +- 典型:`company` 的名称类字段、`construction/material` 的状态/累计/统计字段。 + +### B. 更新 schema/API 覆盖范围有限 + +- 某些字段在 response 中存在,但不在 update schema 或后端 update 逻辑中生效。 + +### C. 计划节点约束导致更新失败 + +- `contract_settlement` 明确出现计划节点时间校验失败,直接阻断更新。 + +### D. 依赖链局部断裂 + +- `construction_task_detail` 存在 parent 依赖找不到,导致绑定 `dep_err`。 + +## 建议优先级(不改代码版) + +1. **先处理 contract_settlement 的计划节点校验失败** + - 这是唯一明确执行失败来源(8 条),修复后可显著降低不一致。 + +2. **明确“应比对字段白名单”与“只读/回写字段”** + - 对 `construction_task/material/company` 区分“业务必须一致字段”与“后端派生/可忽略字段”。 + +3. **修复依赖断裂样本** + - 针对 `construction_task_detail` 的 `parent_id` 失配,核对父节点是否在过滤阶段被裁掉或 data_id 不一致。 + +4. **针对 `project_detail_data` 的 warning 决策** + - 确认是否允许创建;若业务上应存在,需调整策略配置。 + +--- + +如果需要,我可以基于本文再拆成一份“可执行排障清单”(按 SQL/API/配置三条线),每条给出具体核对命令与验收标准。 + +## 外部后端实现核对结论(只分析,不改代码) + +以下结论来自对 `GroupSideProjectManagementSystem` 后端 `third-v2` 路由、schema、operation、service 的实现阅读。 + +### 1) company 名称字段为何会空 + +- `/company/list` 并非直接返回库里的 `city_name/province_name/parent_name`,而是服务层在查询后“二次计算”这三个字段。 +- 计算依赖两张映射: + - 行政区映射(`province/city code -> name`) + - 公司映射(`parent_id -> parent_name`) +- 如果编码不在映射中、或 `parent_id` 未命中,最终会返回 `None`/空字符串。 +- 因此该类差异并不一定是“推送失败”,更像是“回读时依赖映射补全失败或口径不一致”。 + +### 2) construction_task/material 的 plan_node 差异为何顽固 + +- 在 `third-v2` 的 `PlanUpdate` schema 中,存在 `model_validator`:会先自动清理边界节点(等于 `plan_start_date` 或 `plan_complete_date` 的首尾节点)。 +- 随后在 operation 的 `push(plan)` 中,又会把边界节点重新插回库里,并且统一写入 `is_audit=True`。 +- 这意味着: + - 请求入参和最终落库结构并不完全一致; + - 如果本地源数据不含边界节点,或 `is_audit` 口径不同,post-check 很容易出现稳定残差。 + +### 3) contract_settlement 为何最严重(34/34 + 8条失败) + +- 计划更新接口的业务规则是“开始时间与合同金额来自合同表”,不是来自推送体: + - `plan_start_date` 强制取合同 `sign_date` + - `contract_price` 强制取合同 `total_price` +- 即便推送体带了这两个值,也会在 operation 中被覆盖。 +- 同时仍有严格校验:计划节点必须晚于开始时间、早于结束时间、数量递增等;不满足直接 400。 +- 这正对应日志里的 8 条失败(计划节点时间校验)与大量更新后不一致(字段被后端覆盖到“合同口径”)。 + +### 4) list 回读与单条回读口径不一致(会放大不一致) + +- 多个类型的 `get_by_id` 会裁掉 `plan_node` 首尾节点,但 `get_list_by_project_id` 通常返回主表原始节点(含首尾)。 +- 同步系统做 post-check 用的是 list 拉取结果时,这种“单条/列表口径不一致”会放大 plan_node 相关差异。 + +### 5) status/complete_rate/delay_days 等字段为何容易残留差异 + +- 这些字段主要由明细驱动的主表同步逻辑计算并回写,不是 plan/base update 的直接输入字段。 +- 因此“推送成功”并不等价于“这些派生字段立即与源数据一致”。 + +## 建议(仍不改代码) + +1. **先按后端口径预处理结算计划数据** + - 以合同 `sign_date/total_price` 作为 settlement 比对基准和推送基准; + - 推送前先做节点时间边界校验,避免 400。 + +2. **对 plan_node 建立统一比较口径** + - 在 post-check 里对 construction/material/settlement 统一做“边界节点归一化 + `is_audit` 口径归一化”后再比较。 + +3. **区分“业务真差异”与“后端派生差异”** + - 对 `status/complete_rate/delay_days/actual_*` 这类派生字段设为可选比对或延迟比对。 + +4. **company 名称字段先做映射可用性核查** + - 重点核对 `province/city` 编码是否在后端行政区字典可解析、`parent_id` 是否可命中公司映射。 diff --git a/filtered_datasource/datasource/filtered/company_1.jsonl b/filtered_datasource/datasource/filtered/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/filtered_datasource/datasource/filtered/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/filtered_datasource/datasource/filtered/construction_task_1.jsonl b/filtered_datasource/datasource/filtered/construction_task_1.jsonl new file mode 100644 index 0000000..56ca082 --- /dev/null +++ b/filtered_datasource/datasource/filtered/construction_task_1.jsonl @@ -0,0 +1,63 @@ +{"_id": "020a3d53-4e45-4133-9e6e-93debd3dec22", "_rev": "9-3863902be07ce5855927de1726d5655a", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "825adfd5-02bb-422f-83bb-5543489c7e4d", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "825adfd5-02bb-422f-83bb-5543489c7e4d"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "825adfd5-02bb-422f-83bb-5543489c7e4d"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "825adfd5-02bb-422f-83bb-5543489c7e4d"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "进厂交通洞开挖(方)", "construction_section": "TJ", "status": 1, "task_type": "jcjtdkw", "plan_start_date": "2020-11-01", "plan_complete_date": "2021-07-31", "actual_complete_date": "2021-06-18", "complete_quantity": 24000.0, "complete_rate": 100.0, "contract_quantity": 24000.0, "plan_node": [{"date": "2020-11-01", "quantity": 0.0, "is_audit": false}, {"date": "2021-07-31", "quantity": 24000.0, "is_audit": false}], "statistic_date": "2021-06-18", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "126c3bdc-bcbf-4c65-a7e7-1d3b7e8e983c", "_rev": "5-1deb794b8c03770a6bdd95d8dd0b16a7", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "61c3e3b2-7529-4fff-80c3-c69c3ea4f9ad", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "61c3e3b2-7529-4fff-80c3-c69c3ea4f9ad"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "61c3e3b2-7529-4fff-80c3-c69c3ea4f9ad"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "61c3e3b2-7529-4fff-80c3-c69c3ea4f9ad"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "show_name": "导流洞衬砌(米)", "construction_section": "TJ", "status": -1, "task_type": "dldcq", "plan_start_date": "2017-12-01", "plan_complete_date": "2018-04-15", "actual_complete_date": "2019-03-30", "complete_quantity": 1863.95, "complete_rate": 100.0, "contract_quantity": 1863.95, "plan_node": [{"date": "2017-12-01", "quantity": 0.0, "is_audit": false}, {"date": "2018-04-15", "quantity": 1863.95, "is_audit": false}], "statistic_date": "2019-03-30", "sort": 0, "is_crucial": false, "delay_days": 349} +{"_id": "172c6a77-fd02-4cc6-b330-48bc9e67cfaa", "_rev": "7-35de25639a0be9cee9d3137c1bf3be60", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "57236743-c263-4171-af23-7ce7fd24bb77", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "57236743-c263-4171-af23-7ce7fd24bb77"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "57236743-c263-4171-af23-7ce7fd24bb77"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "57236743-c263-4171-af23-7ce7fd24bb77"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "4ab0bb83-64f7-4b64-96d6-907c843b7639", "show_name": "大坝基础开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "dbjckw", "plan_start_date": "2020-12-26", "plan_complete_date": "2021-06-30", "actual_complete_date": "2022-07-15", "complete_quantity": 882146.0, "complete_rate": 100.0, "contract_quantity": 882146.0, "plan_node": [{"date": "2020-12-26", "quantity": 0.0, "is_audit": false}, {"date": "2021-06-30", "quantity": 882146.0, "is_audit": false}], "statistic_date": "2022-07-15", "sort": 0, "is_crucial": false, "delay_days": 380} +{"_id": "1961974f-e16a-4b7c-8388-edd80fe8a69d", "_rev": "8-6002b6008880fe052a5c9c8b9625e0a4", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "496a6abd-06c5-46fd-9b54-6195d81c741f", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "496a6abd-06c5-46fd-9b54-6195d81c741f"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "496a6abd-06c5-46fd-9b54-6195d81c741f"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "496a6abd-06c5-46fd-9b54-6195d81c741f"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "厂房开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "cfkw", "plan_start_date": "2020-04-01", "plan_complete_date": "2023-01-31", "actual_complete_date": "2023-05-28", "complete_quantity": 362300.0, "complete_rate": 100.0, "contract_quantity": 362300.0, "plan_node": [{"date": "2020-04-01", "quantity": 0.0, "is_audit": false}, {"date": "2020-12-31", "quantity": 107300.0, "is_audit": false}, {"date": "2021-06-30", "quantity": 172200.0, "is_audit": false}, {"date": "2022-01-15", "quantity": 214000.0, "is_audit": false}, {"date": "2022-07-15", "quantity": 273100.0, "is_audit": false}, {"date": "2022-10-31", "quantity": 332500.0, "is_audit": false}, {"date": "2023-01-31", "quantity": 362300.0, "is_audit": false}], "statistic_date": "2023-05-28", "sort": 0, "is_crucial": false, "delay_days": 117} +{"_id": "240e5ae8-b3de-4684-abc1-d84283842ee4", "_rev": "4-0e110488d71e5ce3e41cef7f7d1dd2df", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "43db79ce-ce9c-4755-b4b6-16f5e239ee94", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "43db79ce-ce9c-4755-b4b6-16f5e239ee94"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "43db79ce-ce9c-4755-b4b6-16f5e239ee94"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "43db79ce-ce9c-4755-b4b6-16f5e239ee94"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": null, "show_name": "架线放线(⽶)", "construction_section": "SCDW", "status": 1, "task_type": "jxfxdw", "plan_start_date": "2025-09-01", "plan_complete_date": "2025-10-31", "actual_complete_date": "2025-10-28", "complete_quantity": 12166.0, "complete_rate": 100.0, "contract_quantity": 12166.0, "plan_node": [{"date": "2025-09-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-10-31", "quantity": 12166.0, "is_audit": false}], "statistic_date": "2025-10-28", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "26086ea8-9802-449a-929f-8712639c0090", "_rev": "5-6b93330392aaddfecf2d6a1807cb5faf", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "ab06caf1-608b-452c-b3ca-0e24d250f95d", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "ab06caf1-608b-452c-b3ca-0e24d250f95d"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "ab06caf1-608b-452c-b3ca-0e24d250f95d"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "ab06caf1-608b-452c-b3ca-0e24d250f95d"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "2e7feb46-667b-4b40-be23-f4f5589f0492", "show_name": "桥式起重设备(台)", "construction_section": "JSJG", "status": 1, "task_type": "qsqzsb", "plan_start_date": "2025-01-01", "plan_complete_date": "2025-06-30", "actual_complete_date": "2025-06-10", "complete_quantity": 2.0, "complete_rate": 100.0, "contract_quantity": 2.0, "plan_node": [{"date": "2025-01-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 2.0, "is_audit": false}], "statistic_date": "2025-06-10", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "3592d29c-b176-4e0c-8f4a-89cf5f685a3c", "_rev": "58-5adc52ea100296222833ebdd4547111d", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "981264e5-2798-4b1d-9854-b7226fa12248", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "981264e5-2798-4b1d-9854-b7226fa12248"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "981264e5-2798-4b1d-9854-b7226fa12248"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "981264e5-2798-4b1d-9854-b7226fa12248"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "发电机出口断路器安装(套)", "construction_section": "JD", "status": -1, "task_type": "fdjckdlqaz", "plan_start_date": "2025-09-01", "plan_complete_date": "2026-04-30", "actual_complete_date": null, "complete_quantity": 3.0, "complete_rate": 50.0, "contract_quantity": 6.0, "plan_node": [{"date": "2025-09-01", "quantity": 0.0, "is_audit": false}, {"date": "2026-04-30", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-11-15", "sort": 0, "is_crucial": false, "delay_days": 52} +{"_id": "35ae3546-f018-4be0-9bf3-72b36b3dcdc7", "_rev": "7-9fc2c99df8d1ca862c0505ef5a3cb6a8", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "5f4515b4-ad9f-42a7-bb88-fdb8eaead4c5", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "5f4515b4-ad9f-42a7-bb88-fdb8eaead4c5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "5f4515b4-ad9f-42a7-bb88-fdb8eaead4c5"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "5f4515b4-ad9f-42a7-bb88-fdb8eaead4c5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "show_name": "导流洞开挖(米)", "construction_section": "TJ", "status": -1, "task_type": "dldkw", "plan_start_date": "2017-02-10", "plan_complete_date": "2017-11-05", "actual_complete_date": "2017-11-28", "complete_quantity": 1863.95, "complete_rate": 100.0, "contract_quantity": 1863.95, "plan_node": [{"date": "2017-02-10", "quantity": 0.0, "is_audit": false}, {"date": "2017-11-05", "quantity": 1863.95, "is_audit": false}], "statistic_date": "2017-11-28", "sort": 0, "is_crucial": false, "delay_days": 23} +{"_id": "3ca28f12-313a-405c-a7df-64e2b2630e61", "_rev": "5-2618d7356992f18412fac0f63fbc84c6", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "277f8dd2-363a-46d7-b3a6-6047f0199667", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "277f8dd2-363a-46d7-b3a6-6047f0199667"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "277f8dd2-363a-46d7-b3a6-6047f0199667"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "277f8dd2-363a-46d7-b3a6-6047f0199667"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "进厂交通洞衬砌(方)", "construction_section": "TJ", "status": 1, "task_type": "jcjtdcq", "plan_start_date": "2023-12-01", "plan_complete_date": "2024-03-31", "actual_complete_date": "2024-03-25", "complete_quantity": 6000.0, "complete_rate": 100.0, "contract_quantity": 6000.0, "plan_node": [{"date": "2023-12-01", "quantity": 0.0, "is_audit": false}, {"date": "2024-03-31", "quantity": 6000.0, "is_audit": false}], "statistic_date": "2024-03-25", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "53b44124-0f43-43bb-863d-fab0620bd3e8", "_rev": "98-01009e49cbea34229947594cab151f47", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "f0587ba5-4fa3-4182-ac3f-692cb29e1fe0", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "f0587ba5-4fa3-4182-ac3f-692cb29e1fe0"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "f0587ba5-4fa3-4182-ac3f-692cb29e1fe0"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "f0587ba5-4fa3-4182-ac3f-692cb29e1fe0"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "调速器及辅设安装(套)", "construction_section": "JD", "status": -1, "task_type": "tsqaz", "plan_start_date": "2025-08-01", "plan_complete_date": "2026-06-30", "actual_complete_date": null, "complete_quantity": 2.0, "complete_rate": 33.33, "contract_quantity": 6.0, "plan_node": [{"date": "2025-08-01", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-11-15", "sort": 0, "is_crucial": false, "delay_days": 93} +{"_id": "54217b3b-ba7c-43c5-9ca5-8ac8eaca0974", "_rev": "48-d3883e56efdeafc63ffa8e2992eb9c53", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "39a75289-cff2-453b-8025-0d6a6749ac5b", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "39a75289-cff2-453b-8025-0d6a6749ac5b"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "39a75289-cff2-453b-8025-0d6a6749ac5b"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "39a75289-cff2-453b-8025-0d6a6749ac5b"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "主变压器安装(台)", "construction_section": "JD", "status": -1, "task_type": "zbazt", "plan_start_date": "2025-03-15", "plan_complete_date": "2026-03-31", "actual_complete_date": null, "complete_quantity": 5.0, "complete_rate": 83.33, "contract_quantity": 6.0, "plan_node": [{"date": "2025-03-15", "quantity": 0.0, "is_audit": false}, {"date": "2026-03-31", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-12-12", "sort": 0, "is_crucial": false, "delay_days": 15} +{"_id": "6a1103ea-334f-41d7-8523-3e1d4fd99c06", "_rev": "9-69caaca99567888707dc9179439f79c5", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "approved", "approval_flow_id": "fc5cd0d4-881b-4b45-8a9a-ea2a80345019", "edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "fc5cd0d4-881b-4b45-8a9a-ea2a80345019"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "fc5cd0d4-881b-4b45-8a9a-ea2a80345019"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "fc5cd0d4-881b-4b45-8a9a-ea2a80345019"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "show_name": "辅助工程施工及隧道衬砌(米)", "construction_section": "TJ", "status": 0, "task_type": "fzgcsgjsdcq", "plan_start_date": "2015-11-01", "plan_complete_date": "2019-07-18", "actual_complete_date": "2019-07-01", "complete_quantity": 45230.0, "complete_rate": 100.0, "contract_quantity": 45230.0, "plan_node": [{"date": "2015-11-01", "quantity": 0.0, "is_audit": true}, {"date": "2016-09-30", "quantity": 9170.0, "is_audit": true}, {"date": "2017-02-28", "quantity": 11435.0, "is_audit": true}, {"date": "2017-07-31", "quantity": 14898.0, "is_audit": true}, {"date": "2017-12-31", "quantity": 19304.0, "is_audit": true}, {"date": "2018-02-28", "quantity": 21014.0, "is_audit": true}, {"date": "2018-06-22", "quantity": 27254.0, "is_audit": true}, {"date": "2018-12-31", "quantity": 37472.0, "is_audit": true}, {"date": "2019-07-01", "quantity": 45000.0, "is_audit": true}, {"date": "2019-07-18", "quantity": 45230.0, "is_audit": true}], "statistic_date": "2019-07-01", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "78d7ab73-4e55-46fa-a208-1a21656cfa01", "_rev": "111-025c371931ae5a472de3d98186bb421c", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "dcb748dd-e67d-429d-9519-da39a188c229", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "dcb748dd-e67d-429d-9519-da39a188c229"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "dcb748dd-e67d-429d-9519-da39a188c229"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "dcb748dd-e67d-429d-9519-da39a188c229"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:43", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "发电机安装(台)", "construction_section": "JD", "status": -1, "task_type": "fdjaz", "plan_start_date": "2024-10-30", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 3.0, "complete_rate": 50.0, "contract_quantity": 6.0, "plan_node": [{"date": "2024-10-30", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-12-31", "sort": 0, "is_crucial": false, "delay_days": 69} +{"_id": "7c85896e-34c8-46a2-8e42-c93034d20805", "_rev": "6-ad00eb92f4055034c68f3be62fd6dd64", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "c7e31bc1-5cc7-4e51-b7b7-d84c88442ff5", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "c7e31bc1-5cc7-4e51-b7b7-d84c88442ff5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "c7e31bc1-5cc7-4e51-b7b7-d84c88442ff5"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "c7e31bc1-5cc7-4e51-b7b7-d84c88442ff5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": null, "show_name": "⽴塔(基)", "construction_section": "SCDW", "status": 1, "task_type": "ltdw", "plan_start_date": "2025-07-01", "plan_complete_date": "2025-10-31", "actual_complete_date": "2025-10-06", "complete_quantity": 21.0, "complete_rate": 100.0, "contract_quantity": 21.0, "plan_node": [{"date": "2025-07-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-10-31", "quantity": 21.0, "is_audit": false}], "statistic_date": "2025-10-06", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "_rev": "17-70d8d34a47e3801e14c940550a608e7a", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "8d9e943c-c29e-4280-b0cd-983312cb9ff1", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "8d9e943c-c29e-4280-b0cd-983312cb9ff1"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "8d9e943c-c29e-4280-b0cd-983312cb9ff1"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "8d9e943c-c29e-4280-b0cd-983312cb9ff1"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-07 00:00:41", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "4ab0bb83-64f7-4b64-96d6-907c843b7639", "show_name": "大坝坝体填/浇筑(方)", "construction_section": "TJ", "status": -1, "task_type": "dbbttz", "plan_start_date": "2022-08-11", "plan_complete_date": "2025-12-31", "actual_complete_date": "2026-02-01", "complete_quantity": 2630000.0, "complete_rate": 100.0, "contract_quantity": 2630000.0, "plan_node": [{"date": "2022-08-11", "quantity": 0.0, "is_audit": false}, {"date": "2025-12-31", "quantity": 2630000.0, "is_audit": false}], "statistic_date": "2026-02-01", "sort": 0, "is_crucial": false, "delay_days": 32} +{"_id": "82990141-48ec-4101-942b-e27992e8b8f6", "_rev": "5-7f9ae0dfd5376eeec57514c4115b19d0", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "841c734c-02fc-47e8-86f0-5e2cc24aa0c9", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "841c734c-02fc-47e8-86f0-5e2cc24aa0c9"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "841c734c-02fc-47e8-86f0-5e2cc24aa0c9"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "841c734c-02fc-47e8-86f0-5e2cc24aa0c9"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "GIS安装(套)", "construction_section": "JD", "status": 1, "task_type": "gisazt", "plan_start_date": "2025-05-20", "plan_complete_date": "2025-10-31", "actual_complete_date": "2025-10-15", "complete_quantity": 1.0, "complete_rate": 100.0, "contract_quantity": 1.0, "plan_node": [{"date": "2025-05-20", "quantity": 0.0, "is_audit": false}, {"date": "2025-10-31", "quantity": 1.0, "is_audit": false}], "statistic_date": "2025-10-15", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "90f86791-0d3b-49e7-b7b9-90622ed9498d", "_rev": "7-74b5a400f27bbf6dbde08b66de3fa9a1", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "c8f242ab-4af0-4766-8229-d62b2757c513", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "c8f242ab-4af0-4766-8229-d62b2757c513"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "c8f242ab-4af0-4766-8229-d62b2757c513"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "c8f242ab-4af0-4766-8229-d62b2757c513"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "尾水隧洞衬砌(方)", "construction_section": "TJ", "status": 0, "task_type": "wssdcq", "plan_start_date": "2022-03-01", "plan_complete_date": "2024-12-31", "actual_complete_date": "2024-11-30", "complete_quantity": 271573.0, "complete_rate": 100.0, "contract_quantity": 271573.0, "plan_node": [{"date": "2022-03-01", "quantity": 0.0, "is_audit": false}, {"date": "2024-12-31", "quantity": 271573.0, "is_audit": false}], "statistic_date": "2024-11-30", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "924a3fa5-9487-4a72-8ad6-be1ba5cd671f", "_rev": "5-28fedd5a647881d4105a9fdd25d38bae", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "08983dc0-f9aa-4f66-94e5-7c33dfc12a39", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "08983dc0-f9aa-4f66-94e5-7c33dfc12a39"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "08983dc0-f9aa-4f66-94e5-7c33dfc12a39"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "08983dc0-f9aa-4f66-94e5-7c33dfc12a39"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "闸门及拦污栅安装(扇)", "construction_section": "JSJG", "status": 0, "task_type": "zmjlwsaz", "plan_start_date": "2025-01-01", "plan_complete_date": "2025-09-30", "actual_complete_date": "2025-09-28", "complete_quantity": 20.0, "complete_rate": 100.0, "contract_quantity": 20.0, "plan_node": [{"date": "2025-01-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 20.0, "is_audit": false}], "statistic_date": "2025-09-28", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "98c0b41a-b238-49cd-9d49-76ca8535a084", "_rev": "34-bc3433d0a2d2d1889a7235ceb3583de7", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "b7dd2ba3-248a-4c2b-8c44-de0a43c16795", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b7dd2ba3-248a-4c2b-8c44-de0a43c16795"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b7dd2ba3-248a-4c2b-8c44-de0a43c16795"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b7dd2ba3-248a-4c2b-8c44-de0a43c16795"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "励磁系统安装及调试(套)", "construction_section": "JD", "status": -1, "task_type": "lcxtaz", "plan_start_date": "2025-08-01", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 2.0, "complete_rate": 33.33, "contract_quantity": 6.0, "plan_node": [{"date": "2025-08-01", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-11-15", "sort": 0, "is_crucial": false, "delay_days": 29} +{"_id": "9d1473b4-bc56-435d-b5e3-6f21f3413ec3", "_rev": "5-bcfe3571ca395f923e1ab30aba40d29a", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "4e7da869-9995-4e7d-9b34-46996405a466", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "4e7da869-9995-4e7d-9b34-46996405a466"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "4e7da869-9995-4e7d-9b34-46996405a466"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "4e7da869-9995-4e7d-9b34-46996405a466"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "2e7feb46-667b-4b40-be23-f4f5589f0492", "show_name": "液压式启闭机(台)", "construction_section": "JSJG", "status": 1, "task_type": "yysqbj", "plan_start_date": "2025-07-01", "plan_complete_date": "2025-09-30", "actual_complete_date": "2025-09-25", "complete_quantity": 6.0, "complete_rate": 100.0, "contract_quantity": 6.0, "plan_node": [{"date": "2025-07-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-09-25", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "a5702c85-eeaa-4253-a7b1-d434fb487e1e", "_rev": "10-cde2b68feac67ca275681fce3198bda4", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "e0538ab0-f7c6-432f-a559-5604252c686d", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "e0538ab0-f7c6-432f-a559-5604252c686d"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "e0538ab0-f7c6-432f-a559-5604252c686d"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "e0538ab0-f7c6-432f-a559-5604252c686d"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "厂房混凝土浇筑(方)", "construction_section": "TJ", "status": 0, "task_type": "cfhntjz", "plan_start_date": "2021-07-01", "plan_complete_date": "2025-07-31", "actual_complete_date": "2025-06-30", "complete_quantity": 121500.0, "complete_rate": 100.0, "contract_quantity": 121500.0, "plan_node": [{"date": "2021-07-01", "quantity": 0.0, "is_audit": false}, {"date": "2021-10-31", "quantity": 3670.0, "is_audit": false}, {"date": "2024-05-31", "quantity": 38760.0, "is_audit": false}, {"date": "2024-09-15", "quantity": 60420.0, "is_audit": false}, {"date": "2024-12-31", "quantity": 89600.0, "is_audit": false}, {"date": "2025-07-31", "quantity": 121500.0, "is_audit": false}], "statistic_date": "2025-06-30", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "c36ba699-de84-4439-90f3-8d71635c3c83", "_rev": "75-f614768562e84248c5f41b1c9f17cc0d", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "cf248d04-989c-4be3-a94c-78d1afee3d54", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "cf248d04-989c-4be3-a94c-78d1afee3d54"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "cf248d04-989c-4be3-a94c-78d1afee3d54"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "cf248d04-989c-4be3-a94c-78d1afee3d54"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:43", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "show_name": "水轮机安装(台)", "construction_section": "JD", "status": -1, "task_type": "sljaz", "plan_start_date": "2024-10-30", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 3.0, "complete_rate": 50.0, "contract_quantity": 6.0, "plan_node": [{"date": "2024-10-30", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 6.0, "is_audit": false}], "statistic_date": "2025-11-15", "sort": 0, "is_crucial": false, "delay_days": 69} +{"_id": "c512dc45-0505-49f5-b65c-b86878b185c3", "_rev": "20-0c73e5b8d9b9b22d64c8a06cea6fd5c3", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "approved", "approval_flow_id": "81aaf29d-2966-4fdc-bd7b-6e80622d57b1", "edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "81aaf29d-2966-4fdc-bd7b-6e80622d57b1"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "81aaf29d-2966-4fdc-bd7b-6e80622d57b1"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "81aaf29d-2966-4fdc-bd7b-6e80622d57b1"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "show_name": "辅助工程开挖(米)", "construction_section": "TJ", "status": 0, "task_type": "fzgckw", "plan_start_date": "2015-11-01", "plan_complete_date": "2019-07-18", "actual_complete_date": "2019-07-01", "complete_quantity": 28374.0, "complete_rate": 100.0, "contract_quantity": 28374.0, "plan_node": [{"date": "2015-11-01", "quantity": 0.0, "is_audit": true}, {"date": "2016-09-30", "quantity": 690.0, "is_audit": true}, {"date": "2017-02-28", "quantity": 2333.0, "is_audit": true}, {"date": "2017-07-31", "quantity": 5408.0, "is_audit": true}, {"date": "2017-12-31", "quantity": 9730.0, "is_audit": true}, {"date": "2018-02-28", "quantity": 10790.0, "is_audit": true}, {"date": "2018-03-30", "quantity": 12320.0, "is_audit": true}, {"date": "2018-04-30", "quantity": 13520.0, "is_audit": true}, {"date": "2018-06-22", "quantity": 15920.0, "is_audit": true}, {"date": "2018-12-31", "quantity": 21699.0, "is_audit": true}, {"date": "2019-04-30", "quantity": 26733.0, "is_audit": true}, {"date": "2019-07-18", "quantity": 28374.0, "is_audit": true}], "statistic_date": "2019-07-01", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "c5ce2863-2e53-45bc-9d96-ef7f4b6d50e1", "_rev": "8-cf9e9415d4691fab8923c1d4cd106200", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "fedcec76-bd89-4b80-bcf7-b9a953df1bfa", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "fedcec76-bd89-4b80-bcf7-b9a953df1bfa"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "fedcec76-bd89-4b80-bcf7-b9a953df1bfa"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "fedcec76-bd89-4b80-bcf7-b9a953df1bfa"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": null, "show_name": "塔基(基)", "construction_section": "SCDW", "status": 1, "task_type": "tjdw", "plan_start_date": "2025-05-10", "plan_complete_date": "2025-08-31", "actual_complete_date": "2025-08-24", "complete_quantity": 21.0, "complete_rate": 100.0, "contract_quantity": 21.0, "plan_node": [{"date": "2025-05-10", "quantity": 0.0, "is_audit": false}, {"date": "2025-08-31", "quantity": 21.0, "is_audit": false}], "statistic_date": "2025-08-24", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "c6852b7c-5a91-444f-be24-615043c7add9", "_rev": "8-58b44dab6af8088ac175f6db4dabce1f", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "2df88e1f-d8cd-4355-afac-dae9990cccb6", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "2df88e1f-d8cd-4355-afac-dae9990cccb6"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "2df88e1f-d8cd-4355-afac-dae9990cccb6"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "2df88e1f-d8cd-4355-afac-dae9990cccb6"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "引水隧洞衬砌(方)", "construction_section": "TJ", "status": -1, "task_type": "yssdcq", "plan_start_date": "2022-05-01", "plan_complete_date": "2025-04-30", "actual_complete_date": "2025-11-30", "complete_quantity": 55242.0, "complete_rate": 100.0, "contract_quantity": 55242.0, "plan_node": [{"date": "2022-05-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-30", "quantity": 55242.0, "is_audit": false}], "statistic_date": "2025-11-30", "sort": 0, "is_crucial": false, "delay_days": 214} +{"_id": "c8c6c5f8-f761-4e6e-baa1-636eba451873", "_rev": "33-4c5547262ef879fac818d16435706396", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "9e8fe87a-d57a-409d-ba6d-31502fd485b1", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "9e8fe87a-d57a-409d-ba6d-31502fd485b1"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "9e8fe87a-d57a-409d-ba6d-31502fd485b1"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "9e8fe87a-d57a-409d-ba6d-31502fd485b1"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "通风兼安全洞衬砌(方)", "construction_section": "TJ", "status": 0, "task_type": "jfjaqdcq", "plan_start_date": "2025-06-01", "plan_complete_date": "2025-12-31", "actual_complete_date": "2025-12-29", "complete_quantity": 6500.0, "complete_rate": 100.0, "contract_quantity": 6500.0, "plan_node": [{"date": "2025-06-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-12-31", "quantity": 6500.0, "is_audit": false}], "statistic_date": "2025-12-29", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "d051bad5-8958-46a9-937c-40e7c46e5592", "_rev": "5-71b37112bdae67bf01a9756df7f69a73", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "0dddf8d7-16eb-4865-a705-f68e673e4779", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "0dddf8d7-16eb-4865-a705-f68e673e4779"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "0dddf8d7-16eb-4865-a705-f68e673e4779"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "0dddf8d7-16eb-4865-a705-f68e673e4779"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "8db97a3a-be48-4ad9-957a-a67034eb99ed", "show_name": "鱼道工程(米)", "construction_section": "TJ", "status": 1, "task_type": "ydgc", "plan_start_date": "2024-09-01", "plan_complete_date": "2025-02-20", "actual_complete_date": "2025-01-05", "complete_quantity": 215.0, "complete_rate": 100.0, "contract_quantity": 215.0, "plan_node": [{"date": "2024-09-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-02-20", "quantity": 215.0, "is_audit": false}], "statistic_date": "2025-01-05", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "d5bee645-930c-4c80-8b2a-aee0e9f0dbff", "_rev": "5-4903694581c649858c042c414b83a0b9", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "17189da6-88da-48dd-adb7-125d5135391d", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "17189da6-88da-48dd-adb7-125d5135391d"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "17189da6-88da-48dd-adb7-125d5135391d"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "17189da6-88da-48dd-adb7-125d5135391d"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "引水隧洞开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "yssdkw", "plan_start_date": "2020-10-01", "plan_complete_date": "2022-07-31", "actual_complete_date": "2024-12-11", "complete_quantity": 222496.0, "complete_rate": 100.0, "contract_quantity": 222496.0, "plan_node": [{"date": "2020-10-01", "quantity": 0.0, "is_audit": false}, {"date": "2021-06-30", "quantity": 51700.0, "is_audit": false}, {"date": "2021-11-30", "quantity": 87647.0, "is_audit": false}, {"date": "2022-07-31", "quantity": 222496.0, "is_audit": false}], "statistic_date": "2024-12-11", "sort": 0, "is_crucial": false, "delay_days": 864} +{"_id": "dc41afbc-c6d3-489d-8270-466349df0282", "_rev": "9-4df59b5e14bfdc1d0bcfbebaf70b5e2d", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "89ba6e79-7dca-47f5-8d54-918a6912f27f", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "89ba6e79-7dca-47f5-8d54-918a6912f27f"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "89ba6e79-7dca-47f5-8d54-918a6912f27f"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "89ba6e79-7dca-47f5-8d54-918a6912f27f"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "尾水隧洞开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "wssdkw", "plan_start_date": "2020-03-01", "plan_complete_date": "2022-12-31", "actual_complete_date": "2023-01-31", "complete_quantity": 6268.92, "complete_rate": 100.0, "contract_quantity": 6268.92, "plan_node": [{"date": "2020-03-01", "quantity": 0.0, "is_audit": false}, {"date": "2022-12-31", "quantity": 6268.92, "is_audit": false}], "statistic_date": "2023-01-31", "sort": 0, "is_crucial": false, "delay_days": 31} +{"_id": "0200848d-d9e7-4372-a6f6-f768bac13955", "_rev": "1-fff3d992410dcecb499f14c0053ae256", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "主变压器安装(台)", "construction_section": "JD", "status": null, "task_type": "zbazt", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "13c53772-a5af-4a6f-a0fa-7a67d9254e46", "_rev": "6-7290bb2773b5292a126fa2355784290c", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "57cd2d1c-9bd8-4908-9db4-db7b89efbfe1", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "57cd2d1c-9bd8-4908-9db4-db7b89efbfe1"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "57cd2d1c-9bd8-4908-9db4-db7b89efbfe1"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "57cd2d1c-9bd8-4908-9db4-db7b89efbfe1"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "show_name": "引水隧洞衬砌(方)", "construction_section": "TJ", "status": 0, "task_type": "yssdcq", "plan_start_date": "2026-10-28", "plan_complete_date": "2029-07-08", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 577073.0, "plan_node": [{"date": "2026-10-28", "quantity": 0.0, "is_audit": true}, {"date": "2029-07-08", "quantity": 577073.0, "is_audit": true}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "13c6da7b-8963-4aba-9c79-883a340f21e7", "_rev": "9-ad06f47a01e37f107721afbc902e4844", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "afcd8026-d598-4220-a9b2-49df3d8e429c", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "afcd8026-d598-4220-a9b2-49df3d8e429c"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "afcd8026-d598-4220-a9b2-49df3d8e429c"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "afcd8026-d598-4220-a9b2-49df3d8e429c"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "show_name": "进厂交通洞开挖(方)", "construction_section": "TJ", "status": 1, "task_type": "jcjtdkw", "plan_start_date": "2025-01-01", "plan_complete_date": "2026-01-15", "actual_complete_date": "2025-11-18", "complete_quantity": 83935.0, "complete_rate": 100.0, "contract_quantity": 83935.0, "plan_node": [{"date": "2025-01-01", "quantity": 0.0, "is_audit": true}, {"date": "2026-01-15", "quantity": 83935.0, "is_audit": true}], "statistic_date": "2025-11-18", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "14ec3e17-0efc-47d7-8e1b-0f86478dd09a", "_rev": "1-ee61f54006d9ffaae0d71dbdd8dca279", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "架线放线(⽶)", "construction_section": "SCDW", "status": null, "task_type": "jxfxdw", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "4168d62e-8f4a-47d1-bb69-39b90e0b316d", "_rev": "1-c902561622de4582cdbe2545e8cca885", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "鱼道工程(米)", "construction_section": "TJ", "status": null, "task_type": "ydgc", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "48bea90d-8822-4a01-8ee5-77673351b3c7", "_rev": "1-cd4f61545f57bdf3c8d6a927d19fecc3", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "发电机出口断路器安装(套)", "construction_section": "JD", "status": null, "task_type": "fdjckdlqaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "4e584f84-4a68-4142-aea7-7204da39355e", "_rev": "1-bf936b5d2d05e075f914701a41a2c600", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "GIS安装(套)", "construction_section": "JD", "status": null, "task_type": "gisazt", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "5223a39e-1b46-43d4-9282-9becbfd8242c", "_rev": "1-24b76c3bd3e71b5476ceee8b3a9576b5", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "辅助工程开挖(米)", "construction_section": "TJ", "status": null, "task_type": "fzgckw", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "5bc1be87-64d7-4b7c-8c5d-973f83201f18", "_rev": "6-ba199edf39a4ddc0f9a073adf2ce733c", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "df1db0ab-fdfb-458f-86ff-54bcedf7981f", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "df1db0ab-fdfb-458f-86ff-54bcedf7981f"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "df1db0ab-fdfb-458f-86ff-54bcedf7981f"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "df1db0ab-fdfb-458f-86ff-54bcedf7981f"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "show_name": "大坝坝体填/浇筑(方)", "construction_section": "TJ", "status": 0, "task_type": "dbbttz", "plan_start_date": "2027-03-02", "plan_complete_date": "2028-05-02", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 125090.0, "plan_node": [{"date": "2027-03-02", "quantity": 0.0, "is_audit": true}, {"date": "2028-05-02", "quantity": 125090.0, "is_audit": true}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "62daee88-aa2e-4c80-aed7-234597b98873", "_rev": "50-6e1c8ff81ef75c1878108557ba44b591", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "8cc45de3-3549-41d5-a584-ca4eba240958", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "8cc45de3-3549-41d5-a584-ca4eba240958"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "8cc45de3-3549-41d5-a584-ca4eba240958"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "8cc45de3-3549-41d5-a584-ca4eba240958"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "show_name": "厂房开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "cfkw", "plan_start_date": "2025-05-06", "plan_complete_date": "2027-08-15", "actual_complete_date": null, "complete_quantity": 71910.0, "complete_rate": 33.15, "contract_quantity": 216934.0, "plan_node": [{"date": "2025-05-06", "quantity": 0.0, "is_audit": true}, {"date": "2027-08-15", "quantity": 216934.0, "is_audit": true}], "statistic_date": "2026-01-29", "sort": 0, "is_crucial": false, "delay_days": 7} +{"_id": "69826a7b-049e-493d-afc6-61d60d6da19c", "_rev": "6-c6556f637b9c2ba40c6ba7e1ad365e45", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "f787c8c4-a725-4dc5-b987-12f529ca94ce", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "f787c8c4-a725-4dc5-b987-12f529ca94ce"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "f787c8c4-a725-4dc5-b987-12f529ca94ce"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "f787c8c4-a725-4dc5-b987-12f529ca94ce"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "show_name": "大坝防渗工程(米)", "construction_section": "TJ", "status": 0, "task_type": "dbfsgc", "plan_start_date": "2026-12-15", "plan_complete_date": "2027-04-17", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 6891.0, "plan_node": [{"date": "2026-12-15", "quantity": 0.0, "is_audit": true}, {"date": "2027-04-17", "quantity": 6891.0, "is_audit": true}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "6ec1ba57-f677-4bf4-87ce-41e48c14a049", "_rev": "1-617cd121f6f96f4e872159fd14c911b0", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "发电机安装(台)", "construction_section": "JD", "status": null, "task_type": "fdjaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "732794c3-1efa-4b48-a901-ba150fa38679", "_rev": "2-b0ed6348507a862f8b0c7395e7ced324", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "show_name": "进厂交通洞衬砌(方)", "construction_section": "TJ", "status": null, "task_type": "jcjtdcq", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "75f5457c-8640-4868-8790-5b0571d14828", "_rev": "6-a8a3d1d77e710e990473f03655199e86", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "39c5af79-3fd5-4b90-b7ec-21fe96b4ab50", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "39c5af79-3fd5-4b90-b7ec-21fe96b4ab50"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "39c5af79-3fd5-4b90-b7ec-21fe96b4ab50"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "39c5af79-3fd5-4b90-b7ec-21fe96b4ab50"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "show_name": "大坝基础开挖(方)", "construction_section": "TJ", "status": 0, "task_type": "dbjckw", "plan_start_date": "2026-10-16", "plan_complete_date": "2026-12-14", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 640807.0, "plan_node": [{"date": "2026-10-16", "quantity": 0.0, "is_audit": true}, {"date": "2026-12-14", "quantity": 640807.0, "is_audit": true}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "8866cf58-e56a-49ff-8dae-245f234e48d5", "_rev": "1-2c90425f41ed2448c7b5fb95d952c1b6", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "塔基(基)", "construction_section": "SCDW", "status": null, "task_type": "tjdw", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "894f2bcb-39d2-4ecb-a101-19cd113c017e", "_rev": "1-19ce0c0b05ea31bdbcccefb72152d824", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "液压式启闭机(台)", "construction_section": "JSJG", "status": null, "task_type": "yysqbj", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "92c89e3b-fa1e-4496-9bf5-45124029c7cb", "_rev": "6-9ab6522e66020211f8d0e34edba888f3", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "4545d086-96a8-403b-815f-9179c7882df8", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "4545d086-96a8-403b-815f-9179c7882df8"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "4545d086-96a8-403b-815f-9179c7882df8"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "4545d086-96a8-403b-815f-9179c7882df8"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "show_name": "尾水隧洞衬砌(方)", "construction_section": "TJ", "status": 0, "task_type": "wssdcq", "plan_start_date": "2026-09-16", "plan_complete_date": "2029-02-05", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 54389.0, "plan_node": [{"date": "2026-09-16", "quantity": 0.0, "is_audit": true}, {"date": "2029-02-05", "quantity": 54389.0, "is_audit": true}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "999ee29a-ae18-4e8a-999b-fafa98bd686f", "_rev": "1-2abe6eaab11f81e7934acc40bbefd5c4", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "通风兼安全洞开挖(方)", "construction_section": "TJ", "status": null, "task_type": "tfjaqdkw", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "9bdecd46-2c78-4c18-8af6-ed3d68b472c8", "_rev": "5-93f1ad253b96078e1262541e08166796", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "499c0a14-212c-4dca-a1b5-f422494ba709", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "499c0a14-212c-4dca-a1b5-f422494ba709"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "499c0a14-212c-4dca-a1b5-f422494ba709"}, "contract_quantity": {"approval_status": "rejected", "approval_flow_id": "499c0a14-212c-4dca-a1b5-f422494ba709"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "show_name": "厂房混凝土浇筑(方)", "construction_section": "TJ", "status": 0, "task_type": "cfhntjz", "plan_start_date": "2026-09-16", "plan_complete_date": "2029-02-05", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 54389.0, "plan_node": [{"date": "2026-09-16", "quantity": 0.0, "is_audit": false}, {"date": "2029-02-05", "quantity": 54389.0, "is_audit": false}], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "a9eb5f17-35f0-44c1-a55b-0f3b4d91f843", "_rev": "1-d6ef0ab430dc886ca50dccd14152ea72", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "辅助工程施工及隧道衬砌(米)", "construction_section": "TJ", "status": null, "task_type": "fzgcsgjsdcq", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "c7729461-f85a-4fdb-8c08-b10581a0a226", "_rev": "1-37b070a8fd359267f5b8484fe4b398d9", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "调速器及辅设安装(套)", "construction_section": "JD", "status": null, "task_type": "tsqaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "_rev": "123-0080a27518b7766779de1def927f2149", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "361f1e7a-64f0-4ae8-b61f-f6edb535087d", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "361f1e7a-64f0-4ae8-b61f-f6edb535087d"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "361f1e7a-64f0-4ae8-b61f-f6edb535087d"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "361f1e7a-64f0-4ae8-b61f-f6edb535087d"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-27 00:00:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "show_name": "引水隧洞开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "yssdkw", "plan_start_date": "2025-01-01", "plan_complete_date": "2029-02-28", "actual_complete_date": null, "complete_quantity": 524122.0, "complete_rate": 15.15, "contract_quantity": 3458932.0, "plan_node": [{"date": "2025-01-01", "quantity": 0.0, "is_audit": true}, {"date": "2029-02-28", "quantity": 3458932.0, "is_audit": true}], "statistic_date": "2026-01-29", "sort": 0, "is_crucial": false, "delay_days": 180} +{"_id": "d0e448b8-41f1-438e-9d4e-7392c8e90ee2", "_rev": "1-b229f36d804234cc7a4a05cfd90cdb51", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "水轮机安装(台)", "construction_section": "JD", "status": null, "task_type": "sljaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "db2651d7-f9a9-4e83-997e-5a0693c96190", "_rev": "1-5a7a72a6a1075e42afbb2602383222cb", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "⽴塔(基)", "construction_section": "SCDW", "status": null, "task_type": "ltdw", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "de5426b5-2e3d-4335-bd80-857c939ff5c0", "_rev": "1-3682684c8bfae8f47578501d7f5b5796", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "通风兼安全洞衬砌(方)", "construction_section": "TJ", "status": null, "task_type": "jfjaqdcq", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "e10d9b1a-ed23-4139-9930-61427e65fa48", "_rev": "9-94f4a033cb631072f83448db52342fbf", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "7ae0ef80-12e2-42ad-bda7-9e129c902323", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "7ae0ef80-12e2-42ad-bda7-9e129c902323"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "7ae0ef80-12e2-42ad-bda7-9e129c902323"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "7ae0ef80-12e2-42ad-bda7-9e129c902323"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "show_name": "导流洞开挖(米)", "construction_section": "TJ", "status": 0, "task_type": "dldkw", "plan_start_date": "2024-09-01", "plan_complete_date": "2025-04-30", "actual_complete_date": "2025-04-30", "complete_quantity": 672.0, "complete_rate": 100.0, "contract_quantity": 672.0, "plan_node": [{"date": "2024-09-01", "quantity": 0.0, "is_audit": true}, {"date": "2025-04-30", "quantity": 672.0, "is_audit": true}], "statistic_date": "2025-04-30", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "e4f61ce9-1e4f-4f94-9f62-c5464afbe1d5", "_rev": "1-642fe77d0ba5833b16d12e985b8e8c3c", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "卷扬式启闭机(台)", "construction_section": "JSJG", "status": null, "task_type": "jysqbj", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "934208de-1290-4840-9e7e-b957815b3743", "_rev": "6-c62b82de25b171d5890c719d4f08a0a8", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "approved", "approval_flow_id": "bc984077-20f5-495e-aafe-db719a5c1cec", "edit_after_approve": true}, "complete_rate": {}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "bc984077-20f5-495e-aafe-db719a5c1cec"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "bc984077-20f5-495e-aafe-db719a5c1cec"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "bc984077-20f5-495e-aafe-db719a5c1cec"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-09 23:09:16", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-09 23:09:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "show_name": "导流洞衬砌(米)", "construction_section": "TJ", "status": 1, "task_type": "dldcq", "plan_start_date": "2025-01-01", "plan_complete_date": "2025-09-15", "actual_complete_date": "2025-07-20", "complete_quantity": 28782.29, "complete_rate": 100.0, "contract_quantity": 28782.29, "plan_node": [{"date": "2025-01-01", "quantity": 0.0, "is_audit": true}, {"date": "2025-09-15", "quantity": 28782.29, "is_audit": true}], "statistic_date": "2025-07-20", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "ecb6a8a6-b28a-4a55-b1fe-0b5d59dc207e", "_rev": "9-86e8e89572a0e17c7cdbc5563b5f34d0", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "b9a98141-b786-4050-8a08-1147026fbc46", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b9a98141-b786-4050-8a08-1147026fbc46"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b9a98141-b786-4050-8a08-1147026fbc46"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b9a98141-b786-4050-8a08-1147026fbc46"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "show_name": "通风兼安全洞开挖(方)", "construction_section": "TJ", "status": -1, "task_type": "tfjaqdkw", "plan_start_date": "2019-10-01", "plan_complete_date": "2022-01-31", "actual_complete_date": "2022-06-30", "complete_quantity": 118500.0, "complete_rate": 100.0, "contract_quantity": 118500.0, "plan_node": [{"date": "2019-10-01", "quantity": 0.0, "is_audit": false}, {"date": "2019-12-31", "quantity": 35300.0, "is_audit": false}, {"date": "2020-03-31", "quantity": 84800.0, "is_audit": false}, {"date": "2021-02-28", "quantity": 84810.0, "is_audit": false}, {"date": "2021-06-30", "quantity": 111500.0, "is_audit": false}, {"date": "2021-12-31", "quantity": 117200.0, "is_audit": false}, {"date": "2022-01-31", "quantity": 118500.0, "is_audit": false}], "statistic_date": "2022-06-30", "sort": 0, "is_crucial": false, "delay_days": 150} +{"_id": "fc2b07bc-e85a-4762-9559-c16936b5b0d5", "_rev": "9-aaab2344ec3820ec69933b0b8fa81dc0", "field_metadata": {"is_crucial": {"edit_after_approve": true}, "plan_node": {"approval_status": "under_review", "approval_flow_id": "733bfaf9-9304-47fb-a89a-05a9f8325081", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "733bfaf9-9304-47fb-a89a-05a9f8325081"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "733bfaf9-9304-47fb-a89a-05a9f8325081"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "733bfaf9-9304-47fb-a89a-05a9f8325081"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "4ab0bb83-64f7-4b64-96d6-907c843b7639", "show_name": "大坝防渗工程(米)", "construction_section": "TJ", "status": 0, "task_type": "dbfsgc", "plan_start_date": "2021-03-16", "plan_complete_date": "2025-09-30", "actual_complete_date": "2025-09-25", "complete_quantity": 315800.0, "complete_rate": 100.0, "contract_quantity": 315800.0, "plan_node": [{"date": "2021-03-16", "quantity": 0.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 315800.0, "is_audit": false}], "statistic_date": "2025-09-25", "sort": 0, "is_crucial": false, "delay_days": 0} +{"_id": "f868d55b-6574-4a6b-9180-3a2962f8dc4c", "_rev": "1-70770a08951648221187df2d02944e04", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "励磁系统安装及调试(套)", "construction_section": "JD", "status": null, "task_type": "lcxtaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "f9894b7d-ef21-4f65-b59c-c4a71544bb1b", "_rev": "1-a77ad4553eb1333361abcfd94d85598e", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "闸门及拦污栅安装(扇)", "construction_section": "JSJG", "status": null, "task_type": "zmjlwsaz", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "fb9b02cd-b82c-4aa8-b475-5c3643d7e38e", "_rev": "1-dcb3d6fd7606b14995248f71798d593f", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "桥式起重设备(台)", "construction_section": "JSJG", "status": null, "task_type": "qsqzsb", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} +{"_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "_rev": "14-0b500978a8e3d03ad7f29e8a15f4cbf1", "field_metadata": {"plan_node": {"approval_status": "approved", "approval_flow_id": "dfd3479f-d3ff-49a9-98ca-d1280214e6fd", "edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "approved", "approval_flow_id": "dfd3479f-d3ff-49a9-98ca-d1280214e6fd"}, "plan_complete_date": {"approval_status": "approved", "approval_flow_id": "dfd3479f-d3ff-49a9-98ca-d1280214e6fd"}, "contract_quantity": {"approval_status": "approved", "approval_flow_id": "dfd3479f-d3ff-49a9-98ca-d1280214e6fd"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-01-29 21:32:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "show_name": "尾水隧洞开挖(方)", "construction_section": "TJ", "status": 1, "task_type": "wssdkw", "plan_start_date": "2025-11-28", "plan_complete_date": "2029-03-08", "actual_complete_date": null, "complete_quantity": 29930.0, "complete_rate": 15.22, "contract_quantity": 196645.0, "plan_node": [{"date": "2025-11-28", "quantity": 0.0, "is_audit": true}, {"date": "2029-03-08", "quantity": 196645.0, "is_audit": true}], "statistic_date": "2026-01-29", "sort": 0, "is_crucial": false, "delay_days": 0} diff --git a/filtered_datasource/datasource/filtered/construction_task_detail_1.jsonl b/filtered_datasource/datasource/filtered/construction_task_detail_1.jsonl new file mode 100644 index 0000000..568b811 --- /dev/null +++ b/filtered_datasource/datasource/filtered/construction_task_detail_1.jsonl @@ -0,0 +1,87 @@ +{"_id": "4a880161-3207-405c-9a66-6a2ff716db49", "_rev": "4-50801a0460a099f3be45415ffd234317", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-09 23:05:08", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 11:16:17", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 11:16:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "16512636-e811-4f6f-823e-ec95b4b1d0dc", "rate": null, "quantity": 28782.29, "date": "2025-07-20", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "db98ec2d-1c6b-45f4-a176-7b560a8a89fe", "_rev": "2-c3fce218d5460d66a7c8335435342af2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:21:22", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 11:44:50", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 11:44:50", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 297330.0, "date": "2025-11-08", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "144537c6-138e-4814-8d3c-6f583f78146b", "_rev": "2-ce218c11e1ec44b28b7aa143776a1d97", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:20:33", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 15:50:02", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 15:50:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 49030.0, "date": "2025-11-06", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "d952dcb3-05cb-4ec9-ab9c-785f9882cc76", "_rev": "2-0142fe981c773853d1daba34068dae02", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:22:27", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 15:53:37", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 15:53:37", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 4300.0, "date": "2025-11-06", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "7e2b3bf3-0e77-48db-868c-652384607504", "_rev": "2-8fb2780d1e1465621df4ca9a26ef62d9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-10 15:50:53", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 16:25:53", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 16:25:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "13c6da7b-8963-4aba-9c79-883a340f21e7", "rate": null, "quantity": 81417.0, "date": "2025-11-06", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "050510ef-1a0e-409e-8444-a50ccdac6a51", "_rev": "1-e73fcf3b9fb36b3458626d15aa46f35e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-11 16:45:29", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-11 16:45:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "6a1103ea-334f-41d7-8523-3e1d4fd99c06", "rate": null, "quantity": 45230.0, "date": "2019-07-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "f12c9f08-5365-4f5a-a5eb-72d5f5ecf568", "_rev": "2-ccb2ab706bd84a2f03d07496d4ee491e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 10:06:04", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-11 21:20:22", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-11 21:20:22", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c512dc45-0505-49f5-b65c-b86878b185c3", "rate": null, "quantity": 28374.0, "date": "2019-07-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "497c8f5a-1bf8-447f-ab30-33c41465d15e", "_rev": "2-af3fb88178dbe8e518dbfbdb07f44526", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 09:57:54", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 09:53:54", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 09:53:54", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ecb6a8a6-b28a-4a55-b1fe-0b5d59dc207e", "rate": null, "quantity": 84800.0, "date": "2020-03-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "70b8e035-2ed4-46f3-b7b5-bc6b4841d5b5", "_rev": "4-8273c8b08a0dfc61ad099d6a81d8e585", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 10:05:25", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 09:58:36", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 09:58:36", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ecb6a8a6-b28a-4a55-b1fe-0b5d59dc207e", "rate": null, "quantity": 91500.0, "date": "2021-01-31", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "57957c02-e041-41bd-b209-ffe7a6e29b34", "_rev": "3-46ed22577c18f4a454c501228eda3a83", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 10:13:33", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 10:13:33", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ecb6a8a6-b28a-4a55-b1fe-0b5d59dc207e", "rate": null, "quantity": 118500.0, "date": "2022-06-30", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "9c91886e-de23-4eed-8f26-7d6cb3963578", "_rev": "1-e5c2c044cc6ff530850209542a41b775", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 10:35:32", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 10:35:32", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "020a3d53-4e45-4133-9e6e-93debd3dec22", "rate": null, "quantity": 24000.0, "date": "2021-06-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b47dbe74-67e3-426e-87e9-2e64c70bf09b", "_rev": "1-35e9f1e2004723bd522ece7f692b16c8", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 14:44:55", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 14:44:55", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "3ca28f12-313a-405c-a7df-64e2b2630e61", "rate": null, "quantity": 6000.0, "date": "2024-03-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "27f1c2bb-2c2c-4de6-8c1f-4a4b04b5d124", "_rev": "1-abc41cd9e7d2279fee55bd84c6ec5307", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 15:37:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 15:37:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "35ae3546-f018-4be0-9bf3-72b36b3dcdc7", "rate": null, "quantity": 1863.95, "date": "2017-11-28", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "fdf11fbf-c8ac-4575-a6f4-a61ba9d2bd30", "_rev": "1-b7dfa30b4fe195e57ec429a5ccdb7a62", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 15:39:35", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 15:39:35", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "126c3bdc-bcbf-4c65-a7e7-1d3b7e8e983c", "rate": null, "quantity": 1863.95, "date": "2019-03-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "33bedcdf-55af-476a-910f-c0eb89792c1b", "_rev": "3-bb6e294e3e1f131b067a3b2017c6d945", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 16:14:42", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 16:14:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "1961974f-e16a-4b7c-8388-edd80fe8a69d", "rate": null, "quantity": 362300.0, "date": "2023-05-28", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "e019c3bc-dc02-4825-ad95-fcc819e7ac86", "_rev": "2-376d3dbe9b01e74452e259d187f9b019", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 16:38:08", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 16:37:13", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 16:37:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a5702c85-eeaa-4253-a7b1-d434fb487e1e", "rate": null, "quantity": 2404.0, "date": "2022-08-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "ee176983-e538-41e1-bc38-e697893ca415", "_rev": "2-c52913dcefe94b2ccd76fdbf5feb19a2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 16:46:36", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 16:45:46", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 16:45:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a5702c85-eeaa-4253-a7b1-d434fb487e1e", "rate": null, "quantity": 74500.0, "date": "2024-08-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "98bd3541-6589-45bf-af0b-9c4f619e65c3", "_rev": "2-5d47dba18421354980192fcc75bcfd2b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 16:48:21", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 16:47:43", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 16:47:43", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a5702c85-eeaa-4253-a7b1-d434fb487e1e", "rate": null, "quantity": 109600.0, "date": "2024-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "20f18a6d-e21b-4c66-980b-d0c47b1318be", "_rev": "1-57ac720127fc9e2cbb2d11bd972ed556", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 16:49:08", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 16:49:08", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a5702c85-eeaa-4253-a7b1-d434fb487e1e", "rate": null, "quantity": 121500.0, "date": "2025-06-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "8d46161f-ac07-440a-8bfc-9ecf4383da5b", "_rev": "2-41b785d62f57ac59b26338924e1186b8", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:18:00", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-13 16:50:15", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-13 16:50:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "e10d9b1a-ed23-4139-9930-61427e65fa48", "rate": null, "quantity": 672.0, "date": "2025-04-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "5f295f4e-4c9c-4fb9-97d6-305ebb900cfa", "_rev": "1-7f067aa6defcf997ceb406d57d57dfd9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 17:03:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 17:03:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "d5bee645-930c-4c80-8b2a-aee0e9f0dbff", "rate": null, "quantity": 222496.0, "date": "2024-12-11", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "7e0aece9-5dbf-4fa9-98be-43ffe8891d57", "_rev": "2-5ab8c3884b8328660cf0b8d48c5fad88", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 17:19:40", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 17:17:27", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 17:17:27", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c6852b7c-5a91-444f-be24-615043c7add9", "rate": null, "quantity": 19300.0, "date": "2024-08-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "5cb48b1e-5e73-47fe-9f96-54bd725701dc", "_rev": "2-17958b46246ccd3c23deefac74760e96", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 17:23:29", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 17:20:14", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 17:20:14", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c6852b7c-5a91-444f-be24-615043c7add9", "rate": null, "quantity": 34200.0, "date": "2024-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "ffcf32f1-ebe9-444e-a662-4bc9a8ab2f1a", "_rev": "3-7d8b2e41ba7667440f6a21c14f9ee16d", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 17:34:34", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 17:34:34", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "172c6a77-fd02-4cc6-b330-48bc9e67cfaa", "rate": null, "quantity": 882146.0, "date": "2022-07-15", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "8c87e8da-0446-4cea-ac9b-5486b9c50d60", "_rev": "2-9f00705b3fd73dbbfbf5b6092c6abf57", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-03 10:38:51", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-13 21:10:31", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-13 21:10:31", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c6852b7c-5a91-444f-be24-615043c7add9", "rate": null, "quantity": 54300.0, "date": "2025-11-13", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "4555bf3a-634f-4c1f-9757-b03cf47b39a5", "_rev": "4-4f484726a4e3d11c9f30e084c04c507c", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 08:59:37", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 08:55:28", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 08:55:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 54000.0, "date": "2022-12-31", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "fd8d1d97-2089-46d8-b3ef-13ffcda36783", "_rev": "2-6b221d0a40c1d18a5e38558e97276b19", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 09:00:32", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 09:00:08", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 09:00:08", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 721000.0, "date": "2023-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "e4c3aeda-21b0-4634-a8a3-9ee3afa8d3b5", "_rev": "2-c00c157790d6b1c58b01ce73b9aa10cb", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 09:05:22", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 09:04:59", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 09:04:59", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 1830900.0, "date": "2024-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "f1fbf342-06d2-4f45-871a-5138bd511960", "_rev": "2-7af32f124e27b290b3ba165743315c1e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-03 10:39:07", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 09:05:36", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 09:05:36", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 2593200.0, "date": "2025-11-14", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "39a704d6-cad7-475b-9d76-50d13c50005e", "_rev": "2-6e81fcd6069c39d3503363f832a2731b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-09 16:19:22", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 09:16:43", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 09:16:43", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c8c6c5f8-f761-4e6e-baa1-636eba451873", "rate": null, "quantity": 5200.0, "date": "2025-11-14", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b0b39475-13f3-4a98-9649-24c7f5ada578", "_rev": "1-99840ae0fc5b83baab790f026739f758", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:08:11", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:08:11", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "dc41afbc-c6d3-489d-8270-466349df0282", "rate": null, "quantity": 6268.92, "date": "2023-01-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b3290933-3e0c-454d-bfd4-251cea5c6769", "_rev": "2-767475646f6cd8f2f33d66a357d8cb7e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 10:16:30", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:16:03", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:16:03", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "90f86791-0d3b-49e7-b7b9-90622ed9498d", "rate": null, "quantity": 65000.0, "date": "2022-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "8bdbb8be-bb75-4835-acf6-2d8b2687b554", "_rev": "2-f14456c40cfcd021e616e5011602483b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 10:17:44", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:17:24", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:17:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "90f86791-0d3b-49e7-b7b9-90622ed9498d", "rate": null, "quantity": 180900.0, "date": "2023-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "d395760f-90f9-40d9-a7cf-26f6148dfa24", "_rev": "2-25851905d8d9a861de4e8a98d695cec9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 10:20:16", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:18:06", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:18:06", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "90f86791-0d3b-49e7-b7b9-90622ed9498d", "rate": null, "quantity": 271573.0, "date": "2024-11-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "0844c8dd-fe07-4472-ab0e-c4c0fd933066", "_rev": "2-5787d9ed6d720bc79a7fb9cf561b2053", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 10:35:34", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:32:58", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:32:58", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "fc2b07bc-e85a-4762-9559-c16936b5b0d5", "rate": null, "quantity": 69689.54, "date": "2023-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b40513ee-7bfa-4c79-a997-868410cd0b11", "_rev": "2-6d39450b1da2dd8a3aa6cb944da641f4", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 10:43:07", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:42:41", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:42:41", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "fc2b07bc-e85a-4762-9559-c16936b5b0d5", "rate": null, "quantity": 231800.0, "date": "2024-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "9b95817a-da37-4c95-9935-8289acc8fe5d", "_rev": "1-eb11d81df23edfef1ee680717f973d6b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:43:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:43:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "fc2b07bc-e85a-4762-9559-c16936b5b0d5", "rate": null, "quantity": 315800.0, "date": "2025-09-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b24517ce-5212-4272-bdd3-66abff123a35", "_rev": "1-fa8442c1742b8c0613b1004954d92e2b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 14:26:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 14:26:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "d051bad5-8958-46a9-937c-40e7c46e5592", "rate": null, "quantity": 215.0, "date": "2025-01-05", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "04dc2c7f-730f-4fb8-8d37-f8f79e015592", "_rev": "2-6318da8f87e69794c994904219450eea", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 15:24:59", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:24:28", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:24:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c5ce2863-2e53-45bc-9d96-ef7f4b6d50e1", "rate": null, "quantity": 5.0, "date": "2025-06-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "df42c876-0797-4792-9af1-8bcf024887d6", "_rev": "2-feb25ee11582178950b9b44ab017e537", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 15:25:40", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:25:19", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:25:19", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c5ce2863-2e53-45bc-9d96-ef7f4b6d50e1", "rate": null, "quantity": 17.0, "date": "2025-07-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "964ac118-0612-40a4-83dc-dbe31e59a1da", "_rev": "1-1c7e2eac244d51a2aa621caf25dfad74", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:26:51", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:26:51", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c5ce2863-2e53-45bc-9d96-ef7f4b6d50e1", "rate": null, "quantity": 21.0, "date": "2025-08-24", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "a7f7bd84-f7f2-40ef-8ba4-a8b983d26adf", "_rev": "2-d68a8921e55d676aead50b757bab111a", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 15:30:40", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:30:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:30:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7c85896e-34c8-46a2-8e42-c93034d20805", "rate": null, "quantity": 12.0, "date": "2025-08-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "ead52141-0182-4348-9f63-9d8c8a4e898e", "_rev": "2-5834b0265260b043cc3730bd539f4380", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-14 15:31:53", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:31:03", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:31:03", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7c85896e-34c8-46a2-8e42-c93034d20805", "rate": null, "quantity": 20.0, "date": "2025-09-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "f5ad4130-ee7b-4fd2-bd76-282dec1280d1", "_rev": "1-429b79de272b45bc3c1cce3b34195133", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:32:06", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:32:06", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7c85896e-34c8-46a2-8e42-c93034d20805", "rate": null, "quantity": 21.0, "date": "2025-10-06", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "5af5ee3b-cf7e-4a81-a16d-65378e73295c", "_rev": "1-6a9e4358961315a7803e24ba062d8264", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 15:48:39", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 15:48:39", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "240e5ae8-b3de-4684-abc1-d84283842ee4", "rate": null, "quantity": 12166.0, "date": "2025-10-28", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "57e96e42-5357-4772-b34b-e0406f0c0a9f", "_rev": "1-ec9dd01192c70c592d0471809dadd6b7", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 08:44:22", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 08:44:22", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "924a3fa5-9487-4a72-8ad6-be1ba5cd671f", "rate": null, "quantity": 20.0, "date": "2025-09-28", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "173843c5-46d8-467d-aa59-2db3bf1e8d3f", "_rev": "1-c340febe092bc261f00379ea9604f130", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 08:45:26", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 08:45:26", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "9d1473b4-bc56-435d-b5e3-6f21f3413ec3", "rate": null, "quantity": 6.0, "date": "2025-09-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "6a50b11a-8cd3-4b06-9c2d-a6e2e3ba3625", "_rev": "1-a08ed7bf11aab4d40a1c8a6dcc783e0e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 08:46:11", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 08:46:11", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "26086ea8-9802-449a-929f-8712639c0090", "rate": null, "quantity": 2.0, "date": "2025-06-10", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "3f870711-43f8-4905-98f0-370c28312083", "_rev": "2-9f80aea147af2b0fae67391bc6f153e0", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:08", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:27:25", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:27:25", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c36ba699-de84-4439-90f3-8d71635c3c83", "rate": null, "quantity": 3.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "c34ac740-eb77-4b9b-8db8-0403f36b56ee", "_rev": "2-6c7870e07cb8fb7a09f323df0e87ab4f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:20", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:27:37", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:27:37", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "78d7ab73-4e55-46fa-a208-1a21656cfa01", "rate": null, "quantity": 2.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "6d50c6c6-a92e-4023-88f7-46c8e4f5a3ba", "_rev": "2-68a001fbd7617d983f9a4df07b975a03", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:30", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:30:28", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:30:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "53b44124-0f43-43bb-863d-fab0620bd3e8", "rate": null, "quantity": 2.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "f6d89bc5-e689-44cb-b0bf-16644374dee6", "_rev": "2-17cf56f3c65bd367ec5d46d7917efdcc", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:39", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:32:12", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:32:12", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "98c0b41a-b238-49cd-9d49-76ca8535a084", "rate": null, "quantity": 2.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "2e994a81-cb40-41eb-b8fd-6c94a13d5aa7", "_rev": "1-40819cfdb44128c5eef63d5b3d353410", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:35:05", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:35:05", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "82990141-48ec-4101-942b-e27992e8b8f6", "rate": null, "quantity": 1.0, "date": "2025-10-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "53a5d03d-1cf8-4a46-ad12-b6f4b521d533", "_rev": "2-20ac0def1dfda97bcb467713c3e35d30", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:59", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:36:59", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:36:59", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "54217b3b-ba7c-43c5-9ca5-8ac8eaca0974", "rate": null, "quantity": 2.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b6c70db5-554a-45f2-ac12-992e69ad3e11", "_rev": "2-9482384fa1ba7e42ccb9f793d5a875ae", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:06:48", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:38:33", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:38:33", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "3592d29c-b176-4e0c-8f4a-89cf5f685a3c", "rate": null, "quantity": 3.0, "date": "2025-11-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "e2633f28-0a4e-4376-831e-497cd8a074ce", "_rev": "1-7e0ce8804e7e5090c5fca9f0a346e98c", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-03 10:39:36", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-03 10:39:36", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c6852b7c-5a91-444f-be24-615043c7add9", "rate": null, "quantity": 55242.0, "date": "2025-11-30", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "cde82b83-e4d2-47f0-83c3-441de773c593", "_rev": "2-1ab3922ba3e09cdc263d4bda7d1ed2a9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-29 11:16:23", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-04 09:49:47", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-04 09:49:47", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 2609300.0, "date": "2025-12-03", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "6d35330a-92e8-46b9-bb47-bcacdd2ce114", "_rev": "2-f914291dcf8a1390cb598488ec22d8a2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-29 14:42:57", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:22:13", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:22:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c8c6c5f8-f761-4e6e-baa1-636eba451873", "rate": null, "quantity": 5700.0, "date": "2025-12-03", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "06787fe3-a77b-41a9-b51a-5d427b784708", "_rev": "2-c7b3280006bae174a7aeb53cff44e630", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:24:32", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-09 23:18:46", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-09 23:18:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "934208de-1290-4840-9e7e-b957815b3743", "rate": null, "quantity": 28782.29, "date": "2025-07-20", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "8cf98191-1a57-47ac-98e8-efd3d45208f1", "_rev": "1-d16b14645e1b7b5f68e3c98c21cbc641", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 17:25:36", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 17:25:36", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "54217b3b-ba7c-43c5-9ca5-8ac8eaca0974", "rate": null, "quantity": 5.0, "date": "2025-12-12", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "6d4b828b-fd29-4b6a-8622-4b681b58124c", "_rev": "2-286cca869ce037a4ec6c03d4ec0c2505", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:25:28", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 19:46:18", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-18 19:46:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 59170.0, "date": "2025-12-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "2788753e-b06c-42c8-aae5-1018a251b611", "_rev": "2-b6a1e47f607658d06ef9ad7ffbd04709", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:26:20", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 19:47:42", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-18 19:47:42", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 17060.0, "date": "2025-12-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "a42d56a0-5a34-491c-a5f6-32ce835efc81", "_rev": "2-bc8d7f018fcd0e1370f021a74b3b0c62", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:23:46", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 20:52:30", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-18 20:52:30", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "13c6da7b-8963-4aba-9c79-883a340f21e7", "rate": null, "quantity": 83935.0, "date": "2025-11-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "678ef40c-affa-4576-a7e2-f440d835f8a8", "_rev": "2-eefd975eeb318f72bc92c608f496ada9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:26:04", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 20:54:33", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-18 20:54:33", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 372522.0, "date": "2025-12-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "3d422050-0933-46c9-ae47-636f7718d595", "_rev": "2-3273a569d68bf66b206746b74d99ca9a", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-25 20:43:00", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-25 20:39:59", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-25 20:39:59", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 61320.0, "date": "2025-12-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "b5f5fced-f33c-47aa-9ff0-e2168b848ede", "_rev": "2-bb589f51830a758c76cee2129db34d5b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-25 20:43:14", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-25 20:41:15", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-25 20:41:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 400222.0, "date": "2025-12-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "4a28d283-4b24-4dbb-b2b5-6baf38b5a876", "_rev": "2-d323356c40c8da29426b088c605d1e5d", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-25 20:43:27", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-25 20:41:58", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-25 20:41:58", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 19340.0, "date": "2025-12-25", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "814dd21d-a4f4-4daa-a2a5-660dbb8b60a2", "_rev": "2-3394e0d06ee46a2bb3b0bb003c5f14f5", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-02 09:28:55", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-29 11:17:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-29 11:17:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 2620200.0, "date": "2025-12-24", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "5aa94ea0-0cfb-40a3-b6cf-f1f3f5e2b21f", "_rev": "1-921d2c2635ff3592d36b899038f26115", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-29 14:43:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-29 14:43:48", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c8c6c5f8-f761-4e6e-baa1-636eba451873", "rate": null, "quantity": 6500.0, "date": "2025-12-29", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "165a693a-bd87-44a5-8e02-844ceb90103c", "_rev": "2-a38a7da976c83f14dffe018235248ffa", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-01 20:30:01", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-01 19:38:09", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-01-01 19:38:09", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 63550.0, "date": "2026-01-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "3a644e49-355f-42ea-8b8c-cad0c297e06c", "_rev": "2-bc1cd1ad7ee77fb3d23315383a492a41", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-01 20:30:23", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-01 19:40:10", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-01-01 19:40:10", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 424722.0, "date": "2026-01-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "8ce41b95-2f59-4c2b-bf49-c96d946465c9", "_rev": "2-3f28a1ca28f5d6cddd616b0cad1ccf81", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-01 20:30:47", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-01 19:41:33", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-01-01 19:41:33", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 21580.0, "date": "2026-01-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "41c2664e-1dc6-4e4a-9fe0-db670629da1f", "_rev": "2-8d31b4f957521a45e61081fc967445b9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-08 09:50:55", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-02 09:29:37", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-02 09:29:37", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 2622600.0, "date": "2026-01-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "71dc36a5-8b1a-4f31-b5fb-8aacca06eb09", "_rev": "1-fd8b8f736fc0d3fe8f8c0e69e8978e87", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-08 09:49:29", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-08 09:49:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "78d7ab73-4e55-46fa-a208-1a21656cfa01", "rate": null, "quantity": 3.0, "date": "2025-12-31", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "043c1a41-722e-4c94-970b-cda1cd94e66d", "_rev": "2-762a2be265e3bacb7eb118e873fc51e7", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-08 20:04:45", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-08 20:01:13", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-08 20:04:45", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 449522.0, "date": "2026-01-08", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "5f76d8f1-a9da-4c21-a2c7-aa999a820cc5", "_rev": "2-c4608e53d04941e8f61f96a166f5829f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-08 20:04:15", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-08 20:02:02", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-08 20:04:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 65590.0, "date": "2026-01-08", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "71ee5ed6-96d3-4c3c-ae99-3d15bb788371", "_rev": "2-15a6720ed3b8f9d0016234b0f77ec64e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-08 20:04:56", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-08 20:02:37", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-08 20:04:56", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 23760.0, "date": "2026-01-08", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "efd872fc-518f-4f04-9776-222faa025eab", "_rev": "2-c67bfe0b3caf5642449ecd71df963783", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-15 20:02:29", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-15 19:59:01", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-15 20:02:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 67720.0, "date": "2026-01-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "806713c7-b52a-4491-bb43-338d7d3a9bbe", "_rev": "2-6d362db7f4e7738cb88e9064bfca54fd", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-15 20:02:41", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-15 19:59:59", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-15 20:02:41", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 474022.0, "date": "2026-01-15", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "267ff80a-b381-4905-b13f-e814ba56bb00", "_rev": "4-232b9693f1ba5324e227a101f3261318", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2026-01-15 20:02:52", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-15 20:00:55", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-15 20:02:52", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 25730.0, "date": "2026-01-15", "status": null, "change_count": 1, "remark": null, "is_complete": null} +{"_id": "6ac3176d-75e7-4013-adda-1f1e52b5174f", "_rev": "2-403e2cf80f971d0838a6f415878ed98b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-22 20:52:03", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-22 20:38:31", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-22 20:52:03", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 69770.0, "date": "2026-01-22", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "adf3d301-abb7-45af-a2c3-078a91a983ce", "_rev": "2-616055bdf1e629de64591edb8ac596f1", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-22 20:52:22", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-22 20:39:52", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-22 20:52:22", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 500722.0, "date": "2026-01-22", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "2dc7327a-7b9c-4b13-b19b-d33e726f64c1", "_rev": "2-863a20ccfcc875b4fb27a3f7b608b334", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-22 20:52:35", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-22 20:51:14", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-22 20:52:35", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 27870.0, "date": "2026-01-22", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "1a9ae6a7-aa55-433b-8e1b-e1fe865ff8f1", "_rev": "2-d1c5e7bfc65e395cb57d651ce5deef6f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-29 21:53:45", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-29 21:30:06", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-29 21:53:45", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 524122.0, "date": "2026-01-29", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "11b59bd0-48a8-4cf4-b058-271134addadc", "_rev": "2-7c34bbd321597b79cec0b92d71a0a784", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-29 21:53:18", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-29 21:31:19", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-29 21:53:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "62daee88-aa2e-4c80-aed7-234597b98873", "rate": null, "quantity": 71910.0, "date": "2026-01-29", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "2d59d674-94bc-4df7-82d4-6383b2ddb50f", "_rev": "2-59c6fe08cd166318377323146b621a9c", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "approval_status": "pending_confirm", "approval_comment": "同意", "approval_time": "2026-01-29 21:54:08", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2026-01-29 21:32:17", "updated_by": "30717a50-9bcc-4327-a1f0-5aa6f3a56f42", "updated_by_name": "杜光远", "updated_at": "2026-01-29 21:54:08", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "fd67540c-58c1-40a9-a051-410e908ac39c", "rate": null, "quantity": 29930.0, "date": "2026-01-29", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "bfe51026-3087-408d-ab4d-88f7122cebee", "_rev": "1-9da880454978941be3aa47ca1fd4aac0", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-02-06 10:24:46", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:24:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7f349a96-2b5f-4b95-b307-f734ba66feb0", "rate": null, "quantity": 2630000.0, "date": "2026-02-01", "status": null, "change_count": 0, "remark": null, "is_complete": null} diff --git a/filtered_datasource/datasource/filtered/contract_1.jsonl b/filtered_datasource/datasource/filtered/contract_1.jsonl new file mode 100644 index 0000000..fc7a587 --- /dev/null +++ b/filtered_datasource/datasource/filtered/contract_1.jsonl @@ -0,0 +1,65 @@ +{"_id": "0a5f071c-101c-45fc-92dc-f828500a00bb", "_rev": "2-fce52f36ed9a7a9a73d14ad814e96d45", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "低压厂用电配电系统采购合同", "short_name": "", "code": "DP", "contract_type": "product", "currency": "CNY", "manager_name": "李倩", "manager_phone": "15884389937", "sign_company": "乐山一拉得电网自动化有限公司", "company_id": "cd9e9224-a08f-4bed-81a6-b289b74506e8", "sign_date": "2024-08-05", "plan_end_date": "", "total_price": 1496.007, "sub_name": null} +{"_id": "1974b17f-e35f-4053-bbc8-3c1cee0a65ce", "_rev": "1-5146505f8c3e63dde800661dace39b09", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "粉煤灰采购合同", "short_name": "", "code": "FM", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "19c887cb-a0c7-4dd9-9c37-63d53e049ab8", "_rev": "2-2db21aa199f320ad64924da1ff5cedfa", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "高压厂用变采购合同", "short_name": "", "code": "GB", "contract_type": "product", "currency": "CNY", "manager_name": "张大树", "manager_phone": "15202203612", "sign_company": "沈阳中变电气有限责任公司", "company_id": "0798431d-115a-4b1c-b95a-78470160fa9e", "sign_date": "2024-07-05", "plan_end_date": "", "total_price": 1039.0, "sub_name": null} +{"_id": "22b8d43f-3ea2-412a-a5b0-5329b8998d6f", "_rev": "2-8671517a34257ad4ba531d072a802f03", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "发电机采购合同", "short_name": "", "code": "DJ", "contract_type": "product", "currency": "CNY", "manager_name": "孙浩翔", "manager_phone": "15183679645", "sign_company": "东方电气集团东方电机有限公司", "company_id": "ab5ab605-f27a-461b-9a88-73d1eafde5ed", "sign_date": "2021-12-20", "plan_end_date": "", "total_price": 55000.0, "sub_name": null} +{"_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "_rev": "5-8d9ac0d36e38d6c804e5d6e97e134a15", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "total_price": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "company_id": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}, "sub_name": {"approval_status": "approved", "approval_flow_id": "bd6a894d-1500-47cc-91f5-8a043d969200"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "陈萌", "manager_phone": "13618131285", "sign_company": "中国葛洲坝集团三峡建设工程有限公司", "company_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "sign_date": "2019-11-21", "plan_end_date": "", "total_price": 300349.997815, "sub_name": "金沙江上游叶巴滩水电站引水发电系统工程"} +{"_id": "37b54e2a-c159-4cca-a64a-13f379ff64aa", "_rev": "2-6ef682e033156dd6adce1f54221a30f5", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "水泥采购合同", "short_name": "", "code": "SN", "contract_type": "product", "currency": "CNY", "manager_name": "曾强", "manager_phone": "15729742054", "sign_company": "四川蜀府贸易有限公司", "company_id": "3ab47229-6da8-4efb-aa44-b96866a2ce13", "sign_date": "2019-11-01", "plan_end_date": "", "total_price": 0.0, "sub_name": null} +{"_id": "58c1f591-ba44-4452-b8db-4f9e7a9ea9f2", "_rev": "2-fa12aca0acea25778ea456e37319e242", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "3ad5a49f-3f46-43f0-8e1b-da3e8ef6d4f7"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "励磁系统采购合同", "short_name": "", "code": "LC", "contract_type": "product", "currency": "CNY", "manager_name": "林小燕", "manager_phone": "18620810988", "sign_company": "广州擎天实业有限公司", "company_id": "357c7eaf-5a33-4999-be94-79c42bfbd955", "sign_date": "2023-11-05", "plan_end_date": "", "total_price": 997.0, "sub_name": null} +{"_id": "5b7984d7-c947-424f-9694-8f17d45b86b4", "_rev": "1-3e04204a80ed4666a88e6093019cce3f", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "钢筋采购合同", "short_name": "", "code": "GJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "640fc215-134a-49b5-a486-225fa6a0c5c5", "_rev": "2-1944151104959bfae9e8bb5eeb167104", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "卷扬式启闭机采购合同", "short_name": "", "code": "JQ", "contract_type": "product", "currency": "CNY", "manager_name": "盘锡军", "manager_phone": "13508136201", "sign_company": "中国水利水电夹江水工机械有限公司", "company_id": "77316fb4-6167-432b-94e5-89c3d8a6b900", "sign_date": "2023-06-10", "plan_end_date": "", "total_price": 5879.62647, "sub_name": null} +{"_id": "66fb4f4b-872b-420e-9d01-f392a840b5a1", "_rev": "2-d6eeeb51cf7b9ca0c101ca71613f5cfc", "field_metadata": {"sub_name": {}, "sign_company": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:31:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "液压式启闭机采购合同", "short_name": "", "code": "YQ", "contract_type": "product", "currency": "CNY", "manager_name": "邵和凤", "manager_phone": "86-0519-68869977", "sign_company": "常州液压成套设备厂有限公司", "company_id": "48a5f1a7-5d5e-41cf-8676-042f1d5316f1", "sign_date": "2023-05-17", "plan_end_date": "", "total_price": 4320.668, "sub_name": null} +{"_id": "8dde2df6-ae27-4e61-ad80-62dbb7c93ec1", "_rev": "2-cf72684e0adca75b0964a2867fa40c2b", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "主变压器采购合同", "short_name": "", "code": "ZB", "contract_type": "product", "currency": "CNY", "manager_name": "刘朝伟", "manager_phone": "18049180542", "sign_company": "西安西电变压器有限责任公司", "company_id": "e0ceec90-0ad7-417f-a669-fd4f5db07eff", "sign_date": "2023-05-01", "plan_end_date": "", "total_price": 10636.0, "sub_name": null} +{"_id": "a28a8672-c913-4113-90c9-0371f6db9342", "_rev": "2-d1f1754306c2f305773a10ef15fe8877", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "桥式起重设备采购合同", "short_name": "", "code": "QJ", "contract_type": "product", "currency": "CNY", "manager_name": "顾成", "manager_phone": "15988838408", "sign_company": "杭州华新机电工程有限公司", "company_id": "67fa779d-2ce9-468f-b94f-a3d29f1f22c9", "sign_date": "2022-03-06", "plan_end_date": "", "total_price": 2538.5, "sub_name": null} +{"_id": "a2d49172-e04a-4cca-b801-fc7b0d6d0fac", "_rev": "1-e67eab72d8518bf2eb9ef6d136fac391", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "计算机监控系统采购合同", "short_name": "", "code": "JK", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "b8822b9e-4511-497f-98cc-b45be77b1e96", "_rev": "3-422d73286c0b8763967afbd5b1fa8732", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:58:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "高压厂用电配电系统采购合同", "short_name": "", "code": "GP", "contract_type": "product", "currency": "CNY", "manager_name": "范有春", "manager_phone": "13584015343", "sign_company": "国电南京自动化股份有限公司", "company_id": "97be34dc-0a17-4ce5-baea-0f3ceee61103", "sign_date": "2024-08-05", "plan_end_date": "", "total_price": 1183.532, "sub_name": null} +{"_id": "bf665bb5-0d84-43ea-80ce-a8b575d75d62", "_rev": "2-1a96bdff129ff87285b5645543045baf", "field_metadata": {"sub_name": {}, "sign_company": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:35:54", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "发电机出口断路器采购合同", "short_name": "", "code": "JD", "contract_type": "product", "currency": "CNY", "manager_name": "王昆", "manager_phone": "0898-3637", "sign_company": "某公司海南物资有限公司", "company_id": "930dfaf9-708e-4ec0-95f4-521b10bf1c00", "sign_date": "2024-10-14", "plan_end_date": "", "total_price": 3101.4078, "sub_name": null} +{"_id": "cab2e475-6420-43f1-ac0b-f1d60032714d", "_rev": "4-f67e3117d7702c42262346c11399300b", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "水轮机采购合同", "short_name": "", "code": "SJ", "contract_type": "product", "currency": "CNY", "manager_name": "张佩伦", "manager_phone": "13845042361", "sign_company": "哈尔滨电机厂有限责任公司", "company_id": "2e465bd8-b240-4046-bf00-187d22823f7b", "sign_date": "2021-12-20", "plan_end_date": "", "total_price": 49868.0, "sub_name": null} +{"_id": "f28cd32a-564b-4a7c-926f-7d138f6c2439", "_rev": "4-04ac0fe825703c925d64cf576b50b3fd", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "GIS系统采购合同", "short_name": "", "code": "GS", "contract_type": "product", "currency": "CNY", "manager_name": "蒋本涛", "manager_phone": "16620702201", "sign_company": "特变电工中发上海高压开关有限公司", "company_id": "34db820f-860c-4c6e-9326-5c7cb385bf50", "sign_date": "2023-12-09", "plan_end_date": "", "total_price": 5854.5, "sub_name": null} +{"_id": "f509a975-7c1f-4fbb-bbda-2f85eaed1b3d", "_rev": "1-9e77cd4df35dfac9e7396027bf617cdb", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "调速器及其附属设备采购合同", "short_name": "", "code": "TS", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "f95333ee-5f6f-421c-94ce-7edc063b8c62", "_rev": "2-6bcfbcb07db37652267cbe94c4dbaaf3", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "外加剂采购合同", "short_name": "", "code": "YJ", "contract_type": "product", "currency": "CNY", "manager_name": "钟本建", "manager_phone": "18378711407", "sign_company": "江苏苏博特新材料股份有限公司", "company_id": "2ca09c22-68b4-4e43-b9fa-619dcda5f325", "sign_date": "2025-09-18", "plan_end_date": "", "total_price": 3122.05725, "sub_name": null} +{"_id": "01d834e5-a68e-4828-a484-141abd70f05b", "_rev": "1-a25fe62211e83da87a6add15dc3964f9", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "预可及可研阶段设计合同", "short_name": "", "code": "KY", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "031687f4-e525-4ac4-95f5-5d1343dbad26", "_rev": "1-06819e3979392975096aff4a1fbba6ea", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "计算机监控系统采购合同", "short_name": "", "code": "JK", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "039c3d1b-9bbe-40d9-baae-5db156785101", "_rev": "1-c486e288853e5da7b348ccc6635e8023", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "主变压器采购合同", "short_name": "", "code": "ZB", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "07d0c522-598c-4a19-a35d-b18bbd152ce1", "_rev": "1-c78dace9399528967f535928a885e6b9", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "粉煤灰采购合同", "short_name": "", "code": "FM", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "_rev": "1-045893b99fe3893ae31279cd337c26a8", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "施工总承包合同", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "2cd96d17-4068-43a9-b856-07c2e071e8cc", "_rev": "1-3eb7dbb439a7bb07c9a9ff7cca1ddd48", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "卷扬式启闭机采购合同", "short_name": "", "code": "JQ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "6425478f-d383-4466-a387-d9c927a7c8d9", "_rev": "1-d89f2d4adcdb74473ea663847d39258a", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "高压厂用电配电系统采购合同", "short_name": "", "code": "GP", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "74c610c4-4268-4143-a1b4-d1e30f450997", "_rev": "1-c44a58393786db4c938bcb75778b8a59", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "水轮机采购合同", "short_name": "", "code": "SJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "829d3033-6bb1-42eb-88d3-fc1f01985751", "_rev": "1-7542d6ae004ec4569f076a6193d0a55a", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "高压厂用变采购合同", "short_name": "", "code": "GB", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "864c50af-64d8-4278-a1fc-a30804a91d3c", "_rev": "1-0e83f058b3ede95c4ec5b725ca19a6e3", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "外加剂采购合同", "short_name": "", "code": "YJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "86c5bd6f-7737-4aca-b3af-330ab3c9208b", "_rev": "1-6ade569cfae4e2aebcb052cbb611f8ba", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "发电机出口断路器采购合同", "short_name": "", "code": "JD", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "89bf5647-594a-441f-9ea5-e9105f50dd78", "_rev": "1-b9d3fb8795c8a82f8d32a9d8f40bc69d", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "调速器及其附属设备采购合同", "short_name": "", "code": "TS", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "8b3bd771-1b7f-42f6-adb6-4bae6c765a3f", "_rev": "1-c968fbda1a32122d4e58bf8956652ca1", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "水泥采购合同", "short_name": "", "code": "SN", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "8ca9f6af-d93a-4274-9651-3325ea1a47a2", "_rev": "1-0581194684233e4f0514d8f82c6b500b", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "液压式启闭机采购合同", "short_name": "", "code": "YQ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "_rev": "1-3ed037a217dbaddd7ed772fc2b633f82", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "钢筋采购合同", "short_name": "", "code": "GJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "_rev": "1-b4b8fcf8f642923ee4dff56c79185a12", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "低压厂用电配电系统采购合同", "short_name": "", "code": "DP", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "97de1925-849d-4470-8d4d-673790a1b0d4", "_rev": "2-5e93b129a73ffd8da40594b465736325", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "e7374b6f-1da0-4898-b1ca-3780b1ccd583"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "PC合同", "short_name": "", "code": "PC", "contract_type": "service", "currency": "CNY", "manager_name": "周正荣", "manager_phone": "13688518858", "sign_company": "中国水利水电第九工程局有限公司", "company_id": "1098875c-e949-47b1-9f40-237eb507f890", "sign_date": "2024-04-27", "plan_end_date": "", "total_price": 19189.1128} +{"_id": "9e112f2d-60c3-4429-9861-e6348d0d6fd4", "_rev": "1-d5002e648133aeb7d4e980013858279f", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "发电机采购合同", "short_name": "", "code": "DJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "b16ab690-a318-4927-a165-0f2b92759922", "_rev": "1-7b3a12fe3e6566ef03f17f4fe91b6e9c", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "EPC合同", "short_name": "", "code": "EPC", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "b4c2ffab-2c38-49cd-a065-31b9a4b22d1b", "_rev": "1-da62e0ba44360b61d8fdce5e59da9d47", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "闸门及拦污栅采购合同", "short_name": "", "code": "ZM", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "bf9ee1f3-eb6f-495c-a2db-6c95ecf3f8d8", "_rev": "1-78af5c009d812a38851811e8cbf89b44", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "桥式起重设备采购合同", "short_name": "", "code": "QJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "d12b617e-d7c5-4211-822b-5fd3f46bc0f9", "_rev": "1-7125ff63bf662b16112494d5da8f8c69", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "平行发包施工合同", "short_name": "", "code": "PF", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "d13a7aec-9cd8-4cf6-ac21-ccd1b79bcc55", "_rev": "1-6e45e0ceab068bb3d0200068a48b6fec", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "励磁系统采购合同", "short_name": "", "code": "LC", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "d3a3c0a1-11c3-40a0-9a62-90ede90d9d03", "_rev": "1-72492ad0ad20d994915ce9000e22c2c1", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "招标及施工图阶段勘察设计合同", "short_name": "", "code": "E", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "e00871cb-6404-4909-b0ce-db0baecae803", "_rev": "1-47f981270f690493da2a35eac33feb7b", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "GIS系统采购合同", "short_name": "", "code": "GS", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "e312644b-2e3e-4179-8de0-0183e2c72cf4", "_rev": "1-4ed002f311a39b822eced667e9e6b54e", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "低压厂用变采购合同", "short_name": "", "code": "DB", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "_rev": "3-232f2c450e1c7c6cd78fbbe3c98db741", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "total_price": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "company_id": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "其他种类施工合同", "short_name": "", "code": "OSC", "contract_type": "service", "currency": "CNY", "manager_name": "翟万全", "manager_phone": "13778606062", "sign_company": "中国水利水电第六工程局有限公司", "company_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "sign_date": "2024-04-25", "plan_end_date": "", "total_price": 237461.901806} +{"_id": "f3b9c510-568f-4bed-98a4-a602142e1957", "_rev": "2-34a461291110e89ab8eda93dba69705b", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "5e846885-fca8-4034-9de2-904500f907eb"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "监理合同", "short_name": "", "code": "JL", "contract_type": "service", "currency": "CNY", "manager_name": "李卫国", "manager_phone": "13408531717", "sign_company": "四川二滩国际工程咨询有限责任公司", "company_id": "4b069ce4-3687-4263-a1f2-4735c22c3f8e", "sign_date": "2023-09-10", "plan_end_date": "", "total_price": 9886.622299} +{"_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "_rev": "5-81cf334903232c9ff1521ea0aa340ceb", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "total_price": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "company_id": {"approval_status": "approved", "approval_flow_id": "62a58344-b905-44c5-a864-df6f654642cc"}, "sub_name": {}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 10:48:03", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 10:48:03", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "PC合同", "short_name": "", "code": "PC", "contract_type": "service", "currency": "CNY", "manager_name": "杨泽恒", "manager_phone": "13769162007", "sign_company": "中国水利水电第十四工程局有限公司", "company_id": "6db1ed5b-f52a-4142-867c-d8b2731ead71", "sign_date": "2024-08-10", "plan_end_date": "", "total_price": 130146.226803, "sub_name": null} +{"_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "_rev": "3-7af855893060fd0beb401ba70e00dd28", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}, "total_price": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}, "company_id": {"approval_status": "approved", "approval_flow_id": "54a26de7-17e4-4731-bb5f-9ace208a8f5e"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 11:07:12", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 11:07:12", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "PC合同", "short_name": "", "code": "PC", "contract_type": "service", "currency": "CNY", "manager_name": "何周蓉", "manager_phone": "18821761836", "sign_company": "中国水利水电第五工程局有限公司", "company_id": "538e01cd-85cb-42b3-b313-16977f7a5224", "sign_date": "2024-08-09", "plan_end_date": "", "total_price": 140301.0959} +{"_id": "c7c2d101-32a5-4d69-bfd6-4bb0ac210271", "_rev": "2-ca63c4d0e485200408e0759b20218e69", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:04:44", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:04:44", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "PC合同", "short_name": "", "code": "PC", "contract_type": "service", "currency": "CNY", "manager_name": "范开平", "manager_phone": "18284596507", "sign_company": "中国水利水电第十工程局有限公司", "company_id": "31b6b6d7-989b-4abe-a7e1-6d518f3a4020", "sign_date": "2024-02-06", "plan_end_date": "", "total_price": 7357.365783} +{"_id": "1efec366-1ca7-478a-8ecf-f5e457c44b05", "_rev": "2-26e7f31e29415ed1212a93a1fed5c2f9", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "af3da397-3d04-4fe3-ab8d-89af12385ebf"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:22:24", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:22:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "监理合同", "short_name": "", "code": "JL", "contract_type": "service", "currency": "CNY", "manager_name": "李卫国", "manager_phone": "13408531717", "sign_company": "四川二滩国际工程咨询有限责任公司", "company_id": "4b069ce4-3687-4263-a1f2-4735c22c3f8e", "sign_date": "2023-09-10", "plan_end_date": "", "total_price": 9886.622299} +{"_id": "cfda7940-05f2-44b4-8d54-d465fcc32dd6", "_rev": "2-1baae09efb2a9e7403ff358be15a1c15", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "45771f66-8eff-4928-a360-c5805feae3fd"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:33:49", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:33:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "监理合同", "short_name": "", "code": "JL", "contract_type": "service", "currency": "CNY", "manager_name": "许朝政", "manager_phone": "18080015170", "sign_company": "中国电建集团贵阳勘测设计研究院有限公司", "company_id": "98892419-6a71-4d7e-a0ac-ad5a0a15f1d6", "sign_date": "2023-11-29", "plan_end_date": "", "total_price": 31900.0} +{"_id": "cfb16f0a-313f-440f-a7b1-d045f29ab77c", "_rev": "2-b9d4de773f2e7b337110a19b61934189", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "49bb3689-9f98-489b-b17f-74b0f918fac2"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-10 15:46:30", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-10 15:46:30", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "PC合同", "short_name": "", "code": "PC", "contract_type": "service", "currency": "CNY", "manager_name": "翟万全", "manager_phone": "13778606062", "sign_company": "中国水利水电第六工程局有限公司", "company_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "sign_date": "2024-04-25", "plan_end_date": "", "total_price": 237461.901806} +{"_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "_rev": "2-5c66f20d823ffa0fcd9681b1528fe929", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "e50c01c7-3e95-4f98-a994-5cf7a8ad47ce"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-12 21:38:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-12 21:38:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "刘鑫升", "manager_phone": "18783671696", "sign_company": "中国水利水电第五工程局有限公司", "company_id": "538e01cd-85cb-42b3-b313-16977f7a5224", "sign_date": "2017-02-10", "plan_end_date": "", "total_price": 87089.7711, "sub_name": "金沙江上游叶巴滩水电站导流洞及场内右岸高线公路工程"} +{"_id": "4ab0bb83-64f7-4b64-96d6-907c843b7639", "_rev": "2-c3b62b400f3e78dbc7fb023b91a580ab", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "034ad739-a27f-48ac-9c0a-505a88c5c557"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-12 21:39:40", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-12 21:39:40", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "李万洲", "manager_phone": "13330310033", "sign_company": "中国水利水电第七工程局有限公司", "company_id": "4be9e1da-9ebf-4a2a-b6bd-14a41ac31858", "sign_date": "2018-09-25", "plan_end_date": "", "total_price": 468226.0168, "sub_name": "金沙江上游叶巴滩水电站大坝工程施工合同"} +{"_id": "8db97a3a-be48-4ad9-957a-a67034eb99ed", "_rev": "2-26ca014f29814f4642b28a4dbf5bed48", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "acb765f9-f06b-4349-b7a8-6423cacd95fe"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:45:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:45:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "刘明洋", "manager_phone": "13673561123", "sign_company": "中国水利水电第九工程局有限公司", "company_id": "1098875c-e949-47b1-9f40-237eb507f890", "sign_date": "2022-11-06", "plan_end_date": "", "total_price": 5860.0714, "sub_name": "金沙江上游叶巴滩水电站过鱼系统土建工程"} +{"_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "_rev": "2-2eae2725b60978f0a1f5468014b7e360", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "427fc623-5626-4a73-a2f5-8d6229e105f3"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:27:49", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:27:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "张加银", "manager_phone": "18228575199", "sign_company": "中国水利水电第七工程局有限公司", "company_id": "4be9e1da-9ebf-4a2a-b6bd-14a41ac31858", "sign_date": "2022-10-04", "plan_end_date": "", "total_price": 16695.0, "sub_name": "金沙江上游叶巴滩水电站机电设备安装工程施工"} +{"_id": "3cdc3f40-7e4a-4601-b643-7ad3037c7ec3", "_rev": "2-82f602763e8dd9f87b70ea457321e9fc", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "cc441f0f-efea-44cc-b96d-0dbfadd7c98c"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:37:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:37:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "周召", "manager_phone": "15729368737", "sign_company": "中国水利水电第四工程局有限公司", "company_id": "9c80aace-ba73-4550-8fef-3080b51027d9", "sign_date": "2016-06-28", "plan_end_date": "", "total_price": 55446.65, "sub_name": "金沙江上游叶巴滩水电站场内左岸高线公路及俄德西沟沟水处理工程"} +{"_id": "9a2a4e3f-e748-4229-89bc-ad72eba4b352", "_rev": "2-abca3fb4effbced2a372a42a207f4488", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "f7d58861-b272-46db-b06b-f3c52a30d839"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:58:32", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:58:32", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "贾真", "manager_phone": "18215559382", "sign_company": "中国葛洲坝集团三峡建设工程有限公司", "company_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "sign_date": "2015-10-30", "plan_end_date": "", "total_price": 9963.65, "sub_name": "进场交通工程合同"} +{"_id": "2e7feb46-667b-4b40-be23-f4f5589f0492", "_rev": "2-23bc2a69f10bfba4a6248310672d930f", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "e08025a8-2d78-4736-8ce0-9d2f4cad5817"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:02:13", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:02:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "贾真", "manager_phone": "18215559382", "sign_company": "中国葛洲坝集团三峡建设工程有限公司", "company_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "sign_date": "2015-11-09", "plan_end_date": "", "total_price": 33972.19, "sub_name": "金沙江上游叶巴滩水电站场内低线公路工程合同文件"} +{"_id": "ac565d4c-3911-4690-953e-d4ceb5a56442", "_rev": "2-872137190f012da5f1e987b23c51b3d6", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "5d991769-6b70-4b14-a5e9-4061eaa3aab3"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:16:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:16:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "岩孟", "manager_phone": "14787938856", "sign_company": "云南水电十四局东华建筑工程有限公司", "company_id": "594a09af-8944-476d-b098-7aebe96ad4e8", "sign_date": "2025-05-15", "plan_end_date": "", "total_price": 8108.48, "sub_name": "金沙江上游叶巴滩水电站枢纽区装修工程"} +{"_id": "dc90ce00-f4bf-401f-a64a-4ac0df9ebca3", "_rev": "2-ee209303e0dfaf6b2e5ecda0ec30b3b6", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "394637f6-ad74-48fc-a875-197a9b452759"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:20:26", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:20:26", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "彭清海", "manager_phone": "18981727633", "sign_company": "中国安能集团第三工程局有限公司", "company_id": "1115a7f3-b2c1-4bfb-8c89-605250c402dd", "sign_date": "2022-08-16", "plan_end_date": "", "total_price": 6393.57, "sub_name": "叶巴滩水电站1#承包商营地复建工程"} +{"_id": "0e055981-96e8-4eaa-9a5d-61190023be0b", "_rev": "2-b419b48919de210d6257cb5d7a65f242", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "45c58e7c-e56a-460e-abff-c7441d9d7938"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:26:30", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:26:30", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "监理合同", "short_name": "", "code": "JL", "contract_type": "service", "currency": "CNY", "manager_name": "徐凤奎", "manager_phone": "18985191672", "sign_company": "中国电建集团贵阳勘测设计研究院有限公司", "company_id": "98892419-6a71-4d7e-a0ac-ad5a0a15f1d6", "sign_date": "2016-06-21", "plan_end_date": "", "total_price": 3545.98, "sub_name": "金沙江上游叶巴滩电站前期准备工程建设监理服务"} +{"_id": "199920c8-dced-492b-958c-b5b58be3915b", "_rev": "4-b2db7944391fc2389f1fcc43428dd541", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "sub_name": {}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:17:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:17:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "招标及施工图阶段勘察设计合同", "short_name": "", "code": "E", "contract_type": "service", "currency": "CNY", "manager_name": "蒙富强", "manager_phone": "13547829339", "sign_company": "中国电建集团成都勘测设计研究院有限公司", "company_id": "936c6316-8d87-4681-a3b5-b90ed4804a06", "sign_date": "2024-06-11", "plan_end_date": "", "total_price": 123700.0, "sub_name": null} +{"_id": "2c1a1c28-9e8d-4280-bb7d-81a24fd62735", "_rev": "4-bc845a79ab12cb1e6d1dfdef09d50d80", "field_metadata": {"sign_company": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "manager_name": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "manager_phone": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "sign_date": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "total_price": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "company_id": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "sub_name": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:41:46", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:41:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "name": "监理合同", "short_name": "", "code": "JL", "contract_type": "service", "currency": "CNY", "manager_name": "赵兴旺", "manager_phone": "18891990251", "sign_company": "中国水利水电建设工程咨询西北有限公司", "company_id": "b4656ed6-5329-4673-93c8-d11e15d6ece5", "sign_date": "2018-03-30", "plan_end_date": "", "total_price": 13625.93, "sub_name": "金沙江上游叶巴滩水电站主体工程施工监理服务合同"} diff --git a/filtered_datasource/datasource/filtered/contract_change_1.jsonl b/filtered_datasource/datasource/filtered/contract_change_1.jsonl new file mode 100644 index 0000000..f19fe42 --- /dev/null +++ b/filtered_datasource/datasource/filtered/contract_change_1.jsonl @@ -0,0 +1 @@ +{"_id": "35df6c1d-b6c6-4605-8417-76f04256b62d", "_rev": "1-2ec86151cbf7e59e27e7e4644c2e645b", "field_metadata": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:52:06", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:52:06", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_change", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "title": "合同变更、设计变更、索赔补偿", "reason": "合同变更、设计变更、索赔补偿", "before_amount": 300349.997815, "after_amount": 377340.0, "change_time": "2025-11-14", "attachment_ids": ["8e72f2aa198341bf98e1441087f5246d"]} diff --git a/filtered_datasource/datasource/filtered/contract_settlement_1.jsonl b/filtered_datasource/datasource/filtered/contract_settlement_1.jsonl new file mode 100644 index 0000000..c3f5c0d --- /dev/null +++ b/filtered_datasource/datasource/filtered/contract_settlement_1.jsonl @@ -0,0 +1,65 @@ +{"_id": "108211ba-dccd-4f03-a243-a04905c11539", "_rev": "1-1cfb0acffec77a2328f2cf5afa6fd88e", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f509a975-7c1f-4fbb-bbda-2f85eaed1b3d", "contract_type": null, "show_name": "调速器及其附属设备采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "13c83c67-a726-4e1c-ade5-bb146a3dac4f", "_rev": "5-38b3a147cf6c27041162e891684c8ef3", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "bc76ea78-95d2-4552-b8dd-8e0084a6cdeb", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "9292bb5b-6387-4563-a902-6af96c76fadf"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "bc76ea78-95d2-4552-b8dd-8e0084a6cdeb"}}, "approval_user": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "approval_status": "under_review", "approval_comment": "集团管理员驳回", "approval_time": "2026-02-06 10:35:54", "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:40:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "bf665bb5-0d84-43ea-80ce-a8b575d75d62", "contract_type": null, "show_name": "发电机出口断路器采购合同", "complete_price": 2791.26702, "actual_complete_date": null, "actual_start_date": "2025-04-26", "plan_complete_date": "2026-06-30", "plan_start_date": "2024-10-14", "plan_node": [{"date": "2024-10-14", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 3101.4078, "is_audit": false}], "status": 1, "contract_price": 3101.4078, "sort": 0, "delay_days": 0, "statistic_date": "2025-04-26"} +{"_id": "2e321d92-0a10-4a02-9bce-63cd81b669c1", "_rev": "4-eade0c6bcf6317ab8d7cbbb478f5cb65", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "61037dea-2719-4285-962d-d2746e214b40", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "efad5757-7e45-49d2-a43b-c774ef4ddd07"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "61037dea-2719-4285-962d-d2746e214b40"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "8dde2df6-ae27-4e61-ad80-62dbb7c93ec1", "contract_type": null, "show_name": "主变压器采购合同", "complete_price": 5845.4, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-12-31", "plan_start_date": "2023-05-01", "plan_node": [{"date": "2023-05-01", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 10636.0, "is_audit": false}], "status": 1, "contract_price": 10636.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "3a60f300-aeae-4fef-81b9-ed55f24ace90", "_rev": "1-a26ae8e9daec0b0198d8bce032d0e522", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "5b7984d7-c947-424f-9694-8f17d45b86b4", "contract_type": null, "show_name": "钢筋采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "4b2ad982-3eec-440c-837e-c2f24661a7da", "_rev": "1-88338860d64c4ac4a3fcae7fb22a8304", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "a2d49172-e04a-4cca-b801-fc7b0d6d0fac", "contract_type": null, "show_name": "计算机监控系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "5bd1e03e-5ab3-46f7-9ba5-12f91f500ffd", "_rev": "4-77904298e6119c3e265622489257958b", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "fab43465-ee0e-409c-a486-59e45c8de398", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "f392f91b-9e3a-4586-9a4d-bd0226d680a5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "fab43465-ee0e-409c-a486-59e45c8de398"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "22b8d43f-3ea2-412a-a5b0-5329b8998d6f", "contract_type": null, "show_name": "发电机采购合同", "complete_price": 33670.07, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-12-31", "plan_start_date": "2021-12-20", "plan_node": [{"date": "2021-12-20", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 55000.0, "is_audit": false}], "status": 1, "contract_price": 55000.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "5c8acfd1-9b0a-4a7a-a8f6-d54d56069d31", "_rev": "5-08116ab309d32d3eddb15cfa8e8d54a2", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "fbeb4fb0-6069-404c-8b36-69e8a80afba2", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "1a8ce1b1-7d8c-4846-98c0-d05583931cb0"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "fbeb4fb0-6069-404c-8b36-69e8a80afba2"}}, "approval_user": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "approval_status": "under_review", "approval_comment": "集团管理员驳回", "approval_time": "2026-02-06 10:31:53", "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:41:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "66fb4f4b-872b-420e-9d01-f392a840b5a1", "contract_type": null, "show_name": "液压式启闭机采购合同", "complete_price": 2948.05175, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2026-12-31", "plan_start_date": "2023-05-17", "plan_node": [{"date": "2023-05-17", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 4320.668, "is_audit": false}], "status": 1, "contract_price": 4320.668, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "7203cef0-6ac6-4686-8730-a9db0c64f4ca", "_rev": "2-081f0565630022fc23d7c634f72c189d", "field_metadata": {"plan_node": {"edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "1f7ebb95-5a0d-4181-91c3-fd60ac85eb24"}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "37b54e2a-c159-4cca-a64a-13f379ff64aa", "contract_type": null, "show_name": "水泥采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": "2019-11-01", "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "7c23f528-2266-4b85-9f3b-283a64027e0f", "_rev": "1-45261a548a975a1dcae857b77846bc51", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "1974b17f-e35f-4053-bbc8-3c1cee0a65ce", "contract_type": null, "show_name": "粉煤灰采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "7cfd7cbe-d737-41e4-ad0d-647ce267bbb4", "_rev": "8-47837c02ab84c9fb59384ecf5044a07c", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "713c3654-5cc2-4a47-942f-8e2ff2d5f278", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "713c3654-5cc2-4a47-942f-8e2ff2d5f278"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "713c3654-5cc2-4a47-942f-8e2ff2d5f278"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "713c3654-5cc2-4a47-942f-8e2ff2d5f278"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3121d85a-87b8-4ae1-a6c4-1ad1a78562ea", "contract_type": null, "show_name": "施工总承包合同", "complete_price": 303538.29, "actual_complete_date": "2025-12-09", "actual_start_date": "2025-10-21", "plan_complete_date": "2026-12-31", "plan_start_date": "2019-11-21", "plan_node": [{"date": "2019-11-21", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 300349.997815, "is_audit": false}], "status": 1, "contract_price": 300349.997815, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "7ed0fed1-4018-4086-b7e0-4a7f139ac8dc", "_rev": "29-a707760c5ca590f507461edf7c05a8a0", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "e485cd12-9594-430d-ba72-a56fecf813d1", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "e485cd12-9594-430d-ba72-a56fecf813d1"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "e485cd12-9594-430d-ba72-a56fecf813d1"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "e485cd12-9594-430d-ba72-a56fecf813d1"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "58c1f591-ba44-4452-b8db-4f9e7a9ea9f2", "contract_type": null, "show_name": "励磁系统采购合同", "complete_price": 579.3, "actual_complete_date": null, "actual_start_date": "2023-12-07", "plan_complete_date": "2027-12-31", "plan_start_date": "2023-11-05", "plan_node": [{"date": "2023-11-05", "quantity": 0.0, "is_audit": false}, {"date": "2023-12-01", "quantity": 99.7, "is_audit": false}, {"date": "2024-05-31", "quantity": 299.1, "is_audit": false}, {"date": "2025-05-31", "quantity": 403.2, "is_audit": false}, {"date": "2025-07-31", "quantity": 543.3, "is_audit": false}, {"date": "2026-02-28", "quantity": 797.6, "is_audit": false}, {"date": "2027-12-31", "quantity": 997.0, "is_audit": false}], "status": 1, "contract_price": 997.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "aff42f0d-4beb-4ed7-a519-1d9a5247d403", "_rev": "4-ec83622c56cb96e6b5fc61d439133427", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "c5de8769-f5f8-4aa7-8a59-c2bf63ff6d9c", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "6cf5373c-59ed-4625-a1cc-66557fc0513e"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "c5de8769-f5f8-4aa7-8a59-c2bf63ff6d9c"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "19c887cb-a0c7-4dd9-9c37-63d53e049ab8", "contract_type": null, "show_name": "高压厂用变采购合同", "complete_price": 831.2, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-06-30", "plan_start_date": "2024-07-05", "plan_node": [{"date": "2024-07-05", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 1039.0, "is_audit": false}], "status": 1, "contract_price": 1039.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "b1b1ac3a-33f5-4a1d-a1bd-191258a904c6", "_rev": "4-ec3c9ee90378243be1a5a8c81a064c8c", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "56a415ae-b49a-4fd8-af80-602593d20d8e", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "a0bc3d5e-0648-47d1-95ea-07eb3d70267e"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "56a415ae-b49a-4fd8-af80-602593d20d8e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "a28a8672-c913-4113-90c9-0371f6db9342", "contract_type": null, "show_name": "桥式起重设备采购合同", "complete_price": 2079.64, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-06-30", "plan_start_date": "2022-03-06", "plan_node": [{"date": "2022-03-06", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 2538.5, "is_audit": false}], "status": 1, "contract_price": 2538.5, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "b298b89e-abcf-4a76-a85f-ff83f5da8342", "_rev": "2-2698ad8e210648e114f7ac057d8e7efb", "field_metadata": {"plan_node": {"edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "c86403cc-4f8e-41e0-9811-fd2d40984e83"}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f95333ee-5f6f-421c-94ce-7edc063b8c62", "contract_type": null, "show_name": "外加剂采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": "2025-09-18", "plan_node": [], "status": null, "contract_price": 3122.05725, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "b311422b-fa21-4fa3-84e0-7fd47b636bbf", "_rev": "4-0a1c044e51693960cba9c2413bea0769", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "b88d4048-4922-41ae-a0b7-5e5b679bc9c7", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "aa35f6d4-503b-4b5e-8c33-3d04cb75b2e9"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b88d4048-4922-41ae-a0b7-5e5b679bc9c7"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "640fc215-134a-49b5-a486-225fa6a0c5c5", "contract_type": null, "show_name": "卷扬式启闭机采购合同", "complete_price": 3863.62, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-12-31", "plan_start_date": "2023-06-10", "plan_node": [{"date": "2023-06-10", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 5879.62647, "is_audit": false}], "status": 1, "contract_price": 5879.62647, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "c3831212-8134-4d5f-8ac8-c6c41fbbf6db", "_rev": "4-63fee2d5de2044f517942de3ec78a741", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "9fe6c1d6-c3b6-44ef-a017-44d6e0064451", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "cddeaab8-42d8-4f66-93b5-1f3c9a5cd161"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "9fe6c1d6-c3b6-44ef-a017-44d6e0064451"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "b8822b9e-4511-497f-98cc-b45be77b1e96", "contract_type": null, "show_name": "高压厂用电配电系统采购合同", "complete_price": 946.83, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-06-30", "plan_start_date": "2024-08-05", "plan_node": [{"date": "2024-08-05", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 1183.532, "is_audit": false}], "status": 1, "contract_price": 1183.532, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "ca573e09-e78e-4ae7-ae4f-347844f471a7", "_rev": "65-1128e39fb68dce620d3b20028be30ec1", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "946a2991-e1e9-4d1e-b046-91981b65d8de", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "35329b8f-88d0-46a6-8e9a-70842eb87dff"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "946a2991-e1e9-4d1e-b046-91981b65d8de"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:02:10", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f28cd32a-564b-4a7c-926f-7d138f6c2439", "contract_type": null, "show_name": "GIS系统采购合同", "complete_price": 4669.61, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2025-12-31", "plan_start_date": "2023-12-09", "plan_node": [{"date": "2023-12-09", "quantity": 0.0, "is_audit": false}, {"date": "2025-12-31", "quantity": 5854.5, "is_audit": false}], "status": -1, "contract_price": 5854.5, "sort": 0, "delay_days": 58, "statistic_date": "2025-12-09"} +{"_id": "d41b13cf-49c3-49ba-9613-e6dda9635c4e", "_rev": "4-e51cd96682c242386e88591e62395e27", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "2e6048ef-c39d-4715-b97a-8cbe55c5e8a9", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "9869e136-01a5-4672-8312-84a5e1e63c6c"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "2e6048ef-c39d-4715-b97a-8cbe55c5e8a9"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "0a5f071c-101c-45fc-92dc-f828500a00bb", "contract_type": null, "show_name": "低压厂用电配电系统采购合同", "complete_price": 1196.81, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-06-30", "plan_start_date": "2024-08-05", "plan_node": [{"date": "2024-08-05", "quantity": 0.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 1496.007, "is_audit": false}], "status": 1, "contract_price": 1496.007, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "e2f88f30-b118-4319-b214-553ebbe1c3ae", "_rev": "7-f04d2f15eea761b608a91c21bf989396", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "05a3ef22-30de-49c0-b995-c102922c887e", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "8da3e66b-566b-4f6c-b4e9-fd28e3faf977"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "05a3ef22-30de-49c0-b995-c102922c887e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "cab2e475-6420-43f1-ac0b-f1d60032714d", "contract_type": null, "show_name": "水轮机采购合同", "complete_price": 34859.02, "actual_complete_date": null, "actual_start_date": "2025-12-09", "plan_complete_date": "2026-12-31", "plan_start_date": "2021-12-20", "plan_node": [{"date": "2021-12-20", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 49868.0, "is_audit": false}], "status": 1, "contract_price": 49868.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "02bcc9a6-bb66-4fa2-a426-80b8d388cf03", "_rev": "1-5d8e936db480b714746358bad3c94e71", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "contract_type": null, "show_name": "钢筋采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "06ba04bc-dd06-4acb-9b8d-8c67b8a9c66c", "_rev": "1-59540a11fe3d9e0b18cce96aff314cd0", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3a3c0a1-11c3-40a0-9a62-90ede90d9d03", "contract_type": null, "show_name": "招标及施工图阶段勘察设计合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "15997d63-3888-4877-a34f-c8cff32fe454", "_rev": "1-c3d20f7961ec46de3b38a23b07bb5c16", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "86c5bd6f-7737-4aca-b3af-330ab3c9208b", "contract_type": null, "show_name": "发电机出口断路器采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "1b0b8090-f344-40da-b6df-8609e56d2a2e", "_rev": "1-94151c11c783471e2656124c70866e41", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "6425478f-d383-4466-a387-d9c927a7c8d9", "contract_type": null, "show_name": "高压厂用电配电系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "_rev": "1-56566c7734e0deac6209ba90cd0b3eb7", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "contract_type": null, "show_name": "低压厂用电配电系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "30962d2a-7526-4c09-9597-271a7ad4a9fa", "_rev": "1-c9763fdbd7c18e90ff8992b4593c14a5", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "89bf5647-594a-441f-9ea5-e9105f50dd78", "contract_type": null, "show_name": "调速器及其附属设备采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "36328f07-72b8-44db-aeb6-466fd1acf2e4", "_rev": "1-471f37907d364bda3734c52611368ec9", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8ca9f6af-d93a-4274-9651-3325ea1a47a2", "contract_type": null, "show_name": "液压式启闭机采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "3a381622-0547-40e9-a543-03a2bc46fbdc", "_rev": "1-dfa170648b77b7b61f3910cf069d1ccd", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "864c50af-64d8-4278-a1fc-a30804a91d3c", "contract_type": null, "show_name": "外加剂采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "42a4b974-dee6-405b-941b-e705e8876dc6", "_rev": "1-cda3edacc9fa0da8359328a0ad179730", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "bf9ee1f3-eb6f-495c-a2db-6c95ecf3f8d8", "contract_type": null, "show_name": "桥式起重设备采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "5329e272-544d-4a36-9106-7a7c71487d30", "_rev": "1-b8d0f719b8761ddae1779229d83a0bda", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "2cd96d17-4068-43a9-b856-07c2e071e8cc", "contract_type": null, "show_name": "卷扬式启闭机采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "544430cd-1301-43e0-8f7e-a471d9438983", "_rev": "7-7cfa86cd7c74ba4e18edd11764d41bec", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "30ca7a79-2de4-4dce-b5bf-989d1c69bb0b", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "30ca7a79-2de4-4dce-b5bf-989d1c69bb0b"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "30ca7a79-2de4-4dce-b5bf-989d1c69bb0b"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "30ca7a79-2de4-4dce-b5bf-989d1c69bb0b"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "97de1925-849d-4470-8d4d-673790a1b0d4", "contract_type": null, "show_name": "PC合同", "complete_price": 9564.931481, "actual_complete_date": null, "actual_start_date": "2025-10-10", "plan_complete_date": "2032-02-29", "plan_start_date": "2024-04-27", "plan_node": [{"date": "2024-04-27", "quantity": 0.0, "is_audit": false}, {"date": "2032-02-29", "quantity": 13740.9171, "is_audit": false}], "status": 1, "contract_price": 13740.9171, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-10"} +{"_id": "55a2c813-b35e-41a3-83db-d7b65256ac7e", "_rev": "1-0be3c5ca773e6658db21a4bb431404c6", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d13a7aec-9cd8-4cf6-ac21-ccd1b79bcc55", "contract_type": null, "show_name": "励磁系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "579f1102-e1dc-4e26-b00e-4ea499d7a66b", "_rev": "1-e306838d4c7a7f52b8c86daf6f1ee8db", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "b4c2ffab-2c38-49cd-a065-31b9a4b22d1b", "contract_type": null, "show_name": "闸门及拦污栅采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "66c8a4c8-94ec-417e-bf7e-c72d0b9ec9fb", "_rev": "1-f4fe77f9f34206fc4fce323f95cb5938", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "9e112f2d-60c3-4429-9861-e6348d0d6fd4", "contract_type": null, "show_name": "发电机采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "80108bb4-3abb-4861-886b-9b949dcb09aa", "_rev": "1-e5da88819ef5283beb1b940dc0487d0a", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8b3bd771-1b7f-42f6-adb6-4bae6c765a3f", "contract_type": null, "show_name": "水泥采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "9301adc7-9af1-4621-a7e3-842048a1508c", "_rev": "1-86d50203afe40312b4ee7393c61714ad", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "829d3033-6bb1-42eb-88d3-fc1f01985751", "contract_type": null, "show_name": "高压厂用变采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "93ecc764-4167-459a-ad14-c169723d724e", "_rev": "1-e300f09cc961c643509c4c8157d4f8d6", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "e00871cb-6404-4909-b0ce-db0baecae803", "contract_type": null, "show_name": "GIS系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "9ca3b188-c661-4e28-8f60-7e5923e5ea3d", "_rev": "1-e6a3afb379b44566048737eb25485442", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "contract_type": null, "show_name": "施工总承包合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "bb914a70-aa39-45f1-8dd4-809d2af6945d", "_rev": "1-1ee8b1e6639b8e45db7257b9329d272b", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "031687f4-e525-4ac4-95f5-5d1343dbad26", "contract_type": null, "show_name": "计算机监控系统采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "c0a41de9-a40d-4b1d-a014-552f70fc7e6f", "_rev": "1-bac3879a991b787abf70d7967431ba84", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "b16ab690-a318-4927-a165-0f2b92759922", "contract_type": null, "show_name": "EPC合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "c63915bd-8ac9-441d-8b0a-2e9ba73468ac", "_rev": "1-d20fc90a6714741c662acfa957d88636", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "74c610c4-4268-4143-a1b4-d1e30f450997", "contract_type": null, "show_name": "水轮机采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "cf6693ae-9b5e-4309-9353-b0903c06b3e3", "_rev": "1-0859361d95f2be2d3b67030bc9b7d56a", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "07d0c522-598c-4a19-a35d-b18bbd152ce1", "contract_type": null, "show_name": "粉煤灰采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "d603eea4-9338-49b3-8214-188f5043df42", "_rev": "116-fb7f938f48c4a94578a58a98ae48a3f4", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "24346a35-39bd-4199-b7f0-1d4896edaa56", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "24346a35-39bd-4199-b7f0-1d4896edaa56"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "24346a35-39bd-4199-b7f0-1d4896edaa56"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "24346a35-39bd-4199-b7f0-1d4896edaa56"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:02:08", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "f3b9c510-568f-4bed-98a4-a602142e1957", "contract_type": null, "show_name": "监理合同", "complete_price": 494.331115, "actual_complete_date": null, "actual_start_date": "2023-12-19", "plan_complete_date": "2024-01-10", "plan_start_date": "2023-09-10", "plan_node": [{"date": "2023-09-10", "quantity": 0.0, "is_audit": false}, {"date": "2024-01-10", "quantity": 9886.622299, "is_audit": false}], "status": -1, "contract_price": 9886.622299, "sort": 0, "delay_days": 779, "statistic_date": "2023-12-19"} +{"_id": "d86077c8-364b-4405-8605-389c193ad405", "_rev": "1-cb78fa8ec27dbdfceb3b30eff4b330ea", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "01d834e5-a68e-4828-a484-141abd70f05b", "contract_type": null, "show_name": "预可及可研阶段设计合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "dc15e38e-da1a-4fc8-87db-637559a23b5d", "_rev": "1-c62142bd7fe72d25da84d3a54dbf5e62", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "e312644b-2e3e-4179-8de0-0183e2c72cf4", "contract_type": null, "show_name": "低压厂用变采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "f18a109b-f265-47f0-bedc-ed3b9f344056", "_rev": "1-60ddce46cc7b8efdc6f86844c6232b90", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "039c3d1b-9bbe-40d9-baae-5db156785101", "contract_type": null, "show_name": "主变压器采购合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "fc95705f-348e-4954-8789-03c81d1e22bb", "_rev": "1-3a92c5581edea898a410db91c588dc7c", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d12b617e-d7c5-4211-822b-5fd3f46bc0f9", "contract_type": null, "show_name": "平行发包施工合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": null, "plan_node": [], "status": null, "contract_price": 0.0, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "5bd7f162-5dbd-4063-b46f-312cc139a8e2", "_rev": "6-93bed497aa55c757e27a5a2a6ec32357", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "bc12180f-4da3-42b6-a5c1-bd1ed3c38d06", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "bc12180f-4da3-42b6-a5c1-bd1ed3c38d06"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "bc12180f-4da3-42b6-a5c1-bd1ed3c38d06"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "bc12180f-4da3-42b6-a5c1-bd1ed3c38d06"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 10:48:03", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 10:48:03", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "3bb70c3c-f2e0-4763-a38e-35ef2937794e", "contract_type": null, "show_name": "PC合同", "complete_price": 12801.295844, "actual_complete_date": null, "actual_start_date": "2025-10-10", "plan_complete_date": "2033-11-30", "plan_start_date": "2024-08-10", "plan_node": [{"date": "2024-08-10", "quantity": 0.0, "is_audit": false}, {"date": "2033-11-30", "quantity": 130146.226803, "is_audit": false}], "status": 1, "contract_price": 130146.226803, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-10"} +{"_id": "8c7416d4-1813-47a7-9808-769c1d9cb0c0", "_rev": "4-9f1e007ce4d5e331b8a33d6359b943f0", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "4c520bea-714d-4b69-a18a-2ed821ac08ef", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "4c520bea-714d-4b69-a18a-2ed821ac08ef"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "4c520bea-714d-4b69-a18a-2ed821ac08ef"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "4c520bea-714d-4b69-a18a-2ed821ac08ef"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 11:07:12", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 11:07:12", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d3b7e26e-ef1c-4d5b-812d-ce88d0c41f9b", "contract_type": null, "show_name": "PC合同", "complete_price": 16505.52665, "actual_complete_date": null, "actual_start_date": "2025-11-06", "plan_complete_date": "2033-11-30", "plan_start_date": "2024-08-09", "plan_node": [{"date": "2024-08-09", "quantity": 0.0, "is_audit": false}, {"date": "2033-11-30", "quantity": 140301.0959, "is_audit": false}], "status": 1, "contract_price": 140301.0959, "sort": 0, "delay_days": 0, "statistic_date": "2025-11-06"} +{"_id": "9d990fe5-17b1-4658-9b3d-6355992ecb9b", "_rev": "2-28f284a6a3efeca26b2a71a53fd0f102", "field_metadata": {"plan_node": {"edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "6043018d-6375-4b58-a739-ec80b04a9cdf"}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:04:44", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:04:44", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "c7c2d101-32a5-4d69-bfd6-4bb0ac210271", "contract_type": null, "show_name": "PC合同", "complete_price": 0.0, "actual_complete_date": null, "actual_start_date": null, "plan_complete_date": null, "plan_start_date": "2024-02-06", "plan_node": [], "status": null, "contract_price": 7357.365783, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "00e06088-d376-4a73-b4d0-cc0de5736004", "_rev": "4-2f1cf85eb95bfe47ab47bbd86e868975", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "abccdd6f-a65f-4e19-9f09-d19153763b42", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "abccdd6f-a65f-4e19-9f09-d19153763b42"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "abccdd6f-a65f-4e19-9f09-d19153763b42"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "abccdd6f-a65f-4e19-9f09-d19153763b42"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:22:24", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:22:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "1efec366-1ca7-478a-8ecf-f5e457c44b05", "contract_type": null, "show_name": "监理合同", "complete_price": 2483.056686, "actual_complete_date": null, "actual_start_date": "2025-11-06", "plan_complete_date": "2032-03-31", "plan_start_date": "2023-09-10", "plan_node": [{"date": "2023-09-10", "quantity": 0.0, "is_audit": false}, {"date": "2032-03-31", "quantity": 9886.622299, "is_audit": false}], "status": 1, "contract_price": 9886.622299, "sort": 0, "delay_days": 0, "statistic_date": "2025-11-06"} +{"_id": "6c68c4f9-ab72-4e0f-bff9-31e9db967316", "_rev": "4-95983cfa4d14483368f1a2546c9e5ea9", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "3fe8c2cb-9f28-4973-9bbc-8c8a6354fa27", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "3fe8c2cb-9f28-4973-9bbc-8c8a6354fa27"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "3fe8c2cb-9f28-4973-9bbc-8c8a6354fa27"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "3fe8c2cb-9f28-4973-9bbc-8c8a6354fa27"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:33:49", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:33:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "cfda7940-05f2-44b4-8d54-d465fcc32dd6", "contract_type": null, "show_name": "监理合同", "complete_price": 7970.0, "actual_complete_date": null, "actual_start_date": "2025-08-19", "plan_complete_date": "2032-12-31", "plan_start_date": "2023-11-29", "plan_node": [{"date": "2023-11-29", "quantity": 0.0, "is_audit": false}, {"date": "2032-12-31", "quantity": 31900.0, "is_audit": false}], "status": 1, "contract_price": 31900.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-08-19"} +{"_id": "bcd6d13c-e529-4f2d-ab7b-481458c587e2", "_rev": "4-3e21fb7e455f3ca339032bc2c5830bd7", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "e39c6db9-0e7f-4cbb-8c10-727fb5f4b763", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "e39c6db9-0e7f-4cbb-8c10-727fb5f4b763"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "e39c6db9-0e7f-4cbb-8c10-727fb5f4b763"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "e39c6db9-0e7f-4cbb-8c10-727fb5f4b763"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-10 15:46:30", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-10 15:46:30", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "cfb16f0a-313f-440f-a7b1-d045f29ab77c", "contract_type": null, "show_name": "PC合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "e3adcce0-db55-4361-846c-3a52c99e8dd9", "_rev": "4-a90e6d20a33ca225fc796d7693cc36a9", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "48dbee8e-de31-4fe3-a11a-f6a9855afadc", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "48dbee8e-de31-4fe3-a11a-f6a9855afadc"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "48dbee8e-de31-4fe3-a11a-f6a9855afadc"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "48dbee8e-de31-4fe3-a11a-f6a9855afadc"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-12 21:38:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-12 21:38:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "54ffaa56-529e-43ae-a8bc-28ab4f71b9e4", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 92588.19, "actual_complete_date": "2024-12-13", "actual_start_date": "2024-12-13", "plan_complete_date": "2026-12-31", "plan_start_date": "2017-02-10", "plan_node": [{"date": "2017-02-10", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 87089.7711, "is_audit": false}], "status": 1, "contract_price": 87089.7711, "sort": 0, "delay_days": 0, "statistic_date": "2024-12-13"} +{"_id": "cb4ea5f6-e8e3-4a50-a5c0-829c02be3ff6", "_rev": "5-1753b4be4114da9e0b9824cd4a47221b", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "cdc604dc-6d34-4bbf-b929-8ca880a5c562", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "cdc604dc-6d34-4bbf-b929-8ca880a5c562"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "cdc604dc-6d34-4bbf-b929-8ca880a5c562"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "cdc604dc-6d34-4bbf-b929-8ca880a5c562"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-12 21:39:40", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-12 21:39:40", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "4ab0bb83-64f7-4b64-96d6-907c843b7639", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 414461.27, "actual_complete_date": null, "actual_start_date": "2025-10-21", "plan_complete_date": "2027-12-31", "plan_start_date": "2018-09-25", "plan_node": [{"date": "2018-09-25", "quantity": 0.0, "is_audit": false}, {"date": "2027-12-31", "quantity": 468226.0168, "is_audit": false}], "status": 1, "contract_price": 468226.0168, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "5789ef30-258b-4b2f-b8e9-1c644f3957fd", "_rev": "5-8c7f8098d3f834d8f7c66d795b54182e", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "7ad0406c-5ad1-4966-a5f5-8b207fbf4df3", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "7ad0406c-5ad1-4966-a5f5-8b207fbf4df3"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "7ad0406c-5ad1-4966-a5f5-8b207fbf4df3"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "7ad0406c-5ad1-4966-a5f5-8b207fbf4df3"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 10:45:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 10:45:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "8db97a3a-be48-4ad9-957a-a67034eb99ed", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 7282.39, "actual_complete_date": "2025-12-09", "actual_start_date": "2025-10-21", "plan_complete_date": "2027-06-30", "plan_start_date": "2022-11-06", "plan_node": [{"date": "2022-11-06", "quantity": 0.0, "is_audit": false}, {"date": "2027-06-30", "quantity": 5860.0714, "is_audit": false}], "status": 1, "contract_price": 5860.0714, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "ed4c9b00-efbb-41cc-8e67-13d3b0a80fd5", "_rev": "5-4870c34107b3899209e11a9b49095b11", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "5354668f-78c5-4389-8f16-a4b174f4d692", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "5354668f-78c5-4389-8f16-a4b174f4d692"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "5354668f-78c5-4389-8f16-a4b174f4d692"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "5354668f-78c5-4389-8f16-a4b174f4d692"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:27:49", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:27:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "773de8ab-8e21-4ad1-a420-d3709795baa0", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 9522.65, "actual_complete_date": null, "actual_start_date": "2025-11-14", "plan_complete_date": "2027-12-30", "plan_start_date": "2022-10-04", "plan_node": [{"date": "2022-10-04", "quantity": 0.0, "is_audit": false}, {"date": "2027-12-30", "quantity": 16695.0, "is_audit": false}], "status": 1, "contract_price": 16695.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "888377d9-545f-4573-a42d-7b93656e920c", "_rev": "5-ff4da36ceeb799a91b6690b50c0db017", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "d86d549f-475b-4265-8422-3a824de730d1", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "d86d549f-475b-4265-8422-3a824de730d1"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "d86d549f-475b-4265-8422-3a824de730d1"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "d86d549f-475b-4265-8422-3a824de730d1"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:37:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:37:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "3cdc3f40-7e4a-4601-b643-7ad3037c7ec3", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 57966.73, "actual_complete_date": "2025-12-09", "actual_start_date": "2025-01-10", "plan_complete_date": "2026-12-31", "plan_start_date": "2016-06-28", "plan_node": [{"date": "2016-06-28", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 55446.65, "is_audit": false}], "status": 1, "contract_price": 55446.65, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "c47d31fa-7195-42c7-8fc6-e1be2a2df876", "_rev": "5-0088b5868b38912b21feea5774071a3c", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "bd5895ac-1e0a-4daa-9929-fb5ced8cd67f", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "bd5895ac-1e0a-4daa-9929-fb5ced8cd67f"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "bd5895ac-1e0a-4daa-9929-fb5ced8cd67f"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "bd5895ac-1e0a-4daa-9929-fb5ced8cd67f"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:58:32", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:58:32", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "9a2a4e3f-e748-4229-89bc-ad72eba4b352", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 9194.43, "actual_complete_date": null, "actual_start_date": "2022-01-20", "plan_complete_date": "2026-12-31", "plan_start_date": "2015-10-30", "plan_node": [{"date": "2015-10-30", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 9963.65, "is_audit": false}], "status": 1, "contract_price": 9963.65, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "60f8d37c-efd4-464b-8d01-acdded4b6324", "_rev": "5-150eb11d7284e04dce1958f8532d7ced", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "7b40e453-e442-4f04-8692-7604e2b3f07e", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "7b40e453-e442-4f04-8692-7604e2b3f07e"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "7b40e453-e442-4f04-8692-7604e2b3f07e"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "7b40e453-e442-4f04-8692-7604e2b3f07e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:02:13", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:02:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "2e7feb46-667b-4b40-be23-f4f5589f0492", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 30256.02, "actual_complete_date": null, "actual_start_date": "2024-12-18", "plan_complete_date": "2026-12-31", "plan_start_date": "2015-11-09", "plan_node": [{"date": "2015-11-09", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 33972.19, "is_audit": false}], "status": 1, "contract_price": 33972.19, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "ad5e5bc4-3a75-43f4-afc9-918e4624b1fb", "_rev": "5-cbfdb8b44e38eccff78a0ad98b852b61", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "2a76a3ca-8749-4d2e-91b6-35d96b797609", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "2a76a3ca-8749-4d2e-91b6-35d96b797609"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "2a76a3ca-8749-4d2e-91b6-35d96b797609"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "2a76a3ca-8749-4d2e-91b6-35d96b797609"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:16:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:16:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "ac565d4c-3911-4690-953e-d4ceb5a56442", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 1782.73, "actual_complete_date": null, "actual_start_date": "2025-10-21", "plan_complete_date": "2027-12-31", "plan_start_date": "2025-05-15", "plan_node": [{"date": "2025-05-15", "quantity": 0.0, "is_audit": false}, {"date": "2027-12-31", "quantity": 8108.48, "is_audit": false}], "status": 1, "contract_price": 8108.48, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "7a002e5c-6f3e-46a3-9924-12011f30eb97", "_rev": "5-b9c78921db1dc6e08adead0726064e08", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "7320049a-b5a2-430a-acff-5e47f6531525", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "7320049a-b5a2-430a-acff-5e47f6531525"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "7320049a-b5a2-430a-acff-5e47f6531525"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "7320049a-b5a2-430a-acff-5e47f6531525"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:20:26", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:20:26", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "dc90ce00-f4bf-401f-a64a-4ac0df9ebca3", "contract_type": null, "show_name": "施工总承包合同(不含设计、采购)", "complete_price": 5531.78, "actual_complete_date": null, "actual_start_date": "2025-01-10", "plan_complete_date": "2026-12-31", "plan_start_date": "2022-08-16", "plan_node": [{"date": "2022-08-16", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 6393.57, "is_audit": false}], "status": 1, "contract_price": 6393.57, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-09"} +{"_id": "602471ee-e4af-40c3-a5c6-d82117b9853a", "_rev": "4-b4f9ddb0f9188ca344ccf8a35f97c910", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "22c750ca-f8e0-404f-904c-f73aabc34c78", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "22c750ca-f8e0-404f-904c-f73aabc34c78"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "22c750ca-f8e0-404f-904c-f73aabc34c78"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "22c750ca-f8e0-404f-904c-f73aabc34c78"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:26:30", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:26:30", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "0e055981-96e8-4eaa-9a5d-61190023be0b", "contract_type": null, "show_name": "监理合同", "complete_price": 3563.04, "actual_complete_date": "2024-06-12", "actual_start_date": "2024-06-12", "plan_complete_date": "2026-12-31", "plan_start_date": "2016-06-21", "plan_node": [{"date": "2016-06-21", "quantity": 0.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 3545.98, "is_audit": false}], "status": 1, "contract_price": 3545.98, "sort": 0, "delay_days": 0, "statistic_date": "2024-06-12"} +{"_id": "b5669ab4-d583-449d-8ec9-a6752b99dbbe", "_rev": "11-e46a0520553d195ed5e053b4fb46dae0", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "52a077db-c3f9-442a-aba0-d0db1ac6becf", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "be53ad68-0232-4148-bae5-a725362ecd0e"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "52a077db-c3f9-442a-aba0-d0db1ac6becf"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:17:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:17:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "199920c8-dced-492b-958c-b5b58be3915b", "contract_type": null, "show_name": "招标及施工图阶段勘察设计合同", "complete_price": 15979.15, "actual_complete_date": null, "actual_start_date": "2024-08-13", "plan_complete_date": "2028-12-31", "plan_start_date": "2024-06-11", "plan_node": [{"date": "2024-06-11", "quantity": 0.0, "is_audit": false}, {"date": "2028-12-31", "quantity": 123351.01, "is_audit": false}], "status": 1, "contract_price": 123700.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-12"} +{"_id": "5a8fd1df-4fb4-478e-adbb-621fc1194d47", "_rev": "8-b5c37680357fac646145390af6c595b7", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "d279a09a-49e6-4fbe-94ef-8563ee478960", "edit_after_approve": true}, "contract_price": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "053194e3-732d-431d-8e87-9ba0e9389c24"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "d279a09a-49e6-4fbe-94ef-8563ee478960"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:41:46", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:41:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "2c1a1c28-9e8d-4280-bb7d-81a24fd62735", "contract_type": null, "show_name": "监理合同", "complete_price": 13493.9985, "actual_complete_date": null, "actual_start_date": "2025-12-29", "plan_complete_date": "2027-06-30", "plan_start_date": "2018-03-30", "plan_node": [{"date": "2018-03-30", "quantity": 0.0, "is_audit": false}, {"date": "2027-06-30", "quantity": 13625.93, "is_audit": false}], "status": 1, "contract_price": 13625.93, "sort": 0, "delay_days": null, "statistic_date": "2025-12-29"} diff --git a/filtered_datasource/datasource/filtered/contract_settlement_detail_1.jsonl b/filtered_datasource/datasource/filtered/contract_settlement_detail_1.jsonl new file mode 100644 index 0000000..f2520bd --- /dev/null +++ b/filtered_datasource/datasource/filtered/contract_settlement_detail_1.jsonl @@ -0,0 +1,44 @@ +{"_id": "70adde25-515c-432a-b729-5421a2a0cbed", "_rev": "4-91a53821a79cbc8c0e31dd8f281cfcb3", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "registered", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 09:55:19", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 09:55:19", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "d603eea4-9338-49b3-8214-188f5043df42", "date": "2023-12-19", "quantity": 494.331115, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 1} +{"_id": "4cfebe7a-b9d6-4393-9c8f-68a152def8e6", "_rev": "1-8ffbfa7774c266083877401a6989e468", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 10:26:11", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 10:26:11", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "date": "2025-10-18", "quantity": 14576.616806, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "de07aedd-98c9-4c23-bf4d-09b7c2a6482b", "_rev": "1-6d765fb3bf66fed856681ede56a6abef", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 10:58:14", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 10:58:14", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "5bd7f162-5dbd-4063-b46f-312cc139a8e2", "date": "2025-10-10", "quantity": 12801.295844, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "c8f11e62-5e9f-4300-b13c-e9272964e343", "_rev": "1-0288508ef97985dd340f8dd24f615fb1", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 11:14:20", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 11:14:20", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "8c7416d4-1813-47a7-9808-769c1d9cb0c0", "date": "2025-11-06", "quantity": 16505.52665, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "b16d86b3-ff35-480c-a220-8a7a14107935", "_rev": "2-354cf5599d3573bf878e6e6abd4fe914", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "registered", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:30:01", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:30:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "00e06088-d376-4a73-b4d0-cc0de5736004", "date": "2025-11-06", "quantity": 2483.056686, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "2ccf478e-ad2c-4bd5-bc54-a1e1dc14bef9", "_rev": "1-cdeafc64ec04fe16e4dd4fab0c393d8a", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-08 20:47:17", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-08 20:47:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "6c68c4f9-ab72-4e0f-bff9-31e9db967316", "date": "2025-08-19", "quantity": 7970.0, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "2ce32c6b-3d5c-4d0e-9f61-234c61388b17", "_rev": "1-cee28edcbac8e240de7edd312bc81891", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-10 15:51:25", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-10 15:51:25", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "bcd6d13c-e529-4f2d-ab7b-481458c587e2", "date": "2025-10-18", "quantity": 14576.616806, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "f0d337b6-4c9f-41d5-95ec-1f73d5a5fcdf", "_rev": "1-a2f55a960d8772234e3f58fa0d6f2839", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-13 20:45:50", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-13 20:45:50", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "544430cd-1301-43e0-8f7e-a471d9438983", "date": "2025-10-10", "quantity": 9564.931481, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "7f1bb17f-f261-423c-93a7-00065dc1e107", "_rev": "2-3f45904996af8275b0c2838089814e00", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:57:25", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:17:25", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:17:25", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7cfd7cbe-d737-41e4-ad0d-647ce267bbb4", "date": "2025-10-21", "quantity": 120130.6, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "16c1617f-aa63-4f7f-96f1-3549f0eee976", "_rev": "2-f90a21aabf591452dd54e95312710d72", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:57:55", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:19:57", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:19:57", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "cb4ea5f6-e8e3-4a50-a5c0-829c02be3ff6", "date": "2025-10-21", "quantity": 189094.51, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "39601bea-dd5a-4f75-9864-5c668f5f9fa8", "_rev": "2-24af8ec741fd12f124c4eb6d52526e83", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:57:44", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:23:50", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:23:50", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "e3adcce0-db55-4361-846c-3a52c99e8dd9", "date": "2024-12-13", "quantity": 92588.19, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "5864724f-6aa9-4711-8982-8a00ee71d635", "_rev": "2-5259916c592f99a0278b89d83eb61390", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:58:10", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:26:31", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:26:31", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "5789ef30-258b-4b2f-b8e9-1c644f3957fd", "date": "2025-10-21", "quantity": 799.8, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "40c52a2d-d7c4-43c0-9b7a-917045847ebf", "_rev": "2-ad8fd83e383ad2a09bccb4d0ae6363df", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:58:19", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:36:22", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:36:22", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ed4c9b00-efbb-41cc-8e67-13d3b0a80fd5", "date": "2025-11-14", "quantity": 8495.2, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "fa109829-f755-4fa6-b477-5ecb3f039148", "_rev": "2-e13f6896dc07bd099002743f6b811508", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:58:45", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 16:54:20", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 16:54:20", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "888377d9-545f-4573-a42d-7b93656e920c", "date": "2025-01-10", "quantity": 47037.13, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "1883ad2b-6c7a-4c5a-8ca2-d61b18c5aa68", "_rev": "2-e02e7d16f22f34a420a48ed647af44a5", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:58:59", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:00:59", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:00:59", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c47d31fa-7195-42c7-8fc6-e1be2a2df876", "date": "2022-01-20", "quantity": 6357.9, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "ed6750f4-1942-4403-a9e2-01af04f8d992", "_rev": "2-31e9fce16036ce1ef56c41b4aff05b6c", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:59:08", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:04:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:04:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "60f8d37c-efd4-464b-8d01-acdded4b6324", "date": "2024-12-18", "quantity": 22762.6, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "4da24b77-0e50-490c-bae6-f3a9e481d2c3", "_rev": "2-4401b705aee00c64ffb03e131a24fb21", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:59:16", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:18:32", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:18:32", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ad5e5bc4-3a75-43f4-afc9-918e4624b1fb", "date": "2025-10-21", "quantity": 1252.6, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "b1b2b8cd-f578-4234-aec7-c5ed368c5c22", "_rev": "2-9065c87e5a4de9a3435816c59f572168", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 10:59:32", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-14 17:23:11", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-14 17:23:11", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7a002e5c-6f3e-46a3-9924-12011f30eb97", "date": "2025-01-10", "quantity": 5492.0, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "c1fdaf39-bf66-488b-96bc-b59adaa19722", "_rev": "2-25ca0dfa8bc1f6d06557755dc35b3be8", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:03:56", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:15:31", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:15:31", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "602471ee-e4af-40c3-a5c6-d82117b9853a", "date": "2024-06-12", "quantity": 3563.04, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "aec4ab70-00ce-4e57-8fe7-1a1243fa0000", "_rev": "2-81d884504320710712344e1fb6e51f08", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:04:12", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 09:35:56", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 09:35:56", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "b5669ab4-d583-449d-8ec9-a6752b99dbbe", "date": "2024-08-13", "quantity": 7987.13, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "aff31c88-c992-46b4-a218-9c8ffd60d3f3", "_rev": "2-42a23d922139ed7d1e39f1f2efbc231f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:04:32", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:36:55", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:36:55", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7ed0fed1-4018-4086-b7e0-4a7f139ac8dc", "date": "2023-12-07", "quantity": 99.7, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "85aea909-424c-49a9-9d0f-444e64e7aa42", "_rev": "3-e64f786afd0cdbda4b693dfd68128ec0", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:40:32", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:40:32", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "e2f88f30-b118-4319-b214-553ebbe1c3ae", "date": "2025-12-09", "quantity": 34859.02, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 1} +{"_id": "405882f1-a73e-4706-a4bb-0d8d97159868", "_rev": "1-4688199173742de820836ea003936216", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:44:57", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:44:57", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "5bd1e03e-5ab3-46f7-9ba5-12f91f500ffd", "date": "2025-12-09", "quantity": 33670.07, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "9a73dc64-f785-4e95-be84-116ec75093b1", "_rev": "1-9a06c7de27e42a6b509837728eb3d280", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:48:10", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:48:10", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "2e321d92-0a10-4a02-9bce-63cd81b669c1", "date": "2025-12-09", "quantity": 5845.4, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "9b68186d-42cc-4b33-9162-38fed63b1362", "_rev": "1-953d5e29ca58bdbbc3db68587eaad976", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:49:25", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:49:25", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ca573e09-e78e-4ae7-ae4f-347844f471a7", "date": "2025-12-09", "quantity": 4669.61, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "551e3bc0-0a57-4aa5-92fd-f16e2483ae1f", "_rev": "1-85b1d77cbe933546f0fb9e12ad6daa5e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:50:21", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:50:21", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7ed0fed1-4018-4086-b7e0-4a7f139ac8dc", "date": "2025-12-09", "quantity": 579.3, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "36f3c81f-5021-4cdd-a5fb-764688c97e25", "_rev": "1-9e1c53fca0d17ab6dc4b2038a47ef9ac", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:53:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:53:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "aff42f0d-4beb-4ed7-a519-1d9a5247d403", "date": "2025-12-09", "quantity": 831.2, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "c0c8edc4-41ff-4c82-95d0-5c1093cc1a30", "_rev": "1-a5bc63ff19bfac5dc27f00d9bfc0ebec", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:54:46", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:54:46", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c3831212-8134-4d5f-8ac8-c6c41fbbf6db", "date": "2025-12-09", "quantity": 946.83, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "7b22548d-5a05-4423-a4fb-2f12ce573ff8", "_rev": "1-30ad077effd6d9404e78ff4dbd5f45f7", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:55:41", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:55:41", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "d41b13cf-49c3-49ba-9613-e6dda9635c4e", "date": "2025-12-09", "quantity": 1196.81, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "74e4612e-ab02-4393-bce9-9b312b577f9a", "_rev": "1-5c377fdbc68084abccf74b75239ae8f0", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:56:41", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:56:41", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "b311422b-fa21-4fa3-84e0-7fd47b636bbf", "date": "2025-12-09", "quantity": 3863.62, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "ec8347ca-ee7b-4c26-955c-c738f446ccb4", "_rev": "1-e7e83def0eb3e6c68ae3d6a5656fa5e3", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 16:57:37", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 16:57:37", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "b1b1ac3a-33f5-4a1d-a1bd-191258a904c6", "date": "2025-12-09", "quantity": 2079.64, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "8ec08c96-28ae-44bf-848d-23b04966d6a4", "_rev": "1-aa0117b1675deae4bbc3e065bb64be5f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:02:57", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:02:57", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7cfd7cbe-d737-41e4-ad0d-647ce267bbb4", "date": "2025-12-09", "quantity": 303538.29, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "e3a4ea25-1920-4502-aba7-4fd94f74d599", "_rev": "1-9d8bd24188fe852282641c2f57db4b75", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:03:35", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:03:35", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "cb4ea5f6-e8e3-4a50-a5c0-829c02be3ff6", "date": "2025-12-09", "quantity": 414461.27, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "d746e630-8c4b-4ad4-905d-4ad5238bd331", "_rev": "1-342b2ab8c32da83b85da90549270376d", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:05:10", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:05:10", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "5789ef30-258b-4b2f-b8e9-1c644f3957fd", "date": "2025-12-09", "quantity": 7282.39, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "227de574-7d3f-4fae-8007-ce4c519754ed", "_rev": "1-425a94ba0fa1f1f3c51a3fe98d37f1c8", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:06:00", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:06:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ed4c9b00-efbb-41cc-8e67-13d3b0a80fd5", "date": "2025-12-09", "quantity": 9522.65, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "384f0919-65ab-4619-8cca-c568c2064af5", "_rev": "1-e6750800d318119ac8abb63b8260f5cd", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:07:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:07:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "888377d9-545f-4573-a42d-7b93656e920c", "date": "2025-12-09", "quantity": 57966.73, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "f51d622a-5366-4fcc-8b4a-b483fb6ab0a3", "_rev": "1-4c13c97e129111e1609cf39cc6d20531", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:07:57", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:07:57", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "c47d31fa-7195-42c7-8fc6-e1be2a2df876", "date": "2025-12-09", "quantity": 9194.43, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "c1877d1a-4dab-49ab-85ff-7a33a7c77388", "_rev": "1-a1e4731cb1e399b7991ca88d185d0159", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:09:22", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:09:22", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "60f8d37c-efd4-464b-8d01-acdded4b6324", "date": "2025-12-09", "quantity": 30256.02, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "a18aff41-7962-4c93-a78b-ba6cd886ccab", "_rev": "1-bb34a6cea9eab7349d424739bb1a5138", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:10:17", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:10:17", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ad5e5bc4-3a75-43f4-afc9-918e4624b1fb", "date": "2025-12-09", "quantity": 1782.73, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "a294d919-4ff0-4cd2-b304-f6299fec5c81", "_rev": "1-5b67dd48564affd9fd874adb7cca222f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-09 17:11:06", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-09 17:11:06", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "7a002e5c-6f3e-46a3-9924-12011f30eb97", "date": "2025-12-09", "quantity": 5531.78, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "f4f057a7-e5c5-4656-968b-2c67b98eb188", "_rev": "1-9ee4ce5cb4795275e0a3d4118fe3fa29", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 08:59:50", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 08:59:50", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "b5669ab4-d583-449d-8ec9-a6752b99dbbe", "date": "2025-12-12", "quantity": 15979.15, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "8fce86d9-c913-4f04-aee1-3783060ded2d", "_rev": "1-31a4e5d907c6ae5b304fcd45cdc0c4a5", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-29 17:23:35", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-29 17:23:35", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "5a8fd1df-4fb4-478e-adbb-621fc1194d47", "date": "2025-12-29", "quantity": 13493.9985, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "348bf39e-93da-4f4e-b922-4168894d98d6", "_rev": "1-2313121de9098ef1ac61d3494b6a027c", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-02-06 10:40:13", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:40:13", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "13c83c67-a726-4e1c-ade5-bb146a3dac4f", "date": "2025-04-26", "quantity": 2791.26702, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "fa695483-8132-4d1c-9600-49e930e116a0", "_rev": "1-5535efb3ada6148befd5f9c8b9455c4e", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-02-06 10:41:24", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:41:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "5c8acfd1-9b0a-4a7a-a8f6-d54d56069d31", "date": "2025-10-18", "quantity": 2948.05175, "remark": null, "is_complete": false, "write_off_rate": null, "change_count": 0} diff --git a/filtered_datasource/datasource/filtered/lar_1.jsonl b/filtered_datasource/datasource/filtered/lar_1.jsonl new file mode 100644 index 0000000..f8aadcb --- /dev/null +++ b/filtered_datasource/datasource/filtered/lar_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "86af6b07-244c-43df-b386-557d7162d6aa", "_rev": "4-9f50cd07555ee935d04b6ac20dedf226", "field_metadata": {"completed_resettlement_pop": {"approval_status": "under_review", "approval_flow_id": "868f66ad-e9bb-4e33-b7d6-494c6808e402", "edit_after_approve": true}, "actual_spec_project_reconstr": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5", "edit_after_approve": true}, "actual_reservoir_bottom_cleanup": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5", "edit_after_approve": true}, "completed_investment_amt": {"approval_status": "under_review", "approval_flow_id": "5d1928ca-46af-4911-9771-87887d69c9a0", "edit_after_approve": true}, "actual_urban_comp": {"edit_after_approve": true}, "actual_rural_comp": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5", "edit_after_approve": true}, "plan_resettlement_pop": {"approval_status": "under_review", "approval_flow_id": "868f66ad-e9bb-4e33-b7d6-494c6808e402"}, "plan_investment_amt": {"approval_status": "under_review", "approval_flow_id": "5d1928ca-46af-4911-9771-87887d69c9a0"}, "plan_rural_comp": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5"}, "plan_spec_project_reconstr": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5"}, "plan_reservoir_bottom_cleanup": {"approval_status": "under_review", "approval_flow_id": "2b475331-f58a-45b9-ac4a-42718d3a11d5"}}, "approval_user": null, "approval_status": "registered", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "lar", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "plan_resettlement_pop": 695, "completed_resettlement_pop": 695, "plan_investment_amt": 180801.09, "completed_investment_amt": 148418.19, "plan_urban_comp": 0.0, "actual_urban_comp": 0.0, "plan_rural_comp": 85696.63, "actual_rural_comp": 85625.9, "plan_spec_project_reconstr": 30010.09, "actual_spec_project_reconstr": 21295.2307, "plan_reservoir_bottom_cleanup": 986.82, "actual_reservoir_bottom_cleanup": 986.82} +{"_id": "718a9883-8479-4963-a58c-234d1984b117", "_rev": "4-fb4df046ec69b45163d6c107ef86f067", "field_metadata": {"actual_reservoir_bottom_cleanup": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05", "edit_after_approve": true}, "actual_spec_project_reconstr": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05", "edit_after_approve": true}, "actual_urban_comp": {"edit_after_approve": true}, "completed_resettlement_pop": {"approval_status": "under_review", "approval_flow_id": "416db412-8eef-47b9-bf48-fc8c4c1f8804", "edit_after_approve": true}, "actual_rural_comp": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05", "edit_after_approve": true}, "completed_investment_amt": {"approval_status": "under_review", "approval_flow_id": "89a3bde3-d210-49a4-948c-38be6ba5f5d0", "edit_after_approve": true}, "plan_resettlement_pop": {"approval_status": "under_review", "approval_flow_id": "416db412-8eef-47b9-bf48-fc8c4c1f8804"}, "plan_investment_amt": {"approval_status": "under_review", "approval_flow_id": "89a3bde3-d210-49a4-948c-38be6ba5f5d0"}, "plan_rural_comp": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05"}, "plan_spec_project_reconstr": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05"}, "plan_reservoir_bottom_cleanup": {"approval_status": "under_review", "approval_flow_id": "1dbac8af-5a14-4ef5-a98d-ba9c856f8d05"}}, "approval_user": null, "approval_status": "registered", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "lar", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "plan_resettlement_pop": 83, "completed_resettlement_pop": 83, "plan_investment_amt": 29698.24, "completed_investment_amt": 24230.31, "plan_urban_comp": 0.0, "actual_urban_comp": 0.0, "plan_rural_comp": 16689.73, "actual_rural_comp": 16644.28, "plan_spec_project_reconstr": 2726.2, "actual_spec_project_reconstr": 2726.2, "plan_reservoir_bottom_cleanup": 72.03, "actual_reservoir_bottom_cleanup": 72.03} diff --git a/filtered_datasource/datasource/filtered/lar_change_1.jsonl b/filtered_datasource/datasource/filtered/lar_change_1.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/filtered_datasource/datasource/filtered/material_1.jsonl b/filtered_datasource/datasource/filtered/material_1.jsonl new file mode 100644 index 0000000..bc7977e --- /dev/null +++ b/filtered_datasource/datasource/filtered/material_1.jsonl @@ -0,0 +1,38 @@ +{"_id": "2be180e2-98f3-47d5-8de5-86f284fc43af", "_rev": "3-29098aefae5162e96118c4afce7fc1d2", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "9e81bc1f-d36b-442b-b0f2-d6559a1a0dee", "edit_after_approve": true}, "complete_rate": {}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "9e81bc1f-d36b-442b-b0f2-d6559a1a0dee"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "9e81bc1f-d36b-442b-b0f2-d6559a1a0dee"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "9e81bc1f-d36b-442b-b0f2-d6559a1a0dee"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "9e81bc1f-d36b-442b-b0f2-d6559a1a0dee"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:45:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "66fb4f4b-872b-420e-9d01-f392a840b5a1", "show_name": "液压式启闭机采购合同(台)", "material_type": "YQ", "contract_quantity": 17.0, "plan_start_quantity": 2.0, "complete_quantity": 12.0, "complete_rate": 70.59, "plan_start_date": "2024-06-30", "plan_complete_date": "2026-06-30", "actual_start_date": "2025-09-30", "actual_complete_date": null, "plan_node": [{"date": "2024-06-30", "quantity": 2.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 17.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-30"} +{"_id": "380a630b-bf59-428a-89e3-4c5c07af8e7a", "_rev": "5-394dd5e91c6e3e3004cd66765a9e9676", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "a0e2ffc3-1e46-4600-856a-84d979d266bc", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "a0e2ffc3-1e46-4600-856a-84d979d266bc"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "a0e2ffc3-1e46-4600-856a-84d979d266bc"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "a0e2ffc3-1e46-4600-856a-84d979d266bc"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "a0e2ffc3-1e46-4600-856a-84d979d266bc"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "a28a8672-c913-4113-90c9-0371f6db9342", "show_name": "桥式起重设备采购合同(台)", "material_type": "QJ", "contract_quantity": 2.0, "plan_start_quantity": 1.0, "complete_quantity": 2.0, "complete_rate": 100.0, "plan_start_date": "2025-03-31", "plan_complete_date": "2025-06-30", "actual_start_date": "2025-06-20", "actual_complete_date": "2025-05-31", "plan_node": [{"date": "2025-03-31", "quantity": 1.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 2.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-05-31"} +{"_id": "3be5e901-13cb-40ea-90e0-99b99f5cd116", "_rev": "25-fd70cc92a7315d6d4c6b17b58ac55170", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "b9f7e283-a620-42f7-ad5d-a4c25b59e677", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b9f7e283-a620-42f7-ad5d-a4c25b59e677"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "b9f7e283-a620-42f7-ad5d-a4c25b59e677"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b9f7e283-a620-42f7-ad5d-a4c25b59e677"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b9f7e283-a620-42f7-ad5d-a4c25b59e677"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "640fc215-134a-49b5-a486-225fa6a0c5c5", "show_name": "卷扬式启闭机采购合同(台)", "material_type": "JQ", "contract_quantity": 12.0, "plan_start_quantity": 1.0, "complete_quantity": 9.0, "complete_rate": 75.0, "plan_start_date": "2023-12-31", "plan_complete_date": "2025-06-30", "actual_start_date": "2025-12-31", "actual_complete_date": null, "plan_node": [{"date": "2023-12-31", "quantity": 1.0, "is_audit": false}, {"date": "2024-12-31", "quantity": 9.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 12.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 242, "statistic_date": "2025-12-31"} +{"_id": "4472248f-2ead-46d9-adca-20f0ca6a08ca", "_rev": "4-0025c592301886b768f0b0a25ab50f05", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "da13e48f-c494-4571-9422-3b348aef7245", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "da13e48f-c494-4571-9422-3b348aef7245"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "da13e48f-c494-4571-9422-3b348aef7245"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "da13e48f-c494-4571-9422-3b348aef7245"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "da13e48f-c494-4571-9422-3b348aef7245"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "5b7984d7-c947-424f-9694-8f17d45b86b4", "show_name": "钢筋采购合同(吨)", "material_type": "GJ", "contract_quantity": 79210.0, "plan_start_quantity": 5121.28, "complete_quantity": 72999.566, "complete_rate": 92.16, "plan_start_date": "2024-08-10", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-10-10", "actual_complete_date": null, "plan_node": [{"date": "2024-08-10", "quantity": 5121.28, "is_audit": false}, {"date": "2026-12-31", "quantity": 79210.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-10"} +{"_id": "4b5a301c-ac3a-4f72-90d9-48113d07abe3", "_rev": "4-66e4e9d7e30c383ac6b2867d38f13e69", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "52ac662d-6518-4f0e-a57a-92995f5dfd28", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "52ac662d-6518-4f0e-a57a-92995f5dfd28"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "52ac662d-6518-4f0e-a57a-92995f5dfd28"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "52ac662d-6518-4f0e-a57a-92995f5dfd28"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "52ac662d-6518-4f0e-a57a-92995f5dfd28"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "8dde2df6-ae27-4e61-ad80-62dbb7c93ec1", "show_name": "主变压器采购合同(台)", "material_type": "ZB", "contract_quantity": 6.0, "plan_start_quantity": 1.0, "complete_quantity": 5.0, "complete_rate": 83.33, "plan_start_date": "2024-12-31", "plan_complete_date": "2026-03-31", "actual_start_date": "2025-11-30", "actual_complete_date": null, "plan_node": [{"date": "2024-12-31", "quantity": 1.0, "is_audit": false}, {"date": "2026-03-31", "quantity": 6.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-11-30"} +{"_id": "51cb0e26-cda5-4d7b-8f8f-4ff040e01860", "_rev": "1-3a8528ed10837fd887fc53f2895c0533", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "bf665bb5-0d84-43ea-80ce-a8b575d75d62", "show_name": "发电机出口断路器采购合同(台)", "material_type": "JD", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "590e8e7d-1239-4639-a00a-885d075db20b", "_rev": "4-40aa4192c164382ebd61a1241cc6daee", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "7976fb4d-ebf0-4456-a3ee-d33834e6b085", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "7976fb4d-ebf0-4456-a3ee-d33834e6b085"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "7976fb4d-ebf0-4456-a3ee-d33834e6b085"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "7976fb4d-ebf0-4456-a3ee-d33834e6b085"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "7976fb4d-ebf0-4456-a3ee-d33834e6b085"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "19c887cb-a0c7-4dd9-9c37-63d53e049ab8", "show_name": "高压厂用变采购合同(台)", "material_type": "GB", "contract_quantity": 49.0, "plan_start_quantity": 2.0, "complete_quantity": 49.0, "complete_rate": 100.0, "plan_start_date": "2025-01-31", "plan_complete_date": "2025-09-30", "actual_start_date": "2025-09-30", "actual_complete_date": "2025-09-30", "plan_node": [{"date": "2025-01-31", "quantity": 2.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 49.0, "is_audit": false}], "status": 0, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-30"} +{"_id": "69b8803d-6cd3-4301-9900-03b94d9cac77", "_rev": "4-90b25f9a9af9d55d3d68026d4018dc0b", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "6444d966-29f1-4d22-8232-25fa6329ca5a", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "6444d966-29f1-4d22-8232-25fa6329ca5a"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "6444d966-29f1-4d22-8232-25fa6329ca5a"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "6444d966-29f1-4d22-8232-25fa6329ca5a"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "6444d966-29f1-4d22-8232-25fa6329ca5a"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "cab2e475-6420-43f1-ac0b-f1d60032714d", "show_name": "水轮机采购合同(台)", "material_type": "SJ", "contract_quantity": 6.0, "plan_start_quantity": 1.0, "complete_quantity": 6.0, "complete_rate": 100.0, "plan_start_date": "2024-07-31", "plan_complete_date": "2025-09-30", "actual_start_date": "2025-09-30", "actual_complete_date": "2025-09-30", "plan_node": [{"date": "2024-07-31", "quantity": 1.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 6.0, "is_audit": false}], "status": 0, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-30"} +{"_id": "6fd101a2-2047-465d-a905-455f515b9faf", "_rev": "3-9a4f1196165ad83667f3205c119f82f8", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "29a7e9d8-ffe8-43e7-8842-8b28d3c1147b", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "29a7e9d8-ffe8-43e7-8842-8b28d3c1147b"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "29a7e9d8-ffe8-43e7-8842-8b28d3c1147b"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "29a7e9d8-ffe8-43e7-8842-8b28d3c1147b"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "29a7e9d8-ffe8-43e7-8842-8b28d3c1147b"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "37b54e2a-c159-4cca-a64a-13f379ff64aa", "show_name": "水泥采购合同(吨)", "material_type": "SN", "contract_quantity": 551000.0, "plan_start_quantity": 250.0, "complete_quantity": 527261.0, "complete_rate": 95.69, "plan_start_date": "2021-05-10", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-10-10", "actual_complete_date": null, "plan_node": [{"date": "2021-05-10", "quantity": 250.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 551000.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": null, "statistic_date": "2025-10-10"} +{"_id": "79a8cbb5-5081-476f-81bf-50cac4570bd4", "_rev": "3-13c4de9ae8600a810bdc4343f43cc30d", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "c1b9aaf6-b2a8-40d6-b610-e71c032acd9e", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "c1b9aaf6-b2a8-40d6-b610-e71c032acd9e"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "c1b9aaf6-b2a8-40d6-b610-e71c032acd9e"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "c1b9aaf6-b2a8-40d6-b610-e71c032acd9e"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "c1b9aaf6-b2a8-40d6-b610-e71c032acd9e"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "22b8d43f-3ea2-412a-a5b0-5329b8998d6f", "show_name": "发电机采购合同(台)", "material_type": "DJ", "contract_quantity": 6.0, "plan_start_quantity": 1.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": "2024-06-30", "plan_complete_date": "2025-08-31", "actual_start_date": null, "actual_complete_date": null, "plan_node": [{"date": "2024-06-30", "quantity": 1.0, "is_audit": false}, {"date": "2025-08-31", "quantity": 6.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "8a9dfa27-d1d1-40d6-8a67-70ef84c92250", "_rev": "4-434dd90557ca26982894674279fda22b", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "c4d72d20-3175-461b-be43-6bcc5ff72cda", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "c4d72d20-3175-461b-be43-6bcc5ff72cda"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "c4d72d20-3175-461b-be43-6bcc5ff72cda"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "c4d72d20-3175-461b-be43-6bcc5ff72cda"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "c4d72d20-3175-461b-be43-6bcc5ff72cda"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "b8822b9e-4511-497f-98cc-b45be77b1e96", "show_name": "高压厂用电配电系统采购合同(套)", "material_type": "GP", "contract_quantity": 140.0, "plan_start_quantity": 40.0, "complete_quantity": 140.0, "complete_rate": 100.0, "plan_start_date": "2025-01-01", "plan_complete_date": "2025-09-30", "actual_start_date": "2025-09-15", "actual_complete_date": "2025-09-15", "plan_node": [{"date": "2025-01-01", "quantity": 40.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 140.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-15"} +{"_id": "a1e41634-c82d-4b9f-9993-e1ab6c768c8d", "_rev": "79-6f03a795059e891618970f729ba00ae4", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "671723c5-6af5-450f-b57d-66acb2ee6441", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "671723c5-6af5-450f-b57d-66acb2ee6441"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "671723c5-6af5-450f-b57d-66acb2ee6441"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "671723c5-6af5-450f-b57d-66acb2ee6441"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "671723c5-6af5-450f-b57d-66acb2ee6441"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "58c1f591-ba44-4452-b8db-4f9e7a9ea9f2", "show_name": "励磁系统采购合同(套)", "material_type": "LC", "contract_quantity": 6.0, "plan_start_quantity": 1.0, "complete_quantity": 4.0, "complete_rate": 66.67, "plan_start_date": "2025-03-20", "plan_complete_date": "2026-01-31", "actual_start_date": "2025-03-22", "actual_complete_date": null, "plan_node": [{"date": "2025-03-20", "quantity": 1.0, "is_audit": false}, {"date": "2025-03-21", "quantity": 2.0, "is_audit": false}, {"date": "2025-05-15", "quantity": 3.0, "is_audit": false}, {"date": "2025-06-15", "quantity": 4.0, "is_audit": false}, {"date": "2025-12-15", "quantity": 5.0, "is_audit": false}, {"date": "2026-01-31", "quantity": 6.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 74, "statistic_date": "2025-06-27"} +{"_id": "b5913057-001a-4353-a368-4ebdd345e2b9", "_rev": "4-04cbdd3d6ec448dfc8e080bdf59a5b2d", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "95a53a49-a731-4578-b2ef-89b840dab254", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "95a53a49-a731-4578-b2ef-89b840dab254"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "95a53a49-a731-4578-b2ef-89b840dab254"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "95a53a49-a731-4578-b2ef-89b840dab254"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "95a53a49-a731-4578-b2ef-89b840dab254"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "0a5f071c-101c-45fc-92dc-f828500a00bb", "show_name": "低压厂用电配电系统采购合同(套)", "material_type": "DP", "contract_quantity": 204.0, "plan_start_quantity": 50.0, "complete_quantity": 204.0, "complete_rate": 100.0, "plan_start_date": "2025-01-01", "plan_complete_date": "2025-09-30", "actual_start_date": "2025-09-15", "actual_complete_date": "2025-09-15", "plan_node": [{"date": "2025-01-01", "quantity": 50.0, "is_audit": false}, {"date": "2025-09-30", "quantity": 204.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-15"} +{"_id": "d0282a80-beba-4241-94ae-2817cd9c43a9", "_rev": "1-4cd1e07786cf798febb2b9e5599aa694", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f509a975-7c1f-4fbb-bbda-2f85eaed1b3d", "show_name": "调速器及其附属设备采购合同(套)", "material_type": "TS", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "e1ea10b7-a4c0-497c-9e69-b33172630ad5", "_rev": "1-9ff77c5f16df7b86d7067078d720e9a4", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "a2d49172-e04a-4cca-b801-fc7b0d6d0fac", "show_name": "计算机监控系统采购合同(套)", "material_type": "JK", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "ed9cff63-3598-404c-9034-f39260764383", "_rev": "5-5d7bc62fc44e329ccdcb9e87a9056dd4", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "916e7152-8b6c-4aef-884f-68b3468478e9", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "916e7152-8b6c-4aef-884f-68b3468478e9"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "916e7152-8b6c-4aef-884f-68b3468478e9"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "916e7152-8b6c-4aef-884f-68b3468478e9"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f28cd32a-564b-4a7c-926f-7d138f6c2439", "show_name": "GIS系统采购合同(套)", "material_type": "GS", "contract_quantity": 1.0, "plan_start_quantity": 0.0, "complete_quantity": 1.0, "complete_rate": 100.0, "plan_start_date": "2025-04-15", "plan_complete_date": "2025-10-31", "actual_start_date": "2025-09-30", "actual_complete_date": "2025-09-30", "plan_node": [{"date": "2025-04-15", "quantity": 0.0, "is_audit": false}, {"date": "2025-10-31", "quantity": 1.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-09-30"} +{"_id": "f8efc1a4-2d2a-410a-ab99-7f06a003e848", "_rev": "4-e9284b47914b38f12abcf1afddf9443b", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "d7df5ffe-1e8c-454a-9bf6-6b47756f78e2", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "d7df5ffe-1e8c-454a-9bf6-6b47756f78e2"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "d7df5ffe-1e8c-454a-9bf6-6b47756f78e2"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "d7df5ffe-1e8c-454a-9bf6-6b47756f78e2"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "d7df5ffe-1e8c-454a-9bf6-6b47756f78e2"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "f95333ee-5f6f-421c-94ce-7edc063b8c62", "show_name": "外加剂采购合同(吨)", "material_type": "YJ", "contract_quantity": 10700.0, "plan_start_quantity": 52.25, "complete_quantity": 9719.98, "complete_rate": 90.84, "plan_start_date": "2021-09-11", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-10-11", "actual_complete_date": null, "plan_node": [{"date": "2021-09-11", "quantity": 52.25, "is_audit": false}, {"date": "2026-12-31", "quantity": 10700.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-10"} +{"_id": "fb0d3b57-cf9e-406f-865c-5e1bdb071c1c", "_rev": "4-4006c828ae5e140e32e099509a2c96f7", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "804bf40a-bd7a-4e80-bcb9-37259e81e7de", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "804bf40a-bd7a-4e80-bcb9-37259e81e7de"}, "plan_start_quantity": {"approval_status": "under_review", "approval_flow_id": "804bf40a-bd7a-4e80-bcb9-37259e81e7de"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "804bf40a-bd7a-4e80-bcb9-37259e81e7de"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "804bf40a-bd7a-4e80-bcb9-37259e81e7de"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:01", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "1974b17f-e35f-4053-bbc8-3c1cee0a65ce", "show_name": "粉煤灰采购合同(吨)", "material_type": "FM", "contract_quantity": 102569.0, "plan_start_quantity": 3000.0, "complete_quantity": 79178.58, "complete_rate": 77.2, "plan_start_date": "2025-02-10", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-10-10", "actual_complete_date": null, "plan_node": [{"date": "2025-02-10", "quantity": 3000.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 102569.0, "is_audit": false}], "status": 1, "sort": 0, "delay_days": 0, "statistic_date": "2025-12-10"} +{"_id": "1345b58c-9229-49ef-8d87-6905706cc937", "_rev": "1-d16b9f723aeb86e6c768136dc1e96722", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "bf9ee1f3-eb6f-495c-a2db-6c95ecf3f8d8", "show_name": "桥式起重设备采购合同(台)", "material_type": "QJ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "236c2610-f210-450a-846b-2241b2fd07f4", "_rev": "113-d3eab909b8403977755357eca7dd1313", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "show_name": "钢筋采购合同(吨)", "material_type": "GJ", "contract_quantity": 51161.0, "plan_start_quantity": 0.0, "complete_quantity": 12446.639, "complete_rate": 24.33, "plan_start_date": "2024-07-11", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-11-08", "actual_complete_date": null, "plan_node": [{"date": "2024-07-11", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1209.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 5011.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 9032.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 12483.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 14967.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 18642.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 21432.0, "is_audit": false}, {"date": "2025-11-10", "quantity": 24301.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 51161.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 201, "statistic_date": "2025-11-08"} +{"_id": "2cca0365-375c-4252-8e7b-74cc7d0c4fbf", "_rev": "1-5ef6f5782db42b60eedffb689b5894af", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "b4c2ffab-2c38-49cd-a065-31b9a4b22d1b", "show_name": "闸门及拦污栅采购合同(扇)", "material_type": "ZM", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "408afe66-17b5-435a-9efe-3a9b7b5a8093", "_rev": "1-6793ed43db282535ef56c41be6b888d3", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "829d3033-6bb1-42eb-88d3-fc1f01985751", "show_name": "高压厂用变采购合同(台)", "material_type": "GB", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "4d5468f4-8e78-48e3-8c85-6f540874dab9", "_rev": "1-0d995236abab547617f4f9dbb07f8fa5", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "864c50af-64d8-4278-a1fc-a30804a91d3c", "show_name": "外加剂采购合同(吨)", "material_type": "YJ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "4e819a35-7a8e-4c17-b2ce-66981acfa2ba", "_rev": "1-2bb5005b4f5259faed11e0cce11b2340", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "74c610c4-4268-4143-a1b4-d1e30f450997", "show_name": "水轮机采购合同(台)", "material_type": "SJ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "_rev": "113-45c79b92146db5920bef980c9770cd4c", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "07d0c522-598c-4a19-a35d-b18bbd152ce1", "show_name": "粉煤灰采购合同(吨)", "material_type": "FM", "contract_quantity": 60000.0, "plan_start_quantity": 0.0, "complete_quantity": 6742.84, "complete_rate": 11.24, "plan_start_date": "2024-12-01", "plan_complete_date": "2027-05-31", "actual_start_date": "2025-11-03", "actual_complete_date": null, "plan_node": [{"date": "2024-12-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1060.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 2807.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 5654.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 8337.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 10498.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 11838.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 13052.0, "is_audit": false}, {"date": "2027-05-31", "quantity": 60000.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 232, "statistic_date": "2025-11-03"} +{"_id": "508ff179-5731-4f66-a7e3-61a2db61ec74", "_rev": "1-6a88d34073f119609aefcca572a471f7", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "6425478f-d383-4466-a387-d9c927a7c8d9", "show_name": "高压厂用电配电系统采购合同(套)", "material_type": "GP", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "67d14c68-0b8c-4abd-aa71-0215eb18009e", "_rev": "1-80dfc2e395143ef4793976b472220f6e", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "86c5bd6f-7737-4aca-b3af-330ab3c9208b", "show_name": "发电机出口断路器采购合同(台)", "material_type": "JD", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "72d999de-7cf0-451f-873e-eaacf74af3f4", "_rev": "1-5ec503bcc002488d5104c55e34dff4cd", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "e00871cb-6404-4909-b0ce-db0baecae803", "show_name": "GIS系统采购合同(套)", "material_type": "GS", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "731a77db-06c9-4af4-864f-ea4cd046c5b2", "_rev": "1-fa3985ddce76666672eb7de9bbc0074e", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "89bf5647-594a-441f-9ea5-e9105f50dd78", "show_name": "调速器及其附属设备采购合同(套)", "material_type": "TS", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "88519b6d-eb3e-4f53-8233-aac4a6da3c1b", "_rev": "1-81e154af0cd7492d0154f89d82fd47b3", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "show_name": "低压厂用电配电系统采购合同(套)", "material_type": "DP", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "8d45e87d-91a2-469b-b719-e9dee413119f", "_rev": "1-e95d2cbecc391f70a67f4cca4ab4096a", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "031687f4-e525-4ac4-95f5-5d1343dbad26", "show_name": "计算机监控系统采购合同(套)", "material_type": "JK", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "8db5038f-cc59-4527-ae42-420ef51eefbd", "_rev": "1-9dc2959e5a067701f1ac4c7766ff8d74", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "039c3d1b-9bbe-40d9-baae-5db156785101", "show_name": "主变压器采购合同(台)", "material_type": "ZB", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "8dea3bb6-590a-42ca-a3c8-e1001f8ce88b", "_rev": "1-3f70ee24276fc014d1b06f2c03544f24", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8ca9f6af-d93a-4274-9651-3325ea1a47a2", "show_name": "液压式启闭机采购合同(台)", "material_type": "YQ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "bfa7ea83-b061-4cb2-b6a3-99b92e14d125", "_rev": "1-26ab0f8a54c4ca4b78ac335280824faa", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "2cd96d17-4068-43a9-b856-07c2e071e8cc", "show_name": "卷扬式启闭机采购合同(台)", "material_type": "JQ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "c1620e5c-b167-436a-874b-ab57e57254f0", "_rev": "113-4c772493dd8ef3504aaceb21b97432e2", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "554e7584-11bf-45ba-ae8e-f8f207c1a7c6", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "554e7584-11bf-45ba-ae8e-f8f207c1a7c6"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "554e7584-11bf-45ba-ae8e-f8f207c1a7c6"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "554e7584-11bf-45ba-ae8e-f8f207c1a7c6"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8b3bd771-1b7f-42f6-adb6-4bae6c765a3f", "show_name": "水泥采购合同(吨)", "material_type": "SN", "contract_quantity": 403123.0, "plan_start_quantity": 0.0, "complete_quantity": 71441.0, "complete_rate": 17.72, "plan_start_date": "2024-07-11", "plan_complete_date": "2027-09-10", "actual_start_date": "2025-11-07", "actual_complete_date": null, "plan_node": [{"date": "2024-07-11", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 4429.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 16966.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 35690.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 53151.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 69257.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 81561.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 92693.0, "is_audit": false}, {"date": "2025-11-10", "quantity": 103435.0, "is_audit": false}, {"date": "2027-09-10", "quantity": 403123.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 170, "statistic_date": "2025-11-07"} +{"_id": "df971b61-9d14-400a-98f2-12cfc2fbb197", "_rev": "1-d0e5672a6d4ba272f901accd8a1f8380", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "d13a7aec-9cd8-4cf6-ac21-ccd1b79bcc55", "show_name": "励磁系统采购合同(套)", "material_type": "LC", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "e524e1c2-5e17-416a-8297-2507f4dcda47", "_rev": "1-90308047bc8ece1151306a8a9c843355", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "9e112f2d-60c3-4429-9861-e6348d0d6fd4", "show_name": "发电机采购合同(台)", "material_type": "DJ", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} +{"_id": "eedec804-f388-4acb-a59a-1b6adb44ae3e", "_rev": "1-d2c32a5e8481e44f327d769cb02c8e84", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "e312644b-2e3e-4179-8de0-0183e2c72cf4", "show_name": "低压厂用变采购合同(台)", "material_type": "DB", "contract_quantity": 0.0, "plan_start_quantity": 0.0, "complete_quantity": 0.0, "complete_rate": 0.0, "plan_start_date": null, "plan_complete_date": null, "actual_start_date": null, "actual_complete_date": null, "plan_node": [], "status": null, "sort": 0, "delay_days": null, "statistic_date": null} diff --git a/filtered_datasource/datasource/filtered/material_detail_1.jsonl b/filtered_datasource/datasource/filtered/material_detail_1.jsonl new file mode 100644 index 0000000..1fbc02d --- /dev/null +++ b/filtered_datasource/datasource/filtered/material_detail_1.jsonl @@ -0,0 +1,21 @@ +{"_id": "e996f4ef-3cff-476c-9b1b-a3d940ac24d6", "_rev": "1-74b772edd1aa6609404d1234178f99d5", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 10:24:28", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 10:24:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "date": "2025-11-03", "rate": null, "quantity": 6742.84, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "c5b0edd9-fb7c-4712-8172-841de419ad29", "_rev": "1-65d090e77ba4ca3073a08bab9d70b949", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 10:41:04", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 10:41:04", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "236c2610-f210-450a-846b-2241b2fd07f4", "date": "2025-11-08", "rate": null, "quantity": 12446.639, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "bbaf696f-d1f8-4b2b-839f-01dc2ebc0d81", "_rev": "1-b7d61215512b3c198b3f877ae4a8d3c4", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 10:49:24", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 10:49:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c1620e5c-b167-436a-874b-ab57e57254f0", "date": "2025-11-07", "rate": null, "quantity": 71441.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "b64cf277-8fb1-47e2-8582-67d8688f9eea", "_rev": "2-b67093eb835a3fb1a1430570bd49c1d3", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:05:17", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 16:29:54", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 16:29:54", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "f8efc1a4-2d2a-410a-ab99-7f06a003e848", "date": "2025-10-11", "rate": null, "quantity": 9286.52, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "900955b8-9913-41ab-bec7-4607bb44a427", "_rev": "2-22f136337b44b16ffdad6ff592e8c37f", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:05:03", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 16:55:29", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 16:55:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "6fd101a2-2047-465d-a905-455f515b9faf", "date": "2025-10-10", "rate": null, "quantity": 527261.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "4ba44092-d5bf-488f-bea4-6977dbf816b1", "_rev": "2-68525949eee43c9c325ee868ed0dd89b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:05:10", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 17:08:05", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 17:08:05", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "fb0d3b57-cf9e-406f-865c-5e1bdb071c1c", "date": "2025-10-10", "rate": null, "quantity": 65581.89, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "724391e6-984d-4a5a-b884-5bdd047adc2c", "_rev": "2-3a4663c62f6b87782f25ff71468c1537", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:04:52", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 17:25:57", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 17:25:57", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "4472248f-2ead-46d9-adca-20f0ca6a08ca", "date": "2025-10-10", "rate": null, "quantity": 69376.169, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "edfb6f6a-cdd3-44a1-a8ce-9b0c5e9e9ecf", "_rev": "2-84415a879a93195d93a18fda22bda3c4", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-15 21:18:51", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:15:21", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:15:21", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a1e41634-c82d-4b9f-9993-e1ab6c768c8d", "date": "2025-03-22", "rate": null, "quantity": 2.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "7c4df839-2ccb-4d24-b6b1-7093718d82b6", "_rev": "2-25f9df799fea78cff8021ef2ca61287b", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-04 11:05:40", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-15 21:19:18", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-15 21:19:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "a1e41634-c82d-4b9f-9993-e1ab6c768c8d", "date": "2025-06-27", "rate": null, "quantity": 4.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "622efe4b-fc6b-4324-8e9b-10438b33b171", "_rev": "1-cca22d4092b04fb3eec49be4324b178a", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 09:49:15", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 09:49:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "69b8803d-6cd3-4301-9900-03b94d9cac77", "date": "2025-09-30", "rate": null, "quantity": 6.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "15e78e52-3d06-49f0-a1b1-e75f939d2fd4", "_rev": "1-edf441724f45590a70a533e63f98d249", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 10:14:45", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 10:14:45", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "ed9cff63-3598-404c-9034-f39260764383", "date": "2025-09-30", "rate": null, "quantity": 1.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "ac3135ba-1663-4f58-97e2-a1633678c636", "_rev": "1-9503d136e38cf12745e7756ca037e8cc", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 11:19:49", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 11:19:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "590e8e7d-1239-4639-a00a-885d075db20b", "date": "2025-09-30", "rate": null, "quantity": 49.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "798c7e72-3eec-4ec9-81f5-42627c779f81", "_rev": "1-7006601c5ccf9d45db93b7638903e529", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 11:28:01", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 11:28:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "8a9dfa27-d1d1-40d6-8a67-70ef84c92250", "date": "2025-09-15", "rate": null, "quantity": 140.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "099b1241-de73-4553-a052-a00e45a34459", "_rev": "1-041bf659fed17e22b7a1f13c715ae4ea", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 11:33:15", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 11:33:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "b5913057-001a-4353-a368-4ebdd345e2b9", "date": "2025-09-15", "rate": null, "quantity": 204.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "49c7bd65-201a-4b05-b998-720a91408539", "_rev": "3-2dd259c293f99e71cf8f8ad2a10e70cf", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-12-12 11:34:05", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-12 11:34:05", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "380a630b-bf59-428a-89e3-4c5c07af8e7a", "date": "2025-05-31", "rate": null, "quantity": 2.0, "status": null, "remark": null, "is_complete": null, "change_count": 1} +{"_id": "2dae8809-3dc4-4ee4-8e56-96179e145f19", "_rev": "1-0e5458242354ac5446346981058fc450", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-08 09:53:24", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-08 09:53:24", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "4472248f-2ead-46d9-adca-20f0ca6a08ca", "date": "2025-12-10", "rate": null, "quantity": 72999.566, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "b65091fe-5475-419b-a769-f12b58ea8733", "_rev": "1-490e07b2805f8686f0deac8f3ca54d12", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-08 09:55:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-08 09:55:48", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "f8efc1a4-2d2a-410a-ab99-7f06a003e848", "date": "2025-12-10", "rate": null, "quantity": 9719.98, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "8dc40ad4-bfdf-4b78-bd84-f608fffec9ca", "_rev": "1-39f2378c103ff94831df0120ad6598b4", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-08 09:56:16", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-08 09:56:16", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "fb0d3b57-cf9e-406f-865c-5e1bdb071c1c", "date": "2025-12-10", "rate": null, "quantity": 79178.58, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "d32c9e42-b999-4eaf-aef1-a34c75ee9623", "_rev": "1-171f5bcc26119b06596060dc675c5948", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-01-08 10:11:12", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-01-08 10:11:12", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "4b5a301c-ac3a-4f72-90d9-48113d07abe3", "date": "2025-11-30", "rate": null, "quantity": 5.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "d4adab1d-8675-4ae8-9897-c7d6a9fa4cc4", "_rev": "1-2c531e4d17dd7d02d9082674d8a15135", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-02-06 10:44:12", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:44:12", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "3be5e901-13cb-40ea-90e0-99b99f5cd116", "date": "2025-12-31", "rate": null, "quantity": 9.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} +{"_id": "26a5179f-2af7-44c9-a952-f01e4bbcdf1e", "_rev": "1-13ea14fdd87ea7fc59448c20b4c62b91", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2026-02-06 10:45:02", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2026-02-06 10:45:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "parent_id": "2be180e2-98f3-47d5-8de5-86f284fc43af", "date": "2025-09-30", "rate": null, "quantity": 12.0, "status": null, "remark": null, "is_complete": null, "change_count": 0} diff --git a/filtered_datasource/datasource/filtered/personnel_1.jsonl b/filtered_datasource/datasource/filtered/personnel_1.jsonl new file mode 100644 index 0000000..48dc23a --- /dev/null +++ b/filtered_datasource/datasource/filtered/personnel_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "3e39e18e-f7de-4fd4-9fe6-f81e83820de8", "_rev": "1-55451262b899a939de3396f007f31df6", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "personnel", "code": "personnel", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "contract_id": "b4fc129a-795f-42eb-ba2a-2f2e2a0c30b7", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": null, "actual_exit_date": null, "plan_node": [], "plan_start_date": null, "plan_start_quantity": 0, "actual_start_date": null, "actual_start_quantity": null} +{"_id": "2006708a-dae4-4874-9207-22889cf2c886", "_rev": "1-a0ec39289a4ae9b30c5eb08039791dc2", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "personnel", "code": "personnel", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "b16ab690-a318-4927-a165-0f2b92759922", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": null, "actual_exit_date": null, "plan_node": [], "plan_start_date": null, "plan_start_quantity": 0, "actual_start_date": null, "actual_start_quantity": null} diff --git a/filtered_datasource/datasource/filtered/personnel_detail_1.jsonl b/filtered_datasource/datasource/filtered/personnel_detail_1.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/filtered_datasource/datasource/filtered/preparation_1.jsonl b/filtered_datasource/datasource/filtered/preparation_1.jsonl new file mode 100644 index 0000000..995ee23 --- /dev/null +++ b/filtered_datasource/datasource/filtered/preparation_1.jsonl @@ -0,0 +1,40 @@ +{"_id": "006774a3-5d58-48f6-86a8-74aabc0027ab", "_rev": "3-10d3ab8d3fb7284d37adff3bcb63a28d", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "eb314157-2d54-42ec-99b9-864f65a6aa66"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "eb314157-2d54-42ec-99b9-864f65a6aa66"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "eb314157-2d54-42ec-99b9-864f65a6aa66"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "KYPF", "name": "可研批复", "is_acquired": 1, "acquire_date": "2016-08-10", "is_exist": true} +{"_id": "0193115d-9954-44ef-bc31-6a4d6826297f", "_rev": "3-297bf320c0a4e274e94152446980d2fa", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "63264c26-9b04-4174-a59e-9d07b5b3df27"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "63264c26-9b04-4174-a59e-9d07b5b3df27"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "63264c26-9b04-4174-a59e-9d07b5b3df27"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "HSBPF", "name": "环水保“三同时”批复", "is_acquired": 1, "acquire_date": "2016-04-25", "is_exist": true} +{"_id": "042735f7-7bfa-47f3-b3b4-172c867a2c86", "_rev": "3-030f2d0e1263556aca9d71446af8ef0c", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "8d157a6e-fb45-467c-97ed-3f1f56178178"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "8d157a6e-fb45-467c-97ed-3f1f56178178"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "8d157a6e-fb45-467c-97ed-3f1f56178178"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "WSTS", "name": "无水调试", "is_acquired": 1, "acquire_date": "2025-10-30", "is_exist": true} +{"_id": "178c4484-a6ea-4382-a08a-0ac58f1f6bac", "_rev": "3-45fc07da60acddaababdcece8a5007c6", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "1e976667-25df-41a2-9605-eea6b74d6821"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "1e976667-25df-41a2-9605-eea6b74d6821"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "1e976667-25df-41a2-9605-eea6b74d6821"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "ZZDZ", "name": "转子吊装", "is_acquired": 1, "acquire_date": "2025-06-13", "is_exist": true} +{"_id": "1bd24566-c05e-496b-8139-60b0f6cba678", "_rev": "3-73d39eb555220ba09958650c1c7edf6b", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "daf9b2b8-97c4-4470-8617-0de4cb5db5c9"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "daf9b2b8-97c4-4470-8617-0de4cb5db5c9"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "daf9b2b8-97c4-4470-8617-0de4cb5db5c9"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "YDPF", "name": "用地批复", "is_acquired": 1, "acquire_date": "2020-04-01", "is_exist": true} +{"_id": "235723e5-508a-4bee-aebc-c8e68a953609", "_rev": "3-4b86774b992790d1cf4dde0bc8d225a5", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "5d5ae900-2bad-44bb-916e-575695c0ba32"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "5d5ae900-2bad-44bb-916e-575695c0ba32"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "5d5ae900-2bad-44bb-916e-575695c0ba32"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "DXCFKW", "name": "地下厂房开挖", "is_acquired": 1, "acquire_date": "2020-04-01", "is_exist": true} +{"_id": "2d200207-4eaf-4147-913e-08a10618c230", "_rev": "1-a69a5a38c186bbc619cc89eb2fcfa3cc", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "ZLJDBA", "name": "质量监督备案", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "5653da2c-a534-4df3-a748-e16f705eb793", "_rev": "3-da6160ec2f0390cd2303364e7aa7c644", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "ef2988a6-dff3-4c80-a346-380241a35991"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "ef2988a6-dff3-4c80-a346-380241a35991"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "ef2988a6-dff3-4c80-a346-380241a35991"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JL", "name": "截流", "is_acquired": 1, "acquire_date": "2019-03-30", "is_exist": true} +{"_id": "58146e7a-a3b4-4f72-a672-51146c9326ee", "_rev": "3-f15d1ee1cdab34ca2f5116a608df432b", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "8a92f41e-6aea-499a-a14f-3b5f6ab84a15"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "8a92f41e-6aea-499a-a14f-3b5f6ab84a15"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "8a92f41e-6aea-499a-a14f-3b5f6ab84a15"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JZPC", "name": "机组盘车", "is_acquired": 1, "acquire_date": "2025-07-18", "is_exist": true} +{"_id": "5a642ab1-c3d1-41d5-a1ad-271708db3b8b", "_rev": "5-0d49a78cf2f53644170c238fcc57f5a7", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "d15eaeb3-601d-44c9-b891-4604ae5910be"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "d15eaeb3-601d-44c9-b891-4604ae5910be"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "d15eaeb3-601d-44c9-b891-4604ae5910be"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "YSTS", "name": "有水调试", "is_acquired": 1, "acquire_date": "2025-12-05", "is_exist": true} +{"_id": "65dcd353-4849-4f88-9568-772a2a1f815a", "_rev": "3-fae1cb2a266ddade84e6ef4b69ede889", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "3bd21a3d-cf7b-4189-99db-71e7c6485868"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "3bd21a3d-cf7b-4189-99db-71e7c6485868"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "3bd21a3d-cf7b-4189-99db-71e7c6485868"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "TZJC", "name": "投资决策", "is_acquired": 1, "acquire_date": "2015-07-31", "is_exist": true} +{"_id": "7ccbdd34-1b1c-4e2d-8f2c-e4f1fe1e8338", "_rev": "1-68e66ab5d401802723820f5107be11dd", "field_metadata": null, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "HZBA", "name": "项目核准", "is_acquired": 1, "acquire_date": "2016-11-10", "is_exist": true} +{"_id": "8fa18aee-c77d-4780-8976-3277a91b9e2c", "_rev": "3-69e4250f2b009412074546e0cdb60191", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "d7676817-db7d-4d90-a9de-deb140831a9b"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "d7676817-db7d-4d90-a9de-deb140831a9b"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "d7676817-db7d-4d90-a9de-deb140831a9b"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "WSGAZ", "name": "尾水管安装", "is_acquired": 1, "acquire_date": "2023-10-06", "is_exist": true} +{"_id": "9086580f-764b-4b87-ae08-5b5751b7d21f", "_rev": "3-8acf6b336446ed9b12ec8c4f95a1e83d", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "0e9bb869-8ea9-4675-b88f-6bd7d986d5d9"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "0e9bb869-8ea9-4675-b88f-6bd7d986d5d9"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "0e9bb869-8ea9-4675-b88f-6bd7d986d5d9"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "DZDZ", "name": "定子吊装", "is_acquired": 1, "acquire_date": "2025-01-01", "is_exist": true} +{"_id": "96c20717-7ea4-4396-a24c-34413dc17907", "_rev": "3-a1eefe4baf51cacd4162940d0b698846", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "00134d0c-f6b1-49be-b170-8c58a8865e82"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "00134d0c-f6b1-49be-b170-8c58a8865e82"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "00134d0c-f6b1-49be-b170-8c58a8865e82"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "FDJCJM", "name": "发电机层交面", "is_acquired": 1, "acquire_date": "2024-11-30", "is_exist": true} +{"_id": "9ecab2df-25f3-4976-ad61-79fe4ad8f2c3", "_rev": "3-ec2bd330ced3a42d3da3eb811d0746ff", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "b6c9e978-839b-4c0d-912d-3071341b81ce"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "b6c9e978-839b-4c0d-912d-3071341b81ce"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "b6c9e978-839b-4c0d-912d-3071341b81ce"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JRPF", "name": "接入批复", "is_acquired": 1, "acquire_date": "2022-05-05", "is_exist": true} +{"_id": "c144a156-a040-4828-be1b-813c82aaed43", "_rev": "3-d494c5331e8642578494f7606846c875", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "d3607649-eeb6-42dc-b4c7-de0adb80e058"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "d3607649-eeb6-42dc-b4c7-de0adb80e058"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "d3607649-eeb6-42dc-b4c7-de0adb80e058"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "XXYD", "name": "先行用地批复", "is_acquired": 1, "acquire_date": "2016-05-13", "is_exist": true} +{"_id": "e181fccc-bc12-4910-8916-bf66837a50d1", "_rev": "3-3ef0a3985c89b318f7a2a6a0d77a48da", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "3e4ad619-b942-4a12-814c-5fa0aeee025d"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "3e4ad619-b942-4a12-814c-5fa0aeee025d"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "3e4ad619-b942-4a12-814c-5fa0aeee025d"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "WKAZ", "name": "蜗壳安装", "is_acquired": 1, "acquire_date": "2024-05-19", "is_exist": true} +{"_id": "e745e740-d0d7-4b2a-ba53-9a23d16707a4", "_rev": "3-6d1ecbdd2080a833e9a289c63e2bd8f7", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "d9a65f5c-3639-4901-9d3c-8faf50e950aa"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "d9a65f5c-3639-4901-9d3c-8faf50e950aa"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "d9a65f5c-3639-4901-9d3c-8faf50e950aa"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "XZXS", "name": "下闸蓄水", "is_acquired": 1, "acquire_date": "2025-10-13", "is_exist": true} +{"_id": "ecb80c08-55d1-4784-b8fb-7f56368816d9", "_rev": "3-40b93a0ed42af1c04c0a6e451ad24947", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "8402122a-b4ee-4493-91b9-60ee36bf4596"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "8402122a-b4ee-4493-91b9-60ee36bf4596"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "8402122a-b4ee-4493-91b9-60ee36bf4596"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "ZLDZ", "name": "转轮吊装", "is_acquired": 1, "acquire_date": "2025-04-25", "is_exist": true} +{"_id": "0121ace1-38d8-4be7-b6af-e197fc6a8d16", "_rev": "3-0ad99926f93322dbb88cdf862148b5da", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "e83af8ff-d4f2-484e-b178-8f8afe2b65bc"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "e83af8ff-d4f2-484e-b178-8f8afe2b65bc"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "e83af8ff-d4f2-484e-b178-8f8afe2b65bc"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "TZJC", "name": "投资决策", "is_acquired": 1, "acquire_date": "2021-07-27", "is_exist": true} +{"_id": "06866612-11ba-411d-acb7-5476b891d211", "_rev": "3-40f09c07ef8acb8d80d0dd00b5a544f0", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "3bc7400d-f488-43f9-a05d-82cecc76ec47"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "3bc7400d-f488-43f9-a05d-82cecc76ec47"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "3bc7400d-f488-43f9-a05d-82cecc76ec47"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZLJDBA", "name": "质量监督备案", "is_acquired": 1, "acquire_date": "2024-10-16", "is_exist": true} +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "_rev": "1-7700a8a38cdcaacbffce02a89d2456cd", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZLDZ", "name": "转轮吊装", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "13c6c808-66d0-4e04-ad42-2e574f26a6b2", "_rev": "1-b394dfcbb16c21dfba53c32b23691cc1", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "YSTS", "name": "有水调试", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "1cdd3f3c-aa21-417d-8f01-12f9789c9639", "_rev": "1-4a2615bda7d0a946dbd60d9544f3fbd3", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JZPC", "name": "机组盘车", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "2850ed59-12f0-4aea-85a1-83dfac693217", "_rev": "3-01330a2164140f8d0ba7712cd73d7de4", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "20e02e32-e6e2-4b24-9f9a-edc313c8c158"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "20e02e32-e6e2-4b24-9f9a-edc313c8c158"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "20e02e32-e6e2-4b24-9f9a-edc313c8c158"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JL", "name": "截流", "is_acquired": 1, "acquire_date": "2025-10-18", "is_exist": true} +{"_id": "4925d967-5e9a-4d96-8b2b-275b0a04a86d", "_rev": "1-fcd393c5d29cc67c783c0068c94480c6", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZZDZ", "name": "转子吊装", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "6548c93d-114d-4db7-b49b-6835a52d1d12", "_rev": "1-340923b4dd572af3557fcc74aa5eeb12", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "FDJCJM", "name": "发电机层交面", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "736c0863-9f41-4d7b-8678-6b389ad4c5c3", "_rev": "3-6b92ad997d458696807a4288d74dba71", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "2bfad1a1-0be2-4cf2-afe1-2c0a19066c8e"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "2bfad1a1-0be2-4cf2-afe1-2c0a19066c8e"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "2bfad1a1-0be2-4cf2-afe1-2c0a19066c8e"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "HSBPF", "name": "环水保“三同时”批复", "is_acquired": 1, "acquire_date": "2022-09-08", "is_exist": true} +{"_id": "8b46a717-20b2-4362-9987-2cf72a4a1c33", "_rev": "1-2113257f7a60a6aa46e862dd2e8a1547", "field_metadata": null, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "HZBA", "name": "项目核准", "is_acquired": 1, "acquire_date": "2023-05-24", "is_exist": true} +{"_id": "917be469-77af-467a-b024-b51e89fa0288", "_rev": "1-58e241deda4a654669c596bdd8e99d2c", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "DZDZ", "name": "定子吊装", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "a07d40ca-5b70-4af1-96c8-07e9166a9fdc", "_rev": "3-b94b6c75cadbf4618ad6681e4c89091f", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "ef95601b-e055-49b7-9c74-611d9e2b7ad4"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "ef95601b-e055-49b7-9c74-611d9e2b7ad4"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "ef95601b-e055-49b7-9c74-611d9e2b7ad4"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "XXYD", "name": "先行用地批复", "is_acquired": 1, "acquire_date": "2023-10-27", "is_exist": true} +{"_id": "a124d8ae-569f-4136-8555-bef28a0b67e8", "_rev": "3-336f00977a48906236aae16937d61f52", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "5d3251cd-8ceb-434a-8cb4-fb36dd15ccb9"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "5d3251cd-8ceb-434a-8cb4-fb36dd15ccb9"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "5d3251cd-8ceb-434a-8cb4-fb36dd15ccb9"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "KYPF", "name": "可研批复", "is_acquired": 1, "acquire_date": "2023-05-24", "is_exist": true} +{"_id": "b20db459-6503-4772-b582-6f1de4fbf7c5", "_rev": "3-e9361752d903e9151f34c08492d8cc16", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "c03de6f4-8853-4e26-a0a3-dc870776a06a"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "c03de6f4-8853-4e26-a0a3-dc870776a06a"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "c03de6f4-8853-4e26-a0a3-dc870776a06a"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "DXCFKW", "name": "地下厂房开挖", "is_acquired": 1, "acquire_date": "2025-05-13", "is_exist": true} +{"_id": "b967899b-9796-4e8a-8bb3-a42cb7d2aa5c", "_rev": "1-e9655483f43caf4479bd2c6ab68362f1", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "WSTS", "name": "无水调试", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "c11b357c-f120-469a-ac80-14d07bd597e4", "_rev": "1-99317745e9f5e12afaaf7219459c3179", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "WKAZ", "name": "蜗壳安装", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "c356b242-a3a1-4f2d-9da5-e529e59ce902", "_rev": "3-aadad5c251807da6e7bee5dc19fe5163", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "a7ff64d0-0157-4f9e-9b12-d5f2547c0420"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "a7ff64d0-0157-4f9e-9b12-d5f2547c0420"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "a7ff64d0-0157-4f9e-9b12-d5f2547c0420"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "YDPF", "name": "用地批复", "is_acquired": 1, "acquire_date": "2024-11-04", "is_exist": true} +{"_id": "f5b9e719-f8ae-4d3c-bd6b-538c1eac7458", "_rev": "3-1a73e7d641de5ac3edb86baea8fdf7c4", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "5c0bd002-066f-4935-8bdc-eb6fd1172eca"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "5c0bd002-066f-4935-8bdc-eb6fd1172eca"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "5c0bd002-066f-4935-8bdc-eb6fd1172eca"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JRPF", "name": "接入批复", "is_acquired": 1, "acquire_date": "2022-03-28", "is_exist": true} +{"_id": "f5fc7405-6d55-4503-ba86-a1ff90f29f24", "_rev": "3-9e27a56beaa8b4792d0d1680eaa207b6", "field_metadata": {"acquire_date": {"approval_status": "rejected", "approval_flow_id": "909bffa1-e505-4226-9a07-4aa1ca09aab3"}, "is_exist": {"approval_status": "rejected", "approval_flow_id": "909bffa1-e505-4226-9a07-4aa1ca09aab3"}, "is_acquired": {"approval_status": "rejected", "approval_flow_id": "909bffa1-e505-4226-9a07-4aa1ca09aab3"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "XZXS", "name": "下闸蓄水", "is_acquired": 1, "acquire_date": "2028-12-01", "is_exist": true} +{"_id": "fa54c738-626a-41f3-bb76-427ffbe1f9f2", "_rev": "5-713907db5b6a315ee651f3feb174d4f9", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "6b7236f7-78b5-44ea-8d8f-b0e1769aef43"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "6b7236f7-78b5-44ea-8d8f-b0e1769aef43"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "6b7236f7-78b5-44ea-8d8f-b0e1769aef43"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "WSGAZ", "name": "尾水管安装", "is_acquired": 1, "acquire_date": "2029-04-30", "is_exist": true} diff --git a/filtered_datasource/datasource/filtered/production_1.jsonl b/filtered_datasource/datasource/filtered/production_1.jsonl new file mode 100644 index 0000000..95f4123 --- /dev/null +++ b/filtered_datasource/datasource/filtered/production_1.jsonl @@ -0,0 +1,28 @@ +{"_id": "22af2efe-376e-4924-8286-5416f11f7e37", "_rev": "1-061859da80bcda6be9cf047a864fc0eb", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JGJS", "name": "竣工决算", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "46a41e77-62d7-46c9-bae6-4c08e1868feb", "_rev": "3-03d64f8de738a4de7d6f60ed74ddf5f7", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "8d24c1e0-34b1-41cd-be0e-557e286c499b"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "8d24c1e0-34b1-41cd-be0e-557e286c499b"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "8d24c1e0-34b1-41cd-be0e-557e286c499b"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "HJBH", "name": "环保验收", "is_acquired": 1, "acquire_date": "2025-08-22", "is_exist": true} +{"_id": "7b53b4c1-3451-4aad-8590-d184dd3a3665", "_rev": "3-f7c9625b9c098f1580ed2b479b365f34", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "2c1962c3-b8cf-4dea-bf53-b732a2284875"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "2c1962c3-b8cf-4dea-bf53-b732a2284875"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "2c1962c3-b8cf-4dea-bf53-b732a2284875"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "DAYS", "name": "工程档案验收", "is_acquired": 1, "acquire_date": "2025-12-19", "is_exist": true} +{"_id": "871a0319-83c1-4d04-a39d-0f14b639f88b", "_rev": "1-14616eb06f647f706b988ed15d87da30", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JGYS", "name": "竣工验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "928b6348-8a44-4de7-a8b7-91629dccae58", "_rev": "3-85b6df09d2382e4c450e652038a8f40c", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "f3ef2d27-e231-4bd6-9497-23e0c127a70f"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "f3ef2d27-e231-4bd6-9497-23e0c127a70f"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "f3ef2d27-e231-4bd6-9497-23e0c127a70f"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "SNGC", "name": "枢纽工程验收", "is_acquired": 1, "acquire_date": "2025-09-26", "is_exist": true} +{"_id": "9b8bb9c4-6105-4df6-95b7-96be20dac179", "_rev": "1-8aad332ace4ec95ca19cc6b30faf8c25", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "WGJS", "name": "竣工结算", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "a15bed01-9591-45fa-a1a8-66d41da7b762", "_rev": "2-0dd7f83ba1bc9c3b3346ab2d4d426846", "field_metadata": null, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "STTC", "name": "首台投产", "is_acquired": 0, "acquire_date": "2025-12-27", "is_exist": true} +{"_id": "aa828021-8a0c-478b-a514-059cc02f63df", "_rev": "1-905ec78252d38b9b39f63189f5555456", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "JGDBTC", "name": "竣工达标投产", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "afb91569-849b-43fb-8724-b6f92aedc8b0", "_rev": "3-8ccc827f3bf9ad9aedb7348b30874d55", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "3d29cca1-9e0b-484b-9dac-a76b87f30500"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "3d29cca1-9e0b-484b-9dac-a76b87f30500"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "3d29cca1-9e0b-484b-9dac-a76b87f30500"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "STBC", "name": "水保验收", "is_acquired": 1, "acquire_date": "2025-08-21", "is_exist": true} +{"_id": "b42459d1-b642-40a7-8640-5c59e5c0d131", "_rev": "3-231206f6ec13979c58df24439a9f7a10", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "48e8ed4c-4c7e-426e-95bc-1feff4da3187"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "48e8ed4c-4c7e-426e-95bc-1feff4da3187"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "48e8ed4c-4c7e-426e-95bc-1feff4da3187"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "ZDYM", "name": "征地移民安置验收", "is_acquired": 1, "acquire_date": "2025-05-23", "is_exist": true} +{"_id": "b82e653a-9746-446e-bb5c-5b10d8f5e754", "_rev": "3-9dde76a5027e54a1c823c7b8ed9897ec", "field_metadata": {"acquire_date": {"approval_status": "approved", "approval_flow_id": "3a158ce3-15f8-42ea-92dd-d0f5438aa612"}, "is_exist": {"approval_status": "approved", "approval_flow_id": "3a158ce3-15f8-42ea-92dd-d0f5438aa612"}, "is_acquired": {"approval_status": "approved", "approval_flow_id": "3a158ce3-15f8-42ea-92dd-d0f5438aa612"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "XFYS", "name": "消防验收", "is_acquired": 1, "acquire_date": "2025-12-13", "is_exist": true} +{"_id": "eb599c3a-4fcc-4adf-b566-dac2c038903a", "_rev": "1-6dd5ef3eb4479ef7c75cd51db4378eaa", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "QBTC", "name": "全部投产", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "f3db07df-823c-4e38-8cf1-35e72e1a4948", "_rev": "1-ba8a62b9738a1625ef5e1b2d66040e27", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 13:26:02", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 13:26:02", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "LAYS", "name": "劳动安全与工业卫生验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "03fbe020-0d31-4446-a13a-c46bf68f51ad", "_rev": "1-b1c2c48eadd0d2bf3da71dc734a52c06", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "QBTC", "name": "全部投产", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "_rev": "1-721e5547ab2028b6735f3e41806debf9", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JGYS", "name": "竣工验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "1994cca9-88eb-4392-8239-d188fced0c97", "_rev": "1-0b8100fd5bb91175d728ce177fe71c3b", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "HJBH", "name": "环保验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "2e979e90-dc05-40fc-8488-cf47716a34b5", "_rev": "1-f61edc8d88ee5673dcfe9229344bd7e0", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JGJS", "name": "竣工决算", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "30708ded-1c9b-4d31-9722-531bd061e4eb", "_rev": "1-5f3b6d67d9cce4454e558d0298565c91", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "LAYS", "name": "劳动安全与工业卫生验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "45a0440f-ab0f-44c5-a0ae-74134857998f", "_rev": "1-456e32fb69ca985f142bdaa1c48e3795", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "STBC", "name": "水保验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "469da2d6-7511-4cfa-b8ba-5417b370a657", "_rev": "1-ff15a799012a8429f455a589a9c169a0", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "XFYS", "name": "消防验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "8e33dcf6-0465-47dd-b9a0-e31597b87c75", "_rev": "1-f9f72d1ea6d12f5e95fc1c8dd90a5b49", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "SNGC", "name": "枢纽工程验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "9671619f-71b8-486b-9a07-a39f1f988578", "_rev": "1-d56263a60809b9ee0595f2a1a39c6410", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZDYM", "name": "征地移民安置验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "c6b70eab-ed63-4992-9c71-cb6809b93cd5", "_rev": "1-01f017f8f4c6f894d709f62f10f8db4a", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "DAYS", "name": "工程档案验收", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "decedc07-4cb4-4ab8-ac78-c718bde5abff", "_rev": "1-5171973e82e9e52a992268afa2936562", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "STTC", "name": "首台投产", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "ed50f8cc-f7b3-4f22-8d7b-8edd8cc8a416", "_rev": "1-6520e53cb906422bdc125d66a24c7e87", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JGDBTC", "name": "竣工达标投产", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "f52cf38e-13fa-42b7-99a3-d97529bf3f3a", "_rev": "1-49234a871c7a1c7b58a9d449d69fb637", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "WGJS", "name": "竣工结算", "is_acquired": 0, "acquire_date": null, "is_exist": true} +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "_rev": "1-192e1e46e24e4f46b3d987dd97e965c9", "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "CQZS", "name": "产权证书", "acquire_date": null, "is_acquired": 0, "created_at": "2025-11-18 09:18:13", "updated_at": "2025-11-18 09:18:13"} +{"_id": "b1edc83f-8a97-4da0-badf-6f867a49b111", "_rev": "1-feda423dd7e357cfcc5958304315b18a", "type": "production", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "code": "CQZS", "name": "产权证书", "acquire_date": null, "is_acquired": 0, "created_at": "2025-11-18 09:18:13", "updated_at": "2025-11-18 09:18:13"} diff --git a/filtered_datasource/datasource/filtered/project_1.jsonl b/filtered_datasource/datasource/filtered/project_1.jsonl new file mode 100644 index 0000000..798ce9c --- /dev/null +++ b/filtered_datasource/datasource/filtered/project_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "_rev": "35-b1812f698ebde74cda680226eab83156", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"approval_status": "approved", "approval_flow_id": "85c9a2a7-cd8a-4e2d-8a78-a303aec82d09", "edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "b4b5b9b7-d252-4d1a-8e45-27d3a2e49277", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "plan_production_date": {"approval_status": "approved", "approval_flow_id": "d29ac58d-1443-45c0-83db-2b28d0ef4f53"}, "plan_full_production_date": {"approval_status": "approved", "approval_flow_id": "d29ac58d-1443-45c0-83db-2b28d0ef4f53"}, "ensure_production_capacity": {"approval_status": "approved", "approval_flow_id": "84c17edb-69cc-4ff0-9577-5cb305d62b63"}, "climb_production_capacity": {"approval_status": "approved", "approval_flow_id": "e8e2cc05-1c53-480f-8707-06296564d4e4"}, "challenge_production_capacity": {"approval_status": "approved", "approval_flow_id": "7fac41d1-907d-4321-88d7-66721e9f2387"}, "implementation_estimate": {"approval_status": "under_review", "approval_flow_id": "b4b5b9b7-d252-4d1a-8e45-27d3a2e49277"}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "b4b5b9b7-d252-4d1a-8e45-27d3a2e49277"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "b4b5b9b7-d252-4d1a-8e45-27d3a2e49277"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 13:26:01", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-26 10:25:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国四川省甘孜藏族自治州白玉县", "code": "", "name": "某某水电站", "short_name": "", "region_name": ["中国", "四川省", "甘孜藏族自治州", "白玉县"], "region_path": ["100000", "510000", "513300", "513331"], "province": "510000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "夏勇", "manager_phone": "18328050943", "project_type": "hydropower", "authorization_date": "2016-11-10", "authorized_capacity": 224.0, "investment_decision_capacity": 228.5, "investment_decision_date": "2015-07-31", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 224.0, "constructing_capacity": 122.0, "dynamic_investment": 3335700.0, "complete_investment": 0.0, "ensure_production_capacity": 20, "challenge_production_capacity": 20, "climb_production_capacity": 20, "plan_production_date": "2025-12-31", "plan_full_production_date": "2026-05-31", "production_capacity": 0.0, "production_date": "", "total_production_capacity": 102.0, "actual_production_date": "2025-12-27", "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "partially_connected", "apply_file_ids": ["eb2b8b49d0b14318b1b7e9ffbccfc388"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "GB", "storage_capacity": 108000.0, "normal_storage_level": 2894.0, "regulation_performance": "NTJ", "workshop_type": "DX", "precon_start_date": "2017-06", "precon_end_date": "2019-03", "maincon_start_date": "2019-03", "maincon_end_date": "2025-12", "comm_start_date": "2025-12", "comm_end_date": "2026-12", "implementation_estimate": 2746700.0, "static_total_investment": 2565200.0, "completed_investment": 1926600.0, "total_contract_quantity": 1271.0, "completed_settlement_quantity": null, "first_actual_construction_date": "2019-03-30"} +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "某某水电站2", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/filtered_datasource/datasource/filtered/project_detail_data_1.jsonl b/filtered_datasource/datasource/filtered/project_detail_data_1.jsonl new file mode 100644 index 0000000..103bf87 --- /dev/null +++ b/filtered_datasource/datasource/filtered/project_detail_data_1.jsonl @@ -0,0 +1,8 @@ +{"_id": "9df493ae-2a57-4b80-bad4-9728e4f20afd", "_rev": "3-59745295d766dc4da7be4cc7ac805f0b", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "84c17edb-69cc-4ff0-9577-5cb305d62b63", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "84c17edb-69cc-4ff0-9577-5cb305d62b63"}, "key": {"approval_status": "approved", "approval_flow_id": "84c17edb-69cc-4ff0-9577-5cb305d62b63"}, "type": {"approval_status": "approved", "approval_flow_id": "84c17edb-69cc-4ff0-9577-5cb305d62b63"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-10 09:12:11", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-26 10:25:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "key": "ensure_production", "value": [{"year": 2025, "capacity": 51.0, "is_audit": true}, {"year": 2026, "capacity": 20, "is_audit": true}]} +{"_id": "9a58e4c5-4926-4cd5-b54a-8d78bda3c237", "_rev": "3-e239459aed74b56722488b0749f00add", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "e8e2cc05-1c53-480f-8707-06296564d4e4", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "e8e2cc05-1c53-480f-8707-06296564d4e4"}, "key": {"approval_status": "approved", "approval_flow_id": "e8e2cc05-1c53-480f-8707-06296564d4e4"}, "type": {"approval_status": "approved", "approval_flow_id": "e8e2cc05-1c53-480f-8707-06296564d4e4"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-10 09:12:16", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-26 10:25:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "key": "climb_production", "value": [{"year": 2025, "capacity": 102.0, "is_audit": true}, {"year": 2026, "capacity": 20, "is_audit": true}]} +{"_id": "c3d3bff4-6591-4b71-b4c9-fb62697ba7ec", "_rev": "3-207e7ac49468d6a628c39bb7dd9b8b5d", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "7fac41d1-907d-4321-88d7-66721e9f2387", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "7fac41d1-907d-4321-88d7-66721e9f2387"}, "key": {"approval_status": "approved", "approval_flow_id": "7fac41d1-907d-4321-88d7-66721e9f2387"}, "type": {"approval_status": "approved", "approval_flow_id": "7fac41d1-907d-4321-88d7-66721e9f2387"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-10 09:12:21", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-26 10:25:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "key": "challenge_production", "value": [{"year": 2025, "capacity": 102.0, "is_audit": true}, {"year": 2026, "capacity": 20, "is_audit": true}]} +{"_id": "90d66bbb-6934-42ca-b8f8-f6ffb226447a", "_rev": "2-c069e6a12f364c008deb4a27505ed95f", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "a1859f8e-27a7-4af7-9b30-9cf3fc3633e2", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "a1859f8e-27a7-4af7-9b30-9cf3fc3633e2"}, "key": {"approval_status": "approved", "approval_flow_id": "a1859f8e-27a7-4af7-9b30-9cf3fc3633e2"}, "type": {"approval_status": "approved", "approval_flow_id": "a1859f8e-27a7-4af7-9b30-9cf3fc3633e2"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": "2025-12-29 14:46:50", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-18 15:55:15", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-18 15:55:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "key": "actual_construction", "value": [{"year": 2019, "date": "2019-03-30", "capacity": 224.0, "is_audit": true}]} +{"_id": "990ad5c2-a083-4166-b6b0-be4ae5ca7e06", "_rev": "2-220bc59abb0e8082ff84e6c7c988eda8", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "dc8eb158-3ad0-486c-a2ef-bc47cbf3b246", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "dc8eb158-3ad0-486c-a2ef-bc47cbf3b246"}, "key": {"approval_status": "approved", "approval_flow_id": "dc8eb158-3ad0-486c-a2ef-bc47cbf3b246"}, "type": {"approval_status": "approved", "approval_flow_id": "dc8eb158-3ad0-486c-a2ef-bc47cbf3b246"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": "2025-12-29 14:46:47", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-18 15:56:10", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-11-18 15:56:10", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "key": "plan_construction", "value": [{"year": 2018, "date": "2018-11-01", "capacity": 224.0, "is_audit": true}]} +{"_id": "0b3f7e2d-9dc7-4f71-aac9-c9e7093df64f", "_rev": "1-d70398cf5d8fc88652e0c6d16b14c15b", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "value": [], "type": "project_detail_data", "approval_status": "approved", "key": "production", "created_at": "2025-11-19 13:15:44", "updated_at": "2025-11-19 13:15:44"} +{"_id": "b080f519-e313-445a-b22e-1039e41e93bb", "_rev": "3-800285f785d3b8d1ffb50ea18dfd0e59", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "value": [{"year": 2025, "date": "2025-12-27", "capacity": 51.0, "is_audit": true}, {"year": 2025, "date": "2025-12-28", "capacity": 51.0, "is_audit": true}], "type": "project_detail_data", "approval_status": "approved", "key": "production", "created_at": "2025-11-19 13:15:44", "updated_at": "2025-11-19 13:15:44"} +{"_id": "c99ae2e4-809e-47dd-8b86-61674b6a5bea", "_rev": "2-ab2b7cfb8cb68378fa5ddbf01bb5a6c1", "field_metadata": {"value": {"approval_status": "approved", "approval_flow_id": "22211c56-137a-48f4-921d-6a9f781ce74f", "edit_after_approve": true}, "project_id": {"approval_status": "approved", "approval_flow_id": "22211c56-137a-48f4-921d-6a9f781ce74f"}, "key": {"approval_status": "approved", "approval_flow_id": "22211c56-137a-48f4-921d-6a9f781ce74f"}, "type": {"approval_status": "approved", "approval_flow_id": "22211c56-137a-48f4-921d-6a9f781ce74f"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": "2025-12-09 23:04:40", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-05 17:36:01", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-05 17:36:01", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project_detail_data", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "actual_construction", "value": [{"year": 2023, "date": "2023-09-25", "capacity": 82.6, "is_audit": true}]} diff --git a/filtered_datasource/datasource/filtered/region_1.jsonl b/filtered_datasource/datasource/filtered/region_1.jsonl new file mode 100644 index 0000000..0d3881b --- /dev/null +++ b/filtered_datasource/datasource/filtered/region_1.jsonl @@ -0,0 +1,3463 @@ +{"_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "_rev": "2-74afb03afc8edaae3ecf43fdc937aac9", "type": "region", "code": "460000", "name": "海南省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8"], "path_name": ["中国", "海南省"], "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:13"} +{"_id": "a351efb9-a756-4e31-8b18-785328bb4105", "_rev": "2-2d4ab56d91c7aeab1b9acd99a7ae9569", "type": "region", "code": "100000", "name": "中国", "parent_id": "", "region_type": "country", "path": ["a351efb9-a756-4e31-8b18-785328bb4105"], "path_name": ["中国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:13"} +{"_id": "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8", "_rev": "2-1a06b959850ed44652f8998562a37063", "type": "region", "code": "460300", "name": "三沙市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8"], "path_name": ["中国", "海南省", "三沙市"], "status": "active", "sort": 3, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:13"} +{"_id": "0dcee196-9d2c-422f-8c3d-91fb34ddefaa", "_rev": "2-ffd79e330df244e125c02eee52db74fd", "type": "region", "code": "152202", "name": "阿尔山市", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "0dcee196-9d2c-422f-8c3d-91fb34ddefaa"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "阿尔山市"], "status": "active", "sort": 16, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "20717576-6c3c-4caf-8644-0b3adbaac192", "_rev": "2-087dd4e1e261f2e426bc826381a9741b", "type": "region", "code": "152900", "name": "阿拉善盟", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "20717576-6c3c-4caf-8644-0b3adbaac192"], "path_name": ["中国", "内蒙古自治区", "阿拉善盟"], "status": "active", "sort": 30, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "_rev": "2-6b90fcdcdb4604a64c246a5c663f3cb7", "type": "region", "code": "230000", "name": "黑龙江省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3"], "path_name": ["中国", "黑龙江省"], "status": "active", "sort": 12, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "35980181-0d3d-4c2f-bc0a-a2a80df61644", "_rev": "2-f7cb065b6cdb914b7d073fb138dd2bbb", "type": "region", "code": "152922", "name": "阿拉善右旗", "parent_id": "20717576-6c3c-4caf-8644-0b3adbaac192", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "20717576-6c3c-4caf-8644-0b3adbaac192", "35980181-0d3d-4c2f-bc0a-a2a80df61644"], "path_name": ["中国", "内蒙古自治区", "阿拉善盟", "阿拉善右旗"], "status": "active", "sort": 31, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "3feaba14-680b-4871-b438-69223175ab0b", "_rev": "2-3d114a2220b88ca919067f36ee38e1c9", "type": "region", "code": "152921", "name": "阿拉善左旗", "parent_id": "20717576-6c3c-4caf-8644-0b3adbaac192", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "20717576-6c3c-4caf-8644-0b3adbaac192", "3feaba14-680b-4871-b438-69223175ab0b"], "path_name": ["中国", "内蒙古自治区", "阿拉善盟", "阿拉善左旗"], "status": "active", "sort": 32, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "_rev": "2-552edad9345905a84cd49e8f401723b5", "type": "region", "code": "152500", "name": "锡林郭勒盟", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟"], "status": "active", "sort": 7, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "4383bb6f-394c-4d77-9b95-142d13b4317d", "_rev": "2-c58b4a0921c36ba0f383ad83907e3d42", "type": "region", "code": "653022", "name": "阿克陶县", "parent_id": "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "4383bb6f-394c-4d77-9b95-142d13b4317d"], "path_name": ["中国", "新疆维吾尔自治区", "克孜勒苏柯尔克孜自治州", "阿克陶县"], "status": "active", "sort": 25, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "47a18671-a828-4b12-8f93-d835d77c658f", "_rev": "2-b972a79c333384b04bcd0bdbf75dd7ba", "type": "region", "code": "152200", "name": "兴安盟", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f"], "path_name": ["中国", "内蒙古自治区", "兴安盟"], "status": "active", "sort": 15, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "_rev": "2-6a900c45c33ffb591fd7d93595ca0306", "type": "region", "code": "620900", "name": "酒泉市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3"], "path_name": ["中国", "甘肃省", "酒泉市"], "status": "active", "sort": 21, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "5792388b-f257-4cfe-ab23-5325ead222d0", "_rev": "2-4bdbb1e4696a7e345c3ef609af0315b6", "type": "region", "code": "650000", "name": "直辖", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5792388b-f257-4cfe-ab23-5325ead222d0"], "path_name": ["中国", "新疆维吾尔自治区", "直辖"], "status": "active", "sort": 26, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "5be5348e-43b3-4229-bdc4-060d92ccc29b", "_rev": "2-3c62545d616ea0747274c49941fcf3e8", "type": "region", "code": "230112", "name": "阿城区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "5be5348e-43b3-4229-bdc4-060d92ccc29b"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "阿城区"], "status": "active", "sort": 14, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "_rev": "2-ed2b8223d546de7aebfa514b4995278c", "type": "region", "code": "620000", "name": "甘肃省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e"], "path_name": ["中国", "甘肃省"], "status": "active", "sort": 20, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "_rev": "2-d760666cb340afb7c7558317ac49ec5a", "type": "region", "code": "653000", "name": "克孜勒苏柯尔克孜自治州", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff"], "path_name": ["中国", "新疆维吾尔自治区", "克孜勒苏柯尔克孜自治州"], "status": "active", "sort": 18, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "686a79ea-0730-4e8d-a836-ff7a54d729f4", "_rev": "2-ba60fd7b8f7c141ca8cc7778f9c1bbfa", "type": "region", "code": "659002", "name": "阿拉尔市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "686a79ea-0730-4e8d-a836-ff7a54d729f4"], "path_name": ["中国", "新疆维吾尔自治区", "阿拉尔市"], "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "71cb809d-e9bc-4fef-8af7-3d59d35daa4d", "_rev": "2-044ac33caaf033ddcb7c024dc8e524c6", "type": "region", "code": "513231", "name": "阿坝县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "71cb809d-e9bc-4fef-8af7-3d59d35daa4d"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "阿坝县"], "status": "active", "sort": 11, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "893ce652-a1da-4b63-ac88-7c0482128e77", "_rev": "2-ae21c27afea2ac6180da4ede59ad2d95", "type": "region", "code": "652702", "name": "阿拉山口市", "parent_id": "e64d86ab-5882-486d-9aff-e40ebc901640", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "e64d86ab-5882-486d-9aff-e40ebc901640", "893ce652-a1da-4b63-ac88-7c0482128e77"], "path_name": ["中国", "新疆维吾尔自治区", "博尔塔拉蒙古自治州", "阿拉山口市"], "status": "active", "sort": 29, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "988e380f-579d-404e-a847-6c588f72e37d", "_rev": "2-5f6104b2bca8b61b2a310ca67ea1a968", "type": "region", "code": "653023", "name": "阿合奇县", "parent_id": "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "988e380f-579d-404e-a847-6c588f72e37d"], "path_name": ["中国", "新疆维吾尔自治区", "克孜勒苏柯尔克孜自治州", "阿合奇县"], "status": "active", "sort": 19, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "_rev": "2-6c66a1a162322d9e7fc65c7284673080", "type": "region", "code": "513200", "name": "阿坝藏族羌族自治州", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州"], "status": "active", "sort": 10, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "9d925af3-972a-425e-a9cb-c9bdb8e14934", "_rev": "2-648dd1cca94d70f0199c61ba48f80fbf", "type": "region", "code": "460301", "name": "西沙区", "parent_id": "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8", "9d925af3-972a-425e-a9cb-c9bdb8e14934"], "path_name": ["中国", "海南省", "三沙市", "西沙区"], "status": "active", "sort": 4, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "a7d1dedb-55ae-433b-8514-c582fd6e7787", "_rev": "2-1364f677eadd7f657c74d389a0d36ab8", "type": "region", "code": "652901", "name": "阿克苏市", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "a7d1dedb-55ae-433b-8514-c582fd6e7787"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "阿克苏市"], "status": "active", "sort": 24, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "b4ab83a2-77d8-4f2a-b623-dcfc8fa64416", "_rev": "2-e071bca8aff2bfbf0e9e37b0814c7769", "type": "region", "code": "620924", "name": "阿克塞哈萨克族自治县", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "b4ab83a2-77d8-4f2a-b623-dcfc8fa64416"], "path_name": ["中国", "甘肃省", "酒泉市", "阿克塞哈萨克族自治县"], "status": "active", "sort": 22, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "bb7262aa-d533-4e25-acf8-5b853c3f96f3", "_rev": "2-5f7e0d604a3dedfb20e680ea9734ebc1", "type": "region", "code": "460302", "name": "南沙区", "parent_id": "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "d988f0ea-74cd-4f25-81fb-0e4dde2cbac8", "bb7262aa-d533-4e25-acf8-5b853c3f96f3"], "path_name": ["中国", "海南省", "三沙市", "南沙区"], "status": "active", "sort": 5, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "_rev": "2-ac00d5eee9cdc42a4aaf7a76cb739047", "type": "region", "code": "652900", "name": "阿克苏地区", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区"], "status": "active", "sort": 23, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "_rev": "2-03be99eab1bf0ada1c18970def4f955e", "type": "region", "code": "510000", "name": "四川省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8"], "path_name": ["中国", "四川省"], "status": "active", "sort": 9, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "da21ce29-c262-4439-853d-a4ef4c4d29ff", "_rev": "2-11cb705df056adb7668c402eaa93f320", "type": "region", "code": "152522", "name": "阿巴嘎旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "da21ce29-c262-4439-853d-a4ef4c4d29ff"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "阿巴嘎旗"], "status": "active", "sort": 8, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "_rev": "2-bdf4aed7e5676326a25b03e4c3f3965f", "type": "region", "code": "150000", "name": "内蒙古自治区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3"], "path_name": ["中国", "内蒙古自治区"], "status": "active", "sort": 6, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "_rev": "2-de5cb72c6eef10c6adbdcb5522a0b621", "type": "region", "code": "230100", "name": "哈尔滨市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5"], "path_name": ["中国", "黑龙江省", "哈尔滨市"], "status": "active", "sort": 13, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "e64d86ab-5882-486d-9aff-e40ebc901640", "_rev": "2-299f2966f9e295cf1a0c2dbd63dc6390", "type": "region", "code": "652700", "name": "博尔塔拉蒙古自治州", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "e64d86ab-5882-486d-9aff-e40ebc901640"], "path_name": ["中国", "新疆维吾尔自治区", "博尔塔拉蒙古自治州"], "status": "active", "sort": 28, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "_rev": "2-9d562e857424b46214374e5dbc9b2d13", "type": "region", "code": "650000", "name": "新疆维吾尔自治区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff"], "path_name": ["中国", "新疆维吾尔自治区"], "status": "active", "sort": 17, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:14"} +{"_id": "0a8c9d3f-a71b-4a71-baa8-446b602d5551", "_rev": "2-11ce0569fcb0344cbe1dcba23c7b4e0d", "type": "region", "code": "150421", "name": "阿鲁科尔沁旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "0a8c9d3f-a71b-4a71-baa8-446b602d5551"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "阿鲁科尔沁旗"], "status": "active", "sort": 36, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "0f060db1-a126-46c0-88a7-400639a495a0", "_rev": "2-06f0dd44c8dcd3e2522250251028eba8", "type": "region", "code": "360800", "name": "吉安市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0"], "path_name": ["中国", "江西省", "吉安市"], "status": "active", "sort": 56, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "_rev": "2-fdc51244db4260aa434d5581048094ee", "type": "region", "code": "540600", "name": "那曲市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58"], "path_name": ["中国", "西藏自治区", "那曲市"], "status": "active", "sort": 53, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "_rev": "2-5d528a66b6cfb4c79d17b3e514155772", "type": "region", "code": "430900", "name": "益阳市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc"], "path_name": ["中国", "湖南省", "益阳市"], "status": "active", "sort": 61, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "23db4bab-c98e-41fe-8511-28aaa0bc7204", "_rev": "2-6279b887c0c20160c117af31acbddeac", "type": "region", "code": "231281", "name": "安达市", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "23db4bab-c98e-41fe-8511-28aaa0bc7204"], "path_name": ["中国", "黑龙江省", "绥化市", "安达市"], "status": "active", "sort": 49, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "_rev": "2-8f559f7492b5823a5e0880875f4c9651", "type": "region", "code": "540000", "name": "西藏自治区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506"], "path_name": ["中国", "西藏自治区"], "status": "active", "sort": 52, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "_rev": "2-ef69e6a756021f1c56d0f90ae187e68a", "type": "region", "code": "430000", "name": "湖南省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d"], "path_name": ["中国", "湖南省"], "status": "active", "sort": 60, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "_rev": "2-611e8ed767cab6944cbbb7d3e0595078", "type": "region", "code": "130600", "name": "保定市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db"], "path_name": ["中国", "河北省", "保定市"], "status": "active", "sort": 58, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "_rev": "2-3d086534dee035878d00a29ee464e5b5", "type": "region", "code": "130000", "name": "河北省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4"], "path_name": ["中国", "河北省"], "status": "active", "sort": 45, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "_rev": "2-cc831f07020487674478e20a00447f07", "type": "region", "code": "231000", "name": "牡丹江市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d"], "path_name": ["中国", "黑龙江省", "牡丹江市"], "status": "active", "sort": 43, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "4317f4d7-c212-4c68-83a9-b837cd92fdcb", "_rev": "2-4603a166c783435a9ac0db15f09dce48", "type": "region", "code": "653001", "name": "阿图什市", "parent_id": "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "4317f4d7-c212-4c68-83a9-b837cd92fdcb"], "path_name": ["中国", "新疆维吾尔自治区", "克孜勒苏柯尔克孜自治州", "阿图什市"], "status": "active", "sort": 39, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "_rev": "2-b3379652e9a518ee2b695c2d07de697d", "type": "region", "code": "150400", "name": "赤峰市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6"], "path_name": ["中国", "内蒙古自治区", "赤峰市"], "status": "active", "sort": 35, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "_rev": "2-65193d80e2fe4ca29143195d0f06b07f", "type": "region", "code": "654300", "name": "阿勒泰地区", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区"], "status": "active", "sort": 33, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "5fddc6c9-2958-4b46-9b32-d58a5be00d1e", "_rev": "2-3a83bd9833bf4aa8f8f539e53f2d97c8", "type": "region", "code": "130683", "name": "安国市", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "5fddc6c9-2958-4b46-9b32-d58a5be00d1e"], "path_name": ["中国", "河北省", "保定市", "安国市"], "status": "active", "sort": 59, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "79643e1d-4647-4a13-826f-8e56b6f877dc", "_rev": "2-0031ce77b613a60133180df48039def6", "type": "region", "code": "540624", "name": "安多县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "79643e1d-4647-4a13-826f-8e56b6f877dc"], "path_name": ["中国", "西藏自治区", "那曲市", "安多县"], "status": "active", "sort": 54, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "_rev": "2-e6683f0aafd1c3f83b2510f3abe3f14b", "type": "region", "code": "330000", "name": "浙江省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9"], "path_name": ["中国", "浙江省"], "status": "active", "sort": 63, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "86ea9bb1-2b7a-40d1-8e1f-e24311e8fba2", "_rev": "2-82e7e8487210a304ed962780884d4ef0", "type": "region", "code": "654301", "name": "阿勒泰市", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "86ea9bb1-2b7a-40d1-8e1f-e24311e8fba2"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "阿勒泰市"], "status": "active", "sort": 34, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "97607fdd-a4b4-4d39-b0dd-7af3d7b13136", "_rev": "2-ae45add9966495be874ee4da1b5a40aa", "type": "region", "code": "621102", "name": "安定区", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "97607fdd-a4b4-4d39-b0dd-7af3d7b13136"], "path_name": ["中国", "甘肃省", "定西市", "安定区"], "status": "active", "sort": 51, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "_rev": "2-07385f783ab7371eeca1dca89c5972c4", "type": "region", "code": "150700", "name": "呼伦贝尔市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市"], "status": "active", "sort": 37, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "abdb0845-20a0-47cc-9f30-a4fd4def9c25", "_rev": "2-8862dcb6544c616f15a4e253b1e51843", "type": "region", "code": "360829", "name": "安福县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "abdb0845-20a0-47cc-9f30-a4fd4def9c25"], "path_name": ["中国", "江西省", "吉安市", "安福县"], "status": "active", "sort": 57, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "adc44893-54b7-4a91-a2a5-cff792c4363b", "_rev": "2-9e959c2d1d94725f16eef184d86ea015", "type": "region", "code": "131002", "name": "安次区", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "adc44893-54b7-4a91-a2a5-cff792c4363b"], "path_name": ["中国", "河北省", "廊坊市", "安次区"], "status": "active", "sort": 47, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "_rev": "2-c83dd2333ca7132b014b5afdf6bad3c0", "type": "region", "code": "360000", "name": "江西省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79"], "path_name": ["中国", "江西省"], "status": "active", "sort": 55, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "b10d5ffe-69ce-4cd5-b53b-ce71555c426f", "_rev": "2-2731fbab4322ece1abd9fb4a46bcfe31", "type": "region", "code": "231004", "name": "爱民区", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "b10d5ffe-69ce-4cd5-b53b-ce71555c426f"], "path_name": ["中国", "黑龙江省", "牡丹江市", "爱民区"], "status": "active", "sort": 44, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "_rev": "2-aecb3c9d4409ead7747c92412c1141ed", "type": "region", "code": "231100", "name": "黑河市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67"], "path_name": ["中国", "黑龙江省", "黑河市"], "status": "active", "sort": 41, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "_rev": "2-7478026eabf91db37a491323a345f42b", "type": "region", "code": "131000", "name": "廊坊市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade"], "path_name": ["中国", "河北省", "廊坊市"], "status": "active", "sort": 46, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "c1437eaf-d200-4f69-a4ae-4990cad25199", "_rev": "2-9c4546515a19f8e532f8ff041ce4c5e6", "type": "region", "code": "430923", "name": "安化县", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "c1437eaf-d200-4f69-a4ae-4990cad25199"], "path_name": ["中国", "湖南省", "益阳市", "安化县"], "status": "active", "sort": 62, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "c2a4f807-4107-4d0d-a6b9-9dd03cfd3278", "_rev": "2-11f38c547425402c5e7b448089eec743", "type": "region", "code": "150721", "name": "阿荣旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "c2a4f807-4107-4d0d-a6b9-9dd03cfd3278"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "阿荣旗"], "status": "active", "sort": 38, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "cfac77c4-4772-4d75-b881-29b64a5f4f86", "_rev": "2-fbd2dff13b4c1b157522744a2c54fbbe", "type": "region", "code": "231102", "name": "爱辉区", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "cfac77c4-4772-4d75-b881-29b64a5f4f86"], "path_name": ["中国", "黑龙江省", "黑河市", "爱辉区"], "status": "active", "sort": 42, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "dcf2f802-e111-4346-a86a-c57d7a8f2957", "_rev": "2-a0245afebd2805c5e9476bc554a64d5e", "type": "region", "code": "652928", "name": "阿瓦提县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "dcf2f802-e111-4346-a86a-c57d7a8f2957"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "阿瓦提县"], "status": "active", "sort": 40, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "_rev": "2-f47762b5edf19108b4f8dd69686d2984", "type": "region", "code": "231200", "name": "绥化市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44"], "path_name": ["中国", "黑龙江省", "绥化市"], "status": "active", "sort": 48, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "_rev": "2-21da416836dce59293451d7bdcf59b57", "type": "region", "code": "621100", "name": "定西市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda"], "path_name": ["中国", "甘肃省", "定西市"], "status": "active", "sort": 50, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:15"} +{"_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "_rev": "2-53d9372a961e6b622ade161f61ee524a", "type": "region", "code": "330500", "name": "湖州市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2"], "path_name": ["中国", "浙江省", "湖州市"], "status": "active", "sort": 64, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "113067ad-d8cd-48e6-9b8d-7381e78e46e4", "_rev": "2-cf49f0e6c3418647667704583989ea0c", "type": "region", "code": "610603", "name": "安塞区", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "113067ad-d8cd-48e6-9b8d-7381e78e46e4"], "path_name": ["中国", "陕西省", "延安市", "安塞区"], "status": "active", "sort": 88, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "15675e2a-6664-47a1-8acd-5bf15f32fc23", "_rev": "2-1062895b0e1bbcf96d64549050b66a3e", "type": "region", "code": "131125", "name": "安平县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "15675e2a-6664-47a1-8acd-5bf15f32fc23"], "path_name": ["中国", "河北省", "衡水市", "安平县"], "status": "active", "sort": 80, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "_rev": "2-d1bb21444ed85bd7d24d07571b74b7a1", "type": "region", "code": "520000", "name": "贵州省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca"], "path_name": ["中国", "贵州省"], "status": "active", "sort": 68, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "1b982c80-c0c3-4aad-9d5b-5a82bbb6f2e4", "_rev": "2-b999008deccc3d42e994475256ba56f0", "type": "region", "code": "330523", "name": "安吉县", "parent_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "1b982c80-c0c3-4aad-9d5b-5a82bbb6f2e4"], "path_name": ["中国", "浙江省", "湖州市", "安吉县"], "status": "active", "sort": 65, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "_rev": "2-b7bf97620e86a4a32539095d6ae31041", "type": "region", "code": "420000", "name": "湖北省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f"], "path_name": ["中国", "湖北省"], "status": "active", "sort": 71, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "219c50ab-85bd-4942-ad6d-cc46ab1417f2", "_rev": "2-97c9f8f98e31a90e4aa0a23ec49d6cbe", "type": "region", "code": "510904", "name": "安居区", "parent_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "219c50ab-85bd-4942-ad6d-cc46ab1417f2"], "path_name": ["中国", "四川省", "遂宁市", "安居区"], "status": "active", "sort": 67, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "2c6e747b-8cf5-4bc4-b818-f47fa15717f2", "_rev": "2-b40b8da51ad1a0aea1277040dd684dfb", "type": "region", "code": "530181", "name": "安宁市", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "2c6e747b-8cf5-4bc4-b818-f47fa15717f2"], "path_name": ["中国", "云南省", "昆明市", "安宁市"], "status": "active", "sort": 78, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "3dcc1d21-2c6d-40c1-baf0-fb639aed3948", "_rev": "2-5c812c8ea22343302fbc7c6c2f69b02a", "type": "region", "code": "431028", "name": "安仁县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "3dcc1d21-2c6d-40c1-baf0-fb639aed3948"], "path_name": ["中国", "湖南省", "郴州市", "安仁县"], "status": "active", "sort": 85, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "3f37f13f-7897-4adb-a0d1-77ef7f247be5", "_rev": "2-6e8267374621f9640ec5595f7f260137", "type": "region", "code": "420982", "name": "安陆市", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "3f37f13f-7897-4adb-a0d1-77ef7f247be5"], "path_name": ["中国", "湖北省", "孝感市", "安陆市"], "status": "active", "sort": 73, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "_rev": "2-e913b61f1990e976a310166de090af38", "type": "region", "code": "370700", "name": "潍坊市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19"], "path_name": ["中国", "山东省", "潍坊市"], "status": "active", "sort": 82, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "_rev": "2-b8f82f46cecf52b598941b891ff75bb5", "type": "region", "code": "420900", "name": "孝感市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9"], "path_name": ["中国", "湖北省", "孝感市"], "status": "active", "sort": 72, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "_rev": "2-d8b9964b45e65b992902c19053ec821c", "type": "region", "code": "510900", "name": "遂宁市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97"], "path_name": ["中国", "四川省", "遂宁市"], "status": "active", "sort": 66, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "_rev": "2-ee3e61178563f9ea7cffb3f0937b9913", "type": "region", "code": "530100", "name": "昆明市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f"], "path_name": ["中国", "云南省", "昆明市"], "status": "active", "sort": 77, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "_rev": "2-35bb8f79596a5e850955ee96552b2bbb", "type": "region", "code": "431000", "name": "郴州市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777"], "path_name": ["中国", "湖南省", "郴州市"], "status": "active", "sort": 84, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "_rev": "2-c6f93ab63ca058fb49db5781d08ddcc1", "type": "region", "code": "620100", "name": "兰州市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d"], "path_name": ["中国", "甘肃省", "兰州市"], "status": "active", "sort": 74, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "8adce91f-2693-4256-b472-ca118c9ffb5f", "_rev": "2-b447168308124792e0de78d2955d2c3e", "type": "region", "code": "522328", "name": "安龙县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "8adce91f-2693-4256-b472-ca118c9ffb5f"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "安龙县"], "status": "active", "sort": 70, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "_rev": "2-bc6795d66f65de61ae8daae3050926f8", "type": "region", "code": "370000", "name": "山东省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90"], "path_name": ["中国", "山东省"], "status": "active", "sort": 81, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "_rev": "2-155b82b5400aea5424c6c912bd1dfeb3", "type": "region", "code": "222400", "name": "延边朝鲜族自治州", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州"], "status": "active", "sort": 90, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "_rev": "2-4cedf64a9ac8c6dd0d94bb0534e1df21", "type": "region", "code": "610600", "name": "延安市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06"], "path_name": ["中国", "陕西省", "延安市"], "status": "active", "sort": 87, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "_rev": "2-2b5d170622b332c32b1d82e8b5d682ce", "type": "region", "code": "530000", "name": "云南省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00"], "path_name": ["中国", "云南省"], "status": "active", "sort": 76, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "_rev": "2-f12b00d119f4003bccff06d17bb1b156", "type": "region", "code": "610000", "name": "陕西省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800"], "path_name": ["中国", "陕西省"], "status": "active", "sort": 86, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "bb28edb0-a53c-4fcf-b1f9-0dfb844097a3", "_rev": "2-9f3209c3478731f4dafa97a7a77a057b", "type": "region", "code": "370784", "name": "安丘市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "bb28edb0-a53c-4fcf-b1f9-0dfb844097a3"], "path_name": ["中国", "山东省", "潍坊市", "安丘市"], "status": "active", "sort": 83, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "ca893f38-867a-4d04-9f74-8f50812df862", "_rev": "2-4e0ae447166bc20b703115f3598e9cb1", "type": "region", "code": "620105", "name": "安宁区", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "ca893f38-867a-4d04-9f74-8f50812df862"], "path_name": ["中国", "甘肃省", "兰州市", "安宁区"], "status": "active", "sort": 75, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "_rev": "2-344ba90b8b297e2c0f05f1dd93c94a2e", "type": "region", "code": "220000", "name": "吉林省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa"], "path_name": ["中国", "吉林省"], "status": "active", "sort": 89, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "eff34dee-745f-4615-a074-5491d809d053", "_rev": "2-fb6b3f1dcf669ac3f3f3d0aea41ec4b3", "type": "region", "code": "522300", "name": "黔西南布依族苗族自治州", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州"], "status": "active", "sort": 69, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "_rev": "2-942092af6fa9a7647e5d55adb38fd004", "type": "region", "code": "131100", "name": "衡水市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0"], "path_name": ["中国", "河北省", "衡水市"], "status": "active", "sort": 79, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:16"} +{"_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "_rev": "2-ecdf50d8d1317f954923fd504113fafa", "type": "region", "code": "430700", "name": "常德市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1"], "path_name": ["中国", "湖南省", "常德市"], "status": "active", "sort": 95, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "_rev": "2-540a1893b5eb65d6f9aa332c7592877e", "type": "region", "code": "360300", "name": "萍乡市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79"], "path_name": ["中国", "江西省", "萍乡市"], "status": "active", "sort": 103, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "14a99014-47c7-43c2-80c4-38c1bf8d90f7", "_rev": "2-8267232a029a44a815c7e130b54ea2e6", "type": "region", "code": "360123", "name": "安义县", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "14a99014-47c7-43c2-80c4-38c1bf8d90f7"], "path_name": ["中国", "江西省", "南昌市", "安义县"], "status": "active", "sort": 102, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "1ae7584e-f762-49ac-8a29-61b2561e6ec9", "_rev": "2-ee15388314e8cc4f2b3fc572f19d6a5b", "type": "region", "code": "512021", "name": "安岳县", "parent_id": "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "1ae7584e-f762-49ac-8a29-61b2561e6ec9"], "path_name": ["中国", "四川省", "资阳市", "安岳县"], "status": "active", "sort": 108, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "1c33f6a2-54c9-4a1d-9176-bcbd6e7d642c", "_rev": "2-78c9f445a282d6640becbfc51b2fe7fd", "type": "region", "code": "360302", "name": "安源区", "parent_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "1c33f6a2-54c9-4a1d-9176-bcbd6e7d642c"], "path_name": ["中国", "江西省", "萍乡市", "安源区"], "status": "active", "sort": 104, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "_rev": "2-0b48d236267fb1f6eeead96304e9923a", "type": "region", "code": "360700", "name": "赣州市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd"], "path_name": ["中国", "江西省", "赣州市"], "status": "active", "sort": 105, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "26aa4500-84a8-48df-af02-0235e49d0b14", "_rev": "2-122769152dfa7902d1a071a2391e997e", "type": "region", "code": "510705", "name": "安州区", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "26aa4500-84a8-48df-af02-0235e49d0b14"], "path_name": ["中国", "四川省", "绵阳市", "安州区"], "status": "active", "sort": 113, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "_rev": "2-a793d6319b32a9716450c04a65b7082b", "type": "region", "code": "140000", "name": "山西省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677"], "path_name": ["中国", "山西省"], "status": "active", "sort": 109, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "_rev": "2-9032d356458d7cd78f386fc0e97801ba", "type": "region", "code": "230200", "name": "齐齐哈尔市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市"], "status": "active", "sort": 114, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "3f9310c5-4b6f-469b-9218-753fd33c50e7", "_rev": "2-fb2ab67b992343a82e95fa138aab9d8c", "type": "region", "code": "141026", "name": "安泽县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "3f9310c5-4b6f-469b-9218-753fd33c50e7"], "path_name": ["中国", "山西省", "临汾市", "安泽县"], "status": "active", "sort": 111, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "41dc6357-da81-4e09-8670-18d51f6cec26", "_rev": "2-114e892c55f80d2c9af2878fd2762c40", "type": "region", "code": "350524", "name": "安溪县", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "41dc6357-da81-4e09-8670-18d51f6cec26"], "path_name": ["中国", "福建省", "泉州市", "安溪县"], "status": "active", "sort": 94, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "4f31dc3e-4a15-493f-baf0-44fdc567afde", "_rev": "2-8dadb2379b9fe8bf0efb8a88fdadf406", "type": "region", "code": "430721", "name": "安乡县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "4f31dc3e-4a15-493f-baf0-44fdc567afde"], "path_name": ["中国", "湖南省", "常德市", "安乡县"], "status": "active", "sort": 96, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "_rev": "2-db8a62a6ae91a32e8ae0850b11a1a41b", "type": "region", "code": "510700", "name": "绵阳市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d"], "path_name": ["中国", "四川省", "绵阳市"], "status": "active", "sort": 112, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "_rev": "2-137189c5d8278702d5aa447f61cebadd", "type": "region", "code": "350000", "name": "福建省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0"], "path_name": ["中国", "福建省"], "status": "active", "sort": 92, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "a21f5075-ff80-41c3-8606-e51efb6c6f7a", "_rev": "2-a0af31692a009cce471535d8096ed3a2", "type": "region", "code": "222426", "name": "安图县", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "a21f5075-ff80-41c3-8606-e51efb6c6f7a"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "安图县"], "status": "active", "sort": 91, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "a926041b-1c18-4599-b07c-0493279302a6", "_rev": "2-a50d1367c6d86304af1274da9aa4b763", "type": "region", "code": "410522", "name": "安阳县", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "a926041b-1c18-4599-b07c-0493279302a6"], "path_name": ["中国", "河南省", "安阳市", "安阳县"], "status": "active", "sort": 100, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "_rev": "2-b20e5a51b3420f0641f6c8aa7490e759", "type": "region", "code": "350500", "name": "泉州市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57"], "path_name": ["中国", "福建省", "泉州市"], "status": "active", "sort": 93, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "_rev": "2-b51b38ce1fe32086a8c3b2609cd4eb27", "type": "region", "code": "410000", "name": "河南省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62"], "path_name": ["中国", "河南省"], "status": "active", "sort": 98, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "_rev": "2-58fcad45d7be5a8a8b7e8c7c082fb96d", "type": "region", "code": "512000", "name": "资阳市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3"], "path_name": ["中国", "四川省", "资阳市"], "status": "active", "sort": 107, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "_rev": "2-885370a0ce450f39d3be2d143d2484f8", "type": "region", "code": "410500", "name": "安阳市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9"], "path_name": ["中国", "河南省", "安阳市"], "status": "active", "sort": 99, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "_rev": "2-6673e43a976db4af5490cee5df75a959", "type": "region", "code": "141000", "name": "临汾市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe"], "path_name": ["中国", "山西省", "临汾市"], "status": "active", "sort": 110, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "d04c42d6-263b-4c1a-bfd4-e6a1fb9c0707", "_rev": "2-7a6ff0ba731e7efc2987da62adaa24d7", "type": "region", "code": "130632", "name": "安新县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "d04c42d6-263b-4c1a-bfd4-e6a1fb9c0707"], "path_name": ["中国", "河北省", "保定市", "安新县"], "status": "active", "sort": 97, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "d29f76cc-6e75-4ec7-8334-46adf931bc23", "_rev": "2-a408ae040b0decdf54ae673d21648a34", "type": "region", "code": "360726", "name": "安远县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "d29f76cc-6e75-4ec7-8334-46adf931bc23"], "path_name": ["中国", "江西省", "赣州市", "安远县"], "status": "active", "sort": 106, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "d9c8e421-7bed-40d4-8e3c-3b492553b2c6", "_rev": "2-ddd0bb800b972c584c3fb399aeff4225", "type": "region", "code": "230205", "name": "昂昂溪区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "d9c8e421-7bed-40d4-8e3c-3b492553b2c6"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "昂昂溪区"], "status": "active", "sort": 115, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "_rev": "2-fc4e7b0ad31de6eb1efd821428c776ab", "type": "region", "code": "360100", "name": "南昌市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce"], "path_name": ["中国", "江西省", "南昌市"], "status": "active", "sort": 101, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:17"} +{"_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "_rev": "2-3d709863eb97f64277ea10163e1b2483", "type": "region", "code": "422800", "name": "恩施土家族苗族自治州", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州"], "status": "active", "sort": 132, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "0161a9a7-6145-4396-8348-30c0720f2b02", "_rev": "2-5ce10dd298643e34f4e0ab33bd2bebbc", "type": "region", "code": "340405", "name": "八公山区", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "0161a9a7-6145-4396-8348-30c0720f2b02"], "path_name": ["中国", "安徽省", "淮南市", "八公山区"], "status": "active", "sort": 127, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "_rev": "2-419c5b105a44aa9546c3df3c6fd809a5", "type": "region", "code": "500000", "name": "重庆市", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76"], "path_name": ["中国", "重庆市"], "status": "active", "sort": 140, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "232737dc-b690-4bd6-9d0e-978f98537cad", "_rev": "2-2610eb53c4a944af47d883b942e9f0bf", "type": "region", "code": "650521", "name": "巴里坤哈萨克自治县", "parent_id": "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "232737dc-b690-4bd6-9d0e-978f98537cad"], "path_name": ["中国", "新疆维吾尔自治区", "哈密市", "巴里坤哈萨克自治县"], "status": "active", "sort": 135, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "_rev": "2-efdf22e090dfba9405e96ec598d0b8d7", "type": "region", "code": "451200", "name": "河池市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b"], "path_name": ["中国", "广西壮族自治区", "河池市"], "status": "active", "sort": 138, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "2f260e65-9620-4f85-8908-e09f2c02413e", "_rev": "2-2636c7d772708b1ec0545d59fc9a8c2a", "type": "region", "code": "150422", "name": "巴林左旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "2f260e65-9620-4f85-8908-e09f2c02413e"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "巴林左旗"], "status": "active", "sort": 137, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "3d6e73f4-a4f6-4cce-b129-319847f3311f", "_rev": "2-6fcc7942500095e49456aaa998d7a93f", "type": "region", "code": "451102", "name": "八步区", "parent_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "3d6e73f4-a4f6-4cce-b129-319847f3311f"], "path_name": ["中国", "广西壮族自治区", "贺州市", "八步区"], "status": "active", "sort": 124, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "_rev": "2-30e157f9991b58a8251f5f4b81ef4f83", "type": "region", "code": "340400", "name": "淮南市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb"], "path_name": ["中国", "安徽省", "淮南市"], "status": "active", "sort": 126, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "52f4337a-534c-4f5c-8697-a8284712972a", "_rev": "2-89f2ff4a49d1f3d93aa4cdacdc5d14fc", "type": "region", "code": "451227", "name": "巴马瑶族自治县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "52f4337a-534c-4f5c-8697-a8284712972a"], "path_name": ["中国", "广西壮族自治区", "河池市", "巴马瑶族自治县"], "status": "active", "sort": 139, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "_rev": "2-41e444a078290246e18416bbab1df574", "type": "region", "code": "451100", "name": "贺州市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2"], "path_name": ["中国", "广西壮族自治区", "贺州市"], "status": "active", "sort": 123, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "_rev": "2-0fff15932bef2954e0109a20b5390223", "type": "region", "code": "540300", "name": "昌都市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875"], "path_name": ["中国", "西藏自治区", "昌都市"], "status": "active", "sort": 128, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "8950c18e-0d2a-4901-b12f-755f823ac5a2", "_rev": "2-77512b980b76029e7671ecd4ed5f5027", "type": "region", "code": "653130", "name": "巴楚县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "8950c18e-0d2a-4901-b12f-755f823ac5a2"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "巴楚县"], "status": "active", "sort": 131, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "9735150f-a183-4bbf-be7e-4155dae30905", "_rev": "2-8fdec811c928856a8c8cba40f536fd83", "type": "region", "code": "540326", "name": "八宿县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "9735150f-a183-4bbf-be7e-4155dae30905"], "path_name": ["中国", "西藏自治区", "昌都市", "八宿县"], "status": "active", "sort": 129, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "97864819-40d8-42cb-b0cd-3ec9256df59e", "_rev": "2-7b3ee6a181da0d625136168e8b88979a", "type": "region", "code": "422823", "name": "巴东县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "97864819-40d8-42cb-b0cd-3ec9256df59e"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "巴东县"], "status": "active", "sort": 133, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "_rev": "2-18d73f5ac94796c553dbaf3dd826b47f", "type": "region", "code": "540200", "name": "日喀则市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae"], "path_name": ["中国", "西藏自治区", "日喀则市"], "status": "active", "sort": 116, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "b83555d2-79f0-441b-bbe1-a79a38e35297", "_rev": "2-bb56b524c06238ec84655e3613ee4865", "type": "region", "code": "0", "name": "不统计", "parent_id": "d2852c12-9c40-45a5-8977-c976bae5df02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2852c12-9c40-45a5-8977-c976bae5df02", "b83555d2-79f0-441b-bbe1-a79a38e35297"], "path_name": ["中国", "澳门特别行政区", "不统计"], "status": "active", "sort": 121, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "bb759589-a743-4ae4-ad6a-492a7126537a", "_rev": "2-fba2a770538c337df13b51a583e86b6f", "type": "region", "code": "500000", "name": "直辖", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "bb759589-a743-4ae4-ad6a-492a7126537a"], "path_name": ["中国", "重庆市", "直辖"], "status": "active", "sort": 141, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "_rev": "2-4dcc31430afaa98249d4465b58582a70", "type": "region", "code": "450000", "name": "广西壮族自治区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9"], "path_name": ["中国", "广西壮族自治区"], "status": "active", "sort": 122, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "_rev": "2-cb325c17fbffed99f31e54551c058908", "type": "region", "code": "653100", "name": "喀什地区", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区"], "status": "active", "sort": 130, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "c8fa0723-aaf5-4431-9ce4-83ceca158dfa", "_rev": "2-8297d76cec49b6e5ba545545532476e8", "type": "region", "code": "820000", "name": "直辖", "parent_id": "d2852c12-9c40-45a5-8977-c976bae5df02", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2852c12-9c40-45a5-8977-c976bae5df02", "c8fa0723-aaf5-4431-9ce4-83ceca158dfa"], "path_name": ["中国", "澳门特别行政区", "直辖"], "status": "active", "sort": 120, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "d2852c12-9c40-45a5-8977-c976bae5df02", "_rev": "2-3cb3bc12610957ccf95a4b69ca2db417", "type": "region", "code": "820000", "name": "澳门特别行政区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2852c12-9c40-45a5-8977-c976bae5df02"], "path_name": ["中国", "澳门特别行政区"], "status": "active", "sort": 119, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "e11ea406-b8b2-4a14-8dea-e5b1a126d757", "_rev": "2-610d2ab7c5bd3199f2b5df0e225bc92a", "type": "region", "code": "540226", "name": "昂仁县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "e11ea406-b8b2-4a14-8dea-e5b1a126d757"], "path_name": ["中国", "西藏自治区", "日喀则市", "昂仁县"], "status": "active", "sort": 117, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "e5d39061-4cdb-4c8f-b861-4e8103e8c3f9", "_rev": "2-fe8492e3d7125e5efeaeba4f2e0941ff", "type": "region", "code": "500113", "name": "巴南区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e5d39061-4cdb-4c8f-b861-4e8103e8c3f9"], "path_name": ["中国", "重庆市", "巴南区"], "status": "active", "sort": 142, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "_rev": "2-ec1f11cebe07a188e760fe0e0c67b0b8", "type": "region", "code": "650500", "name": "哈密市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "ed2580dc-5d77-43c3-b2b1-e2914eb5377c"], "path_name": ["中国", "新疆维吾尔自治区", "哈密市"], "status": "active", "sort": 134, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "f9465ae8-d816-4878-96e4-1c7487cbae06", "_rev": "2-a7bf1cb751d239f44b1e30ec78cd17d7", "type": "region", "code": "150423", "name": "巴林右旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "f9465ae8-d816-4878-96e4-1c7487cbae06"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "巴林右旗"], "status": "active", "sort": 136, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "_rev": "2-f47617088daaab1fff6dd5aaff4ced0a", "type": "region", "code": "340000", "name": "安徽省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40"], "path_name": ["中国", "安徽省"], "status": "active", "sort": 125, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "fbc1e69c-0afd-48d2-a9df-678792dc06d9", "_rev": "2-8864507623d0b8f70ad586b38b30431f", "type": "region", "code": "150430", "name": "敖汉旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "fbc1e69c-0afd-48d2-a9df-678792dc06d9"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "敖汉旗"], "status": "active", "sort": 118, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:18"} +{"_id": "04c5e649-ec28-4770-99d4-bf1313f32e1f", "_rev": "2-cc2c78f636f9aac113cfe2bd58d22b2d", "type": "region", "code": "540402", "name": "巴宜区", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "04c5e649-ec28-4770-99d4-bf1313f32e1f"], "path_name": ["中国", "西藏自治区", "林芝市", "巴宜区"], "status": "active", "sort": 148, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "06f004a8-d9cf-47d5-8b48-3ea0011958b9", "_rev": "2-fd9906a33de01dd8cfebf27208ae5798", "type": "region", "code": "513335", "name": "巴塘县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "06f004a8-d9cf-47d5-8b48-3ea0011958b9"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "巴塘县"], "status": "active", "sort": 145, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "084b488a-efc8-45d0-930c-08c959647338", "_rev": "2-fb9ee4620ec8d2bed26d50f235cf5f56", "type": "region", "code": "460000", "name": "直辖", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "084b488a-efc8-45d0-930c-08c959647338"], "path_name": ["中国", "海南省", "直辖"], "status": "active", "sort": 162, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "_rev": "2-1a6746bbf09bc1f14ede282c177aca43", "type": "region", "code": "210000", "name": "辽宁省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6"], "path_name": ["中国", "辽宁省"], "status": "active", "sort": 151, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "_rev": "2-fb3bcb28a0d6cba2bee92eeccfe9ecbc", "type": "region", "code": "210800", "name": "营口市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64"], "path_name": ["中国", "辽宁省", "营口市"], "status": "active", "sort": 152, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "1f4405a7-8470-43f4-8c0a-0a2c6007f5c8", "_rev": "2-b129d55774b91ad52de44de80b57d3cd", "type": "region", "code": "230126", "name": "巴彦县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "1f4405a7-8470-43f4-8c0a-0a2c6007f5c8"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "巴彦县"], "status": "active", "sort": 146, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "3b7b4f7a-73cf-45b5-b272-a2eed1cc9e16", "_rev": "2-e99c2cbbd6c0c45a6244bcc3485f0bdb", "type": "region", "code": "540228", "name": "白朗县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "3b7b4f7a-73cf-45b5-b272-a2eed1cc9e16"], "path_name": ["中国", "西藏自治区", "日喀则市", "白朗县"], "status": "active", "sort": 161, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "3b85bba3-c753-4d67-af13-3891323347b1", "_rev": "2-63fb79fd9852c6e93b09b8411e2bec62", "type": "region", "code": "610929", "name": "白河县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "3b85bba3-c753-4d67-af13-3891323347b1"], "path_name": ["中国", "陕西省", "安康市", "白河县"], "status": "active", "sort": 158, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "_rev": "2-bcd521a463e20b76f20c6ab66e3c2f6e", "type": "region", "code": "540400", "name": "林芝市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d"], "path_name": ["中国", "西藏自治区", "林芝市"], "status": "active", "sort": 147, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "_rev": "2-025a75868c064ac55baae46bbd47608e", "type": "region", "code": "620400", "name": "白银市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c"], "path_name": ["中国", "甘肃省", "白银市"], "status": "active", "sort": 168, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "_rev": "2-029727f930acfc6e017e0c0ced4e380c", "type": "region", "code": "610900", "name": "安康市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be"], "path_name": ["中国", "陕西省", "安康市"], "status": "active", "sort": 157, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "5cc70eb3-6a0b-4670-a764-20d074b7e88b", "_rev": "2-26745a8ec898abcb0fa7652f71c6f086", "type": "region", "code": "511902", "name": "巴州区", "parent_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "5cc70eb3-6a0b-4670-a764-20d074b7e88b"], "path_name": ["中国", "四川省", "巴中市", "巴州区"], "status": "active", "sort": 150, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "_rev": "2-732aa55969ef52d6c41392e2d7f99a99", "type": "region", "code": "650200", "name": "克拉玛依市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "8f02a71e-0194-4e83-877a-dab6b0d61bb1"], "path_name": ["中国", "新疆维吾尔自治区", "克拉玛依市"], "status": "active", "sort": 159, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "93da8699-c683-41fa-9b26-dda9350174fc", "_rev": "2-da57bed1882bebd41d635f94067fdf9b", "type": "region", "code": "131081", "name": "霸州市", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "93da8699-c683-41fa-9b26-dda9350174fc"], "path_name": ["中国", "河北省", "廊坊市", "霸州市"], "status": "active", "sort": 154, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "a624d6ef-8126-4458-bc7b-b6eec62fa9c5", "_rev": "2-cbccbb34e98a22c2460296b24c06e6fb", "type": "region", "code": "210804", "name": "鲅鱼圈区", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "a624d6ef-8126-4458-bc7b-b6eec62fa9c5"], "path_name": ["中国", "辽宁省", "营口市", "鲅鱼圈区"], "status": "active", "sort": 153, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "_rev": "2-3591149f721b2ce90560658bc850d191", "type": "region", "code": "511900", "name": "巴中市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e"], "path_name": ["中国", "四川省", "巴中市"], "status": "active", "sort": 149, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "cc2dd1cf-8b1c-4bc3-8b9f-98a8a2553ed4", "_rev": "2-84155bff3b1ff166d466bd15029be038", "type": "region", "code": "540628", "name": "巴青县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "cc2dd1cf-8b1c-4bc3-8b9f-98a8a2553ed4"], "path_name": ["中国", "西藏自治区", "那曲市", "巴青县"], "status": "active", "sort": 143, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "e9248e90-6376-4083-9208-c93b6bb6e420", "_rev": "2-32f372a9cb4291c0ff60bb3cc85a4c7e", "type": "region", "code": "610527", "name": "白水县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "e9248e90-6376-4083-9208-c93b6bb6e420"], "path_name": ["中国", "陕西省", "渭南市", "白水县"], "status": "active", "sort": 165, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "_rev": "2-84700061ef7d030794ce59659fbb6eab", "type": "region", "code": "211000", "name": "辽阳市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1"], "path_name": ["中国", "辽宁省", "辽阳市"], "status": "active", "sort": 166, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f29f34a8-d0cd-4b7c-bf91-5590313b3238", "_rev": "2-9f959fdef428bd85d9f466708ecad319", "type": "region", "code": "469025", "name": "白沙黎族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "f29f34a8-d0cd-4b7c-bf91-5590313b3238"], "path_name": ["中国", "海南省", "白沙黎族自治县"], "status": "active", "sort": 163, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "_rev": "2-c4de45db645a52dcf5302f9b1b371ecc", "type": "region", "code": "610500", "name": "渭南市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb"], "path_name": ["中国", "陕西省", "渭南市"], "status": "active", "sort": 164, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f5f76cba-38b6-4a14-8bdc-7c8a05953e31", "_rev": "2-507d0db8deaaec44a7a3157cdd1ca236", "type": "region", "code": "211002", "name": "白塔区", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "f5f76cba-38b6-4a14-8bdc-7c8a05953e31"], "path_name": ["中国", "辽宁省", "辽阳市", "白塔区"], "status": "active", "sort": 167, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f69dc04c-99b9-4cc9-95aa-06c3a5192c0b", "_rev": "2-1dc8c8fb0de26714f6be4438244fc3e7", "type": "region", "code": "650204", "name": "白碱滩区", "parent_id": "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "f69dc04c-99b9-4cc9-95aa-06c3a5192c0b"], "path_name": ["中国", "新疆维吾尔自治区", "克拉玛依市", "白碱滩区"], "status": "active", "sort": 160, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "_rev": "2-70e0645e4b18110f7693300a91d9d2f0", "type": "region", "code": "610100", "name": "西安市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2"], "path_name": ["中国", "陕西省", "西安市"], "status": "active", "sort": 155, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "f783f193-ddf1-4669-aa35-f4af2eded431", "_rev": "2-4686b4c35bd0a237562f8d87723755eb", "type": "region", "code": "610111", "name": "灞桥区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "f783f193-ddf1-4669-aa35-f4af2eded431"], "path_name": ["中国", "陕西省", "西安市", "灞桥区"], "status": "active", "sort": 156, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "_rev": "2-0299f97ec1ea84ce3001daed8aac8f52", "type": "region", "code": "513300", "name": "甘孜藏族自治州", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8"], "path_name": ["中国", "四川省", "甘孜藏族自治州"], "status": "active", "sort": 144, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:19"} +{"_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "_rev": "2-38f4c6a7fe616855cf916b0fbbc1289a", "type": "region", "code": "120000", "name": "天津市", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a"], "path_name": ["中国", "天津市"], "status": "active", "sort": 188, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "123cc49e-9167-4283-a5be-847563c63957", "_rev": "2-1220e1256937d5b9a5bbd5e70f538941", "type": "region", "code": "513331", "name": "白玉县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "123cc49e-9167-4283-a5be-847563c63957"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "白玉县"], "status": "active", "sort": 170, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "24834f8c-672a-4a3c-bbb2-0b110afb0787", "_rev": "2-cc5ce2b52fa9ff40e477c7e7fb7c9be9", "type": "region", "code": "652926", "name": "拜城县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "24834f8c-672a-4a3c-bbb2-0b110afb0787"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "拜城县"], "status": "active", "sort": 175, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "_rev": "2-597b5c2b03efb2e81615d68cea75776b", "type": "region", "code": "440000", "name": "广东省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12"], "path_name": ["中国", "广东省"], "status": "active", "sort": 185, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "292799b3-3da9-46ef-b822-b1c9d9ae77ff", "_rev": "2-ad4ad95df22cff0212576b6508b9ad7e", "type": "region", "code": "230231", "name": "拜泉县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "292799b3-3da9-46ef-b822-b1c9d9ae77ff"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "拜泉县"], "status": "active", "sort": 176, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "32a4126e-3da2-479b-87b5-c5c71aecc824", "_rev": "2-046a0b2efe6d67b0620be6ae492a62f5", "type": "region", "code": "540627", "name": "班戈县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "32a4126e-3da2-479b-87b5-c5c71aecc824"], "path_name": ["中国", "西藏自治区", "那曲市", "班戈县"], "status": "active", "sort": 177, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "_rev": "2-9208032f0b92a09a52a7c84f1a60c90e", "type": "region", "code": "632600", "name": "果洛藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0"], "path_name": ["中国", "青海省", "果洛藏族自治州"], "status": "active", "sort": 179, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "40422e9f-d0c6-47ad-a8dc-d13f2396aa82", "_rev": "2-326b2ad46b5050314b2bcfd2c3f85402", "type": "region", "code": "340111", "name": "包河区", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "40422e9f-d0c6-47ad-a8dc-d13f2396aa82"], "path_name": ["中国", "安徽省", "合肥市", "包河区"], "status": "active", "sort": 184, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "_rev": "2-73d09fe86d2a79e4a5b56f35e48ff18f", "type": "region", "code": "630000", "name": "青海省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5"], "path_name": ["中国", "青海省"], "status": "active", "sort": 178, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "_rev": "2-2b1d1be84d37e2dd20d8891ce665a40b", "type": "region", "code": "340300", "name": "蚌埠市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd"], "path_name": ["中国", "安徽省", "蚌埠市"], "status": "active", "sort": 181, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "53f213d9-f968-4818-acac-5a2a9ec4f348", "_rev": "2-2b41fb6bd136aea420a3b32d46c0034a", "type": "region", "code": "150206", "name": "白云鄂博矿区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "53f213d9-f968-4818-acac-5a2a9ec4f348"], "path_name": ["中国", "内蒙古自治区", "包头市", "白云鄂博矿区"], "status": "active", "sort": 172, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "6a9bda02-98b0-4e10-9220-86ba035f0b49", "_rev": "2-8fae14921edf7a965ce0bdaf1e50ac25", "type": "region", "code": "230523", "name": "宝清县", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "6a9bda02-98b0-4e10-9220-86ba035f0b49"], "path_name": ["中国", "黑龙江省", "双鸭山市", "宝清县"], "status": "active", "sort": 194, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "76e8a206-e748-434b-aa37-c8c3b515e26b", "_rev": "2-bee29635ff22d6da2cd36d04ad13d05b", "type": "region", "code": "130524", "name": "柏乡县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "76e8a206-e748-434b-aa37-c8c3b515e26b"], "path_name": ["中国", "河北省", "邢台市", "柏乡县"], "status": "active", "sort": 174, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "7dedaab2-3833-4ddd-961f-a26c603e075d", "_rev": "2-cdadfb1b52c6355f0f80c9f24bde2e1f", "type": "region", "code": "120115", "name": "宝坻区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "7dedaab2-3833-4ddd-961f-a26c603e075d"], "path_name": ["中国", "天津市", "宝坻区"], "status": "active", "sort": 190, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "_rev": "2-a028e7e02d23f31c7682ee71ed608a54", "type": "region", "code": "230500", "name": "双鸭山市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710"], "path_name": ["中国", "黑龙江省", "双鸭山市"], "status": "active", "sort": 193, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "85fe1faa-c8fa-48cf-aac5-893657413d01", "_rev": "2-27750937e5f7e6a0ea3753834a04b20a", "type": "region", "code": "340303", "name": "蚌山区", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "85fe1faa-c8fa-48cf-aac5-893657413d01"], "path_name": ["中国", "安徽省", "蚌埠市", "蚌山区"], "status": "active", "sort": 182, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "981fd618-545b-49a5-801b-5c3be8e16194", "_rev": "2-ed9321d169cfee73d7c387c4307e4dd9", "type": "region", "code": "410421", "name": "宝丰县", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "981fd618-545b-49a5-801b-5c3be8e16194"], "path_name": ["中国", "河南省", "平顶山市", "宝丰县"], "status": "active", "sort": 192, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "a427c2b3-f4e0-44bb-9917-7c3412e14ede", "_rev": "2-63fc647ee0e8b447f2d511f85dd9afac", "type": "region", "code": "620402", "name": "白银区", "parent_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "a427c2b3-f4e0-44bb-9917-7c3412e14ede"], "path_name": ["中国", "甘肃省", "白银市", "白银区"], "status": "active", "sort": 169, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "_rev": "2-209177634f448f4d6741e89668ffc46a", "type": "region", "code": "340100", "name": "合肥市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260"], "path_name": ["中国", "安徽省", "合肥市"], "status": "active", "sort": 183, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "_rev": "2-9ac48b6b694055d3aa9773c372ebb3b8", "type": "region", "code": "410400", "name": "平顶山市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6"], "path_name": ["中国", "河南省", "平顶山市"], "status": "active", "sort": 191, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "_rev": "2-8904798c607d3f5f9554d529184c3c71", "type": "region", "code": "440300", "name": "深圳市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3"], "path_name": ["中国", "广东省", "深圳市"], "status": "active", "sort": 186, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "_rev": "2-e785f94c5009599573eff2ca1e51b89a", "type": "region", "code": "130500", "name": "邢台市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a"], "path_name": ["中国", "河北省", "邢台市"], "status": "active", "sort": 173, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "_rev": "2-b5830dc1269fb1b6fc8870de532e0b9a", "type": "region", "code": "150200", "name": "包头市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702"], "path_name": ["中国", "内蒙古自治区", "包头市"], "status": "active", "sort": 171, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "da0768e5-3c04-412d-bb99-df457c253da7", "_rev": "2-eb6adb1967f2e814b5ac243efc69edf2", "type": "region", "code": "120000", "name": "直辖", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "da0768e5-3c04-412d-bb99-df457c253da7"], "path_name": ["中国", "天津市", "直辖"], "status": "active", "sort": 189, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "e90a0807-f75c-41cf-8480-5fcabc364a83", "_rev": "2-10d06f5d98a48f630a8bdaf1b7552edc", "type": "region", "code": "632622", "name": "班玛县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "e90a0807-f75c-41cf-8480-5fcabc364a83"], "path_name": ["中国", "青海省", "果洛藏族自治州", "班玛县"], "status": "active", "sort": 180, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "f4fb978c-19f0-49c9-9278-f79b2a480b67", "_rev": "2-19340790a5183a1b6ae0cb004ca3b414", "type": "region", "code": "440306", "name": "宝安区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "f4fb978c-19f0-49c9-9278-f79b2a480b67"], "path_name": ["中国", "广东省", "深圳市", "宝安区"], "status": "active", "sort": 187, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:20"} +{"_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "_rev": "2-17bd8b7494ae418e908ef9b74acad2f3", "type": "region", "code": "320000", "name": "江苏省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9"], "path_name": ["中国", "江苏省"], "status": "active", "sort": 198, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "035102b8-5621-4bd2-93f7-1cf8f6a7e1ad", "_rev": "2-081953dfe8ffb5be18e87d7cb33cdb1e", "type": "region", "code": "469029", "name": "保亭黎族苗族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "035102b8-5621-4bd2-93f7-1cf8f6a7e1ad"], "path_name": ["中国", "海南省", "保亭黎族苗族自治县"], "status": "active", "sort": 207, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "_rev": "2-8321a9c713257e56d250370bcae41ad2", "type": "region", "code": "140900", "name": "忻州市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b"], "path_name": ["中国", "山西省", "忻州市"], "status": "active", "sort": 201, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "3764da3b-c2b4-4aed-9680-3b21a4bb68cd", "_rev": "2-57fd68025a9d5803f5eabe955c0089d6", "type": "region", "code": "450981", "name": "北流市", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "3764da3b-c2b4-4aed-9680-3b21a4bb68cd"], "path_name": ["中国", "广西壮族自治区", "玉林市", "北流市"], "status": "active", "sort": 219, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "4014a4a7-33e6-4d37-8162-e6a5a0f6bf96", "_rev": "2-a931e911d6928fdc0d94d3341a529be1", "type": "region", "code": "120113", "name": "北辰区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "4014a4a7-33e6-4d37-8162-e6a5a0f6bf96"], "path_name": ["中国", "天津市", "北辰区"], "status": "active", "sort": 211, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "474d3b4d-1ba4-4379-92ec-3a369a79c84c", "_rev": "2-0713fd9ed507a78f7ee15a493f645a26", "type": "region", "code": "130304", "name": "北戴河区", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "474d3b4d-1ba4-4379-92ec-3a369a79c84c"], "path_name": ["中国", "河北省", "秦皇岛市", "北戴河区"], "status": "active", "sort": 214, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "4d003745-e709-470e-86aa-146a8297d92f", "_rev": "2-77dfdcd83c1efe6b90f2315db7a8e34d", "type": "region", "code": "433125", "name": "保靖县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "4d003745-e709-470e-86aa-146a8297d92f"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "保靖县"], "status": "active", "sort": 204, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "669414b6-47ab-4376-8b15-0324c09c4279", "_rev": "2-d83e526acdd25fa0e31ff6a386b86764", "type": "region", "code": "410503", "name": "北关区", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "669414b6-47ab-4376-8b15-0324c09c4279"], "path_name": ["中国", "河南省", "安阳市", "北关区"], "status": "active", "sort": 215, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "6bad38cc-faad-4642-a921-e1cd5096be92", "_rev": "2-74a59960fac025301cc1d9fe237b5945", "type": "region", "code": "610103", "name": "碑林区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "6bad38cc-faad-4642-a921-e1cd5096be92"], "path_name": ["中国", "陕西省", "西安市", "碑林区"], "status": "active", "sort": 208, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "733210ab-951f-4725-b09e-02eec3a4c0be", "_rev": "2-a1be52b7142cf97090ec207d04a00cce", "type": "region", "code": "420626", "name": "保康县", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "733210ab-951f-4725-b09e-02eec3a4c0be"], "path_name": ["中国", "湖北省", "襄阳市", "保康县"], "status": "active", "sort": 206, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "_rev": "2-1204e0fe653c7beb41bb518be93fb7e1", "type": "region", "code": "130300", "name": "秦皇岛市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885"], "path_name": ["中国", "河北省", "秦皇岛市"], "status": "active", "sort": 213, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "_rev": "2-0c36a87347935c1b28865a5ac6740ae8", "type": "region", "code": "433100", "name": "湘西土家族苗族自治州", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州"], "status": "active", "sort": 203, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "8a67fa34-0f43-4f13-8f6a-749b830649b7", "_rev": "2-7c0c4a3c25ca84924acdd95d2fcd5862", "type": "region", "code": "510726", "name": "北川羌族自治县", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "8a67fa34-0f43-4f13-8f6a-749b830649b7"], "path_name": ["中国", "四川省", "绵阳市", "北川羌族自治县"], "status": "active", "sort": 212, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "9e71ddab-20e9-4dce-bf60-6a720e6eb256", "_rev": "2-035cd5d4ffe3fa0f00a5afc4201c40ab", "type": "region", "code": "231181", "name": "北安市", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "9e71ddab-20e9-4dce-bf60-6a720e6eb256"], "path_name": ["中国", "黑龙江省", "黑河市", "北安市"], "status": "active", "sort": 209, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "a2512ff7-0a6d-4d31-8765-9d2c189eba5e", "_rev": "2-cd0c6cbd9e200d6952689638eb2efcf0", "type": "region", "code": "610602", "name": "宝塔区", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "a2512ff7-0a6d-4d31-8765-9d2c189eba5e"], "path_name": ["中国", "陕西省", "延安市", "宝塔区"], "status": "active", "sort": 195, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "a259bf87-a4b4-494f-be49-4fbc6fbec977", "_rev": "2-bb8d1bfa5a62f2c3a06bd8bfde34f9f0", "type": "region", "code": "231202", "name": "北林区", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "a259bf87-a4b4-494f-be49-4fbc6fbec977"], "path_name": ["中国", "黑龙江省", "绥化市", "北林区"], "status": "active", "sort": 217, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "a7718be3-f983-49e5-88ec-2533b065984e", "_rev": "2-6c1eb775043129896326efeeee704146", "type": "region", "code": "321000", "name": "扬州市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e"], "path_name": ["中国", "江苏省", "扬州市"], "status": "active", "sort": 199, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "_rev": "2-3f6129784520dfdd2aff217ad5351581", "type": "region", "code": "511800", "name": "雅安市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be"], "path_name": ["中国", "四川省", "雅安市"], "status": "active", "sort": 196, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "b3761cfc-bb21-4a7b-ad23-abcb5f1e48f9", "_rev": "2-d8e1103bb58968bf6517d9a087a45f55", "type": "region", "code": "431002", "name": "北湖区", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "b3761cfc-bb21-4a7b-ad23-abcb5f1e48f9"], "path_name": ["中国", "湖南省", "郴州市", "北湖区"], "status": "active", "sort": 216, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "_rev": "2-06bef1defcffeb6447fb26dfb441f328", "type": "region", "code": "450900", "name": "玉林市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c"], "path_name": ["中国", "广西壮族自治区", "玉林市"], "status": "active", "sort": 218, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "_rev": "2-bc6113dd9ac3bc9073b823354549975b", "type": "region", "code": "420600", "name": "襄阳市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97"], "path_name": ["中国", "湖北省", "襄阳市"], "status": "active", "sort": 205, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "d7f2c756-6831-4652-9c90-a281463e5ffc", "_rev": "2-16c3a1a734f29478dbf5b85c3cd312e3", "type": "region", "code": "511827", "name": "宝兴县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "d7f2c756-6831-4652-9c90-a281463e5ffc"], "path_name": ["中国", "四川省", "雅安市", "宝兴县"], "status": "active", "sort": 197, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "e7c862f3-bc60-4122-bed3-50825b473074", "_rev": "2-6950a9c19e6a6b79055ba3195f2c5da7", "type": "region", "code": "500109", "name": "北碚区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e7c862f3-bc60-4122-bed3-50825b473074"], "path_name": ["中国", "重庆市", "北碚区"], "status": "active", "sort": 210, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "f0935dfe-b71a-4218-99fd-50ed4399856d", "_rev": "2-afc3882702eed229abbe79e0ac99f0f2", "type": "region", "code": "140931", "name": "保德县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "f0935dfe-b71a-4218-99fd-50ed4399856d"], "path_name": ["中国", "山西省", "忻州市", "保德县"], "status": "active", "sort": 202, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "fb12cfa5-6ec1-4668-b194-b853c2f26479", "_rev": "2-3dc880d3e9b09b3759cf503a759b1cec", "type": "region", "code": "321023", "name": "宝应县", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "fb12cfa5-6ec1-4668-b194-b853c2f26479"], "path_name": ["中国", "江苏省", "扬州市", "宝应县"], "status": "active", "sort": 200, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:21"} +{"_id": "0f95b73e-93dd-475f-9513-9c63b288522e", "_rev": "2-dba212b939c71048b0193bc0e208922f", "type": "region", "code": "211381", "name": "北票市", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "0f95b73e-93dd-475f-9513-9c63b288522e"], "path_name": ["中国", "辽宁省", "朝阳市", "北票市"], "status": "active", "sort": 223, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "14238921-2a13-4d59-a861-ececc4234df5", "_rev": "2-715c227bf304a0b1c7731d9817224f7e", "type": "region", "code": "210521", "name": "本溪满族自治县", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "14238921-2a13-4d59-a861-ececc4234df5"], "path_name": ["中国", "辽宁省", "本溪市", "本溪满族自治县"], "status": "active", "sort": 230, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "_rev": "2-80d99cb04d0d8e5c4eb09489da469bc8", "type": "region", "code": "210700", "name": "锦州市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89"], "path_name": ["中国", "辽宁省", "锦州市"], "status": "active", "sort": 227, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "_rev": "2-ef7f6a8f6ea4cb0c4a7ac98f008537d5", "type": "region", "code": "520600", "name": "铜仁市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471"], "path_name": ["中国", "贵州省", "铜仁市"], "status": "active", "sort": 232, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "_rev": "2-644652e9e65ca20ced09f36507d69279", "type": "region", "code": "211300", "name": "朝阳市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9"], "path_name": ["中国", "辽宁省", "朝阳市"], "status": "active", "sort": 222, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "44455b60-5533-42ab-a5f3-f50eaf22765c", "_rev": "2-a7a701cc1f3dacd03bce139c9010ff1c", "type": "region", "code": "450126", "name": "宾阳县", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "44455b60-5533-42ab-a5f3-f50eaf22765c"], "path_name": ["中国", "广西壮族自治区", "南宁市", "宾阳县"], "status": "active", "sort": 240, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "_rev": "2-7aa0dc8c5fd50ce7f16862a408342e11", "type": "region", "code": "532900", "name": "大理白族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f"], "path_name": ["中国", "云南省", "大理白族自治州"], "status": "active", "sort": 236, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "54148574-66d7-460e-b02b-30c9e41a2cae", "_rev": "2-fa53213dea0a9c3b8966af79739aad3f", "type": "region", "code": "540622", "name": "比如县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "54148574-66d7-460e-b02b-30c9e41a2cae"], "path_name": ["中国", "西藏自治区", "那曲市", "比如县"], "status": "active", "sort": 231, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "_rev": "2-f5eeea0ec0aa0b8b58af31fde93e4971", "type": "region", "code": "610400", "name": "咸阳市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c"], "path_name": ["中国", "陕西省", "咸阳市"], "status": "active", "sort": 241, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "77d0b0b5-e13e-49e1-a150-bdbba3414759", "_rev": "2-72e5cc10fd72f1349b30cda7675a4a9b", "type": "region", "code": "540330", "name": "边坝县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "77d0b0b5-e13e-49e1-a150-bdbba3414759"], "path_name": ["中国", "西藏自治区", "昌都市", "边坝县"], "status": "active", "sort": 235, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "_rev": "2-e86d6288500f654fd01fd4a1bc90df2b", "type": "region", "code": "450100", "name": "南宁市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd"], "path_name": ["中国", "广西壮族自治区", "南宁市"], "status": "active", "sort": 239, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "_rev": "2-1b738a9c15e49be28f9fbb51eeb0c61c", "type": "region", "code": "330200", "name": "宁波市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b"], "path_name": ["中国", "浙江省", "宁波市"], "status": "active", "sort": 220, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "800bbae4-fb68-4be9-b413-949e27f40797", "_rev": "2-ef47fad76ed3cee4a3706ce7b9853b0c", "type": "region", "code": "520602", "name": "碧江区", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "800bbae4-fb68-4be9-b413-949e27f40797"], "path_name": ["中国", "贵州省", "铜仁市", "碧江区"], "status": "active", "sort": 233, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "8045bc8d-74cc-4b9f-bd08-2693fb696f50", "_rev": "2-e8c0a2f236f8a69bac918040b73143dc", "type": "region", "code": "610482", "name": "彬州市", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "8045bc8d-74cc-4b9f-bd08-2693fb696f50"], "path_name": ["中国", "陕西省", "咸阳市", "彬州市"], "status": "active", "sort": 242, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "_rev": "2-f99bb8531377ffbb00043fe8a03dbe75", "type": "region", "code": "430500", "name": "邵阳市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b"], "path_name": ["中国", "湖南省", "邵阳市"], "status": "active", "sort": 224, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "a91ad32d-264d-4232-a091-719631d63da7", "_rev": "2-b26045217715a4f306fabbb852bae024", "type": "region", "code": "230125", "name": "宾县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "a91ad32d-264d-4232-a091-719631d63da7"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "宾县"], "status": "active", "sort": 238, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "cb827474-af3f-446d-aa13-bedb2b92222c", "_rev": "2-70ce5f00458071043795dee6a2cad2e2", "type": "region", "code": "500120", "name": "璧山区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "cb827474-af3f-446d-aa13-bedb2b92222c"], "path_name": ["中国", "重庆市", "璧山区"], "status": "active", "sort": 234, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "cba9a8c9-cc8a-4d32-bac6-0bd1efed85a3", "_rev": "2-6c8207c4894c99bd03e4f436f32f8137", "type": "region", "code": "210782", "name": "北镇市", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "cba9a8c9-cc8a-4d32-bac6-0bd1efed85a3"], "path_name": ["中国", "辽宁省", "锦州市", "北镇市"], "status": "active", "sort": 228, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "cd0eaa6a-4773-47be-8aee-30db21fc490c", "_rev": "2-c6c095506ef0bbb267f7f8a2afed8314", "type": "region", "code": "532924", "name": "宾川县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "cd0eaa6a-4773-47be-8aee-30db21fc490c"], "path_name": ["中国", "云南省", "大理白族自治州", "宾川县"], "status": "active", "sort": 237, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "d6c3a6d1-9f4f-4272-96ff-778ac570f131", "_rev": "2-3225b5d1caeb50247762653cb0ee9ceb", "type": "region", "code": "430511", "name": "北塔区", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "d6c3a6d1-9f4f-4272-96ff-778ac570f131"], "path_name": ["中国", "湖南省", "邵阳市", "北塔区"], "status": "active", "sort": 225, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "d9a65474-712d-4323-b17a-e6050709dc39", "_rev": "2-d201fec99b90ce7c2ba3d726201ba766", "type": "region", "code": "659005", "name": "北屯市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "d9a65474-712d-4323-b17a-e6050709dc39"], "path_name": ["中国", "新疆维吾尔自治区", "北屯市"], "status": "active", "sort": 226, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "f7f109d2-598f-4db7-890e-5812b5845a51", "_rev": "2-5aeb288c0d7d52aa06d764473e566223", "type": "region", "code": "330206", "name": "北仑区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "f7f109d2-598f-4db7-890e-5812b5845a51"], "path_name": ["中国", "浙江省", "宁波市", "北仑区"], "status": "active", "sort": 221, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "_rev": "2-6b9f292858e450e06f1d4c613bd6d3d3", "type": "region", "code": "210500", "name": "本溪市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358"], "path_name": ["中国", "辽宁省", "本溪市"], "status": "active", "sort": 229, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:22"} +{"_id": "0bfe2ce1-2c84-456c-8151-6f762c4e9d22", "_rev": "2-5d43024c47600daab721f085efb75854", "type": "region", "code": "230921", "name": "勃利县", "parent_id": "457b8969-a83b-457f-b231-06d5349d40a1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "457b8969-a83b-457f-b231-06d5349d40a1", "0bfe2ce1-2c84-456c-8151-6f762c4e9d22"], "path_name": ["中国", "黑龙江省", "七台河市", "勃利县"], "status": "active", "sort": 256, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "0cd53802-a689-4468-be74-8f6c61517b1d", "_rev": "2-28b05cc75dd8544c6eb276f74b08c3a1", "type": "region", "code": "441322", "name": "博罗县", "parent_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89", "0cd53802-a689-4468-be74-8f6c61517b1d"], "path_name": ["中国", "广东省", "惠州市", "博罗县"], "status": "active", "sort": 264, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "342d604f-86f1-46e5-8e9b-3b3975091ecf", "_rev": "2-8052bd7b9c79b7349c7a8b840955581d", "type": "region", "code": "370304", "name": "博山区", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "342d604f-86f1-46e5-8e9b-3b3975091ecf"], "path_name": ["中国", "山东省", "淄博市", "博山区"], "status": "active", "sort": 266, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "426cfe9c-4a7b-4481-a1bd-d7c9964896b4", "_rev": "2-09a552b40953d7b359d1be05a0643e6f", "type": "region", "code": "540424", "name": "波密县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "426cfe9c-4a7b-4481-a1bd-d7c9964896b4"], "path_name": ["中国", "西藏自治区", "林芝市", "波密县"], "status": "active", "sort": 252, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "_rev": "2-4b3ae7561be9931eb0df54baf47d73ff", "type": "region", "code": "441300", "name": "惠州市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89"], "path_name": ["中国", "广东省", "惠州市"], "status": "active", "sort": 263, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "457b8969-a83b-457f-b231-06d5349d40a1", "_rev": "2-250b9c95a200fc19366a1a97807d9ec8", "type": "region", "code": "230900", "name": "七台河市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "457b8969-a83b-457f-b231-06d5349d40a1"], "path_name": ["中国", "黑龙江省", "七台河市"], "status": "active", "sort": 255, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "_rev": "2-2143a0e66c4f056b126434899ddbb7b9", "type": "region", "code": "330100", "name": "杭州市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46"], "path_name": ["中国", "浙江省", "杭州市"], "status": "active", "sort": 250, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "4f9b219d-727d-4bd2-a245-97a4613fcd71", "_rev": "2-545079bf8f9f9671ad7bd7f1cc476bd5", "type": "region", "code": "520304", "name": "播州区", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "4f9b219d-727d-4bd2-a245-97a4613fcd71"], "path_name": ["中国", "贵州省", "遵义市", "播州区"], "status": "active", "sort": 254, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "_rev": "2-fa47108532bd95e1fc20d4a2010f5a2e", "type": "region", "code": "320200", "name": "无锡市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07"], "path_name": ["中国", "江苏省", "无锡市"], "status": "active", "sort": 248, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "_rev": "2-0024697cda83c4cd44721d8f336a34bc", "type": "region", "code": "320900", "name": "盐城市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9"], "path_name": ["中国", "江苏省", "盐城市"], "status": "active", "sort": 245, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "77660b85-6fbf-41ae-9cf6-267a975e72d9", "_rev": "2-f94b1ebc95e48f281b3fef6d15d11026", "type": "region", "code": "330108", "name": "滨江区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "77660b85-6fbf-41ae-9cf6-267a975e72d9"], "path_name": ["中国", "浙江省", "杭州市", "滨江区"], "status": "active", "sort": 251, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "_rev": "2-6549946dcf09cbacbc1ea6abf65bdf47", "type": "region", "code": "652800", "name": "巴音郭楞蒙古自治州", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州"], "status": "active", "sort": 260, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "83568780-fcdd-4c9e-ad86-2544d0576499", "_rev": "2-d64b51fdedb3cb73f640196a41c16326", "type": "region", "code": "450923", "name": "博白县", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "83568780-fcdd-4c9e-ad86-2544d0576499"], "path_name": ["中国", "广西壮族自治区", "玉林市", "博白县"], "status": "active", "sort": 259, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "_rev": "2-724b5709f6401f1f04662780ee560668", "type": "region", "code": "520300", "name": "遵义市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23"], "path_name": ["中国", "贵州省", "遵义市"], "status": "active", "sort": 253, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "_rev": "2-5d1456ab836862559bd20d6e2cf5ea41", "type": "region", "code": "370300", "name": "淄博市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd"], "path_name": ["中国", "山东省", "淄博市"], "status": "active", "sort": 265, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "_rev": "2-b5ae1fbec98e2e32f5f2cc4ff6a591e9", "type": "region", "code": "371600", "name": "滨州市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e"], "path_name": ["中国", "山东省", "滨州市"], "status": "active", "sort": 243, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "b165329d-58cc-47ca-ab33-c4f3f1c0f9f8", "_rev": "2-41bba99ebfae8e88e162ae62c096eae9", "type": "region", "code": "652829", "name": "博湖县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "b165329d-58cc-47ca-ab33-c4f3f1c0f9f8"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "博湖县"], "status": "active", "sort": 261, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "be5e9d4d-731a-4603-afa5-720d47d7306a", "_rev": "2-2798c91e21d39de4e85934bd3a93dec6", "type": "region", "code": "120116", "name": "滨海新区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "be5e9d4d-731a-4603-afa5-720d47d7306a"], "path_name": ["中国", "天津市", "滨海新区"], "status": "active", "sort": 247, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "d21d13a3-0440-4f99-bb15-9b6a3317a9f1", "_rev": "2-bd82b69553fb15d79686244320935f54", "type": "region", "code": "320922", "name": "滨海县", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "d21d13a3-0440-4f99-bb15-9b6a3317a9f1"], "path_name": ["中国", "江苏省", "盐城市", "滨海县"], "status": "active", "sort": 246, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "e5ab9263-5999-4d7c-84b8-8b71a9ada8da", "_rev": "2-87ffdf002462afbeffc3a3a19a5e169b", "type": "region", "code": "410822", "name": "博爱县", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "e5ab9263-5999-4d7c-84b8-8b71a9ada8da"], "path_name": ["中国", "河南省", "焦作市", "博爱县"], "status": "active", "sort": 258, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "ef731b9e-7793-4daa-ba7e-342907e841a8", "_rev": "2-dfca9f0504dac358f4cc3c3c9eba0e78", "type": "region", "code": "371602", "name": "滨城区", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "ef731b9e-7793-4daa-ba7e-342907e841a8"], "path_name": ["中国", "山东省", "滨州市", "滨城区"], "status": "active", "sort": 244, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "f29c343b-09d2-4de1-9b7e-43a4934adea4", "_rev": "2-67ce9e6a2d87b9a5cddbc5cff1fa29cc", "type": "region", "code": "652701", "name": "博乐市", "parent_id": "e64d86ab-5882-486d-9aff-e40ebc901640", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "e64d86ab-5882-486d-9aff-e40ebc901640", "f29c343b-09d2-4de1-9b7e-43a4934adea4"], "path_name": ["中国", "新疆维吾尔自治区", "博尔塔拉蒙古自治州", "博乐市"], "status": "active", "sort": 262, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "f357bb4a-08b1-42d9-9b1d-57f25018f676", "_rev": "2-811bbfbbe648da2ff39fcca607bee8f3", "type": "region", "code": "320211", "name": "滨湖区", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "f357bb4a-08b1-42d9-9b1d-57f25018f676"], "path_name": ["中国", "江苏省", "无锡市", "滨湖区"], "status": "active", "sort": 249, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "_rev": "2-dde9e493dc440fa861d6753e0bde3c5f", "type": "region", "code": "410800", "name": "焦作市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2"], "path_name": ["中国", "河南省", "焦作市"], "status": "active", "sort": 257, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:23"} +{"_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "_rev": "2-a4f9b463de73168c2c32fb516bc9b743", "type": "region", "code": "513400", "name": "凉山彝族自治州", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0"], "path_name": ["中国", "四川省", "凉山彝族自治州"], "status": "active", "sort": 272, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "1ce510f6-1fb7-47f7-975f-2b384e2b3a63", "_rev": "2-ce39ae1be1bb14658f02403bec660925", "type": "region", "code": "420114", "name": "蔡甸区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "1ce510f6-1fb7-47f7-975f-2b384e2b3a63"], "path_name": ["中国", "湖北省", "武汉市", "蔡甸区"], "status": "active", "sort": 275, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "_rev": "2-e812ade1c7efe5edc19dbe371b0dd06d", "type": "region", "code": "450400", "name": "梧州市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4"], "path_name": ["中国", "广西壮族自治区", "梧州市"], "status": "active", "sort": 280, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "2aee7560-4ea7-4498-8d07-2c7d7425b8b3", "_rev": "2-0059466e6829ff85ff7f325266035130", "type": "region", "code": "654321", "name": "布尔津县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "2aee7560-4ea7-4498-8d07-2c7d7425b8b3"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "布尔津县"], "status": "active", "sort": 271, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "2f32ccbd-dc36-4c07-bfad-762341e2fb4b", "_rev": "2-f8b62c2b7d1b02ddc08b25a7747f320d", "type": "region", "code": "510824", "name": "苍溪县", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "2f32ccbd-dc36-4c07-bfad-762341e2fb4b"], "path_name": ["中国", "四川省", "广元市", "苍溪县"], "status": "active", "sort": 283, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "327bfbff-d710-4bbf-b27a-d377faa05ebf", "_rev": "2-433f747cb1d0fdb5c7f94dfa47346932", "type": "region", "code": "371625", "name": "博兴县", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "327bfbff-d710-4bbf-b27a-d377faa05ebf"], "path_name": ["中国", "山东省", "滨州市", "博兴县"], "status": "active", "sort": 269, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "57eabf36-a88f-4e3f-8dea-4752bba115a7", "_rev": "2-cc9109412e159b09ce10a097f5ab92e2", "type": "region", "code": "530927", "name": "沧源佤族自治县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "57eabf36-a88f-4e3f-8dea-4752bba115a7"], "path_name": ["中国", "云南省", "临沧市", "沧源佤族自治县"], "status": "active", "sort": 287, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "_rev": "2-f3c8045a8f7bd71c38a8510dee40b1f9", "type": "region", "code": "530900", "name": "临沧市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7"], "path_name": ["中国", "云南省", "临沧市"], "status": "active", "sort": 286, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "_rev": "2-6ec20e0783127bbc7fb338eff54427fa", "type": "region", "code": "340500", "name": "马鞍山市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b"], "path_name": ["中国", "安徽省", "马鞍山市"], "status": "active", "sort": 267, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "7d133770-1deb-4369-b606-251d8fcceb5c", "_rev": "2-b30c52a30b06f6b2d92bf1bd8fc3450b", "type": "region", "code": "340506", "name": "博望区", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "7d133770-1deb-4369-b606-251d8fcceb5c"], "path_name": ["中国", "安徽省", "马鞍山市", "博望区"], "status": "active", "sort": 268, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "7db1dfc8-917f-4312-b318-422c7173e059", "_rev": "2-823ff14f193f05d4b6bc92edfc59e03f", "type": "region", "code": "513429", "name": "布拖县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "7db1dfc8-917f-4312-b318-422c7173e059"], "path_name": ["中国", "四川省", "凉山彝族自治州", "布拖县"], "status": "active", "sort": 273, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "93f4f0ac-751b-4c44-ac49-ee1ad978fc73", "_rev": "2-2a496060fd79a21028202ff9ed7fb8ed", "type": "region", "code": "450421", "name": "苍梧县", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "93f4f0ac-751b-4c44-ac49-ee1ad978fc73"], "path_name": ["中国", "广西壮族自治区", "梧州市", "苍梧县"], "status": "active", "sort": 281, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "9f3af643-e9a1-44f3-8ec0-3eb67edaf449", "_rev": "2-e00baa0ae1111cea321f91a23b0330a4", "type": "region", "code": "130921", "name": "沧县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "9f3af643-e9a1-44f3-8ec0-3eb67edaf449"], "path_name": ["中国", "河北省", "沧州市", "沧县"], "status": "active", "sort": 285, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "_rev": "2-daa88f5fc6782a1d0a14ac52fe4a77c7", "type": "region", "code": "420100", "name": "武汉市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e"], "path_name": ["中国", "湖北省", "武汉市"], "status": "active", "sort": 274, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "aebf9851-09c0-474b-9f9c-4d3d5b8c3f87", "_rev": "2-22d9c3f382b7cb7124beb8ad2b242cbb", "type": "region", "code": "350104", "name": "仓山区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "aebf9851-09c0-474b-9f9c-4d3d5b8c3f87"], "path_name": ["中国", "福建省", "福州市", "仓山区"], "status": "active", "sort": 277, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "_rev": "2-75459ae7f1391d1eb6cedc2757584bec", "type": "region", "code": "350100", "name": "福州市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6"], "path_name": ["中国", "福建省", "福州市"], "status": "active", "sort": 276, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "_rev": "2-81d0cef697e03d7b98ba498ce2501ecb", "type": "region", "code": "510800", "name": "广元市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91"], "path_name": ["中国", "四川省", "广元市"], "status": "active", "sort": 282, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "d58c0380-9a1e-479d-8062-64034fb36657", "_rev": "2-80ca01882d17420e934ba04f5e395a87", "type": "region", "code": "130900", "name": "沧州市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657"], "path_name": ["中国", "河北省", "沧州市"], "status": "active", "sort": 284, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "_rev": "2-60a384a0a650812ad5e51a618c6fd1fa", "type": "region", "code": "130200", "name": "唐山市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d"], "path_name": ["中国", "河北省", "唐山市"], "status": "active", "sort": 288, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "e7d671ce-58b5-4dcc-b563-2175788caae1", "_rev": "2-cf7b46a3e88455607f2643323e0f32dd", "type": "region", "code": "130637", "name": "博野县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "e7d671ce-58b5-4dcc-b563-2175788caae1"], "path_name": ["中国", "河北省", "保定市", "博野县"], "status": "active", "sort": 270, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "e8aa90ed-3ddc-41e5-8db3-8a274af1170f", "_rev": "2-1d4dace70fea16f1d8026536f3bbf5d9", "type": "region", "code": "330327", "name": "苍南县", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "e8aa90ed-3ddc-41e5-8db3-8a274af1170f"], "path_name": ["中国", "浙江省", "温州市", "苍南县"], "status": "active", "sort": 279, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "_rev": "2-871896de47f2e7775d56dde165e82247", "type": "region", "code": "330300", "name": "温州市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84"], "path_name": ["中国", "浙江省", "温州市"], "status": "active", "sort": 278, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:24"} +{"_id": "05e0e990-da37-48da-956f-ead74b82c024", "_rev": "2-6834038cbba54f2beacd0b2aad61ebd1", "type": "region", "code": "150928", "name": "察哈尔右翼后旗", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "05e0e990-da37-48da-956f-ead74b82c024"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "察哈尔右翼后旗"], "status": "active", "sort": 305, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "_rev": "2-47fc9b2a7023c0f8dbd71d041888ce22", "type": "region", "code": "360400", "name": "九江市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75"], "path_name": ["中国", "江西省", "九江市"], "status": "active", "sort": 310, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "0f82ac21-b9c7-4a0b-bd5b-3e97ad836df3", "_rev": "2-7f5735a6de7502ccf50e7c61e09bfa2c", "type": "region", "code": "421303", "name": "曾都区", "parent_id": "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "0f82ac21-b9c7-4a0b-bd5b-3e97ad836df3"], "path_name": ["中国", "湖北省", "随州市", "曾都区"], "status": "active", "sort": 299, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "102272e7-858c-444d-b249-fc548c12be6d", "_rev": "2-9c862e0ea3a3ee928399e7cc7e95308f", "type": "region", "code": "150900", "name": "乌兰察布市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市"], "status": "active", "sort": 304, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "18c35427-b4e9-4692-850d-4054c875f896", "_rev": "2-112a26779b9893f7762c50b1183df807", "type": "region", "code": "371721", "name": "曹县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "18c35427-b4e9-4692-850d-4054c875f896"], "path_name": ["中国", "山东省", "菏泽市", "曹县"], "status": "active", "sort": 291, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "1902b6cc-1674-4ca9-83ca-86af5fc408cd", "_rev": "2-36619edf5893066ca4d4d057433b5688", "type": "region", "code": "150927", "name": "察哈尔右翼中旗", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "1902b6cc-1674-4ca9-83ca-86af5fc408cd"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "察哈尔右翼中旗"], "status": "active", "sort": 307, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "21952bf7-ebb5-4b43-8837-dd222662a0ca", "_rev": "2-33553f8e09f16178adc9f30eb201335b", "type": "region", "code": "430224", "name": "茶陵县", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "21952bf7-ebb5-4b43-8837-dd222662a0ca"], "path_name": ["中国", "湖南省", "株洲市", "茶陵县"], "status": "active", "sort": 301, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "_rev": "2-c31c7e3513b0076f9bb42e3b5032e451", "type": "region", "code": "430200", "name": "株洲市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57"], "path_name": ["中国", "湖南省", "株洲市"], "status": "active", "sort": 300, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "3a164a69-8b75-4965-b48e-7ef5abd6c650", "_rev": "2-4d7e17643780483e8b741da36ea85ca9", "type": "region", "code": "522327", "name": "册亨县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "3a164a69-8b75-4965-b48e-7ef5abd6c650"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "册亨县"], "status": "active", "sort": 292, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "44dcadd8-b803-46ab-a6cd-ab8d739c5cf0", "_rev": "2-b25737b4555824ebd1bcd967668d815d", "type": "region", "code": "540325", "name": "察雅县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "44dcadd8-b803-46ab-a6cd-ab8d739c5cf0"], "path_name": ["中国", "西藏自治区", "昌都市", "察雅县"], "status": "active", "sort": 308, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "49be194f-23ad-4f8d-ae32-11693fc265c9", "_rev": "2-0dcdb26643928a0da547fb14ee28a1b1", "type": "region", "code": "540425", "name": "察隅县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "49be194f-23ad-4f8d-ae32-11693fc265c9"], "path_name": ["中国", "西藏自治区", "林芝市", "察隅县"], "status": "active", "sort": 309, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "4ffd8dff-5b7f-44c2-b805-a36a4701f185", "_rev": "2-f11ebfe7e36b80974e2079d090b9306d", "type": "region", "code": "130209", "name": "曹妃甸区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "4ffd8dff-5b7f-44c2-b805-a36a4701f185"], "path_name": ["中国", "河北省", "唐山市", "曹妃甸区"], "status": "active", "sort": 289, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "_rev": "2-2a9a6a82256407fe6ade760c28a5b3fb", "type": "region", "code": "371700", "name": "菏泽市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a"], "path_name": ["中国", "山东省", "菏泽市"], "status": "active", "sort": 290, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "5a838b25-1169-4c75-9e15-1d5878168c22", "_rev": "2-d9c5a93b7193377cdc0b21cadfca0513", "type": "region", "code": "653225", "name": "策勒县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "5a838b25-1169-4c75-9e15-1d5878168c22"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "策勒县"], "status": "active", "sort": 294, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "_rev": "2-2296d1829cf2e81ed19034cde9408442", "type": "region", "code": "653200", "name": "和田地区", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区"], "status": "active", "sort": 293, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "7c52b5c9-7335-4463-9f58-25df5a6ec3c8", "_rev": "2-bc0422237c98075cba61ac39562ca881", "type": "region", "code": "654022", "name": "察布查尔锡伯自治县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "7c52b5c9-7335-4463-9f58-25df5a6ec3c8"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "察布查尔锡伯自治县"], "status": "active", "sort": 303, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "_rev": "2-7894c49b408dc0547b83ae323da61049", "type": "region", "code": "654000", "name": "伊犁哈萨克自治州", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州"], "status": "active", "sort": 302, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "_rev": "2-5ef3e99a4ae9ae3e3b09ac699a886aef", "type": "region", "code": "421300", "name": "随州市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81"], "path_name": ["中国", "湖北省", "随州市"], "status": "active", "sort": 298, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "97cca774-d712-483a-84c6-cb20498abeb2", "_rev": "2-061659bf08639394ec848f8c4beeed2c", "type": "region", "code": "522600", "name": "黔东南苗族侗族自治州", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州"], "status": "active", "sort": 295, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "a45f6b82-0f32-4c25-adfd-e79ef39dcec7", "_rev": "2-bdbaa3799be64d20a81ab63f30b236a1", "type": "region", "code": "450481", "name": "岑溪市", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "a45f6b82-0f32-4c25-adfd-e79ef39dcec7"], "path_name": ["中国", "广西壮族自治区", "梧州市", "岑溪市"], "status": "active", "sort": 297, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "ae06fb7c-a85b-4c75-ad2a-ba6382a5442f", "_rev": "2-2e6686d3f8f071480bc26104b93e193e", "type": "region", "code": "522626", "name": "岑巩县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "ae06fb7c-a85b-4c75-ad2a-ba6382a5442f"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "岑巩县"], "status": "active", "sort": 296, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "ebf51497-d096-44df-894d-5e607fd3cb78", "_rev": "2-652d58cc013d7d008832b2dddabb105c", "type": "region", "code": "150926", "name": "察哈尔右翼前旗", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "ebf51497-d096-44df-894d-5e607fd3cb78"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "察哈尔右翼前旗"], "status": "active", "sort": 306, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:25"} +{"_id": "0a2aba55-e545-4492-81b0-ca1b38866590", "_rev": "2-a8cd7ef143386bfdc422c3aa8586c55c", "type": "region", "code": "130322", "name": "昌黎县", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "0a2aba55-e545-4492-81b0-ca1b38866590"], "path_name": ["中国", "河北省", "秦皇岛市", "昌黎县"], "status": "active", "sort": 322, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "_rev": "2-b0ca98ee66154f31098a17c67d0f02e8", "type": "region", "code": "220200", "name": "吉林市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41"], "path_name": ["中国", "吉林省", "吉林市"], "status": "active", "sort": 330, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "_rev": "2-4f728f930765a57850c27cf0ca95ec2a", "type": "region", "code": "360200", "name": "景德镇市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "19e06a8c-bc68-41b6-9f50-df50b95e8afe"], "path_name": ["中国", "江西省", "景德镇市"], "status": "active", "sort": 319, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "1be9ce71-a77c-4c35-88fe-38b2763e9ade", "_rev": "2-6770081c850f08c5b69c0644c49f3224", "type": "region", "code": "220202", "name": "昌邑区", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "1be9ce71-a77c-4c35-88fe-38b2763e9ade"], "path_name": ["中国", "吉林省", "吉林市", "昌邑区"], "status": "active", "sort": 331, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "2b73eae0-f579-4b46-9348-9a7d7ac42436", "_rev": "2-c5f11fb475d64e947172aa6f22d79d5d", "type": "region", "code": "440604", "name": "禅城区", "parent_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "2b73eae0-f579-4b46-9348-9a7d7ac42436"], "path_name": ["中国", "广东省", "佛山市", "禅城区"], "status": "active", "sort": 313, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "_rev": "2-a893fc393b59d0b1b312731a68a9ab2e", "type": "region", "code": "410300", "name": "洛阳市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82"], "path_name": ["中国", "河南省", "洛阳市"], "status": "active", "sort": 314, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "572bd53f-cbfb-416d-bc60-77c0280be846", "_rev": "2-642419cf3ac4937580bc8ce87a19805a", "type": "region", "code": "370725", "name": "昌乐县", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "572bd53f-cbfb-416d-bc60-77c0280be846"], "path_name": ["中国", "山东省", "潍坊市", "昌乐县"], "status": "active", "sort": 321, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "_rev": "2-44df358f2f8d60f2596d9afb620876ed", "type": "region", "code": "530500", "name": "保山市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2"], "path_name": ["中国", "云南省", "保山市"], "status": "active", "sort": 323, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "65ef6895-e916-4e49-84d1-bc2f7faf1210", "_rev": "2-0b0a82dae0b70a18b6a3f221f1e4565e", "type": "region", "code": "370786", "name": "昌邑市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "65ef6895-e916-4e49-84d1-bc2f7faf1210"], "path_name": ["中国", "山东省", "潍坊市", "昌邑市"], "status": "active", "sort": 332, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "746407ca-0683-4838-a24d-ce9352b7f4f3", "_rev": "2-a3da0525910245e9c7071c396b167695", "type": "region", "code": "110114", "name": "昌平区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "746407ca-0683-4838-a24d-ce9352b7f4f3"], "path_name": ["中国", "北京市", "昌平区"], "status": "active", "sort": 327, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "747dd169-afee-40fb-b603-55398f09b3aa", "_rev": "2-0fa84fa3f304fcab782417480774d476", "type": "region", "code": "360404", "name": "柴桑区", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "747dd169-afee-40fb-b603-55398f09b3aa"], "path_name": ["中国", "江西省", "九江市", "柴桑区"], "status": "active", "sort": 311, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "_rev": "2-6e04a5137859783eef7ab34717f404c2", "type": "region", "code": "110000", "name": "北京市", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519"], "path_name": ["中国", "北京市"], "status": "active", "sort": 325, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "825843a2-6d8b-41c3-85a5-c1b9801090b5", "_rev": "2-5fdbdc82b896b738705e842871d7bfc3", "type": "region", "code": "469026", "name": "昌江黎族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "825843a2-6d8b-41c3-85a5-c1b9801090b5"], "path_name": ["中国", "海南省", "昌江黎族自治县"], "status": "active", "sort": 318, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "90ea5e6e-850d-4321-9120-87f3ee3c63c9", "_rev": "2-6abe35f4abfbc6a9c2cb20c5e049ad69", "type": "region", "code": "652301", "name": "昌吉市", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "90ea5e6e-850d-4321-9120-87f3ee3c63c9"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "昌吉市"], "status": "active", "sort": 317, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "944ccd95-8c5c-48ce-b460-89c81be32e4f", "_rev": "2-40373fc49f04bd6919f743287ac525f7", "type": "region", "code": "110000", "name": "直辖", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "944ccd95-8c5c-48ce-b460-89c81be32e4f"], "path_name": ["中国", "北京市", "直辖"], "status": "active", "sort": 326, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "aefdf403-0482-4276-8638-ec8cbf8a774a", "_rev": "2-db04bb10151a32826c73444b3cb15fd6", "type": "region", "code": "211224", "name": "昌图县", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "aefdf403-0482-4276-8638-ec8cbf8a774a"], "path_name": ["中国", "辽宁省", "铁岭市", "昌图县"], "status": "active", "sort": 329, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "b39389d8-cc26-4dd8-b27e-3d605c0c344b", "_rev": "2-ab25f8e7b3dc281fe918ee6608bb5534", "type": "region", "code": "530524", "name": "昌宁县", "parent_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2", "b39389d8-cc26-4dd8-b27e-3d605c0c344b"], "path_name": ["中国", "云南省", "保山市", "昌宁县"], "status": "active", "sort": 324, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "_rev": "2-2a01c29fbf4b9ab17a68cb7317683689", "type": "region", "code": "211200", "name": "铁岭市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d"], "path_name": ["中国", "辽宁省", "铁岭市"], "status": "active", "sort": 328, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "e39ee9bb-0433-4ba5-9cea-a08673e41788", "_rev": "2-69e1a2472db603aa7098d2ac9c8d973c", "type": "region", "code": "360202", "name": "昌江区", "parent_id": "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "e39ee9bb-0433-4ba5-9cea-a08673e41788"], "path_name": ["中国", "江西省", "景德镇市", "昌江区"], "status": "active", "sort": 320, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "e7354889-787e-4617-99b6-1b410960f9aa", "_rev": "2-7e457e57c6bebb2208f9827fe3e38ff2", "type": "region", "code": "410304", "name": "瀍河回族区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "e7354889-787e-4617-99b6-1b410960f9aa"], "path_name": ["中国", "河南省", "洛阳市", "瀍河回族区"], "status": "active", "sort": 315, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "_rev": "2-e6dbb2324cb815b2acd6b63bf018073c", "type": "region", "code": "440600", "name": "佛山市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03"], "path_name": ["中国", "广东省", "佛山市"], "status": "active", "sort": 312, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "_rev": "2-02be8951059bf9af379e453b5255cbd4", "type": "region", "code": "652300", "name": "昌吉回族自治州", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州"], "status": "active", "sort": 316, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:26"} +{"_id": "081bbc5e-4ce6-48f0-b694-1c6728336ef5", "_rev": "2-8a0e30ceac213a92bc16580d6189d88b", "type": "region", "code": "150725", "name": "陈巴尔虎旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "081bbc5e-4ce6-48f0-b694-1c6728336ef5"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "陈巴尔虎旗"], "status": "active", "sort": 349, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "2a4fee16-a253-43a7-861f-08cd0cf50234", "_rev": "2-70768ff14e31c875f19c16751f28ae33", "type": "region", "code": "320581", "name": "常熟市", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "2a4fee16-a253-43a7-861f-08cd0cf50234"], "path_name": ["中国", "江苏省", "苏州市", "常熟市"], "status": "active", "sort": 338, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "4b5982d9-6df4-400e-9d71-1ba668282fd4", "_rev": "2-0ef0f5a6625762b8c7af002a16c73100", "type": "region", "code": "445103", "name": "潮安区", "parent_id": "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "4b5982d9-6df4-400e-9d71-1ba668282fd4"], "path_name": ["中国", "广东省", "潮州市", "潮安区"], "status": "active", "sort": 343, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "4beb5b2d-8f04-46fa-813e-af529354bca5", "_rev": "2-0559dc605993cdfa6ac5e0c7981f10d8", "type": "region", "code": "430482", "name": "常宁市", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "4beb5b2d-8f04-46fa-813e-af529354bca5"], "path_name": ["中国", "湖南省", "衡阳市", "常宁市"], "status": "active", "sort": 334, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "59ed7562-dbd4-4c75-8a53-ba912b47763c", "_rev": "2-88f01fceca84879f071f5560b85db608", "type": "region", "code": "610304", "name": "陈仓区", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "59ed7562-dbd4-4c75-8a53-ba912b47763c"], "path_name": ["中国", "陕西省", "宝鸡市", "陈仓区"], "status": "active", "sort": 351, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "7130200c-9ebd-4775-af04-4b6ff119376a", "_rev": "2-aef052a41dd2f6002da7e2b18d00da74", "type": "region", "code": "431223", "name": "辰溪县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "7130200c-9ebd-4775-af04-4b6ff119376a"], "path_name": ["中国", "湖南省", "怀化市", "辰溪县"], "status": "active", "sort": 348, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "_rev": "2-f3391e0bda607bba61e35c487b86414a", "type": "region", "code": "130400", "name": "邯郸市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f"], "path_name": ["中国", "河北省", "邯郸市"], "status": "active", "sort": 354, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "_rev": "2-e04ca4b2ebb51c937949931dc611fad7", "type": "region", "code": "440500", "name": "汕头市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a"], "path_name": ["中国", "广东省", "汕头市"], "status": "active", "sort": 344, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "897e699b-91dc-4e02-a61b-d2569c8007bb", "_rev": "2-7b41f7bce0a6bc6380b07921ef6e6648", "type": "region", "code": "510812", "name": "朝天区", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "897e699b-91dc-4e02-a61b-d2569c8007bb"], "path_name": ["中国", "四川省", "广元市", "朝天区"], "status": "active", "sort": 340, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "8d78dd84-fe4a-4e6b-a114-c29a0868e3b4", "_rev": "2-3533d20e0544b7f00a270dd4a09296e4", "type": "region", "code": "632723", "name": "称多县", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "8d78dd84-fe4a-4e6b-a114-c29a0868e3b4"], "path_name": ["中国", "青海省", "玉树藏族自治州", "称多县"], "status": "active", "sort": 353, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "91209b19-f992-4655-b960-123b12149c80", "_rev": "2-6ffbfd134fe48eae989ea02a7d66cac5", "type": "region", "code": "610300", "name": "宝鸡市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80"], "path_name": ["中国", "陕西省", "宝鸡市"], "status": "active", "sort": 350, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "_rev": "2-12915ad1ba006baedf2e857faed01d0a", "type": "region", "code": "632700", "name": "玉树藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423"], "path_name": ["中国", "青海省", "玉树藏族自治州"], "status": "active", "sort": 352, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "9ff8e930-76b0-4ec2-b939-b2b86a887916", "_rev": "2-f7b7a7c94897c070b482a1aceb3a1386", "type": "region", "code": "340181", "name": "巢湖市", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "9ff8e930-76b0-4ec2-b939-b2b86a887916"], "path_name": ["中国", "安徽省", "合肥市", "巢湖市"], "status": "active", "sort": 339, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "a0a33099-1562-42e1-9857-ca30a2c08bc7", "_rev": "2-f5594a1f200ae9aca92b0d570037cbd9", "type": "region", "code": "330822", "name": "常山县", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "a0a33099-1562-42e1-9857-ca30a2c08bc7"], "path_name": ["中国", "浙江省", "衢州市", "常山县"], "status": "active", "sort": 336, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "_rev": "2-b7c3d43ddcd1412984e3062dbd1ab27d", "type": "region", "code": "445100", "name": "潮州市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a2e932e2-929d-4906-8e1b-4eaefdafbd60"], "path_name": ["中国", "广东省", "潮州市"], "status": "active", "sort": 342, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "c4f10f77-6439-4fed-a07e-71750547f973", "_rev": "2-72d3d440fbc8f9810a34879658c77a15", "type": "region", "code": "330800", "name": "衢州市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973"], "path_name": ["中国", "浙江省", "衢州市"], "status": "active", "sort": 335, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "c613d706-3747-4bc2-ac12-da13776335a5", "_rev": "2-bdbbc5231027562b958f43a53dcf78a8", "type": "region", "code": "211321", "name": "朝阳县", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "c613d706-3747-4bc2-ac12-da13776335a5"], "path_name": ["中国", "辽宁省", "朝阳市", "朝阳县"], "status": "active", "sort": 341, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "caba2e41-7a98-47a9-980e-42ea2df3b41b", "_rev": "2-a0678ff5c89cb9340c3fc7a19a378566", "type": "region", "code": "440513", "name": "潮阳区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "caba2e41-7a98-47a9-980e-42ea2df3b41b"], "path_name": ["中国", "广东省", "汕头市", "潮阳区"], "status": "active", "sort": 346, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "_rev": "2-d6175fa000fc955c5a6f87c7b16ef79d", "type": "region", "code": "430400", "name": "衡阳市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067"], "path_name": ["中国", "湖南省", "衡阳市"], "status": "active", "sort": 333, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "_rev": "2-f27e738f5efa786e4a0ba74c9b24e85a", "type": "region", "code": "431200", "name": "怀化市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236"], "path_name": ["中国", "湖南省", "怀化市"], "status": "active", "sort": 347, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "e1932036-d503-4116-813b-ac825e18adb3", "_rev": "2-60cac6d9066bcb17e6be3baf55e0548f", "type": "region", "code": "320500", "name": "苏州市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3"], "path_name": ["中国", "江苏省", "苏州市"], "status": "active", "sort": 337, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "e2f3f417-937d-4d66-9683-cf623a4a3fcf", "_rev": "2-60944e150732520d950475bdd095d46a", "type": "region", "code": "440514", "name": "潮南区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "e2f3f417-937d-4d66-9683-cf623a4a3fcf"], "path_name": ["中国", "广东省", "汕头市", "潮南区"], "status": "active", "sort": 345, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:27"} +{"_id": "0a550a5a-5e68-44f1-8b34-30f5393719fa", "_rev": "2-3bbc761c4fa522aa1bef13f1ad3faafd", "type": "region", "code": "630102", "name": "城东区", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "0a550a5a-5e68-44f1-8b34-30f5393719fa"], "path_name": ["中国", "青海省", "西宁市", "城东区"], "status": "active", "sort": 367, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "0fb27508-2582-47de-b782-833eec780ea1", "_rev": "2-613ada0a52a927938038a43f70c19718", "type": "region", "code": "630100", "name": "西宁市", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1"], "path_name": ["中国", "青海省", "西宁市"], "status": "active", "sort": 364, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "1f09a818-d991-43ad-a655-a9b1b3c836ed", "_rev": "2-0afcc7c3f1e3790e082adaf684f294f4", "type": "region", "code": "430529", "name": "城步苗族自治县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "1f09a818-d991-43ad-a655-a9b1b3c836ed"], "path_name": ["中国", "湖南省", "邵阳市", "城步苗族自治县"], "status": "active", "sort": 366, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "29bee127-370f-4ea6-9a66-831382b4d9a8", "_rev": "2-cd0ca417a2740f0556802b580beb6632", "type": "region", "code": "621221", "name": "成县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "29bee127-370f-4ea6-9a66-831382b4d9a8"], "path_name": ["中国", "甘肃省", "陇南市", "成县"], "status": "active", "sort": 360, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "2eff8045-dfb1-4583-a770-7d6490b57e35", "_rev": "2-9caa8cd5f1c7fbe0880c95f4f81ed900", "type": "region", "code": "370214", "name": "城阳区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "2eff8045-dfb1-4583-a770-7d6490b57e35"], "path_name": ["中国", "山东省", "青岛市", "城阳区"], "status": "active", "sort": 375, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "_rev": "2-0f32692de5f109bbfacf5ec5ccb853a9", "type": "region", "code": "130800", "name": "承德市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783"], "path_name": ["中国", "河北省", "承德市"], "status": "active", "sort": 362, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "3d8071c0-27e3-45aa-b2ff-e13ca7351a84", "_rev": "2-a45aa575151af55d028f0ef199ddc7f6", "type": "region", "code": "500229", "name": "城口县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "3d8071c0-27e3-45aa-b2ff-e13ca7351a84"], "path_name": ["中国", "重庆市", "城口县"], "status": "active", "sort": 370, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "4b5a3ae5-1703-4e45-a4a7-a0821b7f8805", "_rev": "2-27a4331e576efdd3a4e1125c1a2063ca", "type": "region", "code": "630105", "name": "城北区", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "4b5a3ae5-1703-4e45-a4a7-a0821b7f8805"], "path_name": ["中国", "青海省", "西宁市", "城北区"], "status": "active", "sort": 365, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "60031958-e67a-4094-8ab0-04087026e22e", "_rev": "2-7b6239d7e19f662772a21312e41cb54e", "type": "region", "code": "350300", "name": "莆田市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e"], "path_name": ["中国", "福建省", "莆田市"], "status": "active", "sort": 372, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "70f1c1b2-e0b8-4d88-b287-4e0850e30341", "_rev": "2-8514900b2c50a5df2fa0c6238858b6c1", "type": "region", "code": "130821", "name": "承德县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "70f1c1b2-e0b8-4d88-b287-4e0850e30341"], "path_name": ["中国", "河北省", "承德市", "承德县"], "status": "active", "sort": 363, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "_rev": "2-f41b93185d8803a0880a8e86743ddc33", "type": "region", "code": "510100", "name": "成都市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285"], "path_name": ["中国", "四川省", "成都市"], "status": "active", "sort": 356, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "7c298197-0ef8-47eb-a5a5-077a1f425fb9", "_rev": "2-8ac6e2f0c44ca6dbfcf9daebd29d8d1e", "type": "region", "code": "371723", "name": "成武县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "7c298197-0ef8-47eb-a5a5-077a1f425fb9"], "path_name": ["中国", "山东省", "菏泽市", "成武县"], "status": "active", "sort": 358, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "7c884478-7107-40a5-a749-a983521f0bc6", "_rev": "2-bb20077a3cce2d93338127809640bc75", "type": "region", "code": "630104", "name": "城西区", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "7c884478-7107-40a5-a749-a983521f0bc6"], "path_name": ["中国", "青海省", "西宁市", "城西区"], "status": "active", "sort": 371, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "_rev": "2-865a049555da164dad33308b7dad9cde", "type": "region", "code": "621200", "name": "陇南市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a"], "path_name": ["中国", "甘肃省", "陇南市"], "status": "active", "sort": 359, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "81d10841-928e-4db5-b995-13e28932dc27", "_rev": "2-39518ef63ef35955e150f37167c5db48", "type": "region", "code": "510108", "name": "成华区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "81d10841-928e-4db5-b995-13e28932dc27"], "path_name": ["中国", "四川省", "成都市", "成华区"], "status": "active", "sort": 357, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "_rev": "2-a21353f5cb08f67100671f240b20553a", "type": "region", "code": "370200", "name": "青岛市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780"], "path_name": ["中国", "山东省", "青岛市"], "status": "active", "sort": 374, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "99dc7247-ecff-4fca-a970-9c729b2cb7b9", "_rev": "2-e4d37eea7d5b1cc6fa5feec1f0461a75", "type": "region", "code": "130424", "name": "成安县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "99dc7247-ecff-4fca-a970-9c729b2cb7b9"], "path_name": ["中国", "河北省", "邯郸市", "成安县"], "status": "active", "sort": 355, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "_rev": "2-1119af30e3a14e858b0e0b7f384deac8", "type": "region", "code": "610700", "name": "汉中市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371"], "path_name": ["中国", "陕西省", "汉中市"], "status": "active", "sort": 368, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "cafaf0f7-bc0e-4160-abb1-bc854c9336b3", "_rev": "2-70f0b23e47cb7aee99716aa02ac2f6e5", "type": "region", "code": "350302", "name": "城厢区", "parent_id": "60031958-e67a-4094-8ab0-04087026e22e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e", "cafaf0f7-bc0e-4160-abb1-bc854c9336b3"], "path_name": ["中国", "福建省", "莆田市", "城厢区"], "status": "active", "sort": 373, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "cc18850c-284e-4235-a778-2e013114c10c", "_rev": "2-72d75117982bfa168f219bd49e922daa", "type": "region", "code": "530114", "name": "呈贡区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "cc18850c-284e-4235-a778-2e013114c10c"], "path_name": ["中国", "云南省", "昆明市", "呈贡区"], "status": "active", "sort": 361, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "fb0a1fb5-c634-4233-a885-278634d63b66", "_rev": "2-23335ff5589b490d67a45cdbea458aaf", "type": "region", "code": "610722", "name": "城固县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "fb0a1fb5-c634-4233-a885-278634d63b66"], "path_name": ["中国", "陕西省", "汉中市", "城固县"], "status": "active", "sort": 369, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:28"} +{"_id": "0f66b386-59c0-4c74-82be-9626f4fd1700", "_rev": "2-cee37b7398898f2d2cfe155fa7c7f36d", "type": "region", "code": "230306", "name": "城子河区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "0f66b386-59c0-4c74-82be-9626f4fd1700"], "path_name": ["中国", "黑龙江省", "鸡西市", "城子河区"], "status": "active", "sort": 377, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "_rev": "2-38e8b52ddaddfce0bb31a67f41790e9e", "type": "region", "code": "130700", "name": "张家口市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939"], "path_name": ["中国", "河北省", "张家口市"], "status": "active", "sort": 387, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "2711c769-2c3f-43a2-813c-a3c2da0e6f49", "_rev": "2-5a7df95ed471112b144e3c3af839222c", "type": "region", "code": "440515", "name": "澄海区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "2711c769-2c3f-43a2-813c-a3c2da0e6f49"], "path_name": ["中国", "广东省", "汕头市", "澄海区"], "status": "active", "sort": 379, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "4dd703ec-4362-4b6d-97c2-fd2a38aff69f", "_rev": "2-2ae0b57d00095d5c0d65e7c6ab399c88", "type": "region", "code": "130732", "name": "赤城县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "4dd703ec-4362-4b6d-97c2-fd2a38aff69f"], "path_name": ["中国", "河北省", "张家口市", "赤城县"], "status": "active", "sort": 388, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "_rev": "2-aa29deec574789ac204fa84d38bece23", "type": "region", "code": "440800", "name": "湛江市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76"], "path_name": ["中国", "广东省", "湛江市"], "status": "active", "sort": 389, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "_rev": "2-897ed23943cda253e49a0ae72072180f", "type": "region", "code": "320600", "name": "南通市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a"], "path_name": ["中国", "江苏省", "南通市"], "status": "active", "sort": 392, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "65c340c7-da1a-48d0-a5d4-81ef3d51a01f", "_rev": "2-3079b4100e8279e637d2961eb0562b0c", "type": "region", "code": "310000", "name": "直辖", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "65c340c7-da1a-48d0-a5d4-81ef3d51a01f"], "path_name": ["中国", "上海市", "直辖"], "status": "active", "sort": 396, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "_rev": "2-7758c5131dd9078afaaf8c4ea9e6199f", "type": "region", "code": "421200", "name": "咸宁市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322"], "path_name": ["中国", "湖北省", "咸宁市"], "status": "active", "sort": 385, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "_rev": "2-dc37b25a796d62a6a088a21094fd412d", "type": "region", "code": "310000", "name": "上海市", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171"], "path_name": ["中国", "上海市"], "status": "active", "sort": 395, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "_rev": "2-95d1737cf05f461c37ca4ed39fd60069", "type": "region", "code": "530400", "name": "玉溪市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e"], "path_name": ["中国", "云南省", "玉溪市"], "status": "active", "sort": 380, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "af3f794a-9277-47a5-85ff-f86c7e948a5c", "_rev": "2-ecdcd840a28235a29ec32b617cadf86b", "type": "region", "code": "320613", "name": "崇川区", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "af3f794a-9277-47a5-85ff-f86c7e948a5c"], "path_name": ["中国", "江苏省", "南通市", "崇川区"], "status": "active", "sort": 393, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "_rev": "2-51b2cb41d26a63d5aa970f3bc868b24a", "type": "region", "code": "371500", "name": "聊城市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5"], "path_name": ["中国", "山东省", "聊城市"], "status": "active", "sort": 383, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "c1965673-d710-4738-a945-2f3f07beac3d", "_rev": "2-d2bdf975a4e891095e8cbdb15e307f7e", "type": "region", "code": "440802", "name": "赤坎区", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "c1965673-d710-4738-a945-2f3f07beac3d"], "path_name": ["中国", "广东省", "湛江市", "赤坎区"], "status": "active", "sort": 390, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "c623a622-467d-4b1e-b77b-a1f5622bca88", "_rev": "2-a01951aa789188602eb461c5bb8f1e57", "type": "region", "code": "130709", "name": "崇礼区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "c623a622-467d-4b1e-b77b-a1f5622bca88"], "path_name": ["中国", "河北省", "张家口市", "崇礼区"], "status": "active", "sort": 394, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "c7ec4f5f-8468-41f7-8534-c0e6b09b3e0c", "_rev": "2-6f0e09aca3d0fc5c227e3fc624c60756", "type": "region", "code": "421281", "name": "赤壁市", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "c7ec4f5f-8468-41f7-8534-c0e6b09b3e0c"], "path_name": ["中国", "湖北省", "咸宁市", "赤壁市"], "status": "active", "sort": 386, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "cf5bb9c0-6452-4030-a2bc-c87098c1f0fd", "_rev": "2-c5a0662117e3cc17b8b20ca63109fb3c", "type": "region", "code": "469023", "name": "澄迈县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "cf5bb9c0-6452-4030-a2bc-c87098c1f0fd"], "path_name": ["中国", "海南省", "澄迈县"], "status": "active", "sort": 382, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "dca1f8d9-0b04-466d-8eed-7a8940016040", "_rev": "2-a3a59df17c218db99db8b6b67a3aaa09", "type": "region", "code": "520381", "name": "赤水市", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "dca1f8d9-0b04-466d-8eed-7a8940016040"], "path_name": ["中国", "贵州省", "遵义市", "赤水市"], "status": "active", "sort": 391, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "e6cefacb-bccf-425d-a45d-40a408d92565", "_rev": "2-29e53778eafdf1f90f64becec62ac2e3", "type": "region", "code": "530481", "name": "澄江市", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "e6cefacb-bccf-425d-a45d-40a408d92565"], "path_name": ["中国", "云南省", "玉溪市", "澄江市"], "status": "active", "sort": 381, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "f21199ed-745e-40b7-a168-3504f0749cd0", "_rev": "2-1d0369c752ee2bd6d8cbf4713379c963", "type": "region", "code": "610525", "name": "澄城县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "f21199ed-745e-40b7-a168-3504f0749cd0"], "path_name": ["中国", "陕西省", "渭南市", "澄城县"], "status": "active", "sort": 378, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "_rev": "2-4a5a777727cf8c58da10846adb4c9c37", "type": "region", "code": "230300", "name": "鸡西市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e"], "path_name": ["中国", "黑龙江省", "鸡西市"], "status": "active", "sort": 376, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "fdc278c7-985c-44e2-90f9-5d972cdb1a56", "_rev": "2-d2814a57525b016c4371be2f63f20e44", "type": "region", "code": "371503", "name": "茌平区", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "fdc278c7-985c-44e2-90f9-5d972cdb1a56"], "path_name": ["中国", "山东省", "聊城市", "茌平区"], "status": "active", "sort": 384, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:29"} +{"_id": "0af3d42a-610d-4372-8053-d08838145cc2", "_rev": "2-5b1693e8b06b643fed09a46261d3ff27", "type": "region", "code": "310151", "name": "崇明区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "0af3d42a-610d-4372-8053-d08838145cc2"], "path_name": ["中国", "上海市", "崇明区"], "status": "active", "sort": 397, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "0bf58c4e-72b7-4c05-b4ab-59c6499617b2", "_rev": "2-e5d6cccdd2e26c41706c3e405b9ade3f", "type": "region", "code": "421223", "name": "崇阳县", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "0bf58c4e-72b7-4c05-b4ab-59c6499617b2"], "path_name": ["中国", "湖北省", "咸宁市", "崇阳县"], "status": "active", "sort": 402, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "_rev": "2-6173c92674986c3875249a6737b3fd7b", "type": "region", "code": "411600", "name": "周口市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3"], "path_name": ["中国", "河南省", "周口市"], "status": "active", "sort": 407, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "291ecb70-f7f4-44b9-9854-0963beb1546d", "_rev": "2-2496e22b03fdee64e80a1bc30ffdb403", "type": "region", "code": "411602", "name": "川汇区", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "291ecb70-f7f4-44b9-9854-0963beb1546d"], "path_name": ["中国", "河南省", "周口市", "川汇区"], "status": "active", "sort": 408, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "2e61c3bd-70f5-4556-9506-bf837670cb8f", "_rev": "2-34ae6c38d5222c2d0420c586e9558f64", "type": "region", "code": "220204", "name": "船营区", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "2e61c3bd-70f5-4556-9506-bf837670cb8f"], "path_name": ["中国", "吉林省", "吉林市", "船营区"], "status": "active", "sort": 410, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "_rev": "2-cc28e76fb83c14009bf7b5eb30d95b1c", "type": "region", "code": "361000", "name": "抚州市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5"], "path_name": ["中国", "江西省", "抚州市"], "status": "active", "sort": 398, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "50330b40-024b-4a65-9c5b-07c0fbd8b111", "_rev": "2-fccd68d3bda04ef08d2ac3680101a6e1", "type": "region", "code": "610430", "name": "淳化县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "50330b40-024b-4a65-9c5b-07c0fbd8b111"], "path_name": ["中国", "陕西省", "咸阳市", "淳化县"], "status": "active", "sort": 412, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "60fbdf10-3f42-4faf-90b3-adafefb0ff13", "_rev": "2-521d5b6b305c553cedb55b7be740e301", "type": "region", "code": "532301", "name": "楚雄市", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "60fbdf10-3f42-4faf-90b3-adafefb0ff13"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "楚雄市"], "status": "active", "sort": 406, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "71264234-0fc8-42ac-8ede-c65d1f42516f", "_rev": "2-e2c187361014c29c80fe4dea362d3d70", "type": "region", "code": "340700", "name": "铜陵市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "71264234-0fc8-42ac-8ede-c65d1f42516f"], "path_name": ["中国", "安徽省", "铜陵市"], "status": "active", "sort": 417, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "8642163b-101d-488d-9303-107900e19d70", "_rev": "2-a433b90bb2dc2d33a44f2c6e4d06ab8a", "type": "region", "code": "130427", "name": "磁县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "8642163b-101d-488d-9303-107900e19d70"], "path_name": ["中国", "河北省", "邯郸市", "磁县"], "status": "active", "sort": 416, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "_rev": "2-4ab2563cb3aebdc726fa7610036e398a", "type": "region", "code": "620800", "name": "平凉市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e"], "path_name": ["中国", "甘肃省", "平凉市"], "status": "active", "sort": 400, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "91f4aa50-a3bf-41c9-9f46-d634c143db2e", "_rev": "2-cf77ed33824521eff267d035a9ebe6e1", "type": "region", "code": "330282", "name": "慈溪市", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "91f4aa50-a3bf-41c9-9f46-d634c143db2e"], "path_name": ["中国", "浙江省", "宁波市", "慈溪市"], "status": "active", "sort": 415, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "a844aa13-4840-4b0c-b513-becdbf25556b", "_rev": "2-a42dbbf594d267b624d13ef963d04625", "type": "region", "code": "510184", "name": "崇州市", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "a844aa13-4840-4b0c-b513-becdbf25556b"], "path_name": ["中国", "四川省", "成都市", "崇州市"], "status": "active", "sort": 404, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "_rev": "2-6e9601c5e4522bdfadbcaac3ef18e20f", "type": "region", "code": "532300", "name": "楚雄彝族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b"], "path_name": ["中国", "云南省", "楚雄彝族自治州"], "status": "active", "sort": 405, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "ad695a83-3b45-405e-a3c8-b9c1f60b8d42", "_rev": "2-932e03a8898151326f1c5bf7f4cd3961", "type": "region", "code": "510903", "name": "船山区", "parent_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "ad695a83-3b45-405e-a3c8-b9c1f60b8d42"], "path_name": ["中国", "四川省", "遂宁市", "船山区"], "status": "active", "sort": 409, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "cf2d1f0a-4f65-4ac8-80d1-e03f647c1eec", "_rev": "2-71bc6b170d4f05a0cff383d06fd19e02", "type": "region", "code": "620823", "name": "崇信县", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "cf2d1f0a-4f65-4ac8-80d1-e03f647c1eec"], "path_name": ["中国", "甘肃省", "平凉市", "崇信县"], "status": "active", "sort": 401, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "d1715280-8bb4-4b78-8957-0155b9ed2105", "_rev": "2-01a408670675647ae060a2a153748c9d", "type": "region", "code": "430821", "name": "慈利县", "parent_id": "ddb90f83-c981-4cc1-a157-a085d328dd64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "ddb90f83-c981-4cc1-a157-a085d328dd64", "d1715280-8bb4-4b78-8957-0155b9ed2105"], "path_name": ["中国", "湖南省", "张家界市", "慈利县"], "status": "active", "sort": 414, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "ddb90f83-c981-4cc1-a157-a085d328dd64", "_rev": "2-8bba77264fad250bef74a28332b18e45", "type": "region", "code": "430800", "name": "张家界市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "ddb90f83-c981-4cc1-a157-a085d328dd64"], "path_name": ["中国", "湖南省", "张家界市"], "status": "active", "sort": 413, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "e8e8dea3-af64-4038-a659-1e7b492889ec", "_rev": "2-946ec91483185682c67c133f13229199", "type": "region", "code": "360725", "name": "崇义县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "e8e8dea3-af64-4038-a659-1e7b492889ec"], "path_name": ["中国", "江西省", "赣州市", "崇义县"], "status": "active", "sort": 403, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "ea5f6704-df50-46c6-9e3b-32360b9bd247", "_rev": "2-a1f405829f3d3a3f2a4ef279e9afdba6", "type": "region", "code": "361024", "name": "崇仁县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "ea5f6704-df50-46c6-9e3b-32360b9bd247"], "path_name": ["中国", "江西省", "抚州市", "崇仁县"], "status": "active", "sort": 399, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "fdfd3368-af3c-4885-9922-b852bbbd04da", "_rev": "2-24b9ea25deafacb595772b4c3ba450a2", "type": "region", "code": "330127", "name": "淳安县", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "fdfd3368-af3c-4885-9922-b852bbbd04da"], "path_name": ["中国", "浙江省", "杭州市", "淳安县"], "status": "active", "sort": 411, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:30"} +{"_id": "1c12ee73-2aaa-41c9-aa97-2e08a5aa3e87", "_rev": "2-cde1319c83d0caa3178f5fbb11e3c4c7", "type": "region", "code": "130403", "name": "丛台区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "1c12ee73-2aaa-41c9-aa97-2e08a5aa3e87"], "path_name": ["中国", "河北省", "邯郸市", "丛台区"], "status": "active", "sort": 422, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "1c4a86e9-0825-4c95-abea-b2eb579e2703", "_rev": "2-72f37a2d33fc23c864f98d7f9ab5b30a", "type": "region", "code": "511502", "name": "翠屏区", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "1c4a86e9-0825-4c95-abea-b2eb579e2703"], "path_name": ["中国", "四川省", "宜宾市", "翠屏区"], "status": "active", "sort": 424, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "25c73dfa-7288-41be-bbd4-ed021fc91fd3", "_rev": "2-bcf812a831cd2e8b430e9837e96183a7", "type": "region", "code": "522633", "name": "从江县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "25c73dfa-7288-41be-bbd4-ed021fc91fd3"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "从江县"], "status": "active", "sort": 421, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "2d3decaa-802a-43ec-bb37-7b74228ea2c1", "_rev": "2-389ffaf8e17686900a1ef0af06ec2528", "type": "region", "code": "150621", "name": "达拉特旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "2d3decaa-802a-43ec-bb37-7b74228ea2c1"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "达拉特旗"], "status": "active", "sort": 436, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "_rev": "2-537184c4dca76500a89ab2f29a60c6d1", "type": "region", "code": "542500", "name": "阿里地区", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52"], "path_name": ["中国", "西藏自治区", "阿里地区"], "status": "active", "sort": 427, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "_rev": "2-3aefd9d385b90c6230dc96a58e325b5b", "type": "region", "code": "650100", "name": "乌鲁木齐市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市"], "status": "active", "sort": 430, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "40c61682-aa86-4c51-aaf8-f0bf2d1da29f", "_rev": "2-875a700542f74182511c2bf10200124c", "type": "region", "code": "540526", "name": "措美县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "40c61682-aa86-4c51-aaf8-f0bf2d1da29f"], "path_name": ["中国", "西藏自治区", "山南市", "措美县"], "status": "active", "sort": 426, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "_rev": "2-5a466685ffd46c607556f10d94cfb6a0", "type": "region", "code": "440100", "name": "广州市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e"], "path_name": ["中国", "广东省", "广州市"], "status": "active", "sort": 419, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "579407c1-8491-46d8-99d9-c52e5e4a1cdf", "_rev": "2-577fb3fab2a98f3e7a84f98366b02b28", "type": "region", "code": "340722", "name": "枞阳县", "parent_id": "71264234-0fc8-42ac-8ede-c65d1f42516f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "71264234-0fc8-42ac-8ede-c65d1f42516f", "579407c1-8491-46d8-99d9-c52e5e4a1cdf"], "path_name": ["中国", "安徽省", "铜陵市", "枞阳县"], "status": "active", "sort": 418, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "5fe5a988-6e99-4084-afd8-a288f2618bd2", "_rev": "2-173c24c1fec3dc67e2da2df239c3dbb5", "type": "region", "code": "540530", "name": "错那县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "5fe5a988-6e99-4084-afd8-a288f2618bd2"], "path_name": ["中国", "西藏自治区", "山南市", "错那县"], "status": "active", "sort": 429, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "_rev": "2-8d46a5ec4bcb63eb18c72651471c76b6", "type": "region", "code": "511500", "name": "宜宾市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03"], "path_name": ["中国", "四川省", "宜宾市"], "status": "active", "sort": 423, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "_rev": "2-4cd2d1a300b7476b540b8811b2d9b7a7", "type": "region", "code": "540500", "name": "山南市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4"], "path_name": ["中国", "西藏自治区", "山南市"], "status": "active", "sort": 425, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "87a471b0-d77a-4561-8741-a4055360357c", "_rev": "2-61f7da42a0812a560dcf2647182ff875", "type": "region", "code": "440117", "name": "从化区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "87a471b0-d77a-4561-8741-a4055360357c"], "path_name": ["中国", "广东省", "广州市", "从化区"], "status": "active", "sort": 420, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "_rev": "2-dff87a35d1190a02d40dfa5e4da1a6ce", "type": "region", "code": "150600", "name": "鄂尔多斯市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市"], "status": "active", "sort": 435, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "9ffdb47e-f536-431a-b6fb-d8b5c7c7e6b0", "_rev": "2-0a9ac88c271bb24e6c69ee26747ceefa", "type": "region", "code": "150223", "name": "达尔罕茂明安联合旗", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "9ffdb47e-f536-431a-b6fb-d8b5c7c7e6b0"], "path_name": ["中国", "内蒙古自治区", "包头市", "达尔罕茂明安联合旗"], "status": "active", "sort": 434, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "be51d5cf-e51f-4194-bdd2-ae4591092c15", "_rev": "2-c50dcef2f3e0b4b16f3ddbd4d86ad309", "type": "region", "code": "650107", "name": "达坂城区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "be51d5cf-e51f-4194-bdd2-ae4591092c15"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "达坂城区"], "status": "active", "sort": 431, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "d33c4c7b-ec86-42ba-a2e4-f786b11abd68", "_rev": "2-9c95c9080892eac139a31df929846b90", "type": "region", "code": "542527", "name": "措勤县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "d33c4c7b-ec86-42ba-a2e4-f786b11abd68"], "path_name": ["中国", "西藏自治区", "阿里地区", "措勤县"], "status": "active", "sort": 428, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "d7904033-d6ab-400b-874a-90adbbb251e2", "_rev": "2-11a7cb66d2d2c4c9caba0bf279a80bb1", "type": "region", "code": "511703", "name": "达川区", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "d7904033-d6ab-400b-874a-90adbbb251e2"], "path_name": ["中国", "四川省", "达州市", "达川区"], "status": "active", "sort": 433, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "_rev": "2-6691c4bee8232bb45502d22a57cc3357", "type": "region", "code": "511700", "name": "达州市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de"], "path_name": ["中国", "四川省", "达州市"], "status": "active", "sort": 432, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:31"} +{"_id": "1b246fd8-4659-4994-9908-7de3132351a9", "_rev": "2-acc80a095e51658e11a27f8ebfe3cc79", "type": "region", "code": "530624", "name": "大关县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "1b246fd8-4659-4994-9908-7de3132351a9"], "path_name": ["中国", "云南省", "昭通市", "大关县"], "status": "active", "sort": 451, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "4bea2f80-df91-4dcd-8f61-1333dea76767", "_rev": "2-64809bfb728bf9f13bf9ce9856c70df6", "type": "region", "code": "141030", "name": "大宁县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "4bea2f80-df91-4dcd-8f61-1333dea76767"], "path_name": ["中国", "山西省", "临汾市", "大宁县"], "status": "active", "sort": 458, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "5644eb15-aae1-4c4b-b4b8-90e95d49fd2f", "_rev": "2-b62e4295fa96334c846fc6b7d0b90e64", "type": "region", "code": "610523", "name": "大荔县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "5644eb15-aae1-4c4b-b4b8-90e95d49fd2f"], "path_name": ["中国", "陕西省", "渭南市", "大荔县"], "status": "active", "sort": 456, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "_rev": "2-c55d27777776b6dc312bd71693e45ef3", "type": "region", "code": "530600", "name": "昭通市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e"], "path_name": ["中国", "云南省", "昭通市"], "status": "active", "sort": 450, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "5ab74732-e8d8-4887-97c4-7d36cf0fc4cf", "_rev": "2-5aafd961cfd7aeed2f7a9514e71e4677", "type": "region", "code": "451229", "name": "大化瑶族自治县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "5ab74732-e8d8-4887-97c4-7d36cf0fc4cf"], "path_name": ["中国", "广西壮族自治区", "河池市", "大化瑶族自治县"], "status": "active", "sort": 454, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "_rev": "2-305dc01fcee47a14a39925a035564ad1", "type": "region", "code": "520500", "name": "毕节市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75"], "path_name": ["中国", "贵州省", "毕节市"], "status": "active", "sort": 447, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "76b48630-56e8-4028-859b-1e925ca8ffbb", "_rev": "2-514cc5f3f673f157404c78dce37ba306", "type": "region", "code": "220882", "name": "大安市", "parent_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "76b48630-56e8-4028-859b-1e925ca8ffbb"], "path_name": ["中国", "吉林省", "白城市", "大安市"], "status": "active", "sort": 441, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "7dcef7c0-ede3-4add-bd12-e1cd7983f418", "_rev": "2-64db2849f024a9fcd4f8c4957bbca258", "type": "region", "code": "540104", "name": "达孜区", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "7dcef7c0-ede3-4add-bd12-e1cd7983f418"], "path_name": ["中国", "西藏自治区", "拉萨市", "达孜区"], "status": "active", "sort": 439, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "7f6774a0-7dd4-48b0-bde7-4870644b2083", "_rev": "2-3812b806d57d68b61b3c78b370425bb3", "type": "region", "code": "320904", "name": "大丰区", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "7f6774a0-7dd4-48b0-bde7-4870644b2083"], "path_name": ["中国", "江苏省", "盐城市", "大丰区"], "status": "active", "sort": 449, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "933e2fb2-1119-4e56-a79b-2f62516b6ab3", "_rev": "2-7fe13ae388b8b5542d541a74a98d38d6", "type": "region", "code": "130425", "name": "大名县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "933e2fb2-1119-4e56-a79b-2f62516b6ab3"], "path_name": ["中国", "河北省", "邯郸市", "大名县"], "status": "active", "sort": 457, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "997d0ffa-f6c3-4ccc-afa9-cc91b87287b3", "_rev": "2-b73d6cd81394a55f951903254791a637", "type": "region", "code": "340803", "name": "大观区", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "997d0ffa-f6c3-4ccc-afa9-cc91b87287b3"], "path_name": ["中国", "安徽省", "安庆市", "大观区"], "status": "active", "sort": 453, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "a5379758-5c32-4d3d-8c0f-f9df73621c76", "_rev": "2-1fd7149cee2f15c6450ece2ae5d9eff5", "type": "region", "code": "131028", "name": "大厂回族自治县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "a5379758-5c32-4d3d-8c0f-f9df73621c76"], "path_name": ["中国", "河北省", "廊坊市", "大厂回族自治县"], "status": "active", "sort": 442, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "_rev": "2-fbb0b9619fa19e891e00a6f7ec65deab", "type": "region", "code": "210100", "name": "沈阳市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c"], "path_name": ["中国", "辽宁省", "沈阳市"], "status": "active", "sort": 444, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "b9dfbfe6-4e73-4b26-aba6-317d391dd75d", "_rev": "2-b34364455540d1a4a7f8651730ea2230", "type": "region", "code": "532901", "name": "大理市", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "b9dfbfe6-4e73-4b26-aba6-317d391dd75d"], "path_name": ["中国", "云南省", "大理白族自治州", "大理市"], "status": "active", "sort": 455, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "bfec5c24-6be7-48b1-b532-647f09ad7bec", "_rev": "2-66a90de194565694b195321e1715a1cd", "type": "region", "code": "520521", "name": "大方县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "bfec5c24-6be7-48b1-b532-647f09ad7bec"], "path_name": ["中国", "贵州省", "毕节市", "大方县"], "status": "active", "sort": 448, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "c39202cb-c058-4996-b317-d56725632a05", "_rev": "2-3d02faff41cea7d42f318b89f291f0ae", "type": "region", "code": "131025", "name": "大城县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "c39202cb-c058-4996-b317-d56725632a05"], "path_name": ["中国", "河北省", "廊坊市", "大城县"], "status": "active", "sort": 443, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "_rev": "2-e5f18d2d0044073ef4ec428fa9a5d7d7", "type": "region", "code": "340800", "name": "安庆市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b"], "path_name": ["中国", "安徽省", "安庆市"], "status": "active", "sort": 452, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "e4a55358-62e5-46d0-95bd-5fb47caf2698", "_rev": "2-e9ee8481805f6c47c69d78258071b30b", "type": "region", "code": "210104", "name": "大东区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "e4a55358-62e5-46d0-95bd-5fb47caf2698"], "path_name": ["中国", "辽宁省", "沈阳市", "大东区"], "status": "active", "sort": 445, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "_rev": "2-d7732c996fde2d0cdb37b4d86aae66a4", "type": "region", "code": "540100", "name": "拉萨市", "parent_id": "2a82d1f6-086c-4f04-8937-a96526c66506", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f"], "path_name": ["中国", "西藏自治区", "拉萨市"], "status": "active", "sort": 438, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "ee694560-b086-47bb-b331-a40d04c026a1", "_rev": "2-7860353c229fa061db7e8a650d1ca9f8", "type": "region", "code": "632624", "name": "达日县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "ee694560-b086-47bb-b331-a40d04c026a1"], "path_name": ["中国", "青海省", "果洛藏族自治州", "达日县"], "status": "active", "sort": 437, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "_rev": "2-1c4208a24a22bd4642664616cc69f3db", "type": "region", "code": "220800", "name": "白城市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0"], "path_name": ["中国", "吉林省", "白城市"], "status": "active", "sort": 440, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "fca2525b-4b33-482a-a74e-80a770c5c994", "_rev": "2-bfcf9282a53f08952a9a546a38080174", "type": "region", "code": "500104", "name": "大渡口区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "fca2525b-4b33-482a-a74e-80a770c5c994"], "path_name": ["中国", "重庆市", "大渡口区"], "status": "active", "sort": 446, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:32"} +{"_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "_rev": "2-a5ec939ec8ed2484c598f84c009303f3", "type": "region", "code": "451400", "name": "崇左市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54"], "path_name": ["中国", "广西壮族自治区", "崇左市"], "status": "active", "sort": 473, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "19565dfd-2177-4e98-9e62-d25eb229eac4", "_rev": "2-401a3e152cb1cbdf0af55f8b71e4bfe4", "type": "region", "code": "420922", "name": "大悟县", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "19565dfd-2177-4e98-9e62-d25eb229eac4"], "path_name": ["中国", "湖北省", "孝感市", "大悟县"], "status": "active", "sort": 471, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "2217c5eb-adc6-41a5-92d0-7f92ac6eda34", "_rev": "2-5226c7db06e68956cace0f88412f386c", "type": "region", "code": "350425", "name": "大田县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "2217c5eb-adc6-41a5-92d0-7f92ac6eda34"], "path_name": ["中国", "福建省", "三明市", "大田县"], "status": "active", "sort": 463, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "2729f5aa-8f01-438d-b063-a39d05296b69", "_rev": "2-e5643bbfa201df2bc146c54c70f28be0", "type": "region", "code": "211100", "name": "盘锦市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "2729f5aa-8f01-438d-b063-a39d05296b69"], "path_name": ["中国", "辽宁省", "盘锦市"], "status": "active", "sort": 466, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "_rev": "2-0e60c385b2489d69cf0dc693e1337097", "type": "region", "code": "441400", "name": "梅州市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078"], "path_name": ["中国", "广东省", "梅州市"], "status": "active", "sort": 459, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "59f74286-357f-4469-ba13-2e9f0ee7dc1e", "_rev": "2-e90e49a02f317386ae1fa7d1466ff75c", "type": "region", "code": "210882", "name": "大石桥市", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "59f74286-357f-4469-ba13-2e9f0ee7dc1e"], "path_name": ["中国", "辽宁省", "营口市", "大石桥市"], "status": "active", "sort": 461, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "5bde1e48-1aa9-4091-a588-fc6498e52564", "_rev": "2-b049d37e31e027851315fef07d7c4829", "type": "region", "code": "510129", "name": "大邑县", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "5bde1e48-1aa9-4091-a588-fc6498e52564"], "path_name": ["中国", "四川省", "成都市", "大邑县"], "status": "active", "sort": 479, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "_rev": "2-97d83a58725cc9d753114e25c01e97f2", "type": "region", "code": "640000", "name": "宁夏回族自治区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440"], "path_name": ["中国", "宁夏回族自治区"], "status": "active", "sort": 468, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "8883f08e-9c91-499d-8c35-515b3c2965fc", "_rev": "2-2d74b4d1ae43461792f96fc75977ce9d", "type": "region", "code": "532326", "name": "大姚县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "8883f08e-9c91-499d-8c35-515b3c2965fc"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "大姚县"], "status": "active", "sort": 476, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "894a88d5-609c-49d2-afd5-cecfa471b8f6", "_rev": "2-45ebcb1dd73b82a4ecfd580551d70274", "type": "region", "code": "340402", "name": "大通区", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "894a88d5-609c-49d2-afd5-cecfa471b8f6"], "path_name": ["中国", "安徽省", "淮南市", "大通区"], "status": "active", "sort": 465, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "93a12543-22e8-4ed6-ac01-3cbbfa97705c", "_rev": "2-4c35fa7801b297909834e7377706238a", "type": "region", "code": "451424", "name": "大新县", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "93a12543-22e8-4ed6-ac01-3cbbfa97705c"], "path_name": ["中国", "广西壮族自治区", "崇左市", "大新县"], "status": "active", "sort": 474, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "a39a6ebc-4d7d-48c3-8fc9-28d387d7b44c", "_rev": "2-cdab0d55e57560fa034091a3e150ff8b", "type": "region", "code": "430503", "name": "大祥区", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "a39a6ebc-4d7d-48c3-8fc9-28d387d7b44c"], "path_name": ["中国", "湖南省", "邵阳市", "大祥区"], "status": "active", "sort": 472, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "ace2ff90-6b16-484e-b7eb-37c3f66be52f", "_rev": "2-b695202b02d90d0286b57db3fcfc35c8", "type": "region", "code": "211104", "name": "大洼区", "parent_id": "2729f5aa-8f01-438d-b063-a39d05296b69", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "2729f5aa-8f01-438d-b063-a39d05296b69", "ace2ff90-6b16-484e-b7eb-37c3f66be52f"], "path_name": ["中国", "辽宁省", "盘锦市", "大洼区"], "status": "active", "sort": 467, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "_rev": "2-ee5665e53dca2286d1252f746d053d31", "type": "region", "code": "350400", "name": "三明市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048"], "path_name": ["中国", "福建省", "三明市"], "status": "active", "sort": 462, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "_rev": "2-60cbc2496e7d65f68f5d89622bf904e8", "type": "region", "code": "420200", "name": "黄石市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274"], "path_name": ["中国", "湖北省", "黄石市"], "status": "active", "sort": 477, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "e24df958-37ab-46ff-b61c-a6882aeaeea6", "_rev": "2-bbecd566b73a5ba54b50d435790b99d3", "type": "region", "code": "630121", "name": "大通回族土族自治县", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "e24df958-37ab-46ff-b61c-a6882aeaeea6"], "path_name": ["中国", "青海省", "西宁市", "大通回族土族自治县"], "status": "active", "sort": 464, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "_rev": "2-2b572ea866edaa45c18779ee99f751f6", "type": "region", "code": "640200", "name": "石嘴山市", "parent_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "e6b1efcc-9dd0-4870-bfac-a2a71bc07708"], "path_name": ["中国", "宁夏回族自治区", "石嘴山市"], "status": "active", "sort": 469, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "e9597546-9fa9-4c05-bcd7-e27ad2ca8fb0", "_rev": "2-8e382e7a92f08cff560b5c389e6c93e7", "type": "region", "code": "420281", "name": "大冶市", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "e9597546-9fa9-4c05-bcd7-e27ad2ca8fb0"], "path_name": ["中国", "湖北省", "黄石市", "大冶市"], "status": "active", "sort": 478, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "e97abc9c-97dd-4d6f-9933-2cf314cda12a", "_rev": "2-903f91f3f79d6a7b3b2c10afe964a4f1", "type": "region", "code": "640202", "name": "大武口区", "parent_id": "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "e97abc9c-97dd-4d6f-9933-2cf314cda12a"], "path_name": ["中国", "宁夏回族自治区", "石嘴山市", "大武口区"], "status": "active", "sort": 470, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "facdb88d-f9b2-4997-a57c-849bd141d542", "_rev": "2-16ef2b3f119f6c067db4ae66d3d41fed", "type": "region", "code": "110115", "name": "大兴区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "facdb88d-f9b2-4997-a57c-849bd141d542"], "path_name": ["中国", "北京市", "大兴区"], "status": "active", "sort": 475, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "fce7658e-7fba-4aa0-8363-93f67fe6cf18", "_rev": "2-a538660e95b6bed193b363a25613b2b1", "type": "region", "code": "441422", "name": "大埔县", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "fce7658e-7fba-4aa0-8363-93f67fe6cf18"], "path_name": ["中国", "广东省", "梅州市", "大埔县"], "status": "active", "sort": 460, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:33"} +{"_id": "0d290c30-1669-4242-a1f7-267afe66e84a", "_rev": "2-60650f3e9135b0d3c344210bad4f8b44", "type": "region", "code": "513323", "name": "丹巴县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "0d290c30-1669-4242-a1f7-267afe66e84a"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "丹巴县"], "status": "active", "sort": 489, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "0e4293c2-4c0a-488c-8a2c-346e392c8948", "_rev": "2-2432029bfd79a159d59217c645ce4bf1", "type": "region", "code": "511424", "name": "丹棱县", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "0e4293c2-4c0a-488c-8a2c-346e392c8948"], "path_name": ["中国", "四川省", "眉山市", "丹棱县"], "status": "active", "sort": 495, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "199e3d1d-1577-405c-a1ff-f29489992507", "_rev": "2-06c8495c76dd83d9ebb66d7f3500022e", "type": "region", "code": "500111", "name": "大足区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "199e3d1d-1577-405c-a1ff-f29489992507"], "path_name": ["中国", "重庆市", "大足区"], "status": "active", "sort": 483, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "_rev": "2-e02995b9dccfd705e417c4c923b28201", "type": "region", "code": "330900", "name": "舟山市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "1aa2d21f-69bf-46de-9e8c-5d5059d51f55"], "path_name": ["中国", "浙江省", "舟山市"], "status": "active", "sort": 485, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "1c30151a-0c61-4c8c-a9bd-5a3f2c25c978", "_rev": "2-764ec5652bac69bb07e525e58ed076a6", "type": "region", "code": "611022", "name": "丹凤县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "1c30151a-0c61-4c8c-a9bd-5a3f2c25c978"], "path_name": ["中国", "陕西省", "商洛市", "丹凤县"], "status": "active", "sort": 491, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "26c2fb04-9990-4b0d-af66-0a42e48ec378", "_rev": "2-eb69762a5f825489407124b6fd43be6e", "type": "region", "code": "330921", "name": "岱山县", "parent_id": "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "26c2fb04-9990-4b0d-af66-0a42e48ec378"], "path_name": ["中国", "浙江省", "舟山市", "岱山县"], "status": "active", "sort": 486, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "2a42d7f2-95d3-407c-a380-0fc4f1405b4c", "_rev": "2-733f788ff2df7e2c2421bbcf1fdb5b92", "type": "region", "code": "420381", "name": "丹江口市", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "2a42d7f2-95d3-407c-a380-0fc4f1405b4c"], "path_name": ["中国", "湖北省", "十堰市", "丹江口市"], "status": "active", "sort": 493, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "55ccabb6-c671-4142-a77e-44ba17fdaa0c", "_rev": "2-260e294b524f4ebccdc56632aafcce04", "type": "region", "code": "321112", "name": "丹徒区", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "55ccabb6-c671-4142-a77e-44ba17fdaa0c"], "path_name": ["中国", "江苏省", "镇江市", "丹徒区"], "status": "active", "sort": 497, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "5cb325bc-1563-4386-a3de-faedce955a86", "_rev": "2-f1dc2c32626d1bfa159e5ce3eb77aa66", "type": "region", "code": "611000", "name": "商洛市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86"], "path_name": ["中国", "陕西省", "商洛市"], "status": "active", "sort": 490, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "5f856306-f4f6-4ddc-bcd0-6bb0d374df78", "_rev": "2-a22ec0a6b30a520e6803a132870e746e", "type": "region", "code": "522636", "name": "丹寨县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "5f856306-f4f6-4ddc-bcd0-6bb0d374df78"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "丹寨县"], "status": "active", "sort": 499, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "_rev": "2-861fd59dc1fcc5aaeb75c41c8f5aac96", "type": "region", "code": "370900", "name": "泰安市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7"], "path_name": ["中国", "山东省", "泰安市"], "status": "active", "sort": 487, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "6c6a95a7-81d9-40da-85ed-c2ce7185b909", "_rev": "2-74d63c90ed8d1b170c2603d007c94d8d", "type": "region", "code": "371722", "name": "单县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "6c6a95a7-81d9-40da-85ed-c2ce7185b909"], "path_name": ["中国", "山东省", "菏泽市", "单县"], "status": "active", "sort": 500, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "906c7511-d3cb-40df-985a-71c776aaf962", "_rev": "2-e7f8205ee5610618d3a047df8e8479e8", "type": "region", "code": "420300", "name": "十堰市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962"], "path_name": ["中国", "湖北省", "十堰市"], "status": "active", "sort": 492, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "933c4728-8b50-4b1b-ac7a-4b58591f1e1d", "_rev": "2-3cb736c5255fed4575a3fb7f87457ea6", "type": "region", "code": "511724", "name": "大竹县", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "933c4728-8b50-4b1b-ac7a-4b58591f1e1d"], "path_name": ["中国", "四川省", "达州市", "大竹县"], "status": "active", "sort": 482, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "aad3f72a-dcdc-4b28-9036-37cdc5229e78", "_rev": "2-26e3fc32ef05bb1d5732e7ddb4470b02", "type": "region", "code": "321181", "name": "丹阳市", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "aad3f72a-dcdc-4b28-9036-37cdc5229e78"], "path_name": ["中国", "江苏省", "镇江市", "丹阳市"], "status": "active", "sort": 498, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "_rev": "2-996183c844bd4f9752fd2a38ab51788e", "type": "region", "code": "511400", "name": "眉山市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82"], "path_name": ["中国", "四川省", "眉山市"], "status": "active", "sort": 494, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "ab7eeb59-39a8-4f79-a642-d7953f238dcb", "_rev": "2-b445b914d84d58c7db8287775de26be7", "type": "region", "code": "510923", "name": "大英县", "parent_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "ab7eeb59-39a8-4f79-a642-d7953f238dcb"], "path_name": ["中国", "四川省", "遂宁市", "大英县"], "status": "active", "sort": 480, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "c72d460d-befa-458b-b824-8520def844cb", "_rev": "2-9c2550e9e8910ba7ff8b448b4dcddca0", "type": "region", "code": "140923", "name": "代县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "c72d460d-befa-458b-b824-8520def844cb"], "path_name": ["中国", "山西省", "忻州市", "代县"], "status": "active", "sort": 484, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "e994d4e8-7322-4d84-b207-752089b0386a", "_rev": "2-0b8f15f8060e2f79e340765aec3a220f", "type": "region", "code": "370911", "name": "岱岳区", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "e994d4e8-7322-4d84-b207-752089b0386a"], "path_name": ["中国", "山东省", "泰安市", "岱岳区"], "status": "active", "sort": 488, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "f09852c1-7f77-461a-b00e-41ea637dc513", "_rev": "2-0590f1ef8833ac7984d8ddaf51a39db3", "type": "region", "code": "360723", "name": "大余县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "f09852c1-7f77-461a-b00e-41ea637dc513"], "path_name": ["中国", "江西省", "赣州市", "大余县"], "status": "active", "sort": 481, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "_rev": "2-ef2e2adc3a818e10bdc2129a1868c5d3", "type": "region", "code": "321100", "name": "镇江市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137"], "path_name": ["中国", "江苏省", "镇江市"], "status": "active", "sort": 496, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:34"} +{"_id": "0fd66bbb-d631-4849-9ab5-89eb33cd528d", "_rev": "2-cf603acd5bf376458724d35495c86582", "type": "region", "code": "513326", "name": "道孚县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "0fd66bbb-d631-4849-9ab5-89eb33cd528d"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "道孚县"], "status": "active", "sort": 510, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "3c8e193c-c754-47a9-9d46-7cae71605bad", "_rev": "2-34706d8928d41e1847cf11885d65967d", "type": "region", "code": "621223", "name": "宕昌县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "3c8e193c-c754-47a9-9d46-7cae71605bad"], "path_name": ["中国", "甘肃省", "陇南市", "宕昌县"], "status": "active", "sort": 509, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "41b97784-3f27-4543-9ddb-27d391c9daa0", "_rev": "2-7fa03a6f15887142bc8b06a30890d50d", "type": "region", "code": "513337", "name": "稻城县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "41b97784-3f27-4543-9ddb-27d391c9daa0"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "稻城县"], "status": "active", "sort": 516, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "493b8190-768b-4708-8d6b-3c9e1e09321e", "_rev": "2-4545827b19f29f038cf1c01611ac05d3", "type": "region", "code": "460400", "name": "儋州市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "493b8190-768b-4708-8d6b-3c9e1e09321e"], "path_name": ["中国", "海南省", "儋州市"], "status": "active", "sort": 502, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "524dd9e1-6649-4715-82a5-76efa25f3642", "_rev": "2-fff5e96b322bc23d2916da6f20b6a4f4", "type": "region", "code": "520325", "name": "道真仡佬族苗族自治县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "524dd9e1-6649-4715-82a5-76efa25f3642"], "path_name": ["中国", "贵州省", "遵义市", "道真仡佬族苗族自治县"], "status": "active", "sort": 515, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "56df4ef9-dca6-42b8-9657-b1e092e34773", "_rev": "2-8fd81ef497e376b34ca4bd09c06160f0", "type": "region", "code": "431124", "name": "道县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "56df4ef9-dca6-42b8-9657-b1e092e34773"], "path_name": ["中国", "湖南省", "永州市", "道县"], "status": "active", "sort": 514, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "61ce15db-6026-459c-b629-76f1a63830e6", "_rev": "2-6348f75aaf5396a5196b99db03d19464", "type": "region", "code": "513338", "name": "得荣县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "61ce15db-6026-459c-b629-76f1a63830e6"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "得荣县"], "status": "active", "sort": 517, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "6569caaa-f95e-4de1-b392-f8453dcb4cfa", "_rev": "2-8ebd88f15e2e246620f1dc502a1508bc", "type": "region", "code": "230104", "name": "道外区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "6569caaa-f95e-4de1-b392-f8453dcb4cfa"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "道外区"], "status": "active", "sort": 512, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "7bf5cd0d-513c-4091-b78a-0ae3f479a7bd", "_rev": "2-1d9ff599db137bc94682ec0f8a032d4f", "type": "region", "code": "513424", "name": "德昌县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "7bf5cd0d-513c-4091-b78a-0ae3f479a7bd"], "path_name": ["中国", "四川省", "凉山彝族自治州", "德昌县"], "status": "active", "sort": 521, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "8743b1e5-bbdc-4b17-b6c6-e99680514332", "_rev": "2-776b7813de091a9e5af2e7eeacc5471d", "type": "region", "code": "340521", "name": "当涂县", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "8743b1e5-bbdc-4b17-b6c6-e99680514332"], "path_name": ["中国", "安徽省", "马鞍山市", "当涂县"], "status": "active", "sort": 503, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "_rev": "2-fcb7f80c6f4512e3525bd2dfa3e7501b", "type": "region", "code": "451000", "name": "百色市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f"], "path_name": ["中国", "广西壮族自治区", "百色市"], "status": "active", "sort": 519, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "98c8c749-2269-4b77-b822-1e19dc124c3d", "_rev": "2-79d74235e1b5cae29dcf055db4259f3d", "type": "region", "code": "230102", "name": "道里区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "98c8c749-2269-4b77-b822-1e19dc124c3d"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "道里区"], "status": "active", "sort": 511, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "a49760cf-60fc-4a2b-a3f6-0f192401c9e6", "_rev": "2-54c2dd7f9015480673cf72769777ffc7", "type": "region", "code": "360426", "name": "德安县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "a49760cf-60fc-4a2b-a3f6-0f192401c9e6"], "path_name": ["中国", "江西省", "九江市", "德安县"], "status": "active", "sort": 518, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "_rev": "2-fd21067a485ced0e47dd57bdfa77be52", "type": "region", "code": "431100", "name": "永州市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2"], "path_name": ["中国", "湖南省", "永州市"], "status": "active", "sort": 513, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "c309e2d4-2069-405a-8ea0-6435571c0f7c", "_rev": "2-97fe781c52fd29c75e4031bc1133ee7d", "type": "region", "code": "540122", "name": "当雄县", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "c309e2d4-2069-405a-8ea0-6435571c0f7c"], "path_name": ["中国", "西藏自治区", "拉萨市", "当雄县"], "status": "active", "sort": 504, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "c8bac2d5-432d-468a-a510-bbff97dccc44", "_rev": "2-9af242bf3a10fd7ac2605c8f1809cadd", "type": "region", "code": "341321", "name": "砀山县", "parent_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "c8bac2d5-432d-468a-a510-bbff97dccc44"], "path_name": ["中国", "安徽省", "宿州市", "砀山县"], "status": "active", "sort": 508, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "d78a84d2-6f83-46f9-ae02-96897aa7e0a2", "_rev": "2-db0e916ca9747422d29ca17b945ce566", "type": "region", "code": "451024", "name": "德保县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "d78a84d2-6f83-46f9-ae02-96897aa7e0a2"], "path_name": ["中国", "广西壮族自治区", "百色市", "德保县"], "status": "active", "sort": 520, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "e18a7d73-8327-42e4-8b05-d5ab6ae25b27", "_rev": "2-66c3c0db2138e67cff6b0dca9c90531c", "type": "region", "code": "411625", "name": "郸城县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "e18a7d73-8327-42e4-8b05-d5ab6ae25b27"], "path_name": ["中国", "河南省", "周口市", "郸城县"], "status": "active", "sort": 501, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "f5746528-a37f-4a02-a9f9-3c3099504a7b", "_rev": "2-d597111db542fb831df5fa25845c1741", "type": "region", "code": "420582", "name": "当阳市", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "f5746528-a37f-4a02-a9f9-3c3099504a7b"], "path_name": ["中国", "湖北省", "宜昌市", "当阳市"], "status": "active", "sort": 506, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "_rev": "2-7fb411fe8abdd2cf7b456a7b93f1f6a7", "type": "region", "code": "420500", "name": "宜昌市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0"], "path_name": ["中国", "湖北省", "宜昌市"], "status": "active", "sort": 505, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "_rev": "2-20d8caa4fa588a5bbba5db3304edd1db", "type": "region", "code": "341300", "name": "宿州市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f"], "path_name": ["中国", "安徽省", "宿州市"], "status": "active", "sort": 507, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:35"} +{"_id": "128899a7-0417-4c3f-9b99-5b9e0b88e7ee", "_rev": "2-6a4e0f9a38e34f51d68ee6233600240b", "type": "region", "code": "441226", "name": "德庆县", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "128899a7-0417-4c3f-9b99-5b9e0b88e7ee"], "path_name": ["中国", "广东省", "肇庆市", "德庆县"], "status": "active", "sort": 535, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "22541e1f-4305-4e26-ab12-d13e07bca1be", "_rev": "2-fc2252a037866d9fb1f8d594034c5e40", "type": "region", "code": "533400", "name": "迪庆藏族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "22541e1f-4305-4e26-ab12-d13e07bca1be"], "path_name": ["中国", "云南省", "迪庆藏族自治州"], "status": "active", "sort": 531, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "_rev": "2-ae90255d0677fbcd84f964d6d09fc9d3", "type": "region", "code": "361100", "name": "上饶市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5"], "path_name": ["中国", "江西省", "上饶市"], "status": "active", "sort": 536, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "_rev": "2-8c131b948ad57b7309375030ed682728", "type": "region", "code": "220100", "name": "长春市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1"], "path_name": ["中国", "吉林省", "长春市"], "status": "active", "sort": 526, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "36ac83da-69b1-4772-b74a-1eaef1fae68e", "_rev": "2-84182b130cbd1b3c9c45ec44387bde19", "type": "region", "code": "513330", "name": "德格县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "36ac83da-69b1-4772-b74a-1eaef1fae68e"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "德格县"], "status": "active", "sort": 524, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "3ce9a5d6-7b1e-4719-9432-024d31d60589", "_rev": "2-fdf80e206ae99887137d84b2286fdc58", "type": "region", "code": "533422", "name": "德钦县", "parent_id": "22541e1f-4305-4e26-ab12-d13e07bca1be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "22541e1f-4305-4e26-ab12-d13e07bca1be", "3ce9a5d6-7b1e-4719-9432-024d31d60589"], "path_name": ["中国", "云南省", "迪庆藏族自治州", "德钦县"], "status": "active", "sort": 532, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "4160e0c0-ccc1-426e-8b1e-63e6e9bd4a97", "_rev": "2-a0eddcf3a8309c7c57a5b52759667087", "type": "region", "code": "632802", "name": "德令哈市", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "4160e0c0-ccc1-426e-8b1e-63e6e9bd4a97"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "德令哈市"], "status": "active", "sort": 530, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "_rev": "2-9e595d5e58f1b86aa3b89f002353d740", "type": "region", "code": "371400", "name": "德州市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d"], "path_name": ["中国", "山东省", "德州市"], "status": "active", "sort": 522, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "_rev": "2-8895b2549746fa989cb4e88b2c4e5989", "type": "region", "code": "441200", "name": "肇庆市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508"], "path_name": ["中国", "广东省", "肇庆市"], "status": "active", "sort": 534, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "_rev": "2-2599330e5c0c6cd100be132d50b53f27", "type": "region", "code": "632800", "name": "海西蒙古族藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州"], "status": "active", "sort": 529, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "6503905d-ddbc-4c41-98e6-51e4343d9f3a", "_rev": "2-6265a8aec0af5cca24e5bc27fa86d7b8", "type": "region", "code": "211081", "name": "灯塔市", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "6503905d-ddbc-4c41-98e6-51e4343d9f3a"], "path_name": ["中国", "辽宁省", "辽阳市", "灯塔市"], "status": "active", "sort": 538, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "68b409af-cc9c-44dd-9096-1e14578346c8", "_rev": "2-57cc5f48b82b26d040c4de5f5d120b08", "type": "region", "code": "330521", "name": "德清县", "parent_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "68b409af-cc9c-44dd-9096-1e14578346c8"], "path_name": ["中国", "浙江省", "湖州市", "德清县"], "status": "active", "sort": 533, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "6f1a4efe-91d5-4535-bd7b-b6baf1019a0b", "_rev": "2-4383db66925616aaca2bcd0e3b238b6c", "type": "region", "code": "361181", "name": "德兴市", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "6f1a4efe-91d5-4535-bd7b-b6baf1019a0b"], "path_name": ["中国", "江西省", "上饶市", "德兴市"], "status": "active", "sort": 537, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "761b6d00-a6ec-4aed-a267-a09f18b31133", "_rev": "2-5e6d847c77c9839c09ed5d206970db54", "type": "region", "code": "220183", "name": "德惠市", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "761b6d00-a6ec-4aed-a267-a09f18b31133"], "path_name": ["中国", "吉林省", "长春市", "德惠市"], "status": "active", "sort": 527, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "_rev": "2-2b8867ca617dd98780050079d729043b", "type": "region", "code": "411300", "name": "南阳市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed"], "path_name": ["中国", "河南省", "南阳市"], "status": "active", "sort": 541, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "90fdd7f1-b1f2-4d22-bbf2-a3dd4a1324b0", "_rev": "2-3c03412adf9b3ece3756c59d2286e753", "type": "region", "code": "520626", "name": "德江县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "90fdd7f1-b1f2-4d22-bbf2-a3dd4a1324b0"], "path_name": ["中国", "贵州省", "铜仁市", "德江县"], "status": "active", "sort": 528, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "9893cba5-f77b-4f47-942c-682418b1c7c9", "_rev": "2-64aa97a5d5709a1507da55c3108c0a03", "type": "region", "code": "410185", "name": "登封市", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "9893cba5-f77b-4f47-942c-682418b1c7c9"], "path_name": ["中国", "河南省", "郑州市", "登封市"], "status": "active", "sort": 540, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "9f7825f3-6b56-4304-920a-5713304e35dd", "_rev": "2-cfe486df03e7d996624a8681694567a4", "type": "region", "code": "371402", "name": "德城区", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "9f7825f3-6b56-4304-920a-5713304e35dd"], "path_name": ["中国", "山东省", "德州市", "德城区"], "status": "active", "sort": 523, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "_rev": "2-e4ec95c7630245f5eeba7c284ad6b1a4", "type": "region", "code": "410100", "name": "郑州市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3"], "path_name": ["中国", "河南省", "郑州市"], "status": "active", "sort": 539, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "f1234efd-c465-430f-958b-e7f8cf55af48", "_rev": "2-6e44cd5c375156bca4807d9c37e70fcf", "type": "region", "code": "350526", "name": "德化县", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "f1234efd-c465-430f-958b-e7f8cf55af48"], "path_name": ["中国", "福建省", "泉州市", "德化县"], "status": "active", "sort": 525, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:36"} +{"_id": "077330da-438c-4a6d-97ef-af58b83a37b6", "_rev": "2-0267cdc76f820048eec0c158ec513803", "type": "region", "code": "440904", "name": "电白区", "parent_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "077330da-438c-4a6d-97ef-af58b83a37b6"], "path_name": ["中国", "广东省", "茂名市", "电白区"], "status": "active", "sort": 548, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "0d50ae21-fdd5-4443-abac-c94ed455b7a5", "_rev": "2-8bdd80f80ee78d72c2e7ecac728e7d4f", "type": "region", "code": "623024", "name": "迭部县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "0d50ae21-fdd5-4443-abac-c94ed455b7a5"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "迭部县"], "status": "active", "sort": 552, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "24dffe09-642d-4849-95e2-dc0924391534", "_rev": "2-f0b3008ac419790e534f87bf05d316fe", "type": "region", "code": "450300", "name": "桂林市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534"], "path_name": ["中国", "广西壮族自治区", "桂林市"], "status": "active", "sort": 553, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "28337d69-b8b6-4cd4-9a70-9f2a898965d9", "_rev": "2-5aa55a57837b65324441ebfb3899a148", "type": "region", "code": "230304", "name": "滴道区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "28337d69-b8b6-4cd4-9a70-9f2a898965d9"], "path_name": ["中国", "黑龙江省", "鸡西市", "滴道区"], "status": "active", "sort": 545, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "2f733a25-6a58-4dd7-a49b-cebb10ff454e", "_rev": "2-8d948a7a0abe3e0b29e0c7ff9931c672", "type": "region", "code": "420504", "name": "点军区", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "2f733a25-6a58-4dd7-a49b-cebb10ff454e"], "path_name": ["中国", "湖北省", "宜昌市", "点军区"], "status": "active", "sort": 546, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "621bc719-259a-4c8a-9a2b-e77f5436185d", "_rev": "2-251155d2f404fbc952095d17a5831be6", "type": "region", "code": "610825", "name": "定边县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "621bc719-259a-4c8a-9a2b-e77f5436185d"], "path_name": ["中国", "陕西省", "榆林市", "定边县"], "status": "active", "sort": 560, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "636705f7-7059-4365-93d7-c4de93b56e19", "_rev": "2-5063baf509ad7586e42eb336f2e3f369", "type": "region", "code": "469021", "name": "定安县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "636705f7-7059-4365-93d7-c4de93b56e19"], "path_name": ["中国", "海南省", "定安县"], "status": "active", "sort": 558, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "7ad155cc-234c-412a-b034-7c2abd6e4316", "_rev": "2-560cc1f7f50fa4258dc36ad43bfaad42", "type": "region", "code": "330902", "name": "定海区", "parent_id": "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "7ad155cc-234c-412a-b034-7c2abd6e4316"], "path_name": ["中国", "浙江省", "舟山市", "定海区"], "status": "active", "sort": 561, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "7c362650-0a63-4e26-85cc-13ce0671731b", "_rev": "2-efea9ec08ff3c77f83b3fc20bc95754e", "type": "region", "code": "500231", "name": "垫江县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "7c362650-0a63-4e26-85cc-13ce0671731b"], "path_name": ["中国", "重庆市", "垫江县"], "status": "active", "sort": 549, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "7f2533bf-e256-44fd-bee4-376581134d02", "_rev": "2-7d8bf4d4d033a581cfdee1af253b0a94", "type": "region", "code": "623000", "name": "甘南藏族自治州", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02"], "path_name": ["中国", "甘肃省", "甘南藏族自治州"], "status": "active", "sort": 551, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "_rev": "2-a352748ee560402a2e2b8ac28c5f488e", "type": "region", "code": "440900", "name": "茂名市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0"], "path_name": ["中国", "广东省", "茂名市"], "status": "active", "sort": 547, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "abdc2771-40db-4c81-8c43-5be7395d065d", "_rev": "2-1507e93544e3579ff2569c9c6f9d134a", "type": "region", "code": "411381", "name": "邓州市", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "abdc2771-40db-4c81-8c43-5be7395d065d"], "path_name": ["中国", "河南省", "南阳市", "邓州市"], "status": "active", "sort": 542, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "c4cdecc0-f1c9-4723-b618-dd76358aab73", "_rev": "2-13480ce2003ed1f08c9035147a2273fa", "type": "region", "code": "150822", "name": "磴口县", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "c4cdecc0-f1c9-4723-b618-dd76358aab73"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "磴口县"], "status": "active", "sort": 544, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "d258dc14-ae4f-41a7-9414-dd3331ddf870", "_rev": "2-7d179e3c06e77f3526a66dad2fff6626", "type": "region", "code": "430703", "name": "鼎城区", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "d258dc14-ae4f-41a7-9414-dd3331ddf870"], "path_name": ["中国", "湖南省", "常德市", "鼎城区"], "status": "active", "sort": 556, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "e091f012-a03e-4d42-bf40-3e73db388a85", "_rev": "2-8d95e0d71e9f595d5eb8d0e37543c923", "type": "region", "code": "450303", "name": "叠彩区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "e091f012-a03e-4d42-bf40-3e73db388a85"], "path_name": ["中国", "广西壮族自治区", "桂林市", "叠彩区"], "status": "active", "sort": 554, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "_rev": "2-64865b48cfee10523e2b8800df738907", "type": "region", "code": "150800", "name": "巴彦淖尔市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市"], "status": "active", "sort": 543, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "f396a508-b1c1-46ee-b4f3-3cca3c5b6791", "_rev": "2-5d375af70ab4c7bdaef55b79528fd16c", "type": "region", "code": "441203", "name": "鼎湖区", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "f396a508-b1c1-46ee-b4f3-3cca3c5b6791"], "path_name": ["中国", "广东省", "肇庆市", "鼎湖区"], "status": "active", "sort": 557, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "f6d0a924-4c00-455a-b4e1-6b8cb302cc5d", "_rev": "2-02129f79c776e6fbf36d9b5422195d53", "type": "region", "code": "211281", "name": "调兵山市", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "f6d0a924-4c00-455a-b4e1-6b8cb302cc5d"], "path_name": ["中国", "辽宁省", "铁岭市", "调兵山市"], "status": "active", "sort": 550, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "f702df05-ead9-440a-a552-0a0296324d63", "_rev": "2-efb23a9c24034c0b12567359c4616c45", "type": "region", "code": "540324", "name": "丁青县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "f702df05-ead9-440a-a552-0a0296324d63"], "path_name": ["中国", "西藏自治区", "昌都市", "丁青县"], "status": "active", "sort": 555, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "_rev": "2-3416c018993f73692ac9ee2616b5c3ba", "type": "region", "code": "610800", "name": "榆林市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142"], "path_name": ["中国", "陕西省", "榆林市"], "status": "active", "sort": 559, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:37"} +{"_id": "03506f62-5f41-43cf-bda2-8b4bde533775", "_rev": "2-940258f2bba3e1df12463df7ec32cfb7", "type": "region", "code": "540231", "name": "定结县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "03506f62-5f41-43cf-bda2-8b4bde533775"], "path_name": ["中国", "西藏自治区", "日喀则市", "定结县"], "status": "active", "sort": 562, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "05157113-563c-4ba0-9365-b5171f70532a", "_rev": "2-309052a0d2446a9da1eeaa4996b6e094", "type": "region", "code": "130682", "name": "定州市", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "05157113-563c-4ba0-9365-b5171f70532a"], "path_name": ["中国", "河北省", "保定市", "定州市"], "status": "active", "sort": 570, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "0959011d-d74f-42ea-aad7-78ffdb269fb9", "_rev": "2-eb2b93d96f3d7f9dffc1821f41108534", "type": "region", "code": "341125", "name": "定远县", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "0959011d-d74f-42ea-aad7-78ffdb269fb9"], "path_name": ["中国", "安徽省", "滁州市", "定远县"], "status": "active", "sort": 569, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "_rev": "2-f9f43c1c276c698c1edb16a2b6908446", "type": "region", "code": "420800", "name": "荆门市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8"], "path_name": ["中国", "湖北省", "荆门市"], "status": "active", "sort": 574, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "_rev": "2-ec853b47acaf1cf8ba1dfd9fe83f071a", "type": "region", "code": "220400", "name": "辽源市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "12f5e424-1bca-435d-a7b0-ef28a8c3fb67"], "path_name": ["中国", "吉林省", "辽源市"], "status": "active", "sort": 582, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "1dde6b6a-e49e-489e-bba4-f5d4864ff263", "_rev": "2-4bb368d521dbd8b8f9acc178d90198be", "type": "region", "code": "140921", "name": "定襄县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "1dde6b6a-e49e-489e-bba4-f5d4864ff263"], "path_name": ["中国", "山西省", "忻州市", "定襄县"], "status": "active", "sort": 566, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "45aeef7e-d445-4ebc-b4aa-437cde8eb638", "_rev": "2-c4dc9c7ecd8a5c780a8eff484e12f96b", "type": "region", "code": "371524", "name": "东阿县", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "45aeef7e-d445-4ebc-b4aa-437cde8eb638"], "path_name": ["中国", "山东省", "聊城市", "东阿县"], "status": "active", "sort": 571, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "556ed65f-5e04-4802-a42f-5bd04e2e3e9a", "_rev": "2-13194f6f59e5af050967f4ff09142f46", "type": "region", "code": "371502", "name": "东昌府区", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "556ed65f-5e04-4802-a42f-5bd04e2e3e9a"], "path_name": ["中国", "山东省", "聊城市", "东昌府区"], "status": "active", "sort": 576, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "5862d326-fe60-4dce-975d-4c962ae733ed", "_rev": "2-35d9384551cce8e54e0189752cb1ba7d", "type": "region", "code": "540223", "name": "定日县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "5862d326-fe60-4dce-975d-4c962ae733ed"], "path_name": ["中国", "西藏自治区", "日喀则市", "定日县"], "status": "active", "sort": 564, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "60a222e4-b297-4a12-9c1c-8ffbc2a07434", "_rev": "2-f295210f6e128219483489966cc19b15", "type": "region", "code": "130626", "name": "定兴县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "60a222e4-b297-4a12-9c1c-8ffbc2a07434"], "path_name": ["中国", "河北省", "保定市", "定兴县"], "status": "active", "sort": 567, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "6c72e44e-5e41-49f6-bb69-cf95e0aac712", "_rev": "2-e7d613912b8decb122ca35e0e1a11b50", "type": "region", "code": "371703", "name": "定陶区", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "6c72e44e-5e41-49f6-bb69-cf95e0aac712"], "path_name": ["中国", "山东省", "菏泽市", "定陶区"], "status": "active", "sort": 565, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "_rev": "2-8301e43a0250639a39d3be21d27ffde2", "type": "region", "code": "220500", "name": "通化市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31"], "path_name": ["中国", "吉林省", "通化市"], "status": "active", "sort": 577, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "91730b24-be21-4ef0-acd9-d92aac65a29d", "_rev": "2-ec04417aebd78db6662de4061b74ba0c", "type": "region", "code": "469007", "name": "东方市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "91730b24-be21-4ef0-acd9-d92aac65a29d"], "path_name": ["中国", "海南省", "东方市"], "status": "active", "sort": 581, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "997aa817-f9c1-443f-be62-a31154f35344", "_rev": "2-69ef29c04c48244c27e90540665d5abb", "type": "region", "code": "110101", "name": "东城区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "997aa817-f9c1-443f-be62-a31154f35344"], "path_name": ["中国", "北京市", "东城区"], "status": "active", "sort": 579, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "aecdd074-1a52-485d-b552-373268e5c35b", "_rev": "2-18430efba5315b6d1cf8e316f1001e88", "type": "region", "code": "220502", "name": "东昌区", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "aecdd074-1a52-485d-b552-373268e5c35b"], "path_name": ["中国", "吉林省", "通化市", "东昌区"], "status": "active", "sort": 578, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "_rev": "2-460b7a52a23494f0cf73981679dbe9d5", "type": "region", "code": "341100", "name": "滁州市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6"], "path_name": ["中国", "安徽省", "滁州市"], "status": "active", "sort": 568, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "b99706e0-0086-4c7b-958e-f9a40357c940", "_rev": "2-5677c8f06be02448cfea5c426af26c03", "type": "region", "code": "530113", "name": "东川区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "b99706e0-0086-4c7b-958e-f9a40357c940"], "path_name": ["中国", "云南省", "昆明市", "东川区"], "status": "active", "sort": 580, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "bb299be1-7813-4b8d-9851-370819a3cbae", "_rev": "2-48e34ff90d50f896597ef8f68559860d", "type": "region", "code": "360728", "name": "定南县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "bb299be1-7813-4b8d-9851-370819a3cbae"], "path_name": ["中国", "江西省", "赣州市", "定南县"], "status": "active", "sort": 563, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "c67236dd-4064-4d98-8bfd-e4f4e34971ca", "_rev": "2-9bf5432115c3472787df8587bf4bd0e8", "type": "region", "code": "431122", "name": "东安县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "c67236dd-4064-4d98-8bfd-e4f4e34971ca"], "path_name": ["中国", "湖南省", "永州市", "东安县"], "status": "active", "sort": 573, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "d470a82f-f51f-4202-ad11-50374199e0fd", "_rev": "2-24c98512d700eb8e6a45f93b530de89f", "type": "region", "code": "231002", "name": "东安区", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "d470a82f-f51f-4202-ad11-50374199e0fd"], "path_name": ["中国", "黑龙江省", "牡丹江市", "东安区"], "status": "active", "sort": 572, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "fe0d10de-cd28-4875-a437-fec7dda9a7a3", "_rev": "2-dff63461f85a668deda8c5f989c170b8", "type": "region", "code": "420802", "name": "东宝区", "parent_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "fe0d10de-cd28-4875-a437-fec7dda9a7a3"], "path_name": ["中国", "湖北省", "荆门市", "东宝区"], "status": "active", "sort": 575, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:38"} +{"_id": "003991bc-6b92-4d03-9e69-b020d8e9e6c0", "_rev": "2-71b7f66c556c7d3a634a39b6190e348e", "type": "region", "code": "371102", "name": "东港区", "parent_id": "da26105e-dedf-4275-9619-5d4354c2cc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "da26105e-dedf-4275-9619-5d4354c2cc42", "003991bc-6b92-4d03-9e69-b020d8e9e6c0"], "path_name": ["中国", "山东省", "日照市", "东港区"], "status": "active", "sort": 585, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "0cd9ed8a-c4b9-4f34-a3cd-7d03aeb1e49c", "_rev": "2-6b0586bcb1ada5a3eeeedb60271d1de6", "type": "region", "code": "320722", "name": "东海县", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "0cd9ed8a-c4b9-4f34-a3cd-7d03aeb1e49c"], "path_name": ["中国", "江苏省", "连云港市", "东海县"], "status": "active", "sort": 591, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "145d4cef-ffa4-475f-9645-c327ef07e988", "_rev": "2-36abe2a53b994861904ce29271c9d12c", "type": "region", "code": "360102", "name": "东湖区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "145d4cef-ffa4-475f-9645-c327ef07e988"], "path_name": ["中国", "江西省", "南昌市", "东湖区"], "status": "active", "sort": 593, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "2a2f78e1-7344-404f-b864-5a7fa79f50ee", "_rev": "2-ad03f879aab3ed33e5e154c89f631e97", "type": "region", "code": "150202", "name": "东河区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "2a2f78e1-7344-404f-b864-5a7fa79f50ee"], "path_name": ["中国", "内蒙古自治区", "包头市", "东河区"], "status": "active", "sort": 592, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "53a735cd-1f23-46db-83fd-02f1c18fd0e8", "_rev": "2-7a7786316d485b115195bdbfa2f1a956", "type": "region", "code": "120110", "name": "东丽区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "53a735cd-1f23-46db-83fd-02f1c18fd0e8"], "path_name": ["中国", "天津市", "东丽区"], "status": "active", "sort": 595, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "_rev": "2-241cbf5fb5fd6e5198ee6e4f5b1cec1f", "type": "region", "code": "320700", "name": "连云港市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84"], "path_name": ["中国", "江苏省", "连云港市"], "status": "active", "sort": 590, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "604316e5-622a-4c66-b33f-9ffa03833353", "_rev": "2-873e6d5cb0a9570aa99d7af2b5afc8c6", "type": "region", "code": "210681", "name": "东港市", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "604316e5-622a-4c66-b33f-9ffa03833353"], "path_name": ["中国", "辽宁省", "丹东市", "东港市"], "status": "active", "sort": 587, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "68386040-d7c5-4757-bef0-9d1b77ebc6da", "_rev": "2-60dbb037d765e5674cbe4ecc6b23397c", "type": "region", "code": "220421", "name": "东丰县", "parent_id": "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "68386040-d7c5-4757-bef0-9d1b77ebc6da"], "path_name": ["中国", "吉林省", "辽源市", "东丰县"], "status": "active", "sort": 583, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "7f38d0d1-3e2f-42c7-862e-4fc72698ce07", "_rev": "2-9018714d4d1b4541f48f5bb977cad6d0", "type": "region", "code": "451224", "name": "东兰县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "7f38d0d1-3e2f-42c7-862e-4fc72698ce07"], "path_name": ["中国", "广西壮族自治区", "河池市", "东兰县"], "status": "active", "sort": 594, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "83ab771f-7c29-4731-947f-a1c7e9c5ae8c", "_rev": "2-13d01320669877d2df9b894b96e74d7f", "type": "region", "code": "130923", "name": "东光县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "83ab771f-7c29-4731-947f-a1c7e9c5ae8c"], "path_name": ["中国", "河北省", "沧州市", "东光县"], "status": "active", "sort": 589, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "8f6da3d8-2fdf-46d8-9fa4-09bdfe19eab4", "_rev": "2-fcd2e9d62a3df84673187133af6ee92b", "type": "region", "code": "220422", "name": "东辽县", "parent_id": "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "8f6da3d8-2fdf-46d8-9fa4-09bdfe19eab4"], "path_name": ["中国", "吉林省", "辽源市", "东辽县"], "status": "active", "sort": 596, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "973fc85f-b9ce-4d8f-9bb2-d4ff31108f7c", "_rev": "2-506b6e0f356e5de975282ea1f8ae1a98", "type": "region", "code": "441900", "name": "东莞市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "973fc85f-b9ce-4d8f-9bb2-d4ff31108f7c"], "path_name": ["中国", "广东省", "东莞市"], "status": "active", "sort": 588, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "9e3ff75c-1398-4791-ba07-161c591779de", "_rev": "2-b64608a6cc9d95967df524734129a049", "type": "region", "code": "371728", "name": "东明县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "9e3ff75c-1398-4791-ba07-161c591779de"], "path_name": ["中国", "山东省", "菏泽市", "东明县"], "status": "active", "sort": 597, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "da26105e-dedf-4275-9619-5d4354c2cc42", "_rev": "2-d878f85ab5d8eb21fdbfc23c2af2286d", "type": "region", "code": "371100", "name": "日照市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "da26105e-dedf-4275-9619-5d4354c2cc42"], "path_name": ["中国", "山东省", "日照市"], "status": "active", "sort": 584, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "_rev": "2-23e3c830a1faac2be2b9fec70a7850f0", "type": "region", "code": "210600", "name": "丹东市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3"], "path_name": ["中国", "辽宁省", "丹东市"], "status": "active", "sort": 586, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:39"} +{"_id": "19375806-f12d-48a5-a6e6-c376e0b720fb", "_rev": "2-321572f5bd49ab05befb00621c53e998", "type": "region", "code": "450600", "name": "防城港市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "19375806-f12d-48a5-a6e6-c376e0b720fb"], "path_name": ["中国", "广西壮族自治区", "防城港市"], "status": "active", "sort": 614, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "1997d3c4-32f6-4ea3-bc05-6ce4cd9e4080", "_rev": "2-aee31014e6f9d182dd2eb419b6434655", "type": "region", "code": "511011", "name": "东兴区", "parent_id": "73916687-f3ab-40c0-823d-537abee71925", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925", "1997d3c4-32f6-4ea3-bc05-6ce4cd9e4080"], "path_name": ["中国", "四川省", "内江市", "东兴区"], "status": "active", "sort": 613, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "2f08b180-c3d7-498d-b4ab-cb224b3db164", "_rev": "2-4664f3ff74e912b9cb8e80e094ba7199", "type": "region", "code": "320981", "name": "东台市", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "2f08b180-c3d7-498d-b4ab-cb224b3db164"], "path_name": ["中国", "江苏省", "盐城市", "东台市"], "status": "active", "sort": 606, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "3ae50cbf-6928-4078-b213-6b9c0ac5ba2d", "_rev": "2-989c65cb47d61478d6d69ba6a1c79d98", "type": "region", "code": "622926", "name": "东乡族自治县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "3ae50cbf-6928-4078-b213-6b9c0ac5ba2d"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "东乡族自治县"], "status": "active", "sort": 611, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "3c989685-5b0b-4f1b-ac30-69e9e5d2759c", "_rev": "2-959b3998de6ee32b301d45ad2bb5378e", "type": "region", "code": "330783", "name": "东阳市", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "3c989685-5b0b-4f1b-ac30-69e9e5d2759c"], "path_name": ["中国", "浙江省", "金华市", "东阳市"], "status": "active", "sort": 617, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "64895135-5878-442f-b588-bd6f5b5c8b7d", "_rev": "2-4243b2ea1ebce7df85e8e49e97893c61", "type": "region", "code": "231086", "name": "东宁市", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "64895135-5878-442f-b588-bd6f5b5c8b7d"], "path_name": ["中国", "黑龙江省", "牡丹江市", "东宁市"], "status": "active", "sort": 598, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "73916687-f3ab-40c0-823d-537abee71925", "_rev": "2-0b0d7c5fc10867d852a8513295f6d3c6", "type": "region", "code": "511000", "name": "内江市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925"], "path_name": ["中国", "四川省", "内江市"], "status": "active", "sort": 612, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "_rev": "2-aa42d445a85ed673355c129872f6363b", "type": "region", "code": "510400", "name": "攀枝花市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971"], "path_name": ["中国", "四川省", "攀枝花市"], "status": "active", "sort": 601, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "974de2b5-f97e-474b-b0dd-cd4de2e463ae", "_rev": "2-4b9c8c7e04bb68e688d4610d07a203b4", "type": "region", "code": "350626", "name": "东山县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "974de2b5-f97e-474b-b0dd-cd4de2e463ae"], "path_name": ["中国", "福建省", "漳州市", "东山县"], "status": "active", "sort": 604, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "_rev": "2-a97e27170b6cb96bd474ad24c5bf7517", "type": "region", "code": "330700", "name": "金华市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64"], "path_name": ["中国", "浙江省", "金华市"], "status": "active", "sort": 616, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "aa7bd3b3-d2c1-46c9-9496-d16ed1166f14", "_rev": "2-dd6f551504a1a2ecb3d923ad39d7591e", "type": "region", "code": "150602", "name": "东胜区", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "aa7bd3b3-d2c1-46c9-9496-d16ed1166f14"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "东胜区"], "status": "active", "sort": 605, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "b99a2f88-1f59-4521-8c91-14b660d6d6c5", "_rev": "2-25d16f6e549ba023a4e9cc46f944e49f", "type": "region", "code": "450681", "name": "东兴市", "parent_id": "19375806-f12d-48a5-a6e6-c376e0b720fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "19375806-f12d-48a5-a6e6-c376e0b720fb", "b99a2f88-1f59-4521-8c91-14b660d6d6c5"], "path_name": ["中国", "广西壮族自治区", "防城港市", "东兴市"], "status": "active", "sort": 615, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "cc4e89a7-41cf-4ff3-af64-828531d694bc", "_rev": "2-10b25e1c2f3462f40212a77b56ec1f3b", "type": "region", "code": "152525", "name": "东乌珠穆沁旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "cc4e89a7-41cf-4ff3-af64-828531d694bc"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "东乌珠穆沁旗"], "status": "active", "sort": 607, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "cf34b82d-8a49-4ae9-a6ff-9791a0d508c0", "_rev": "2-e16677928e2b7bd02693257d1a13dc43", "type": "region", "code": "420112", "name": "东西湖区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "cf34b82d-8a49-4ae9-a6ff-9791a0d508c0"], "path_name": ["中国", "湖北省", "武汉市", "东西湖区"], "status": "active", "sort": 608, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "_rev": "2-286f4d79de27559521eb0795aeae8cd3", "type": "region", "code": "622900", "name": "临夏回族自治州", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838"], "path_name": ["中国", "甘肃省", "临夏回族自治州"], "status": "active", "sort": 610, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "e2e7c5ec-1c31-4941-990c-3dd17f26e95d", "_rev": "2-b016c60f9f51df0f14d168597b371f45", "type": "region", "code": "511402", "name": "东坡区", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "e2e7c5ec-1c31-4941-990c-3dd17f26e95d"], "path_name": ["中国", "四川省", "眉山市", "东坡区"], "status": "active", "sort": 600, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "e5ddfed7-3d69-4c1a-a16d-ac0471f7fb76", "_rev": "2-77b0c7b8faf0cf8c851aa6f998155a4b", "type": "region", "code": "370923", "name": "东平县", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "e5ddfed7-3d69-4c1a-a16d-ac0471f7fb76"], "path_name": ["中国", "山东省", "泰安市", "东平县"], "status": "active", "sort": 599, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "e97e1e61-4247-4aaf-bd58-a7e8b2437edd", "_rev": "2-5097e8025add37bdeaeb7dde6676ed4d", "type": "region", "code": "510402", "name": "东区", "parent_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971", "e97e1e61-4247-4aaf-bd58-a7e8b2437edd"], "path_name": ["中国", "四川省", "攀枝花市", "东区"], "status": "active", "sort": 602, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "_rev": "2-90152b21aa68caa3438d621c25759caa", "type": "region", "code": "350600", "name": "漳州市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d"], "path_name": ["中国", "福建省", "漳州市"], "status": "active", "sort": 603, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "fb937903-bc5d-4fb9-8a84-8c24b7ca1043", "_rev": "2-93e3169accf40639ecbb2cb2eff9e930", "type": "region", "code": "361003", "name": "东乡区", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "fb937903-bc5d-4fb9-8a84-8c24b7ca1043"], "path_name": ["中国", "江西省", "抚州市", "东乡区"], "status": "active", "sort": 609, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:40"} +{"_id": "3997ac58-1663-4849-82e4-4aa5c60e5e9f", "_rev": "2-a093d8ff390d1c07356c8405984c603f", "type": "region", "code": "440403", "name": "斗门区", "parent_id": "b7fabac9-498e-46d6-b70c-57d75f45f857", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7fabac9-498e-46d6-b70c-57d75f45f857", "3997ac58-1663-4849-82e4-4aa5c60e5e9f"], "path_name": ["中国", "广东省", "珠海市", "斗门区"], "status": "active", "sort": 635, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "3c998e08-d3ce-40c8-8cf4-03a606c8d4f6", "_rev": "2-1630c5245e56c2f14f91b0227712cd59", "type": "region", "code": "451228", "name": "都安瑶族自治县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "3c998e08-d3ce-40c8-8cf4-03a606c8d4f6"], "path_name": ["中国", "广西壮族自治区", "河池市", "都安瑶族自治县"], "status": "active", "sort": 628, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "_rev": "2-28183eb1addc659f3a1ddb7fccab2d16", "type": "region", "code": "341700", "name": "池州市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "41f74115-fc6b-4ba3-87f9-2f8df90f1cce"], "path_name": ["中国", "安徽省", "池州市"], "status": "active", "sort": 622, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "6133532c-af38-48df-94e3-69733cb1b758", "_rev": "2-661c6001d5c612bd98b09b1b25911855", "type": "region", "code": "441600", "name": "河源市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758"], "path_name": ["中国", "广东省", "河源市"], "status": "active", "sort": 620, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "675127df-acd3-42fc-960a-d149c67e1423", "_rev": "2-c52d712d80615001a4d37ed0011071c0", "type": "region", "code": "632822", "name": "都兰县", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "675127df-acd3-42fc-960a-d149c67e1423"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "都兰县"], "status": "active", "sort": 631, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "7c5c13db-3c6e-419b-b402-844e30d76831", "_rev": "2-8e66ba4a2dee60abea37683fb6fa966b", "type": "region", "code": "510181", "name": "都江堰市", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "7c5c13db-3c6e-419b-b402-844e30d76831"], "path_name": ["中国", "四川省", "成都市", "都江堰市"], "status": "active", "sort": 630, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "80a6a4b9-062a-4eaa-8997-f2b0875ba174", "_rev": "2-f4cdd3e430344ca5a95249085bb9c5f0", "type": "region", "code": "341721", "name": "东至县", "parent_id": "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "80a6a4b9-062a-4eaa-8997-f2b0875ba174"], "path_name": ["中国", "安徽省", "池州市", "东至县"], "status": "active", "sort": 623, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "_rev": "2-40f2f5be97fcc7e3c7b5a46568389ab2", "type": "region", "code": "370500", "name": "东营市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd"], "path_name": ["中国", "山东省", "东营市"], "status": "active", "sort": 618, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "b0c626b6-4570-4360-8508-3225ec8df7a2", "_rev": "2-2cb65df10d223e17add97ebd7a088fc2", "type": "region", "code": "360428", "name": "都昌县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "b0c626b6-4570-4360-8508-3225ec8df7a2"], "path_name": ["中国", "江西省", "九江市", "都昌县"], "status": "active", "sort": 629, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "b3efe505-ca40-4ee4-a85c-d3a6f27cfe2c", "_rev": "2-7c2d3601746a7a6598225f7c7aff6ec8", "type": "region", "code": "330305", "name": "洞头区", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "b3efe505-ca40-4ee4-a85c-d3a6f27cfe2c"], "path_name": ["中国", "浙江省", "温州市", "洞头区"], "status": "active", "sort": 627, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "b7fabac9-498e-46d6-b70c-57d75f45f857", "_rev": "2-75114916c3e039de7e73e35c2ad5e447", "type": "region", "code": "440400", "name": "珠海市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7fabac9-498e-46d6-b70c-57d75f45f857"], "path_name": ["中国", "广东省", "珠海市"], "status": "active", "sort": 634, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "d528cffb-8ed8-4398-ba02-37602221204a", "_rev": "2-42896c27f911eee97ebc2896d97775f7", "type": "region", "code": "430525", "name": "洞口县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "d528cffb-8ed8-4398-ba02-37602221204a"], "path_name": ["中国", "湖南省", "邵阳市", "洞口县"], "status": "active", "sort": 626, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "e0c8f6f0-d34a-4903-8345-d25f6911ac81", "_rev": "2-a3a57a7bcf85e597cdbeeae55cd3ec14", "type": "region", "code": "441625", "name": "东源县", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "e0c8f6f0-d34a-4903-8345-d25f6911ac81"], "path_name": ["中国", "广东省", "河源市", "东源县"], "status": "active", "sort": 621, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "e945db87-58a2-4a2c-972b-0c62d0b91670", "_rev": "2-d7ab939de5e19c1063aa7a1068ad4419", "type": "region", "code": "370502", "name": "东营区", "parent_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "e945db87-58a2-4a2c-972b-0c62d0b91670"], "path_name": ["中国", "山东省", "东营市", "东营区"], "status": "active", "sort": 619, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "_rev": "2-b48c84ba0a57a08597b0f44e3053344c", "type": "region", "code": "210400", "name": "抚顺市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050"], "path_name": ["中国", "辽宁省", "抚顺市"], "status": "active", "sort": 624, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "ee3700da-6caa-4a54-97a1-efa3e59ce324", "_rev": "2-90882ef50386635e745167ead4ba678c", "type": "region", "code": "522701", "name": "都匀市", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "ee3700da-6caa-4a54-97a1-efa3e59ce324"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "都匀市"], "status": "active", "sort": 633, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "f3a60227-a40b-47de-9d4d-a5df42919794", "_rev": "2-252afe434ccc2e782e96f2514680448c", "type": "region", "code": "210403", "name": "东洲区", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "f3a60227-a40b-47de-9d4d-a5df42919794"], "path_name": ["中国", "辽宁省", "抚顺市", "东洲区"], "status": "active", "sort": 625, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "_rev": "2-dfcecf07c466af780dbedf4556881fb7", "type": "region", "code": "522700", "name": "黔南布依族苗族自治州", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州"], "status": "active", "sort": 632, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:41"} +{"_id": "135157e8-4e9f-48ac-affe-e5050731880b", "_rev": "2-40eb29216d2c7d43237e915eac4fed25", "type": "region", "code": "511132", "name": "峨边彝族自治县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "135157e8-4e9f-48ac-affe-e5050731880b"], "path_name": ["中国", "四川省", "乐山市", "峨边彝族自治县"], "status": "active", "sort": 649, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "_rev": "2-e13e4ebfc186963317015642ac97e92a", "type": "region", "code": "511100", "name": "乐山市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39"], "path_name": ["中国", "四川省", "乐山市"], "status": "active", "sort": 648, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "301d4912-cdd6-42d9-b1df-502024535742", "_rev": "2-82b4f1c0ba70adaa6587f061124f3130", "type": "region", "code": "152923", "name": "额济纳旗", "parent_id": "20717576-6c3c-4caf-8644-0b3adbaac192", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "20717576-6c3c-4caf-8644-0b3adbaac192", "301d4912-cdd6-42d9-b1df-502024535742"], "path_name": ["中国", "内蒙古自治区", "阿拉善盟", "额济纳旗"], "status": "active", "sort": 653, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "33871616-37dd-4792-9f85-b11424492fb0", "_rev": "2-c80fe6bd60123f6d5c768b4a2129e4a0", "type": "region", "code": "340602", "name": "杜集区", "parent_id": "5a306b32-cd23-49dc-910d-326cd0c36b00", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "5a306b32-cd23-49dc-910d-326cd0c36b00", "33871616-37dd-4792-9f85-b11424492fb0"], "path_name": ["中国", "安徽省", "淮北市", "杜集区"], "status": "active", "sort": 641, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "_rev": "2-31af8f891647821ef3e45f1780a3ea68", "type": "region", "code": "654200", "name": "塔城地区", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区"], "status": "active", "sort": 654, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "411044bb-7382-444f-a0c7-c378b255b78e", "_rev": "2-99a591c48d37c933fb3228eb34eadff7", "type": "region", "code": "650202", "name": "独山子区", "parent_id": "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "411044bb-7382-444f-a0c7-c378b255b78e"], "path_name": ["中国", "新疆维吾尔自治区", "克拉玛依市", "独山子区"], "status": "active", "sort": 637, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "5a306b32-cd23-49dc-910d-326cd0c36b00", "_rev": "2-8ad2dfd93483166dc3d0a922dbdead96", "type": "region", "code": "340600", "name": "淮北市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "5a306b32-cd23-49dc-910d-326cd0c36b00"], "path_name": ["中国", "安徽省", "淮北市"], "status": "active", "sort": 640, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "_rev": "2-3b6b2d0683a969e8f2a1b93fc80d987a", "type": "region", "code": "230600", "name": "大庆市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313"], "path_name": ["中国", "黑龙江省", "大庆市"], "status": "active", "sort": 638, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "5d72996f-caba-4cc2-b6b0-6fefb8890084", "_rev": "2-ee52fcb4359064606003617bcf6f9c88", "type": "region", "code": "230624", "name": "杜尔伯特蒙古族自治县", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "5d72996f-caba-4cc2-b6b0-6fefb8890084"], "path_name": ["中国", "黑龙江省", "大庆市", "杜尔伯特蒙古族自治县"], "status": "active", "sort": 639, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "60e1a132-ff48-4a01-951e-d14e8b792464", "_rev": "2-ad8229772e3997cf8250abb450924179", "type": "region", "code": "530426", "name": "峨山彝族自治县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "60e1a132-ff48-4a01-951e-d14e8b792464"], "path_name": ["中国", "云南省", "玉溪市", "峨山彝族自治县"], "status": "active", "sort": 651, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "6b7222b9-7344-442b-82d6-82beb79423cc", "_rev": "2-b9afa2dd1748ffe28a7d9275590ad986", "type": "region", "code": "420804", "name": "掇刀区", "parent_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "6b7222b9-7344-442b-82d6-82beb79423cc"], "path_name": ["中国", "湖北省", "荆门市", "掇刀区"], "status": "active", "sort": 647, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "885e7913-1753-4c55-8f3b-490c154eb573", "_rev": "2-1f8b6b25d24de88da3578777bd3798ec", "type": "region", "code": "152531", "name": "多伦县", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "885e7913-1753-4c55-8f3b-490c154eb573"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "多伦县"], "status": "active", "sort": 646, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "98f75f39-89e8-488b-8e52-d5e17b4fb53f", "_rev": "2-d5d2763f252eb8440ff5df58746d55a9", "type": "region", "code": "150784", "name": "额尔古纳市", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "98f75f39-89e8-488b-8e52-d5e17b4fb53f"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "额尔古纳市"], "status": "active", "sort": 652, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "9ead59af-e61a-4730-905f-84a1a3332b88", "_rev": "2-14ec01de01defe207137e7fc34ed00e6", "type": "region", "code": "222403", "name": "敦化市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "9ead59af-e61a-4730-905f-84a1a3332b88"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "敦化市"], "status": "active", "sort": 644, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "b71e5d5c-5c21-4db9-ba43-1096765caaa1", "_rev": "2-42cb1c27b09b1c25ce879df84342c7af", "type": "region", "code": "522726", "name": "独山县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "b71e5d5c-5c21-4db9-ba43-1096765caaa1"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "独山县"], "status": "active", "sort": 636, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "d36de8dc-c85d-4998-8d74-6f6274bad5d5", "_rev": "2-232ab77512550d76e7af52e29cc90bd0", "type": "region", "code": "441202", "name": "端州区", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "d36de8dc-c85d-4998-8d74-6f6274bad5d5"], "path_name": ["中国", "广东省", "肇庆市", "端州区"], "status": "active", "sort": 642, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "db73770a-2027-4087-8c59-1d033269000a", "_rev": "2-99309ad8cc781e49b1df359b7ab00d28", "type": "region", "code": "511181", "name": "峨眉山市", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "db73770a-2027-4087-8c59-1d033269000a"], "path_name": ["中国", "四川省", "乐山市", "峨眉山市"], "status": "active", "sort": 650, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "ee9d3397-d3af-431d-8a35-cc6a61785d88", "_rev": "2-9e42b1d7dc35337c92907551460d5ec3", "type": "region", "code": "540103", "name": "堆龙德庆区", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "ee9d3397-d3af-431d-8a35-cc6a61785d88"], "path_name": ["中国", "西藏自治区", "拉萨市", "堆龙德庆区"], "status": "active", "sort": 643, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "f0ab7a69-6ac2-4a72-9148-183591d962a4", "_rev": "2-c2d7ddc170df343236e193225448ef35", "type": "region", "code": "620982", "name": "敦煌市", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "f0ab7a69-6ac2-4a72-9148-183591d962a4"], "path_name": ["中国", "甘肃省", "酒泉市", "敦煌市"], "status": "active", "sort": 645, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:42"} +{"_id": "1239c7ad-73e0-42d3-884e-121752434d5b", "_rev": "2-008530b3d4336c6b17dc562bc8bd11ed", "type": "region", "code": "150723", "name": "鄂伦春自治旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "1239c7ad-73e0-42d3-884e-121752434d5b"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "鄂伦春自治旗"], "status": "active", "sort": 658, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "12f36f3c-a254-45f1-827b-539d5274a26a", "_rev": "2-1bbbcd3ad7bb3e6c6805cc94432a8efa", "type": "region", "code": "150623", "name": "鄂托克前旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "12f36f3c-a254-45f1-827b-539d5274a26a"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "鄂托克前旗"], "status": "active", "sort": 660, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "1a992b84-b6fa-4b70-a417-e12146b69107", "_rev": "2-70682ce37e7f25c80cdc09df6e195bb4", "type": "region", "code": "152501", "name": "二连浩特市", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "1a992b84-b6fa-4b70-a417-e12146b69107"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "二连浩特市"], "status": "active", "sort": 669, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "268b2f47-849e-4360-bb29-d845936c3aa2", "_rev": "2-203202daf294c83041aea8a317762b99", "type": "region", "code": "220105", "name": "二道区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "268b2f47-849e-4360-bb29-d845936c3aa2"], "path_name": ["中国", "吉林省", "长春市", "二道区"], "status": "active", "sort": 668, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "_rev": "2-cd2b18b3335631b280519d51606c245d", "type": "region", "code": "420700", "name": "鄂州市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8"], "path_name": ["中国", "湖北省", "鄂州市"], "status": "active", "sort": 656, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "4c5597b5-8495-433f-9f30-21e2c6cc51fe", "_rev": "2-99ed98e8c5a96e662037597145df791f", "type": "region", "code": "420606", "name": "樊城区", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "4c5597b5-8495-433f-9f30-21e2c6cc51fe"], "path_name": ["中国", "湖北省", "襄阳市", "樊城区"], "status": "active", "sort": 673, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "58a5f5bf-1b05-454a-a8a5-7dcd3654d44d", "_rev": "2-24d91ad3718ced2f4e09659b38e578b0", "type": "region", "code": "511903", "name": "恩阳区", "parent_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "58a5f5bf-1b05-454a-a8a5-7dcd3654d44d"], "path_name": ["中国", "四川省", "巴中市", "恩阳区"], "status": "active", "sort": 665, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "60b84725-e41b-4a59-a7f6-0f4669659ff0", "_rev": "2-2d0c7e2908e477c656822a2f89b96369", "type": "region", "code": "210124", "name": "法库县", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "60b84725-e41b-4a59-a7f6-0f4669659ff0"], "path_name": ["中国", "辽宁省", "沈阳市", "法库县"], "status": "active", "sort": 671, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "6f05eb18-6596-4b79-813b-6b8d2a93289e", "_rev": "2-4e1859ad663217fa0d1d94723c9d68a4", "type": "region", "code": "420704", "name": "鄂城区", "parent_id": "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "6f05eb18-6596-4b79-813b-6b8d2a93289e"], "path_name": ["中国", "湖北省", "鄂州市", "鄂城区"], "status": "active", "sort": 657, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "_rev": "2-4de0888367f04b4894c2fa05d4d2b25b", "type": "region", "code": "440700", "name": "江门市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42"], "path_name": ["中国", "广东省", "江门市"], "status": "active", "sort": 662, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "935424ef-67a8-4c92-8c33-c4ba49c8a6d0", "_rev": "2-1d2a4de4d54879e47eb17f05ff283e74", "type": "region", "code": "440113", "name": "番禺区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "935424ef-67a8-4c92-8c33-c4ba49c8a6d0"], "path_name": ["中国", "广东省", "广州市", "番禺区"], "status": "active", "sort": 672, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "93c8e507-aeff-4df4-a619-1a0b948db736", "_rev": "2-f327080b45a4f740f4fbaa895968cf4d", "type": "region", "code": "532930", "name": "洱源县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "93c8e507-aeff-4df4-a619-1a0b948db736"], "path_name": ["中国", "云南省", "大理白族自治州", "洱源县"], "status": "active", "sort": 666, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "afb40f8e-859f-4330-9327-b8ae61e6c766", "_rev": "2-81c192b3516a8cbdf31fe308dd58cbe1", "type": "region", "code": "410103", "name": "二七区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "afb40f8e-859f-4330-9327-b8ae61e6c766"], "path_name": ["中国", "河南省", "郑州市", "二七区"], "status": "active", "sort": 670, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "ce6be762-ac90-499f-b4cb-8476e3bd4dd0", "_rev": "2-466f734bda969c8a3b3e58ddc583f5e3", "type": "region", "code": "654221", "name": "额敏县", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "ce6be762-ac90-499f-b4cb-8476e3bd4dd0"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "额敏县"], "status": "active", "sort": 655, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "d45bff4d-2fa6-4434-8ff0-cebd38b104e8", "_rev": "2-e81c9d16239ebafa3e49372cbb875aca", "type": "region", "code": "422801", "name": "恩施市", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "d45bff4d-2fa6-4434-8ff0-cebd38b104e8"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "恩施市"], "status": "active", "sort": 664, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "d6db403b-1a58-4428-8ee7-8b0927e1c590", "_rev": "2-8827b96123274a733321181011cbe61f", "type": "region", "code": "440785", "name": "恩平市", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "d6db403b-1a58-4428-8ee7-8b0927e1c590"], "path_name": ["中国", "广东省", "江门市", "恩平市"], "status": "active", "sort": 663, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "db40e6ae-c982-44e1-8e3e-2dcc45653def", "_rev": "2-6e9714033ba550cdff9c3606959a910e", "type": "region", "code": "220503", "name": "二道江区", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "db40e6ae-c982-44e1-8e3e-2dcc45653def"], "path_name": ["中国", "吉林省", "通化市", "二道江区"], "status": "active", "sort": 667, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "f39bfc20-1137-4aee-9491-1ee6c7c60581", "_rev": "2-e7bb0117c66c3a95dfdf0d7dd631011d", "type": "region", "code": "150624", "name": "鄂托克旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "f39bfc20-1137-4aee-9491-1ee6c7c60581"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "鄂托克旗"], "status": "active", "sort": 659, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "f7e4808a-f9ef-457a-b8df-257f80f908dc", "_rev": "2-68af0e83dbb43dfb07061ccc3d9263b5", "type": "region", "code": "150724", "name": "鄂温克族自治旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "f7e4808a-f9ef-457a-b8df-257f80f908dc"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "鄂温克族自治旗"], "status": "active", "sort": 661, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:43"} +{"_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "_rev": "2-e155643ab2f9093284d222f2c0368b43", "type": "region", "code": "340200", "name": "芜湖市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06"], "path_name": ["中国", "安徽省", "芜湖市"], "status": "active", "sort": 674, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "256613b1-7188-4fa8-81bc-0278e7663f16", "_rev": "2-b6048be8675e6bb679f5dd64a13234f3", "type": "region", "code": "141128", "name": "方山县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "256613b1-7188-4fa8-81bc-0278e7663f16"], "path_name": ["中国", "山西省", "吕梁市", "方山县"], "status": "active", "sort": 681, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "2db3ba81-4c80-4b0f-bd8a-b6a0eff759f0", "_rev": "2-dac9376f12bdc666ad637e0133e7867f", "type": "region", "code": "230124", "name": "方正县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "2db3ba81-4c80-4b0f-bd8a-b6a0eff759f0"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "方正县"], "status": "active", "sort": 682, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "3de12123-b4c3-45eb-bd70-b930a3c3af38", "_rev": "2-1de9bcc187626dc770d9a3da910071e9", "type": "region", "code": "410926", "name": "范县", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "3de12123-b4c3-45eb-bd70-b930a3c3af38"], "path_name": ["中国", "河南省", "濮阳市", "范县"], "status": "active", "sort": 678, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "_rev": "2-550e64629a7c1028c0cc30151b9b8bb0", "type": "region", "code": "371300", "name": "临沂市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5"], "path_name": ["中国", "山东省", "临沂市"], "status": "active", "sort": 691, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "585210c7-1190-47b5-b60d-7274e9e79a1e", "_rev": "2-aba1b6b98a1df48ea354a57611fd9075", "type": "region", "code": "370983", "name": "肥城市", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "585210c7-1190-47b5-b60d-7274e9e79a1e"], "path_name": ["中国", "山东省", "泰安市", "肥城市"], "status": "active", "sort": 687, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "5fa833b8-5b9d-431a-a1ac-f663dd99cff2", "_rev": "2-9fd16502487f624ac4a2e9580249d516", "type": "region", "code": "411322", "name": "方城县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "5fa833b8-5b9d-431a-a1ac-f663dd99cff2"], "path_name": ["中国", "河南省", "南阳市", "方城县"], "status": "active", "sort": 679, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "_rev": "2-07d8e799ae5d3bd5381745379da78688", "type": "region", "code": "141100", "name": "吕梁市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d"], "path_name": ["中国", "山西省", "吕梁市"], "status": "active", "sort": 680, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "7482f9a5-dedf-4512-89ce-1f2b4736c938", "_rev": "2-d546dc5f536945f1acb86753160c84d5", "type": "region", "code": "340123", "name": "肥西县", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "7482f9a5-dedf-4512-89ce-1f2b4736c938"], "path_name": ["中国", "安徽省", "合肥市", "肥西县"], "status": "active", "sort": 689, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "78a90611-9ce2-4254-ade6-ed4614dfdbf3", "_rev": "2-95fe0fc38c6cfaf9a22ea09b3f8feca0", "type": "region", "code": "370704", "name": "坊子区", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "78a90611-9ce2-4254-ade6-ed4614dfdbf3"], "path_name": ["中国", "山东省", "潍坊市", "坊子区"], "status": "active", "sort": 683, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "825f498f-e9b6-44d8-985b-bcc1ff279b87", "_rev": "2-ecab4156d00f6e795d76601c1c40a05a", "type": "region", "code": "450603", "name": "防城区", "parent_id": "19375806-f12d-48a5-a6e6-c376e0b720fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "19375806-f12d-48a5-a6e6-c376e0b720fb", "825f498f-e9b6-44d8-985b-bcc1ff279b87"], "path_name": ["中国", "广西壮族自治区", "防城港市", "防城区"], "status": "active", "sort": 684, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "9511c056-3c89-4b5a-aee4-566816117ae0", "_rev": "2-f59cbdb7b39afe55057534e1b51d2a4f", "type": "region", "code": "130407", "name": "肥乡区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "9511c056-3c89-4b5a-aee4-566816117ae0"], "path_name": ["中国", "河北省", "邯郸市", "肥乡区"], "status": "active", "sort": 690, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "9fd3757d-8ba4-4940-be9b-ba3b435c572d", "_rev": "2-db339b95bc0dc0da70191a680696e544", "type": "region", "code": "340122", "name": "肥东县", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "9fd3757d-8ba4-4940-be9b-ba3b435c572d"], "path_name": ["中国", "安徽省", "合肥市", "肥东县"], "status": "active", "sort": 688, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "b84e1f66-ce83-4441-8288-13055ea46823", "_rev": "2-642f2b7d43c7ead002171a23635de149", "type": "region", "code": "340212", "name": "繁昌区", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "b84e1f66-ce83-4441-8288-13055ea46823"], "path_name": ["中国", "安徽省", "芜湖市", "繁昌区"], "status": "active", "sort": 675, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "c1408d28-de59-4b4a-9316-5914da7060d1", "_rev": "2-64879063769eb7903e2f593e0a1a10cc", "type": "region", "code": "140924", "name": "繁峙县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "c1408d28-de59-4b4a-9316-5914da7060d1"], "path_name": ["中国", "山西省", "忻州市", "繁峙县"], "status": "active", "sort": 676, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "dab66463-c599-414e-b019-5420d011030e", "_rev": "2-631f9d91dfcdd88f09fc97736fb9579a", "type": "region", "code": "410900", "name": "濮阳市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e"], "path_name": ["中国", "河南省", "濮阳市"], "status": "active", "sort": 677, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "ef88ac9e-61af-4155-9f00-1ad6be6d1b91", "_rev": "2-42bbb5c07d4735d7a635102271c01a52", "type": "region", "code": "420325", "name": "房县", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "ef88ac9e-61af-4155-9f00-1ad6be6d1b91"], "path_name": ["中国", "湖北省", "十堰市", "房县"], "status": "active", "sort": 686, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "fe9abd5b-4dee-4101-ab9a-95412551f225", "_rev": "2-ca75b287fb4a4f9e771275f294c9d15f", "type": "region", "code": "110111", "name": "房山区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "fe9abd5b-4dee-4101-ab9a-95412551f225"], "path_name": ["中国", "北京市", "房山区"], "status": "active", "sort": 685, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:44"} +{"_id": "09c4df44-e620-42a5-9f90-43f10a4602d2", "_rev": "2-44c4fba51dfbded802da21910625c707", "type": "region", "code": "441423", "name": "丰顺县", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "09c4df44-e620-42a5-9f90-43f10a4602d2"], "path_name": ["中国", "广东省", "梅州市", "丰顺县"], "status": "active", "sort": 704, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "0f05c0f2-df8d-4d41-95f7-448c896a0e6c", "_rev": "2-ea229c31b064dad42b87731409d2c120", "type": "region", "code": "130826", "name": "丰宁满族自治县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "0f05c0f2-df8d-4d41-95f7-448c896a0e6c"], "path_name": ["中国", "河北省", "承德市", "丰宁满族自治县"], "status": "active", "sort": 702, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "_rev": "2-ed2be41c506f7542b7e672f2badcc711", "type": "region", "code": "320300", "name": "徐州市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96"], "path_name": ["中国", "江苏省", "徐州市"], "status": "active", "sort": 706, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "0f9c2953-2389-4bf9-a3ea-ca77bbcd90a2", "_rev": "2-fdecd1fa017341151d2bb65677bd362c", "type": "region", "code": "441225", "name": "封开县", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "0f9c2953-2389-4bf9-a3ea-ca77bbcd90a2"], "path_name": ["中国", "广东省", "肇庆市", "封开县"], "status": "active", "sort": 710, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "25937071-a511-4123-9ee3-f326fd554807", "_rev": "2-b1c591c55c9505da6d540deb71f49478", "type": "region", "code": "350503", "name": "丰泽区", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "25937071-a511-4123-9ee3-f326fd554807"], "path_name": ["中国", "福建省", "泉州市", "丰泽区"], "status": "active", "sort": 708, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "2ecabf89-bc81-4866-be87-d6e1deeed584", "_rev": "2-27cfe1aba7ce41a6dd199d1de58a43c3", "type": "region", "code": "371325", "name": "费县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "2ecabf89-bc81-4866-be87-d6e1deeed584"], "path_name": ["中国", "山东省", "临沂市", "费县"], "status": "active", "sort": 692, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "3c94466b-65d6-4dba-893d-844f9c14a82c", "_rev": "2-ce911c7be375e502a8870195d9662116", "type": "region", "code": "141182", "name": "汾阳市", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "3c94466b-65d6-4dba-893d-844f9c14a82c"], "path_name": ["中国", "山西省", "吕梁市", "汾阳市"], "status": "active", "sort": 696, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "492532c6-a284-47b0-a99e-9052ecaf9d42", "_rev": "2-69c6c3481a23cd947b721bfdf113d9cc", "type": "region", "code": "320321", "name": "丰县", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "492532c6-a284-47b0-a99e-9052ecaf9d42"], "path_name": ["中国", "江苏省", "徐州市", "丰县"], "status": "active", "sort": 707, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "4a909020-7ac2-4724-9de8-09eacf02ff2a", "_rev": "2-a1ad4920c9318ac2fe320ee6b628be08", "type": "region", "code": "360500", "name": "新余市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4a909020-7ac2-4724-9de8-09eacf02ff2a"], "path_name": ["中国", "江西省", "新余市"], "status": "active", "sort": 693, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "4d8e0aff-3d4d-405c-bd79-144475c641ec", "_rev": "2-c2447a02c8bfad1d35d9fadd236987bf", "type": "region", "code": "130208", "name": "丰润区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "4d8e0aff-3d4d-405c-bd79-144475c641ec"], "path_name": ["中国", "河北省", "唐山市", "丰润区"], "status": "active", "sort": 703, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "7f43c689-7dfb-434a-87dc-6ba2527e4374", "_rev": "2-5e88ed82e75f4859f1c2409b9f99706f", "type": "region", "code": "500230", "name": "丰都县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "7f43c689-7dfb-434a-87dc-6ba2527e4374"], "path_name": ["中国", "重庆市", "丰都县"], "status": "active", "sort": 699, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "8e70d5ea-9f8c-44dd-bb01-a34f2e5e3e1d", "_rev": "2-a1bd22d74affe63db7da59327512ce20", "type": "region", "code": "220211", "name": "丰满区", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "8e70d5ea-9f8c-44dd-bb01-a34f2e5e3e1d"], "path_name": ["中国", "吉林省", "吉林市", "丰满区"], "status": "active", "sort": 700, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "a55bb9de-5f1a-4607-831b-bfeae39675ed", "_rev": "2-c678cd0e7f54fbb8e0becaccd23ba336", "type": "region", "code": "110106", "name": "丰台区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "a55bb9de-5f1a-4607-831b-bfeae39675ed"], "path_name": ["中国", "北京市", "丰台区"], "status": "active", "sort": 705, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "_rev": "2-cabba66c67da7ed97b5ecf22fe9187a2", "type": "region", "code": "360900", "name": "宜春市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336"], "path_name": ["中国", "江西省", "宜春市"], "status": "active", "sort": 697, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "b4269111-0ba8-40d7-9f48-225663eea1bc", "_rev": "2-0cbcc55b7fb09f05e33021709c6df674", "type": "region", "code": "360521", "name": "分宜县", "parent_id": "4a909020-7ac2-4724-9de8-09eacf02ff2a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4a909020-7ac2-4724-9de8-09eacf02ff2a", "b4269111-0ba8-40d7-9f48-225663eea1bc"], "path_name": ["中国", "江西省", "新余市", "分宜县"], "status": "active", "sort": 694, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "bbb76e62-5cc1-44f1-b512-7ea7ba2961b2", "_rev": "2-dea0ff1a3643e7a93a6328e28a8294f9", "type": "region", "code": "130207", "name": "丰南区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "bbb76e62-5cc1-44f1-b512-7ea7ba2961b2"], "path_name": ["中国", "河北省", "唐山市", "丰南区"], "status": "active", "sort": 701, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "ceaa5faa-9edc-4913-acbb-facf1cd14f1c", "_rev": "2-859dff15585321c51120371115abf34d", "type": "region", "code": "150981", "name": "丰镇市", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "ceaa5faa-9edc-4913-acbb-facf1cd14f1c"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "丰镇市"], "status": "active", "sort": 709, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "e5621b7b-58ab-4df0-beca-3912131e7932", "_rev": "2-c761341666f5240c1f8538328a7496e8", "type": "region", "code": "141034", "name": "汾西县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "e5621b7b-58ab-4df0-beca-3912131e7932"], "path_name": ["中国", "山西省", "临汾市", "汾西县"], "status": "active", "sort": 695, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "fe235883-0cfb-417a-a4b3-ad805e2bdc82", "_rev": "2-fb26d7e65b59ee9764a1e2f20afa767a", "type": "region", "code": "360981", "name": "丰城市", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "fe235883-0cfb-417a-a4b3-ad805e2bdc82"], "path_name": ["中国", "江西省", "宜春市", "丰城市"], "status": "active", "sort": 698, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:45"} +{"_id": "0d378148-8639-4bac-9f93-03e546a0e143", "_rev": "2-2e260979c8c89680e1ccab87a5c0f963", "type": "region", "code": "410700", "name": "新乡市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143"], "path_name": ["中国", "河南省", "新乡市"], "status": "active", "sort": 711, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "2bd22377-dedd-4210-b2bc-4ca8fe383961", "_rev": "2-275c754eb9a5f79b81cbb1733be97e8f", "type": "region", "code": "410727", "name": "封丘县", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "2bd22377-dedd-4210-b2bc-4ca8fe383961"], "path_name": ["中国", "河南省", "新乡市", "封丘县"], "status": "active", "sort": 712, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "354bd04f-8d4e-4a76-a9f4-582ba794fbec", "_rev": "2-88b5ed7bdd35cce7fe0596cd79dde36a", "type": "region", "code": "340421", "name": "凤台县", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "354bd04f-8d4e-4a76-a9f4-582ba794fbec"], "path_name": ["中国", "安徽省", "淮南市", "凤台县"], "status": "active", "sort": 720, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "39dd25dc-95d1-47af-bda6-4722a33faf94", "_rev": "2-7a6313c327cd5587b0c08fc395cf4eb7", "type": "region", "code": "610330", "name": "凤县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "39dd25dc-95d1-47af-bda6-4722a33faf94"], "path_name": ["中国", "陕西省", "宝鸡市", "凤县"], "status": "active", "sort": 721, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "3c3b20a3-9016-4616-8129-9f6893be472c", "_rev": "2-d3399f8e78c19c0d2e4ccedee5a71549", "type": "region", "code": "330213", "name": "奉化区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "3c3b20a3-9016-4616-8129-9f6893be472c"], "path_name": ["中国", "浙江省", "宁波市", "奉化区"], "status": "active", "sort": 724, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "3f8179e3-7d05-4990-b911-252b7d2868bc", "_rev": "2-8ad651441f8c290fd6b2202d3191a931", "type": "region", "code": "130406", "name": "峰峰矿区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "3f8179e3-7d05-4990-b911-252b7d2868bc"], "path_name": ["中国", "河北省", "邯郸市", "峰峰矿区"], "status": "active", "sort": 713, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "40259726-6271-4622-b4a4-fb6f1c455a1d", "_rev": "2-b1a1c5a5f49e5a2cc0324f040edc8503", "type": "region", "code": "500236", "name": "奉节县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "40259726-6271-4622-b4a4-fb6f1c455a1d"], "path_name": ["中国", "重庆市", "奉节县"], "status": "active", "sort": 725, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "44433e21-603b-44da-9f77-62ad451bb20e", "_rev": "2-3e6b0548a1bd3f44e6c403b367f6e352", "type": "region", "code": "451223", "name": "凤山县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "44433e21-603b-44da-9f77-62ad451bb20e"], "path_name": ["中国", "广西壮族自治区", "河池市", "凤山县"], "status": "active", "sort": 719, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "455558f2-515a-4f75-9dc3-706236427dbd", "_rev": "2-570b7af494f943f2c4328a6239603810", "type": "region", "code": "310120", "name": "奉贤区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "455558f2-515a-4f75-9dc3-706236427dbd"], "path_name": ["中国", "上海市", "奉贤区"], "status": "active", "sort": 726, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "4b71b654-02a8-49c1-ae46-d305b13d9d47", "_rev": "2-7832bc32f3bffc86b696b2e1dc3661e8", "type": "region", "code": "210682", "name": "凤城市", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "4b71b654-02a8-49c1-ae46-d305b13d9d47"], "path_name": ["中国", "辽宁省", "丹东市", "凤城市"], "status": "active", "sort": 714, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "504f28a5-e723-4265-bf2e-2c9f14ff6a79", "_rev": "2-f19b3b60bcc1c86ba3de39cd9b3a41fa", "type": "region", "code": "341126", "name": "凤阳县", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "504f28a5-e723-4265-bf2e-2c9f14ff6a79"], "path_name": ["中国", "安徽省", "滁州市", "凤阳县"], "status": "active", "sort": 723, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "810bd1f4-33bc-4dfa-96c6-e0e67c901d5f", "_rev": "2-96c101c4f3445e9d5b36543de27012ab", "type": "region", "code": "433123", "name": "凤凰县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "810bd1f4-33bc-4dfa-96c6-e0e67c901d5f"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "凤凰县"], "status": "active", "sort": 716, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "827b72cd-0f07-4d95-ae92-ac1295cf3a56", "_rev": "2-70018510589b08dd8c2312f2bf658a1d", "type": "region", "code": "530921", "name": "凤庆县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "827b72cd-0f07-4d95-ae92-ac1295cf3a56"], "path_name": ["中国", "云南省", "临沧市", "凤庆县"], "status": "active", "sort": 717, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "8dcbc2c2-0612-45a5-a5f8-a0020c86f188", "_rev": "2-002cd2371879063247dd6b45c1601d65", "type": "region", "code": "360921", "name": "奉新县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "8dcbc2c2-0612-45a5-a5f8-a0020c86f188"], "path_name": ["中国", "江西省", "宜春市", "奉新县"], "status": "active", "sort": 727, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "a1d01152-b4f0-4f88-be59-a8f357295be6", "_rev": "2-b6ae808c7655a7a2ea1c2f0c59fb29cb", "type": "region", "code": "610324", "name": "扶风县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "a1d01152-b4f0-4f88-be59-a8f357295be6"], "path_name": ["中国", "陕西省", "宝鸡市", "扶风县"], "status": "active", "sort": 728, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "afd8d66b-3676-4e98-9cef-1d36b52e6e68", "_rev": "2-0180adfdc2eb044ddc7d61e8f131fbaa", "type": "region", "code": "410704", "name": "凤泉区", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "afd8d66b-3676-4e98-9cef-1d36b52e6e68"], "path_name": ["中国", "河南省", "新乡市", "凤泉区"], "status": "active", "sort": 718, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "df084cfd-402e-4ebf-bc12-abfc6f62b0d4", "_rev": "2-d21593cdc42e6b24458b66d756d334c0", "type": "region", "code": "610305", "name": "凤翔区", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "df084cfd-402e-4ebf-bc12-abfc6f62b0d4"], "path_name": ["中国", "陕西省", "宝鸡市", "凤翔区"], "status": "active", "sort": 722, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "e9bfa561-ff07-474e-89e4-b2807de3a5ec", "_rev": "2-bcb829603bc7a16087afb592ced3de2d", "type": "region", "code": "520327", "name": "凤冈县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "e9bfa561-ff07-474e-89e4-b2807de3a5ec"], "path_name": ["中国", "贵州省", "遵义市", "凤冈县"], "status": "active", "sort": 715, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "ee2ee3bd-bd30-4eba-bcd2-a1f3000c3974", "_rev": "2-d38a5b00737de66d1bc0eae4d9460239", "type": "region", "code": "411621", "name": "扶沟县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "ee2ee3bd-bd30-4eba-bcd2-a1f3000c3974"], "path_name": ["中国", "河南省", "周口市", "扶沟县"], "status": "active", "sort": 729, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:46"} +{"_id": "10787174-5ef1-404e-81e8-32e3d13ed4fc", "_rev": "2-3c700b5834e61ef93a4c462bc91aa52d", "type": "region", "code": "430102", "name": "芙蓉区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "10787174-5ef1-404e-81e8-32e3d13ed4fc"], "path_name": ["中国", "湖南省", "长沙市", "芙蓉区"], "status": "active", "sort": 734, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "1dcf3720-759d-4649-a8e1-32cc0792c01c", "_rev": "2-e4478deb81636d373d1f18f6ba61561a", "type": "region", "code": "610730", "name": "佛坪县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "1dcf3720-759d-4649-a8e1-32cc0792c01c"], "path_name": ["中国", "陕西省", "汉中市", "佛坪县"], "status": "active", "sort": 737, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "_rev": "2-5b248d5948bcbc965041c0ae77589a40", "type": "region", "code": "533300", "name": "怒江傈僳族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609"], "path_name": ["中国", "云南省", "怒江傈僳族自治州"], "status": "active", "sort": 745, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "_rev": "2-7aaa9c04a519f35f02e07849087abc84", "type": "region", "code": "430100", "name": "长沙市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91"], "path_name": ["中国", "湖南省", "长沙市"], "status": "active", "sort": 733, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "4c6ac01e-1db6-49b4-9a26-5142eabbb1b1", "_rev": "2-d360f199f961a48339dd6401ac404bab", "type": "region", "code": "220781", "name": "扶余市", "parent_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8", "4c6ac01e-1db6-49b4-9a26-5142eabbb1b1"], "path_name": ["中国", "吉林省", "松原市", "扶余市"], "status": "active", "sort": 732, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "_rev": "2-c76277280950716e9c296f021676d4cf", "type": "region", "code": "350900", "name": "宁德市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b"], "path_name": ["中国", "福建省", "宁德市"], "status": "active", "sort": 742, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "68153103-85f6-431c-ab85-5334874e7812", "_rev": "2-3bbbf6761dbc5e2d39899b7290034b97", "type": "region", "code": "533323", "name": "福贡县", "parent_id": "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "68153103-85f6-431c-ab85-5334874e7812"], "path_name": ["中国", "云南省", "怒江傈僳族自治州", "福贡县"], "status": "active", "sort": 746, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "_rev": "2-483ae1052113d1f0d40a7454360f4510", "type": "region", "code": "220700", "name": "松原市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8"], "path_name": ["中国", "吉林省", "松原市"], "status": "active", "sort": 731, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "94d5d4c9-f7b9-4c00-854e-20c34e046196", "_rev": "2-151d7bc0e0af3d5e1ccdfd1cf9f30592", "type": "region", "code": "350982", "name": "福鼎市", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "94d5d4c9-f7b9-4c00-854e-20c34e046196"], "path_name": ["中国", "福建省", "宁德市", "福鼎市"], "status": "active", "sort": 744, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "9d5e9e5b-9795-4551-b2c0-c286d80a865f", "_rev": "2-e76269f7296d0528a20e91f11e332548", "type": "region", "code": "441821", "name": "佛冈县", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "9d5e9e5b-9795-4551-b2c0-c286d80a865f"], "path_name": ["中国", "广东省", "清远市", "佛冈县"], "status": "active", "sort": 736, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "af70849b-7d27-42d6-aabd-fc9f9d1539d5", "_rev": "2-182aa5807fbe87618cc0825a27d95f8b", "type": "region", "code": "141027", "name": "浮山县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "af70849b-7d27-42d6-aabd-fc9f9d1539d5"], "path_name": ["中国", "山西省", "临汾市", "浮山县"], "status": "active", "sort": 739, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "b2ea0ce5-b838-48b4-8f00-2708242ccb23", "_rev": "2-3440268220358ad2ad0428296b022d2e", "type": "region", "code": "500102", "name": "涪陵区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "b2ea0ce5-b838-48b4-8f00-2708242ccb23"], "path_name": ["中国", "重庆市", "涪陵区"], "status": "active", "sort": 741, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "daae849e-3641-4f71-83b1-b4a45cdad0db", "_rev": "2-849e4ceac4d3cfa8f53a7d69b20b582c", "type": "region", "code": "360222", "name": "浮梁县", "parent_id": "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "daae849e-3641-4f71-83b1-b4a45cdad0db"], "path_name": ["中国", "江西省", "景德镇市", "浮梁县"], "status": "active", "sort": 738, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "e7a23ccf-81ff-4401-89ca-fed4aaf2022c", "_rev": "2-80b5a3738575ea9302c65ce3a8d7b950", "type": "region", "code": "451421", "name": "扶绥县", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "e7a23ccf-81ff-4401-89ca-fed4aaf2022c"], "path_name": ["中国", "广西壮族自治区", "崇左市", "扶绥县"], "status": "active", "sort": 730, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "_rev": "2-14a8b950d26cd9e6da486939d4fb417b", "type": "region", "code": "441800", "name": "清远市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97"], "path_name": ["中国", "广东省", "清远市"], "status": "active", "sort": 735, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "f9569e0f-a8d6-4616-88eb-2006382c9a09", "_rev": "2-1a255bc9aee7223b8905d763863b50c4", "type": "region", "code": "510703", "name": "涪城区", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "f9569e0f-a8d6-4616-88eb-2006382c9a09"], "path_name": ["中国", "四川省", "绵阳市", "涪城区"], "status": "active", "sort": 740, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "fa22671f-dad2-4845-8b5b-ee8ed7c8efd2", "_rev": "2-2983f1732754cb3e703c4376c359cdf6", "type": "region", "code": "350981", "name": "福安市", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "fa22671f-dad2-4845-8b5b-ee8ed7c8efd2"], "path_name": ["中国", "福建省", "宁德市", "福安市"], "status": "active", "sort": 743, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:47"} +{"_id": "074ce16b-fec1-42a5-8cc2-9671e5efba4a", "_rev": "2-e0b75ad7acd50d6b8b42a3180a905499", "type": "region", "code": "350181", "name": "福清市", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "074ce16b-fec1-42a5-8cc2-9671e5efba4a"], "path_name": ["中国", "福建省", "福州市", "福清市"], "status": "active", "sort": 749, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "20f94381-73e0-4428-9fd8-2dce8e6f4133", "_rev": "2-b1c2f1e72069f8e56e7b43cb21df59a6", "type": "region", "code": "130306", "name": "抚宁区", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "20f94381-73e0-4428-9fd8-2dce8e6f4133"], "path_name": ["中国", "河北省", "秦皇岛市", "抚宁区"], "status": "active", "sort": 754, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "_rev": "2-5eebe658f88c8bc73209e81c18b6db3a", "type": "region", "code": "370600", "name": "烟台市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e"], "path_name": ["中国", "山东省", "烟台市"], "status": "active", "sort": 751, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "3355cc7c-ebc2-438c-8f53-ad7f7844e536", "_rev": "2-5a7ce70d99c4201038cceb7e8dfc14cd", "type": "region", "code": "610822", "name": "府谷县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "3355cc7c-ebc2-438c-8f53-ad7f7844e536"], "path_name": ["中国", "陕西省", "榆林市", "府谷县"], "status": "active", "sort": 760, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "4028c0c0-f5c9-4224-8f0c-5f45b9e4c668", "_rev": "2-aa34c9d7ef3e1425eebe00b6c7e520db", "type": "region", "code": "652302", "name": "阜康市", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "4028c0c0-f5c9-4224-8f0c-5f45b9e4c668"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "阜康市"], "status": "active", "sort": 762, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "42caf01e-5d44-4d01-aca8-829e8e386323", "_rev": "2-3a3c14746451cac763fdf72132f9cd22", "type": "region", "code": "654323", "name": "福海县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "42caf01e-5d44-4d01-aca8-829e8e386323"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "福海县"], "status": "active", "sort": 747, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "4948422b-6b22-4a81-a4a5-368c765fe00d", "_rev": "2-8eb9f4528fa83596b99bfa8b4715440b", "type": "region", "code": "131128", "name": "阜城县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "4948422b-6b22-4a81-a4a5-368c765fe00d"], "path_name": ["中国", "河北省", "衡水市", "阜城县"], "status": "active", "sort": 761, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "4c59226f-84d3-4bc1-80cf-932970e0eeaf", "_rev": "2-cb6e50396dc3bcf52bd565eee3352b90", "type": "region", "code": "210421", "name": "抚顺县", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "4c59226f-84d3-4bc1-80cf-932970e0eeaf"], "path_name": ["中国", "辽宁省", "抚顺市", "抚顺县"], "status": "active", "sort": 755, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "_rev": "2-698ec1fb4a0c018994c1417a753f6a93", "type": "region", "code": "220600", "name": "白山市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a"], "path_name": ["中国", "吉林省", "白山市"], "status": "active", "sort": 756, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "873f5da2-a303-4c70-9a40-6ce0bf87750a", "_rev": "2-40a4ba47874d9ee366734154b6d49c3a", "type": "region", "code": "450903", "name": "福绵区", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "873f5da2-a303-4c70-9a40-6ce0bf87750a"], "path_name": ["中国", "广西壮族自治区", "玉林市", "福绵区"], "status": "active", "sort": 748, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "c2dca9f7-b2a5-43f0-b934-c4c161998563", "_rev": "2-ff115237300747fa69e0716de59bbdbb", "type": "region", "code": "220621", "name": "抚松县", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "c2dca9f7-b2a5-43f0-b934-c4c161998563"], "path_name": ["中国", "吉林省", "白山市", "抚松县"], "status": "active", "sort": 757, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "ce64e381-cb23-4ee8-9115-0c6ef56a7f3f", "_rev": "2-ab7965f0c63282909ed71988b31b9c40", "type": "region", "code": "440304", "name": "福田区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "ce64e381-cb23-4ee8-9115-0c6ef56a7f3f"], "path_name": ["中国", "广东省", "深圳市", "福田区"], "status": "active", "sort": 753, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "e40ef144-c7f8-43f7-a171-7cef4b5e12b7", "_rev": "2-876173b3f3ebbf9723129ec050ead56b", "type": "region", "code": "370611", "name": "福山区", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "e40ef144-c7f8-43f7-a171-7cef4b5e12b7"], "path_name": ["中国", "山东省", "烟台市", "福山区"], "status": "active", "sort": 752, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "_rev": "2-007f2ed50aee47cccbb6b87fca7cb6b5", "type": "region", "code": "230800", "name": "佳木斯市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b"], "path_name": ["中国", "黑龙江省", "佳木斯市"], "status": "active", "sort": 758, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "f95b9f6b-fef5-4c24-ab0a-e0d11a4d4a13", "_rev": "2-543181fa40b20f9dae1053c047dac6b1", "type": "region", "code": "522702", "name": "福泉市", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "f95b9f6b-fef5-4c24-ab0a-e0d11a4d4a13"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "福泉市"], "status": "active", "sort": 750, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "fa2f1884-adad-4da5-ab87-eab3e5853ba5", "_rev": "2-1a043b1be56bea5301904bc00cee14a4", "type": "region", "code": "230883", "name": "抚远市", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "fa2f1884-adad-4da5-ab87-eab3e5853ba5"], "path_name": ["中国", "黑龙江省", "佳木斯市", "抚远市"], "status": "active", "sort": 759, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:48"} +{"_id": "02f3bd70-6dac-4e2d-91db-232aaca3018f", "_rev": "2-652b96a9bbb0c4082613d56b90a1a612", "type": "region", "code": "610528", "name": "富平县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "02f3bd70-6dac-4e2d-91db-232aaca3018f"], "path_name": ["中国", "陕西省", "渭南市", "富平县"], "status": "active", "sort": 776, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "063283d9-98b7-4a76-a5aa-d21d005b0e56", "_rev": "2-e41bb7c3feafe3139c95a709fe78f17d", "type": "region", "code": "530124", "name": "富民县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "063283d9-98b7-4a76-a5aa-d21d005b0e56"], "path_name": ["中国", "云南省", "昆明市", "富民县"], "status": "active", "sort": 773, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "0ac6f19a-e8a9-45b7-9e30-e29bb6ced84a", "_rev": "2-2e688ceb411553e550ff39bf3c2f4a5a", "type": "region", "code": "341225", "name": "阜南县", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "0ac6f19a-e8a9-45b7-9e30-e29bb6ced84a"], "path_name": ["中国", "安徽省", "阜阳市", "阜南县"], "status": "active", "sort": 764, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "2a266a49-fa63-4747-b686-298cbb91b484", "_rev": "2-6f97f5652ae769788fd98b1bccb7e68e", "type": "region", "code": "130624", "name": "阜平县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "2a266a49-fa63-4747-b686-298cbb91b484"], "path_name": ["中国", "河北省", "保定市", "阜平县"], "status": "active", "sort": 766, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "_rev": "2-a4b09e3e204143e53e7c9d855cad4642", "type": "region", "code": "510300", "name": "自贡市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390"], "path_name": ["中国", "四川省", "自贡市"], "status": "active", "sort": 777, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "73e9527a-51f6-4a0e-9fee-49c4379125b3", "_rev": "2-aeb085678e855c077fe5aaf038ba3ba1", "type": "region", "code": "230882", "name": "富锦市", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "73e9527a-51f6-4a0e-9fee-49c4379125b3"], "path_name": ["中国", "黑龙江省", "佳木斯市", "富锦市"], "status": "active", "sort": 771, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "7be8e232-9043-4388-8041-bd2e0635a9ab", "_rev": "2-15c4a64724bd1ce74541d390d44d20d6", "type": "region", "code": "130404", "name": "复兴区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "7be8e232-9043-4388-8041-bd2e0635a9ab"], "path_name": ["中国", "河北省", "邯郸市", "复兴区"], "status": "active", "sort": 769, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "82623a51-8002-48f7-9e9e-db0542cb6aa8", "_rev": "2-d2ae1277be5972d461ce42a61704be19", "type": "region", "code": "510322", "name": "富顺县", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "82623a51-8002-48f7-9e9e-db0542cb6aa8"], "path_name": ["中国", "四川省", "自贡市", "富顺县"], "status": "active", "sort": 778, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "_rev": "2-37395dd99bddd3e93504140bfe73072a", "type": "region", "code": "210900", "name": "阜新市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1"], "path_name": ["中国", "辽宁省", "阜新市"], "status": "active", "sort": 767, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "8bd19900-ccb4-4a9f-bccf-5f9ad87870cf", "_rev": "2-8e305f03e316ee7e10af779602eb8152", "type": "region", "code": "320923", "name": "阜宁县", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "8bd19900-ccb4-4a9f-bccf-5f9ad87870cf"], "path_name": ["中国", "江苏省", "盐城市", "阜宁县"], "status": "active", "sort": 765, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "_rev": "2-7782d4ae92af679860fa91bef280836b", "type": "region", "code": "341200", "name": "阜阳市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a"], "path_name": ["中国", "安徽省", "阜阳市"], "status": "active", "sort": 763, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "c3552067-a338-4778-9194-8f263ff50891", "_rev": "2-03b13f865cb959589e24b419b80338f4", "type": "region", "code": "532600", "name": "文山壮族苗族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891"], "path_name": ["中国", "云南省", "文山壮族苗族自治州"], "status": "active", "sort": 774, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "caea9201-1cd5-4005-a458-e29e5781a601", "_rev": "2-fdff4d5a961bdeb2828145bba88413a8", "type": "region", "code": "532628", "name": "富宁县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "caea9201-1cd5-4005-a458-e29e5781a601"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "富宁县"], "status": "active", "sort": 775, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "db0a0b3b-0c43-4bab-9996-6fe54fd9c9d5", "_rev": "2-461fe84b85c8c2153e554613804ceda9", "type": "region", "code": "210921", "name": "阜新蒙古族自治县", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "db0a0b3b-0c43-4bab-9996-6fe54fd9c9d5"], "path_name": ["中国", "辽宁省", "阜新市", "阜新蒙古族自治县"], "status": "active", "sort": 768, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "e3cfd6ca-f2b8-46c1-a865-f9b74bde4a40", "_rev": "2-dd23cfa89c9087dc0ef145c90a993b85", "type": "region", "code": "230206", "name": "富拉尔基区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "e3cfd6ca-f2b8-46c1-a865-f9b74bde4a40"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "富拉尔基区"], "status": "active", "sort": 772, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "fac9b866-ee31-47b9-ae53-ab907105812b", "_rev": "2-52edd46100925a656f80c5c8af47c0cd", "type": "region", "code": "451123", "name": "富川瑶族自治县", "parent_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "fac9b866-ee31-47b9-ae53-ab907105812b"], "path_name": ["中国", "广西壮族自治区", "贺州市", "富川瑶族自治县"], "status": "active", "sort": 770, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:49"} +{"_id": "078c5972-8601-4da3-9cd3-0925438e3518", "_rev": "2-66ebb22cf55caf1abeec711632dd66c0", "type": "region", "code": "653129", "name": "伽师县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "078c5972-8601-4da3-9cd3-0925438e3518"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "伽师县"], "status": "active", "sort": 785, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "0d3fa4c9-5de4-464a-94af-76e5df0ac7ec", "_rev": "2-5dd6054f1e695e2fd8a60cf8b1016ef2", "type": "region", "code": "654322", "name": "富蕴县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "0d3fa4c9-5de4-464a-94af-76e5df0ac7ec"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "富蕴县"], "status": "active", "sort": 784, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "11e97d53-d9bb-4df4-8e35-4675700d3f19", "_rev": "2-04cc6b1a2408af240a8cd0359082aafa", "type": "region", "code": "530325", "name": "富源县", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "11e97d53-d9bb-4df4-8e35-4675700d3f19"], "path_name": ["中国", "云南省", "曲靖市", "富源县"], "status": "active", "sort": 783, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "1c05c4fb-5b77-4bea-a05a-48c43cfd401b", "_rev": "2-a495102c68bc6f81ef096542309d9534", "type": "region", "code": "610628", "name": "富县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "1c05c4fb-5b77-4bea-a05a-48c43cfd401b"], "path_name": ["中国", "陕西省", "延安市", "富县"], "status": "active", "sort": 779, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "34004ee3-ad43-46b2-853f-51f730e71447", "_rev": "2-4097e6c98c7829b391edf94082e5d195", "type": "region", "code": "210211", "name": "甘井子区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "34004ee3-ad43-46b2-853f-51f730e71447"], "path_name": ["中国", "辽宁省", "大连市", "甘井子区"], "status": "active", "sort": 793, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "5b44920b-4413-4fb4-afc5-f30eb53153eb", "_rev": "2-9969500e250c09c74f255ff18288690d", "type": "region", "code": "230225", "name": "甘南县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "5b44920b-4413-4fb4-afc5-f30eb53153eb"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "甘南县"], "status": "active", "sort": 795, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "5c46bbb4-32b9-41d1-93ea-6c914d1b5085", "_rev": "2-4492b6f422d5b5c575af869a7bde51f7", "type": "region", "code": "513435", "name": "甘洛县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "5c46bbb4-32b9-41d1-93ea-6c914d1b5085"], "path_name": ["中国", "四川省", "凉山彝族自治州", "甘洛县"], "status": "active", "sort": 794, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "5f850d4c-970e-4fc1-932e-d9fc6802910d", "_rev": "2-0313af97c8818e06633b10dcc3583e03", "type": "region", "code": "542523", "name": "噶尔县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "5f850d4c-970e-4fc1-932e-d9fc6802910d"], "path_name": ["中国", "西藏自治区", "阿里地区", "噶尔县"], "status": "active", "sort": 786, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "_rev": "2-19d8cc8d1bdc07b18e20c0af9d92c711", "type": "region", "code": "530300", "name": "曲靖市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d"], "path_name": ["中国", "云南省", "曲靖市"], "status": "active", "sort": 782, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "9f2b9845-6554-4747-9b0b-c30edde9f1c9", "_rev": "2-39fb5b3a3804a4fe31905fa036786559", "type": "region", "code": "210881", "name": "盖州市", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "9f2b9845-6554-4747-9b0b-c30edde9f1c9"], "path_name": ["中国", "辽宁省", "营口市", "盖州市"], "status": "active", "sort": 788, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "a6491195-ab3f-482a-a38a-43c229aa741d", "_rev": "2-5558c1d2cbb4b780cc9ae52df6df1cec", "type": "region", "code": "330111", "name": "富阳区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "a6491195-ab3f-482a-a38a-43c229aa741d"], "path_name": ["中国", "浙江省", "杭州市", "富阳区"], "status": "active", "sort": 780, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "_rev": "2-8a36b35467acedf8fc251dc709a4ea3d", "type": "region", "code": "210200", "name": "大连市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57"], "path_name": ["中国", "辽宁省", "大连市"], "status": "active", "sort": 792, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "af68be62-d2a9-496b-97c9-817a36590b79", "_rev": "2-0a9eb82932ac0da16afc752af3177c80", "type": "region", "code": "230227", "name": "富裕县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "af68be62-d2a9-496b-97c9-817a36590b79"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "富裕县"], "status": "active", "sort": 781, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "ba3fac61-28f9-4948-a392-aa10390e1a60", "_rev": "2-a9448c01eeed90acae4c6282d75b9aa2", "type": "region", "code": "632623", "name": "甘德县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "ba3fac61-28f9-4948-a392-aa10390e1a60"], "path_name": ["中国", "青海省", "果洛藏族自治州", "甘德县"], "status": "active", "sort": 789, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "d3ae5f3d-8ce6-4a53-9fa8-5b6d2ad198ea", "_rev": "2-29dca6833e6378f30076dccb98c5ce04", "type": "region", "code": "620523", "name": "甘谷县", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "d3ae5f3d-8ce6-4a53-9fa8-5b6d2ad198ea"], "path_name": ["中国", "甘肃省", "天水市", "甘谷县"], "status": "active", "sort": 791, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "_rev": "2-2e31d9c00fe9a1d2a04cfeef89e84fc6", "type": "region", "code": "620500", "name": "天水市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c"], "path_name": ["中国", "甘肃省", "天水市"], "status": "active", "sort": 790, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "e526edbc-d295-4b07-b4ff-1d67459e918e", "_rev": "2-c3a574db239fddbfd474541b52ea7e8d", "type": "region", "code": "542526", "name": "改则县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "e526edbc-d295-4b07-b4ff-1d67459e918e"], "path_name": ["中国", "西藏自治区", "阿里地区", "改则县"], "status": "active", "sort": 787, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:50"} +{"_id": "11d52ea7-c364-46ba-a787-04e322711812", "_rev": "2-6984266e3b18615369c5dc785a447b9c", "type": "region", "code": "620700", "name": "张掖市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812"], "path_name": ["中国", "甘肃省", "张掖市"], "status": "active", "sort": 797, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "2bf3b2cb-593a-43d2-8935-ee539787b601", "_rev": "2-40165e0ebe997c617f463fc883c4505b", "type": "region", "code": "632200", "name": "海北藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "2bf3b2cb-593a-43d2-8935-ee539787b601"], "path_name": ["中国", "青海省", "海北藏族自治州"], "status": "active", "sort": 802, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "4105e6b9-4e3f-4d29-9d5c-9da0993efc83", "_rev": "2-c17fc2cd76d4df8892ad4cbf7ff55257", "type": "region", "code": "360983", "name": "高安市", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "4105e6b9-4e3f-4d29-9d5c-9da0993efc83"], "path_name": ["中国", "江西省", "宜春市", "高安市"], "status": "active", "sort": 812, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "454ce644-156f-433a-837f-e55067f5e57a", "_rev": "2-0b74c2b60465b52081a8c5405c7232b8", "type": "region", "code": "370117", "name": "钢城区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "454ce644-156f-433a-837f-e55067f5e57a"], "path_name": ["中国", "山东省", "济南市", "钢城区"], "status": "active", "sort": 805, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "4f190f3f-dbfc-483e-b974-d7ad915f4fec", "_rev": "2-52ebcb86476e9fca0e0568b367e74cfd", "type": "region", "code": "320707", "name": "赣榆区", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "4f190f3f-dbfc-483e-b974-d7ad915f4fec"], "path_name": ["中国", "江苏省", "连云港市", "赣榆区"], "status": "active", "sort": 801, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "57dcebb9-8e8a-4b75-8ae7-90c5c17f5d73", "_rev": "2-82d00797a7457b5bdd923d9fb22debbd", "type": "region", "code": "360704", "name": "赣县区", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "57dcebb9-8e8a-4b75-8ae7-90c5c17f5d73"], "path_name": ["中国", "江西省", "赣州市", "赣县区"], "status": "active", "sort": 800, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "634f8d19-5fe3-4de9-880e-b89c9343ade1", "_rev": "2-79159f087d1018e148cbed1174222ce3", "type": "region", "code": "450802", "name": "港北区", "parent_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1", "634f8d19-5fe3-4de9-880e-b89c9343ade1"], "path_name": ["中国", "广西壮族自治区", "贵港市", "港北区"], "status": "active", "sort": 808, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "76ea47df-0db5-439c-954a-9b5160422837", "_rev": "2-06c16a6934b8446b18a01f2b2691102e", "type": "region", "code": "450803", "name": "港南区", "parent_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1", "76ea47df-0db5-439c-954a-9b5160422837"], "path_name": ["中国", "广西壮族自治区", "贵港市", "港南区"], "status": "active", "sort": 810, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "87d18693-bcfb-47d6-af07-e17d0043ba83", "_rev": "2-eb76cbfda919f43db8fea3afdfa14898", "type": "region", "code": "513328", "name": "甘孜县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "87d18693-bcfb-47d6-af07-e17d0043ba83"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "甘孜县"], "status": "active", "sort": 799, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "abc49b45-f34e-4b58-bac5-a0f326b21e44", "_rev": "2-5e3e2ee8a46f7895ce97c3f5f5c9cf8d", "type": "region", "code": "620122", "name": "皋兰县", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "abc49b45-f34e-4b58-bac5-a0f326b21e44"], "path_name": ["中国", "甘肃省", "兰州市", "皋兰县"], "status": "active", "sort": 811, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "ad029a0b-3486-4d36-ac12-98233d8d31e8", "_rev": "2-5b990402644b7598d106513ea3df0244", "type": "region", "code": "540237", "name": "岗巴县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "ad029a0b-3486-4d36-ac12-98233d8d31e8"], "path_name": ["中国", "西藏自治区", "日喀则市", "岗巴县"], "status": "active", "sort": 806, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "_rev": "2-d5355beabcac41eb0c062d56792c1e13", "type": "region", "code": "450800", "name": "贵港市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1"], "path_name": ["中国", "广西壮族自治区", "贵港市"], "status": "active", "sort": 807, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "baa183fd-edce-4ac2-a454-d4f5271aeb2e", "_rev": "2-c54af01026bd3c96fafb164ed74ebc95", "type": "region", "code": "632224", "name": "刚察县", "parent_id": "2bf3b2cb-593a-43d2-8935-ee539787b601", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "2bf3b2cb-593a-43d2-8935-ee539787b601", "baa183fd-edce-4ac2-a454-d4f5271aeb2e"], "path_name": ["中国", "青海省", "海北藏族自治州", "刚察县"], "status": "active", "sort": 803, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "_rev": "2-154f8225dac636839dde12ad6758b835", "type": "region", "code": "370100", "name": "济南市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae"], "path_name": ["中国", "山东省", "济南市"], "status": "active", "sort": 804, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "dff686b2-6610-4c61-a421-dd322e205bd8", "_rev": "2-44c7912facca0caaca6cfaff593b5e19", "type": "region", "code": "620702", "name": "甘州区", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "dff686b2-6610-4c61-a421-dd322e205bd8"], "path_name": ["中国", "甘肃省", "张掖市", "甘州区"], "status": "active", "sort": 798, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "e861d4ff-1006-4fd3-a00d-991249579caa", "_rev": "2-311bafd08c5db52e64c930a07033b2bb", "type": "region", "code": "610627", "name": "甘泉县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "e861d4ff-1006-4fd3-a00d-991249579caa"], "path_name": ["中国", "陕西省", "延安市", "甘泉县"], "status": "active", "sort": 796, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "f364bdb3-38f1-4cd2-90d1-c929d5bac8f3", "_rev": "2-4350707ce5da8e5d2add710d2d369edf", "type": "region", "code": "450602", "name": "港口区", "parent_id": "19375806-f12d-48a5-a6e6-c376e0b720fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "19375806-f12d-48a5-a6e6-c376e0b720fb", "f364bdb3-38f1-4cd2-90d1-c929d5bac8f3"], "path_name": ["中国", "广西壮族自治区", "防城港市", "港口区"], "status": "active", "sort": 809, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:51"} +{"_id": "078a50c7-a4ad-4d7c-8b6e-3c1c347e889b", "_rev": "2-3dc2f160abb92cc1ca74276891609f38", "type": "region", "code": "321203", "name": "高港区", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "078a50c7-a4ad-4d7c-8b6e-3c1c347e889b"], "path_name": ["中国", "江苏省", "泰州市", "高港区"], "status": "active", "sort": 819, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "1cfc77d0-6f14-47d6-a450-0eb8a3abcff4", "_rev": "2-f134f1ad15d03c31c808485b2a66b22d", "type": "region", "code": "370322", "name": "高青县", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "1cfc77d0-6f14-47d6-a450-0eb8a3abcff4"], "path_name": ["中国", "山东省", "淄博市", "高青县"], "status": "active", "sort": 827, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "31207ecc-d150-47d3-82b2-a74649a59121", "_rev": "2-0eafa6a0e04f76a2b9e043ccb403e3bf", "type": "region", "code": "140581", "name": "高平市", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "31207ecc-d150-47d3-82b2-a74649a59121"], "path_name": ["中国", "山西省", "晋城市", "高平市"], "status": "active", "sort": 824, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "_rev": "2-be6a11eec9fd0c1893d7e7fd2f785c39", "type": "region", "code": "320100", "name": "南京市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2"], "path_name": ["中国", "江苏省", "南京市"], "status": "active", "sort": 816, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "7515a18f-7fb8-4406-ac76-10e3b3b63bc0", "_rev": "2-b9a87e97daeecccc3e5df6666deab7b0", "type": "region", "code": "440608", "name": "高明区", "parent_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "7515a18f-7fb8-4406-ac76-10e3b3b63bc0"], "path_name": ["中国", "广东省", "佛山市", "高明区"], "status": "active", "sort": 822, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "75e9c139-d303-45dd-a919-8f0e540909e9", "_rev": "2-d2312e57341ebb0ab5c57e20a12a83e2", "type": "region", "code": "370785", "name": "高密市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "75e9c139-d303-45dd-a919-8f0e540909e9"], "path_name": ["中国", "山东省", "潍坊市", "高密市"], "status": "active", "sort": 821, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "_rev": "2-53b340c6e268e83e40c0e80d49b6463d", "type": "region", "code": "321200", "name": "泰州市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7"], "path_name": ["中国", "江苏省", "泰州市"], "status": "active", "sort": 818, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "88de0b1f-121b-4541-8b54-3713b4bf536d", "_rev": "2-50e2a0082042966bd4c77a67fa9d2265", "type": "region", "code": "320118", "name": "高淳区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "88de0b1f-121b-4541-8b54-3713b4bf536d"], "path_name": ["中国", "江苏省", "南京市", "高淳区"], "status": "active", "sort": 817, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "_rev": "2-cd4ea5d659713bebc43ea784ffecd33b", "type": "region", "code": "511300", "name": "南充市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752"], "path_name": ["中国", "四川省", "南充市"], "status": "active", "sort": 825, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "b55ac900-77d7-4ee6-b754-c22960a6801d", "_rev": "2-bbdac3e067fb7b8e1995b43a419f27e2", "type": "region", "code": "650400", "name": "吐鲁番市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "b55ac900-77d7-4ee6-b754-c22960a6801d"], "path_name": ["中国", "新疆维吾尔自治区", "吐鲁番市"], "status": "active", "sort": 814, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "b67e17d2-b7a3-4ad5-b15a-b68933669a53", "_rev": "2-9d9b9cf45d680e9773d7c861690df056", "type": "region", "code": "650402", "name": "高昌区", "parent_id": "b55ac900-77d7-4ee6-b754-c22960a6801d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "b55ac900-77d7-4ee6-b754-c22960a6801d", "b67e17d2-b7a3-4ad5-b15a-b68933669a53"], "path_name": ["中国", "新疆维吾尔自治区", "吐鲁番市", "高昌区"], "status": "active", "sort": 815, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "d385c5e7-7000-4e01-ba90-679388fab027", "_rev": "2-a7775d6db962d7f63d558739c510d48c", "type": "region", "code": "140500", "name": "晋城市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027"], "path_name": ["中国", "山西省", "晋城市"], "status": "active", "sort": 823, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "dbd87baa-ad80-4ffb-a8c5-74c3797a322e", "_rev": "2-798d16123fcd61271b9f6d90474d452a", "type": "region", "code": "610117", "name": "高陵区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "dbd87baa-ad80-4ffb-a8c5-74c3797a322e"], "path_name": ["中国", "陕西省", "西安市", "高陵区"], "status": "active", "sort": 820, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "e2bb815c-6ab8-4106-a984-1f64cc50d0c9", "_rev": "2-b378062591cc948f81fcf3d7e031733f", "type": "region", "code": "130684", "name": "高碑店市", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "e2bb815c-6ab8-4106-a984-1f64cc50d0c9"], "path_name": ["中国", "河北省", "保定市", "高碑店市"], "status": "active", "sort": 813, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "e4d731fa-3953-4c2d-9829-d32c0aabed52", "_rev": "2-f0386a5237b35b9b9d744e71dd163d28", "type": "region", "code": "620724", "name": "高台县", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "e4d731fa-3953-4c2d-9829-d32c0aabed52"], "path_name": ["中国", "甘肃省", "张掖市", "高台县"], "status": "active", "sort": 828, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "f0af93d6-6fde-4752-a2de-51335ebf2c30", "_rev": "2-add8dce72411f723328f002eff4f7dec", "type": "region", "code": "511303", "name": "高坪区", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "f0af93d6-6fde-4752-a2de-51335ebf2c30"], "path_name": ["中国", "四川省", "南充市", "高坪区"], "status": "active", "sort": 826, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:52"} +{"_id": "057426c8-8929-47c6-900b-fdbdf1df193a", "_rev": "2-af26465ad5534b7729bd72b8645a7436", "type": "region", "code": "371526", "name": "高唐县", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "057426c8-8929-47c6-900b-fdbdf1df193a"], "path_name": ["中国", "山东省", "聊城市", "高唐县"], "status": "active", "sort": 829, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "0bc2a23a-828b-4417-a58d-c67eb002507b", "_rev": "2-3b2f1f16abd45b49595bd440831691f8", "type": "region", "code": "441204", "name": "高要区", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "0bc2a23a-828b-4417-a58d-c67eb002507b"], "path_name": ["中国", "广东省", "肇庆市", "高要区"], "status": "active", "sort": 834, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "5121c74e-d8d5-4fe3-9c30-f446d93f0b92", "_rev": "2-15a26603193e80961e9dc2b8430c2cf3", "type": "region", "code": "130109", "name": "藁城区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "5121c74e-d8d5-4fe3-9c30-f446d93f0b92"], "path_name": ["中国", "河北省", "石家庄市", "藁城区"], "status": "active", "sort": 839, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "646a0e23-3982-4439-aff9-cc3cd8643869", "_rev": "2-638b20042addb2aa4ef52a2938533fcd", "type": "region", "code": "511525", "name": "高县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "646a0e23-3982-4439-aff9-cc3cd8643869"], "path_name": ["中国", "四川省", "宜宾市", "高县"], "status": "active", "sort": 830, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "68f79c97-9364-4905-93af-acfd1e30b4b2", "_rev": "2-21b498e44706d1a15b453e058d9f9eb4", "type": "region", "code": "632801", "name": "格尔木市", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "68f79c97-9364-4905-93af-acfd1e30b4b2"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "格尔木市"], "status": "active", "sort": 841, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "6e7a9a1e-65a3-4cac-bb7c-44179ec4ac3b", "_rev": "2-9a08c150747d1cf72de2238e10e4af51", "type": "region", "code": "710000", "name": "直辖", "parent_id": "90470563-8ddf-4a53-8aff-b66de09a3792", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "90470563-8ddf-4a53-8aff-b66de09a3792", "6e7a9a1e-65a3-4cac-bb7c-44179ec4ac3b"], "path_name": ["中国", "台湾省", "直辖"], "status": "active", "sort": 832, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "_rev": "2-132f94c6a14c11013ae19639c1aaa03a", "type": "region", "code": "532500", "name": "红河哈尼族彝族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州"], "status": "active", "sort": 842, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "90470563-8ddf-4a53-8aff-b66de09a3792", "_rev": "2-7edd434ef65368dee88343e2c2b67032", "type": "region", "code": "710000", "name": "台湾省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "90470563-8ddf-4a53-8aff-b66de09a3792"], "path_name": ["中国", "台湾省"], "status": "active", "sort": 831, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "ac908958-efb3-4714-ab53-b774507ae101", "_rev": "2-904a735daa44bf58db99d15ef5f1d42b", "type": "region", "code": "542525", "name": "革吉县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "ac908958-efb3-4714-ab53-b774507ae101"], "path_name": ["中国", "西藏自治区", "阿里地区", "革吉县"], "status": "active", "sort": 840, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "afe8613d-85a8-4957-95de-7477c1ae4933", "_rev": "2-11c2d05290f1283b6a09b90a2019f103", "type": "region", "code": "130127", "name": "高邑县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "afe8613d-85a8-4957-95de-7477c1ae4933"], "path_name": ["中国", "河北省", "石家庄市", "高邑县"], "status": "active", "sort": 836, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "b95a40ef-311e-479b-a5bd-df6d512a1001", "_rev": "2-9faed520bdf82bbd75c32bbe1ff98762", "type": "region", "code": "321084", "name": "高邮市", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "b95a40ef-311e-479b-a5bd-df6d512a1001"], "path_name": ["中国", "江苏省", "扬州市", "高邮市"], "status": "active", "sort": 837, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "_rev": "2-438b748e6cd7ae9ae46236d2818f705e", "type": "region", "code": "130100", "name": "石家庄市", "parent_id": "3310e691-b8b3-4b79-a5b4-16bd081977d4", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924"], "path_name": ["中国", "河北省", "石家庄市"], "status": "active", "sort": 835, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "dee72cfe-3137-4cef-8d3b-bb19e2278dd1", "_rev": "2-a1a1af50e02ce2322eee89dea4d57942", "type": "region", "code": "532501", "name": "个旧市", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "dee72cfe-3137-4cef-8d3b-bb19e2278dd1"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "个旧市"], "status": "active", "sort": 843, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "ea64f572-e8bd-40d0-9954-71e3862db8ec", "_rev": "2-98fe2d537affaaeadef1e60e88094fc5", "type": "region", "code": "150785", "name": "根河市", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "ea64f572-e8bd-40d0-9954-71e3862db8ec"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "根河市"], "status": "active", "sort": 844, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "f11a4e39-d4ab-46f5-9a0d-3da46a886ef4", "_rev": "2-5cc6cd6845189d59e44c4450d69dd864", "type": "region", "code": "440981", "name": "高州市", "parent_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "f11a4e39-d4ab-46f5-9a0d-3da46a886ef4"], "path_name": ["中国", "广东省", "茂名市", "高州市"], "status": "active", "sort": 838, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "f6f7bbe2-0558-4479-9a90-dbd9fe567824", "_rev": "2-f7697428d62b5d93b593f44d89b1f388", "type": "region", "code": "130628", "name": "高阳县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "f6f7bbe2-0558-4479-9a90-dbd9fe567824"], "path_name": ["中国", "河北省", "保定市", "高阳县"], "status": "active", "sort": 833, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:53"} +{"_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "_rev": "2-ba5546cd3f6968b56f1fd46ba073e4c9", "type": "region", "code": "632500", "name": "海南藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd"], "path_name": ["中国", "青海省", "海南藏族自治州"], "status": "active", "sort": 856, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "_rev": "2-e4859ba6604f7de50c4b1fd2eeaa380a", "type": "region", "code": "421000", "name": "荆州市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187"], "path_name": ["中国", "湖北省", "荆州市"], "status": "active", "sort": 848, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "3e4423f4-66ad-4713-bdbb-162f6ed37ceb", "_rev": "2-4cbed45bdd2cd50c6e784bced2d8bf46", "type": "region", "code": "511526", "name": "珙县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "3e4423f4-66ad-4713-bdbb-162f6ed37ceb"], "path_name": ["中国", "四川省", "宜宾市", "珙县"], "status": "active", "sort": 855, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "55bfe2ee-e414-45ba-8699-e87191d39f1b", "_rev": "2-b3096035fa0d95b9764abe1d87593777", "type": "region", "code": "540322", "name": "贡觉县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "55bfe2ee-e414-45ba-8699-e87191d39f1b"], "path_name": ["中国", "西藏自治区", "昌都市", "贡觉县"], "status": "active", "sort": 861, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "5832e71c-ab9d-415f-9712-e7fd3e87270d", "_rev": "2-ca76f827f5dfee28d84b3f2473ebd5a8", "type": "region", "code": "330105", "name": "拱墅区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "5832e71c-ab9d-415f-9712-e7fd3e87270d"], "path_name": ["中国", "浙江省", "杭州市", "拱墅区"], "status": "active", "sort": 854, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "6953ed0e-c248-474f-a1d7-6066dbfdbe06", "_rev": "2-0418e63513f27dea53cab57f18f9dfed", "type": "region", "code": "632521", "name": "共和县", "parent_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd", "6953ed0e-c248-474f-a1d7-6066dbfdbe06"], "path_name": ["中国", "青海省", "海南藏族自治州", "共和县"], "status": "active", "sort": 857, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "81e129fc-ca09-42ce-baaf-e041a684fc1d", "_rev": "2-380ea5fa3e7733ee7785157ebce36e7e", "type": "region", "code": "530926", "name": "耿马傣族佤族自治县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "81e129fc-ca09-42ce-baaf-e041a684fc1d"], "path_name": ["中国", "云南省", "临沧市", "耿马傣族佤族自治县"], "status": "active", "sort": 845, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "8e8b4c5c-73ef-4ba5-b63f-bfd1ea918ebd", "_rev": "2-c0fb8fbcbb6043ac3a21ca4d40673463", "type": "region", "code": "360482", "name": "共青城市", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "8e8b4c5c-73ef-4ba5-b63f-bfd1ea918ebd"], "path_name": ["中国", "江西省", "九江市", "共青城市"], "status": "active", "sort": 858, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "a0368b58-f71d-4a65-ba7e-1f91fc1b12a8", "_rev": "2-383f81b051f7c3432e849d25e8ed8ab5", "type": "region", "code": "654024", "name": "巩留县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "a0368b58-f71d-4a65-ba7e-1f91fc1b12a8"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "巩留县"], "status": "active", "sort": 852, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "a2498232-11ab-4e23-9dc5-b7afab1c0201", "_rev": "2-f5cf9d836e027e15b06e5de499adfb1c", "type": "region", "code": "510303", "name": "贡井区", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "a2498232-11ab-4e23-9dc5-b7afab1c0201"], "path_name": ["中国", "四川省", "自贡市", "贡井区"], "status": "active", "sort": 860, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "b04cdf34-ddf0-42c5-9dd1-952ae05eefb5", "_rev": "2-381077ce218afe8ef8d3222652d853ee", "type": "region", "code": "410181", "name": "巩义市", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "b04cdf34-ddf0-42c5-9dd1-952ae05eefb5"], "path_name": ["中国", "河南省", "郑州市", "巩义市"], "status": "active", "sort": 853, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "c72c211f-be52-4405-bd73-459c01495423", "_rev": "2-053e10ecb1fd48257a0b50ed01117081", "type": "region", "code": "540421", "name": "工布江达县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "c72c211f-be52-4405-bd73-459c01495423"], "path_name": ["中国", "西藏自治区", "林芝市", "工布江达县"], "status": "active", "sort": 846, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "f004778f-bfe8-46e7-96ff-617ded80aa5c", "_rev": "2-a3ce32b65e140973eb499884389ad870", "type": "region", "code": "450332", "name": "恭城瑶族自治县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "f004778f-bfe8-46e7-96ff-617ded80aa5c"], "path_name": ["中国", "广西壮族自治区", "桂林市", "恭城瑶族自治县"], "status": "active", "sort": 851, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "f167c6d6-c345-46e7-9cba-21d8c9e4545b", "_rev": "2-6d422dcb8bb16cbed639125fd6436501", "type": "region", "code": "421022", "name": "公安县", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "f167c6d6-c345-46e7-9cba-21d8c9e4545b"], "path_name": ["中国", "湖北省", "荆州市", "公安县"], "status": "active", "sort": 849, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "f2ec963b-1ca7-490f-935e-2dc69854bb06", "_rev": "2-4e4d0a95b576b665a54d72952a8511b1", "type": "region", "code": "220184", "name": "公主岭市", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "f2ec963b-1ca7-490f-935e-2dc69854bb06"], "path_name": ["中国", "吉林省", "长春市", "公主岭市"], "status": "active", "sort": 850, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "f4db6a22-1dea-49b3-a027-5095a0474ac0", "_rev": "2-fb9a75201068f7e19f13cf86c4831d55", "type": "region", "code": "211005", "name": "弓长岭区", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "f4db6a22-1dea-49b3-a027-5095a0474ac0"], "path_name": ["中国", "辽宁省", "辽阳市", "弓长岭区"], "status": "active", "sort": 847, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "fd15b102-8f0c-4212-939d-c2fe1a61dbbc", "_rev": "2-f651bcb6d5071bbd119974ba5ba60f4a", "type": "region", "code": "540522", "name": "贡嘎县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "fd15b102-8f0c-4212-939d-c2fe1a61dbbc"], "path_name": ["中国", "西藏自治区", "山南市", "贡嘎县"], "status": "active", "sort": 859, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:54"} +{"_id": "027b0610-cbf8-447c-a1c1-050c9da0b046", "_rev": "2-57488a4cfb046d38bd80e4f555100d03", "type": "region", "code": "510525", "name": "古蔺县", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "027b0610-cbf8-447c-a1c1-050c9da0b046"], "path_name": ["中国", "四川省", "泸州市", "古蔺县"], "status": "active", "sort": 872, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "_rev": "2-3e4ab41ef709eb9ddde8aab6272d32cb", "type": "region", "code": "510500", "name": "泸州市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318"], "path_name": ["中国", "四川省", "泸州市"], "status": "active", "sort": 871, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "0a89cad0-daee-4e2b-bf38-e35d304214e1", "_rev": "2-06bc4c7ffd07f0791a25eeaefb27a2a8", "type": "region", "code": "320508", "name": "姑苏区", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "0a89cad0-daee-4e2b-bf38-e35d304214e1"], "path_name": ["中国", "江苏省", "苏州市", "姑苏区"], "status": "active", "sort": 864, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "1e2f5abf-6f7f-4571-863a-f4585b547fc1", "_rev": "2-fce1d4af69da83f6d50cfa569eb0b826", "type": "region", "code": "350922", "name": "古田县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "1e2f5abf-6f7f-4571-863a-f4585b547fc1"], "path_name": ["中国", "福建省", "宁德市", "古田县"], "status": "active", "sort": 874, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "2a59ccb5-9947-4c82-b4af-659308766f74", "_rev": "2-93a6efe100069ba7aa7ca05076e6f209", "type": "region", "code": "620622", "name": "古浪县", "parent_id": "8adb19ec-7d97-4233-8709-19769b980943", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8adb19ec-7d97-4233-8709-19769b980943", "2a59ccb5-9947-4c82-b4af-659308766f74"], "path_name": ["中国", "甘肃省", "武威市", "古浪县"], "status": "active", "sort": 870, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "4948f7e7-67e5-4904-8a7f-e34c3e91ab4f", "_rev": "2-1ac86e2f42b7a7a079f7d88939aa6de6", "type": "region", "code": "433126", "name": "古丈县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "4948f7e7-67e5-4904-8a7f-e34c3e91ab4f"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "古丈县"], "status": "active", "sort": 877, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "5baf3300-64a2-4fc7-ba89-b3bd4dbbf6dd", "_rev": "2-a00ae5bf35d5234516b5878f6d8f4323", "type": "region", "code": "210702", "name": "古塔区", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "5baf3300-64a2-4fc7-ba89-b3bd4dbbf6dd"], "path_name": ["中国", "辽宁省", "锦州市", "古塔区"], "status": "active", "sort": 873, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "5f0131f1-1a06-45df-9db5-0085e4595bb4", "_rev": "2-0770ea360aa4f515d96c3fe6701840b5", "type": "region", "code": "141025", "name": "古县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "5f0131f1-1a06-45df-9db5-0085e4595bb4"], "path_name": ["中国", "山西省", "临汾市", "古县"], "status": "active", "sort": 875, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "7b485f46-6f0c-4926-9de5-c8790025521d", "_rev": "2-42c97e1216963240094f49e2759a8d10", "type": "region", "code": "530702", "name": "古城区", "parent_id": "b712f371-149e-4b45-aa88-755c77561518", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518", "7b485f46-6f0c-4926-9de5-c8790025521d"], "path_name": ["中国", "云南省", "丽江市", "古城区"], "status": "active", "sort": 866, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "881a60e6-15f2-4238-becc-6cfeba5024bc", "_rev": "2-a517954a9328c0cc8c99878a9bac4a1c", "type": "region", "code": "130204", "name": "古冶区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "881a60e6-15f2-4238-becc-6cfeba5024bc"], "path_name": ["中国", "河北省", "唐山市", "古冶区"], "status": "active", "sort": 876, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "8adb19ec-7d97-4233-8709-19769b980943", "_rev": "2-cc0675323b22a6ecce15ed58273f9c4b", "type": "region", "code": "620600", "name": "武威市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8adb19ec-7d97-4233-8709-19769b980943"], "path_name": ["中国", "甘肃省", "武威市"], "status": "active", "sort": 869, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "b5e45cb2-0f49-4e49-bf09-c129e3cdf0e0", "_rev": "2-5c9731aebf138032a41fd57cf0a6c86d", "type": "region", "code": "130724", "name": "沽源县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "b5e45cb2-0f49-4e49-bf09-c129e3cdf0e0"], "path_name": ["中国", "河北省", "张家口市", "沽源县"], "status": "active", "sort": 863, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "b712f371-149e-4b45-aa88-755c77561518", "_rev": "2-2acc7cab14efee6648a8b9fc28518c54", "type": "region", "code": "530700", "name": "丽江市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518"], "path_name": ["中国", "云南省", "丽江市"], "status": "active", "sort": 865, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "cecbb862-b3b2-498c-ac5c-93a872d41c2c", "_rev": "2-3d3d15018f72ee17c1768b1f76dfd465", "type": "region", "code": "140181", "name": "古交市", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "cecbb862-b3b2-498c-ac5c-93a872d41c2c"], "path_name": ["中国", "山西省", "太原市", "古交市"], "status": "active", "sort": 868, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "_rev": "2-28e7b59c49e30266d15af829d2060043", "type": "region", "code": "140100", "name": "太原市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb"], "path_name": ["中国", "山西省", "太原市"], "status": "active", "sort": 867, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "fda65673-5338-42f5-b1c5-71c30592d5d8", "_rev": "2-d5827261ef1c1f72c3ba153908d4f6e6", "type": "region", "code": "533324", "name": "贡山独龙族怒族自治县", "parent_id": "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "fda65673-5338-42f5-b1c5-71c30592d5d8"], "path_name": ["中国", "云南省", "怒江傈僳族自治州", "贡山独龙族怒族自治县"], "status": "active", "sort": 862, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:55"} +{"_id": "07fea610-335d-4d20-8a13-b66cd13ce2e7", "_rev": "2-5621c5ed965e3022118440c1448050ec", "type": "region", "code": "411525", "name": "固始县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "07fea610-335d-4d20-8a13-b66cd13ce2e7"], "path_name": ["中国", "河南省", "信阳市", "固始县"], "status": "active", "sort": 881, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "1087ebb1-7e27-49b7-b0dd-6550aee233c4", "_rev": "2-eaeea0c4903d6981e99f4eb9403bb329", "type": "region", "code": "620922", "name": "瓜州县", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "1087ebb1-7e27-49b7-b0dd-6550aee233c4"], "path_name": ["中国", "甘肃省", "酒泉市", "瓜州县"], "status": "active", "sort": 885, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "1677aa0f-b38c-4d1e-9fd9-372170ca3b8e", "_rev": "2-35ba753161d112f254b7a620fe740f19", "type": "region", "code": "371525", "name": "冠县", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "1677aa0f-b38c-4d1e-9fd9-372170ca3b8e"], "path_name": ["中国", "山东省", "聊城市", "冠县"], "status": "active", "sort": 891, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "34b885a4-7d43-473a-b575-5f02ef85a95d", "_rev": "2-84ac257990ea7f6e8b809fe59806eff4", "type": "region", "code": "520115", "name": "观山湖区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "34b885a4-7d43-473a-b575-5f02ef85a95d"], "path_name": ["中国", "贵州省", "贵阳市", "观山湖区"], "status": "active", "sort": 889, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "493e5be1-a106-4638-b40b-58552d5b3b86", "_rev": "2-85ec2ec7853d24fbb16675039f8a3276", "type": "region", "code": "131126", "name": "故城县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "493e5be1-a106-4638-b40b-58552d5b3b86"], "path_name": ["中国", "河北省", "衡水市", "故城县"], "status": "active", "sort": 884, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "_rev": "2-e26b7a0bdcb9a99fc9b546f83391e79a", "type": "region", "code": "520100", "name": "贵阳市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a"], "path_name": ["中国", "贵州省", "贵阳市"], "status": "active", "sort": 888, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "_rev": "2-37e2181b109a50528dfe6fe44eb7d740", "type": "region", "code": "520400", "name": "安顺市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49"], "path_name": ["中国", "贵州省", "安顺市"], "status": "active", "sort": 886, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "72bbfb5f-f4e0-4383-adfa-3878ead26d87", "_rev": "2-3408ca6c4fd0617a26a7d32bb8ea7be3", "type": "region", "code": "130433", "name": "馆陶县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "72bbfb5f-f4e0-4383-adfa-3878ead26d87"], "path_name": ["中国", "河北省", "邯郸市", "馆陶县"], "status": "active", "sort": 892, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "7f1ab0db-6d4b-43db-8a83-3d81440924f7", "_rev": "2-e698091400608b3a256c5b6eb4daca45", "type": "region", "code": "520424", "name": "关岭布依族苗族自治县", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "7f1ab0db-6d4b-43db-8a83-3d81440924f7"], "path_name": ["中国", "贵州省", "安顺市", "关岭布依族苗族自治县"], "status": "active", "sort": 887, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "8d80d9c5-e7f1-41b9-8af6-28e263d87861", "_rev": "2-3b4d009747dfc41d46aaa756bdfda447", "type": "region", "code": "150222", "name": "固阳县", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "8d80d9c5-e7f1-41b9-8af6-28e263d87861"], "path_name": ["中国", "内蒙古自治区", "包头市", "固阳县"], "status": "active", "sort": 882, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "91331687-7198-4885-a0da-ce5330edc7db", "_rev": "2-fc83402eccd1f86a41996f47edbef406", "type": "region", "code": "420625", "name": "谷城县", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "91331687-7198-4885-a0da-ce5330edc7db"], "path_name": ["中国", "湖北省", "襄阳市", "谷城县"], "status": "active", "sort": 878, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "96c63f7f-ac9c-4d9d-82ea-f1c6d3f8def9", "_rev": "2-76fb9a62ced2f70a281980503edeb967", "type": "region", "code": "340323", "name": "固镇县", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "96c63f7f-ac9c-4d9d-82ea-f1c6d3f8def9"], "path_name": ["中国", "安徽省", "蚌埠市", "固镇县"], "status": "active", "sort": 883, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "_rev": "2-e6f0dc387439f2bfaee8cf93b8370eef", "type": "region", "code": "411500", "name": "信阳市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32"], "path_name": ["中国", "河南省", "信阳市"], "status": "active", "sort": 880, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "a283fee8-f7f9-4594-9a76-49f1c183fc59", "_rev": "2-e8ce5a7aad2805137a0b702e6602e62d", "type": "region", "code": "131022", "name": "固安县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "a283fee8-f7f9-4594-9a76-49f1c183fc59"], "path_name": ["中国", "河北省", "廊坊市", "固安县"], "status": "active", "sort": 879, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "f8f42794-bd31-40d7-a294-2e742c3941f0", "_rev": "2-8d896365aa142363fc45e597d91b5048", "type": "region", "code": "530111", "name": "官渡区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "f8f42794-bd31-40d7-a294-2e742c3941f0"], "path_name": ["中国", "云南省", "昆明市", "官渡区"], "status": "active", "sort": 890, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:56"} +{"_id": "07528f46-4960-4158-9e7a-a1330457d998", "_rev": "2-e87be25bd8d94f0c3e170047af103909", "type": "region", "code": "341800", "name": "宣城市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998"], "path_name": ["中国", "安徽省", "宣城市"], "status": "active", "sort": 903, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "154c0750-bdb3-4fa6-a4f6-9f36d909b156", "_rev": "2-1fe837727249f770749605da2b67dec0", "type": "region", "code": "510681", "name": "广汉市", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "154c0750-bdb3-4fa6-a4f6-9f36d909b156"], "path_name": ["中国", "四川省", "德阳市", "广汉市"], "status": "active", "sort": 907, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "25efa82d-a6a5-416f-b74d-5c5c763eb069", "_rev": "2-13378410bf33cc5ea0480690931857fc", "type": "region", "code": "411522", "name": "光山县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "25efa82d-a6a5-416f-b74d-5c5c763eb069"], "path_name": ["中国", "河南省", "信阳市", "光山县"], "status": "active", "sort": 897, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "2c01043b-2127-4e01-8eb3-d9ff029c3f11", "_rev": "2-9f5319472c396ba49f9eec82e809531e", "type": "region", "code": "511602", "name": "广安区", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "2c01043b-2127-4e01-8eb3-d9ff029c3f11"], "path_name": ["中国", "四川省", "广安市", "广安区"], "status": "active", "sort": 901, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "42e11e67-1597-40e6-86ec-cfd83b1b732f", "_rev": "2-87ca66ec9d38ff9aad7828dbc50c6ed6", "type": "region", "code": "320723", "name": "灌云县", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "42e11e67-1597-40e6-86ec-cfd83b1b732f"], "path_name": ["中国", "江苏省", "连云港市", "灌云县"], "status": "active", "sort": 896, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "48007738-432a-4731-ba7c-c29ff84708ba", "_rev": "2-429621a5d60d3487d5f6127c38787c22", "type": "region", "code": "511600", "name": "广安市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba"], "path_name": ["中国", "四川省", "广安市"], "status": "active", "sort": 900, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "55962cb2-5c8c-4195-851c-571350f92373", "_rev": "2-71c7b1aba5947881da0af3bdd13eea29", "type": "region", "code": "361030", "name": "广昌县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "55962cb2-5c8c-4195-851c-571350f92373"], "path_name": ["中国", "江西省", "抚州市", "广昌县"], "status": "active", "sort": 902, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "_rev": "2-15de01600d6b3b3c45f1ff2393d35a74", "type": "region", "code": "510600", "name": "德阳市", "parent_id": "d2fe720b-2e6a-41fc-bc99-934255987ba8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184"], "path_name": ["中国", "四川省", "德阳市"], "status": "active", "sort": 906, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "778a6210-8234-4208-809d-8f7ae29fa675", "_rev": "2-c5f7abce5a4f65855a90c530675af059", "type": "region", "code": "450327", "name": "灌阳县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "778a6210-8234-4208-809d-8f7ae29fa675"], "path_name": ["中国", "广西壮族自治区", "桂林市", "灌阳县"], "status": "active", "sort": 895, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "_rev": "2-7e3aff8c282fd3394c5601043ea5ac33", "type": "region", "code": "350700", "name": "南平市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95"], "path_name": ["中国", "福建省", "南平市"], "status": "active", "sort": 898, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "a1a6aaa1-c987-4226-916e-d12c6d2abf47", "_rev": "2-cc8c42ccc52c8e024660bb399c62bdb9", "type": "region", "code": "410104", "name": "管城回族区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "a1a6aaa1-c987-4226-916e-d12c6d2abf47"], "path_name": ["中国", "河南省", "郑州市", "管城回族区"], "status": "active", "sort": 893, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "e00a8a58-3659-48bc-b712-3dab3227b808", "_rev": "2-1cbf1b6b1dd0da17428edb1ffe1f6a66", "type": "region", "code": "341882", "name": "广德市", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "e00a8a58-3659-48bc-b712-3dab3227b808"], "path_name": ["中国", "安徽省", "宣城市", "广德市"], "status": "active", "sort": 904, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "e0bc7b28-5089-49c9-b979-62b49293b713", "_rev": "2-3d2729c20a277deb4dc2bdd69392783e", "type": "region", "code": "361103", "name": "广丰区", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "e0bc7b28-5089-49c9-b979-62b49293b713"], "path_name": ["中国", "江西省", "上饶市", "广丰区"], "status": "active", "sort": 905, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "e19a59d3-7acb-4f18-8ad8-985f936dcc01", "_rev": "2-34281b4772c97ffce302740cb6f2ac3f", "type": "region", "code": "350723", "name": "光泽县", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "e19a59d3-7acb-4f18-8ad8-985f936dcc01"], "path_name": ["中国", "福建省", "南平市", "光泽县"], "status": "active", "sort": 899, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "ea518678-366d-426a-8188-78f15181babd", "_rev": "2-ac97925f0f23244c8bd4aec80698eb1b", "type": "region", "code": "320724", "name": "灌南县", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "ea518678-366d-426a-8188-78f15181babd"], "path_name": ["中国", "江苏省", "连云港市", "灌南县"], "status": "active", "sort": 894, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:57"} +{"_id": "04601010-cca4-45c2-b5ce-9d9a63b18b61", "_rev": "2-9b3799b67c4fbfb604538e996a41c15d", "type": "region", "code": "321002", "name": "广陵区", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "04601010-cca4-45c2-b5ce-9d9a63b18b61"], "path_name": ["中国", "江苏省", "扬州市", "广陵区"], "status": "active", "sort": 911, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "110ac126-a576-4053-9c74-ae97b730ae16", "_rev": "2-fb8648ce27b8016b4e70cfe2aeb679c7", "type": "region", "code": "130432", "name": "广平县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "110ac126-a576-4053-9c74-ae97b730ae16"], "path_name": ["中国", "河北省", "邯郸市", "广平县"], "status": "active", "sort": 914, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "23976c48-62d9-4cf1-a30c-73a211a55bc7", "_rev": "2-01b2bc154e9e943798f2e3d8a585c629", "type": "region", "code": "341702", "name": "贵池区", "parent_id": "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "23976c48-62d9-4cf1-a30c-73a211a55bc7"], "path_name": ["中国", "安徽省", "池州市", "贵池区"], "status": "active", "sort": 919, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "_rev": "2-340277f897faeed0c505a44f1b3d5718", "type": "region", "code": "140200", "name": "大同市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e"], "path_name": ["中国", "山西省", "大同市"], "status": "active", "sort": 909, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "36c28868-1d50-4be6-8934-b3ce9054dba2", "_rev": "2-0ae173a0e67532e1047af8abb05eb272", "type": "region", "code": "441223", "name": "广宁县", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "36c28868-1d50-4be6-8934-b3ce9054dba2"], "path_name": ["中国", "广东省", "肇庆市", "广宁县"], "status": "active", "sort": 913, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "67d5fd6b-c048-4995-9c62-cbe59da44076", "_rev": "2-ea59d90b8663646daad02a224d39645f", "type": "region", "code": "370523", "name": "广饶县", "parent_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "67d5fd6b-c048-4995-9c62-cbe59da44076"], "path_name": ["中国", "山东省", "东营市", "广饶县"], "status": "active", "sort": 915, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "721e738b-8565-4dc8-b696-cb22b165c06d", "_rev": "2-316573886d023d4ddc2010b428c7ebb6", "type": "region", "code": "522723", "name": "贵定县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "721e738b-8565-4dc8-b696-cb22b165c06d"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "贵定县"], "status": "active", "sort": 921, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "_rev": "2-0cfdc30fc6f8a20467f7edf58a1f3e8f", "type": "region", "code": "360600", "name": "鹰潭市", "parent_id": "afe852ff-6f11-45a5-a729-bda3ea205a79", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "98a7db25-5be5-4e1f-bbad-8f70ea994ab3"], "path_name": ["中国", "江西省", "鹰潭市"], "status": "active", "sort": 923, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "9a02c8c9-69c1-4bcd-8961-2dadc26c9dca", "_rev": "2-28abff489e1decb9dbeefe3f58329afe", "type": "region", "code": "131003", "name": "广阳区", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "9a02c8c9-69c1-4bcd-8961-2dadc26c9dca"], "path_name": ["中国", "河北省", "廊坊市", "广阳区"], "status": "active", "sort": 917, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "9ee70e92-ae58-459b-b7df-4950effb4dea", "_rev": "2-84fa393106ce26e89600c3c0c24f0d7d", "type": "region", "code": "632523", "name": "贵德县", "parent_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd", "9ee70e92-ae58-459b-b7df-4950effb4dea"], "path_name": ["中国", "青海省", "海南藏族自治州", "贵德县"], "status": "active", "sort": 920, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "a9b8ace6-5d72-4285-a521-42d784f09373", "_rev": "2-6b00beb54c8e72a8bc02ffba6ef2fee7", "type": "region", "code": "130531", "name": "广宗县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "a9b8ace6-5d72-4285-a521-42d784f09373"], "path_name": ["中国", "河北省", "邢台市", "广宗县"], "status": "active", "sort": 918, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "bbcf2092-c257-4ba6-847d-70680d8fa342", "_rev": "2-748b0a3db9ad65c0a49d42f476c7bd3d", "type": "region", "code": "421381", "name": "广水市", "parent_id": "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "bbcf2092-c257-4ba6-847d-70680d8fa342"], "path_name": ["中国", "湖北省", "随州市", "广水市"], "status": "active", "sort": 916, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "c11c7025-f49f-41e2-b938-2be95bada9be", "_rev": "2-e13014c3c43b84793092650042a9ecaf", "type": "region", "code": "632525", "name": "贵南县", "parent_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd", "c11c7025-f49f-41e2-b938-2be95bada9be"], "path_name": ["中国", "青海省", "海南藏族自治州", "贵南县"], "status": "active", "sort": 922, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "cafbaff1-63a0-4453-91d2-68c4d66a6bbd", "_rev": "2-1b9ca9be88f5e60a0233a4fb8c3e73c1", "type": "region", "code": "140223", "name": "广灵县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "cafbaff1-63a0-4453-91d2-68c4d66a6bbd"], "path_name": ["中国", "山西省", "大同市", "广灵县"], "status": "active", "sort": 910, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "d31a88d4-eab7-408e-a730-10e50aab87cf", "_rev": "2-f4ef7bfaffbab71a4522c4656a0bf287", "type": "region", "code": "532627", "name": "广南县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "d31a88d4-eab7-408e-a730-10e50aab87cf"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "广南县"], "status": "active", "sort": 912, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "db976175-43fe-48a4-b964-2c3cacf04675", "_rev": "2-b28e9117a1241ed14a243fc34a3dddb1", "type": "region", "code": "622924", "name": "广河县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "db976175-43fe-48a4-b964-2c3cacf04675"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "广河县"], "status": "active", "sort": 908, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:58"} +{"_id": "10b53ff0-dea1-4be7-95ad-37c7df817180", "_rev": "2-53952fa4c8d7c9d5f974dd82bba7e5ca", "type": "region", "code": "350205", "name": "海沧区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "10b53ff0-dea1-4be7-95ad-37c7df817180"], "path_name": ["中国", "福建省", "厦门市", "海沧区"], "status": "active", "sort": 933, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "1e18b1ea-903f-4590-8357-34644d2936c9", "_rev": "2-cb0546989aca3f8945ed8044e4b687aa", "type": "region", "code": "431021", "name": "桂阳县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "1e18b1ea-903f-4590-8357-34644d2936c9"], "path_name": ["中国", "湖南省", "郴州市", "桂阳县"], "status": "active", "sort": 927, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "365589cb-9802-4c16-a2c9-01214670c990", "_rev": "2-652a63d5ee91783e61a173cab6b2f01b", "type": "region", "code": "450500", "name": "北海市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "365589cb-9802-4c16-a2c9-01214670c990"], "path_name": ["中国", "广西壮族自治区", "北海市"], "status": "active", "sort": 934, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "4d876cff-c4ff-4d83-89ae-3c688a40244f", "_rev": "2-85598fdf1acf1e3f9a61e133277b91ee", "type": "region", "code": "320685", "name": "海安市", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "4d876cff-c4ff-4d83-89ae-3c688a40244f"], "path_name": ["中国", "江苏省", "南通市", "海安市"], "status": "active", "sort": 929, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "6e23be15-3811-4644-b8d3-cd797f28e8c3", "_rev": "2-8f8b66402035b83d87fbffe5d9c04fa6", "type": "region", "code": "654324", "name": "哈巴河县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "6e23be15-3811-4644-b8d3-cd797f28e8c3"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "哈巴河县"], "status": "active", "sort": 928, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "7021e898-0f3c-43c6-9c26-79cce3b9d1d1", "_rev": "2-08666f2f7041cf4e4560b4461d5a2332", "type": "region", "code": "150302", "name": "海勃湾区", "parent_id": "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "7021e898-0f3c-43c6-9c26-79cce3b9d1d1"], "path_name": ["中国", "内蒙古自治区", "乌海市", "海勃湾区"], "status": "active", "sort": 931, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "_rev": "2-645dcf3e7d66d09e6da192f5a9456972", "type": "region", "code": "150300", "name": "乌海市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "8decc9aa-7bb7-496e-aa12-3b36d56355f3"], "path_name": ["中国", "内蒙古自治区", "乌海市"], "status": "active", "sort": 930, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "_rev": "2-86042626e5d240ceebbe4d2d3e03875c", "type": "region", "code": "350200", "name": "厦门市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094"], "path_name": ["中国", "福建省", "厦门市"], "status": "active", "sort": 932, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "a2f4bc1a-b32d-482c-8297-06f38d3f81f4", "_rev": "2-de078bdcd98aae761e2a45d1c35550e4", "type": "region", "code": "360681", "name": "贵溪市", "parent_id": "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "a2f4bc1a-b32d-482c-8297-06f38d3f81f4"], "path_name": ["中国", "江西省", "鹰潭市", "贵溪市"], "status": "active", "sort": 924, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "cf5facd9-b3ce-4219-b85d-ac9285a171c5", "_rev": "2-68bfe32e0e2b3cf162c9001fe8e25250", "type": "region", "code": "450881", "name": "桂平市", "parent_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1", "cf5facd9-b3ce-4219-b85d-ac9285a171c5"], "path_name": ["中国", "广西壮族自治区", "贵港市", "桂平市"], "status": "active", "sort": 926, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "db25a7d3-8ce3-451c-b834-d8f9561981a0", "_rev": "2-1441cdd1b93ec50ef3bf71ed3dc494d7", "type": "region", "code": "431027", "name": "桂东县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "db25a7d3-8ce3-451c-b834-d8f9561981a0"], "path_name": ["中国", "湖南省", "郴州市", "桂东县"], "status": "active", "sort": 925, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "_rev": "2-74edb74e18142a449a8cb0acd0896630", "type": "region", "code": "210300", "name": "鞍山市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5"], "path_name": ["中国", "辽宁省", "鞍山市"], "status": "active", "sort": 936, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "f4af9ca8-089b-462e-9ceb-bb0fb1c8defc", "_rev": "2-e1c26eed43b8e3c3d3effbf3a042b1ac", "type": "region", "code": "450502", "name": "海城区", "parent_id": "365589cb-9802-4c16-a2c9-01214670c990", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "365589cb-9802-4c16-a2c9-01214670c990", "f4af9ca8-089b-462e-9ceb-bb0fb1c8defc"], "path_name": ["中国", "广西壮族自治区", "北海市", "海城区"], "status": "active", "sort": 935, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:00:59"} +{"_id": "02ccc930-a652-4e61-8c29-7cb3106b2363", "_rev": "2-52ada95bc4fa16f9dc6c02d2efa95078", "type": "region", "code": "150702", "name": "海拉尔区", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "02ccc930-a652-4e61-8c29-7cb3106b2363"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "海拉尔区"], "status": "active", "sort": 942, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "094a2da1-bb10-4611-ad5d-ae452307365c", "_rev": "2-5818b1fc06fd2413f2aaa56f3419479d", "type": "region", "code": "231283", "name": "海伦市", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "094a2da1-bb10-4611-ad5d-ae452307365c"], "path_name": ["中国", "黑龙江省", "绥化市", "海伦市"], "status": "active", "sort": 945, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "6471420e-8b35-45e4-b43a-21ec69909c7a", "_rev": "2-365398616599f7604613e149f19acf7c", "type": "region", "code": "231083", "name": "海林市", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "6471420e-8b35-45e4-b43a-21ec69909c7a"], "path_name": ["中国", "黑龙江省", "牡丹江市", "海林市"], "status": "active", "sort": 943, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "86a097cc-5e4a-4309-8bcd-c5e5b862661b", "_rev": "2-b9937ec10416a2987e0164030961cefc", "type": "region", "code": "130302", "name": "海港区", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "86a097cc-5e4a-4309-8bcd-c5e5b862661b"], "path_name": ["中国", "河北省", "秦皇岛市", "海港区"], "status": "active", "sort": 941, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "a625fba0-eacc-470e-b2f4-4c1fcb5ab9dc", "_rev": "2-50cf78e6a00fe4ddc00e2a232e6c9eff", "type": "region", "code": "321202", "name": "海陵区", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "a625fba0-eacc-470e-b2f4-4c1fcb5ab9dc"], "path_name": ["中国", "江苏省", "泰州市", "海陵区"], "status": "active", "sort": 944, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "b1ad05a4-2d52-455f-9945-83ad53857689", "_rev": "2-d022e9c80d8d8a255e9bdad6b1a714b1", "type": "region", "code": "110108", "name": "海淀区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "b1ad05a4-2d52-455f-9945-83ad53857689"], "path_name": ["中国", "北京市", "海淀区"], "status": "active", "sort": 938, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "bdc092e4-a714-4e63-b784-e40f9d1a2d01", "_rev": "2-aa6b6244439db9362a74fbd2fb2c72e3", "type": "region", "code": "210381", "name": "海城市", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "bdc092e4-a714-4e63-b784-e40f9d1a2d01"], "path_name": ["中国", "辽宁省", "鞍山市", "海城市"], "status": "active", "sort": 937, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "bdcf5750-89f9-4b02-acce-36bc8580a15f", "_rev": "2-e629b76110ecf8f9d924770e4e5d4499", "type": "region", "code": "441521", "name": "海丰县", "parent_id": "eafc0190-06e6-4b93-b74a-35161879139a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "eafc0190-06e6-4b93-b74a-35161879139a", "bdcf5750-89f9-4b02-acce-36bc8580a15f"], "path_name": ["中国", "广东省", "汕尾市", "海丰县"], "status": "active", "sort": 940, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "eafc0190-06e6-4b93-b74a-35161879139a", "_rev": "2-63a6fa92d81ca4cb2dfb53c9035984ab", "type": "region", "code": "441500", "name": "汕尾市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "eafc0190-06e6-4b93-b74a-35161879139a"], "path_name": ["中国", "广东省", "汕尾市"], "status": "active", "sort": 939, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "f81d4b7a-4e72-4508-8d3f-5d1bb315c10b", "_rev": "2-9c4a2a24e28bfec091da755f5631b880", "type": "region", "code": "320614", "name": "海门区", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "f81d4b7a-4e72-4508-8d3f-5d1bb315c10b"], "path_name": ["中国", "江苏省", "南通市", "海门区"], "status": "active", "sort": 946, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "fce7b10e-2c3a-49dd-8aca-54266ce8e277", "_rev": "2-62ab0e6b6dbda794e452cd17baafb806", "type": "region", "code": "150303", "name": "海南区", "parent_id": "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "fce7b10e-2c3a-49dd-8aca-54266ce8e277"], "path_name": ["中国", "内蒙古自治区", "乌海市", "海南区"], "status": "active", "sort": 947, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:00"} +{"_id": "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "_rev": "2-4b143befa319965b3813a1efdd596fc9", "type": "region", "code": "640500", "name": "中卫市", "parent_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "33620fb9-3d5b-43f8-900c-7978e9ebbbe3"], "path_name": ["中国", "宁夏回族自治区", "中卫市"], "status": "active", "sort": 957, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "3760a7dd-635f-405f-9e33-6fc78bf103b7", "_rev": "2-9537badf9811d9936629393a24b67ac1", "type": "region", "code": "640522", "name": "海原县", "parent_id": "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "3760a7dd-635f-405f-9e33-6fc78bf103b7"], "path_name": ["中国", "宁夏回族自治区", "中卫市", "海原县"], "status": "active", "sort": 958, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "57a20814-df0a-42c3-aee5-9027b28a1f8b", "_rev": "2-be8563b5669d7c305535a851bc19cc6b", "type": "region", "code": "330203", "name": "海曙区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "57a20814-df0a-42c3-aee5-9027b28a1f8b"], "path_name": ["中国", "浙江省", "宁波市", "海曙区"], "status": "active", "sort": 950, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "59d973e0-bdc2-4d43-a27b-41a58e2f1f4b", "_rev": "2-53ae22c0faac72d8786c7bbbcb8dfa37", "type": "region", "code": "460202", "name": "海棠区", "parent_id": "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "59d973e0-bdc2-4d43-a27b-41a58e2f1f4b"], "path_name": ["中国", "海南省", "三亚市", "海棠区"], "status": "active", "sort": 952, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "79bbf212-16a7-4d3f-9508-e9843b9e4d15", "_rev": "2-705326ac5a915d1e8d210c45a8abbb00", "type": "region", "code": "321003", "name": "邗江区", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "79bbf212-16a7-4d3f-9508-e9843b9e4d15"], "path_name": ["中国", "江苏省", "扬州市", "邗江区"], "status": "active", "sort": 960, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "81b29181-d3ca-4eca-97df-062092a084d5", "_rev": "2-4e2fd513cd18529b2076e6bcfd4ff319", "type": "region", "code": "330400", "name": "嘉兴市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5"], "path_name": ["中国", "浙江省", "嘉兴市"], "status": "active", "sort": 948, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "8294f7f7-8e62-4cc0-b1bb-8d8c8fcd38d4", "_rev": "2-0933fe4e99e4da08a4a8e2b10a61dde1", "type": "region", "code": "340522", "name": "含山县", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "8294f7f7-8e62-4cc0-b1bb-8d8c8fcd38d4"], "path_name": ["中国", "安徽省", "马鞍山市", "含山县"], "status": "active", "sort": 962, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "_rev": "2-1067d1d16b9126d4cc6e5dd921f1250d", "type": "region", "code": "460200", "name": "三亚市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "b30dbbda-23cd-4ebe-97fa-987d10f19ec3"], "path_name": ["中国", "海南省", "三亚市"], "status": "active", "sort": 951, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "c4a957c3-69cb-4479-a3d1-d598d22b94f6", "_rev": "2-b7253149b403d89285064dbb80440fc5", "type": "region", "code": "440105", "name": "海珠区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "c4a957c3-69cb-4479-a3d1-d598d22b94f6"], "path_name": ["中国", "广东省", "广州市", "海珠区"], "status": "active", "sort": 959, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "c8b8f4bc-1eff-4819-bb40-1f92423a3739", "_rev": "2-2bf34ad7b82b5e9004400cfbfde06a0f", "type": "region", "code": "130402", "name": "邯山区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "c8b8f4bc-1eff-4819-bb40-1f92423a3739"], "path_name": ["中国", "河北省", "邯郸市", "邯山区"], "status": "active", "sort": 961, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "ed9dc031-a029-43ce-8ad8-457bf06a0e72", "_rev": "2-acaacd81f5c5759aef1c1d247ee321a9", "type": "region", "code": "330424", "name": "海盐县", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "ed9dc031-a029-43ce-8ad8-457bf06a0e72"], "path_name": ["中国", "浙江省", "嘉兴市", "海盐县"], "status": "active", "sort": 954, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "f1ab2469-ea9c-4be8-ab27-51782dcab4a6", "_rev": "2-f43da17a12bca8698c55e13f863b044e", "type": "region", "code": "330481", "name": "海宁市", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "f1ab2469-ea9c-4be8-ab27-51782dcab4a6"], "path_name": ["中国", "浙江省", "嘉兴市", "海宁市"], "status": "active", "sort": 949, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "f9e94e6a-19e6-4290-9724-82c6c69c1fea", "_rev": "2-9eb053fc38ffd1236ed27d461233c0d4", "type": "region", "code": "370687", "name": "海阳市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "f9e94e6a-19e6-4290-9724-82c6c69c1fea"], "path_name": ["中国", "山东省", "烟台市", "海阳市"], "status": "active", "sort": 956, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "fa62a27a-6dca-48cf-ac90-500d0dead05f", "_rev": "2-534622865a0ec1369ddcb86674e7a1d5", "type": "region", "code": "632223", "name": "海晏县", "parent_id": "2bf3b2cb-593a-43d2-8935-ee539787b601", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "2bf3b2cb-593a-43d2-8935-ee539787b601", "fa62a27a-6dca-48cf-ac90-500d0dead05f"], "path_name": ["中国", "青海省", "海北藏族自治州", "海晏县"], "status": "active", "sort": 955, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "ff999015-aa4e-4231-8197-8f7b64df1ed9", "_rev": "2-7278a3295ea1b2f2723750c5b6608213", "type": "region", "code": "130924", "name": "海兴县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "ff999015-aa4e-4231-8197-8f7b64df1ed9"], "path_name": ["中国", "河北省", "沧州市", "海兴县"], "status": "active", "sort": 953, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:01"} +{"_id": "2a9ec2fe-411e-4470-9a08-14457d75ae85", "_rev": "2-da0c9358e401df499b540e1808f772d4", "type": "region", "code": "610921", "name": "汉阴县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "2a9ec2fe-411e-4470-9a08-14457d75ae85"], "path_name": ["中国", "陕西省", "安康市", "汉阴县"], "status": "active", "sort": 972, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "486c77ef-e53b-4e9e-902f-128d5ee4b64d", "_rev": "2-6538c80fa96726a2f2206b7f28654a86", "type": "region", "code": "430722", "name": "汉寿县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "486c77ef-e53b-4e9e-902f-128d5ee4b64d"], "path_name": ["中国", "湖南省", "常德市", "汉寿县"], "status": "active", "sort": 969, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "4ac5c3f2-2256-409e-a33c-d12bd01174a4", "_rev": "2-3423c45d90e0e089db7a7ff46f0e5fbd", "type": "region", "code": "440512", "name": "濠江区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "4ac5c3f2-2256-409e-a33c-d12bd01174a4"], "path_name": ["中国", "广东省", "汕头市", "濠江区"], "status": "active", "sort": 976, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "544078b2-79a3-4f83-8e57-1d257f3ce30a", "_rev": "2-752d504005040ba26cb5ad0be2287e10", "type": "region", "code": "350303", "name": "涵江区", "parent_id": "60031958-e67a-4094-8ab0-04087026e22e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e", "544078b2-79a3-4f83-8e57-1d257f3ce30a"], "path_name": ["中国", "福建省", "莆田市", "涵江区"], "status": "active", "sort": 963, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "63b112a8-90cf-4c03-9bbd-96e4c1eb7bdc", "_rev": "2-71341859555840f8d30896b3e15a2755", "type": "region", "code": "150826", "name": "杭锦后旗", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "63b112a8-90cf-4c03-9bbd-96e4c1eb7bdc"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "杭锦后旗"], "status": "active", "sort": 974, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "67545978-2950-4f0e-b909-6ae80e2e5503", "_rev": "2-bfa2cda7e8673c344ae9d8b6c6c1f9aa", "type": "region", "code": "511823", "name": "汉源县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "67545978-2950-4f0e-b909-6ae80e2e5503"], "path_name": ["中国", "四川省", "雅安市", "汉源县"], "status": "active", "sort": 973, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "9095079e-d06d-4250-a7b5-c4998da49da6", "_rev": "2-5e9994238c53f60717f17482c2597064", "type": "region", "code": "150625", "name": "杭锦旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "9095079e-d06d-4250-a7b5-c4998da49da6"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "杭锦旗"], "status": "active", "sort": 975, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "98bb1925-d16b-4e44-90c2-30b2f7c8379c", "_rev": "2-7b9a7dc3f0a28b5eccd2516d9dab6db7", "type": "region", "code": "610581", "name": "韩城市", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "98bb1925-d16b-4e44-90c2-30b2f7c8379c"], "path_name": ["中国", "陕西省", "渭南市", "韩城市"], "status": "active", "sort": 964, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "ac841925-8aca-4379-89d5-58272bb06e9f", "_rev": "2-ac61ece608fd845c00f1450baa063f81", "type": "region", "code": "610702", "name": "汉台区", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "ac841925-8aca-4379-89d5-58272bb06e9f"], "path_name": ["中国", "陕西省", "汉中市", "汉台区"], "status": "active", "sort": 970, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "b19df1b7-159e-4b94-b0d5-d1e42ca11b72", "_rev": "2-107afce55ab3eed15709276ffb7c8eb5", "type": "region", "code": "450521", "name": "合浦县", "parent_id": "365589cb-9802-4c16-a2c9-01214670c990", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "365589cb-9802-4c16-a2c9-01214670c990", "b19df1b7-159e-4b94-b0d5-d1e42ca11b72"], "path_name": ["中国", "广西壮族自治区", "北海市", "合浦县"], "status": "active", "sort": 979, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "b4e3e1c7-967c-4734-a3a9-114307cbd254", "_rev": "2-88989ddb0e1a7968b8ef760153fbac49", "type": "region", "code": "420113", "name": "汉南区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "b4e3e1c7-967c-4734-a3a9-114307cbd254"], "path_name": ["中国", "湖北省", "武汉市", "汉南区"], "status": "active", "sort": 968, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "cac0cb05-2a4e-410a-9eb1-5026645c601d", "_rev": "2-3d3ef257abc1c578cbdefad0492e3b24", "type": "region", "code": "420984", "name": "汉川市", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "cac0cb05-2a4e-410a-9eb1-5026645c601d"], "path_name": ["中国", "湖北省", "孝感市", "汉川市"], "status": "active", "sort": 967, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "cb8d6173-6593-4757-8e4a-a6461e1a8483", "_rev": "2-cf210741639524af9017bae805932081", "type": "region", "code": "420105", "name": "汉阳区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "cb8d6173-6593-4757-8e4a-a6461e1a8483"], "path_name": ["中国", "湖北省", "武汉市", "汉阳区"], "status": "active", "sort": 971, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "d520ba1f-2a1b-4019-96a8-51b13ceb4c96", "_rev": "2-fa9c5b8d387080ab4609b6c2d346c531", "type": "region", "code": "500117", "name": "合川区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "d520ba1f-2a1b-4019-96a8-51b13ceb4c96"], "path_name": ["中国", "重庆市", "合川区"], "status": "active", "sort": 977, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "e6b9d8bc-a6d0-4cc8-83ef-0b99ce030e7b", "_rev": "2-4be5218195d09c25fa6b97e62e8b9d81", "type": "region", "code": "370703", "name": "寒亭区", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "e6b9d8bc-a6d0-4cc8-83ef-0b99ce030e7b"], "path_name": ["中国", "山东省", "潍坊市", "寒亭区"], "status": "active", "sort": 965, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "f5dfeccb-5999-4313-a81f-d923e6445764", "_rev": "2-b5f0de4ecb18403c7c34d17bfdd174d7", "type": "region", "code": "610902", "name": "汉滨区", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "f5dfeccb-5999-4313-a81f-d923e6445764"], "path_name": ["中国", "陕西省", "安康市", "汉滨区"], "status": "active", "sort": 966, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "fa8ce0a6-e2d7-4833-9b2e-567320f448e3", "_rev": "2-acde1c978743888dd260583e2611db8a", "type": "region", "code": "510522", "name": "合江县", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "fa8ce0a6-e2d7-4833-9b2e-567320f448e3"], "path_name": ["中国", "四川省", "泸州市", "合江县"], "status": "active", "sort": 978, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:02"} +{"_id": "04458e37-43a5-4030-b720-b03bc8cac34e", "_rev": "2-bfba13deb66e5f75655e9a9c4a791d9c", "type": "region", "code": "140723", "name": "和顺县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "04458e37-43a5-4030-b720-b03bc8cac34e"], "path_name": ["中国", "山西省", "晋中市", "和顺县"], "status": "active", "sort": 993, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "_rev": "2-9e83bec7b8fbd34d95e080d44fb61c2a", "type": "region", "code": "150100", "name": "呼和浩特市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市"], "status": "active", "sort": 988, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "218e190a-7140-43f6-89db-e48db7f443ee", "_rev": "2-2209cdbb5331090452dface7b207a876", "type": "region", "code": "451300", "name": "来宾市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee"], "path_name": ["中国", "广西壮族自治区", "来宾市"], "status": "active", "sort": 980, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "29e73793-8514-4c52-97be-01d48e666fe3", "_rev": "2-ef3cce5565204ad7078eebb74c983629", "type": "region", "code": "610524", "name": "合阳县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "29e73793-8514-4c52-97be-01d48e666fe3"], "path_name": ["中国", "陕西省", "渭南市", "合阳县"], "status": "active", "sort": 984, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "2d28b1cd-b7b3-462e-a9bb-40dc9115bcc6", "_rev": "2-b3ddf8c6fe5a8d25fb69c8e44005e89a", "type": "region", "code": "621024", "name": "合水县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "2d28b1cd-b7b3-462e-a9bb-40dc9115bcc6"], "path_name": ["中国", "甘肃省", "庆阳市", "合水县"], "status": "active", "sort": 983, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "466263d8-2ed4-4369-92a6-0d6c5e826fc3", "_rev": "2-005634ce7831e6455f6d61d620b2006c", "type": "region", "code": "623001", "name": "合作市", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "466263d8-2ed4-4369-92a6-0d6c5e826fc3"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "合作市"], "status": "active", "sort": 985, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "4f615b4a-0aa4-4fcb-9dda-3116738f5477", "_rev": "2-10d590bd2e3bb4de090909a3a4a9eb40", "type": "region", "code": "451381", "name": "合山市", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "4f615b4a-0aa4-4fcb-9dda-3116738f5477"], "path_name": ["中国", "广西壮族自治区", "来宾市", "合山市"], "status": "active", "sort": 981, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "591aaae5-6ab2-49c4-bf9c-1f565c7ce146", "_rev": "2-3902fc31563b40821bc2d99b6a484c8b", "type": "region", "code": "150123", "name": "和林格尔县", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "591aaae5-6ab2-49c4-bf9c-1f565c7ce146"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "和林格尔县"], "status": "active", "sort": 989, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "59903063-8c5b-4166-b06a-98839f12791a", "_rev": "2-14d5c5dcc60911ce22238d327d5f8f44", "type": "region", "code": "652827", "name": "和静县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "59903063-8c5b-4166-b06a-98839f12791a"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "和静县"], "status": "active", "sort": 987, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "5a8572f2-062e-49c5-82be-c04ca8109fb4", "_rev": "2-b9d8bce7a67f308b9e5dff79b459d118", "type": "region", "code": "441624", "name": "和平县", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "5a8572f2-062e-49c5-82be-c04ca8109fb4"], "path_name": ["中国", "广东省", "河源市", "和平县"], "status": "active", "sort": 991, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "7ea216ca-2776-42a0-a9cc-6612ee955657", "_rev": "2-60c6f4bf9fbfcf06833ee963931ce283", "type": "region", "code": "652828", "name": "和硕县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "7ea216ca-2776-42a0-a9cc-6612ee955657"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "和硕县"], "status": "active", "sort": 994, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "9a0c8701-4547-4502-ac71-5efdaec7d314", "_rev": "2-7c43be363526679a3dd2764848a6eb99", "type": "region", "code": "222406", "name": "和龙市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "9a0c8701-4547-4502-ac71-5efdaec7d314"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "和龙市"], "status": "active", "sort": 990, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "a5d9cef1-852f-47e6-b708-b958aaf1b85f", "_rev": "2-98032decef7ac0d717418a5cfb7edffc", "type": "region", "code": "654226", "name": "和布克赛尔蒙古自治县", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "a5d9cef1-852f-47e6-b708-b958aaf1b85f"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "和布克赛尔蒙古自治县"], "status": "active", "sort": 986, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "_rev": "2-c2e9c010f92e3b4f6f9bce5f26486e90", "type": "region", "code": "140700", "name": "晋中市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3"], "path_name": ["中国", "山西省", "晋中市"], "status": "active", "sort": 992, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "_rev": "2-3bc53ee37c84af80c4bba158c98ce3e4", "type": "region", "code": "621000", "name": "庆阳市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b"], "path_name": ["中国", "甘肃省", "庆阳市"], "status": "active", "sort": 982, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:03"} +{"_id": "17f8b059-7062-45a6-b70b-559f2f4c74d4", "_rev": "2-392c0af2475eb6a007b4a1b779816058", "type": "region", "code": "632324", "name": "河南蒙古族自治县", "parent_id": "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "17f8b059-7062-45a6-b70b-559f2f4c74d4"], "path_name": ["中国", "青海省", "黄南藏族自治州", "河南蒙古族自治县"], "status": "active", "sort": 1006, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "_rev": "2-094132c36ac674633040e7391aaf879d", "type": "region", "code": "140800", "name": "运城市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0"], "path_name": ["中国", "山西省", "运城市"], "status": "active", "sort": 1001, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "4b36d691-b6d3-4b8b-8ce3-62d7a7a51308", "_rev": "2-23faf00f0cd3e37330d11b74fa68979e", "type": "region", "code": "140930", "name": "河曲县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "4b36d691-b6d3-4b8b-8ce3-62d7a7a51308"], "path_name": ["中国", "山西省", "忻州市", "河曲县"], "status": "active", "sort": 1007, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "5431a877-d41a-4dfc-ba8b-e733ce7e2aba", "_rev": "2-759da853bfb9caca6a58a298ff3cfe3a", "type": "region", "code": "653221", "name": "和田县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "5431a877-d41a-4dfc-ba8b-e733ce7e2aba"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "和田县"], "status": "active", "sort": 996, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "_rev": "2-8b158d144c15a011d24b1249d705ea78", "type": "region", "code": "632300", "name": "黄南藏族自治州", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "57bcfd82-2aff-4980-8c51-1dfd6af82a90"], "path_name": ["中国", "青海省", "黄南藏族自治州"], "status": "active", "sort": 1005, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "773eb7e7-eebc-42aa-a269-31597adadcfd", "_rev": "2-0645fe66a8ce2eaf23a8e2503eb66fed", "type": "region", "code": "130984", "name": "河间市", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "773eb7e7-eebc-42aa-a269-31597adadcfd"], "path_name": ["中国", "河北省", "沧州市", "河间市"], "status": "active", "sort": 1000, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "7b1cb43a-0779-403d-899a-73c3535f7e48", "_rev": "2-186e616d71b7586603d16741ac401301", "type": "region", "code": "340523", "name": "和县", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "7b1cb43a-0779-403d-899a-73c3535f7e48"], "path_name": ["中国", "安徽省", "马鞍山市", "和县"], "status": "active", "sort": 997, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "7cb2455a-113f-4515-83d8-b0e9e7f314de", "_rev": "2-2314361ddda634c01b7e5d66f68988f1", "type": "region", "code": "140882", "name": "河津市", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "7cb2455a-113f-4515-83d8-b0e9e7f314de"], "path_name": ["中国", "山西省", "运城市", "河津市"], "status": "active", "sort": 1002, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "82e12a8d-b1e7-4d14-ab57-ac7766ecdc87", "_rev": "2-c0233968512e0583a0e6b29c75586327", "type": "region", "code": "622925", "name": "和政县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "82e12a8d-b1e7-4d14-ab57-ac7766ecdc87"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "和政县"], "status": "active", "sort": 998, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "9f88287a-ad35-4b58-bb0d-3c715845a83a", "_rev": "2-90c014fedbaac84c2001a4166d1b38d0", "type": "region", "code": "370503", "name": "河口区", "parent_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "9f88287a-ad35-4b58-bb0d-3c715845a83a"], "path_name": ["中国", "山东省", "东营市", "河口区"], "status": "active", "sort": 1003, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "a3261d05-ebdc-4206-8601-dd97157027eb", "_rev": "2-b29f481aecc11447fe6493078f376e3d", "type": "region", "code": "120105", "name": "河北区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "a3261d05-ebdc-4206-8601-dd97157027eb"], "path_name": ["中国", "天津市", "河北区"], "status": "active", "sort": 999, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "aa73ea54-843a-4cfa-9d85-59ab0f058f70", "_rev": "2-e3c88657c028c5079f44164caaf84aca", "type": "region", "code": "653201", "name": "和田市", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "aa73ea54-843a-4cfa-9d85-59ab0f058f70"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "和田市"], "status": "active", "sort": 995, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "c20d5a39-6f65-4b73-88df-9195857a88ed", "_rev": "2-1ba3bcbfefa2fa6f826fa2943deb7e03", "type": "region", "code": "120103", "name": "河西区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "c20d5a39-6f65-4b73-88df-9195857a88ed"], "path_name": ["中国", "天津市", "河西区"], "status": "active", "sort": 1008, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "c2d2236e-d0a4-4db5-9b9c-5e4fa158686b", "_rev": "2-77151b2deb28dbaa737c2f627b0c26d2", "type": "region", "code": "532532", "name": "河口瑶族自治县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "c2d2236e-d0a4-4db5-9b9c-5e4fa158686b"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "河口瑶族自治县"], "status": "active", "sort": 1004, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:04"} +{"_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "_rev": "2-f123870a984a1e7a12c1ec0857d7a694", "type": "region", "code": "640100", "name": "银川市", "parent_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662"], "path_name": ["中国", "宁夏回族自治区", "银川市"], "status": "active", "sort": 1010, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "12633616-64ba-459b-91dd-8625d5d3a8b2", "_rev": "2-a0a3bf2680d248e3bc4db07b15b9453b", "type": "region", "code": "422828", "name": "鹤峰县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "12633616-64ba-459b-91dd-8625d5d3a8b2"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "鹤峰县"], "status": "active", "sort": 1015, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "190dc27d-ea38-46b2-807f-09d51c51962d", "_rev": "2-9df3a50cb011fd96fef4a2b3c0062dc2", "type": "region", "code": "640122", "name": "贺兰县", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "190dc27d-ea38-46b2-807f-09d51c51962d"], "path_name": ["中国", "宁夏回族自治区", "银川市", "贺兰县"], "status": "active", "sort": 1011, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "40259376-238b-498a-8d74-3d7fb3a463de", "_rev": "2-d0d6e42326179f9ad0456616a8c3d557", "type": "region", "code": "440784", "name": "鹤山市", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "40259376-238b-498a-8d74-3d7fb3a463de"], "path_name": ["中国", "广东省", "江门市", "鹤山市"], "status": "active", "sort": 1019, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "468c6c16-e779-4e6a-9671-7633e9879534", "_rev": "2-ac0b901e4aa59dae0864e0e73ac471a2", "type": "region", "code": "431202", "name": "鹤城区", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "468c6c16-e779-4e6a-9671-7633e9879534"], "path_name": ["中国", "湖南省", "怀化市", "鹤城区"], "status": "active", "sort": 1014, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "64f9d125-7c4a-4ecc-8b15-4dcc669913f6", "_rev": "2-0edc24642cab76d99233d6daaff0ea8d", "type": "region", "code": "430903", "name": "赫山区", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "64f9d125-7c4a-4ecc-8b15-4dcc669913f6"], "path_name": ["中国", "湖南省", "益阳市", "赫山区"], "status": "active", "sort": 1012, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "_rev": "2-5b46a16095aee3d6fb2670c92e8c0c21", "type": "region", "code": "410600", "name": "鹤壁市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7"], "path_name": ["中国", "河南省", "鹤壁市"], "status": "active", "sort": 1017, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "bee91663-0d7f-4c3d-a41a-275ed638d80f", "_rev": "2-9912e5431613b7480dac8a5463fe20f3", "type": "region", "code": "430202", "name": "荷塘区", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "bee91663-0d7f-4c3d-a41a-275ed638d80f"], "path_name": ["中国", "湖南省", "株洲市", "荷塘区"], "status": "active", "sort": 1009, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "d18b36b1-07f8-496d-90a2-7a40645d5ff2", "_rev": "2-d2a4a53fb7d1910fee9b383118402428", "type": "region", "code": "410602", "name": "鹤山区", "parent_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7", "d18b36b1-07f8-496d-90a2-7a40645d5ff2"], "path_name": ["中国", "河南省", "鹤壁市", "鹤山区"], "status": "active", "sort": 1018, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "d5e47663-b2b8-4479-a7bf-1b5a7dbafa24", "_rev": "2-bb558a04604ade77e36573b97022100c", "type": "region", "code": "520527", "name": "赫章县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "d5e47663-b2b8-4479-a7bf-1b5a7dbafa24"], "path_name": ["中国", "贵州省", "毕节市", "赫章县"], "status": "active", "sort": 1013, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "e590c902-b49f-4416-9581-f7062333cf4b", "_rev": "2-6d0f2b3018cdb63eab7176cea7f91a55", "type": "region", "code": "210726", "name": "黑山县", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "e590c902-b49f-4416-9581-f7062333cf4b"], "path_name": ["中国", "辽宁省", "锦州市", "黑山县"], "status": "active", "sort": 1020, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "eca56f76-1996-43d0-96c8-2cbb23dad02b", "_rev": "2-ee10eb877e6f3e82e84630ef15761b87", "type": "region", "code": "513228", "name": "黑水县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "eca56f76-1996-43d0-96c8-2cbb23dad02b"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "黑水县"], "status": "active", "sort": 1021, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "f28fc7d1-483b-40db-8068-85a550d90057", "_rev": "2-affc5c5527799c9c9f222441e475cc4a", "type": "region", "code": "532932", "name": "鹤庆县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "f28fc7d1-483b-40db-8068-85a550d90057"], "path_name": ["中国", "云南省", "大理白族自治州", "鹤庆县"], "status": "active", "sort": 1016, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:05"} +{"_id": "04c04b84-acca-486c-b423-8d60acdad882", "_rev": "2-7e8eb7d96bc0ff1f937ba07486d225cc", "type": "region", "code": "230605", "name": "红岗区", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "04c04b84-acca-486c-b423-8d60acdad882"], "path_name": ["中国", "黑龙江省", "大庆市", "红岗区"], "status": "active", "sort": 1032, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "0f11ed2c-172a-4f72-82ca-cd46508ac9f3", "_rev": "2-aea628eb1c2942bd333d898ffc23a128", "type": "region", "code": "610803", "name": "横山区", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "0f11ed2c-172a-4f72-82ca-cd46508ac9f3"], "path_name": ["中国", "陕西省", "榆林市", "横山区"], "status": "active", "sort": 1024, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "256250b5-831e-4fec-8050-1f34d4ddc608", "_rev": "2-c3a48ada615b8dc1fe8b80e9d069d5ab", "type": "region", "code": "620111", "name": "红古区", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "256250b5-831e-4fec-8050-1f34d4ddc608"], "path_name": ["中国", "甘肃省", "兰州市", "红古区"], "status": "active", "sort": 1033, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "2e315965-0480-48ae-b3b8-418612b30c48", "_rev": "2-c4a751ff3e27b2819090fb4834c892f8", "type": "region", "code": "421122", "name": "红安县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "2e315965-0480-48ae-b3b8-418612b30c48"], "path_name": ["中国", "湖北省", "黄冈市", "红安县"], "status": "active", "sort": 1031, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "51ffd238-09f6-4724-9883-a0430afdc77f", "_rev": "2-cd282104a26623b13b00780c3f7a1bba", "type": "region", "code": "430423", "name": "衡山县", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "51ffd238-09f6-4724-9883-a0430afdc77f"], "path_name": ["中国", "湖南省", "衡阳市", "衡山县"], "status": "active", "sort": 1028, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "65b80dbb-20e2-437c-b342-81157a1a46e9", "_rev": "2-0214afea80aa337fa96319827b553fde", "type": "region", "code": "230303", "name": "恒山区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "65b80dbb-20e2-437c-b342-81157a1a46e9"], "path_name": ["中国", "黑龙江省", "鸡西市", "恒山区"], "status": "active", "sort": 1022, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "6669de31-20d0-444f-8cf9-890a344ca866", "_rev": "2-7057bc8528795a5030f6e02dd284058d", "type": "region", "code": "450181", "name": "横州市", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "6669de31-20d0-444f-8cf9-890a344ca866"], "path_name": ["中国", "广西壮族自治区", "南宁市", "横州市"], "status": "active", "sort": 1025, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "6e55b94d-81c6-4e52-a980-93da8326c1d5", "_rev": "2-352ff9c73afd9429b1c568adb5901241", "type": "region", "code": "361125", "name": "横峰县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "6e55b94d-81c6-4e52-a980-93da8326c1d5"], "path_name": ["中国", "江西省", "上饶市", "横峰县"], "status": "active", "sort": 1023, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "8f15d27d-f054-4ff8-a690-99bf77347cae", "_rev": "2-8655857e052c096dd79ba6706852896b", "type": "region", "code": "520302", "name": "红花岗区", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "8f15d27d-f054-4ff8-a690-99bf77347cae"], "path_name": ["中国", "贵州省", "遵义市", "红花岗区"], "status": "active", "sort": 1035, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "_rev": "2-6e9a2a2fb69004d625e7b5764a5ffb42", "type": "region", "code": "421100", "name": "黄冈市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4"], "path_name": ["中国", "湖北省", "黄冈市"], "status": "active", "sort": 1030, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "b57d246f-a475-46ec-9223-cd2538b436b0", "_rev": "2-889763b540f66cee13821e6832f1f3ab", "type": "region", "code": "120106", "name": "红桥区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "b57d246f-a475-46ec-9223-cd2538b436b0"], "path_name": ["中国", "天津市", "红桥区"], "status": "active", "sort": 1037, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "b6ba795b-19c2-4e11-a940-bb6983ead2f1", "_rev": "2-ba6a5d114086a15d80bfbb1d912fb968", "type": "region", "code": "430424", "name": "衡东县", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "b6ba795b-19c2-4e11-a940-bb6983ead2f1"], "path_name": ["中国", "湖南省", "衡阳市", "衡东县"], "status": "active", "sort": 1026, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "bb13a261-16dc-433f-8536-4b0c60beca93", "_rev": "2-7b28a319114ece7967e8da68ba40cf45", "type": "region", "code": "430421", "name": "衡阳县", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "bb13a261-16dc-433f-8536-4b0c60beca93"], "path_name": ["中国", "湖南省", "衡阳市", "衡阳县"], "status": "active", "sort": 1029, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "ceea5b36-814e-4754-a59e-3ddf760f82c3", "_rev": "2-62107e3bd5947d73201da9de94bee5b4", "type": "region", "code": "410702", "name": "红旗区", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "ceea5b36-814e-4754-a59e-3ddf760f82c3"], "path_name": ["中国", "河南省", "新乡市", "红旗区"], "status": "active", "sort": 1036, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "d2054d5c-22f7-49a9-91ff-3a0656981c3a", "_rev": "2-3fd66ff0e2189df375a1d49e18f43881", "type": "region", "code": "430422", "name": "衡南县", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "d2054d5c-22f7-49a9-91ff-3a0656981c3a"], "path_name": ["中国", "湖南省", "衡阳市", "衡南县"], "status": "active", "sort": 1027, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "e1a00cc0-05a9-4470-8e2b-f4230a5b6377", "_rev": "2-ac0b77fdded54c5f8788a1085d3fe6c2", "type": "region", "code": "532529", "name": "红河县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "e1a00cc0-05a9-4470-8e2b-f4230a5b6377"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "红河县"], "status": "active", "sort": 1034, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:06"} +{"_id": "059115b6-f0b2-4fc3-acb3-bb92c9e7e384", "_rev": "2-63aeded2ebeb0377120a0a7f9fa13e5c", "type": "region", "code": "431281", "name": "洪江市", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "059115b6-f0b2-4fc3-acb3-bb92c9e7e384"], "path_name": ["中国", "湖南省", "怀化市", "洪江市"], "status": "active", "sort": 1047, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "_rev": "2-e062058db42d73133d7cd101cbdb654c", "type": "region", "code": "640300", "name": "吴忠市", "parent_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858"], "path_name": ["中国", "宁夏回族自治区", "吴忠市"], "status": "active", "sort": 1039, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "18e24eea-354c-45cd-9489-7d6b89afcbb7", "_rev": "2-87a95a97bfb89d6650d2e1589cc47543", "type": "region", "code": "513233", "name": "红原县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "18e24eea-354c-45cd-9489-7d6b89afcbb7"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "红原县"], "status": "active", "sort": 1042, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "34384b3d-c349-49f5-97cd-497b027aa733", "_rev": "2-b4894752d3b6ec538fb9745e4d46abf0", "type": "region", "code": "320800", "name": "淮安市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733"], "path_name": ["中国", "江苏省", "淮安市"], "status": "active", "sort": 1050, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "372fb75e-8859-4cd6-8557-e3eea12c814e", "_rev": "2-cb36e7992a35663effdab338aa9575ac", "type": "region", "code": "511423", "name": "洪雅县", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "372fb75e-8859-4cd6-8557-e3eea12c814e"], "path_name": ["中国", "四川省", "眉山市", "洪雅县"], "status": "active", "sort": 1049, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "4a80463e-427a-4ff4-9db4-fa2d442f584f", "_rev": "2-7af386634a05d817d3454e1488b73261", "type": "region", "code": "150402", "name": "红山区", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "4a80463e-427a-4ff4-9db4-fa2d442f584f"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "红山区"], "status": "active", "sort": 1038, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "4ab7773c-f8a3-46d3-86dd-58a1075eb6bf", "_rev": "2-da30c63dd6001237e327b6d43367819d", "type": "region", "code": "141081", "name": "侯马市", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "4ab7773c-f8a3-46d3-86dd-58a1075eb6bf"], "path_name": ["中国", "山西省", "临汾市", "侯马市"], "status": "active", "sort": 1052, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "74bebe5e-cbf7-4c14-99e5-48409a3748a1", "_rev": "2-606e4895068f1556f56e21a1d4805fb2", "type": "region", "code": "640303", "name": "红寺堡区", "parent_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858", "74bebe5e-cbf7-4c14-99e5-48409a3748a1"], "path_name": ["中国", "宁夏回族自治区", "吴忠市", "红寺堡区"], "status": "active", "sort": 1040, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "859cb1d8-5df3-4884-8eb6-6da410725533", "_rev": "2-f3d529f474057c5d2596d83d5caa5688", "type": "region", "code": "141024", "name": "洪洞县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "859cb1d8-5df3-4884-8eb6-6da410725533"], "path_name": ["中国", "山西省", "临汾市", "洪洞县"], "status": "active", "sort": 1045, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "a4dadb86-d7fd-4e49-871f-54bd75d12c68", "_rev": "2-2688fd48bf410ef045c81d3cb7176af9", "type": "region", "code": "211004", "name": "宏伟区", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "a4dadb86-d7fd-4e49-871f-54bd75d12c68"], "path_name": ["中国", "辽宁省", "辽阳市", "宏伟区"], "status": "active", "sort": 1043, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "d98f9984-3d9b-4201-90a2-358581fc4090", "_rev": "2-8f0edd8823db524a694749e8992c3339", "type": "region", "code": "420111", "name": "洪山区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "d98f9984-3d9b-4201-90a2-358581fc4090"], "path_name": ["中国", "湖北省", "武汉市", "洪山区"], "status": "active", "sort": 1048, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "dfb5fe21-7679-4cbd-9838-1510422d1e08", "_rev": "2-b10e64cc769034eff7f36b883168e1d5", "type": "region", "code": "530402", "name": "红塔区", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "dfb5fe21-7679-4cbd-9838-1510422d1e08"], "path_name": ["中国", "云南省", "玉溪市", "红塔区"], "status": "active", "sort": 1041, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "e7a5f001-bdf1-4764-8ac5-fe127a6c0c85", "_rev": "2-89adf3ccd11172d937f4b520609eebaa", "type": "region", "code": "320813", "name": "洪泽区", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "e7a5f001-bdf1-4764-8ac5-fe127a6c0c85"], "path_name": ["中国", "江苏省", "淮安市", "洪泽区"], "status": "active", "sort": 1051, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "e930f17d-e9fb-4177-a20d-42e7e61144cc", "_rev": "2-e39d6f14e9a0745479d1e24b9f9de5d9", "type": "region", "code": "310109", "name": "虹口区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "e930f17d-e9fb-4177-a20d-42e7e61144cc"], "path_name": ["中国", "上海市", "虹口区"], "status": "active", "sort": 1044, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "f196439a-efaf-4db4-bdbe-025b787e4703", "_rev": "2-f6d801f6e92a0896cbfe1d456cc9ef69", "type": "region", "code": "421083", "name": "洪湖市", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "f196439a-efaf-4db4-bdbe-025b787e4703"], "path_name": ["中国", "湖北省", "荆州市", "洪湖市"], "status": "active", "sort": 1046, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:07"} +{"_id": "37bd4960-95c4-4b5c-90b7-581e97f6b51a", "_rev": "2-ed8747ffc31203f2be5a1c1eb8bcba60", "type": "region", "code": "230111", "name": "呼兰区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "37bd4960-95c4-4b5c-90b7-581e97f6b51a"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "呼兰区"], "status": "active", "sort": 1053, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "_rev": "2-579a36d18cc8eeed402552d9dbcc5d7c", "type": "region", "code": "630200", "name": "海东市", "parent_id": "46542235-7bbc-4c95-a6e8-7149292078e5", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715"], "path_name": ["中国", "青海省", "海东市"], "status": "active", "sort": 1065, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "3c9bded4-947c-4c39-bab9-006c516fdc69", "_rev": "2-22a34b392126db72bc7fd13c951bff07", "type": "region", "code": "320505", "name": "虎丘区", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "3c9bded4-947c-4c39-bab9-006c516fdc69"], "path_name": ["中国", "江苏省", "苏州市", "虎丘区"], "status": "active", "sort": 1064, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "3dc827f3-fe7f-4e18-9b68-02c672b77abb", "_rev": "2-e44a53c7adc656f62922745048d6d19c", "type": "region", "code": "350206", "name": "湖里区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "3dc827f3-fe7f-4e18-9b68-02c672b77abb"], "path_name": ["中国", "福建省", "厦门市", "湖里区"], "status": "active", "sort": 1062, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "421d3fe9-706c-42ec-9716-4d31a03d7e03", "_rev": "2-bd386040012b3ceda1771b3f6805a5e5", "type": "region", "code": "652323", "name": "呼图壁县", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "421d3fe9-706c-42ec-9716-4d31a03d7e03"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "呼图壁县"], "status": "active", "sort": 1056, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "4f8fd295-8c63-46b4-9a81-67ddbfb473a8", "_rev": "2-e67e700a06d33031e798e7e449ef955a", "type": "region", "code": "360429", "name": "湖口县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "4f8fd295-8c63-46b4-9a81-67ddbfb473a8"], "path_name": ["中国", "江西省", "九江市", "湖口县"], "status": "active", "sort": 1061, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "_rev": "2-54d2df95d67b69a9f7c0a1e9c73a3e19", "type": "region", "code": "140400", "name": "长治市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a"], "path_name": ["中国", "山西省", "长治市"], "status": "active", "sort": 1057, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "84c6938b-4094-4ac9-b53b-40a2589a8eaa", "_rev": "2-faf670cdc414bf373c9a971605930bb3", "type": "region", "code": "230381", "name": "虎林市", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "84c6938b-4094-4ac9-b53b-40a2589a8eaa"], "path_name": ["中国", "黑龙江省", "鸡西市", "虎林市"], "status": "active", "sort": 1063, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "911fdd22-8bff-4fd3-9148-67f9fc71847e", "_rev": "2-7c4680019c401b6c1729f3dcc3bdb99a", "type": "region", "code": "140427", "name": "壶关县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "911fdd22-8bff-4fd3-9148-67f9fc71847e"], "path_name": ["中国", "山西省", "长治市", "壶关县"], "status": "active", "sort": 1058, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "_rev": "2-cfe9066f94a46b0a40dfee794dae38c3", "type": "region", "code": "411200", "name": "三门峡市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16"], "path_name": ["中国", "河南省", "三门峡市"], "status": "active", "sort": 1059, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "_rev": "2-f050139e7340dda5587ed13847d36b35", "type": "region", "code": "232700", "name": "大兴安岭地区", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "a3ba5a37-3994-4d6a-be5b-f7378f134f04"], "path_name": ["中国", "黑龙江省", "大兴安岭地区"], "status": "active", "sort": 1054, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "acff72e7-e52f-4d16-a82e-2d01778cf11e", "_rev": "2-9f27c7962545e6982691914b9493d976", "type": "region", "code": "232721", "name": "呼玛县", "parent_id": "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "acff72e7-e52f-4d16-a82e-2d01778cf11e"], "path_name": ["中国", "黑龙江省", "大兴安岭地区", "呼玛县"], "status": "active", "sort": 1055, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "be08c64a-33fe-4e38-afa4-0f0e7ca7cbe5", "_rev": "2-4b86a6ddddafc15aaa6377a6a3668fa2", "type": "region", "code": "411202", "name": "湖滨区", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "be08c64a-33fe-4e38-afa4-0f0e7ca7cbe5"], "path_name": ["中国", "河南省", "三门峡市", "湖滨区"], "status": "active", "sort": 1060, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:08"} +{"_id": "002bde1d-9bd7-40a9-bc89-f49a3675281e", "_rev": "2-297a7a1996c5b5a6df4330ee2af73afa", "type": "region", "code": "440114", "name": "花都区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "002bde1d-9bd7-40a9-bc89-f49a3675281e"], "path_name": ["中国", "广东省", "广州市", "花都区"], "status": "active", "sort": 1068, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "26867865-1f5a-429a-aa24-bbcafa8fb5c5", "_rev": "2-2f5857404182b92660ddb4756d520b72", "type": "region", "code": "520111", "name": "花溪区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "26867865-1f5a-429a-aa24-bbcafa8fb5c5"], "path_name": ["中国", "贵州省", "贵阳市", "花溪区"], "status": "active", "sort": 1070, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "3a6517b2-a458-494d-b552-606448f54a77", "_rev": "2-b24f6c3f6a490655c6f11bbf162616df", "type": "region", "code": "530424", "name": "华宁县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "3a6517b2-a458-494d-b552-606448f54a77"], "path_name": ["中国", "云南省", "玉溪市", "华宁县"], "status": "active", "sort": 1075, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "553b4db2-7083-4268-9d07-ad8a65a160f3", "_rev": "2-f59da6acc3caf100a298a340a50cb5b8", "type": "region", "code": "350629", "name": "华安县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "553b4db2-7083-4268-9d07-ad8a65a160f3"], "path_name": ["中国", "福建省", "漳州市", "华安县"], "status": "active", "sort": 1072, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "680846ec-192a-48d5-8829-2d697e7130e6", "_rev": "2-ebd011d814b7c7f1d0b28252c6640bd6", "type": "region", "code": "433124", "name": "花垣县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "680846ec-192a-48d5-8829-2d697e7130e6"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "花垣县"], "status": "active", "sort": 1071, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "_rev": "2-d1927142fd80f71b9c8bee45ca7a5adb", "type": "region", "code": "430600", "name": "岳阳市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac"], "path_name": ["中国", "湖南省", "岳阳市"], "status": "active", "sort": 1078, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "7af69c57-9e76-4387-9ac3-29446b9f2a2e", "_rev": "2-2d50ab8af2f421ec894899d0f2bb0787", "type": "region", "code": "340503", "name": "花山区", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "7af69c57-9e76-4387-9ac3-29446b9f2a2e"], "path_name": ["中国", "安徽省", "马鞍山市", "花山区"], "status": "active", "sort": 1069, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "89842c0f-99e0-408c-9980-1e6892d310bb", "_rev": "2-bd2b254962f408e2d699e384804b74fb", "type": "region", "code": "610118", "name": "鄠邑区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "89842c0f-99e0-408c-9980-1e6892d310bb"], "path_name": ["中国", "陕西省", "西安市", "鄠邑区"], "status": "active", "sort": 1067, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "9659b23b-063f-45b5-9d68-f9a5735a0c3d", "_rev": "2-172904349b288887a97f564cc4957c07", "type": "region", "code": "410902", "name": "华龙区", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "9659b23b-063f-45b5-9d68-f9a5735a0c3d"], "path_name": ["中国", "河南省", "濮阳市", "华龙区"], "status": "active", "sort": 1074, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "d0a2b8b1-621c-439c-b100-21194257a633", "_rev": "2-c857619d3894b5a0e353b57b4bc4ee98", "type": "region", "code": "621023", "name": "华池县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "d0a2b8b1-621c-439c-b100-21194257a633"], "path_name": ["中国", "甘肃省", "庆阳市", "华池县"], "status": "active", "sort": 1073, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "dcdb34c8-ccbf-451e-8eab-e848ae97f2d6", "_rev": "2-6e358809894517ed7bcf7024624421dd", "type": "region", "code": "530723", "name": "华坪县", "parent_id": "b712f371-149e-4b45-aa88-755c77561518", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518", "dcdb34c8-ccbf-451e-8eab-e848ae97f2d6"], "path_name": ["中国", "云南省", "丽江市", "华坪县"], "status": "active", "sort": 1076, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "f6364f9f-5c96-44f0-8c5f-94b49eeac3ec", "_rev": "2-f9f51984b927b13f6daa8f4e00d4d2e5", "type": "region", "code": "420703", "name": "华容区", "parent_id": "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "f6364f9f-5c96-44f0-8c5f-94b49eeac3ec"], "path_name": ["中国", "湖北省", "鄂州市", "华容区"], "status": "active", "sort": 1077, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "fb154774-e82a-4a81-8bad-4f72e3708bfe", "_rev": "2-37fc4b9a3ff7298d49ab7e2a9a50749e", "type": "region", "code": "630223", "name": "互助土族自治县", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "fb154774-e82a-4a81-8bad-4f72e3708bfe"], "path_name": ["中国", "青海省", "海东市", "互助土族自治县"], "status": "active", "sort": 1066, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:09"} +{"_id": "0c2282fc-ec35-42c3-abe2-6140e88f2531", "_rev": "2-b9357019d9bb44590312fa695bf9687c", "type": "region", "code": "410526", "name": "滑县", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "0c2282fc-ec35-42c3-abe2-6140e88f2531"], "path_name": ["中国", "河南省", "安阳市", "滑县"], "status": "active", "sort": 1084, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "1d27aa6f-3116-4254-9fcc-22610f6463ef", "_rev": "2-dbabebe2ace7fadf861ef5aff4c10be9", "type": "region", "code": "610582", "name": "华阴市", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "1d27aa6f-3116-4254-9fcc-22610f6463ef"], "path_name": ["中国", "陕西省", "渭南市", "华阴市"], "status": "active", "sort": 1081, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "51904a4c-4a84-40e2-bfc1-34cf9eac8ac2", "_rev": "2-0696985ec94ffdc15176609c1c79047d", "type": "region", "code": "610503", "name": "华州区", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "51904a4c-4a84-40e2-bfc1-34cf9eac8ac2"], "path_name": ["中国", "陕西省", "渭南市", "华州区"], "status": "active", "sort": 1083, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "54cdabe1-a095-4677-84f1-542c139c8928", "_rev": "2-ff0515a2fd67e676056bd0f3055d60aa", "type": "region", "code": "220282", "name": "桦甸市", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "54cdabe1-a095-4677-84f1-542c139c8928"], "path_name": ["中国", "吉林省", "吉林市", "桦甸市"], "status": "active", "sort": 1089, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "63c6dd82-c5db-4b19-949f-77aec5514e1a", "_rev": "2-b09bedf6c4c1f747774893b60605ebb8", "type": "region", "code": "441224", "name": "怀集县", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "63c6dd82-c5db-4b19-949f-77aec5514e1a"], "path_name": ["中国", "广东省", "肇庆市", "怀集县"], "status": "active", "sort": 1091, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "6b96f4f4-8072-40c0-b3bf-eccd9d690adc", "_rev": "2-f5ea787d68a2e35c4bbde7257c9e1d02", "type": "region", "code": "130728", "name": "怀安县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "6b96f4f4-8072-40c0-b3bf-eccd9d690adc"], "path_name": ["中国", "河北省", "张家口市", "怀安县"], "status": "active", "sort": 1090, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "ab0920c1-a99a-4ebb-be87-4c254efe044e", "_rev": "2-56073138206c2a53a81eca290aeb2180", "type": "region", "code": "620881", "name": "华亭市", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "ab0920c1-a99a-4ebb-be87-4c254efe044e"], "path_name": ["中国", "甘肃省", "平凉市", "华亭市"], "status": "active", "sort": 1080, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "abe6152a-b753-49fb-8955-6d22239b9dd4", "_rev": "2-f47dc6775532670d6ee58849f12636dd", "type": "region", "code": "130730", "name": "怀来县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "abe6152a-b753-49fb-8955-6d22239b9dd4"], "path_name": ["中国", "河北省", "张家口市", "怀来县"], "status": "active", "sort": 1092, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "aca998a9-def7-4d13-bfbc-fd47a4a0b701", "_rev": "2-6e3a716b66376544bed28051de8505ee", "type": "region", "code": "511681", "name": "华蓥市", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "aca998a9-def7-4d13-bfbc-fd47a4a0b701"], "path_name": ["中国", "四川省", "广安市", "华蓥市"], "status": "active", "sort": 1082, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "ae1557ea-3224-41b2-abb9-9efa4ada2f77", "_rev": "2-581da31316210b350466e99c9d2c0e74", "type": "region", "code": "230826", "name": "桦川县", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "ae1557ea-3224-41b2-abb9-9efa4ada2f77"], "path_name": ["中国", "黑龙江省", "佳木斯市", "桦川县"], "status": "active", "sort": 1088, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "b62b8283-57a5-47d8-a2c3-d3dca5fb97bc", "_rev": "2-6a398247de70ada6dbe5dc1e89ebf972", "type": "region", "code": "630224", "name": "化隆回族自治县", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "b62b8283-57a5-47d8-a2c3-d3dca5fb97bc"], "path_name": ["中国", "青海省", "海东市", "化隆回族自治县"], "status": "active", "sort": 1086, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "b67b8d1c-202e-4d16-b399-bec798809068", "_rev": "2-322f17406288b6fad61047963aa25643", "type": "region", "code": "430623", "name": "华容县", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "b67b8d1c-202e-4d16-b399-bec798809068"], "path_name": ["中国", "湖南省", "岳阳市", "华容县"], "status": "active", "sort": 1079, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "bc24f807-f01c-4574-8b74-64b8c15cc93c", "_rev": "2-45ba0e7a5c0da2ca7c3fb83867250876", "type": "region", "code": "150922", "name": "化德县", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "bc24f807-f01c-4574-8b74-64b8c15cc93c"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "化德县"], "status": "active", "sort": 1085, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "f4b1a6da-e4f2-4a83-8ffa-85e6d524e7bd", "_rev": "2-231c59d052e4855412911de11dc506c8", "type": "region", "code": "440982", "name": "化州市", "parent_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "f4b1a6da-e4f2-4a83-8ffa-85e6d524e7bd"], "path_name": ["中国", "广东省", "茂名市", "化州市"], "status": "active", "sort": 1087, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:10"} +{"_id": "00cec49a-bd57-4998-8a53-6990335924dd", "_rev": "2-99731d7d7b86e1b2c6d398e25f26580d", "type": "region", "code": "411603", "name": "淮阳区", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "00cec49a-bd57-4998-8a53-6990335924dd"], "path_name": ["中国", "河南省", "周口市", "淮阳区"], "status": "active", "sort": 1101, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "01e5e8b7-0335-4a18-9938-7dd74ba738a9", "_rev": "2-1f6c22d672c577d4c1f8bdcd6d8b93c4", "type": "region", "code": "451226", "name": "环江毛南族自治县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "01e5e8b7-0335-4a18-9938-7dd74ba738a9"], "path_name": ["中国", "广西壮族自治区", "河池市", "环江毛南族自治县"], "status": "active", "sort": 1106, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "15ca0bda-31a5-4b43-9531-6eedabd9cb52", "_rev": "2-5b4404f84e27f73e3affa5b031fbfe58", "type": "region", "code": "320803", "name": "淮安区", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "15ca0bda-31a5-4b43-9531-6eedabd9cb52"], "path_name": ["中国", "江苏省", "淮安市", "淮安区"], "status": "active", "sort": 1098, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "3d036dcf-03f6-4f11-b266-a5e3e2674fce", "_rev": "2-1d30438069bcd6889369540fbec86d74", "type": "region", "code": "371002", "name": "环翠区", "parent_id": "d9d54a2d-e477-45c2-ad57-dde7563e520a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "d9d54a2d-e477-45c2-ad57-dde7563e520a", "3d036dcf-03f6-4f11-b266-a5e3e2674fce"], "path_name": ["中国", "山东省", "威海市", "环翠区"], "status": "active", "sort": 1105, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "87296c18-cc01-4dd0-bdbe-d2cc1c4b72f6", "_rev": "2-b64e8dbb5f2ee52f444be0a5042b93c6", "type": "region", "code": "370104", "name": "槐荫区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "87296c18-cc01-4dd0-bdbe-d2cc1c4b72f6"], "path_name": ["中国", "山东省", "济南市", "槐荫区"], "status": "active", "sort": 1103, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "876211dc-6b15-4a58-86e0-b0733d3bd70e", "_rev": "2-87d754bded61de380b407b4381d79379", "type": "region", "code": "110116", "name": "怀柔区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "876211dc-6b15-4a58-86e0-b0733d3bd70e"], "path_name": ["中国", "北京市", "怀柔区"], "status": "active", "sort": 1096, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "90a45bb2-dff4-40df-90f2-fb0b4d3f605a", "_rev": "2-119dcabe72d149c4110f377019edff90", "type": "region", "code": "140681", "name": "怀仁市", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "90a45bb2-dff4-40df-90f2-fb0b4d3f605a"], "path_name": ["中国", "山西省", "朔州市", "怀仁市"], "status": "active", "sort": 1095, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "931ebd13-0fc1-4ebb-a5bf-fa0a256a2fea", "_rev": "2-79ed51c7b93f5229d0fdaedd3f343bf3", "type": "region", "code": "340321", "name": "怀远县", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "931ebd13-0fc1-4ebb-a5bf-fa0a256a2fea"], "path_name": ["中国", "安徽省", "蚌埠市", "怀远县"], "status": "active", "sort": 1097, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "99158d1a-eb88-4520-9512-efe34921c575", "_rev": "2-0175cbcdafe4000f10b08437c58fcd1c", "type": "region", "code": "320804", "name": "淮阴区", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "99158d1a-eb88-4520-9512-efe34921c575"], "path_name": ["中国", "江苏省", "淮安市", "淮阴区"], "status": "active", "sort": 1102, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "9eb84e2c-259a-4405-8af9-c48187807250", "_rev": "2-6935ed696c810309a33b0ec1ee693eda", "type": "region", "code": "140600", "name": "朔州市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250"], "path_name": ["中国", "山西省", "朔州市"], "status": "active", "sort": 1094, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "c7c8584c-a0a2-4cbd-b2b8-3093f0d2eb3a", "_rev": "2-df2ad1781e6bb2842d9d48237b8fcab1", "type": "region", "code": "340311", "name": "淮上区", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "c7c8584c-a0a2-4cbd-b2b8-3093f0d2eb3a"], "path_name": ["中国", "安徽省", "蚌埠市", "淮上区"], "status": "active", "sort": 1100, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "d4193448-1cfd-4a5a-af67-e8e854658cd4", "_rev": "2-306c7c9a6a07c610555a8b462b15296b", "type": "region", "code": "411527", "name": "淮滨县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "d4193448-1cfd-4a5a-af67-e8e854658cd4"], "path_name": ["中国", "河南省", "信阳市", "淮滨县"], "status": "active", "sort": 1099, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "d4cc1430-278e-47a5-bec5-3de63c654660", "_rev": "2-1c02c38fbd1952ba5fba9415be44ec52", "type": "region", "code": "340822", "name": "怀宁县", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "d4cc1430-278e-47a5-bec5-3de63c654660"], "path_name": ["中国", "安徽省", "安庆市", "怀宁县"], "status": "active", "sort": 1093, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "d9d54a2d-e477-45c2-ad57-dde7563e520a", "_rev": "2-754062f9bfb819948928cea5b5df07d5", "type": "region", "code": "371000", "name": "威海市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "d9d54a2d-e477-45c2-ad57-dde7563e520a"], "path_name": ["中国", "山东省", "威海市"], "status": "active", "sort": 1104, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:11"} +{"_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "_rev": "2-f6f5127f3e4b5c64ed031fec5d4c9b96", "type": "region", "code": "341000", "name": "黄山市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001"], "path_name": ["中国", "安徽省", "黄山市"], "status": "active", "sort": 1120, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "2b8358f8-e81f-4d57-b8ac-f9717bacd145", "_rev": "2-e8b49b01659f12bc26eea74bde9128a5", "type": "region", "code": "421127", "name": "黄梅县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "2b8358f8-e81f-4d57-b8ac-f9717bacd145"], "path_name": ["中国", "湖北省", "黄冈市", "黄梅县"], "status": "active", "sort": 1116, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "2ed09623-ca7f-4d71-a1ef-5f29e4147f3b", "_rev": "2-6a4f182d9b16698bdf84198102714a99", "type": "region", "code": "522622", "name": "黄平县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "2ed09623-ca7f-4d71-a1ef-5f29e4147f3b"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "黄平县"], "status": "active", "sort": 1117, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "489fdf0f-c04e-4bf8-8535-66197e3d5d6f", "_rev": "2-85849269ded9096fd206a41bd7de96a4", "type": "region", "code": "370211", "name": "黄岛区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "489fdf0f-c04e-4bf8-8535-66197e3d5d6f"], "path_name": ["中国", "山东省", "青岛市", "黄岛区"], "status": "active", "sort": 1112, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "67c24370-e8bd-4898-8843-4cfec631d861", "_rev": "2-1fb07f6535a77b6bc8235689f59a8c2b", "type": "region", "code": "610632", "name": "黄陵县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "67c24370-e8bd-4898-8843-4cfec631d861"], "path_name": ["中国", "陕西省", "延安市", "黄陵县"], "status": "active", "sort": 1114, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "69aa9aed-0a97-440a-bdb9-99e222ad6cf4", "_rev": "2-d019e2874ef108317173903e9998306a", "type": "region", "code": "610631", "name": "黄龙县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "69aa9aed-0a97-440a-bdb9-99e222ad6cf4"], "path_name": ["中国", "陕西省", "延安市", "黄龙县"], "status": "active", "sort": 1115, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "6d01b2a8-4bd0-42f2-9380-60f2f29ba730", "_rev": "2-5f3c488a17fe09837471cf47fe5b5386", "type": "region", "code": "310101", "name": "黄浦区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "6d01b2a8-4bd0-42f2-9380-60f2f29ba730"], "path_name": ["中国", "上海市", "黄浦区"], "status": "active", "sort": 1119, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "71b63cf1-976b-42ca-85e4-4a6c46450673", "_rev": "2-1be63bf341e25e4be17d77fd2d5227f3", "type": "region", "code": "370321", "name": "桓台县", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "71b63cf1-976b-42ca-85e4-4a6c46450673"], "path_name": ["中国", "山东省", "淄博市", "桓台县"], "status": "active", "sort": 1109, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "82953553-0929-4b00-b436-1b7b96d6dba0", "_rev": "2-383b21b88e6f912933cfab53c696f105", "type": "region", "code": "210105", "name": "皇姑区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "82953553-0929-4b00-b436-1b7b96d6dba0"], "path_name": ["中国", "辽宁省", "沈阳市", "皇姑区"], "status": "active", "sort": 1110, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "ac98152e-941d-421d-9216-914de257029f", "_rev": "2-220e0a2bac44007a715af9a7ec18619a", "type": "region", "code": "621022", "name": "环县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "ac98152e-941d-421d-9216-914de257029f"], "path_name": ["中国", "甘肃省", "庆阳市", "环县"], "status": "active", "sort": 1107, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "ad25417c-fa1a-4295-851e-7307a19b086f", "_rev": "2-243454186dc25f85f902a98125efd3f7", "type": "region", "code": "130983", "name": "黄骅市", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "ad25417c-fa1a-4295-851e-7307a19b086f"], "path_name": ["中国", "河北省", "沧州市", "黄骅市"], "status": "active", "sort": 1113, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "d6b4c182-b495-4ff2-9400-c204ccf55e4b", "_rev": "2-e159c5bb5cd2e7bcd550ad9483375692", "type": "region", "code": "420116", "name": "黄陂区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "d6b4c182-b495-4ff2-9400-c204ccf55e4b"], "path_name": ["中国", "湖北省", "武汉市", "黄陂区"], "status": "active", "sort": 1111, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "d708406b-972d-4937-a941-56b939dd2803", "_rev": "2-f40b87ef6382bfb58ae6b429c879b046", "type": "region", "code": "210522", "name": "桓仁满族自治县", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "d708406b-972d-4937-a941-56b939dd2803"], "path_name": ["中国", "辽宁省", "本溪市", "桓仁满族自治县"], "status": "active", "sort": 1108, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "e5570ec0-2bf0-4eb6-a2a1-b4fb02a7acfe", "_rev": "2-69ea46198d5cede13fbf9aa6aa9c75de", "type": "region", "code": "341003", "name": "黄山区", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "e5570ec0-2bf0-4eb6-a2a1-b4fb02a7acfe"], "path_name": ["中国", "安徽省", "黄山市", "黄山区"], "status": "active", "sort": 1121, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "e9de9a5c-6d9e-4c97-90fc-dca5c6b97043", "_rev": "2-374d3a1bb082d2ee10e2b42f4f3a734c", "type": "region", "code": "440112", "name": "黄埔区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "e9de9a5c-6d9e-4c97-90fc-dca5c6b97043"], "path_name": ["中国", "广东省", "广州市", "黄埔区"], "status": "active", "sort": 1118, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:12"} +{"_id": "10ef140a-7b75-4251-962c-3a7a00d1fd93", "_rev": "2-12403d9185ef0727f4054f9266a01bdc", "type": "region", "code": "411526", "name": "潢川县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "10ef140a-7b75-4251-962c-3a7a00d1fd93"], "path_name": ["中国", "河南省", "信阳市", "潢川县"], "status": "active", "sort": 1128, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "381a8d47-c54a-41ca-9657-222c0709c61b", "_rev": "2-51cdcaec0cd4e0d0ede006e053e8a3b0", "type": "region", "code": "220523", "name": "辉南县", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "381a8d47-c54a-41ca-9657-222c0709c61b"], "path_name": ["中国", "吉林省", "通化市", "辉南县"], "status": "active", "sort": 1130, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "3f0ab4f5-f59a-402a-ba93-4328a6f55bdb", "_rev": "2-0cca47b1821486776ecea249904a6f39", "type": "region", "code": "630106", "name": "湟中区", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "3f0ab4f5-f59a-402a-ba93-4328a6f55bdb"], "path_name": ["中国", "青海省", "西宁市", "湟中区"], "status": "active", "sort": 1127, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "3f781ba1-280f-45d5-9073-43c7c69dacde", "_rev": "2-4af5edcba5fb0ba1cd90b16f90f23575", "type": "region", "code": "410782", "name": "辉县市", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "3f781ba1-280f-45d5-9073-43c7c69dacde"], "path_name": ["中国", "河南省", "新乡市", "辉县市"], "status": "active", "sort": 1131, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "3fcab23f-227b-4ca9-a282-efd2f7ad7a89", "_rev": "2-63fbd9c44befdaa8c518a60684977006", "type": "region", "code": "621227", "name": "徽县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "3fcab23f-227b-4ca9-a282-efd2f7ad7a89"], "path_name": ["中国", "甘肃省", "陇南市", "徽县"], "status": "active", "sort": 1132, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "4a358b92-dabc-436d-9c6e-f80b3a59f875", "_rev": "2-c948bc59ce0c0d02266110dfc1d6e92c", "type": "region", "code": "222404", "name": "珲春市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "4a358b92-dabc-436d-9c6e-f80b3a59f875"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "珲春市"], "status": "active", "sort": 1129, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "89401d98-2460-4d4e-bbb8-3ff1188cba45", "_rev": "2-29124c03263416b94dd725764109e953", "type": "region", "code": "331003", "name": "黄岩区", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "89401d98-2460-4d4e-bbb8-3ff1188cba45"], "path_name": ["中国", "浙江省", "台州市", "黄岩区"], "status": "active", "sort": 1124, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "9a716659-8705-4395-99c1-804ff9903b17", "_rev": "2-f094038a28b871039f69947f6d55b21e", "type": "region", "code": "341004", "name": "徽州区", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "9a716659-8705-4395-99c1-804ff9903b17"], "path_name": ["中国", "安徽省", "黄山市", "徽州区"], "status": "active", "sort": 1133, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "9e2ab562-08d2-417c-b812-451b9be02d78", "_rev": "2-13658d0433233b0e95817d91314c7f8f", "type": "region", "code": "150103", "name": "回民区", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "9e2ab562-08d2-417c-b812-451b9be02d78"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "回民区"], "status": "active", "sort": 1134, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "be0a689b-f667-4f64-b12c-dbaeab1616cd", "_rev": "2-68f9eec445815943d454165cb4747384", "type": "region", "code": "420202", "name": "黄石港区", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "be0a689b-f667-4f64-b12c-dbaeab1616cd"], "path_name": ["中国", "湖北省", "黄石市", "黄石港区"], "status": "active", "sort": 1122, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "c622d153-c3be-4b96-b9ec-a110bc27cd52", "_rev": "2-72b196394295abf0092961b395798dbb", "type": "region", "code": "630123", "name": "湟源县", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "c622d153-c3be-4b96-b9ec-a110bc27cd52"], "path_name": ["中国", "青海省", "西宁市", "湟源县"], "status": "active", "sort": 1126, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "d0bc2449-157e-4d2f-aeff-428b5553f373", "_rev": "2-d365254fda2388940740bfb0963735b4", "type": "region", "code": "421102", "name": "黄州区", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "d0bc2449-157e-4d2f-aeff-428b5553f373"], "path_name": ["中国", "湖北省", "黄冈市", "黄州区"], "status": "active", "sort": 1125, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "_rev": "2-5466642d357e5411f9644652d23ab097", "type": "region", "code": "331000", "name": "台州市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987"], "path_name": ["中国", "浙江省", "台州市"], "status": "active", "sort": 1123, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:13"} +{"_id": "02f799c0-50f9-494d-8ed0-0bb700525409", "_rev": "2-0ee0c41dc7bff359a93223c3a8cdae03", "type": "region", "code": "371621", "name": "惠民县", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "02f799c0-50f9-494d-8ed0-0bb700525409"], "path_name": ["中国", "山东省", "滨州市", "惠民县"], "status": "active", "sort": 1148, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "03feb2f2-9d6f-4d9d-96f4-888ab20ea955", "_rev": "2-cd7197f7dd9f9979cce407f66c8814ca", "type": "region", "code": "431225", "name": "会同县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "03feb2f2-9d6f-4d9d-96f4-888ab20ea955"], "path_name": ["中国", "湖南省", "怀化市", "会同县"], "status": "active", "sort": 1140, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "_rev": "2-1b38b0f2d89321d2541e36da07d9f118", "type": "region", "code": "445200", "name": "揭阳市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326"], "path_name": ["中国", "广东省", "揭阳市"], "status": "active", "sort": 1146, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "19a5a12a-761a-402e-99ed-b544dde76fc8", "_rev": "2-195d2de29b8ec28a06c5bad47637c3d8", "type": "region", "code": "360733", "name": "会昌县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "19a5a12a-761a-402e-99ed-b544dde76fc8"], "path_name": ["中国", "江西省", "赣州市", "会昌县"], "status": "active", "sort": 1136, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "4df26688-5f01-473a-8ea1-f4f5b484d93c", "_rev": "2-ca77dfdfa7f7b5889de51e67997e79b9", "type": "region", "code": "620422", "name": "会宁县", "parent_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "4df26688-5f01-473a-8ea1-f4f5b484d93c"], "path_name": ["中国", "甘肃省", "白银市", "会宁县"], "status": "active", "sort": 1139, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "5668ae21-e7fb-458f-bf3f-df58e6e14b4c", "_rev": "2-3e1ce61e46b3a106b7d3cf225ea24ba2", "type": "region", "code": "441302", "name": "惠城区", "parent_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89", "5668ae21-e7fb-458f-bf3f-df58e6e14b4c"], "path_name": ["中国", "广东省", "惠州市", "惠城区"], "status": "active", "sort": 1143, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "67698928-a66d-4fcf-8489-49bd088242fe", "_rev": "2-5f9d438031ae4b3a999479ccf47c214e", "type": "region", "code": "441323", "name": "惠东县", "parent_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89", "67698928-a66d-4fcf-8489-49bd088242fe"], "path_name": ["中国", "广东省", "惠州市", "惠东县"], "status": "active", "sort": 1144, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "7810b451-1d9f-43ee-ab00-3c0c6126e029", "_rev": "2-7bebc40d32a354e778ab19f60e0c1bec", "type": "region", "code": "530326", "name": "会泽县", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "7810b451-1d9f-43ee-ab00-3c0c6126e029"], "path_name": ["中国", "云南省", "曲靖市", "会泽县"], "status": "active", "sort": 1141, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "8514f850-0c0f-4c03-a766-d88a74124e7f", "_rev": "2-5e6dedb0ba39dc5ac0e0ad4301efdb49", "type": "region", "code": "520303", "name": "汇川区", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "8514f850-0c0f-4c03-a766-d88a74124e7f"], "path_name": ["中国", "贵州省", "遵义市", "汇川区"], "status": "active", "sort": 1135, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "86334aec-5082-44b1-87ab-b3f0ddbe9b9b", "_rev": "2-ee8ad278b0499c8d47d9e5846771f027", "type": "region", "code": "445224", "name": "惠来县", "parent_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326", "86334aec-5082-44b1-87ab-b3f0ddbe9b9b"], "path_name": ["中国", "广东省", "揭阳市", "惠来县"], "status": "active", "sort": 1147, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "a0c9c695-d5d6-4677-9e25-48b8ee11ad6f", "_rev": "2-d7bfe616679c00bc512987cb44cf7725", "type": "region", "code": "513426", "name": "会东县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "a0c9c695-d5d6-4677-9e25-48b8ee11ad6f"], "path_name": ["中国", "四川省", "凉山彝族自治州", "会东县"], "status": "active", "sort": 1137, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "a92f08a8-6f0b-4601-aad1-78d478481d3f", "_rev": "2-d0079a3dacd9e58f026e23f1f35e1440", "type": "region", "code": "410108", "name": "惠济区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "a92f08a8-6f0b-4601-aad1-78d478481d3f"], "path_name": ["中国", "河南省", "郑州市", "惠济区"], "status": "active", "sort": 1145, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "ae2e045d-3b76-4849-a9c7-3cd3017818e4", "_rev": "2-4889cb3480e35ae38b5f2ee677e6d64f", "type": "region", "code": "350521", "name": "惠安县", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "ae2e045d-3b76-4849-a9c7-3cd3017818e4"], "path_name": ["中国", "福建省", "泉州市", "惠安县"], "status": "active", "sort": 1142, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "d695c3b1-373c-490a-823a-40bbc6f60da6", "_rev": "2-5e3f25ec263c478917bdb501d7170a42", "type": "region", "code": "513402", "name": "会理市", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "d695c3b1-373c-490a-823a-40bbc6f60da6"], "path_name": ["中国", "四川省", "凉山彝族自治州", "会理市"], "status": "active", "sort": 1138, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:14"} +{"_id": "08ffa8cc-fb47-4a0f-a1de-1c0fa37039ef", "_rev": "2-9818825c878bbd835d6a0f07793acc37", "type": "region", "code": "220602", "name": "浑江区", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "08ffa8cc-fb47-4a0f-a1de-1c0fa37039ef"], "path_name": ["中国", "吉林省", "白山市", "浑江区"], "status": "active", "sort": 1153, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "15bb9f29-7982-4804-9bbb-bdc98a1dd707", "_rev": "2-d5cbc0c3104ef44dd57ee6becb0009b1", "type": "region", "code": "320206", "name": "惠山区", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "15bb9f29-7982-4804-9bbb-bdc98a1dd707"], "path_name": ["中国", "江苏省", "无锡市", "惠山区"], "status": "active", "sort": 1150, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "_rev": "2-0730fc6f1b150592c66aa437a700f464", "type": "region", "code": "150500", "name": "通辽市", "parent_id": "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea"], "path_name": ["中国", "内蒙古自治区", "通辽市"], "status": "active", "sort": 1159, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "18254990-4029-4aa8-9e16-628a59f9e56e", "_rev": "2-0b6087d32a50571fbfdbd4c8dede70ae", "type": "region", "code": "140225", "name": "浑源县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "18254990-4029-4aa8-9e16-628a59f9e56e"], "path_name": ["中国", "山西省", "大同市", "浑源县"], "status": "active", "sort": 1155, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "1db7b845-fe23-4521-9117-2ba1e1634038", "_rev": "2-8d76226940428461c65cf840cd3d49c3", "type": "region", "code": "441303", "name": "惠阳区", "parent_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89", "1db7b845-fe23-4521-9117-2ba1e1634038"], "path_name": ["中国", "广东省", "惠州市", "惠阳区"], "status": "active", "sort": 1152, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "35da0648-dcf8-422c-898f-6dc54c502f1c", "_rev": "2-4f8001429424c942ff709e2f2783116f", "type": "region", "code": "654023", "name": "霍城县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "35da0648-dcf8-422c-898f-6dc54c502f1c"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "霍城县"], "status": "active", "sort": 1157, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "833f893a-0753-4174-af52-d03a4b0d100f", "_rev": "2-c1bde2072bd6f1c692730bf0e171b388", "type": "region", "code": "654004", "name": "霍尔果斯市", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "833f893a-0753-4174-af52-d03a4b0d100f"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "霍尔果斯市"], "status": "active", "sort": 1158, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "_rev": "2-2e4404904834662a958fef4a81983623", "type": "region", "code": "341500", "name": "六安市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0"], "path_name": ["中国", "安徽省", "六安市"], "status": "active", "sort": 1161, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "9c12e3a5-8c9b-4b83-8c1e-82f6d85410e7", "_rev": "2-f9ceb0dc743299a453129093290772bd", "type": "region", "code": "522731", "name": "惠水县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "9c12e3a5-8c9b-4b83-8c1e-82f6d85410e7"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "惠水县"], "status": "active", "sort": 1151, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "b5056d25-713a-443d-b7ef-a8c46750fdc0", "_rev": "2-e787f9a1aa4746c5a240e9169a736a54", "type": "region", "code": "210112", "name": "浑南区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "b5056d25-713a-443d-b7ef-a8c46750fdc0"], "path_name": ["中国", "辽宁省", "沈阳市", "浑南区"], "status": "active", "sort": 1154, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "bcd39713-5c80-4831-bd3b-dad2e5004b3d", "_rev": "2-330a28b979fd7015eccd1026969347ae", "type": "region", "code": "640205", "name": "惠农区", "parent_id": "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "bcd39713-5c80-4831-bd3b-dad2e5004b3d"], "path_name": ["中国", "宁夏回族自治区", "石嘴山市", "惠农区"], "status": "active", "sort": 1149, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "cef17efc-07fa-45c3-9acf-4234c04a8aa7", "_rev": "2-f0466e456420ea557a2272768e785576", "type": "region", "code": "341522", "name": "霍邱县", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "cef17efc-07fa-45c3-9acf-4234c04a8aa7"], "path_name": ["中国", "安徽省", "六安市", "霍邱县"], "status": "active", "sort": 1162, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "e74f3452-c5ea-4595-9ee2-0c244e836526", "_rev": "2-61446689d59d338461515344e43a98aa", "type": "region", "code": "410724", "name": "获嘉县", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "e74f3452-c5ea-4595-9ee2-0c244e836526"], "path_name": ["中国", "河南省", "新乡市", "获嘉县"], "status": "active", "sort": 1156, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "fa5482be-37ea-4a59-83f2-0a296a5e632c", "_rev": "2-b446b2cb353a7500e4ddac9ce43af407", "type": "region", "code": "150581", "name": "霍林郭勒市", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "fa5482be-37ea-4a59-83f2-0a296a5e632c"], "path_name": ["中国", "内蒙古自治区", "通辽市", "霍林郭勒市"], "status": "active", "sort": 1160, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:15"} +{"_id": "004a2331-5824-40d7-9026-58ab28acbb1b", "_rev": "2-a610c215ef66c6fa497517397365f9a2", "type": "region", "code": "360802", "name": "吉州区", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "004a2331-5824-40d7-9026-58ab28acbb1b"], "path_name": ["中国", "江西省", "吉安市", "吉州区"], "status": "active", "sort": 1177, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "0ba11eb4-16ca-4594-80db-a3ea58cceed5", "_rev": "2-9d781efa076606bedca4c4d1c4789e8c", "type": "region", "code": "230302", "name": "鸡冠区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "0ba11eb4-16ca-4594-80db-a3ea58cceed5"], "path_name": ["中国", "黑龙江省", "鸡西市", "鸡冠区"], "status": "active", "sort": 1166, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "1b180b5b-35b2-44f6-806a-f9b477498642", "_rev": "2-85089d700120d9f25bf1793452f12acf", "type": "region", "code": "540234", "name": "吉隆县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "1b180b5b-35b2-44f6-806a-f9b477498642"], "path_name": ["中国", "西藏自治区", "日喀则市", "吉隆县"], "status": "active", "sort": 1170, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "22072a72-5890-4a3e-be84-b05bfb8cf0ef", "_rev": "2-bd2a10da84637e98fa96f31c39a380a8", "type": "region", "code": "360822", "name": "吉水县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "22072a72-5890-4a3e-be84-b05bfb8cf0ef"], "path_name": ["中国", "江西省", "吉安市", "吉水县"], "status": "active", "sort": 1174, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "2e1c57f5-2380-4bed-bf87-6b44efc66fa2", "_rev": "2-0cb01a41602c49caaf82198b3fb9dd99", "type": "region", "code": "460203", "name": "吉阳区", "parent_id": "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "2e1c57f5-2380-4bed-bf87-6b44efc66fa2"], "path_name": ["中国", "海南省", "三亚市", "吉阳区"], "status": "active", "sort": 1176, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "3d5d1978-8269-4be7-ac38-3169b35b2fbe", "_rev": "2-dbe8bfa43aacad55e098a75fb4377bd5", "type": "region", "code": "130431", "name": "鸡泽县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "3d5d1978-8269-4be7-ac38-3169b35b2fbe"], "path_name": ["中国", "河北省", "邯郸市", "鸡泽县"], "status": "active", "sort": 1167, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "666455c7-2e2c-4a87-a467-d7f2412d6871", "_rev": "2-929098a6fcd33eaf40de11598442ca91", "type": "region", "code": "652327", "name": "吉木萨尔县", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "666455c7-2e2c-4a87-a467-d7f2412d6871"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "吉木萨尔县"], "status": "active", "sort": 1172, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "66cc8be9-47c6-4dcf-b0c1-666e96a4e231", "_rev": "2-16c2d97d4cc11d640024f96e86130ceb", "type": "region", "code": "622927", "name": "积石山保安族东乡族撒拉族自治县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "66cc8be9-47c6-4dcf-b0c1-666e96a4e231"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "积石山保安族东乡族撒拉族自治县"], "status": "active", "sort": 1168, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "6b974d91-cdf5-4ad3-a1fc-e9db8ea28156", "_rev": "2-7b2c2bf6f736949679beea66f1ea256c", "type": "region", "code": "433101", "name": "吉首市", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "6b974d91-cdf5-4ad3-a1fc-e9db8ea28156"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "吉首市"], "status": "active", "sort": 1173, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "71ee2683-77ba-4a6e-8cb7-8762e6350a2a", "_rev": "2-34639d9e232dada9df9cf102037eed51", "type": "region", "code": "230321", "name": "鸡东县", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "71ee2683-77ba-4a6e-8cb7-8762e6350a2a"], "path_name": ["中国", "黑龙江省", "鸡西市", "鸡东县"], "status": "active", "sort": 1165, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "76337a39-dde6-420f-849d-958407f98db0", "_rev": "2-a803cbc81a3449ea18694e742352cf5d", "type": "region", "code": "654326", "name": "吉木乃县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "76337a39-dde6-420f-849d-958407f98db0"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "吉木乃县"], "status": "active", "sort": 1171, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "8bc03bee-f503-44b2-bf5a-e95daf77a0b1", "_rev": "2-fd24e28c1557c58ae95ebc54d4028fe0", "type": "region", "code": "141028", "name": "吉县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "8bc03bee-f503-44b2-bf5a-e95daf77a0b1"], "path_name": ["中国", "山西省", "临汾市", "吉县"], "status": "active", "sort": 1175, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "99be14ae-baaa-44e4-b51d-61fb3c032aef", "_rev": "2-9bb7eb4eb2f85df533f5fdd1c133f156", "type": "region", "code": "341525", "name": "霍山县", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "99be14ae-baaa-44e4-b51d-61fb3c032aef"], "path_name": ["中国", "安徽省", "六安市", "霍山县"], "status": "active", "sort": 1163, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "abe682df-33b7-447f-be5a-df06ba2c5bd3", "_rev": "2-341dc0bd0c1d1a3df9d0d5da25147d94", "type": "region", "code": "141082", "name": "霍州市", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "abe682df-33b7-447f-be5a-df06ba2c5bd3"], "path_name": ["中国", "山西省", "临汾市", "霍州市"], "status": "active", "sort": 1164, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "cf18152e-4fa2-42e6-a7b1-dc729e920e0d", "_rev": "2-a24eda6e426dea4fe2d5721dcc9821a5", "type": "region", "code": "360821", "name": "吉安县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "cf18152e-4fa2-42e6-a7b1-dc729e920e0d"], "path_name": ["中国", "江西省", "吉安市", "吉安县"], "status": "active", "sort": 1169, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:16"} +{"_id": "0e2bf43a-be45-4506-a8c7-1b76e0d0e100", "_rev": "2-20d55ef3e8bbeb4bc21f05280ed0c5dc", "type": "region", "code": "341824", "name": "绩溪县", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "0e2bf43a-be45-4506-a8c7-1b76e0d0e100"], "path_name": ["中国", "安徽省", "宣城市", "绩溪县"], "status": "active", "sort": 1186, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "142f883c-795d-4b9f-a212-1248794082c3", "_rev": "2-fe4920ae2fcc97e8421fd91828134877", "type": "region", "code": "370115", "name": "济阳区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "142f883c-795d-4b9f-a212-1248794082c3"], "path_name": ["中国", "山东省", "济南市", "济阳区"], "status": "active", "sort": 1183, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "147e339f-f362-498a-8113-0f7aeceb54d5", "_rev": "2-2a639e12d874292bfedf1e1d87ad2c83", "type": "region", "code": "540528", "name": "加查县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "147e339f-f362-498a-8113-0f7aeceb54d5"], "path_name": ["中国", "西藏自治区", "山南市", "加查县"], "status": "active", "sort": 1190, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "16632b4b-182b-4e17-b39d-55ba323ccbd9", "_rev": "2-d84630dec39215271529c6300d8a3ae5", "type": "region", "code": "370215", "name": "即墨区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "16632b4b-182b-4e17-b39d-55ba323ccbd9"], "path_name": ["中国", "山东省", "青岛市", "即墨区"], "status": "active", "sort": 1178, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "1979f7ca-3876-4c05-afda-49e4582c4547", "_rev": "2-89dfed1a39f2dfc38fa851bb7a6141fb", "type": "region", "code": "131103", "name": "冀州区", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "1979f7ca-3876-4c05-afda-49e4582c4547"], "path_name": ["中国", "河北省", "衡水市", "冀州区"], "status": "active", "sort": 1189, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "28bc21a5-556e-43b5-af18-7091f0f535e2", "_rev": "2-bcb6536727712428ecb04005a4a2c890", "type": "region", "code": "350211", "name": "集美区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "28bc21a5-556e-43b5-af18-7091f0f535e2"], "path_name": ["中国", "福建省", "厦门市", "集美区"], "status": "active", "sort": 1180, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "83e53246-e14d-4a93-b730-a1c73e09037b", "_rev": "2-414550193467b833c13c3f99e861e2b3", "type": "region", "code": "610828", "name": "佳县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "83e53246-e14d-4a93-b730-a1c73e09037b"], "path_name": ["中国", "陕西省", "榆林市", "佳县"], "status": "active", "sort": 1192, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "88cfe256-0943-4fd6-a9ed-6770d88e76c3", "_rev": "2-de9b888b4c331171eb3051de4d09ddf0", "type": "region", "code": "220582", "name": "集安市", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "88cfe256-0943-4fd6-a9ed-6770d88e76c3"], "path_name": ["中国", "吉林省", "通化市", "集安市"], "status": "active", "sort": 1179, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "9baec43c-08d8-4a6e-aee4-c7a84c9b9f7b", "_rev": "2-26f244c88a3fb44559fd207905eb0c20", "type": "region", "code": "150902", "name": "集宁区", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "9baec43c-08d8-4a6e-aee4-c7a84c9b9f7b"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "集宁区"], "status": "active", "sort": 1181, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "ac2269f1-6e3b-4853-9730-920a985d1b91", "_rev": "2-6badf46de64211cb5ffc9a34a1e03522", "type": "region", "code": "419001", "name": "济源市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "ac2269f1-6e3b-4853-9730-920a985d1b91"], "path_name": ["中国", "河南省", "济源市"], "status": "active", "sort": 1185, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "b4244d18-4772-4dfa-a6a7-1b64bdca5bc8", "_rev": "2-6fc86f4e6ded67b3a9e646251615bfb9", "type": "region", "code": "140824", "name": "稷山县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "b4244d18-4772-4dfa-a6a7-1b64bdca5bc8"], "path_name": ["中国", "山西省", "运城市", "稷山县"], "status": "active", "sort": 1188, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "c63c8eee-12fc-445b-b72e-7dd81e5e33cc", "_rev": "2-5f79a2553c9ba3e04f75df32daa69844", "type": "region", "code": "230521", "name": "集贤县", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "c63c8eee-12fc-445b-b72e-7dd81e5e33cc"], "path_name": ["中国", "黑龙江省", "双鸭山市", "集贤县"], "status": "active", "sort": 1182, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "cbf6a252-57be-4ef3-bcb3-aae71d12cafc", "_rev": "2-bd506255d742c3a69ea6a293773b7b1b", "type": "region", "code": "120119", "name": "蓟州区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "cbf6a252-57be-4ef3-bcb3-aae71d12cafc"], "path_name": ["中国", "天津市", "蓟州区"], "status": "active", "sort": 1187, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "d75c42b9-1337-46b5-9e20-c345d5467a9e", "_rev": "2-7e2337b58e642df80e366a98abb49ad1", "type": "region", "code": "410000", "name": "直辖", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d75c42b9-1337-46b5-9e20-c345d5467a9e"], "path_name": ["中国", "河南省", "直辖"], "status": "active", "sort": 1184, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "f24008d1-9176-4887-b26a-a609fa07cde3", "_rev": "2-36865959520d1a623a70699b0dec9537", "type": "region", "code": "511126", "name": "夹江县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "f24008d1-9176-4887-b26a-a609fa07cde3"], "path_name": ["中国", "四川省", "乐山市", "夹江县"], "status": "active", "sort": 1191, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:17"} +{"_id": "0cbbfec6-fcd9-4b2b-8343-d2c79694bafd", "_rev": "2-4889dc0924f6cc6bbde2c7a1ed2e7984", "type": "region", "code": "370829", "name": "嘉祥县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "0cbbfec6-fcd9-4b2b-8343-d2c79694bafd"], "path_name": ["中国", "山东省", "济宁市", "嘉祥县"], "status": "active", "sort": 1199, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "348bcdbc-b45a-49e8-9e1d-fef5a8b37a5e", "_rev": "2-6aace7a36fb230416ec2375a6a277aac", "type": "region", "code": "511304", "name": "嘉陵区", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "348bcdbc-b45a-49e8-9e1d-fef5a8b37a5e"], "path_name": ["中国", "四川省", "南充市", "嘉陵区"], "status": "active", "sort": 1196, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "38bb2a96-3e4e-4505-931b-31cdf10cb106", "_rev": "2-0f073467cd1d02a8730ff5d9537a5878", "type": "region", "code": "421221", "name": "嘉鱼县", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "38bb2a96-3e4e-4505-931b-31cdf10cb106"], "path_name": ["中国", "湖北省", "咸宁市", "嘉鱼县"], "status": "active", "sort": 1202, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "41403ee6-2796-4f55-910e-dd015a4cd5dd", "_rev": "2-d7a1b414690a13825686009649dfd02c", "type": "region", "code": "540621", "name": "嘉黎县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "41403ee6-2796-4f55-910e-dd015a4cd5dd"], "path_name": ["中国", "西藏自治区", "那曲市", "嘉黎县"], "status": "active", "sort": 1195, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "_rev": "2-a6223359b9dc90eb37e2b0efd3f7cf07", "type": "region", "code": "370800", "name": "济宁市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd"], "path_name": ["中国", "山东省", "济宁市"], "status": "active", "sort": 1198, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "516d1f7d-3144-4da8-bb26-adf4cd2a1cc3", "_rev": "2-50ae49835b9ef5ddd83a8a0a53f61d67", "type": "region", "code": "320305", "name": "贾汪区", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "516d1f7d-3144-4da8-bb26-adf4cd2a1cc3"], "path_name": ["中国", "江苏省", "徐州市", "贾汪区"], "status": "active", "sort": 1205, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "585dc314-b73a-46e6-b8e7-90d35b10578b", "_rev": "2-1a7b5eb4c89b613320470bd6385f7b70", "type": "region", "code": "410425", "name": "郏县", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "585dc314-b73a-46e6-b8e7-90d35b10578b"], "path_name": ["中国", "河南省", "平顶山市", "郏县"], "status": "active", "sort": 1204, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "71ea2427-cb09-4ac9-91db-a3f7fb12c45b", "_rev": "2-3a96a7e2597d03045730816e1817e644", "type": "region", "code": "431024", "name": "嘉禾县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "71ea2427-cb09-4ac9-91db-a3f7fb12c45b"], "path_name": ["中国", "湖南省", "郴州市", "嘉禾县"], "status": "active", "sort": 1194, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "8a1e251b-44cc-4196-94cc-ae2d9a79dced", "_rev": "2-f2363ac5a79c35d0605759016405f437", "type": "region", "code": "620200", "name": "嘉峪关市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8a1e251b-44cc-4196-94cc-ae2d9a79dced"], "path_name": ["中国", "甘肃省", "嘉峪关市"], "status": "active", "sort": 1203, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "b88429e0-9f2e-47b9-91ec-803b6f158f42", "_rev": "2-572c472667d7f246c405ccfe7641f79f", "type": "region", "code": "230722", "name": "嘉荫县", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "b88429e0-9f2e-47b9-91ec-803b6f158f42"], "path_name": ["中国", "黑龙江省", "伊春市", "嘉荫县"], "status": "active", "sort": 1201, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "_rev": "2-c2b92e82010b138162e753b5b207488d", "type": "region", "code": "230700", "name": "伊春市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730"], "path_name": ["中国", "黑龙江省", "伊春市"], "status": "active", "sort": 1200, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "d103d18e-8bd5-44e9-947f-ed3ece5333fb", "_rev": "2-791d1a1ee274499127126b11d8083e48", "type": "region", "code": "330421", "name": "嘉善县", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "d103d18e-8bd5-44e9-947f-ed3ece5333fb"], "path_name": ["中国", "浙江省", "嘉兴市", "嘉善县"], "status": "active", "sort": 1197, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "f01c76a1-d3a8-4418-a1ab-9c51810145ea", "_rev": "2-928d9dc8d6ec7c183b8d78b6e0605a11", "type": "region", "code": "310114", "name": "嘉定区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "f01c76a1-d3a8-4418-a1ab-9c51810145ea"], "path_name": ["中国", "上海市", "嘉定区"], "status": "active", "sort": 1193, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:18"} +{"_id": "0cc3651b-cfe1-4244-bc8a-ad1ca1a3b5d1", "_rev": "2-96b05e25d29bfc0df323045ffde4ced0", "type": "region", "code": "510185", "name": "简阳市", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "0cc3651b-cfe1-4244-bc8a-ad1ca1a3b5d1"], "path_name": ["中国", "四川省", "成都市", "简阳市"], "status": "active", "sort": 1211, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "163d74f0-1153-43c7-b484-4f3cf8ab7951", "_rev": "2-8313530ded9f2867868270dfb8aacfe7", "type": "region", "code": "211422", "name": "建昌县", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "163d74f0-1153-43c7-b484-4f3cf8ab7951"], "path_name": ["中国", "辽宁省", "葫芦岛市", "建昌县"], "status": "active", "sort": 1215, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "3612fb9a-7337-4a4e-bffb-5e233a1f2150", "_rev": "2-d5e95bb78bd3862538870c8ce57e127e", "type": "region", "code": "140108", "name": "尖草坪区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "3612fb9a-7337-4a4e-bffb-5e233a1f2150"], "path_name": ["中国", "山西省", "太原市", "尖草坪区"], "status": "active", "sort": 1206, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "366d5847-5c1b-4502-8ee7-bd97d20a075b", "_rev": "2-993a540e315a44686bdf0e42ce966cd1", "type": "region", "code": "330182", "name": "建德市", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "366d5847-5c1b-4502-8ee7-bd97d20a075b"], "path_name": ["中国", "浙江省", "杭州市", "建德市"], "status": "active", "sort": 1216, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "4f987bf7-efa4-4135-9d15-5afc883f8d7f", "_rev": "2-11b5c7e134d7fe35b2bfc9c9b1628ba7", "type": "region", "code": "320925", "name": "建湖县", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "4f987bf7-efa4-4135-9d15-5afc883f8d7f"], "path_name": ["中国", "江苏省", "盐城市", "建湖县"], "status": "active", "sort": 1217, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "_rev": "2-c8530ffcfd181d71b1c64ae2669f754d", "type": "region", "code": "411000", "name": "许昌市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314"], "path_name": ["中国", "河南省", "许昌市"], "status": "active", "sort": 1212, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "6d258027-b6af-455f-8178-e41363026feb", "_rev": "2-fd9f27cd23d090cf63d2fd101798599f", "type": "region", "code": "511123", "name": "犍为县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "6d258027-b6af-455f-8178-e41363026feb"], "path_name": ["中国", "四川省", "乐山市", "犍为县"], "status": "active", "sort": 1210, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "77c942ba-6136-4dc1-8249-e2771793592e", "_rev": "2-c4f5cf29c306dd8a9b4f374a879e3e4d", "type": "region", "code": "411003", "name": "建安区", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "77c942ba-6136-4dc1-8249-e2771793592e"], "path_name": ["中国", "河南省", "许昌市", "建安区"], "status": "active", "sort": 1213, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "80c4b3c5-9df4-4936-a0f9-6a333e84ed4e", "_rev": "2-6ca35c7cdffe4f0b43af335a7b1505e3", "type": "region", "code": "632322", "name": "尖扎县", "parent_id": "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "80c4b3c5-9df4-4936-a0f9-6a333e84ed4e"], "path_name": ["中国", "青海省", "黄南藏族自治州", "尖扎县"], "status": "active", "sort": 1208, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "9460fcbf-2f1a-4bcd-8d5a-77e06cbd3a9b", "_rev": "2-945606a57b3322bc5e650a09da46e323", "type": "region", "code": "230502", "name": "尖山区", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "9460fcbf-2f1a-4bcd-8d5a-77e06cbd3a9b"], "path_name": ["中国", "黑龙江省", "双鸭山市", "尖山区"], "status": "active", "sort": 1207, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "a9a94dad-7dbf-4b1c-97a4-ec7999997764", "_rev": "2-c8895f2b7d578400b35aa0b98c92672a", "type": "region", "code": "230203", "name": "建华区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "a9a94dad-7dbf-4b1c-97a4-ec7999997764"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "建华区"], "status": "active", "sort": 1218, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "b03fcea6-499c-4753-a8b0-014a7deeac64", "_rev": "2-26f2a9b925cb2f0931f040883a04fc0a", "type": "region", "code": "421088", "name": "监利市", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "b03fcea6-499c-4753-a8b0-014a7deeac64"], "path_name": ["中国", "湖北省", "荆州市", "监利市"], "status": "active", "sort": 1209, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "_rev": "2-8300ad236557c8a0f568e33d592d0442", "type": "region", "code": "211400", "name": "葫芦岛市", "parent_id": "14008d23-62b3-4ec8-91b4-a672b95168f6", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26"], "path_name": ["中国", "辽宁省", "葫芦岛市"], "status": "active", "sort": 1214, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:19"} +{"_id": "0e444a7d-cc2c-4b0d-b5f4-fd3732b62ab9", "_rev": "2-e8b133a270097faeae6c1bf7ec73c8a9", "type": "region", "code": "422822", "name": "建始县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "0e444a7d-cc2c-4b0d-b5f4-fd3732b62ab9"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "建始县"], "status": "active", "sort": 1222, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "164b3b0b-9d2f-4945-8804-67778d892592", "_rev": "2-b6241ce6b7487aae4e847996299cdae2", "type": "region", "code": "530800", "name": "普洱市", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592"], "path_name": ["中国", "云南省", "普洱市"], "status": "active", "sort": 1232, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "1ad0e1b0-955f-4934-afb2-d64fbe863ff4", "_rev": "2-e61c813ded5fabfcc3b821fb7ac421c3", "type": "region", "code": "530826", "name": "江城哈尼族彝族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "1ad0e1b0-955f-4934-afb2-d64fbe863ff4"], "path_name": ["中国", "云南省", "普洱市", "江城哈尼族彝族自治县"], "status": "active", "sort": 1233, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "250ba224-dea8-42c3-b1b3-6c7d4fedcec3", "_rev": "2-b292a2d0e43daac639f834eab59fbdba", "type": "region", "code": "510823", "name": "剑阁县", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "250ba224-dea8-42c3-b1b3-6c7d4fedcec3"], "path_name": ["中国", "四川省", "广元市", "剑阁县"], "status": "active", "sort": 1227, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "2e703700-6632-4c5b-8398-661e7ca6ef89", "_rev": "2-2d09844e894fdaab956f2d7801aa2a63", "type": "region", "code": "211322", "name": "建平县", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "2e703700-6632-4c5b-8398-661e7ca6ef89"], "path_name": ["中国", "辽宁省", "朝阳市", "建平县"], "status": "active", "sort": 1221, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "30300525-7616-4d12-a3e4-920f1d060e16", "_rev": "2-8aafa6ec3cdcc9a386c9eea51e7be719", "type": "region", "code": "320105", "name": "建邺区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "30300525-7616-4d12-a3e4-920f1d060e16"], "path_name": ["中国", "江苏省", "南京市", "建邺区"], "status": "active", "sort": 1225, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "44dc4ed9-0e35-47ed-b719-e83f665ee2a8", "_rev": "2-97b654f15a6919a50d39e4e348cacbb8", "type": "region", "code": "532931", "name": "剑川县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "44dc4ed9-0e35-47ed-b719-e83f665ee2a8"], "path_name": ["中国", "云南省", "大理白族自治州", "剑川县"], "status": "active", "sort": 1226, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "71b75e7d-a04e-4c1b-8b4c-1e75d7f4fe9a", "_rev": "2-709b18e9130475e126733d70488edf51", "type": "region", "code": "522629", "name": "剑河县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "71b75e7d-a04e-4c1b-8b4c-1e75d7f4fe9a"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "剑河县"], "status": "active", "sort": 1228, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "97cb4497-8c9e-4552-bf5e-140c666deeed", "_rev": "2-acdf7e77eadaf253f287af1f4519b42f", "type": "region", "code": "410305", "name": "涧西区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "97cb4497-8c9e-4552-bf5e-140c666deeed"], "path_name": ["中国", "河南省", "洛阳市", "涧西区"], "status": "active", "sort": 1229, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "b3f06274-b82b-4779-aadd-5785180849fe", "_rev": "2-3aa4b6c30fa0fef221c45a30d1699f84", "type": "region", "code": "350703", "name": "建阳区", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "b3f06274-b82b-4779-aadd-5785180849fe"], "path_name": ["中国", "福建省", "南平市", "建阳区"], "status": "active", "sort": 1224, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "b49567e0-1a24-4bb9-a57c-a536ceff7ad3", "_rev": "2-4f949ff754bd5937dfdf86d0e3eb4698", "type": "region", "code": "420102", "name": "江岸区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "b49567e0-1a24-4bb9-a57c-a536ceff7ad3"], "path_name": ["中国", "湖北省", "武汉市", "江岸区"], "status": "active", "sort": 1231, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "c9efe3c0-4d49-406f-808c-dba9747431c0", "_rev": "2-4c271828ac5637eab1c25f867132bbe5", "type": "region", "code": "350430", "name": "建宁县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "c9efe3c0-4d49-406f-808c-dba9747431c0"], "path_name": ["中国", "福建省", "三明市", "建宁县"], "status": "active", "sort": 1219, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "dd8f16ab-cec0-4ee7-9bad-6fa8227732cc", "_rev": "2-bfd1b8cb725162401f226b9a66dac036", "type": "region", "code": "511523", "name": "江安县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "dd8f16ab-cec0-4ee7-9bad-6fa8227732cc"], "path_name": ["中国", "四川省", "宜宾市", "江安县"], "status": "active", "sort": 1230, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "eef853e7-06a8-4669-8504-ebc40fa0f8e5", "_rev": "2-53d491abdf4d0a7f8ff2f91c0eeb5dbc", "type": "region", "code": "350783", "name": "建瓯市", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "eef853e7-06a8-4669-8504-ebc40fa0f8e5"], "path_name": ["中国", "福建省", "南平市", "建瓯市"], "status": "active", "sort": 1220, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "ff28e359-a850-4890-9773-05096efe6c30", "_rev": "2-bfdca519d8c805148ecf64ac9cf5967f", "type": "region", "code": "532524", "name": "建水县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "ff28e359-a850-4890-9773-05096efe6c30"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "建水县"], "status": "active", "sort": 1223, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:20"} +{"_id": "04291eba-74f4-4864-bf75-386f78eaf70f", "_rev": "2-7fbda9506e9b0e3cf05757d75ac15be5", "type": "region", "code": "500116", "name": "江津区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "04291eba-74f4-4864-bf75-386f78eaf70f"], "path_name": ["中国", "重庆市", "江津区"], "status": "active", "sort": 1242, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "1d572faf-2db6-4039-83b9-b11bb17f3d72", "_rev": "2-515ac26bbfc11fdcd541626c9be803c2", "type": "region", "code": "520621", "name": "江口县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "1d572faf-2db6-4039-83b9-b11bb17f3d72"], "path_name": ["中国", "贵州省", "铜仁市", "江口县"], "status": "active", "sort": 1243, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "35daa6ea-b8b4-40e9-8142-0c3c10e1bef1", "_rev": "2-06e569ae32d1a94bc2cef398a84b7fa9", "type": "region", "code": "540321", "name": "江达县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "35daa6ea-b8b4-40e9-8142-0c3c10e1bef1"], "path_name": ["中国", "西藏自治区", "昌都市", "江达县"], "status": "active", "sort": 1237, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "52904b33-a73a-4461-bf0f-e3e5521c68c7", "_rev": "2-7affb753a2b1ffe9948af87f8a3e76b2", "type": "region", "code": "441700", "name": "阳江市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "52904b33-a73a-4461-bf0f-e3e5521c68c7"], "path_name": ["中国", "广东省", "阳江市"], "status": "active", "sort": 1234, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "613d1824-7d5c-45fe-bf6d-0000a6b63f37", "_rev": "2-5ba0b2775796bf485e19a4aa5a7c6c69", "type": "region", "code": "431129", "name": "江华瑶族自治县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "613d1824-7d5c-45fe-bf6d-0000a6b63f37"], "path_name": ["中国", "湖南省", "永州市", "江华瑶族自治县"], "status": "active", "sort": 1241, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "744540f8-0daf-4128-8817-10eaf8b82a79", "_rev": "2-8d5a74df5fa3f42475737662de436bf0", "type": "region", "code": "320115", "name": "江宁区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "744540f8-0daf-4128-8817-10eaf8b82a79"], "path_name": ["中国", "江苏省", "南京市", "江宁区"], "status": "active", "sort": 1246, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "76d04e49-48ec-40c4-835f-75e77e5e2ff2", "_rev": "2-3518ab607e2fa1b1a65896891dbb1ebc", "type": "region", "code": "420103", "name": "江汉区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "76d04e49-48ec-40c4-835f-75e77e5e2ff2"], "path_name": ["中国", "湖北省", "武汉市", "江汉区"], "status": "active", "sort": 1240, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "8a646b2a-e36a-49c7-8a2c-d4ba1cb8759b", "_rev": "2-0fdaeae43366f0b22323729ac33c428e", "type": "region", "code": "321012", "name": "江都区", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "8a646b2a-e36a-49c7-8a2c-d4ba1cb8759b"], "path_name": ["中国", "江苏省", "扬州市", "江都区"], "status": "active", "sort": 1238, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "8f72da9a-a5b4-4ced-b283-571cb3bfb5ec", "_rev": "2-774f03c935e4404d7251f144f267c70b", "type": "region", "code": "530403", "name": "江川区", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "8f72da9a-a5b4-4ced-b283-571cb3bfb5ec"], "path_name": ["中国", "云南省", "玉溪市", "江川区"], "status": "active", "sort": 1236, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "9a28b189-7834-441e-b64d-dc27067dbe7f", "_rev": "2-cda2a18dd69ab407ae962ae2494322e2", "type": "region", "code": "440704", "name": "江海区", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "9a28b189-7834-441e-b64d-dc27067dbe7f"], "path_name": ["中国", "广东省", "江门市", "江海区"], "status": "active", "sort": 1239, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "aa8390a2-20d7-411c-a510-9af407256ae3", "_rev": "2-067911c5d91aa5afc22b3d1dd589d906", "type": "region", "code": "441702", "name": "江城区", "parent_id": "52904b33-a73a-4461-bf0f-e3e5521c68c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "52904b33-a73a-4461-bf0f-e3e5521c68c7", "aa8390a2-20d7-411c-a510-9af407256ae3"], "path_name": ["中国", "广东省", "阳江市", "江城区"], "status": "active", "sort": 1235, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "bf5c6018-9cb4-46fb-9db7-2524aa30ccd6", "_rev": "2-ef2bbd98b797ee268b25c053a45490c0", "type": "region", "code": "421024", "name": "江陵县", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "bf5c6018-9cb4-46fb-9db7-2524aa30ccd6"], "path_name": ["中国", "湖北省", "荆州市", "江陵县"], "status": "active", "sort": 1244, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "d691b79b-aa90-43e9-b9aa-500b318d3029", "_rev": "2-11c94adba9c053ee24cb7a18fe3dea12", "type": "region", "code": "450105", "name": "江南区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "d691b79b-aa90-43e9-b9aa-500b318d3029"], "path_name": ["中国", "广西壮族自治区", "南宁市", "江南区"], "status": "active", "sort": 1245, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:21"} +{"_id": "078b1763-642c-449a-abac-addd8abfb732", "_rev": "2-6d86f4c0551163de0e58e7daf019162c", "type": "region", "code": "320281", "name": "江阴市", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "078b1763-642c-449a-abac-addd8abfb732"], "path_name": ["中国", "江苏省", "无锡市", "江阴市"], "status": "active", "sort": 1250, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "0c62a292-788c-4f5c-bf0e-8263da55b9f1", "_rev": "2-731d9d14fce216044318e4e4d9e1b274", "type": "region", "code": "141122", "name": "交城县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "0c62a292-788c-4f5c-bf0e-8263da55b9f1"], "path_name": ["中国", "山西省", "吕梁市", "交城县"], "status": "active", "sort": 1259, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "3cf7cfbf-5f4a-48af-8d54-6440c2abfa5c", "_rev": "2-d006453df9ce44292fe2844d2de11933", "type": "region", "code": "420115", "name": "江夏区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "3cf7cfbf-5f4a-48af-8d54-6440c2abfa5c"], "path_name": ["中国", "湖北省", "武汉市", "江夏区"], "status": "active", "sort": 1248, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "40f9d57d-358a-4ec4-b147-147b0ed38314", "_rev": "2-b4d681d1d397a2afa3e20450b2b17c06", "type": "region", "code": "510781", "name": "江油市", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "40f9d57d-358a-4ec4-b147-147b0ed38314"], "path_name": ["中国", "四川省", "绵阳市", "江油市"], "status": "active", "sort": 1252, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "55c7ba4f-7437-4bc7-ae8a-3f1ea842a470", "_rev": "2-a5b9d445d8901f5d5d4d9383bdd70f67", "type": "region", "code": "451402", "name": "江州区", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "55c7ba4f-7437-4bc7-ae8a-3f1ea842a470"], "path_name": ["中国", "广西壮族自治区", "崇左市", "江州区"], "status": "active", "sort": 1254, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "6cee05d4-a088-467e-abe2-ff9f813eb219", "_rev": "2-4ed2dbfd91bd2a82ff8186837ae25132", "type": "region", "code": "140826", "name": "绛县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "6cee05d4-a088-467e-abe2-ff9f813eb219"], "path_name": ["中国", "山西省", "运城市", "绛县"], "status": "active", "sort": 1258, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "943fdd1e-2638-4a1d-8d4e-248ff65ed2c5", "_rev": "2-6c5db7befc53e1aa7703210fcdef7934", "type": "region", "code": "540222", "name": "江孜县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "943fdd1e-2638-4a1d-8d4e-248ff65ed2c5"], "path_name": ["中国", "西藏自治区", "日喀则市", "江孜县"], "status": "active", "sort": 1255, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "968d13f4-fb55-4607-8e43-a63c534c9843", "_rev": "2-93ebc863cec5c7b7077d06759c1deeb9", "type": "region", "code": "510502", "name": "江阳区", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "968d13f4-fb55-4607-8e43-a63c534c9843"], "path_name": ["中国", "四川省", "泸州市", "江阳区"], "status": "active", "sort": 1249, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "9a36c5fd-6b6c-4f6c-8d2f-5022bd323ace", "_rev": "2-1800953fd4cda4eefed0565d0775d182", "type": "region", "code": "431125", "name": "江永县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "9a36c5fd-6b6c-4f6c-8d2f-5022bd323ace"], "path_name": ["中国", "湖南省", "永州市", "江永县"], "status": "active", "sort": 1251, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "b3d79023-3efc-4678-8888-315d747c9130", "_rev": "2-ead61c00171b4c317779f5d7feeefb28", "type": "region", "code": "330881", "name": "江山市", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "b3d79023-3efc-4678-8888-315d747c9130"], "path_name": ["中国", "浙江省", "衢州市", "江山市"], "status": "active", "sort": 1247, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "ca910608-0f7d-4315-8ce1-db524869f031", "_rev": "2-4e36bdb64ff1578b044fec3a835d5eb8", "type": "region", "code": "350428", "name": "将乐县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "ca910608-0f7d-4315-8ce1-db524869f031"], "path_name": ["中国", "福建省", "三明市", "将乐县"], "status": "active", "sort": 1256, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "d388a534-e658-4484-8f88-0c8355d30de0", "_rev": "2-4a8463d4180b1ca679d8763b97fa42b8", "type": "region", "code": "220605", "name": "江源区", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "d388a534-e658-4484-8f88-0c8355d30de0"], "path_name": ["中国", "吉林省", "白山市", "江源区"], "status": "active", "sort": 1253, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "d5a77e50-0da1-41c7-be02-d18cce6416cd", "_rev": "2-f129f756f238a12baa5f25e0b4b54579", "type": "region", "code": "141130", "name": "交口县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "d5a77e50-0da1-41c7-be02-d18cce6416cd"], "path_name": ["中国", "山西省", "吕梁市", "交口县"], "status": "active", "sort": 1260, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "dcc88802-d2d6-471c-9bcf-69908425fef4", "_rev": "2-7bf9429faebe11a7b4f081f420da7566", "type": "region", "code": "321204", "name": "姜堰区", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "dcc88802-d2d6-471c-9bcf-69908425fef4"], "path_name": ["中国", "江苏省", "泰州市", "姜堰区"], "status": "active", "sort": 1257, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:22"} +{"_id": "237e1e1f-833f-4ddc-b395-af483bdfc5f9", "_rev": "2-9127e0681d5f5df8822ebf9e816f4aa5", "type": "region", "code": "441427", "name": "蕉岭县", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "237e1e1f-833f-4ddc-b395-af483bdfc5f9"], "path_name": ["中国", "广东省", "梅州市", "蕉岭县"], "status": "active", "sort": 1265, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "299f6138-d886-4690-a40a-dfea335f08de", "_rev": "2-7ed006d271d9ae72d9398f68c4838ff3", "type": "region", "code": "410802", "name": "解放区", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "299f6138-d886-4690-a40a-dfea335f08de"], "path_name": ["中国", "河南省", "焦作市", "解放区"], "status": "active", "sort": 1268, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "2b4bf02c-cb40-4a18-aecc-7e1e9fa70511", "_rev": "2-8a2da66217f9d1799664270617ae3727", "type": "region", "code": "445222", "name": "揭西县", "parent_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326", "2b4bf02c-cb40-4a18-aecc-7e1e9fa70511"], "path_name": ["中国", "广东省", "揭阳市", "揭西县"], "status": "active", "sort": 1267, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "39ed609d-218a-4920-8514-cf475601f029", "_rev": "2-95067b1f07521a62a0dc815a979ab081", "type": "region", "code": "620302", "name": "金川区", "parent_id": "63325c4e-3c74-48e2-8473-7975b1e78a92", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "63325c4e-3c74-48e2-8473-7975b1e78a92", "39ed609d-218a-4920-8514-cf475601f029"], "path_name": ["中国", "甘肃省", "金昌市", "金川区"], "status": "active", "sort": 1274, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "3f4d381b-8df2-4338-9d79-6598c4653500", "_rev": "2-627eb7b5ae6b70b4a4d5be3872e10398", "type": "region", "code": "341282", "name": "界首市", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "3f4d381b-8df2-4338-9d79-6598c4653500"], "path_name": ["中国", "安徽省", "阜阳市", "界首市"], "status": "active", "sort": 1270, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "432fc867-32e7-4213-9da9-d85458744a43", "_rev": "2-83afcfb6c81a0bfe9a3277c6bede5913", "type": "region", "code": "451202", "name": "金城江区", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "432fc867-32e7-4213-9da9-d85458744a43"], "path_name": ["中国", "广西壮族自治区", "河池市", "金城江区"], "status": "active", "sort": 1272, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "59a42f77-961b-43fb-af55-05d98bcf233e", "_rev": "2-07b44886f930b9e176bb8d8199cc31b4", "type": "region", "code": "350902", "name": "蕉城区", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "59a42f77-961b-43fb-af55-05d98bcf233e"], "path_name": ["中国", "福建省", "宁德市", "蕉城区"], "status": "active", "sort": 1264, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "63325c4e-3c74-48e2-8473-7975b1e78a92", "_rev": "2-1e12c331232400f32f4af3db0c211bf9", "type": "region", "code": "620300", "name": "金昌市", "parent_id": "5e570f62-f00e-449b-9d44-031e1dd5940e", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "63325c4e-3c74-48e2-8473-7975b1e78a92"], "path_name": ["中国", "甘肃省", "金昌市"], "status": "active", "sort": 1273, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "8940f5ce-ff96-4e9c-8c70-070d1dc6f541", "_rev": "2-898e480e7353b2ec462db492748ff5a9", "type": "region", "code": "445203", "name": "揭东区", "parent_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326", "8940f5ce-ff96-4e9c-8c70-070d1dc6f541"], "path_name": ["中国", "广东省", "揭阳市", "揭东区"], "status": "active", "sort": 1266, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "ab00bfaa-12fb-49e0-b1af-31a2f5a935b2", "_rev": "2-34089bb6ffdc3d04e97f8dccd0d3b76f", "type": "region", "code": "370281", "name": "胶州市", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "ab00bfaa-12fb-49e0-b1af-31a2f5a935b2"], "path_name": ["中国", "山东省", "青岛市", "胶州市"], "status": "active", "sort": 1261, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "c5fa0799-ab49-426c-90ec-74bf08d3060a", "_rev": "2-510161c843166355c9fed7e5707e1d32", "type": "region", "code": "341502", "name": "金安区", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "c5fa0799-ab49-426c-90ec-74bf08d3060a"], "path_name": ["中国", "安徽省", "六安市", "金安区"], "status": "active", "sort": 1271, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "d7e714d8-478c-4acc-a5c2-9a48e9f5cf36", "_rev": "2-907f393d8a60cde48d7a8648adecdb90", "type": "region", "code": "331002", "name": "椒江区", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "d7e714d8-478c-4acc-a5c2-9a48e9f5cf36"], "path_name": ["中国", "浙江省", "台州市", "椒江区"], "status": "active", "sort": 1262, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "e0027db2-e835-4f5b-ae22-f688adce4aeb", "_rev": "2-f3d027ef6fa1e90643d7efe45ebf57e3", "type": "region", "code": "140781", "name": "介休市", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "e0027db2-e835-4f5b-ae22-f688adce4aeb"], "path_name": ["中国", "山西省", "晋中市", "介休市"], "status": "active", "sort": 1269, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "e69314f0-8043-4bfa-bb2f-bd13002f73b8", "_rev": "2-989e245ba10928968dc3767a8892f2db", "type": "region", "code": "220281", "name": "蛟河市", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "e69314f0-8043-4bfa-bb2f-bd13002f73b8"], "path_name": ["中国", "吉林省", "吉林市", "蛟河市"], "status": "active", "sort": 1263, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:23"} +{"_id": "002b8b5d-b607-4d42-aed6-441e8492a0be", "_rev": "2-9a27641a9fd0692b587b8f60a074020c", "type": "region", "code": "330703", "name": "金东区", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "002b8b5d-b607-4d42-aed6-441e8492a0be"], "path_name": ["中国", "浙江省", "金华市", "金东区"], "status": "active", "sort": 1276, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "13d4ce11-a8d5-4726-b29c-fed1e425e276", "_rev": "2-fdf6e0c873676338b2547328f82a0b3f", "type": "region", "code": "310116", "name": "金山区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "13d4ce11-a8d5-4726-b29c-fed1e425e276"], "path_name": ["中国", "上海市", "金山区"], "status": "active", "sort": 1284, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "24a70be9-aa19-4ec9-944c-f186fbf14f49", "_rev": "2-e0e24b6180e860fa9d71dbb54ce3894e", "type": "region", "code": "510106", "name": "金牛区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "24a70be9-aa19-4ec9-944c-f186fbf14f49"], "path_name": ["中国", "四川省", "成都市", "金牛区"], "status": "active", "sort": 1280, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "24f8bc8d-7b62-4c2b-9c7a-5bb0c17267b9", "_rev": "2-10779c4b9b2707fb1b9f1b4d998d2032", "type": "region", "code": "440511", "name": "金平区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "24f8bc8d-7b62-4c2b-9c7a-5bb0c17267b9"], "path_name": ["中国", "广东省", "汕头市", "金平区"], "status": "active", "sort": 1282, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "354fcdb2-21b7-439a-9ab0-3b9f2bd7018f", "_rev": "2-ce60fc1172879c39b90c447aff445d3b", "type": "region", "code": "410105", "name": "金水区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "354fcdb2-21b7-439a-9ab0-3b9f2bd7018f"], "path_name": ["中国", "河南省", "郑州市", "金水区"], "status": "active", "sort": 1285, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "5732fca1-d361-400c-99d8-38b40855ff95", "_rev": "2-0a358d7833db92c8cf830b0585e172d6", "type": "region", "code": "511113", "name": "金口河区", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "5732fca1-d361-400c-99d8-38b40855ff95"], "path_name": ["中国", "四川省", "乐山市", "金口河区"], "status": "active", "sort": 1278, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "697bb249-97fe-4eb1-bcaf-c36ef9b88484", "_rev": "2-decfc01a364a0044669c1029477c71c7", "type": "region", "code": "350527", "name": "金门县", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "697bb249-97fe-4eb1-bcaf-c36ef9b88484"], "path_name": ["中国", "福建省", "泉州市", "金门县"], "status": "active", "sort": 1279, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "7347dd60-1f9b-4196-a420-dc7612028002", "_rev": "2-105fcf3de97ab3b57039ce704d87afc2", "type": "region", "code": "320831", "name": "金湖县", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "7347dd60-1f9b-4196-a420-dc7612028002"], "path_name": ["中国", "江苏省", "淮安市", "金湖县"], "status": "active", "sort": 1277, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "76d2a59d-5d2f-4371-80e4-b07e2d02c93b", "_rev": "2-36a6179c021cca93f2e6ca7dcf249d94", "type": "region", "code": "513226", "name": "金川县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "76d2a59d-5d2f-4371-80e4-b07e2d02c93b"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "金川县"], "status": "active", "sort": 1275, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "94fb8e76-552f-4735-b119-05544e3dd17c", "_rev": "2-98718ff4adff011c7e4d41f8575c7a02", "type": "region", "code": "532530", "name": "金平苗族瑶族傣族自治县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "94fb8e76-552f-4735-b119-05544e3dd17c"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "金平苗族瑶族傣族自治县"], "status": "active", "sort": 1281, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "ac84e69b-c304-4756-a48f-b5e6bda5bab0", "_rev": "2-001a11689763c411beb708fa2d41d8f4", "type": "region", "code": "520523", "name": "金沙县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "ac84e69b-c304-4756-a48f-b5e6bda5bab0"], "path_name": ["中国", "贵州省", "毕节市", "金沙县"], "status": "active", "sort": 1283, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:24"} +{"_id": "1c62822c-41a9-468c-9f90-32c9ca578e77", "_rev": "2-a918f65dff98f143d0f7e26d2196eea5", "type": "region", "code": "361027", "name": "金溪县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "1c62822c-41a9-468c-9f90-32c9ca578e77"], "path_name": ["中国", "江西省", "抚州市", "金溪县"], "status": "active", "sort": 1292, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "1c927951-20c9-4fdb-aa27-7c6eb4fa0935", "_rev": "2-18d6219f0f739c6893aa6afc4b8a654e", "type": "region", "code": "620921", "name": "金塔县", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "1c927951-20c9-4fdb-aa27-7c6eb4fa0935"], "path_name": ["中国", "甘肃省", "酒泉市", "金塔县"], "status": "active", "sort": 1286, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "23c761ff-5d7f-4d4e-8083-bc94b56e3905", "_rev": "2-8f8f4a61bfb1484213e0d3919a42e1d8", "type": "region", "code": "120112", "name": "津南区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "23c761ff-5d7f-4d4e-8083-bc94b56e3905"], "path_name": ["中国", "天津市", "津南区"], "status": "active", "sort": 1298, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "2c5d36ad-6cc6-46dd-a593-61c8f779189f", "_rev": "2-d2defe507e451769069cd2fd8ab08e4b", "type": "region", "code": "451324", "name": "金秀瑶族自治县", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "2c5d36ad-6cc6-46dd-a593-61c8f779189f"], "path_name": ["中国", "广西壮族自治区", "来宾市", "金秀瑶族自治县"], "status": "active", "sort": 1294, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "4c7cf509-0128-44cd-a9e4-9a3fae7b68af", "_rev": "2-ce65ca4a39773d85adff4da0ebd322ea", "type": "region", "code": "320413", "name": "金坛区", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "4c7cf509-0128-44cd-a9e4-9a3fae7b68af"], "path_name": ["中国", "江苏省", "常州市", "金坛区"], "status": "active", "sort": 1289, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "_rev": "2-f093fe446af4507167ac8a914f9ba437", "type": "region", "code": "320400", "name": "常州市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68"], "path_name": ["中国", "江苏省", "常州市"], "status": "active", "sort": 1288, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "58c2094d-4cfc-45a4-a69e-22864d95d79c", "_rev": "2-1a039fb67339a4e3b8b3ba7ff3355f23", "type": "region", "code": "510121", "name": "金堂县", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "58c2094d-4cfc-45a4-a69e-22864d95d79c"], "path_name": ["中国", "四川省", "成都市", "金堂县"], "status": "active", "sort": 1290, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "63c460f4-d30c-4feb-8d03-88bcded3f743", "_rev": "2-2b154ad470cdf6c741dd02f60facf84c", "type": "region", "code": "370828", "name": "金乡县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "63c460f4-d30c-4feb-8d03-88bcded3f743"], "path_name": ["中国", "山东省", "济宁市", "金乡县"], "status": "active", "sort": 1293, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "6b6be581-f8db-4f30-b629-dba7c2f47e48", "_rev": "2-7feba576da9d0ca784394274171f192f", "type": "region", "code": "610303", "name": "金台区", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "6b6be581-f8db-4f30-b629-dba7c2f47e48"], "path_name": ["中国", "陕西省", "宝鸡市", "金台区"], "status": "active", "sort": 1287, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "9e53fff6-72c8-4141-93b1-d16064839a3c", "_rev": "2-c51852ce24c341633f71abaefcaf234e", "type": "region", "code": "513430", "name": "金阳县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "9e53fff6-72c8-4141-93b1-d16064839a3c"], "path_name": ["中国", "四川省", "凉山彝族自治州", "金阳县"], "status": "active", "sort": 1295, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "9e99ea85-39fc-40af-a2d7-8563f47b764d", "_rev": "2-4d8a2b7c12817ced7cd9bf2ba4367fbb", "type": "region", "code": "341524", "name": "金寨县", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "9e99ea85-39fc-40af-a2d7-8563f47b764d"], "path_name": ["中国", "安徽省", "六安市", "金寨县"], "status": "active", "sort": 1296, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "e1210924-c01f-43cd-b54d-635cc93a4f09", "_rev": "2-145c0fbdb4d53f6dfa78b116bfb1ffef", "type": "region", "code": "210213", "name": "金州区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "e1210924-c01f-43cd-b54d-635cc93a4f09"], "path_name": ["中国", "辽宁省", "大连市", "金州区"], "status": "active", "sort": 1297, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "ebb482c9-e4f8-4aff-a6cb-692745735f35", "_rev": "2-ed664185c308b97dba6520a55a2b51b5", "type": "region", "code": "440404", "name": "金湾区", "parent_id": "b7fabac9-498e-46d6-b70c-57d75f45f857", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7fabac9-498e-46d6-b70c-57d75f45f857", "ebb482c9-e4f8-4aff-a6cb-692745735f35"], "path_name": ["中国", "广东省", "珠海市", "金湾区"], "status": "active", "sort": 1291, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:25"} +{"_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "_rev": "2-d9dc94f299307c67898a622abe79a4eb", "type": "region", "code": "331100", "name": "丽水市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7"], "path_name": ["中国", "浙江省", "丽水市"], "status": "active", "sort": 1308, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "156b9e38-f7b1-48fd-9925-691bdd83d024", "_rev": "2-3002dae09e0b6cc866c81961a2490e27", "type": "region", "code": "321102", "name": "京口区", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "156b9e38-f7b1-48fd-9925-691bdd83d024"], "path_name": ["中国", "江苏省", "镇江市", "京口区"], "status": "active", "sort": 1310, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "185c4666-7706-48d5-8c80-afb61e4a8da6", "_rev": "2-3b9f974d69d5c7a9fc836789f5667d2b", "type": "region", "code": "350111", "name": "晋安区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "185c4666-7706-48d5-8c80-afb61e4a8da6"], "path_name": ["中国", "福建省", "福州市", "晋安区"], "status": "active", "sort": 1303, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "19dc4323-310c-4cae-88e6-d2bc219014cf", "_rev": "2-90212e908c7c626a7f90868a99870918", "type": "region", "code": "420882", "name": "京山市", "parent_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "19dc4323-310c-4cae-88e6-d2bc219014cf"], "path_name": ["中国", "湖北省", "荆门市", "京山市"], "status": "active", "sort": 1311, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "1d710e8a-1464-4df2-a3d0-90440f31d6bf", "_rev": "2-5d61106873c8f6bf9e0225c90c57de17", "type": "region", "code": "350582", "name": "晋江市", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "1d710e8a-1464-4df2-a3d0-90440f31d6bf"], "path_name": ["中国", "福建省", "泉州市", "晋江市"], "status": "active", "sort": 1304, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "20e432af-890d-4781-b633-d2773ec8dd17", "_rev": "2-79201c7132de639088d5dcb696ca4a02", "type": "region", "code": "331122", "name": "缙云县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "20e432af-890d-4781-b633-d2773ec8dd17"], "path_name": ["中国", "浙江省", "丽水市", "缙云县"], "status": "active", "sort": 1309, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "421c18ae-1793-40d7-ba00-4f4a339e8477", "_rev": "2-88f3cef72b83ee6e9f6735d7a204012b", "type": "region", "code": "430781", "name": "津市市", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "421c18ae-1793-40d7-ba00-4f4a339e8477"], "path_name": ["中国", "湖南省", "常德市", "津市市"], "status": "active", "sort": 1299, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "4d4a5a32-c52d-4d63-995e-f82cb17fea2a", "_rev": "2-8a584b194a7e8a9822cbb17af94a110f", "type": "region", "code": "140110", "name": "晋源区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "4d4a5a32-c52d-4d63-995e-f82cb17fea2a"], "path_name": ["中国", "山西省", "太原市", "晋源区"], "status": "active", "sort": 1306, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "64699ff6-090c-4bc3-a15b-da7da431fff3", "_rev": "2-cbf108716054ac741e15e121e696fe74", "type": "region", "code": "130183", "name": "晋州市", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "64699ff6-090c-4bc3-a15b-da7da431fff3"], "path_name": ["中国", "河北省", "石家庄市", "晋州市"], "status": "active", "sort": 1307, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "6e4106b1-5305-4e48-93d5-5275bc5506aa", "_rev": "2-56536ecbbbb2ed9097be8bbc296d5c30", "type": "region", "code": "510104", "name": "锦江区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "6e4106b1-5305-4e48-93d5-5275bc5506aa"], "path_name": ["中国", "四川省", "成都市", "锦江区"], "status": "active", "sort": 1300, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "a47d3112-e071-4ca1-bdd5-599ba3aecfad", "_rev": "2-4d3a66386881f855ef13380977f0e71d", "type": "region", "code": "522628", "name": "锦屏县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "a47d3112-e071-4ca1-bdd5-599ba3aecfad"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "锦屏县"], "status": "active", "sort": 1301, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "a5410ce6-f698-4d70-bee8-2db80b971a2c", "_rev": "2-cbd9143b41d3daae92a619ecf499f71c", "type": "region", "code": "360124", "name": "进贤县", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "a5410ce6-f698-4d70-bee8-2db80b971a2c"], "path_name": ["中国", "江西省", "南昌市", "进贤县"], "status": "active", "sort": 1302, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "b9fb485a-2310-4cce-a48c-b7ccaa11839a", "_rev": "2-5f1c72b2f336a57a7503a0bac0330072", "type": "region", "code": "530115", "name": "晋宁区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "b9fb485a-2310-4cce-a48c-b7ccaa11839a"], "path_name": ["中国", "云南省", "昆明市", "晋宁区"], "status": "active", "sort": 1305, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:26"} +{"_id": "34387698-85e9-49d3-b385-3b02a94ebcd2", "_rev": "2-df21ecf0c14b3667a179375463711111", "type": "region", "code": "620821", "name": "泾川县", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "34387698-85e9-49d3-b385-3b02a94ebcd2"], "path_name": ["中国", "甘肃省", "平凉市", "泾川县"], "status": "active", "sort": 1312, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "3b2bed21-8bf5-4533-bd01-0380067b9033", "_rev": "2-8299b95ce1c7894f05cdad96ba32943e", "type": "region", "code": "610423", "name": "泾阳县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "3b2bed21-8bf5-4533-bd01-0380067b9033"], "path_name": ["中国", "陕西省", "咸阳市", "泾阳县"], "status": "active", "sort": 1314, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "48260405-079d-400c-856a-96c9ef026637", "_rev": "2-cae669d98820be7f2e927c8aa5c71ba9", "type": "region", "code": "341825", "name": "旌德县", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "48260405-079d-400c-856a-96c9ef026637"], "path_name": ["中国", "安徽省", "宣城市", "旌德县"], "status": "active", "sort": 1318, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "4b525686-85e9-48c4-8ed1-c6a6aebd06f7", "_rev": "2-de0e8c45a2a665b24839f3722f412433", "type": "region", "code": "511124", "name": "井研县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "4b525686-85e9-48c4-8ed1-c6a6aebd06f7"], "path_name": ["中国", "四川省", "乐山市", "井研县"], "status": "active", "sort": 1324, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "509f4129-5cc2-4877-91c1-7087e7fa5f78", "_rev": "2-930e9ec529d786fa1c1bc066284de5dd", "type": "region", "code": "652722", "name": "精河县", "parent_id": "e64d86ab-5882-486d-9aff-e40ebc901640", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "e64d86ab-5882-486d-9aff-e40ebc901640", "509f4129-5cc2-4877-91c1-7087e7fa5f78"], "path_name": ["中国", "新疆维吾尔自治区", "博尔塔拉蒙古自治州", "精河县"], "status": "active", "sort": 1320, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "_rev": "2-a3377821a3a3de11e1b85c6f02900962", "type": "region", "code": "640400", "name": "固原市", "parent_id": "80ff9327-d153-4a58-9ad7-b1b173b77440", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8"], "path_name": ["中国", "宁夏回族自治区", "固原市"], "status": "active", "sort": 1315, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "69958006-23c2-4e6e-a1e5-b0efd4404b75", "_rev": "2-958002f7eec73c06a8d26b1dd0b3306b", "type": "region", "code": "640424", "name": "泾源县", "parent_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "69958006-23c2-4e6e-a1e5-b0efd4404b75"], "path_name": ["中国", "宁夏回族自治区", "固原市", "泾源县"], "status": "active", "sort": 1316, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "6a52ce3f-4b22-4c77-b7cf-6d591bd70a58", "_rev": "2-d2a1fbceef3ce0053d1e69791c2f2257", "type": "region", "code": "341823", "name": "泾县", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "6a52ce3f-4b22-4c77-b7cf-6d591bd70a58"], "path_name": ["中国", "安徽省", "宣城市", "泾县"], "status": "active", "sort": 1313, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "76d4aada-435c-44bd-b45e-66e033bd569c", "_rev": "2-47dd62bc3479f1dfd7c33316302da39e", "type": "region", "code": "130121", "name": "井陉县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "76d4aada-435c-44bd-b45e-66e033bd569c"], "path_name": ["中国", "河北省", "石家庄市", "井陉县"], "status": "active", "sort": 1323, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "79ea46e7-555d-4ac3-8450-6d76f0b7ea48", "_rev": "2-6dad9fce72ebf09deff0856ef08934eb", "type": "region", "code": "510603", "name": "旌阳区", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "79ea46e7-555d-4ac3-8450-6d76f0b7ea48"], "path_name": ["中国", "四川省", "德阳市", "旌阳区"], "status": "active", "sort": 1319, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "7ed01709-2aa5-4736-851c-53367ab29ec8", "_rev": "2-545d00b8a39daa91af20ec09cac3d1fa", "type": "region", "code": "360881", "name": "井冈山市", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "7ed01709-2aa5-4736-851c-53367ab29ec8"], "path_name": ["中国", "江西省", "吉安市", "井冈山市"], "status": "active", "sort": 1321, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "c7c6998e-f0e4-46f7-839d-c66badac830c", "_rev": "2-af863f727619ba064d6a09ba42720e20", "type": "region", "code": "421003", "name": "荆州区", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "c7c6998e-f0e4-46f7-839d-c66badac830c"], "path_name": ["中国", "湖北省", "荆州市", "荆州区"], "status": "active", "sort": 1317, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "d5b98679-835a-4aaa-8430-16a4de638eef", "_rev": "2-2744e4e035f46d4578a52964badc03ab", "type": "region", "code": "130107", "name": "井陉矿区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "d5b98679-835a-4aaa-8430-16a4de638eef"], "path_name": ["中国", "河北省", "石家庄市", "井陉矿区"], "status": "active", "sort": 1322, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:27"} +{"_id": "08b11921-828f-4522-9c20-85e21a8435f4", "_rev": "2-edbd2305af1053d96e077b88d7e2cd27", "type": "region", "code": "532801", "name": "景洪市", "parent_id": "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "08b11921-828f-4522-9c20-85e21a8435f4"], "path_name": ["中国", "云南省", "西双版纳傣族自治州", "景洪市"], "status": "active", "sort": 1328, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "3efb12dc-f8d7-41c2-bf88-cf7469813cac", "_rev": "2-31caea37f3900fbe63e16a344e9009a7", "type": "region", "code": "131127", "name": "景县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "3efb12dc-f8d7-41c2-bf88-cf7469813cac"], "path_name": ["中国", "河北省", "衡水市", "景县"], "status": "active", "sort": 1331, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "5ab3f3fb-c885-47e6-a3e0-2bedde5778bf", "_rev": "2-65b287a35471a247c90fdf350f518906", "type": "region", "code": "530823", "name": "景东彝族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "5ab3f3fb-c885-47e6-a3e0-2bedde5778bf"], "path_name": ["中国", "云南省", "普洱市", "景东彝族自治县"], "status": "active", "sort": 1325, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "689717cc-002d-4b5b-97d8-8ad0cf0c48fe", "_rev": "2-2a751567b92651227c6d2c8964740f30", "type": "region", "code": "321282", "name": "靖江市", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "689717cc-002d-4b5b-97d8-8ad0cf0c48fe"], "path_name": ["中国", "江苏省", "泰州市", "靖江市"], "status": "active", "sort": 1335, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "8b42abc8-8123-4429-bedd-b26161d4e6b9", "_rev": "2-2d7f224177d092293e0a0b9211e572bf", "type": "region", "code": "360925", "name": "靖安县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "8b42abc8-8123-4429-bedd-b26161d4e6b9"], "path_name": ["中国", "江西省", "宜春市", "靖安县"], "status": "active", "sort": 1333, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "_rev": "2-1d03549528c536832d7b774d8ef47f60", "type": "region", "code": "532800", "name": "西双版纳傣族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2"], "path_name": ["中国", "云南省", "西双版纳傣族自治州"], "status": "active", "sort": 1327, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "c633aed4-ef9c-4d6d-91b1-7981320d8f88", "_rev": "2-70aa9f1248ad3cb75649299f0f7b969e", "type": "region", "code": "620423", "name": "景泰县", "parent_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "c633aed4-ef9c-4d6d-91b1-7981320d8f88"], "path_name": ["中国", "甘肃省", "白银市", "景泰县"], "status": "active", "sort": 1330, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "db3c3976-c6b4-4ba5-a406-4c11deb4eda5", "_rev": "2-e83274e2d70f01b8ae600d7c1d3414a0", "type": "region", "code": "530824", "name": "景谷傣族彝族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "db3c3976-c6b4-4ba5-a406-4c11deb4eda5"], "path_name": ["中国", "云南省", "普洱市", "景谷傣族彝族自治县"], "status": "active", "sort": 1326, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "e30eb713-78e5-4827-988e-e872b9e965fd", "_rev": "2-7cefdd30f6c8d73d8e25ba32cfedf75d", "type": "region", "code": "331127", "name": "景宁畲族自治县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "e30eb713-78e5-4827-988e-e872b9e965fd"], "path_name": ["中国", "浙江省", "丽水市", "景宁畲族自治县"], "status": "active", "sort": 1329, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "eae22ed8-86a7-48f4-af72-8086f7ff8e5c", "_rev": "2-8ab3907d8a12aceb5a0d8f397ce363f2", "type": "region", "code": "610824", "name": "靖边县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "eae22ed8-86a7-48f4-af72-8086f7ff8e5c"], "path_name": ["中国", "陕西省", "榆林市", "靖边县"], "status": "active", "sort": 1334, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "ecf35c19-b306-4404-ab48-ff6a1637e45a", "_rev": "2-b798956fbe8d07ac36bca60dc52c62f6", "type": "region", "code": "130602", "name": "竞秀区", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "ecf35c19-b306-4404-ab48-ff6a1637e45a"], "path_name": ["中国", "河北省", "保定市", "竞秀区"], "status": "active", "sort": 1332, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:28"} +{"_id": "08ad5ba3-9432-4098-bd1d-b08e0dddaccd", "_rev": "2-07713f493d4c3a5a3455ea786405d64b", "type": "region", "code": "140926", "name": "静乐县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "08ad5ba3-9432-4098-bd1d-b08e0dddaccd"], "path_name": ["中国", "山西省", "忻州市", "静乐县"], "status": "active", "sort": 1342, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "0f06f3d6-9c37-4883-9c25-841aae2978d3", "_rev": "2-5dc73ea7994a8e645223e837e548498e", "type": "region", "code": "220622", "name": "靖宇县", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "0f06f3d6-9c37-4883-9c25-841aae2978d3"], "path_name": ["中国", "吉林省", "白山市", "靖宇县"], "status": "active", "sort": 1337, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "258ddaa6-8c6d-44da-b7c8-ac00e7ba514d", "_rev": "2-bcd78f3872a9bd568e0218303a0e7805", "type": "region", "code": "620826", "name": "静宁县", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "258ddaa6-8c6d-44da-b7c8-ac00e7ba514d"], "path_name": ["中国", "甘肃省", "平凉市", "静宁县"], "status": "active", "sort": 1343, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "29464d8a-02ce-4054-a714-de5b21818734", "_rev": "2-048e066458dfc08247ff0d09984cab1b", "type": "region", "code": "340202", "name": "镜湖区", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "29464d8a-02ce-4054-a714-de5b21818734"], "path_name": ["中国", "安徽省", "芜湖市", "镜湖区"], "status": "active", "sort": 1344, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "5de34c1e-217c-45b8-a048-b388d372fa53", "_rev": "2-17b0576aee8ff7de8aa304e990d66eb7", "type": "region", "code": "451081", "name": "靖西市", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "5de34c1e-217c-45b8-a048-b388d372fa53"], "path_name": ["中国", "广西壮族自治区", "百色市", "靖西市"], "status": "active", "sort": 1336, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "6722fcb2-4105-49ff-a656-5b024b59e1c3", "_rev": "2-be752e45e5ff72344ca5fd4bd2771d3d", "type": "region", "code": "120118", "name": "静海区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "6722fcb2-4105-49ff-a656-5b024b59e1c3"], "path_name": ["中国", "天津市", "静海区"], "status": "active", "sort": 1341, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "965cbdc6-4d59-4f57-94ae-eca617fe05ba", "_rev": "2-86d07d0d5259f6a9db69b91facfaf82f", "type": "region", "code": "431229", "name": "靖州苗族侗族自治县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "965cbdc6-4d59-4f57-94ae-eca617fe05ba"], "path_name": ["中国", "湖南省", "怀化市", "靖州苗族侗族自治县"], "status": "active", "sort": 1339, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "a9cdf58b-e62c-4fe7-9fd9-b0d84779ba23", "_rev": "2-886f69b02743bfb025a480b20efdd108", "type": "region", "code": "310106", "name": "静安区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "a9cdf58b-e62c-4fe7-9fd9-b0d84779ba23"], "path_name": ["中国", "上海市", "静安区"], "status": "active", "sort": 1340, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "c460d1d8-8603-4d26-85f0-47a9e76a73bc", "_rev": "2-283ef32238fcd5a1ad7f3c806682de34", "type": "region", "code": "513324", "name": "九龙县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "c460d1d8-8603-4d26-85f0-47a9e76a73bc"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "九龙县"], "status": "active", "sort": 1347, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "c4f8d55b-f227-431b-9cbc-098ef2059403", "_rev": "2-3b05f3a1dbcc6f8093adb11f31f22e1f", "type": "region", "code": "340207", "name": "鸠江区", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "c4f8d55b-f227-431b-9cbc-098ef2059403"], "path_name": ["中国", "安徽省", "芜湖市", "鸠江区"], "status": "active", "sort": 1345, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "d1a4cc17-0060-4935-82ed-01dd00c00e8b", "_rev": "2-3300db4434b8de4a1c740b735055b41e", "type": "region", "code": "220113", "name": "九台区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "d1a4cc17-0060-4935-82ed-01dd00c00e8b"], "path_name": ["中国", "吉林省", "长春市", "九台区"], "status": "active", "sort": 1348, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "e19db248-5f97-44d2-87fc-499d3f77a0ae", "_rev": "2-75b888161df47c85f356f9613ff4eee0", "type": "region", "code": "500107", "name": "九龙坡区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e19db248-5f97-44d2-87fc-499d3f77a0ae"], "path_name": ["中国", "重庆市", "九龙坡区"], "status": "active", "sort": 1346, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "f57f9ced-b318-4e32-b578-b840e191a616", "_rev": "2-b92ff7505d94424a97e296f0dcfb8152", "type": "region", "code": "620421", "name": "靖远县", "parent_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "f57f9ced-b318-4e32-b578-b840e191a616"], "path_name": ["中国", "甘肃省", "白银市", "靖远县"], "status": "active", "sort": 1338, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:29"} +{"_id": "0268025e-1cb0-4745-ad43-4f4d4881a5b0", "_rev": "2-a61b96a0dfa096761334910e65e4af39", "type": "region", "code": "513225", "name": "九寨沟县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "0268025e-1cb0-4745-ad43-4f4d4881a5b0"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "九寨沟县"], "status": "active", "sort": 1350, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "061ff26a-868c-4bbd-8453-d74c092bed7d", "_rev": "2-c6676152dd11bd6a867e142395be4b63", "type": "region", "code": "321183", "name": "句容市", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "061ff26a-868c-4bbd-8453-d74c092bed7d"], "path_name": ["中国", "江苏省", "镇江市", "句容市"], "status": "active", "sort": 1356, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "22fb6830-332a-4ecd-8fff-0738338295d2", "_rev": "2-53504dfc3bebcedeb604de8bc985ee39", "type": "region", "code": "410621", "name": "浚县", "parent_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7", "22fb6830-332a-4ecd-8fff-0738338295d2"], "path_name": ["中国", "河南省", "鹤壁市", "浚县"], "status": "active", "sort": 1359, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "254d8f13-1313-4123-b495-99f97afa26e8", "_rev": "2-508ac5b7f196cd35a0b08eba3480e8da", "type": "region", "code": "150428", "name": "喀喇沁旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "254d8f13-1313-4123-b495-99f97afa26e8"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "喀喇沁旗"], "status": "active", "sort": 1360, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "4e0fcecf-75fa-4aed-ae9a-68d75f9a58d6", "_rev": "2-a3d3030d662b55e9539a26b7bee4e78a", "type": "region", "code": "371726", "name": "鄄城县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "4e0fcecf-75fa-4aed-ae9a-68d75f9a58d6"], "path_name": ["中国", "山东省", "菏泽市", "鄄城县"], "status": "active", "sort": 1357, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "6adedac2-42b3-4f72-a40b-36cf34678842", "_rev": "2-63ec665e5bf584f9cc81424f6710adb0", "type": "region", "code": "371327", "name": "莒南县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "6adedac2-42b3-4f72-a40b-36cf34678842"], "path_name": ["中国", "山东省", "临沂市", "莒南县"], "status": "active", "sort": 1352, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "86c63fbf-95db-4800-85ff-0a05c1857d32", "_rev": "2-c5484fa2a8d50cbfca52fb2dbe99970e", "type": "region", "code": "371122", "name": "莒县", "parent_id": "da26105e-dedf-4275-9619-5d4354c2cc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "da26105e-dedf-4275-9619-5d4354c2cc42", "86c63fbf-95db-4800-85ff-0a05c1857d32"], "path_name": ["中国", "山东省", "日照市", "莒县"], "status": "active", "sort": 1353, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "8f39b34d-2915-4149-9ed7-6f137a8384dd", "_rev": "2-e0f0022c41a4bced8ad6b6dc52451085", "type": "region", "code": "632625", "name": "久治县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "8f39b34d-2915-4149-9ed7-6f137a8384dd"], "path_name": ["中国", "青海省", "果洛藏族自治州", "久治县"], "status": "active", "sort": 1351, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "901ddc95-213b-45a4-bd5e-d370b6ceb77c", "_rev": "2-8c60908f96247ba12793d1e9e79a85a0", "type": "region", "code": "130529", "name": "巨鹿县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "901ddc95-213b-45a4-bd5e-d370b6ceb77c"], "path_name": ["中国", "河北省", "邢台市", "巨鹿县"], "status": "active", "sort": 1354, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "9a860d22-974b-4138-b95d-97341744981c", "_rev": "2-1b87255f098ef540ab57eba0728291a1", "type": "region", "code": "371724", "name": "巨野县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "9a860d22-974b-4138-b95d-97341744981c"], "path_name": ["中国", "山东省", "菏泽市", "巨野县"], "status": "active", "sort": 1355, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "d4dc79ce-1ff9-4c44-bcf0-4921fc6cec85", "_rev": "2-b248627e31f7d585993d5e11f5660446", "type": "region", "code": "150207", "name": "九原区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "d4dc79ce-1ff9-4c44-bcf0-4921fc6cec85"], "path_name": ["中国", "内蒙古自治区", "包头市", "九原区"], "status": "active", "sort": 1349, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "f628f4f4-0403-4a86-a8b3-cc311931706e", "_rev": "2-6e69586e414d1d1290b07babda5a9a0e", "type": "region", "code": "211324", "name": "喀喇沁左翼蒙古族自治县", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "f628f4f4-0403-4a86-a8b3-cc311931706e"], "path_name": ["中国", "辽宁省", "朝阳市", "喀喇沁左翼蒙古族自治县"], "status": "active", "sort": 1361, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "fc74de80-d2a7-4d0b-b385-a0a759243954", "_rev": "2-1c0e0a0ab79d5fbe383423bfd44b5c2d", "type": "region", "code": "430611", "name": "君山区", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "fc74de80-d2a7-4d0b-b385-a0a759243954"], "path_name": ["中国", "湖南省", "岳阳市", "君山区"], "status": "active", "sort": 1358, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:30"} +{"_id": "0a152850-b735-4800-be28-082dc521936d", "_rev": "2-4af9f5e9c01e73a74042e8cdc9207cf9", "type": "region", "code": "430105", "name": "开福区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "0a152850-b735-4800-be28-082dc521936d"], "path_name": ["中国", "湖南省", "长沙市", "开福区"], "status": "active", "sort": 1364, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "506a7c49-1a8e-408a-9f91-2b7c012cfbe8", "_rev": "2-f5961c3afd510347ac9bf49bf3324c5c", "type": "region", "code": "150523", "name": "开鲁县", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "506a7c49-1a8e-408a-9f91-2b7c012cfbe8"], "path_name": ["中国", "内蒙古自治区", "通辽市", "开鲁县"], "status": "active", "sort": 1367, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "68e07794-3c8b-42bb-9cbb-cbf1d640bc5b", "_rev": "2-851689f5f5711806014a2964b9ca89a3", "type": "region", "code": "520121", "name": "开阳县", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "68e07794-3c8b-42bb-9cbb-cbf1d640bc5b"], "path_name": ["中国", "贵州省", "贵阳市", "开阳县"], "status": "active", "sort": 1370, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "814e0e6e-9dff-4d41-b7e8-16014b67e258", "_rev": "2-fdeffa84b1d4201366571371ee3067f1", "type": "region", "code": "440783", "name": "开平市", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "814e0e6e-9dff-4d41-b7e8-16014b67e258"], "path_name": ["中国", "广东省", "江门市", "开平市"], "status": "active", "sort": 1369, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "8187f866-ad39-4705-a6ed-b060aa110879", "_rev": "2-9ae2d042c2357ce9b23bec456ff7bc40", "type": "region", "code": "511723", "name": "开江县", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "8187f866-ad39-4705-a6ed-b060aa110879"], "path_name": ["中国", "四川省", "达州市", "开江县"], "status": "active", "sort": 1366, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "ca980e8c-385d-49ee-81e2-f307d373a730", "_rev": "2-c0780bde6b9d8ed6b7d0ebccc4df7a98", "type": "region", "code": "500154", "name": "开州区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "ca980e8c-385d-49ee-81e2-f307d373a730"], "path_name": ["中国", "重庆市", "开州区"], "status": "active", "sort": 1373, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "d52692ee-2e3a-443a-964c-6b2dd4c3d556", "_rev": "2-8ca498d62c97f9cac709b4bde0f34b26", "type": "region", "code": "211282", "name": "开原市", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "d52692ee-2e3a-443a-964c-6b2dd4c3d556"], "path_name": ["中国", "辽宁省", "铁岭市", "开原市"], "status": "active", "sort": 1371, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "e0523daf-c0f9-4190-b138-9d5bf8fb7873", "_rev": "2-efdf7cdab288796ce00806bd16753a4c", "type": "region", "code": "540302", "name": "卡若区", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "e0523daf-c0f9-4190-b138-9d5bf8fb7873"], "path_name": ["中国", "西藏自治区", "昌都市", "卡若区"], "status": "active", "sort": 1363, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "e12e5e48-8930-40c9-ab7c-f22aa93af958", "_rev": "2-5c85a3f6c770dadaf8cbff634377658c", "type": "region", "code": "532502", "name": "开远市", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "e12e5e48-8930-40c9-ab7c-f22aa93af958"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "开远市"], "status": "active", "sort": 1372, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "e825e48b-549a-49a7-b884-c1992a10ac2a", "_rev": "2-d72d0253259be28861cce09e89350a39", "type": "region", "code": "653101", "name": "喀什市", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "e825e48b-549a-49a7-b884-c1992a10ac2a"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "喀什市"], "status": "active", "sort": 1362, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "f2cd072f-4255-4866-89db-a4c37048d70e", "_rev": "2-cc9ddfaaa364c5eb8d76f3cc63260310", "type": "region", "code": "330824", "name": "开化县", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "f2cd072f-4255-4866-89db-a4c37048d70e"], "path_name": ["中国", "浙江省", "衢州市", "开化县"], "status": "active", "sort": 1365, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "f97ede79-1421-4078-91e7-10ef5c36fbbf", "_rev": "2-a9f958517986a6cbdcdf0bc3dbf30538", "type": "region", "code": "130205", "name": "开平区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "f97ede79-1421-4078-91e7-10ef5c36fbbf"], "path_name": ["中国", "河北省", "唐山市", "开平区"], "status": "active", "sort": 1368, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:31"} +{"_id": "2a79dbfb-060c-474e-bafb-5ebf2374ccf4", "_rev": "2-bfa22859c30d37508f9c65dd5f92f4da", "type": "region", "code": "540230", "name": "康马县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "2a79dbfb-060c-474e-bafb-5ebf2374ccf4"], "path_name": ["中国", "西藏自治区", "日喀则市", "康马县"], "status": "active", "sort": 1378, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "529daba3-e926-4403-b572-16a0844faea0", "_rev": "2-e54f98d3cd1456053d3550b2062fc0c7", "type": "region", "code": "330600", "name": "绍兴市", "parent_id": "81548d61-9bb8-47e5-886f-36a664df4bf9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0"], "path_name": ["中国", "浙江省", "绍兴市"], "status": "active", "sort": 1383, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "573e4437-2484-4341-a008-7eecf4fb9295", "_rev": "2-bb1362256124b141ed0d08f0bafd4e1f", "type": "region", "code": "513301", "name": "康定市", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "573e4437-2484-4341-a008-7eecf4fb9295"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "康定市"], "status": "active", "sort": 1376, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "5ab5f504-f73d-41bf-a17e-c2e701e4bd3b", "_rev": "2-6bb6ae6d13e171ef1ee1bbff074197d5", "type": "region", "code": "622922", "name": "康乐县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "5ab5f504-f73d-41bf-a17e-c2e701e4bd3b"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "康乐县"], "status": "active", "sort": 1377, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "5b097489-9a01-4fca-8786-a0618d64041f", "_rev": "2-3c806f3ed32c6416cf7ca00b31a1251a", "type": "region", "code": "330603", "name": "柯桥区", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "5b097489-9a01-4fca-8786-a0618d64041f"], "path_name": ["中国", "浙江省", "绍兴市", "柯桥区"], "status": "active", "sort": 1384, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "9a420161-3f38-44d8-afcd-0cad315fbf22", "_rev": "2-875f22347fb6901fba2b9ae1753962a0", "type": "region", "code": "150502", "name": "科尔沁区", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "9a420161-3f38-44d8-afcd-0cad315fbf22"], "path_name": ["中国", "内蒙古自治区", "通辽市", "科尔沁区"], "status": "active", "sort": 1385, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "bb0d8a41-78e4-4bd7-b8e8-6fa1e789a311", "_rev": "2-4ffe659e933f543ed14c1b6f6d893649", "type": "region", "code": "130723", "name": "康保县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "bb0d8a41-78e4-4bd7-b8e8-6fa1e789a311"], "path_name": ["中国", "河北省", "张家口市", "康保县"], "status": "active", "sort": 1375, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "e3de15ea-3f25-4760-a014-536013a92bc5", "_rev": "2-f243d0433a58d2666d8ed47377246c7a", "type": "region", "code": "652929", "name": "柯坪县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "e3de15ea-3f25-4760-a014-536013a92bc5"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "柯坪县"], "status": "active", "sort": 1382, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "e4424aba-8224-4fc2-a362-397dc3fee6ef", "_rev": "2-92366f7093a9ac84a628dc7cf5cf21c7", "type": "region", "code": "621224", "name": "康县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "e4424aba-8224-4fc2-a362-397dc3fee6ef"], "path_name": ["中国", "甘肃省", "陇南市", "康县"], "status": "active", "sort": 1380, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "e55c565c-5e1d-4e1a-8b4c-108e866696a7", "_rev": "2-1915485bce016c18ce995c24b51172ea", "type": "region", "code": "210123", "name": "康平县", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "e55c565c-5e1d-4e1a-8b4c-108e866696a7"], "path_name": ["中国", "辽宁省", "沈阳市", "康平县"], "status": "active", "sort": 1379, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "e617e0db-8ceb-49ea-9176-a66fab78443f", "_rev": "2-0b3050257da0bf1adb883272ec685978", "type": "region", "code": "522601", "name": "凯里市", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "e617e0db-8ceb-49ea-9176-a66fab78443f"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "凯里市"], "status": "active", "sort": 1374, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "ec8f7900-aa21-42e5-8d65-3c8ddfbeb31a", "_rev": "2-de9cca0d5ebc450992c1b31544040ae7", "type": "region", "code": "330802", "name": "柯城区", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "ec8f7900-aa21-42e5-8d65-3c8ddfbeb31a"], "path_name": ["中国", "浙江省", "衢州市", "柯城区"], "status": "active", "sort": 1381, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:32"} +{"_id": "141b9fba-34ea-4b3d-865c-33d5f865917c", "_rev": "2-9e6efeec241b03d48771b7caccfa55c2", "type": "region", "code": "620802", "name": "崆峒区", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "141b9fba-34ea-4b3d-865c-33d5f865917c"], "path_name": ["中国", "甘肃省", "平凉市", "崆峒区"], "status": "active", "sort": 1397, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "396e7c1e-f1dd-4c93-8211-a5519f340756", "_rev": "2-b6d5de6997486d7feabb4969b4516fcf", "type": "region", "code": "150425", "name": "克什克腾旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "396e7c1e-f1dd-4c93-8211-a5519f340756"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "克什克腾旗"], "status": "active", "sort": 1395, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "3a35308f-c514-44bc-a4a7-906979738ab7", "_rev": "2-37da66c1b8b888bb0485b2215ced12f4", "type": "region", "code": "150522", "name": "科尔沁左翼后旗", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "3a35308f-c514-44bc-a4a7-906979738ab7"], "path_name": ["中国", "内蒙古自治区", "通辽市", "科尔沁左翼后旗"], "status": "active", "sort": 1388, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "57ee856c-f54d-42b4-ae58-4ddfa0af97ad", "_rev": "2-d82d057add2c21760e8dae952d3de78c", "type": "region", "code": "140929", "name": "岢岚县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "57ee856c-f54d-42b4-ae58-4ddfa0af97ad"], "path_name": ["中国", "山西省", "忻州市", "岢岚县"], "status": "active", "sort": 1391, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "852a21fd-7452-47ad-b277-96c0a19d69c3", "_rev": "2-d776485cd975218bfc92e0d91aa35886", "type": "region", "code": "230230", "name": "克东县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "852a21fd-7452-47ad-b277-96c0a19d69c3"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "克东县"], "status": "active", "sort": 1392, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "e0682b85-6ccd-419b-aa24-3fc8f147c8b9", "_rev": "2-79a55835ff26813e6e6bd43765332dcd", "type": "region", "code": "150521", "name": "科尔沁左翼中旗", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "e0682b85-6ccd-419b-aa24-3fc8f147c8b9"], "path_name": ["中国", "内蒙古自治区", "通辽市", "科尔沁左翼中旗"], "status": "active", "sort": 1389, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "e36715d5-4421-4084-81bb-63c61a5a58cf", "_rev": "2-aa81963a56d8893a3e8d3226148d4d3f", "type": "region", "code": "230229", "name": "克山县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "e36715d5-4421-4084-81bb-63c61a5a58cf"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "克山县"], "status": "active", "sort": 1394, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "ed97edac-4c24-4dc5-8edf-acecc9ab0074", "_rev": "2-2786fc99c4a9242bfa5e933ac3588960", "type": "region", "code": "152221", "name": "科尔沁右翼前旗", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "ed97edac-4c24-4dc5-8edf-acecc9ab0074"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "科尔沁右翼前旗"], "status": "active", "sort": 1386, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "f1110aa7-22c3-4b43-9dfe-541b83a615d4", "_rev": "2-da142f8c30afa914c22ef235962c289b", "type": "region", "code": "370505", "name": "垦利区", "parent_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "f1110aa7-22c3-4b43-9dfe-541b83a615d4"], "path_name": ["中国", "山东省", "东营市", "垦利区"], "status": "active", "sort": 1396, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "f888021e-dcc9-47f7-a58a-fe338539a707", "_rev": "2-27c4913f7c26f16596fc1adc88ff9811", "type": "region", "code": "659008", "name": "可克达拉市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f888021e-dcc9-47f7-a58a-fe338539a707"], "path_name": ["中国", "新疆维吾尔自治区", "可克达拉市"], "status": "active", "sort": 1390, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "fce39eaf-843f-417b-888f-4d84169080da", "_rev": "2-d0afd7bbe02d9f7428cf7546650e98f3", "type": "region", "code": "650203", "name": "克拉玛依区", "parent_id": "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "fce39eaf-843f-417b-888f-4d84169080da"], "path_name": ["中国", "新疆维吾尔自治区", "克拉玛依市", "克拉玛依区"], "status": "active", "sort": 1393, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "ff8dced4-5904-4064-97b4-8d8c729dacee", "_rev": "2-281d21a71463f35332b081164c19e38b", "type": "region", "code": "152222", "name": "科尔沁右翼中旗", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "ff8dced4-5904-4064-97b4-8d8c729dacee"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "科尔沁右翼中旗"], "status": "active", "sort": 1387, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:33"} +{"_id": "04886f13-eba6-4cbd-ad2d-302596ccbf08", "_rev": "2-c980744fd108f858cc99a708a087a945", "type": "region", "code": "150203", "name": "昆都仑区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "04886f13-eba6-4cbd-ad2d-302596ccbf08"], "path_name": ["中国", "内蒙古自治区", "包头市", "昆都仑区"], "status": "active", "sort": 1408, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "2ac0bd01-917f-4ac4-b10a-17efd6f3c4fc", "_rev": "2-2cee008983636fe71d7108ea52c7cf5a", "type": "region", "code": "652801", "name": "库尔勒市", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "2ac0bd01-917f-4ac4-b10a-17efd6f3c4fc"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "库尔勒市"], "status": "active", "sort": 1399, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "39a67b6e-c21f-4ce2-a9b9-eb34d313dbd4", "_rev": "2-c9526c804a092ff15a928affc631bcaa", "type": "region", "code": "150524", "name": "库伦旗", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "39a67b6e-c21f-4ce2-a9b9-eb34d313dbd4"], "path_name": ["中国", "内蒙古自治区", "通辽市", "库伦旗"], "status": "active", "sort": 1400, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "42233e68-de1f-4b03-a458-4a10f53d13ed", "_rev": "2-f0a594bd837544cfb5f4e2ef4375d47e", "type": "region", "code": "654003", "name": "奎屯市", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "42233e68-de1f-4b03-a458-4a10f53d13ed"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "奎屯市"], "status": "active", "sort": 1406, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "63dd3bfd-2c17-4fb5-b0e7-ce731a669689", "_rev": "2-ac73ccf58d475fc4465ba06b1bd1249a", "type": "region", "code": "370705", "name": "奎文区", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "63dd3bfd-2c17-4fb5-b0e7-ce731a669689"], "path_name": ["中国", "山东省", "潍坊市", "奎文区"], "status": "active", "sort": 1407, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "8a038780-0b87-4134-b018-11b4c08e88b2", "_rev": "2-3d9c1879122d68d11ad202e0d405f4ae", "type": "region", "code": "652902", "name": "库车市", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "8a038780-0b87-4134-b018-11b4c08e88b2"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "库车市"], "status": "active", "sort": 1398, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "_rev": "2-6f72bc422050cfa21fdd8b8bade8821b", "type": "region", "code": "140300", "name": "阳泉市", "parent_id": "357c52c5-5c03-48c3-bac1-413d21c0c677", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7"], "path_name": ["中国", "山西省", "阳泉市"], "status": "active", "sort": 1404, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "94cdd74c-1aa8-45f1-ba19-60beb002bf2f", "_rev": "2-16a0175248f80b08d41e3c3649a7f953", "type": "region", "code": "210624", "name": "宽甸满族自治县", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "94cdd74c-1aa8-45f1-ba19-60beb002bf2f"], "path_name": ["中国", "辽宁省", "丹东市", "宽甸满族自治县"], "status": "active", "sort": 1403, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "ba5e87de-5cb1-4652-a8b1-9f81cfa6ddcb", "_rev": "2-fed9b550e5a011e145f1f1964463de12", "type": "region", "code": "130827", "name": "宽城满族自治县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "ba5e87de-5cb1-4652-a8b1-9f81cfa6ddcb"], "path_name": ["中国", "河北省", "承德市", "宽城满族自治县"], "status": "active", "sort": 1401, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "cf1b9051-adf4-4c2b-879c-e3ce42c308eb", "_rev": "2-0e2cfd03aff55d06dfabacb22e2c4c0e", "type": "region", "code": "320583", "name": "昆山市", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "cf1b9051-adf4-4c2b-879c-e3ce42c308eb"], "path_name": ["中国", "江苏省", "苏州市", "昆山市"], "status": "active", "sort": 1409, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "e4dac5eb-3a9a-46a5-b427-3aea4a8dffc7", "_rev": "2-072f7403982ff142d2dd425675698027", "type": "region", "code": "220103", "name": "宽城区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "e4dac5eb-3a9a-46a5-b427-3aea4a8dffc7"], "path_name": ["中国", "吉林省", "长春市", "宽城区"], "status": "active", "sort": 1402, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "e7ad821e-0b76-4d37-bdb4-71db8a345f21", "_rev": "2-45aaadc15726094f1787d7a865f9a3b9", "type": "region", "code": "140303", "name": "矿区", "parent_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "e7ad821e-0b76-4d37-bdb4-71db8a345f21"], "path_name": ["中国", "山西省", "阳泉市", "矿区"], "status": "active", "sort": 1405, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:34"} +{"_id": "08e4818e-3042-4bf7-868a-c002fd9709a7", "_rev": "2-675fcebce863c8aeaa0d69433273fc2d", "type": "region", "code": "422827", "name": "来凤县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "08e4818e-3042-4bf7-868a-c002fd9709a7"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "来凤县"], "status": "active", "sort": 1412, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "0da3e2b3-4566-4cb7-88ea-9d9639e282e1", "_rev": "2-cf9a3222118da41d020211170796bbdc", "type": "region", "code": "370613", "name": "莱山区", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "0da3e2b3-4566-4cb7-88ea-9d9639e282e1"], "path_name": ["中国", "山东省", "烟台市", "莱山区"], "status": "active", "sort": 1413, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "1651bbd8-7799-4ee9-9645-bbfcbda78f62", "_rev": "2-0516b9d45c512eb51f8e3d719d226cb9", "type": "region", "code": "370285", "name": "莱西市", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "1651bbd8-7799-4ee9-9645-bbfcbda78f62"], "path_name": ["中国", "山东省", "青岛市", "莱西市"], "status": "active", "sort": 1415, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "31462228-8c86-4a8c-a520-ea116e557486", "_rev": "2-f27d7de19ff1369d22fe84c7222984f5", "type": "region", "code": "370682", "name": "莱阳市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "31462228-8c86-4a8c-a520-ea116e557486"], "path_name": ["中国", "山东省", "烟台市", "莱阳市"], "status": "active", "sort": 1416, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "431ecef1-d9cc-4f7f-a492-6f464d54e4a6", "_rev": "2-bf427a6e022be72ec6c0fdbae2c75c01", "type": "region", "code": "370683", "name": "莱州市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "431ecef1-d9cc-4f7f-a492-6f464d54e4a6"], "path_name": ["中国", "山东省", "烟台市", "莱州市"], "status": "active", "sort": 1417, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "47f59ef2-9ce1-4821-9116-3d557151b49c", "_rev": "2-ba6c0704398621e2241c53292c8c062a", "type": "region", "code": "410225", "name": "兰考县", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "47f59ef2-9ce1-4821-9116-3d557151b49c"], "path_name": ["中国", "河南省", "开封市", "兰考县"], "status": "active", "sort": 1421, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "4a7a193a-16be-446c-8343-63c8bd2549bd", "_rev": "2-d93dd3709223cc0c76c40d522d562831", "type": "region", "code": "341122", "name": "来安县", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "4a7a193a-16be-446c-8343-63c8bd2549bd"], "path_name": ["中国", "安徽省", "滁州市", "来安县"], "status": "active", "sort": 1411, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "_rev": "2-0625f58aa5ffa1afbb00e14cbeabd7bb", "type": "region", "code": "410200", "name": "开封市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5"], "path_name": ["中国", "河南省", "开封市"], "status": "active", "sort": 1420, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "76561552-8925-4055-95cf-19e41bcd521a", "_rev": "2-b43a992925582b8d511baeb10af97f17", "type": "region", "code": "130630", "name": "涞源县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "76561552-8925-4055-95cf-19e41bcd521a"], "path_name": ["中国", "河北省", "保定市", "涞源县"], "status": "active", "sort": 1419, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "8ca67037-2abb-43f8-bf9f-773d9db71cdc", "_rev": "2-fce8cb60a32cb7362b9c2fdf3119c195", "type": "region", "code": "370116", "name": "莱芜区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "8ca67037-2abb-43f8-bf9f-773d9db71cdc"], "path_name": ["中国", "山东省", "济南市", "莱芜区"], "status": "active", "sort": 1414, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "ab9a88a7-f866-411e-b0f6-23b0e0552f49", "_rev": "2-e62f9abc430acb86accd3b6ab93bff9c", "type": "region", "code": "130623", "name": "涞水县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "ab9a88a7-f866-411e-b0f6-23b0e0552f49"], "path_name": ["中国", "河北省", "保定市", "涞水县"], "status": "active", "sort": 1418, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "d6a4e146-c39b-4d43-a697-e4942a5299d1", "_rev": "2-513fdf27a35445ebc8b97ef282a1be27", "type": "region", "code": "371324", "name": "兰陵县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "d6a4e146-c39b-4d43-a697-e4942a5299d1"], "path_name": ["中国", "山东省", "临沂市", "兰陵县"], "status": "active", "sort": 1422, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "f02fd92b-5dcb-4490-87c4-9f8f261ded9d", "_rev": "2-7138dd6a0ef324c3ea8c0609a3444cd1", "type": "region", "code": "540225", "name": "拉孜县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "f02fd92b-5dcb-4490-87c4-9f8f261ded9d"], "path_name": ["中国", "西藏自治区", "日喀则市", "拉孜县"], "status": "active", "sort": 1410, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:35"} +{"_id": "3dcda274-e226-44f5-8924-29d2a6f6c3c2", "_rev": "2-b3e46757f496254c189ae953f02b7d1b", "type": "region", "code": "533325", "name": "兰坪白族普米族自治县", "parent_id": "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "3dcda274-e226-44f5-8924-29d2a6f6c3c2"], "path_name": ["中国", "云南省", "怒江傈僳族自治州", "兰坪白族普米族自治县"], "status": "active", "sort": 1423, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "46bbec75-7fd0-424b-a0fe-cb9ecd6f7c0e", "_rev": "2-202021bac84b972fa462586e94d8e02d", "type": "region", "code": "141127", "name": "岚县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "46bbec75-7fd0-424b-a0fe-cb9ecd6f7c0e"], "path_name": ["中国", "山西省", "吕梁市", "岚县"], "status": "active", "sort": 1429, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "496a3e75-3d62-4da7-a204-2d26128daf66", "_rev": "2-93df08134a358a061c92c01cdda5e642", "type": "region", "code": "231222", "name": "兰西县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "496a3e75-3d62-4da7-a204-2d26128daf66"], "path_name": ["中国", "黑龙江省", "绥化市", "兰西县"], "status": "active", "sort": 1425, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "4b1b03e6-f818-46da-a623-b1dbb4389c58", "_rev": "2-b6664b34fab32777e11024338b4256de", "type": "region", "code": "511381", "name": "阆中市", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "4b1b03e6-f818-46da-a623-b1dbb4389c58"], "path_name": ["中国", "四川省", "南充市", "阆中市"], "status": "active", "sort": 1434, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "4d964fe3-3589-4aaf-8f14-e0c8537deded", "_rev": "2-97e038e25d8e03059e139d0e2b66f56e", "type": "region", "code": "341821", "name": "郎溪县", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "4d964fe3-3589-4aaf-8f14-e0c8537deded"], "path_name": ["中国", "安徽省", "宣城市", "郎溪县"], "status": "active", "sort": 1433, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "65410218-1b72-49fd-8ff3-5c4e02b36afd", "_rev": "2-90a06825e454bb9d5fe1c805b450dd14", "type": "region", "code": "610925", "name": "岚皋县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "65410218-1b72-49fd-8ff3-5c4e02b36afd"], "path_name": ["中国", "陕西省", "安康市", "岚皋县"], "status": "active", "sort": 1427, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "7441848f-c891-43d5-9090-0e3cd709d7f1", "_rev": "2-75dcf078c01af647d8069dcfce0a9143", "type": "region", "code": "431127", "name": "蓝山县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "7441848f-c891-43d5-9090-0e3cd709d7f1"], "path_name": ["中国", "湖南省", "永州市", "蓝山县"], "status": "active", "sort": 1430, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "7616b66f-4c27-4bcc-9d64-e1a86c3f02ad", "_rev": "2-b5b0e9ba97758c8a84fea12d1331ea97", "type": "region", "code": "371302", "name": "兰山区", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "7616b66f-4c27-4bcc-9d64-e1a86c3f02ad"], "path_name": ["中国", "山东省", "临沂市", "兰山区"], "status": "active", "sort": 1424, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "78e4419a-9c2d-4a63-a3e0-448a14423023", "_rev": "2-16d2730530ab74c6bf6a17a084b3fc3a", "type": "region", "code": "371103", "name": "岚山区", "parent_id": "da26105e-dedf-4275-9619-5d4354c2cc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "da26105e-dedf-4275-9619-5d4354c2cc42", "78e4419a-9c2d-4a63-a3e0-448a14423023"], "path_name": ["中国", "山东省", "日照市", "岚山区"], "status": "active", "sort": 1428, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "b706ab7d-8b44-4c0b-a046-3861972ec342", "_rev": "2-efb24aafede06ea8170956be34cbbb0f", "type": "region", "code": "330781", "name": "兰溪市", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "b706ab7d-8b44-4c0b-a046-3861972ec342"], "path_name": ["中国", "浙江省", "金华市", "兰溪市"], "status": "active", "sort": 1426, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "e29f3a27-68ef-42b8-91b5-379e5e0dc2f5", "_rev": "2-7f11c359bf2efd6d1fa101fa449cc04f", "type": "region", "code": "610122", "name": "蓝田县", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "e29f3a27-68ef-42b8-91b5-379e5e0dc2f5"], "path_name": ["中国", "陕西省", "西安市", "蓝田县"], "status": "active", "sort": 1431, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "ea1b03e6-a5e8-437c-a157-478b919fbe94", "_rev": "2-d1078dbf86ba9e0fa325455a01ce8e53", "type": "region", "code": "530828", "name": "澜沧拉祜族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "ea1b03e6-a5e8-437c-a157-478b919fbe94"], "path_name": ["中国", "云南省", "普洱市", "澜沧拉祜族自治县"], "status": "active", "sort": 1432, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:36"} +{"_id": "1473d38c-adcc-4353-975d-a7ed865150ea", "_rev": "2-28d5320466d7efc119d3073444b4d8be", "type": "region", "code": "540426", "name": "朗县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "1473d38c-adcc-4353-975d-a7ed865150ea"], "path_name": ["中国", "西藏自治区", "林芝市", "朗县"], "status": "active", "sort": 1436, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "495a4096-e778-4d23-96d4-64811d524c22", "_rev": "2-e23343f768160cc05a1c233ab6363e85", "type": "region", "code": "370212", "name": "崂山区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "495a4096-e778-4d23-96d4-64811d524c22"], "path_name": ["中国", "山东省", "青岛市", "崂山区"], "status": "active", "sort": 1438, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "63e21a56-12f6-480a-8eef-5cee9867da79", "_rev": "2-7fc168332da487204f875dbd221d6236", "type": "region", "code": "540531", "name": "浪卡子县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "63e21a56-12f6-480a-8eef-5cee9867da79"], "path_name": ["中国", "西藏自治区", "山南市", "浪卡子县"], "status": "active", "sort": 1437, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "76e17d32-a7e3-44e6-ad0c-e8cbf331e7af", "_rev": "2-ca7205701bc825573684efe45a1cc3c2", "type": "region", "code": "420682", "name": "老河口市", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "76e17d32-a7e3-44e6-ad0c-e8cbf331e7af"], "path_name": ["中国", "湖北省", "襄阳市", "老河口市"], "status": "active", "sort": 1441, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "9b1d3f2b-75ae-4cf3-888f-89410d624c27", "_rev": "2-8d14d7decd0787b98c793773b9f7d968", "type": "region", "code": "210811", "name": "老边区", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "9b1d3f2b-75ae-4cf3-888f-89410d624c27"], "path_name": ["中国", "辽宁省", "营口市", "老边区"], "status": "active", "sort": 1439, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "_rev": "2-4c4318d1fe629b6ea741b9a2beb4df99", "type": "region", "code": "440200", "name": "韶关市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8"], "path_name": ["中国", "广东省", "韶关市"], "status": "active", "sort": 1443, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "ba82233c-bfa8-407b-b241-4ce8c1f873dd", "_rev": "2-4830b7fad05e0649719450e6e62d7db3", "type": "region", "code": "410302", "name": "老城区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "ba82233c-bfa8-407b-b241-4ce8c1f873dd"], "path_name": ["中国", "河南省", "洛阳市", "老城区"], "status": "active", "sort": 1440, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "ce230138-fb74-4274-9e94-f3cf3331887b", "_rev": "2-ee2b4a10383be5f545480d6163469135", "type": "region", "code": "361025", "name": "乐安县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "ce230138-fb74-4274-9e94-f3cf3331887b"], "path_name": ["中国", "江西省", "抚州市", "乐安县"], "status": "active", "sort": 1442, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "d059e2f9-861f-4c0d-a64e-f0d569d773ab", "_rev": "2-2097fff409c34938d265887861989bc2", "type": "region", "code": "469027", "name": "乐东黎族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "d059e2f9-861f-4c0d-a64e-f0d569d773ab"], "path_name": ["中国", "海南省", "乐东黎族自治县"], "status": "active", "sort": 1445, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "d593851f-7815-46fd-93de-b416092efc6c", "_rev": "2-51217fb573d0c9250f0608b3febb25dc", "type": "region", "code": "440281", "name": "乐昌市", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "d593851f-7815-46fd-93de-b416092efc6c"], "path_name": ["中国", "广东省", "韶关市", "乐昌市"], "status": "active", "sort": 1444, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "f9ba0706-ad23-4555-a45c-d6b662c5020d", "_rev": "2-5539525bc0cdc8e69ec61b3bbb7cf0cd", "type": "region", "code": "341102", "name": "琅琊区", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "f9ba0706-ad23-4555-a45c-d6b662c5020d"], "path_name": ["中国", "安徽省", "滁州市", "琅琊区"], "status": "active", "sort": 1435, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:37"} +{"_id": "0d19c60b-5131-419f-9f87-7b116e67c17a", "_rev": "2-970f1862527d457fa62d910a1263aafc", "type": "region", "code": "360281", "name": "乐平市", "parent_id": "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "0d19c60b-5131-419f-9f87-7b116e67c17a"], "path_name": ["中国", "江西省", "景德镇市", "乐平市"], "status": "active", "sort": 1448, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "151bce32-a716-4fb4-a934-6543e2f9c7ba", "_rev": "2-866f72f2228d0a64e79a61ed6ce1be0a", "type": "region", "code": "440882", "name": "雷州市", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "151bce32-a716-4fb4-a934-6543e2f9c7ba"], "path_name": ["中国", "广东省", "湛江市", "雷州市"], "status": "active", "sort": 1455, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "64bfe666-9870-4305-bf8b-27b26b32c3e3", "_rev": "2-4529cbb0fd6857ea0048243c460acd7d", "type": "region", "code": "522634", "name": "雷山县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "64bfe666-9870-4305-bf8b-27b26b32c3e3"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "雷山县"], "status": "active", "sort": 1454, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "6b8d6c73-8981-4212-a945-1ab604301fd3", "_rev": "2-ca641e4269acd4be20a15132c859af1b", "type": "region", "code": "513437", "name": "雷波县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "6b8d6c73-8981-4212-a945-1ab604301fd3"], "path_name": ["中国", "四川省", "凉山彝族自治州", "雷波县"], "status": "active", "sort": 1453, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "8297526b-2be9-464b-957f-fcef4b1104c2", "_rev": "2-862b9ab531d7d8c1cf341f7f13f359d2", "type": "region", "code": "371481", "name": "乐陵市", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "8297526b-2be9-464b-957f-fcef4b1104c2"], "path_name": ["中国", "山东省", "德州市", "乐陵市"], "status": "active", "sort": 1447, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "84277e4a-4b47-43c9-b8aa-eaa1c8f9f1e9", "_rev": "2-33923f1f439cfe603aebd68e79344d31", "type": "region", "code": "630202", "name": "乐都区", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "84277e4a-4b47-43c9-b8aa-eaa1c8f9f1e9"], "path_name": ["中国", "青海省", "海东市", "乐都区"], "status": "active", "sort": 1446, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "8e7819dc-4074-4baa-b5e9-e4b06028f0fb", "_rev": "2-42bd667582e42d76d3aef422bf6941da", "type": "region", "code": "512022", "name": "乐至县", "parent_id": "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "8e7819dc-4074-4baa-b5e9-e4b06028f0fb"], "path_name": ["中国", "四川省", "资阳市", "乐至县"], "status": "active", "sort": 1452, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "a156681c-6508-4ea5-b9ee-77c7fd95a4db", "_rev": "2-1bc0098acc19bbe3ff0efd679a4b0308", "type": "region", "code": "451028", "name": "乐业县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "a156681c-6508-4ea5-b9ee-77c7fd95a4db"], "path_name": ["中国", "广西壮族自治区", "百色市", "乐业县"], "status": "active", "sort": 1451, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "b89f730b-53eb-45bf-83a7-e22e3ff08970", "_rev": "2-3da719303f5c39756269bfdb24b9485e", "type": "region", "code": "130225", "name": "乐亭县", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "b89f730b-53eb-45bf-83a7-e22e3ff08970"], "path_name": ["中国", "河北省", "唐山市", "乐亭县"], "status": "active", "sort": 1450, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "fdcea120-51b9-45aa-98d7-8cbec74b6296", "_rev": "2-bf24ced0251a74b807fb0127aa3a58c3", "type": "region", "code": "330382", "name": "乐清市", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "fdcea120-51b9-45aa-98d7-8cbec74b6296"], "path_name": ["中国", "浙江省", "温州市", "乐清市"], "status": "active", "sort": 1449, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:38"} +{"_id": "153daab2-0263-4729-8c9a-8d5aaecfa4a0", "_rev": "2-2227f9ca1c41de883183fead67a852ac", "type": "region", "code": "540323", "name": "类乌齐县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "153daab2-0263-4729-8c9a-8d5aaecfa4a0"], "path_name": ["中国", "西藏自治区", "昌都市", "类乌齐县"], "status": "active", "sort": 1457, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "1a7716a1-1265-406e-80c1-db3abbd87c40", "_rev": "2-0aab0c41678df56bdd2f3b7127123510", "type": "region", "code": "430481", "name": "耒阳市", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "1a7716a1-1265-406e-80c1-db3abbd87c40"], "path_name": ["中国", "湖南省", "衡阳市", "耒阳市"], "status": "active", "sort": 1456, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "2fa52ecc-948e-40d1-ba80-7446ed0c8ead", "_rev": "2-08a3d1d9e606ac2ee829e9075c71264d", "type": "region", "code": "361022", "name": "黎川县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "2fa52ecc-948e-40d1-ba80-7446ed0c8ead"], "path_name": ["中国", "江西省", "抚州市", "黎川县"], "status": "active", "sort": 1466, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "3cdc213b-4488-4083-8c1d-21d723d02d3e", "_rev": "2-50e6b5c88b2b740c50875a74babc5c76", "type": "region", "code": "141102", "name": "离石区", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "3cdc213b-4488-4083-8c1d-21d723d02d3e"], "path_name": ["中国", "山西省", "吕梁市", "离石区"], "status": "active", "sort": 1461, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "4073bd33-f848-44b3-b4f8-8729cdf7677d", "_rev": "2-d0e8fe410cb0553ee228c5e25162ecaa", "type": "region", "code": "220322", "name": "梨树县", "parent_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50", "4073bd33-f848-44b3-b4f8-8729cdf7677d"], "path_name": ["中国", "吉林省", "四平市", "梨树县"], "status": "active", "sort": 1464, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "_rev": "2-944b4132a8f0b2faa6f387446ef2abb8", "type": "region", "code": "220300", "name": "四平市", "parent_id": "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50"], "path_name": ["中国", "吉林省", "四平市"], "status": "active", "sort": 1463, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "578d4823-cc21-422b-a4d4-5af194634e7d", "_rev": "2-172003ecb3770941f0c175e9b42f7a83", "type": "region", "code": "431103", "name": "冷水滩区", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "578d4823-cc21-422b-a4d4-5af194634e7d"], "path_name": ["中国", "湖南省", "永州市", "冷水滩区"], "status": "active", "sort": 1460, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "_rev": "2-b95aaded07164940ab1cbcfd0552ad23", "type": "region", "code": "431300", "name": "娄底市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1"], "path_name": ["中国", "湖南省", "娄底市"], "status": "active", "sort": 1458, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "7153e1da-e775-42f9-a8d7-35f69e8004eb", "_rev": "2-78e587631c523cbd5e0382b430c26d81", "type": "region", "code": "140426", "name": "黎城县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "7153e1da-e775-42f9-a8d7-35f69e8004eb"], "path_name": ["中国", "山西省", "长治市", "黎城县"], "status": "active", "sort": 1465, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "812d040c-b6aa-48ab-903b-c53bd788d9cc", "_rev": "2-98bf4a694fa57d29137e8fbbfcb70edc", "type": "region", "code": "230305", "name": "梨树区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "812d040c-b6aa-48ab-903b-c53bd788d9cc"], "path_name": ["中国", "黑龙江省", "鸡西市", "梨树区"], "status": "active", "sort": 1462, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "9fcebb18-2bcf-4e6e-a0fd-164fd4a384b9", "_rev": "2-250615fba9b2cbd38e4bf75c9860f449", "type": "region", "code": "431381", "name": "冷水江市", "parent_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "9fcebb18-2bcf-4e6e-a0fd-164fd4a384b9"], "path_name": ["中国", "湖南省", "娄底市", "冷水江市"], "status": "active", "sort": 1459, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:39"} +{"_id": "11109263-bb3f-4e03-bc3e-74288f261d68", "_rev": "2-66511ae8363484266d5328a7b8b7d778", "type": "region", "code": "513334", "name": "理塘县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "11109263-bb3f-4e03-bc3e-74288f261d68"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "理塘县"], "status": "active", "sort": 1472, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "1d26b818-3bfc-4c24-b218-151ea62e813f", "_rev": "2-3ed43a9a3e44e69929d0fa57736f7ef3", "type": "region", "code": "513222", "name": "理县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "1d26b818-3bfc-4c24-b218-151ea62e813f"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "理县"], "status": "active", "sort": 1473, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "3edf3c5b-ad41-47d8-b2c9-de9c9bb1784e", "_rev": "2-9ff117195f0db203cee64569fc6ea570", "type": "region", "code": "370213", "name": "李沧区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "3edf3c5b-ad41-47d8-b2c9-de9c9bb1784e"], "path_name": ["中国", "山东省", "青岛市", "李沧区"], "status": "active", "sort": 1471, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "55ed9ddc-94d4-41bc-b1b2-52edbf713354", "_rev": "2-6b2b051bb3a3917d13c65ab43418071c", "type": "region", "code": "610425", "name": "礼泉县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "55ed9ddc-94d4-41bc-b1b2-52edbf713354"], "path_name": ["中国", "陕西省", "咸阳市", "礼泉县"], "status": "active", "sort": 1469, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "59fc5f54-5388-4257-9b5b-06d70f2c9973", "_rev": "2-25d47c2adacbae1642fdc04e86848e4a", "type": "region", "code": "130635", "name": "蠡县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "59fc5f54-5388-4257-9b5b-06d70f2c9973"], "path_name": ["中国", "河北省", "保定市", "蠡县"], "status": "active", "sort": 1468, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "62b1da71-8cf0-40be-ac73-a1f17fb5f89c", "_rev": "2-f3f9d2826313d2f4ba6f938d911aa55c", "type": "region", "code": "370102", "name": "历下区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "62b1da71-8cf0-40be-ac73-a1f17fb5f89c"], "path_name": ["中国", "山东省", "济南市", "历下区"], "status": "active", "sort": 1478, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "76c88c55-0f09-40fa-b07c-4178715f39ba", "_rev": "2-acbdc3ca463a4468a3292d594dfc6a8d", "type": "region", "code": "621226", "name": "礼县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "76c88c55-0f09-40fa-b07c-4178715f39ba"], "path_name": ["中国", "甘肃省", "陇南市", "礼县"], "status": "active", "sort": 1470, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "8cb68f52-6f36-4db0-bd6c-27d8a8986f77", "_rev": "2-a764a167f225b4ef450a5ac453525042", "type": "region", "code": "370112", "name": "历城区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "8cb68f52-6f36-4db0-bd6c-27d8a8986f77"], "path_name": ["中国", "山东省", "济南市", "历城区"], "status": "active", "sort": 1477, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "c111ce08-8865-4ad9-b924-4c39ba0e284d", "_rev": "2-ebdce6d7716cd57b4e62e6f241f4bb3a", "type": "region", "code": "350502", "name": "鲤城区", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "c111ce08-8865-4ad9-b924-4c39ba0e284d"], "path_name": ["中国", "福建省", "泉州市", "鲤城区"], "status": "active", "sort": 1474, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "c74397da-04df-4750-a0a1-87408b8e6244", "_rev": "2-5449c5dcadf8903815a2186d13910021", "type": "region", "code": "522631", "name": "黎平县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "c74397da-04df-4750-a0a1-87408b8e6244"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "黎平县"], "status": "active", "sort": 1467, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "d587c2c2-d3ab-48ba-bc0a-8cb77f55817a", "_rev": "2-34cab0dcdb4adc68a227efbbd8e5c0b8", "type": "region", "code": "430281", "name": "醴陵市", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "d587c2c2-d3ab-48ba-bc0a-8cb77f55817a"], "path_name": ["中国", "湖南省", "株洲市", "醴陵市"], "status": "active", "sort": 1476, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "efeb5302-b47b-4e93-a451-a17fe8c8df23", "_rev": "2-f591fa0727b4e0c04b5f2ab978cc63d2", "type": "region", "code": "430723", "name": "澧县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "efeb5302-b47b-4e93-a451-a17fe8c8df23"], "path_name": ["中国", "湖南省", "常德市", "澧县"], "status": "active", "sort": 1475, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:40"} +{"_id": "0fade457-1beb-4d1d-81d3-5193429352dd", "_rev": "2-0745fd14d5c99e44097a71abf9267d12", "type": "region", "code": "510802", "name": "利州区", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "0fade457-1beb-4d1d-81d3-5193429352dd"], "path_name": ["中国", "四川省", "广元市", "利州区"], "status": "active", "sort": 1485, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "0fd985ca-4dda-4dda-84ca-b2d6112f266c", "_rev": "2-2d45afe11ee2e8982d09a69d3991866f", "type": "region", "code": "370522", "name": "利津县", "parent_id": "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "966f3524-6950-43b2-b2f9-f0f5ce8e45dd", "0fd985ca-4dda-4dda-84ca-b2d6112f266c"], "path_name": ["中国", "山东省", "东营市", "利津县"], "status": "active", "sort": 1481, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "266a0cf3-8263-45c9-94d9-550371a888c4", "_rev": "2-5c1ba5acfb96356cc24fe407a56c2e32", "type": "region", "code": "320117", "name": "溧水区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "266a0cf3-8263-45c9-94d9-550371a888c4"], "path_name": ["中国", "江苏省", "南京市", "溧水区"], "status": "active", "sort": 1490, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "29ed9459-b899-4418-b902-efc6cdc02e02", "_rev": "2-f3cf15053dae58c18fa0f815757b743a", "type": "region", "code": "210304", "name": "立山区", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "29ed9459-b899-4418-b902-efc6cdc02e02"], "path_name": ["中国", "辽宁省", "鞍山市", "立山区"], "status": "active", "sort": 1479, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "2bacff71-b2fb-4e1c-baa6-e8c6c57e9ee1", "_rev": "2-c8b4305b3666d8cad61be59608838b24", "type": "region", "code": "440103", "name": "荔湾区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "2bacff71-b2fb-4e1c-baa6-e8c6c57e9ee1"], "path_name": ["中国", "广东省", "广州市", "荔湾区"], "status": "active", "sort": 1489, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "2eb2cb08-b3c3-48bf-8949-92237248b81c", "_rev": "2-fcab5f869c0ed9c94e723947ccefd22d", "type": "region", "code": "640302", "name": "利通区", "parent_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858", "2eb2cb08-b3c3-48bf-8949-92237248b81c"], "path_name": ["中国", "宁夏回族自治区", "吴忠市", "利通区"], "status": "active", "sort": 1482, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "32858a4f-58fe-4415-bbf3-22718a25b966", "_rev": "2-e3e582c77e98414bca7f4a8eb788d8ce", "type": "region", "code": "341600", "name": "亳州市", "parent_id": "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "32858a4f-58fe-4415-bbf3-22718a25b966"], "path_name": ["中国", "安徽省", "亳州市"], "status": "active", "sort": 1483, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "44b218c8-b36e-43d0-9428-997a382d1abc", "_rev": "2-10a1471c4f39cb83a45d5b9cabbda82a", "type": "region", "code": "522722", "name": "荔波县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "44b218c8-b36e-43d0-9428-997a382d1abc"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "荔波县"], "status": "active", "sort": 1486, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "54e44610-ffd3-4e00-aff9-653253298785", "_rev": "2-a1ab511961e25afe69939f305dd4aec4", "type": "region", "code": "450381", "name": "荔浦市", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "54e44610-ffd3-4e00-aff9-653253298785"], "path_name": ["中国", "广西壮族自治区", "桂林市", "荔浦市"], "status": "active", "sort": 1488, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "a93dc768-720b-45e4-b6ba-3a35e71f6c65", "_rev": "2-7378db4edc89af1b620663e227d5737d", "type": "region", "code": "422802", "name": "利川市", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "a93dc768-720b-45e4-b6ba-3a35e71f6c65"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "利川市"], "status": "active", "sort": 1480, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "aa1000d1-c93f-4de4-ada0-fd093a296031", "_rev": "2-f6d8ca741f5658daaf9dfe2e7fa06019", "type": "region", "code": "350304", "name": "荔城区", "parent_id": "60031958-e67a-4094-8ab0-04087026e22e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e", "aa1000d1-c93f-4de4-ada0-fd093a296031"], "path_name": ["中国", "福建省", "莆田市", "荔城区"], "status": "active", "sort": 1487, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "b85cefe7-69c3-490f-a7d3-2603877b1594", "_rev": "2-55e64f1f6d5d37e6204689b5cfb79d6e", "type": "region", "code": "341623", "name": "利辛县", "parent_id": "32858a4f-58fe-4415-bbf3-22718a25b966", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "32858a4f-58fe-4415-bbf3-22718a25b966", "b85cefe7-69c3-490f-a7d3-2603877b1594"], "path_name": ["中国", "安徽省", "亳州市", "利辛县"], "status": "active", "sort": 1484, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:41"} +{"_id": "1d7de8b5-9471-4f4e-be85-4bcfbd42aa8c", "_rev": "2-7801aec5da80d935c12e26d11eb26dc8", "type": "region", "code": "441623", "name": "连平县", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "1d7de8b5-9471-4f4e-be85-4bcfbd42aa8c"], "path_name": ["中国", "广东省", "河源市", "连平县"], "status": "active", "sort": 1496, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "3617f100-ce61-4764-a77c-ed6dd0f589f7", "_rev": "2-ad7ea4b32d6da53f588cce363ee4468e", "type": "region", "code": "441882", "name": "连州市", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "3617f100-ce61-4764-a77c-ed6dd0f589f7"], "path_name": ["中国", "广东省", "清远市", "连州市"], "status": "active", "sort": 1500, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "54de7cbc-6ad0-4dca-a6dc-e6ff90d1ebd1", "_rev": "2-5b552973a84d1f97ea06fb2e41952ca3", "type": "region", "code": "441825", "name": "连山壮族瑶族自治县", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "54de7cbc-6ad0-4dca-a6dc-e6ff90d1ebd1"], "path_name": ["中国", "广东省", "清远市", "连山壮族瑶族自治县"], "status": "active", "sort": 1498, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "71a64231-1b0f-42e8-ab3f-5c171e6bc54f", "_rev": "2-4b456f6eb58d1f70645a9b8afd1304b7", "type": "region", "code": "211402", "name": "连山区", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "71a64231-1b0f-42e8-ab3f-5c171e6bc54f"], "path_name": ["中国", "辽宁省", "葫芦岛市", "连山区"], "status": "active", "sort": 1497, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "b754584f-4586-441b-8b03-90441cb5b0e5", "_rev": "2-d43e6c41cf4183ea0fd5faeee08e7961", "type": "region", "code": "130606", "name": "莲池区", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "b754584f-4586-441b-8b03-90441cb5b0e5"], "path_name": ["中国", "河北省", "保定市", "莲池区"], "status": "active", "sort": 1501, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "bf5dd718-52db-441b-9f96-d7fd06945512", "_rev": "2-098b2c85d756c755c21517318b6fe504", "type": "region", "code": "320481", "name": "溧阳市", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "bf5dd718-52db-441b-9f96-d7fd06945512"], "path_name": ["中国", "江苏省", "常州市", "溧阳市"], "status": "active", "sort": 1491, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "c44b466e-0ee2-44f7-8458-613c59641733", "_rev": "2-5002df80fd455eb75d77debaf5026763", "type": "region", "code": "350122", "name": "连江县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "c44b466e-0ee2-44f7-8458-613c59641733"], "path_name": ["中国", "福建省", "福州市", "连江县"], "status": "active", "sort": 1494, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "_rev": "2-6f0c305268c74ec9ec5570537934e215", "type": "region", "code": "350800", "name": "龙岩市", "parent_id": "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe"], "path_name": ["中国", "福建省", "龙岩市"], "status": "active", "sort": 1492, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "d330db61-e1d5-4ebd-89e1-3101e97b5921", "_rev": "2-04374dba1f2d231d0cc29c0c236ea16a", "type": "region", "code": "320703", "name": "连云区", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "d330db61-e1d5-4ebd-89e1-3101e97b5921"], "path_name": ["中国", "江苏省", "连云港市", "连云区"], "status": "active", "sort": 1499, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "d35c3c73-3439-422f-914c-5a7eb671e05f", "_rev": "2-18435bf9611a33689435f14d3f987518", "type": "region", "code": "350825", "name": "连城县", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "d35c3c73-3439-422f-914c-5a7eb671e05f"], "path_name": ["中国", "福建省", "龙岩市", "连城县"], "status": "active", "sort": 1493, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "f08986bc-acd2-44a5-bbbc-988ed569ee9e", "_rev": "2-91e0722d8083c4d8c8627f7d27a8017b", "type": "region", "code": "441826", "name": "连南瑶族自治县", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "f08986bc-acd2-44a5-bbbc-988ed569ee9e"], "path_name": ["中国", "广东省", "清远市", "连南瑶族自治县"], "status": "active", "sort": 1495, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:42"} +{"_id": "28585b53-4354-43a1-9c50-2964aeccc910", "_rev": "2-fd49b35e768138930b5b4f278392ea1b", "type": "region", "code": "431382", "name": "涟源市", "parent_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "28585b53-4354-43a1-9c50-2964aeccc910"], "path_name": ["中国", "湖南省", "娄底市", "涟源市"], "status": "active", "sort": 1506, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "347bbb75-abea-4703-b4a8-ed90aca76d62", "_rev": "2-ff725ca876098c6b5ddc2e8eae0f84cb", "type": "region", "code": "360402", "name": "濂溪区", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "347bbb75-abea-4703-b4a8-ed90aca76d62"], "path_name": ["中国", "江西省", "九江市", "濂溪区"], "status": "active", "sort": 1508, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "51c489d8-c320-400d-b1b0-bc44b64f6f28", "_rev": "2-4aafe31fb982c2fe29a2991ba1d4e384", "type": "region", "code": "360321", "name": "莲花县", "parent_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "51c489d8-c320-400d-b1b0-bc44b64f6f28"], "path_name": ["中国", "江西省", "萍乡市", "莲花县"], "status": "active", "sort": 1504, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "7c7fd018-7437-4a0d-bd05-670393074d5c", "_rev": "2-5134f0f045cac0ca69f4db01aeffbd87", "type": "region", "code": "320826", "name": "涟水县", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "7c7fd018-7437-4a0d-bd05-670393074d5c"], "path_name": ["中国", "江苏省", "淮安市", "涟水县"], "status": "active", "sort": 1505, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "9445cabe-8df4-48e7-a7ae-a1b80e7c27e6", "_rev": "2-1311116312df9a1543718941cc86ada4", "type": "region", "code": "610104", "name": "莲湖区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "9445cabe-8df4-48e7-a7ae-a1b80e7c27e6"], "path_name": ["中国", "陕西省", "西安市", "莲湖区"], "status": "active", "sort": 1503, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "9504353f-7cc4-468a-9761-1828a7a529d1", "_rev": "2-1b959e91ef99702b4708859757657f5f", "type": "region", "code": "440881", "name": "廉江市", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "9504353f-7cc4-468a-9761-1828a7a529d1"], "path_name": ["中国", "广东省", "湛江市", "廉江市"], "status": "active", "sort": 1507, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "a603d148-9e8f-4c85-81ef-d06885348abd", "_rev": "2-2d6643dec33c58be81e05bbd806049c8", "type": "region", "code": "620602", "name": "凉州区", "parent_id": "8adb19ec-7d97-4233-8709-19769b980943", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8adb19ec-7d97-4233-8709-19769b980943", "a603d148-9e8f-4c85-81ef-d06885348abd"], "path_name": ["中国", "甘肃省", "武威市", "凉州区"], "status": "active", "sort": 1511, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "b3abd13b-245f-4dbc-b80a-ce35806dacad", "_rev": "2-8b76328a0d3887f7959966bdd437cbbf", "type": "region", "code": "150925", "name": "凉城县", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "b3abd13b-245f-4dbc-b80a-ce35806dacad"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "凉城县"], "status": "active", "sort": 1510, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "_rev": "2-03ccfea2ad2508f90e259302d8b7767d", "type": "region", "code": "533100", "name": "德宏傣族景颇族自治州", "parent_id": "b5409f81-46bd-44f5-a9e0-4887b3811a00", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州"], "status": "active", "sort": 1512, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "e1935c30-5795-4180-bfd6-76506057a052", "_rev": "2-4031cd906ac7910be8bcbcdd36fa63c9", "type": "region", "code": "331102", "name": "莲都区", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "e1935c30-5795-4180-bfd6-76506057a052"], "path_name": ["中国", "浙江省", "丽水市", "莲都区"], "status": "active", "sort": 1502, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "f8804e07-871e-4007-9755-4540b76470ac", "_rev": "2-5fdd1077af8b1106f879c2d256d5021e", "type": "region", "code": "450108", "name": "良庆区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "f8804e07-871e-4007-9755-4540b76470ac"], "path_name": ["中国", "广西壮族自治区", "南宁市", "良庆区"], "status": "active", "sort": 1509, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:43"} +{"_id": "05b8afae-25f1-4326-b384-1f8144f03623", "_rev": "2-db2f6ef83ab3da1abd36c2ba111e0b28", "type": "region", "code": "500155", "name": "梁平区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "05b8afae-25f1-4326-b384-1f8144f03623"], "path_name": ["中国", "重庆市", "梁平区"], "status": "active", "sort": 1514, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "267b2390-bd8a-4f32-9bf8-ca72c733fb29", "_rev": "2-0c0ec1b7b378cb2a43ecbbb48ad53649", "type": "region", "code": "370832", "name": "梁山县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "267b2390-bd8a-4f32-9bf8-ca72c733fb29"], "path_name": ["中国", "山东省", "济宁市", "梁山县"], "status": "active", "sort": 1515, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "2b9dfe80-9f66-4789-a822-77e816698f08", "_rev": "2-89fde5aaffb93e6f2ec37e62a8930644", "type": "region", "code": "211021", "name": "辽阳县", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "2b9dfe80-9f66-4789-a822-77e816698f08"], "path_name": ["中国", "辽宁省", "辽阳市", "辽阳县"], "status": "active", "sort": 1521, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "6e8ade1f-3d88-407f-b4ed-1a9a46b4d0bb", "_rev": "2-21cc5e666c32780a03fca94527ac9010", "type": "region", "code": "411402", "name": "梁园区", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "6e8ade1f-3d88-407f-b4ed-1a9a46b4d0bb"], "path_name": ["中国", "河南省", "商丘市", "梁园区"], "status": "active", "sort": 1518, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "70b7f1a8-12b8-49e0-afd3-2f896e0eeaef", "_rev": "2-41b2fac2e0d672d57c84ec8265bb5e9d", "type": "region", "code": "340604", "name": "烈山区", "parent_id": "5a306b32-cd23-49dc-910d-326cd0c36b00", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "5a306b32-cd23-49dc-910d-326cd0c36b00", "70b7f1a8-12b8-49e0-afd3-2f896e0eeaef"], "path_name": ["中国", "安徽省", "淮北市", "烈山区"], "status": "active", "sort": 1523, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "788535cf-7d4e-4137-93e0-c515ea73b0b2", "_rev": "2-576b35b09f563c0d40cbcc9abceaa387", "type": "region", "code": "210115", "name": "辽中区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "788535cf-7d4e-4137-93e0-c515ea73b0b2"], "path_name": ["中国", "辽宁省", "沈阳市", "辽中区"], "status": "active", "sort": 1522, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "a9f2d5e0-de31-4155-8fb8-f8ba6af4bdc9", "_rev": "2-640e1e98d49cbc57d07291804b316428", "type": "region", "code": "320213", "name": "梁溪区", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "a9f2d5e0-de31-4155-8fb8-f8ba6af4bdc9"], "path_name": ["中国", "江苏省", "无锡市", "梁溪区"], "status": "active", "sort": 1516, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "afbd979b-cad0-4000-a2a3-1cb885cdf2fa", "_rev": "2-ac0a25f437a52fce98a9d8ade064a8f5", "type": "region", "code": "533122", "name": "梁河县", "parent_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c", "afbd979b-cad0-4000-a2a3-1cb885cdf2fa"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州", "梁河县"], "status": "active", "sort": 1513, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "_rev": "2-4c112e01b6a93088bb1558405b0d84e1", "type": "region", "code": "411400", "name": "商丘市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab"], "path_name": ["中国", "河南省", "商丘市"], "status": "active", "sort": 1517, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "f33521c6-429c-4330-a67e-7d433307b7d4", "_rev": "2-b40d53f52735cbb41daf855b8acf6225", "type": "region", "code": "420702", "name": "梁子湖区", "parent_id": "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "28d2c2c7-a95a-4dc0-a540-ad7dbf822bd8", "f33521c6-429c-4330-a67e-7d433307b7d4"], "path_name": ["中国", "湖北省", "鄂州市", "梁子湖区"], "status": "active", "sort": 1519, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "f78cece7-61e9-4f71-bb2a-64e34b29332c", "_rev": "2-fa73648cacde7d99d4f186eacdca7b99", "type": "region", "code": "621228", "name": "两当县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "f78cece7-61e9-4f71-bb2a-64e34b29332c"], "path_name": ["中国", "甘肃省", "陇南市", "两当县"], "status": "active", "sort": 1520, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:44"} +{"_id": "1604074f-6290-47e7-91de-966a6e5c1585", "_rev": "2-ef9bb6d6776f3de560f64226a47ad82c", "type": "region", "code": "130522", "name": "临城县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "1604074f-6290-47e7-91de-966a6e5c1585"], "path_name": ["中国", "河北省", "邢台市", "临城县"], "status": "active", "sort": 1531, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "182f8e0e-4396-4da9-9498-05d1b10e2686", "_rev": "2-1b2686078ccbea218cd98071ec802f12", "type": "region", "code": "410581", "name": "林州市", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "182f8e0e-4396-4da9-9498-05d1b10e2686"], "path_name": ["中国", "河南省", "安阳市", "林州市"], "status": "active", "sort": 1528, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "26d71271-6fc8-4563-9795-971fa196b73f", "_rev": "2-2fce2e2924dd8db6e3e32f8b81d1c6dc", "type": "region", "code": "511623", "name": "邻水县", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "26d71271-6fc8-4563-9795-971fa196b73f"], "path_name": ["中国", "四川省", "广安市", "邻水县"], "status": "active", "sort": 1524, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "29f814b9-34de-4dc3-9979-67140d26dd70", "_rev": "2-947077ef5c692f5c694892e3a886bc3a", "type": "region", "code": "361002", "name": "临川区", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "29f814b9-34de-4dc3-9979-67140d26dd70"], "path_name": ["中国", "江西省", "抚州市", "临川区"], "status": "active", "sort": 1532, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "3385833c-6c47-4c46-8ca5-ba3add945ea1", "_rev": "2-5e40a192b4b0c6829fee1be47ec45dac", "type": "region", "code": "330112", "name": "临安区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "3385833c-6c47-4c46-8ca5-ba3add945ea1"], "path_name": ["中国", "浙江省", "杭州市", "临安区"], "status": "active", "sort": 1530, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "3af8a965-c928-4924-b79b-01b902dd9005", "_rev": "2-355bb847000ea70933944133de1632d5", "type": "region", "code": "231025", "name": "林口县", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "3af8a965-c928-4924-b79b-01b902dd9005"], "path_name": ["中国", "黑龙江省", "牡丹江市", "林口县"], "status": "active", "sort": 1526, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "50861828-6746-4ed2-b88b-df7c6b796cd1", "_rev": "2-541aa9a07531406d77e438c6149341c7", "type": "region", "code": "469024", "name": "临高县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "50861828-6746-4ed2-b88b-df7c6b796cd1"], "path_name": ["中国", "海南省", "临高县"], "status": "active", "sort": 1533, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "5bdd7d7d-8db6-459c-9663-8528e65edd9b", "_rev": "2-798735f790dac82f4957aad08293b6ac", "type": "region", "code": "150424", "name": "林西县", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "5bdd7d7d-8db6-459c-9663-8528e65edd9b"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "林西县"], "status": "active", "sort": 1527, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "7705ea0b-0ce0-46e7-a824-2f471f73b468", "_rev": "2-06f745c084bc5bfd69069e73b9c44512", "type": "region", "code": "230623", "name": "林甸县", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "7705ea0b-0ce0-46e7-a824-2f471f73b468"], "path_name": ["中国", "黑龙江省", "大庆市", "林甸县"], "status": "active", "sort": 1525, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "bfd7f238-9c0a-4f1e-81af-5dc031db3aa4", "_rev": "2-5df39a45df979b08113c214cf697ad9b", "type": "region", "code": "540121", "name": "林周县", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "bfd7f238-9c0a-4f1e-81af-5dc031db3aa4"], "path_name": ["中国", "西藏自治区", "拉萨市", "林周县"], "status": "active", "sort": 1529, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:45"} +{"_id": "166fcff4-c8ac-4006-8ffb-696eb57ebe48", "_rev": "2-dba2d006fae5ba395877c39965bed5d4", "type": "region", "code": "370724", "name": "临朐县", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "166fcff4-c8ac-4006-8ffb-696eb57ebe48"], "path_name": ["中国", "山东省", "潍坊市", "临朐县"], "status": "active", "sort": 1540, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "3e81bb60-0bd1-4aa5-a5c8-c8abb214cc28", "_rev": "2-164bb32c01df804bfc4baaaf40cc55ab", "type": "region", "code": "150802", "name": "临河区", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "3e81bb60-0bd1-4aa5-a5c8-c8abb214cc28"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "临河区"], "status": "active", "sort": 1536, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "4395abd3-098b-471f-9d74-1bda8be68f54", "_rev": "2-7f9e714604209fcf52e6a2f450ea2ad6", "type": "region", "code": "371581", "name": "临清市", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "4395abd3-098b-471f-9d74-1bda8be68f54"], "path_name": ["中国", "山东省", "聊城市", "临清市"], "status": "active", "sort": 1539, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "78104e59-a1d8-4658-8206-fdc977aacc7f", "_rev": "2-7782f390976f7ada826985719f242310", "type": "region", "code": "610115", "name": "临潼区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "78104e59-a1d8-4658-8206-fdc977aacc7f"], "path_name": ["中国", "陕西省", "西安市", "临潼区"], "status": "active", "sort": 1545, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "79b2568f-ca50-4c48-91ad-520f934175de", "_rev": "2-4393763e2306c79ddfab72587003d315", "type": "region", "code": "621124", "name": "临洮县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "79b2568f-ca50-4c48-91ad-520f934175de"], "path_name": ["中国", "甘肃省", "定西市", "临洮县"], "status": "active", "sort": 1544, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "84c964ca-76cd-4447-87f3-e7ecc4d0a3cc", "_rev": "2-2a6d7037f5ca3edcf57cd5d3a2211eda", "type": "region", "code": "371329", "name": "临沭县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "84c964ca-76cd-4447-87f3-e7ecc4d0a3cc"], "path_name": ["中国", "山东省", "临沂市", "临沭县"], "status": "active", "sort": 1542, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "87f684f8-d437-4e21-863c-5278b32b56df", "_rev": "2-d93d175d23ae1b4f44183630211c2df2", "type": "region", "code": "430724", "name": "临澧县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "87f684f8-d437-4e21-863c-5278b32b56df"], "path_name": ["中国", "湖南省", "常德市", "临澧县"], "status": "active", "sort": 1538, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "8c9fb8ef-16b3-4bb5-9c0e-37a615bbc5c8", "_rev": "2-a1da924913e9597fb9a1aece6b367422", "type": "region", "code": "450312", "name": "临桂区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "8c9fb8ef-16b3-4bb5-9c0e-37a615bbc5c8"], "path_name": ["中国", "广西壮族自治区", "桂林市", "临桂区"], "status": "active", "sort": 1534, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "8ebd375a-9cd3-4eb4-ac78-1dacb7ea9cfc", "_rev": "2-379466a93a7909ff9d2915864694c93e", "type": "region", "code": "623021", "name": "临潭县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "8ebd375a-9cd3-4eb4-ac78-1dacb7ea9cfc"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "临潭县"], "status": "active", "sort": 1543, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "9e0525da-de1f-4a03-8c5d-e888cb4c8831", "_rev": "2-d0f26989ff3c1904b8f804f3d00a9921", "type": "region", "code": "341221", "name": "临泉县", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "9e0525da-de1f-4a03-8c5d-e888cb4c8831"], "path_name": ["中国", "安徽省", "阜阳市", "临泉县"], "status": "active", "sort": 1541, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "ba4dbab3-a786-4278-8004-227aa3de8851", "_rev": "2-ca70770c9acc795b6fdadcb2b0686724", "type": "region", "code": "331082", "name": "临海市", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "ba4dbab3-a786-4278-8004-227aa3de8851"], "path_name": ["中国", "浙江省", "台州市", "临海市"], "status": "active", "sort": 1535, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "f1d01866-d40e-4037-86ff-23845c8f2b19", "_rev": "2-1d996f8078989e43d004cc2f4adafcc1", "type": "region", "code": "220681", "name": "临江市", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "f1d01866-d40e-4037-86ff-23845c8f2b19"], "path_name": ["中国", "吉林省", "白山市", "临江市"], "status": "active", "sort": 1537, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:46"} +{"_id": "0b7edd7c-c727-4816-9632-72c5cf04d6cf", "_rev": "2-e56bb655ae1379e2ae1e462236eaf642", "type": "region", "code": "430682", "name": "临湘市", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "0b7edd7c-c727-4816-9632-72c5cf04d6cf"], "path_name": ["中国", "湖南省", "岳阳市", "临湘市"], "status": "active", "sort": 1552, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "289cfd34-f2dd-4de4-9043-f49b0f8f11b6", "_rev": "2-c0597ec966f076f5921167f6e7c133b2", "type": "region", "code": "530902", "name": "临翔区", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "289cfd34-f2dd-4de4-9043-f49b0f8f11b6"], "path_name": ["中国", "云南省", "临沧市", "临翔区"], "status": "active", "sort": 1553, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "4207933e-3b99-493d-83e0-8b28c60d384b", "_rev": "2-0bea782437eea63c32616b34a90cdce0", "type": "region", "code": "622901", "name": "临夏市", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "4207933e-3b99-493d-83e0-8b28c60d384b"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "临夏市"], "status": "active", "sort": 1549, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "627b8c66-18f1-46f5-b131-475d62a2271c", "_rev": "2-f00231cc245659449c9194de86d300f5", "type": "region", "code": "431025", "name": "临武县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "627b8c66-18f1-46f5-b131-475d62a2271c"], "path_name": ["中国", "湖南省", "郴州市", "临武县"], "status": "active", "sort": 1547, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "85e4e9b8-37bf-4965-a5f5-f7bbd26f5a9d", "_rev": "2-25997649c014ec00aa37bec0e0e3b221", "type": "region", "code": "610502", "name": "临渭区", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "85e4e9b8-37bf-4965-a5f5-f7bbd26f5a9d"], "path_name": ["中国", "陕西省", "渭南市", "临渭区"], "status": "active", "sort": 1546, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "a4f40fa2-2a9c-4b3f-9f44-611a7808b152", "_rev": "2-bf7589b0d2984cc76eb13b6477c4b3c5", "type": "region", "code": "141124", "name": "临县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "a4f40fa2-2a9c-4b3f-9f44-611a7808b152"], "path_name": ["中国", "山西省", "吕梁市", "临县"], "status": "active", "sort": 1551, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "b96d341f-40de-4857-8916-107e63e3016b", "_rev": "2-e798309c96404a44961241bd51686c99", "type": "region", "code": "140821", "name": "临猗县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "b96d341f-40de-4857-8916-107e63e3016b"], "path_name": ["中国", "山西省", "运城市", "临猗县"], "status": "active", "sort": 1554, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "d41f466d-690a-4104-b545-35ba392a52d2", "_rev": "2-55dc30b790a969dc00e2d355a216e6d9", "type": "region", "code": "411100", "name": "漯河市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2"], "path_name": ["中国", "河南省", "漯河市"], "status": "active", "sort": 1556, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "dee0399a-c6eb-46f2-a1a6-2ab388f3a9ac", "_rev": "2-5b156f92cb66428dfc2810d94dc31b61", "type": "region", "code": "622921", "name": "临夏县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "dee0399a-c6eb-46f2-a1a6-2ab388f3a9ac"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "临夏县"], "status": "active", "sort": 1550, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "ecb85745-a3a6-449a-b51a-9f22fa32b957", "_rev": "2-0ddf61bba985add821aba214c4f284ff", "type": "region", "code": "371424", "name": "临邑县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "ecb85745-a3a6-449a-b51a-9f22fa32b957"], "path_name": ["中国", "山东省", "德州市", "临邑县"], "status": "active", "sort": 1555, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "ff421181-817a-467d-af48-a0e2791d1e74", "_rev": "2-c73146d5aa4bf75bc358482e26257587", "type": "region", "code": "130535", "name": "临西县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "ff421181-817a-467d-af48-a0e2791d1e74"], "path_name": ["中国", "河北省", "邢台市", "临西县"], "status": "active", "sort": 1548, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:47"} +{"_id": "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "_rev": "2-e534eb61d879613cfcb029af57122bc5", "type": "region", "code": "450700", "name": "钦州市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "0481a129-d323-4108-84ac-9fb3aa8a4eeb"], "path_name": ["中国", "广西壮族自治区", "钦州市"], "status": "active", "sort": 1566, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "08eef26b-ac18-4418-852c-db353ad28f89", "_rev": "2-516a6017ca299253c7009acc40a4c558", "type": "region", "code": "411122", "name": "临颍县", "parent_id": "d41f466d-690a-4104-b545-35ba392a52d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2", "08eef26b-ac18-4418-852c-db353ad28f89"], "path_name": ["中国", "河南省", "漯河市", "临颍县"], "status": "active", "sort": 1557, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "1a7a8107-afac-4b79-9e0b-93aec22f8ab9", "_rev": "2-9cbe42517026da2a5262d33a6683cdff", "type": "region", "code": "450721", "name": "灵山县", "parent_id": "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "1a7a8107-afac-4b79-9e0b-93aec22f8ab9"], "path_name": ["中国", "广西壮族自治区", "钦州市", "灵山县"], "status": "active", "sort": 1567, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "217b3805-3922-4089-9073-4f0ff78a1148", "_rev": "2-1f15dbbda1ea476d072e841606947613", "type": "region", "code": "130423", "name": "临漳县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "217b3805-3922-4089-9073-4f0ff78a1148"], "path_name": ["中国", "河北省", "邯郸市", "临漳县"], "status": "active", "sort": 1559, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "21893af4-c874-44f4-b28e-5df8f3799c2d", "_rev": "2-47c28b8fcf73db7c712aae1d63956b53", "type": "region", "code": "450323", "name": "灵川县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "21893af4-c874-44f4-b28e-5df8f3799c2d"], "path_name": ["中国", "广西壮族自治区", "桂林市", "灵川县"], "status": "active", "sort": 1564, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "28bda38d-6640-46be-8dc7-7821f70dad71", "_rev": "2-8f5593dd1c898633c07870bd9feefc48", "type": "region", "code": "610329", "name": "麟游县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "28bda38d-6640-46be-8dc7-7821f70dad71"], "path_name": ["中国", "陕西省", "宝鸡市", "麟游县"], "status": "active", "sort": 1561, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "31a16614-f588-44b0-afc2-a3ec69573ccb", "_rev": "2-9b36e5075909055c1960cbc2d41e9f6f", "type": "region", "code": "140729", "name": "灵石县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "31a16614-f588-44b0-afc2-a3ec69573ccb"], "path_name": ["中国", "山西省", "晋中市", "灵石县"], "status": "active", "sort": 1568, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "5633eafd-f706-40db-8f76-60db038df809", "_rev": "2-55b8d1248da9b8fd95952bbfb3e29f87", "type": "region", "code": "620723", "name": "临泽县", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "5633eafd-f706-40db-8f76-60db038df809"], "path_name": ["中国", "甘肃省", "张掖市", "临泽县"], "status": "active", "sort": 1558, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "656f8d6a-049c-43e6-9ce3-f9cd5f7f4332", "_rev": "2-b9fb7b22ccc362779e4919034b1e3e3a", "type": "region", "code": "411282", "name": "灵宝市", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "656f8d6a-049c-43e6-9ce3-f9cd5f7f4332"], "path_name": ["中国", "河南省", "三门峡市", "灵宝市"], "status": "active", "sort": 1562, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "795fdb60-9de0-4d17-aec9-a6bb9e38eaa2", "_rev": "2-a3b7fd3d380440b0bd946463e37bd55f", "type": "region", "code": "140224", "name": "灵丘县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "795fdb60-9de0-4d17-aec9-a6bb9e38eaa2"], "path_name": ["中国", "山西省", "大同市", "灵丘县"], "status": "active", "sort": 1565, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "9257136f-890d-4e70-989d-a1713cd19a69", "_rev": "2-2e0628f11e50590249f6191059954dd8", "type": "region", "code": "341323", "name": "灵璧县", "parent_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "9257136f-890d-4e70-989d-a1713cd19a69"], "path_name": ["中国", "安徽省", "宿州市", "灵璧县"], "status": "active", "sort": 1563, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "9a5e4b67-e7a6-4e97-8775-07dbd8c66080", "_rev": "2-b2384721d4dbb6de5bf5c328da56977f", "type": "region", "code": "370305", "name": "临淄区", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "9a5e4b67-e7a6-4e97-8775-07dbd8c66080"], "path_name": ["中国", "山东省", "淄博市", "临淄区"], "status": "active", "sort": 1560, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:48"} +{"_id": "1ea93b53-1e01-4133-adbd-1249aa2db6ba", "_rev": "2-86449d725371c3f422015139d5e19466", "type": "region", "code": "431102", "name": "零陵区", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "1ea93b53-1e01-4133-adbd-1249aa2db6ba"], "path_name": ["中国", "湖南省", "永州市", "零陵区"], "status": "active", "sort": 1579, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "27ccbacb-8f96-4930-a509-b02fe44ab28a", "_rev": "2-3bfabc85b1ef3af413c1713b1c0fe544", "type": "region", "code": "640181", "name": "灵武市", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "27ccbacb-8f96-4930-a509-b02fe44ab28a"], "path_name": ["中国", "宁夏回族自治区", "银川市", "灵武市"], "status": "active", "sort": 1571, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "34d15b2f-b8af-4aa0-a39d-b33670716a33", "_rev": "2-585fbd282f33f3131f37ffd54125aac8", "type": "region", "code": "620822", "name": "灵台县", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "34d15b2f-b8af-4aa0-a39d-b33670716a33"], "path_name": ["中国", "甘肃省", "平凉市", "灵台县"], "status": "active", "sort": 1570, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "4df0b525-d017-4b87-a8b2-b40fd2879665", "_rev": "2-92275b3aee92ea7f105fb115a8c9fd5e", "type": "region", "code": "130126", "name": "灵寿县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "4df0b525-d017-4b87-a8b2-b40fd2879665"], "path_name": ["中国", "河北省", "石家庄市", "灵寿县"], "status": "active", "sort": 1569, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "54e0def5-e7ba-48c4-87fe-84f008305bdc", "_rev": "2-247a028336e0507cb4b37eb8eda89317", "type": "region", "code": "451027", "name": "凌云县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "54e0def5-e7ba-48c4-87fe-84f008305bdc"], "path_name": ["中国", "广西壮族自治区", "百色市", "凌云县"], "status": "active", "sort": 1575, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "758ae00c-a983-4a64-90a3-4663ac7456f9", "_rev": "2-97eeacf9e1544c6b5b3273b1f1397469", "type": "region", "code": "210781", "name": "凌海市", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "758ae00c-a983-4a64-90a3-4663ac7456f9"], "path_name": ["中国", "辽宁省", "锦州市", "凌海市"], "status": "active", "sort": 1572, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "855a8679-35b3-4ca2-9a9f-bd0dcd26b485", "_rev": "2-ac8c00a81bd32daa178c5dd7b4dc8bf9", "type": "region", "code": "211382", "name": "凌源市", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "855a8679-35b3-4ca2-9a9f-bd0dcd26b485"], "path_name": ["中国", "辽宁省", "朝阳市", "凌源市"], "status": "active", "sort": 1574, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "99e63698-7a56-4b40-aa05-e51a82e33f44", "_rev": "2-6df481f566a0c0551dfd1b06c8c38561", "type": "region", "code": "371403", "name": "陵城区", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "99e63698-7a56-4b40-aa05-e51a82e33f44"], "path_name": ["中国", "山东省", "德州市", "陵城区"], "status": "active", "sort": 1576, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "ab083acc-5525-4f9d-a7dd-850339601c5e", "_rev": "2-e7e22cf8571797e85c923f4df067bd72", "type": "region", "code": "140524", "name": "陵川县", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "ab083acc-5525-4f9d-a7dd-850339601c5e"], "path_name": ["中国", "山西省", "晋城市", "陵川县"], "status": "active", "sort": 1577, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "c07eebbc-478b-4b44-9b99-1fe18d819fe7", "_rev": "2-17add88bfa8d043265abf4df07bc5144", "type": "region", "code": "469028", "name": "陵水黎族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "c07eebbc-478b-4b44-9b99-1fe18d819fe7"], "path_name": ["中国", "海南省", "陵水黎族自治县"], "status": "active", "sort": 1578, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "cc56fcf1-0fd0-4f02-9d02-02d163c44238", "_rev": "2-b46ce532064262191217afb24fd1f3fb", "type": "region", "code": "210703", "name": "凌河区", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "cc56fcf1-0fd0-4f02-9d02-02d163c44238"], "path_name": ["中国", "辽宁省", "锦州市", "凌河区"], "status": "active", "sort": 1573, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:49"} +{"_id": "024e9cfc-43c2-4d57-816e-75ac40d796a6", "_rev": "2-84c2305c8d7f800f0553faa968dfd1a2", "type": "region", "code": "141125", "name": "柳林县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "024e9cfc-43c2-4d57-816e-75ac40d796a6"], "path_name": ["中国", "山西省", "吕梁市", "柳林县"], "status": "active", "sort": 1588, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "14ec6e77-fb85-4d2b-9ee7-326664e0fb57", "_rev": "2-f9faf31fb0b8c4c89fad5f8fc0e6c3f9", "type": "region", "code": "430181", "name": "浏阳市", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "14ec6e77-fb85-4d2b-9ee7-326664e0fb57"], "path_name": ["中国", "湖南省", "长沙市", "浏阳市"], "status": "active", "sort": 1581, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "1dac6965-3077-4b43-acc2-91948878ede4", "_rev": "2-d2502c0543b19a715efd5229904a784f", "type": "region", "code": "450200", "name": "柳州市", "parent_id": "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4"], "path_name": ["中国", "广西壮族自治区", "柳州市"], "status": "active", "sort": 1583, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "25946e9a-1c7c-4846-8f99-cf2dd2e9115e", "_rev": "2-2046a0e05c68b52f7c537ad883ed9c51", "type": "region", "code": "450204", "name": "柳南区", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "25946e9a-1c7c-4846-8f99-cf2dd2e9115e"], "path_name": ["中国", "广西壮族自治区", "柳州市", "柳南区"], "status": "active", "sort": 1589, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "27591faf-1747-4e4c-912a-54b559032077", "_rev": "2-3a2dc6daad1a90ff3991533648f131f1", "type": "region", "code": "230503", "name": "岭东区", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "27591faf-1747-4e4c-912a-54b559032077"], "path_name": ["中国", "黑龙江省", "双鸭山市", "岭东区"], "status": "active", "sort": 1580, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "46c74a22-eb79-4ca2-a6ba-e8081cc6c411", "_rev": "2-a6bfd4a815c72ff035f90d684919e9da", "type": "region", "code": "320116", "name": "六合区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "46c74a22-eb79-4ca2-a6ba-e8081cc6c411"], "path_name": ["中国", "江苏省", "南京市", "六合区"], "status": "active", "sort": 1590, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "6e834a88-51e7-4ee3-b17f-f5ae1d501b86", "_rev": "2-fdc21cd6249fdc4b98a0bc68c9b41aeb", "type": "region", "code": "610729", "name": "留坝县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "6e834a88-51e7-4ee3-b17f-f5ae1d501b86"], "path_name": ["中国", "陕西省", "汉中市", "留坝县"], "status": "active", "sort": 1582, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "af0152b1-21d4-444e-97d4-531c7ddd4365", "_rev": "2-0780d09a62199f56a5504c296d50606a", "type": "region", "code": "450222", "name": "柳城县", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "af0152b1-21d4-444e-97d4-531c7ddd4365"], "path_name": ["中国", "广西壮族自治区", "柳州市", "柳城县"], "status": "active", "sort": 1585, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "bd1d50f3-ccca-49f9-8abc-1a3a46e2dda3", "_rev": "2-80b8a26dd739af1349a615fe23256a00", "type": "region", "code": "450205", "name": "柳北区", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "bd1d50f3-ccca-49f9-8abc-1a3a46e2dda3"], "path_name": ["中国", "广西壮族自治区", "柳州市", "柳北区"], "status": "active", "sort": 1584, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "c28675b7-bed2-450e-a7bd-9873f6e7d07a", "_rev": "2-5056116e17d49fed267bb6878d67a2ae", "type": "region", "code": "220524", "name": "柳河县", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "c28675b7-bed2-450e-a7bd-9873f6e7d07a"], "path_name": ["中国", "吉林省", "通化市", "柳河县"], "status": "active", "sort": 1586, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "daccb053-2bca-4247-a745-7fa0bc4c6747", "_rev": "2-ed1fa5373c8f1b9cdee413577f4ad69b", "type": "region", "code": "450206", "name": "柳江区", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "daccb053-2bca-4247-a745-7fa0bc4c6747"], "path_name": ["中国", "广西壮族自治区", "柳州市", "柳江区"], "status": "active", "sort": 1587, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:50"} +{"_id": "1e82f909-d306-489e-8b57-4e01f256def0", "_rev": "2-e71c6ed8021675c0af0abec468df0078", "type": "region", "code": "211403", "name": "龙港区", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "1e82f909-d306-489e-8b57-4e01f256def0"], "path_name": ["中国", "辽宁省", "葫芦岛市", "龙港区"], "status": "active", "sort": 1598, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "273eefb5-1684-49ea-b29a-7a6dd84e58c4", "_rev": "2-f78304d23e9a75967c7e7e4a4fa0f0da", "type": "region", "code": "441622", "name": "龙川县", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "273eefb5-1684-49ea-b29a-7a6dd84e58c4"], "path_name": ["中国", "广东省", "河源市", "龙川县"], "status": "active", "sort": 1595, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "47252588-5858-42d8-b06b-be7953896c75", "_rev": "2-09f94d4a6bf31ef0b07aa3bd41bb075c", "type": "region", "code": "460100", "name": "海口市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "47252588-5858-42d8-b06b-be7953896c75"], "path_name": ["中国", "海南省", "海口市"], "status": "active", "sort": 1601, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "52f469eb-e15f-452e-b116-e8f06a12b669", "_rev": "2-c82de95cd4c7e4c3d77c3ad0b8ff5ffd", "type": "region", "code": "211303", "name": "龙城区", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "52f469eb-e15f-452e-b116-e8f06a12b669"], "path_name": ["中国", "辽宁省", "朝阳市", "龙城区"], "status": "active", "sort": 1594, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "7d35be71-380e-4b5b-bd12-de85b45eb260", "_rev": "2-a1d92b54f96f1ae62a18790a42c9fa90", "type": "region", "code": "520203", "name": "六枝特区", "parent_id": "b284639e-6eb4-4c35-add3-3f31cef7708a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "b284639e-6eb4-4c35-add3-3f31cef7708a", "7d35be71-380e-4b5b-bd12-de85b45eb260"], "path_name": ["中国", "贵州省", "六盘水市", "六枝特区"], "status": "active", "sort": 1592, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "91891763-0f17-49c6-885c-2e180e9fcfc8", "_rev": "2-05d56fb4834d5b637fd5ff79e88e0cd2", "type": "region", "code": "440307", "name": "龙岗区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "91891763-0f17-49c6-885c-2e180e9fcfc8"], "path_name": ["中国", "广东省", "深圳市", "龙岗区"], "status": "active", "sort": 1597, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "942de686-eeec-4e26-b34d-2f1df4dcee19", "_rev": "2-3548b2406f705e5323173f3f1dab4952", "type": "region", "code": "350604", "name": "龙海区", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "942de686-eeec-4e26-b34d-2f1df4dcee19"], "path_name": ["中国", "福建省", "漳州市", "龙海区"], "status": "active", "sort": 1599, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "a6ac5f6b-25fa-4100-8feb-f4bd5e2712a2", "_rev": "2-db8291d217da2f5ba271f18e1b265f17", "type": "region", "code": "410506", "name": "龙安区", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "a6ac5f6b-25fa-4100-8feb-f4bd5e2712a2"], "path_name": ["中国", "河南省", "安阳市", "龙安区"], "status": "active", "sort": 1593, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "ada8d7af-0f65-450c-aca6-76270f0c5b70", "_rev": "2-e954bb2b4b21c0dd918e2f5f82988089", "type": "region", "code": "440507", "name": "龙湖区", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "ada8d7af-0f65-450c-aca6-76270f0c5b70"], "path_name": ["中国", "广东省", "汕头市", "龙湖区"], "status": "active", "sort": 1600, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "b284639e-6eb4-4c35-add3-3f31cef7708a", "_rev": "2-964e0f1611935feaa7f2e053cbd60b72", "type": "region", "code": "520200", "name": "六盘水市", "parent_id": "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "b284639e-6eb4-4c35-add3-3f31cef7708a"], "path_name": ["中国", "贵州省", "六盘水市"], "status": "active", "sort": 1591, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "d753c9ed-09a1-439c-9831-a71e27c53b27", "_rev": "2-d50b9db96d218531ff28c00f2f3691e6", "type": "region", "code": "230603", "name": "龙凤区", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "d753c9ed-09a1-439c-9831-a71e27c53b27"], "path_name": ["中国", "黑龙江省", "大庆市", "龙凤区"], "status": "active", "sort": 1596, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:51"} +{"_id": "00db0063-8db0-454b-89fb-3178933f6327", "_rev": "2-bb40d46ffb04a5d55ca23a566314cd30", "type": "region", "code": "441324", "name": "龙门县", "parent_id": "45037b61-08b1-4e9f-9777-62b4bcf17c89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "45037b61-08b1-4e9f-9777-62b4bcf17c89", "00db0063-8db0-454b-89fb-3178933f6327"], "path_name": ["中国", "广东省", "惠州市", "龙门县"], "status": "active", "sort": 1609, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "05528ea2-418e-434c-b8b0-c1641c889f77", "_rev": "2-d954fb08dd0c820d364f30dd09e59456", "type": "region", "code": "510504", "name": "龙马潭区", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "05528ea2-418e-434c-b8b0-c1641c889f77"], "path_name": ["中国", "四川省", "泸州市", "龙马潭区"], "status": "active", "sort": 1608, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "15fd7d19-c129-40db-8ae0-43227fca917f", "_rev": "2-fbfbf32d65f2af25b59f002018043e32", "type": "region", "code": "360783", "name": "龙南市", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "15fd7d19-c129-40db-8ae0-43227fca917f"], "path_name": ["中国", "江西省", "赣州市", "龙南市"], "status": "active", "sort": 1610, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "28d77252-0196-404b-b15c-0eada5152b54", "_rev": "2-655f1e3dfd1906c63275e844ea69d8ab", "type": "region", "code": "370681", "name": "龙口市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "28d77252-0196-404b-b15c-0eada5152b54"], "path_name": ["中国", "山东省", "烟台市", "龙口市"], "status": "active", "sort": 1605, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "3ca2179e-fb6b-43a3-bd92-8912417a32b2", "_rev": "2-44f74ec80540d80899ae4e9bcb1866a3", "type": "region", "code": "230221", "name": "龙江县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "3ca2179e-fb6b-43a3-bd92-8912417a32b2"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "龙江县"], "status": "active", "sort": 1603, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "58f37858-2afa-4b05-8822-62f9370c3b7d", "_rev": "2-b17b01624bd89916f268a801ab091682", "type": "region", "code": "331181", "name": "龙泉市", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "58f37858-2afa-4b05-8822-62f9370c3b7d"], "path_name": ["中国", "浙江省", "丽水市", "龙泉市"], "status": "active", "sort": 1611, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "6f892399-6462-404e-8fd9-2cfe4ac4ca2e", "_rev": "2-98d2f870a52c549fab46e2f7a73fe24a", "type": "region", "code": "460106", "name": "龙华区", "parent_id": "47252588-5858-42d8-b06b-be7953896c75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "47252588-5858-42d8-b06b-be7953896c75", "6f892399-6462-404e-8fd9-2cfe4ac4ca2e"], "path_name": ["中国", "海南省", "海口市", "龙华区"], "status": "active", "sort": 1602, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "8e69c99f-30fc-4bba-b45a-c33aa5274a14", "_rev": "2-02b3246a219c16113b1472d5836bb535", "type": "region", "code": "530523", "name": "龙陵县", "parent_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2", "8e69c99f-30fc-4bba-b45a-c33aa5274a14"], "path_name": ["中国", "云南省", "保山市", "龙陵县"], "status": "active", "sort": 1607, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "c95aef06-8f75-4fc7-aadc-d94723fbecbf", "_rev": "2-4db0cdbf8252650d3c92931a52c7265d", "type": "region", "code": "522730", "name": "龙里县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "c95aef06-8f75-4fc7-aadc-d94723fbecbf"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "龙里县"], "status": "active", "sort": 1606, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "f3904e07-d4c5-44e2-a90a-28dcea0515d9", "_rev": "2-80968e147b00d876ed1b6ab761177e45", "type": "region", "code": "222405", "name": "龙井市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "f3904e07-d4c5-44e2-a90a-28dcea0515d9"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "龙井市"], "status": "active", "sort": 1604, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:52"} +{"_id": "0adefb4f-65c1-4e66-80ba-bb18846989d5", "_rev": "2-26ca501e892f50e2004d3f00fd0d0b41", "type": "region", "code": "433130", "name": "龙山县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "0adefb4f-65c1-4e66-80ba-bb18846989d5"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "龙山县"], "status": "active", "sort": 1615, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "0cc53ed1-f076-4520-8038-5f598911e412", "_rev": "2-c425e7a6f1a2a8bd1ddbdaf0be62eb52", "type": "region", "code": "330825", "name": "龙游县", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "0cc53ed1-f076-4520-8038-5f598911e412"], "path_name": ["中国", "浙江省", "衢州市", "龙游县"], "status": "active", "sort": 1622, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "10aa556c-0ead-4c63-a844-53fdf92c8596", "_rev": "2-38479a3bd7b1fb3e10bf28857c93be03", "type": "region", "code": "220203", "name": "龙潭区", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "10aa556c-0ead-4c63-a844-53fdf92c8596"], "path_name": ["中国", "吉林省", "吉林市", "龙潭区"], "status": "active", "sort": 1617, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "1ad9de8b-838e-412f-9b5f-6a5f0638617b", "_rev": "2-72b897053cb0cd08f76d285e665a3066", "type": "region", "code": "450328", "name": "龙胜各族自治县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "1ad9de8b-838e-412f-9b5f-6a5f0638617b"], "path_name": ["中国", "广西壮族自治区", "桂林市", "龙胜各族自治县"], "status": "active", "sort": 1616, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "45e4d18f-3065-410f-b9e5-be5228415ea9", "_rev": "2-ad38b3a097f18601ece39230d26ce911", "type": "region", "code": "450406", "name": "龙圩区", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "45e4d18f-3065-410f-b9e5-be5228415ea9"], "path_name": ["中国", "广西壮族自治区", "梧州市", "龙圩区"], "status": "active", "sort": 1620, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "67d181e2-52fe-416c-b89f-d9392958ac0c", "_rev": "2-04f2ce3dec6594279891120939ccaa48", "type": "region", "code": "230202", "name": "龙沙区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "67d181e2-52fe-416c-b89f-d9392958ac0c"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "龙沙区"], "status": "active", "sort": 1613, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "73c4aa6d-b94f-4724-8c7b-52e34f3a135b", "_rev": "2-ccc5726389782875a00143bb0e8a6871", "type": "region", "code": "410202", "name": "龙亭区", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "73c4aa6d-b94f-4724-8c7b-52e34f3a135b"], "path_name": ["中国", "河南省", "开封市", "龙亭区"], "status": "active", "sort": 1618, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "a289514d-2859-4610-bbc6-5245a6e5fd44", "_rev": "2-0c577da07dae95fb8a57f0ce65fe069f", "type": "region", "code": "330303", "name": "龙湾区", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "a289514d-2859-4610-bbc6-5245a6e5fd44"], "path_name": ["中国", "浙江省", "温州市", "龙湾区"], "status": "active", "sort": 1619, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "b803b90d-19c3-4f12-a3b6-e9509c1d3815", "_rev": "2-d3ed6ebd3dc39424a0527a9eb1634a16", "type": "region", "code": "350603", "name": "龙文区", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "b803b90d-19c3-4f12-a3b6-e9509c1d3815"], "path_name": ["中国", "福建省", "漳州市", "龙文区"], "status": "active", "sort": 1621, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "e8fc3dcb-488c-403d-9bf9-84c6b2608548", "_rev": "2-07ca2c72ddd07d60355bcd2fbf6a975c", "type": "region", "code": "510112", "name": "龙泉驿区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "e8fc3dcb-488c-403d-9bf9-84c6b2608548"], "path_name": ["中国", "四川省", "成都市", "龙泉驿区"], "status": "active", "sort": 1612, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "f79e825f-d8d7-4636-8e8c-9b0f9e1ee70e", "_rev": "2-87fc2329782641a42f39e6e39fff6e7c", "type": "region", "code": "220402", "name": "龙山区", "parent_id": "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "f79e825f-d8d7-4636-8e8c-9b0f9e1ee70e"], "path_name": ["中国", "吉林省", "辽源市", "龙山区"], "status": "active", "sort": 1614, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:53"} +{"_id": "03cccc62-cd41-4b7d-acdf-9a44814b8b53", "_rev": "2-760edb49834ae3428a969363f2538993", "type": "region", "code": "130825", "name": "隆化县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "03cccc62-cd41-4b7d-acdf-9a44814b8b53"], "path_name": ["中国", "河北省", "承德市", "隆化县"], "status": "active", "sort": 1628, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "3456ffd0-a2f6-4c57-927f-d19d05c468d5", "_rev": "2-38371a6d1e12c60091ddd8fb02a1b5dc", "type": "region", "code": "430524", "name": "隆回县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "3456ffd0-a2f6-4c57-927f-d19d05c468d5"], "path_name": ["中国", "湖南省", "邵阳市", "隆回县"], "status": "active", "sort": 1629, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "5955d4cd-b1a8-450e-b74a-26bbd9d1d524", "_rev": "2-817a49ad312280db958cd0c77596b307", "type": "region", "code": "450123", "name": "隆安县", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "5955d4cd-b1a8-450e-b74a-26bbd9d1d524"], "path_name": ["中国", "广西壮族自治区", "南宁市", "隆安县"], "status": "active", "sort": 1625, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "7c93daa9-1e41-4713-bfd6-257cff7751d4", "_rev": "2-abdb9b2361549e5d3bfbaf2d565a409c", "type": "region", "code": "533124", "name": "陇川县", "parent_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c", "7c93daa9-1e41-4713-bfd6-257cff7751d4"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州", "陇川县"], "status": "active", "sort": 1634, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "7f3acf37-2344-4d17-ae1a-e9a1a5207ccb", "_rev": "2-d33136b5b8c96cafb48ed87bef0c1009", "type": "region", "code": "451031", "name": "隆林各族自治县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "7f3acf37-2344-4d17-ae1a-e9a1a5207ccb"], "path_name": ["中国", "广西壮族自治区", "百色市", "隆林各族自治县"], "status": "active", "sort": 1630, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "8adf85c1-efb0-4db7-90b7-7d4d84fd1eca", "_rev": "2-e3f0e877f4b450d546f8cecf39319f52", "type": "region", "code": "540529", "name": "隆子县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "8adf85c1-efb0-4db7-90b7-7d4d84fd1eca"], "path_name": ["中国", "西藏自治区", "山南市", "隆子县"], "status": "active", "sort": 1633, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "8ef0facd-0ca3-491c-8d25-9bf71ca901d4", "_rev": "2-edd868634c746e4a1259b51582c21e65", "type": "region", "code": "451423", "name": "龙州县", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "8ef0facd-0ca3-491c-8d25-9bf71ca901d4"], "path_name": ["中国", "广西壮族自治区", "崇左市", "龙州县"], "status": "active", "sort": 1623, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "b84f4961-d788-4504-ab55-1114cfb5f379", "_rev": "2-9e356d9785e583e560f5771be7529133", "type": "region", "code": "130525", "name": "隆尧县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "b84f4961-d788-4504-ab55-1114cfb5f379"], "path_name": ["中国", "河北省", "邢台市", "隆尧县"], "status": "active", "sort": 1632, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "b8a94e0c-4be0-468d-a794-077ef2381e19", "_rev": "2-77d0388ae35fbbbd208ca51af9b5eabc", "type": "region", "code": "640423", "name": "隆德县", "parent_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "b8a94e0c-4be0-468d-a794-077ef2381e19"], "path_name": ["中国", "宁夏回族自治区", "固原市", "隆德县"], "status": "active", "sort": 1627, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "bc27e874-e2fd-4265-bb8a-dcd7d10ab4b7", "_rev": "2-8d7b396b4d95ea3a625a38c7e7759df9", "type": "region", "code": "340302", "name": "龙子湖区", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "bc27e874-e2fd-4265-bb8a-dcd7d10ab4b7"], "path_name": ["中国", "安徽省", "蚌埠市", "龙子湖区"], "status": "active", "sort": 1624, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "db2255c4-2c0a-477f-83b0-0c6a1b21a3a1", "_rev": "2-62f30ea010e28750cd8d40abe0bc2f9e", "type": "region", "code": "511083", "name": "隆昌市", "parent_id": "73916687-f3ab-40c0-823d-537abee71925", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925", "db2255c4-2c0a-477f-83b0-0c6a1b21a3a1"], "path_name": ["中国", "四川省", "内江市", "隆昌市"], "status": "active", "sort": 1626, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "f1f80860-a0b2-4bbe-830b-3dd0545814a2", "_rev": "2-34a14d632705c63da8283f1b9573c8a5", "type": "region", "code": "530502", "name": "隆阳区", "parent_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2", "f1f80860-a0b2-4bbe-830b-3dd0545814a2"], "path_name": ["中国", "云南省", "保山市", "隆阳区"], "status": "active", "sort": 1631, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:54"} +{"_id": "037c9f4b-3e5c-40f9-980e-79a314e2bf1d", "_rev": "2-082035e7f03b364d2c8496d26e2c7de1", "type": "region", "code": "610327", "name": "陇县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "037c9f4b-3e5c-40f9-980e-79a314e2bf1d"], "path_name": ["中国", "陕西省", "宝鸡市", "陇县"], "status": "active", "sort": 1636, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "06c4cb6f-4f7d-46d4-b93b-d3f4804679de", "_rev": "2-78ad062cf9e8feefaaf0272eec45c700", "type": "region", "code": "140123", "name": "娄烦县", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "06c4cb6f-4f7d-46d4-b93b-d3f4804679de"], "path_name": ["中国", "山西省", "太原市", "娄烦县"], "status": "active", "sort": 1637, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "1b1e27ce-1e70-4ea4-a7e0-53e7fc0c42fe", "_rev": "2-6c6d05162ebcb4eb024f5842ed7eb90d", "type": "region", "code": "360483", "name": "庐山市", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "1b1e27ce-1e70-4ea4-a7e0-53e7fc0c42fe"], "path_name": ["中国", "江西省", "九江市", "庐山市"], "status": "active", "sort": 1645, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "1df14b85-8bd6-45ee-a793-8fdb12838e45", "_rev": "2-2b41090b284db0d8d14cc3cdf71e8a75", "type": "region", "code": "430203", "name": "芦淞区", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "1df14b85-8bd6-45ee-a793-8fdb12838e45"], "path_name": ["中国", "湖南省", "株洲市", "芦淞区"], "status": "active", "sort": 1642, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "26c51912-7c48-4086-aaa6-403734eab23f", "_rev": "2-4aced39570ae398ea622f56ccc42bdf1", "type": "region", "code": "511826", "name": "芦山县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "26c51912-7c48-4086-aaa6-403734eab23f"], "path_name": ["中国", "四川省", "雅安市", "芦山县"], "status": "active", "sort": 1641, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "629699f9-e9b7-4082-b030-4a625bb8c2e3", "_rev": "2-c46137fdae098a0c80d18355ac92d802", "type": "region", "code": "340124", "name": "庐江县", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "629699f9-e9b7-4082-b030-4a625bb8c2e3"], "path_name": ["中国", "安徽省", "合肥市", "庐江县"], "status": "active", "sort": 1644, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "6ef720d6-8166-4150-9d94-c3556ab76792", "_rev": "2-2d6eeef9d2599c9862ff4053f0f6108e", "type": "region", "code": "411224", "name": "卢氏县", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "6ef720d6-8166-4150-9d94-c3556ab76792"], "path_name": ["中国", "河南省", "三门峡市", "卢氏县"], "status": "active", "sort": 1640, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "7073298b-160b-4708-b04f-95c97c4de0a2", "_rev": "2-c911b3ee50715cc75dedb40f98b3cf6a", "type": "region", "code": "360323", "name": "芦溪县", "parent_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "7073298b-160b-4708-b04f-95c97c4de0a2"], "path_name": ["中国", "江西省", "萍乡市", "芦溪县"], "status": "active", "sort": 1643, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "778b7ffc-75d8-4649-b40a-533edc1e0761", "_rev": "2-4fc1138daa90b77d29234c5479c6bf3a", "type": "region", "code": "130324", "name": "卢龙县", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "778b7ffc-75d8-4649-b40a-533edc1e0761"], "path_name": ["中国", "河北省", "秦皇岛市", "卢龙县"], "status": "active", "sort": 1639, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "7d0c14d8-888d-4405-99a5-1cf294cee76f", "_rev": "2-21036eb22fbe8a1b5b0c297464a1ebb5", "type": "region", "code": "621122", "name": "陇西县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "7d0c14d8-888d-4405-99a5-1cf294cee76f"], "path_name": ["中国", "甘肃省", "定西市", "陇西县"], "status": "active", "sort": 1635, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "f2c689e7-f982-40da-b9f6-418f4b39a5a3", "_rev": "2-be5ea68a613603872c4b13c349ccfa36", "type": "region", "code": "431302", "name": "娄星区", "parent_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "f2c689e7-f982-40da-b9f6-418f4b39a5a3"], "path_name": ["中国", "湖南省", "娄底市", "娄星区"], "status": "active", "sort": 1638, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:55"} +{"_id": "0a31bd9d-2c43-427d-a5c4-f2770bd14a9f", "_rev": "2-20c2bd4e55c125bf21945bed6e776a25", "type": "region", "code": "433122", "name": "泸溪县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "0a31bd9d-2c43-427d-a5c4-f2770bd14a9f"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "泸溪县"], "status": "active", "sort": 1651, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "18ddaa44-2edb-4c78-9fb4-bd50926115fa", "_rev": "2-5b91b7b3a59ea927607d28b0274288e5", "type": "region", "code": "410423", "name": "鲁山县", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "18ddaa44-2edb-4c78-9fb4-bd50926115fa"], "path_name": ["中国", "河南省", "平顶山市", "鲁山县"], "status": "active", "sort": 1654, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "2c81638d-b526-4f5a-a6e8-c0aedfad1e75", "_rev": "2-8c3f507cba5f0c47aec436b644a89254", "type": "region", "code": "441581", "name": "陆丰市", "parent_id": "eafc0190-06e6-4b93-b74a-35161879139a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "eafc0190-06e6-4b93-b74a-35161879139a", "2c81638d-b526-4f5a-a6e8-c0aedfad1e75"], "path_name": ["中国", "广东省", "汕尾市", "陆丰市"], "status": "active", "sort": 1656, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "389c240d-3e42-45ee-9f3a-032d5466bfd8", "_rev": "2-a6a3980cd99558527d33659409752a5d", "type": "region", "code": "513322", "name": "泸定县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "389c240d-3e42-45ee-9f3a-032d5466bfd8"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "泸定县"], "status": "active", "sort": 1648, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "3ba05e92-debb-42b9-a2b0-befae947dec2", "_rev": "2-250283c6459d3505a023d3654df1c5da", "type": "region", "code": "513327", "name": "炉霍县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "3ba05e92-debb-42b9-a2b0-befae947dec2"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "炉霍县"], "status": "active", "sort": 1647, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "50481263-fd75-415c-9141-7b4daf37598a", "_rev": "2-d67f3e2de19f8e81d875c7337c0a50e9", "type": "region", "code": "510521", "name": "泸县", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "50481263-fd75-415c-9141-7b4daf37598a"], "path_name": ["中国", "四川省", "泸州市", "泸县"], "status": "active", "sort": 1652, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "741cd96a-7120-4816-ad3f-155071ee57fb", "_rev": "2-1c4164a616a95dff96a7344d7819234e", "type": "region", "code": "450922", "name": "陆川县", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "741cd96a-7120-4816-ad3f-155071ee57fb"], "path_name": ["中国", "广西壮族自治区", "玉林市", "陆川县"], "status": "active", "sort": 1655, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "8487a4ef-6231-47f1-9983-9e39e7e30f4b", "_rev": "2-196d0e78c579d02ab71290d1f65db265", "type": "region", "code": "441523", "name": "陆河县", "parent_id": "eafc0190-06e6-4b93-b74a-35161879139a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "eafc0190-06e6-4b93-b74a-35161879139a", "8487a4ef-6231-47f1-9983-9e39e7e30f4b"], "path_name": ["中国", "广东省", "汕尾市", "陆河县"], "status": "active", "sort": 1657, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "897acd67-c0c0-4012-9b21-c8914f7522ec", "_rev": "2-f2b23f962c380f1ac640f6917e6f17f0", "type": "region", "code": "340103", "name": "庐阳区", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "897acd67-c0c0-4012-9b21-c8914f7522ec"], "path_name": ["中国", "安徽省", "合肥市", "庐阳区"], "status": "active", "sort": 1646, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "be7d1433-b102-45ff-a1f1-6a3283281918", "_rev": "2-8f2557d6ca7e6b63ba5310f8ea4103cc", "type": "region", "code": "532527", "name": "泸西县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "be7d1433-b102-45ff-a1f1-6a3283281918"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "泸西县"], "status": "active", "sort": 1650, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "d42df86d-87c6-4b9b-9852-982da8d054b7", "_rev": "2-d25f478e22365af40a22ed99592cb0e6", "type": "region", "code": "530621", "name": "鲁甸县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "d42df86d-87c6-4b9b-9852-982da8d054b7"], "path_name": ["中国", "云南省", "昭通市", "鲁甸县"], "status": "active", "sort": 1653, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "fffc2b9c-c0fd-49ad-8b26-12d3206ca728", "_rev": "2-29ef7af2dff6840b6f4008a5ee9a91dc", "type": "region", "code": "533301", "name": "泸水市", "parent_id": "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "30dc7eb5-84bc-4ab9-aa52-bc9da4b62609", "fffc2b9c-c0fd-49ad-8b26-12d3206ca728"], "path_name": ["中国", "云南省", "怒江傈僳族自治州", "泸水市"], "status": "active", "sort": 1649, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:56"} +{"_id": "5a4c75cf-3cf2-4c8c-bb59-9f5a572da5b3", "_rev": "2-e63fdee012aa5ed564dba23f82957f84", "type": "region", "code": "530322", "name": "陆良县", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "5a4c75cf-3cf2-4c8c-bb59-9f5a572da5b3"], "path_name": ["中国", "云南省", "曲靖市", "陆良县"], "status": "active", "sort": 1658, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "62494037-41de-4f6f-83b2-c8fcb22bf8b9", "_rev": "2-ac9f92ad7314474a493459f0a3cb9f54", "type": "region", "code": "130110", "name": "鹿泉区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "62494037-41de-4f6f-83b2-c8fcb22bf8b9"], "path_name": ["中国", "河北省", "石家庄市", "鹿泉区"], "status": "active", "sort": 1660, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "64237732-59f0-467f-9347-a2910986463b", "_rev": "2-276676cca3081e59f46c10a8de6a26e1", "type": "region", "code": "450223", "name": "鹿寨县", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "64237732-59f0-467f-9347-a2910986463b"], "path_name": ["中国", "广西壮族自治区", "柳州市", "鹿寨县"], "status": "active", "sort": 1662, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "89896c90-cca1-49fb-8837-cda04dab725c", "_rev": "2-c5dbcb6056776a70b9175c9d14da3384", "type": "region", "code": "330302", "name": "鹿城区", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "89896c90-cca1-49fb-8837-cda04dab725c"], "path_name": ["中国", "浙江省", "温州市", "鹿城区"], "status": "active", "sort": 1659, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "a3bb3ce7-dc3e-46a0-b21d-64b858a6e650", "_rev": "2-691aa6ee1a619ff3b51988d1aa73577d", "type": "region", "code": "411628", "name": "鹿邑县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "a3bb3ce7-dc3e-46a0-b21d-64b858a6e650"], "path_name": ["中国", "河南省", "周口市", "鹿邑县"], "status": "active", "sort": 1661, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "b5e5f8c7-7d76-4fd9-9e42-f1b8d03b75db", "_rev": "2-ec84670e9a9bab7b262870c263e3b3b4", "type": "region", "code": "430212", "name": "渌口区", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "b5e5f8c7-7d76-4fd9-9e42-f1b8d03b75db"], "path_name": ["中国", "湖南省", "株洲市", "渌口区"], "status": "active", "sort": 1663, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:57"} +{"_id": "118ea62e-c56b-45b7-a818-7df288136059", "_rev": "2-7fe3c91723704e47f1b9d9fcc863bfba", "type": "region", "code": "140406", "name": "潞城区", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "118ea62e-c56b-45b7-a818-7df288136059"], "path_name": ["中国", "山西省", "长治市", "潞城区"], "status": "active", "sort": 1670, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "33f8d43f-fdbe-4ae0-8966-9e452b8c106d", "_rev": "2-58d2819b1103a8a50ebff090a45877ec", "type": "region", "code": "623026", "name": "碌曲县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "33f8d43f-fdbe-4ae0-8966-9e452b8c106d"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "碌曲县"], "status": "active", "sort": 1666, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "476bc539-6b59-4e2c-ab68-f59161a2b878", "_rev": "2-841944daac5bc39b7f089da8d0098854", "type": "region", "code": "130203", "name": "路北区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "476bc539-6b59-4e2c-ab68-f59161a2b878"], "path_name": ["中国", "河北省", "唐山市", "路北区"], "status": "active", "sort": 1667, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "5c683fc9-f1ac-41ce-b6f0-8540162d1d94", "_rev": "2-80253edbe931a0a6d1b167c50fb66474", "type": "region", "code": "530128", "name": "禄劝彝族苗族自治县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "5c683fc9-f1ac-41ce-b6f0-8540162d1d94"], "path_name": ["中国", "云南省", "昆明市", "禄劝彝族苗族自治县"], "status": "active", "sort": 1665, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "6fdd38dc-b326-441e-99b3-3dbcf5ab6a5e", "_rev": "2-35755ec1e5984bc87cf9af148719365e", "type": "region", "code": "410324", "name": "栾川县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "6fdd38dc-b326-441e-99b3-3dbcf5ab6a5e"], "path_name": ["中国", "河南省", "洛阳市", "栾川县"], "status": "active", "sort": 1673, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "7d85543a-04c4-408d-9cad-f829e28ca10d", "_rev": "2-23ef4fb45502bb6803e36939fd1d6369", "type": "region", "code": "331004", "name": "路桥区", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "7d85543a-04c4-408d-9cad-f829e28ca10d"], "path_name": ["中国", "浙江省", "台州市", "路桥区"], "status": "active", "sort": 1669, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "896c519f-c48c-452d-961b-17f52408def7", "_rev": "2-36a229e8879636d7731568d21aa20098", "type": "region", "code": "130202", "name": "路南区", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "896c519f-c48c-452d-961b-17f52408def7"], "path_name": ["中国", "河北省", "唐山市", "路南区"], "status": "active", "sort": 1668, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "95b3cda4-7762-40a2-b960-062fd7ef1c8d", "_rev": "2-c3291d7968f040bac6d129f2d2cfe699", "type": "region", "code": "140403", "name": "潞州区", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "95b3cda4-7762-40a2-b960-062fd7ef1c8d"], "path_name": ["中国", "山西省", "长治市", "潞州区"], "status": "active", "sort": 1671, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "d814c964-5161-435d-a257-2eae42bb2d54", "_rev": "2-f3d6fc8af503ba1e98378fbdf3b11da3", "type": "region", "code": "130111", "name": "栾城区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "d814c964-5161-435d-a257-2eae42bb2d54"], "path_name": ["中国", "河北省", "石家庄市", "栾城区"], "status": "active", "sort": 1672, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "ebe86dfa-5951-440e-a069-57872224a1f3", "_rev": "2-357df54baa41db4fa3c4231a5b9969e3", "type": "region", "code": "532302", "name": "禄丰市", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "ebe86dfa-5951-440e-a069-57872224a1f3"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "禄丰市"], "status": "active", "sort": 1664, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:58"} +{"_id": "0f2492f6-57c9-42dc-9d26-6cb836579625", "_rev": "2-d62f545db31e2c9bfb149010cafc6577", "type": "region", "code": "445381", "name": "罗定市", "parent_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "0f2492f6-57c9-42dc-9d26-6cb836579625"], "path_name": ["中国", "广东省", "云浮市", "罗定市"], "status": "active", "sort": 1681, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "3bc01fd6-d5f8-4860-b48a-4fec8033d7e4", "_rev": "2-a3aac3cbd0dc81f32908aa62bc3acede", "type": "region", "code": "652822", "name": "轮台县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "3bc01fd6-d5f8-4860-b48a-4fec8033d7e4"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "轮台县"], "status": "active", "sort": 1677, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "46c3bbc7-98f6-488b-b3d0-139a3cdc138d", "_rev": "2-5268c57210221fc4e83ed45080543c4f", "type": "region", "code": "130284", "name": "滦州市", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "46c3bbc7-98f6-488b-b3d0-139a3cdc138d"], "path_name": ["中国", "河北省", "唐山市", "滦州市"], "status": "active", "sort": 1676, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "66b637f0-473a-4a1f-9744-6014da667da3", "_rev": "2-9c7b21209473f3ad380f97a192a7fa31", "type": "region", "code": "510604", "name": "罗江区", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "66b637f0-473a-4a1f-9744-6014da667da3"], "path_name": ["中国", "四川省", "德阳市", "罗江区"], "status": "active", "sort": 1683, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "6b5920ad-de46-4aea-bc17-c1a402c85163", "_rev": "2-625342e31cb764b697174bbd8f7da192", "type": "region", "code": "440303", "name": "罗湖区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "6b5920ad-de46-4aea-bc17-c1a402c85163"], "path_name": ["中国", "广东省", "深圳市", "罗湖区"], "status": "active", "sort": 1682, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "_rev": "2-21f76ebad282c93acbd724e6b60864d1", "type": "region", "code": "445300", "name": "云浮市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de"], "path_name": ["中国", "广东省", "云浮市"], "status": "active", "sort": 1680, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "8503886f-9195-4b67-a7de-0ac6b2588690", "_rev": "2-b12d5df89cd5167e37178dd41ef105e1", "type": "region", "code": "130224", "name": "滦南县", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "8503886f-9195-4b67-a7de-0ac6b2588690"], "path_name": ["中国", "河北省", "唐山市", "滦南县"], "status": "active", "sort": 1674, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "a12fc134-294b-423a-9bd3-960632460ba7", "_rev": "2-ec80970e52b92021bfdebaedef9e93b6", "type": "region", "code": "451225", "name": "罗城仫佬族自治县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "a12fc134-294b-423a-9bd3-960632460ba7"], "path_name": ["中国", "广西壮族自治区", "河池市", "罗城仫佬族自治县"], "status": "active", "sort": 1678, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "ed0e62bd-984a-4c62-8647-2490c57e7ff0", "_rev": "2-5e87eb8aa1da5905f3c41dfe8fdf98ba", "type": "region", "code": "522728", "name": "罗甸县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "ed0e62bd-984a-4c62-8647-2490c57e7ff0"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "罗甸县"], "status": "active", "sort": 1679, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "f1054292-fac7-40e7-bae8-086240cc2eeb", "_rev": "2-28df5cb38856c2504211faca7fdc51d4", "type": "region", "code": "130824", "name": "滦平县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "f1054292-fac7-40e7-bae8-086240cc2eeb"], "path_name": ["中国", "河北省", "承德市", "滦平县"], "status": "active", "sort": 1675, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:01:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:01:59"} +{"_id": "054adc41-8c30-4c5a-89a8-ac76ba99e688", "_rev": "2-de51eab6c28ac0c49d96970ec3e67292", "type": "region", "code": "410328", "name": "洛宁县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "054adc41-8c30-4c5a-89a8-ac76ba99e688"], "path_name": ["中国", "河南省", "洛阳市", "洛宁县"], "status": "active", "sort": 1694, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "0f2bebb2-a4af-4b1f-9c79-000be1dc9c65", "_rev": "2-ee0d3119d3183c4c701386fb8bb80074", "type": "region", "code": "410311", "name": "洛龙区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "0f2bebb2-a4af-4b1f-9c79-000be1dc9c65"], "path_name": ["中国", "河南省", "洛阳市", "洛龙区"], "status": "active", "sort": 1691, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "4bd37b0b-8fbd-43d2-9a04-d3429af071ea", "_rev": "2-74033590e4f76d35351c84cc9b146531", "type": "region", "code": "350504", "name": "洛江区", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "4bd37b0b-8fbd-43d2-9a04-d3429af071ea"], "path_name": ["中国", "福建省", "泉州市", "洛江区"], "status": "active", "sort": 1690, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "64fd9c63-39c1-406e-b36d-e87ad6405f1b", "_rev": "2-2eb574a440488315c436fd69a52ff732", "type": "region", "code": "611021", "name": "洛南县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "64fd9c63-39c1-406e-b36d-e87ad6405f1b"], "path_name": ["中国", "陕西省", "商洛市", "洛南县"], "status": "active", "sort": 1693, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "6849e25f-b363-467b-8b66-d900760bf705", "_rev": "2-2086990f07ae65faa1a94c589b3da151", "type": "region", "code": "371311", "name": "罗庄区", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "6849e25f-b363-467b-8b66-d900760bf705"], "path_name": ["中国", "山东省", "临沂市", "罗庄区"], "status": "active", "sort": 1688, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "a6bdd80c-0659-461c-acdf-68c9b0a24e06", "_rev": "2-e107abaa1d0ece1dbf8fc3e7517cfbc2", "type": "region", "code": "411521", "name": "罗山县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "a6bdd80c-0659-461c-acdf-68c9b0a24e06"], "path_name": ["中国", "河南省", "信阳市", "罗山县"], "status": "active", "sort": 1685, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "a7aa66a4-79c3-4b99-8fe8-83e017e859be", "_rev": "2-aa01cd74ce3b08573901d866aac41092", "type": "region", "code": "530324", "name": "罗平县", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "a7aa66a4-79c3-4b99-8fe8-83e017e859be"], "path_name": ["中国", "云南省", "曲靖市", "罗平县"], "status": "active", "sort": 1684, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "ced190e5-bbf2-4b3a-8a04-7e6ff295412a", "_rev": "2-1dae03a562b46e3705afe727f81ac8e5", "type": "region", "code": "610629", "name": "洛川县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "ced190e5-bbf2-4b3a-8a04-7e6ff295412a"], "path_name": ["中国", "陕西省", "延安市", "洛川县"], "status": "active", "sort": 1689, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "cf4e1a18-0f5e-48e7-83f0-16c7cc9f07c9", "_rev": "2-eb46d43844bf33e9c5c076bcfc2c5717", "type": "region", "code": "421123", "name": "罗田县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "cf4e1a18-0f5e-48e7-83f0-16c7cc9f07c9"], "path_name": ["中国", "湖北省", "黄冈市", "罗田县"], "status": "active", "sort": 1686, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "e4e2c400-3393-465e-beae-895a7115468f", "_rev": "2-e0cdbc62be13612159f1ad2e0eb271d8", "type": "region", "code": "350123", "name": "罗源县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "e4e2c400-3393-465e-beae-895a7115468f"], "path_name": ["中国", "福建省", "福州市", "罗源县"], "status": "active", "sort": 1687, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "fcb861fe-7007-41c9-98d0-c123ec7fda56", "_rev": "2-9b06e31be7628b421186805ca872a0c0", "type": "region", "code": "540329", "name": "洛隆县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "fcb861fe-7007-41c9-98d0-c123ec7fda56"], "path_name": ["中国", "西藏自治区", "昌都市", "洛隆县"], "status": "active", "sort": 1692, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:00"} +{"_id": "07e6e3b0-f78c-4b8c-abc7-e1bbe643ae3d", "_rev": "2-78ead2ac75c4229390318b7dc1634064", "type": "region", "code": "421181", "name": "麻城市", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "07e6e3b0-f78c-4b8c-abc7-e1bbe643ae3d"], "path_name": ["中国", "湖北省", "黄冈市", "麻城市"], "status": "active", "sort": 1701, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "122332c4-e9d0-4d34-9efe-1d189cb7bb0e", "_rev": "2-7475b673ce0a8184a6fdef21b081e6fd", "type": "region", "code": "540527", "name": "洛扎县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "122332c4-e9d0-4d34-9efe-1d189cb7bb0e"], "path_name": ["中国", "西藏自治区", "山南市", "洛扎县"], "status": "active", "sort": 1696, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "3ea26cf4-1040-44e1-9986-a95b68e1c23f", "_rev": "2-5c9232879dfd507c2a8efca85791d364", "type": "region", "code": "532531", "name": "绿春县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "3ea26cf4-1040-44e1-9986-a95b68e1c23f"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "绿春县"], "status": "active", "sort": 1698, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "5ed7634b-014c-41e3-b06b-d963f216474d", "_rev": "2-7324135bc7683bc168c97fe2d20f5027", "type": "region", "code": "532624", "name": "麻栗坡县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "5ed7634b-014c-41e3-b06b-d963f216474d"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "麻栗坡县"], "status": "active", "sort": 1703, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "6e100d72-ec46-4b4a-87ad-d65e6442d979", "_rev": "2-89a0bcec035a625484e65bcb768ecdf7", "type": "region", "code": "522635", "name": "麻江县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "6e100d72-ec46-4b4a-87ad-d65e6442d979"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "麻江县"], "status": "active", "sort": 1702, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "78f005f4-1a51-4bc0-aeff-5a9c337c80a4", "_rev": "2-b075875f8d46c9dcb691045b9f66d92a", "type": "region", "code": "610727", "name": "略阳县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "78f005f4-1a51-4bc0-aeff-5a9c337c80a4"], "path_name": ["中国", "陕西省", "汉中市", "略阳县"], "status": "active", "sort": 1700, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "9ed27d02-5d4c-46eb-8bbf-8f0485680b74", "_rev": "2-eca40d7b00ed19875307dfe61725d8b1", "type": "region", "code": "431226", "name": "麻阳苗族自治县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "9ed27d02-5d4c-46eb-8bbf-8f0485680b74"], "path_name": ["中国", "湖南省", "怀化市", "麻阳苗族自治县"], "status": "active", "sort": 1705, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "b7465992-f210-4e5e-a567-cb066620c71b", "_rev": "2-7dca5be26c384a7d3ad092a9d12c9450", "type": "region", "code": "220106", "name": "绿园区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "b7465992-f210-4e5e-a567-cb066620c71b"], "path_name": ["中国", "吉林省", "长春市", "绿园区"], "status": "active", "sort": 1699, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "b9d664d7-aa54-4131-8bbd-77b8b6d07a25", "_rev": "2-0248a86d4058a14f09fab607683b3eaa", "type": "region", "code": "210212", "name": "旅顺口区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "b9d664d7-aa54-4131-8bbd-77b8b6d07a25"], "path_name": ["中国", "辽宁省", "大连市", "旅顺口区"], "status": "active", "sort": 1697, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "e17a03f3-a6ea-44c2-bf94-3951f163693f", "_rev": "2-48371ba4736c092cbe28684a203277e8", "type": "region", "code": "230307", "name": "麻山区", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "e17a03f3-a6ea-44c2-bf94-3951f163693f"], "path_name": ["中国", "黑龙江省", "鸡西市", "麻山区"], "status": "active", "sort": 1704, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "f702790c-35e0-4f64-a07a-d34f974e60d7", "_rev": "2-df8494d6f40658754a9b7c150e7bb3ea", "type": "region", "code": "653224", "name": "洛浦县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "f702790c-35e0-4f64-a07a-d34f974e60d7"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "洛浦县"], "status": "active", "sort": 1695, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:01"} +{"_id": "144c7aee-5391-4ef3-a95a-a805555adc1e", "_rev": "2-e5c1c1186f989fec887a8a5af5bd2a85", "type": "region", "code": "440811", "name": "麻章区", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "144c7aee-5391-4ef3-a95a-a805555adc1e"], "path_name": ["中国", "广东省", "湛江市", "麻章区"], "status": "active", "sort": 1706, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "484489f1-3f5c-4301-90a7-fc3042810178", "_rev": "2-67047a7bf65d8ab30e30a7bb745f7601", "type": "region", "code": "350105", "name": "马尾区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "484489f1-3f5c-4301-90a7-fc3042810178"], "path_name": ["中国", "福建省", "福州市", "马尾区"], "status": "active", "sort": 1713, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "578adb77-63ff-421a-8294-f50a058de5ee", "_rev": "2-5d953250149bf6f6393348dc3e367c86", "type": "region", "code": "530304", "name": "马龙区", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "578adb77-63ff-421a-8294-f50a058de5ee"], "path_name": ["中国", "云南省", "曲靖市", "马龙区"], "status": "active", "sort": 1711, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "8fefe598-1d53-4090-9c88-1a783cd5dcb6", "_rev": "2-3595cd655487f39f047e73ffcef3c2a9", "type": "region", "code": "410804", "name": "马村区", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "8fefe598-1d53-4090-9c88-1a783cd5dcb6"], "path_name": ["中国", "河南省", "焦作市", "马村区"], "status": "active", "sort": 1708, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "ae77329a-bb0f-437d-b61d-12117a69741b", "_rev": "2-a279a7692e8af3428ea15f557dcde501", "type": "region", "code": "511133", "name": "马边彝族自治县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "ae77329a-bb0f-437d-b61d-12117a69741b"], "path_name": ["中国", "四川省", "乐山市", "马边彝族自治县"], "status": "active", "sort": 1707, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "af177676-9b07-49f8-a212-27573df09634", "_rev": "2-8f40273af9e5e1361ab4dc8d40f84f94", "type": "region", "code": "632626", "name": "玛多县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "af177676-9b07-49f8-a212-27573df09634"], "path_name": ["中国", "青海省", "果洛藏族自治州", "玛多县"], "status": "active", "sort": 1714, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "b3fcc90f-522b-4677-a37b-0b9f37431aaa", "_rev": "2-31f0d765be12f9c6530624f1a80a048c", "type": "region", "code": "532625", "name": "马关县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "b3fcc90f-522b-4677-a37b-0b9f37431aaa"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "马关县"], "status": "active", "sort": 1710, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "c126a98c-6724-47ab-b992-41da89d6f569", "_rev": "2-fd13d2fc83f82003d2712784d4f62b17", "type": "region", "code": "513201", "name": "马尔康市", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "c126a98c-6724-47ab-b992-41da89d6f569"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "马尔康市"], "status": "active", "sort": 1709, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "f10ab18e-4fc3-4f33-b4c2-59396cda5a81", "_rev": "2-6f14010b2e5319b63a53f4271e73e84a", "type": "region", "code": "652324", "name": "玛纳斯县", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "f10ab18e-4fc3-4f33-b4c2-59396cda5a81"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "玛纳斯县"], "status": "active", "sort": 1715, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "f4f434ec-eff7-40ff-8cbb-838b47e2dbf7", "_rev": "2-dec35d2dc3846a783bad81704c1419b3", "type": "region", "code": "450124", "name": "马山县", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "f4f434ec-eff7-40ff-8cbb-838b47e2dbf7"], "path_name": ["中国", "广西壮族自治区", "南宁市", "马山县"], "status": "active", "sort": 1712, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:02"} +{"_id": "0db8e132-9191-48f6-ab14-f5e9fd4e84d7", "_rev": "2-04ca0d28ad4c823351ae299b45708ec9", "type": "region", "code": "620503", "name": "麦积区", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "0db8e132-9191-48f6-ab14-f5e9fd4e84d7"], "path_name": ["中国", "甘肃省", "天水市", "麦积区"], "status": "active", "sort": 1719, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "120b62f4-665d-4678-b007-e888766d50ce", "_rev": "2-f13a9c4014df86ea3acfc5bf48e1f294", "type": "region", "code": "130607", "name": "满城区", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "120b62f4-665d-4678-b007-e888766d50ce"], "path_name": ["中国", "河北省", "保定市", "满城区"], "status": "active", "sort": 1720, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "37cf6e0a-1890-43fc-9616-1136db8069bb", "_rev": "2-5aa586b23d981260fcf9ef322cb423e0", "type": "region", "code": "533103", "name": "芒市", "parent_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c", "37cf6e0a-1890-43fc-9616-1136db8069bb"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州", "芒市"], "status": "active", "sort": 1723, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "3ea32371-97c3-48f2-a43c-71da3e414877", "_rev": "2-ab0a4ccd27b20a84658fbf663541c611", "type": "region", "code": "632621", "name": "玛沁县", "parent_id": "3b6731fb-b177-4565-8e30-2489c1dd38b0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3b6731fb-b177-4565-8e30-2489c1dd38b0", "3ea32371-97c3-48f2-a43c-71da3e414877"], "path_name": ["中国", "青海省", "果洛藏族自治州", "玛沁县"], "status": "active", "sort": 1716, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "4b61d808-6bfb-49fd-b290-50dd2f6694c8", "_rev": "2-93fbe09d99753b83f6ebcb72f1f24958", "type": "region", "code": "632803", "name": "茫崖市", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "4b61d808-6bfb-49fd-b290-50dd2f6694c8"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "茫崖市"], "status": "active", "sort": 1724, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "634e4cef-87ab-4f9c-bd43-9c242e2f2132", "_rev": "2-43b742f6452aae62136ce01d3d6f12d2", "type": "region", "code": "623025", "name": "玛曲县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "634e4cef-87ab-4f9c-bd43-9c242e2f2132"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "玛曲县"], "status": "active", "sort": 1717, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "8c6a3495-d98b-4b86-962b-45bd204d5f49", "_rev": "2-ade46259622002480c23e67b729e89a6", "type": "region", "code": "653127", "name": "麦盖提县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "8c6a3495-d98b-4b86-962b-45bd204d5f49"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "麦盖提县"], "status": "active", "sort": 1718, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "bdada95a-0448-4091-9af6-08477dcc31eb", "_rev": "2-6a344874ff1bd6deb16cdea9c9d9b439", "type": "region", "code": "150781", "name": "满洲里市", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "bdada95a-0448-4091-9af6-08477dcc31eb"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "满洲里市"], "status": "active", "sort": 1721, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "f3aedd89-c2d6-4081-a0eb-57cf5a9ff4d3", "_rev": "2-314d9ee9b082782a739e50b6bb745deb", "type": "region", "code": "540328", "name": "芒康县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "f3aedd89-c2d6-4081-a0eb-57cf5a9ff4d3"], "path_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "status": "active", "sort": 1722, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:03"} +{"_id": "1ba87082-e5e8-48d3-bff6-1ff9eba45196", "_rev": "2-75c3963a041f1e231be6bfec686e6444", "type": "region", "code": "520328", "name": "湄潭县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "1ba87082-e5e8-48d3-bff6-1ff9eba45196"], "path_name": ["中国", "贵州省", "遵义市", "湄潭县"], "status": "active", "sort": 1733, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "1e0db2dc-7eee-458c-b06c-e22fd43c870b", "_rev": "2-4b13070af3e24ab084d82ff2aa065d47", "type": "region", "code": "513436", "name": "美姑县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "1e0db2dc-7eee-458c-b06c-e22fd43c870b"], "path_name": ["中国", "四川省", "凉山彝族自治州", "美姑县"], "status": "active", "sort": 1734, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "2e61cb86-367f-4d6f-b8de-d5382c134bc8", "_rev": "2-0a2c3a3baf54c53d4e40326b10a58ab8", "type": "region", "code": "513223", "name": "茂县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "2e61cb86-367f-4d6f-b8de-d5382c134bc8"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "茂县"], "status": "active", "sort": 1727, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "2f648b12-b4ee-449b-8228-4de39052246c", "_rev": "2-ba782c0716ae8358eaaa36b0eb733bac", "type": "region", "code": "230208", "name": "梅里斯达斡尔族区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "2f648b12-b4ee-449b-8228-4de39052246c"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "梅里斯达斡尔族区"], "status": "active", "sort": 1731, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "43c3a5e4-c3d8-4208-a958-2652d025056d", "_rev": "2-31421cfaf2d3fd24af3f8efba538aed2", "type": "region", "code": "610326", "name": "眉县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "43c3a5e4-c3d8-4208-a958-2652d025056d"], "path_name": ["中国", "陕西省", "宝鸡市", "眉县"], "status": "active", "sort": 1728, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "5ac96df4-e0bf-475e-8b7c-a6080f3741b7", "_rev": "2-9d845f5ac7b78f08763f7dc7fb2f4614", "type": "region", "code": "440902", "name": "茂南区", "parent_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "5ac96df4-e0bf-475e-8b7c-a6080f3741b7"], "path_name": ["中国", "广东省", "茂名市", "茂南区"], "status": "active", "sort": 1726, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "6b41f7a0-9397-49ee-81e2-adbe7389a378", "_rev": "2-32a64fa8d465fe70c80b7a4c1eef5588", "type": "region", "code": "220581", "name": "梅河口市", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "6b41f7a0-9397-49ee-81e2-adbe7389a378"], "path_name": ["中国", "吉林省", "通化市", "梅河口市"], "status": "active", "sort": 1729, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "76104279-ca29-427a-9cd6-f10e1400b1b4", "_rev": "2-24d7a88026d5e3640019a28ad7ea9ad0", "type": "region", "code": "441403", "name": "梅县区", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "76104279-ca29-427a-9cd6-f10e1400b1b4"], "path_name": ["中国", "广东省", "梅州市", "梅县区"], "status": "active", "sort": 1732, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "ad596f2f-1797-45a7-8b7a-afb759a70d8c", "_rev": "2-e1ea2d279b6f943cbe62ee626566acdd", "type": "region", "code": "441402", "name": "梅江区", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "ad596f2f-1797-45a7-8b7a-afb759a70d8c"], "path_name": ["中国", "广东省", "梅州市", "梅江区"], "status": "active", "sort": 1730, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "e82abce0-f17c-4895-b493-82fb50e53eda", "_rev": "2-64628f54285bbe57751e9589b912a1aa", "type": "region", "code": "420302", "name": "茅箭区", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "e82abce0-f17c-4895-b493-82fb50e53eda"], "path_name": ["中国", "湖北省", "十堰市", "茅箭区"], "status": "active", "sort": 1725, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:04"} +{"_id": "1e99fb0b-62cd-4adf-a6e2-5bf91caedb2d", "_rev": "2-ca52a2f6c30235d9b9d4ba9f2d3afe1d", "type": "region", "code": "341622", "name": "蒙城县", "parent_id": "32858a4f-58fe-4415-bbf3-22718a25b966", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "32858a4f-58fe-4415-bbf3-22718a25b966", "1e99fb0b-62cd-4adf-a6e2-5bf91caedb2d"], "path_name": ["中国", "安徽省", "亳州市", "蒙城县"], "status": "active", "sort": 1738, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "1fcc63a1-2958-4889-b5be-d27b152f137f", "_rev": "2-4349aa49515c3b3fb6311753e5a07949", "type": "region", "code": "532822", "name": "勐海县", "parent_id": "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "1fcc63a1-2958-4889-b5be-d27b152f137f"], "path_name": ["中国", "云南省", "西双版纳傣族自治州", "勐海县"], "status": "active", "sort": 1742, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "23c472be-a10e-4b6f-af22-2f4bfb957218", "_rev": "2-cc0ba11ae0eac9d18e94f57956726285", "type": "region", "code": "460108", "name": "美兰区", "parent_id": "47252588-5858-42d8-b06b-be7953896c75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "47252588-5858-42d8-b06b-be7953896c75", "23c472be-a10e-4b6f-af22-2f4bfb957218"], "path_name": ["中国", "海南省", "海口市", "美兰区"], "status": "active", "sort": 1735, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "3cadcce0-a664-41db-a626-e53e09082cc7", "_rev": "2-127ebaaf75e5aec12157b7fac2519e87", "type": "region", "code": "371328", "name": "蒙阴县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "3cadcce0-a664-41db-a626-e53e09082cc7"], "path_name": ["中国", "山东省", "临沂市", "蒙阴县"], "status": "active", "sort": 1740, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "5408d8e0-fd77-4ba9-b3d9-2494815743f1", "_rev": "2-df63bf30d257851261ee8b902698f98f", "type": "region", "code": "450423", "name": "蒙山县", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "5408d8e0-fd77-4ba9-b3d9-2494815743f1"], "path_name": ["中国", "广西壮族自治区", "梧州市", "蒙山县"], "status": "active", "sort": 1739, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "ac228a1e-65d1-44a1-ab79-e3ecca23e879", "_rev": "2-7785b84fdeaba6977abb3549c79b0e64", "type": "region", "code": "532503", "name": "蒙自市", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "ac228a1e-65d1-44a1-ab79-e3ecca23e879"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "蒙自市"], "status": "active", "sort": 1741, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "ad069f05-4547-4777-ad83-397074bd0301", "_rev": "2-dee451326121abf09e1d4e476b9ccda9", "type": "region", "code": "632221", "name": "门源回族自治县", "parent_id": "2bf3b2cb-593a-43d2-8935-ee539787b601", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "2bf3b2cb-593a-43d2-8935-ee539787b601", "ad069f05-4547-4777-ad83-397074bd0301"], "path_name": ["中国", "青海省", "海北藏族自治州", "门源回族自治县"], "status": "active", "sort": 1737, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "ddc2a2d9-395a-4dae-941f-9ca49e26987d", "_rev": "2-7f81abe17dd4873955130e5f00cdfbe0", "type": "region", "code": "130930", "name": "孟村回族自治县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "ddc2a2d9-395a-4dae-941f-9ca49e26987d"], "path_name": ["中国", "河北省", "沧州市", "孟村回族自治县"], "status": "active", "sort": 1744, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "f595bf6c-028c-418e-9044-ca64c45fd6ec", "_rev": "2-867dda3e7aa9db018102b6ede0b261cf", "type": "region", "code": "532823", "name": "勐腊县", "parent_id": "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b7ab4f4e-05ab-478b-8ffe-cdc32bb650d2", "f595bf6c-028c-418e-9044-ca64c45fd6ec"], "path_name": ["中国", "云南省", "西双版纳傣族自治州", "勐腊县"], "status": "active", "sort": 1743, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "fd07467f-240e-4aab-a1e9-8ddd51c93e4f", "_rev": "2-5833a37b41724453f0e61363bb12a328", "type": "region", "code": "110109", "name": "门头沟区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "fd07467f-240e-4aab-a1e9-8ddd51c93e4f"], "path_name": ["中国", "北京市", "门头沟区"], "status": "active", "sort": 1736, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:05"} +{"_id": "02059dd2-752d-43ba-9af5-d6084e015ec3", "_rev": "2-64a922e6de4d582a151058902d8a0d6f", "type": "region", "code": "430681", "name": "汨罗市", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "02059dd2-752d-43ba-9af5-d6084e015ec3"], "path_name": ["中国", "湖南省", "岳阳市", "汨罗市"], "status": "active", "sort": 1754, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "3d035481-d7a7-4869-b30c-a4b029492414", "_rev": "2-50a8f898182fa501fa7a40aaf718ad1e", "type": "region", "code": "540422", "name": "米林县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "3d035481-d7a7-4869-b30c-a4b029492414"], "path_name": ["中国", "西藏自治区", "林芝市", "米林县"], "status": "active", "sort": 1751, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "4389a700-f17f-423e-8364-8724bd9c6870", "_rev": "2-458061e795cea1dfbc5693c886d6d567", "type": "region", "code": "410883", "name": "孟州市", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "4389a700-f17f-423e-8364-8724bd9c6870"], "path_name": ["中国", "河南省", "焦作市", "孟州市"], "status": "active", "sort": 1747, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "72b9040e-e895-4644-b1cb-113a8fa920a1", "_rev": "2-3c7d6430a2f1901568d04bd551c36099", "type": "region", "code": "530827", "name": "孟连傣族拉祜族佤族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "72b9040e-e895-4644-b1cb-113a8fa920a1"], "path_name": ["中国", "云南省", "普洱市", "孟连傣族拉祜族佤族自治县"], "status": "active", "sort": 1746, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "76bfde54-2cbb-4b10-9baa-098f43326340", "_rev": "2-75bcf7bf3c8ab9d35707cd5941f1229e", "type": "region", "code": "532504", "name": "弥勒市", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "76bfde54-2cbb-4b10-9baa-098f43326340"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "弥勒市"], "status": "active", "sort": 1749, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "7da1c81f-9135-4fbb-99a1-acc956695c10", "_rev": "2-bc3e1785dda891f6422b5cd471431e7e", "type": "region", "code": "610827", "name": "米脂县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "7da1c81f-9135-4fbb-99a1-acc956695c10"], "path_name": ["中国", "陕西省", "榆林市", "米脂县"], "status": "active", "sort": 1753, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "84d41721-d1c0-434d-91aa-a37094329514", "_rev": "2-c29d4fc25616ca5faf62b90da1ead370", "type": "region", "code": "411700", "name": "驻马店市", "parent_id": "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514"], "path_name": ["中国", "河南省", "驻马店市"], "status": "active", "sort": 1755, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "a5606012-4b07-4494-a141-dd12c635a0c7", "_rev": "2-3910f0f14fadca9537d03a0272c3e1e3", "type": "region", "code": "410308", "name": "孟津区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "a5606012-4b07-4494-a141-dd12c635a0c7"], "path_name": ["中国", "河南省", "洛阳市", "孟津区"], "status": "active", "sort": 1745, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "c8a611ef-c789-491c-ac0f-1f42dd88baa1", "_rev": "2-29d9ae1cd9eaf40651bdb0b03e452aba", "type": "region", "code": "532925", "name": "弥渡县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "c8a611ef-c789-491c-ac0f-1f42dd88baa1"], "path_name": ["中国", "云南省", "大理白族自治州", "弥渡县"], "status": "active", "sort": 1748, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "ca593384-745b-4675-acf3-46c7cd46a768", "_rev": "2-8bbe53fbe96460713ea5b5608644d870", "type": "region", "code": "510421", "name": "米易县", "parent_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971", "ca593384-745b-4675-acf3-46c7cd46a768"], "path_name": ["中国", "四川省", "攀枝花市", "米易县"], "status": "active", "sort": 1752, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "d5a1d526-594c-4514-ab47-6d18f67abdbd", "_rev": "2-8b0a740c83cfa1fae7a7a26ce2850103", "type": "region", "code": "650109", "name": "米东区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "d5a1d526-594c-4514-ab47-6d18f67abdbd"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "米东区"], "status": "active", "sort": 1750, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:06"} +{"_id": "0457c865-b77a-4e52-9a5a-f462758a0b2e", "_rev": "2-3bed61394f63094ef0bee78aacee9522", "type": "region", "code": "110118", "name": "密云区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "0457c865-b77a-4e52-9a5a-f462758a0b2e"], "path_name": ["中国", "北京市", "密云区"], "status": "active", "sort": 1758, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "09174230-98ba-484f-a744-e284eb44f317", "_rev": "2-13eeebe0cf9fdd83c3851393e98babce", "type": "region", "code": "653227", "name": "民丰县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "09174230-98ba-484f-a744-e284eb44f317"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "民丰县"], "status": "active", "sort": 1763, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "1cbff0d2-5baa-4b3b-bb00-acef967034b9", "_rev": "2-4f0f3a2c4612b4e6d2e28f3d1e55ab25", "type": "region", "code": "411221", "name": "渑池县", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "1cbff0d2-5baa-4b3b-bb00-acef967034b9"], "path_name": ["中国", "河南省", "三门峡市", "渑池县"], "status": "active", "sort": 1762, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "35fd79b6-85a8-4de6-98f6-c99d76dec2e6", "_rev": "2-6f5f9e94c2159ba19bef396d66b978d2", "type": "region", "code": "620722", "name": "民乐县", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "35fd79b6-85a8-4de6-98f6-c99d76dec2e6"], "path_name": ["中国", "甘肃省", "张掖市", "民乐县"], "status": "active", "sort": 1765, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "393446f7-e2a1-4d2c-b0b2-17273210a0e9", "_rev": "2-5bb2b00fd6f631b94b46a710ea934ed8", "type": "region", "code": "630222", "name": "民和回族土族自治县", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "393446f7-e2a1-4d2c-b0b2-17273210a0e9"], "path_name": ["中国", "青海省", "海东市", "民和回族土族自治县"], "status": "active", "sort": 1764, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "427befd6-e177-487a-bd45-603b0bab0858", "_rev": "2-c0432e197babc6b56dd71b747ac33270", "type": "region", "code": "610725", "name": "勉县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "427befd6-e177-487a-bd45-603b0bab0858"], "path_name": ["中国", "陕西省", "汉中市", "勉县"], "status": "active", "sort": 1760, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "4a8a8e2d-0d8a-40d9-bcb7-b54e3172aa28", "_rev": "2-51bbb177d3fa0606c83cb83de8b22360", "type": "region", "code": "510683", "name": "绵竹市", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "4a8a8e2d-0d8a-40d9-bcb7-b54e3172aa28"], "path_name": ["中国", "四川省", "德阳市", "绵竹市"], "status": "active", "sort": 1759, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "8d0f2f35-0831-45a8-87db-ba778b5f9031", "_rev": "2-833cc0cb93eb4e2df483d8f2dedcd833", "type": "region", "code": "230382", "name": "密山市", "parent_id": "f436e3c0-da66-45e0-aa5f-c4d12132012e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "f436e3c0-da66-45e0-aa5f-c4d12132012e", "8d0f2f35-0831-45a8-87db-ba778b5f9031"], "path_name": ["中国", "黑龙江省", "鸡西市", "密山市"], "status": "active", "sort": 1757, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "be8b5217-8f49-49be-8bc4-d7176c4e6e62", "_rev": "2-3f0cd9280f2419fad0b097d259da0fcf", "type": "region", "code": "513433", "name": "冕宁县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "be8b5217-8f49-49be-8bc4-d7176c4e6e62"], "path_name": ["中国", "四川省", "凉山彝族自治州", "冕宁县"], "status": "active", "sort": 1761, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "ee9e2685-4957-419e-aa31-87fe18df8505", "_rev": "2-9e4b5d326d7ffdeff9b897360572b738", "type": "region", "code": "411726", "name": "泌阳县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "ee9e2685-4957-419e-aa31-87fe18df8505"], "path_name": ["中国", "河南省", "驻马店市", "泌阳县"], "status": "active", "sort": 1756, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:07"} +{"_id": "2cf8bf28-80a1-492b-9f7e-22fa32e40813", "_rev": "2-5a4b3c3b451b5dbacf1b87dcd567dfce", "type": "region", "code": "511803", "name": "名山区", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "2cf8bf28-80a1-492b-9f7e-22fa32e40813"], "path_name": ["中国", "四川省", "雅安市", "名山区"], "status": "active", "sort": 1772, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "4535f903-7e52-4ec6-8c70-d094c7691ba7", "_rev": "2-11124f330681ee5e57e81fe905b31a25", "type": "region", "code": "231225", "name": "明水县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "4535f903-7e52-4ec6-8c70-d094c7691ba7"], "path_name": ["中国", "黑龙江省", "绥化市", "明水县"], "status": "active", "sort": 1775, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "5505b68a-b02b-4481-ad30-f62f8b5956ac", "_rev": "2-296711df9f790f7d0c844cb15bcac867", "type": "region", "code": "341182", "name": "明光市", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "5505b68a-b02b-4481-ad30-f62f8b5956ac"], "path_name": ["中国", "安徽省", "滁州市", "明光市"], "status": "active", "sort": 1773, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "5e1ebaa5-aa18-4d21-962a-9c72a8dc553a", "_rev": "2-e16762850656b75a2015949e9e2b1aa7", "type": "region", "code": "350124", "name": "闽清县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "5e1ebaa5-aa18-4d21-962a-9c72a8dc553a"], "path_name": ["中国", "福建省", "福州市", "闽清县"], "status": "active", "sort": 1771, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "70b81a18-c603-41e5-967d-83542041e502", "_rev": "2-ecc078cc918e0e5d09aeadd199652bdb", "type": "region", "code": "350121", "name": "闽侯县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "70b81a18-c603-41e5-967d-83542041e502"], "path_name": ["中国", "福建省", "福州市", "闽侯县"], "status": "active", "sort": 1770, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "7c099a39-e89f-4568-b703-707596846a3f", "_rev": "2-11a0952fb1255ff05181bd364cc2c17f", "type": "region", "code": "210504", "name": "明山区", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "7c099a39-e89f-4568-b703-707596846a3f"], "path_name": ["中国", "辽宁省", "本溪市", "明山区"], "status": "active", "sort": 1774, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "83da3f1d-e24f-4f98-ad7f-b3020b005182", "_rev": "2-dae57599cd35b93ab778e858428bf9a4", "type": "region", "code": "411421", "name": "民权县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "83da3f1d-e24f-4f98-ad7f-b3020b005182"], "path_name": ["中国", "河南省", "商丘市", "民权县"], "status": "active", "sort": 1767, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "a0962322-57a0-4230-a47c-02cbf7168f70", "_rev": "2-0a394f9b8567fbb10bacb68c4d9d6845", "type": "region", "code": "621126", "name": "岷县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "a0962322-57a0-4230-a47c-02cbf7168f70"], "path_name": ["中国", "甘肃省", "定西市", "岷县"], "status": "active", "sort": 1768, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "db70cf96-f089-488e-b2a3-c470211f36a8", "_rev": "2-6d128b8657058dfb43837e80ef0a6146", "type": "region", "code": "620621", "name": "民勤县", "parent_id": "8adb19ec-7d97-4233-8709-19769b980943", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8adb19ec-7d97-4233-8709-19769b980943", "db70cf96-f089-488e-b2a3-c470211f36a8"], "path_name": ["中国", "甘肃省", "武威市", "民勤县"], "status": "active", "sort": 1766, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "e8d0dd5a-b6eb-4422-baf4-5e6cbf5333f9", "_rev": "2-6d4494f2c155a1edcf668b301d691d40", "type": "region", "code": "310112", "name": "闵行区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "e8d0dd5a-b6eb-4422-baf4-5e6cbf5333f9"], "path_name": ["中国", "上海市", "闵行区"], "status": "active", "sort": 1769, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:08"} +{"_id": "2c7d1167-6f2b-4be1-b9d8-a32986745a13", "_rev": "2-0d2984c88a0a63da89906c888d44bb12", "type": "region", "code": "350421", "name": "明溪县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "2c7d1167-6f2b-4be1-b9d8-a32986745a13"], "path_name": ["中国", "福建省", "三明市", "明溪县"], "status": "active", "sort": 1776, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "4e9e24a7-c602-4127-93be-ebeda0b618e5", "_rev": "2-fb3a4d9e3d79cde4fb9997052e5415ee", "type": "region", "code": "540423", "name": "墨脱县", "parent_id": "44696693-715c-4ef2-b7d7-c2718f1bb46d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "44696693-715c-4ef2-b7d7-c2718f1bb46d", "4e9e24a7-c602-4127-93be-ebeda0b618e5"], "path_name": ["中国", "西藏自治区", "林芝市", "墨脱县"], "status": "active", "sort": 1780, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "539b0a1d-7d28-4eb4-a735-6cee7780ea65", "_rev": "2-930a9cfb7fc47446fe67c13187f16ee8", "type": "region", "code": "653222", "name": "墨玉县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "539b0a1d-7d28-4eb4-a735-6cee7780ea65"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "墨玉县"], "status": "active", "sort": 1781, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "8881d3cf-232f-4894-8ce4-8909a6ade1b0", "_rev": "2-a4f430ffc2d35b4474adef8086241fcc", "type": "region", "code": "232701", "name": "漠河市", "parent_id": "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "8881d3cf-232f-4894-8ce4-8909a6ade1b0"], "path_name": ["中国", "黑龙江省", "大兴安岭地区", "漠河市"], "status": "active", "sort": 1778, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "8932f77a-d1fe-482a-ab53-639ebfda035f", "_rev": "2-88c1f1b22921f7b908b3859b670e2b1b", "type": "region", "code": "540127", "name": "墨竹工卡县", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "8932f77a-d1fe-482a-ab53-639ebfda035f"], "path_name": ["中国", "西藏自治区", "拉萨市", "墨竹工卡县"], "status": "active", "sort": 1782, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "8ef79ceb-3f43-4929-a191-6d09ccbeeb93", "_rev": "2-abea3896f1ea11851ba9c84a6f1d0f7c", "type": "region", "code": "532323", "name": "牟定县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "8ef79ceb-3f43-4929-a191-6d09ccbeeb93"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "牟定县"], "status": "active", "sort": 1783, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "a5817f75-eeb3-41b8-8a2f-0a5548d0e541", "_rev": "2-9cbcfc5cb3653643bd9a59ed20e16d74", "type": "region", "code": "370612", "name": "牟平区", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "a5817f75-eeb3-41b8-8a2f-0a5548d0e541"], "path_name": ["中国", "山东省", "烟台市", "牟平区"], "status": "active", "sort": 1784, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "c75d2bcf-07e5-4046-b9d5-91eb634b1ada", "_rev": "2-5dd125ce4259a1690620c7a3a0269b47", "type": "region", "code": "150722", "name": "莫力达瓦达斡尔族自治旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "c75d2bcf-07e5-4046-b9d5-91eb634b1ada"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "莫力达瓦达斡尔族自治旗"], "status": "active", "sort": 1777, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "ffa4df62-345b-4ad0-82de-9a0f619918bb", "_rev": "2-a112f6d696240b1ca25c7e9592e8d931", "type": "region", "code": "530822", "name": "墨江哈尼族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "ffa4df62-345b-4ad0-82de-9a0f619918bb"], "path_name": ["中国", "云南省", "普洱市", "墨江哈尼族自治县"], "status": "active", "sort": 1779, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:09"} +{"_id": "00487f15-bc72-45ff-a264-27732d3df23b", "_rev": "2-42733331ceb42ffa8626512736347bee", "type": "region", "code": "410711", "name": "牧野区", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "00487f15-bc72-45ff-a264-27732d3df23b"], "path_name": ["中国", "河南省", "新乡市", "牧野区"], "status": "active", "sort": 1790, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "1059e6f7-e167-49a2-8b1f-feedac7ecfc3", "_rev": "2-ee9ad6d450269e2b04ca1f1361836873", "type": "region", "code": "511129", "name": "沐川县", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "1059e6f7-e167-49a2-8b1f-feedac7ecfc3"], "path_name": ["中国", "四川省", "乐山市", "沐川县"], "status": "active", "sort": 1789, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "398b89f7-70f0-4aa6-a545-b299a4b8703c", "_rev": "2-98e9bf04b42a4bab7fc71f1a852faef1", "type": "region", "code": "451026", "name": "那坡县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "398b89f7-70f0-4aa6-a545-b299a4b8703c"], "path_name": ["中国", "广西壮族自治区", "百色市", "那坡县"], "status": "active", "sort": 1792, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "7982ecbb-db6a-472f-b426-e82d5dc1417c", "_rev": "2-ec7c180e624afe874e78e3fda5d2991b", "type": "region", "code": "652328", "name": "木垒哈萨克自治县", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "7982ecbb-db6a-472f-b426-e82d5dc1417c"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "木垒哈萨克自治县"], "status": "active", "sort": 1787, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "86e733f1-8724-4f5b-bc69-2b2f1d68b7d7", "_rev": "2-714fc70220e294b0a7c1c3a445051619", "type": "region", "code": "231085", "name": "穆棱市", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "86e733f1-8724-4f5b-bc69-2b2f1d68b7d7"], "path_name": ["中国", "黑龙江省", "牡丹江市", "穆棱市"], "status": "active", "sort": 1791, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "9c19b31f-5df5-4978-bd69-14c27964da07", "_rev": "2-c94d8e0fed5113f6c68509966a890091", "type": "region", "code": "230127", "name": "木兰县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "9c19b31f-5df5-4978-bd69-14c27964da07"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "木兰县"], "status": "active", "sort": 1786, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "a5da5018-55b5-452e-8b69-de502634d055", "_rev": "2-db1b7dfbab28793f388aa9c1fda95c44", "type": "region", "code": "540502", "name": "乃东区", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "a5da5018-55b5-452e-8b69-de502634d055"], "path_name": ["中国", "西藏自治区", "山南市", "乃东区"], "status": "active", "sort": 1795, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "cdab2353-ca81-4eb1-90ba-00ca3747476d", "_rev": "2-4888643cf8cc06207ae3f3b8d631225c", "type": "region", "code": "520525", "name": "纳雍县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "cdab2353-ca81-4eb1-90ba-00ca3747476d"], "path_name": ["中国", "贵州省", "毕节市", "纳雍县"], "status": "active", "sort": 1794, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "deedcc5b-84a2-428c-af8b-3bc89db83c8a", "_rev": "2-498df23f1bbb98930de10511e42cc923", "type": "region", "code": "371702", "name": "牡丹区", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "deedcc5b-84a2-428c-af8b-3bc89db83c8a"], "path_name": ["中国", "山东省", "菏泽市", "牡丹区"], "status": "active", "sort": 1785, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "dff178b7-ae84-4584-af3d-19ca868c28ae", "_rev": "2-516c5d64cab425ca11a7b6496806fded", "type": "region", "code": "510503", "name": "纳溪区", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "dff178b7-ae84-4584-af3d-19ca868c28ae"], "path_name": ["中国", "四川省", "泸州市", "纳溪区"], "status": "active", "sort": 1793, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "f445811b-5a91-419b-a691-7980dbdb40da", "_rev": "2-a4c771cb2a5cf295964e2c19858c6802", "type": "region", "code": "513422", "name": "木里藏族自治县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "f445811b-5a91-419b-a691-7980dbdb40da"], "path_name": ["中国", "四川省", "凉山彝族自治州", "木里藏族自治县"], "status": "active", "sort": 1788, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:10"} +{"_id": "161b5f3c-7981-4a78-9817-4be088ae9600", "_rev": "2-c174c1babe3b5c9ccd624e988b0f7606", "type": "region", "code": "511321", "name": "南部县", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "161b5f3c-7981-4a78-9817-4be088ae9600"], "path_name": ["中国", "四川省", "南充市", "南部县"], "status": "active", "sort": 1800, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "34e58a9e-5bb3-4445-8971-f93871551a5f", "_rev": "2-8a5fe42a5dfbc1af345ec43056f61b74", "type": "region", "code": "451221", "name": "南丹县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "34e58a9e-5bb3-4445-8971-f93871551a5f"], "path_name": ["中国", "广西壮族自治区", "河池市", "南丹县"], "status": "active", "sort": 1804, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "6c4ffe47-e22c-46e9-9966-75f2cb2b57e4", "_rev": "2-a8fd50262739fe36ada764ed4c459945", "type": "region", "code": "350583", "name": "南安市", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "6c4ffe47-e22c-46e9-9966-75f2cb2b57e4"], "path_name": ["中国", "福建省", "泉州市", "南安市"], "status": "active", "sort": 1797, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "6e6b2690-368e-40b7-b604-be406febc425", "_rev": "2-9e8f3b5761200551cb1db23517afd2a6", "type": "region", "code": "440523", "name": "南澳县", "parent_id": "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "87e4fa80-e47c-4b7f-ad4e-c1c88a75699a", "6e6b2690-368e-40b7-b604-be406febc425"], "path_name": ["中国", "广东省", "汕头市", "南澳县"], "status": "active", "sort": 1799, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "70e8a3a8-207f-4f96-9484-d8501e6546bf", "_rev": "2-3543e39a0513de344d1f6b7a3fbbab3f", "type": "region", "code": "360121", "name": "南昌县", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "70e8a3a8-207f-4f96-9484-d8501e6546bf"], "path_name": ["中国", "江西省", "南昌市", "南昌县"], "status": "active", "sort": 1801, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "7f4e5497-b120-4cf6-bbc7-b087be0d92c1", "_rev": "2-3be0df7973a51efc5840c78308c3873b", "type": "region", "code": "210505", "name": "南芬区", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "7f4e5497-b120-4cf6-bbc7-b087be0d92c1"], "path_name": ["中国", "辽宁省", "本溪市", "南芬区"], "status": "active", "sort": 1805, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "81faac5b-0bb2-4e25-ab2b-888e5c9b5122", "_rev": "2-65ac4b20f348e4b1156295d74a88df38", "type": "region", "code": "150525", "name": "奈曼旗", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "81faac5b-0bb2-4e25-ab2b-888e5c9b5122"], "path_name": ["中国", "内蒙古自治区", "通辽市", "奈曼旗"], "status": "active", "sort": 1796, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "a53da50b-f673-4ef3-ae1f-835f1662dbd9", "_rev": "2-5ee848ddf73184bf4310e327da877e09", "type": "region", "code": "361023", "name": "南丰县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "a53da50b-f673-4ef3-ae1f-835f1662dbd9"], "path_name": ["中国", "江西省", "抚州市", "南丰县"], "status": "active", "sort": 1806, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "a5f897e8-27f8-4069-bda0-a0048224b887", "_rev": "2-4d273ef55ef95d583a34f84f993d5b36", "type": "region", "code": "500108", "name": "南岸区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "a5f897e8-27f8-4069-bda0-a0048224b887"], "path_name": ["中国", "重庆市", "南岸区"], "status": "active", "sort": 1798, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "b8a98098-067c-4a33-87fb-5cf784227cb3", "_rev": "2-cb8e3f8a58735a48f92babfd7aad97f0", "type": "region", "code": "500119", "name": "南川区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "b8a98098-067c-4a33-87fb-5cf784227cb3"], "path_name": ["中国", "重庆市", "南川区"], "status": "active", "sort": 1803, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "e70c5050-081a-416c-97bb-7dd0e52c7076", "_rev": "2-e08edcabd3ed3ef86d57a580e0d4fafb", "type": "region", "code": "361021", "name": "南城县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "e70c5050-081a-416c-97bb-7dd0e52c7076"], "path_name": ["中国", "江西省", "抚州市", "南城县"], "status": "active", "sort": 1802, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:11"} +{"_id": "0113ccc4-6a99-4be8-959c-582ced37682d", "_rev": "2-d8449aba8403d35a31e25731416d4f44", "type": "region", "code": "440605", "name": "南海区", "parent_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "0113ccc4-6a99-4be8-959c-582ced37682d"], "path_name": ["中国", "广东省", "佛山市", "南海区"], "status": "active", "sort": 1810, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "0e954d61-3646-4cb4-8f71-a353d8a6f7a8", "_rev": "2-7d61acafa3b192ad9e29585289a1be26", "type": "region", "code": "330402", "name": "南湖区", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "0e954d61-3646-4cb4-8f71-a353d8a6f7a8"], "path_name": ["中国", "浙江省", "嘉兴市", "南湖区"], "status": "active", "sort": 1812, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "20b8f445-be08-4e34-a457-958a31929ebe", "_rev": "2-4bf2ce29ef8bc40aae1782cb792dec6a", "type": "region", "code": "532324", "name": "南华县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "20b8f445-be08-4e34-a457-958a31929ebe"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "南华县"], "status": "active", "sort": 1813, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "50bab3e4-be5a-4bc3-9734-445559fff718", "_rev": "2-534f08c1d720dcb6c445f6278b7ac0be", "type": "region", "code": "220102", "name": "南关区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "50bab3e4-be5a-4bc3-9734-445559fff718"], "path_name": ["中国", "吉林省", "长春市", "南关区"], "status": "active", "sort": 1809, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "9242ef82-fb0d-4820-8c0a-d60c694e2535", "_rev": "2-f6bc45efa002560d6566744c735aae8b", "type": "region", "code": "130581", "name": "南宫市", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "9242ef82-fb0d-4820-8c0a-d60c694e2535"], "path_name": ["中国", "河北省", "邢台市", "南宫市"], "status": "active", "sort": 1808, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "9ca25647-bc54-4a40-8d88-79e7bb09b751", "_rev": "2-1f1477efd8708fa85cba8ce338366c75", "type": "region", "code": "532926", "name": "南涧彝族自治县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "9ca25647-bc54-4a40-8d88-79e7bb09b751"], "path_name": ["中国", "云南省", "大理白族自治州", "南涧彝族自治县"], "status": "active", "sort": 1814, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "b923b7bf-234c-423c-a2e0-0973b9f865e6", "_rev": "2-1a1f5da4eb1e2f681ff60e7cb6e6af1e", "type": "region", "code": "130506", "name": "南和区", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "b923b7bf-234c-423c-a2e0-0973b9f865e6"], "path_name": ["中国", "河北省", "邢台市", "南和区"], "status": "active", "sort": 1811, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "cea39ea9-b4d6-4fea-a037-7943deabde36", "_rev": "2-3b389992bd3e175105154f3376de916e", "type": "region", "code": "511922", "name": "南江县", "parent_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "cea39ea9-b4d6-4fea-a037-7943deabde36"], "path_name": ["中国", "四川省", "巴中市", "南江县"], "status": "active", "sort": 1815, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "dd138f55-ef63-4857-b1e8-4453a9fa966c", "_rev": "2-6b4ad25d2551c8b283edaf6c06ef532e", "type": "region", "code": "230103", "name": "南岗区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "dd138f55-ef63-4857-b1e8-4453a9fa966c"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "南岗区"], "status": "active", "sort": 1807, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "e35f5b9b-b255-41ce-aa20-f795b3736331", "_rev": "2-d4aecb561dfa65c9e9c01c101d67820d", "type": "region", "code": "120104", "name": "南开区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "e35f5b9b-b255-41ce-aa20-f795b3736331"], "path_name": ["中国", "天津市", "南开区"], "status": "active", "sort": 1817, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "ebd2480b-ded4-4b39-8926-e19fba4ffbc3", "_rev": "2-139dee0737da875b06231ba47058e7d4", "type": "region", "code": "350627", "name": "南靖县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "ebd2480b-ded4-4b39-8926-e19fba4ffbc3"], "path_name": ["中国", "福建省", "漳州市", "南靖县"], "status": "active", "sort": 1816, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:12"} +{"_id": "03899781-284f-4e79-929c-9a3d26c9c776", "_rev": "2-ff60994491afc5375551f6491944b7d5", "type": "region", "code": "520102", "name": "南明区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "03899781-284f-4e79-929c-9a3d26c9c776"], "path_name": ["中国", "贵州省", "贵阳市", "南明区"], "status": "active", "sort": 1821, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "157b863c-b2e5-4a4b-9844-5e95182e6ce0", "_rev": "2-5954ae27b73df66b2d1e1874cca3f1f6", "type": "region", "code": "440115", "name": "南沙区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "157b863c-b2e5-4a4b-9844-5e95182e6ce0"], "path_name": ["中国", "广东省", "广州市", "南沙区"], "status": "active", "sort": 1826, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "1a2a2c76-54e8-44ab-b7c4-419ed9995436", "_rev": "2-379c00fc35085775eb987b058dd14bb7", "type": "region", "code": "540221", "name": "南木林县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "1a2a2c76-54e8-44ab-b7c4-419ed9995436"], "path_name": ["中国", "西藏自治区", "日喀则市", "南木林县"], "status": "active", "sort": 1822, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "2293805f-1796-481a-96a7-7563912ca3a1", "_rev": "2-2980f5fa562ccb6f9ec968954eb0daef", "type": "region", "code": "511503", "name": "南溪区", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "2293805f-1796-481a-96a7-7563912ca3a1"], "path_name": ["中国", "四川省", "宜宾市", "南溪区"], "status": "active", "sort": 1827, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "4ca71237-fccd-4a7a-8d04-2a9993320c23", "_rev": "2-2c5689230988de95c74f15ea2d05129e", "type": "region", "code": "360703", "name": "南康区", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "4ca71237-fccd-4a7a-8d04-2a9993320c23"], "path_name": ["中国", "江西省", "赣州市", "南康区"], "status": "active", "sort": 1818, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "a447feec-7ba3-43a9-82f1-1aa59e74cfbb", "_rev": "2-4be5178aebbe863846432cc92c54f1f7", "type": "region", "code": "211404", "name": "南票区", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "a447feec-7ba3-43a9-82f1-1aa59e74cfbb"], "path_name": ["中国", "辽宁省", "葫芦岛市", "南票区"], "status": "active", "sort": 1824, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "ccdae23e-aefd-431d-94f4-b3f08d97030d", "_rev": "2-d0acedaa42435e8dae86adbe713ac780", "type": "region", "code": "410923", "name": "南乐县", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "ccdae23e-aefd-431d-94f4-b3f08d97030d"], "path_name": ["中国", "河南省", "濮阳市", "南乐县"], "status": "active", "sort": 1819, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "e087d44f-7040-4653-99ae-d7471c8935e6", "_rev": "2-5a1eeba69156b24389fa32b1f4d07cff", "type": "region", "code": "340223", "name": "南陵县", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "e087d44f-7040-4653-99ae-d7471c8935e6"], "path_name": ["中国", "安徽省", "芜湖市", "南陵县"], "status": "active", "sort": 1820, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "ed56cec1-d808-48bd-9a1f-9cb5b2ff5929", "_rev": "2-2af40df2d7c93d13e375dce356cb7d09", "type": "region", "code": "130927", "name": "南皮县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "ed56cec1-d808-48bd-9a1f-9cb5b2ff5929"], "path_name": ["中国", "河北省", "沧州市", "南皮县"], "status": "active", "sort": 1823, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "f5ebb5bb-99a9-4e25-b43b-445096341e90", "_rev": "2-f495d23ab72c023bc771c6c7561091e1", "type": "region", "code": "341103", "name": "南谯区", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "f5ebb5bb-99a9-4e25-b43b-445096341e90"], "path_name": ["中国", "安徽省", "滁州市", "南谯区"], "status": "active", "sort": 1825, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:13"} +{"_id": "2f88f8a0-2808-4205-a7f9-d8fe30a66931", "_rev": "2-39ff500090de069560c015563b4a6eb8", "type": "region", "code": "610703", "name": "南郑区", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "2f88f8a0-2808-4205-a7f9-d8fe30a66931"], "path_name": ["中国", "陕西省", "汉中市", "南郑区"], "status": "active", "sort": 1834, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "315cdb32-27e8-4df9-b387-54a57862cef1", "_rev": "2-6d6955e735a88cba8cffbc7f5f2f91ba", "type": "region", "code": "430412", "name": "南岳区", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "315cdb32-27e8-4df9-b387-54a57862cef1"], "path_name": ["中国", "湖南省", "衡阳市", "南岳区"], "status": "active", "sort": 1831, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "9d149e54-3349-4660-9a41-a129bc151565", "_rev": "2-e65a413409821820e4e506c5a0f07d48", "type": "region", "code": "230281", "name": "讷河市", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "9d149e54-3349-4660-9a41-a129bc151565"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "讷河市"], "status": "active", "sort": 1836, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "9e3116b5-641d-4101-8ab6-b24c8cd98e50", "_rev": "2-ebb0f45e03157b8eb9ad62eb2695cd20", "type": "region", "code": "330503", "name": "南浔区", "parent_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "9e3116b5-641d-4101-8ab6-b24c8cd98e50"], "path_name": ["中国", "浙江省", "湖州市", "南浔区"], "status": "active", "sort": 1830, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "a5b041c6-91b5-4b75-b949-299a7e18f152", "_rev": "2-b28836d6e4d810d8302e64d086aed12f", "type": "region", "code": "440282", "name": "南雄市", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "a5b041c6-91b5-4b75-b949-299a7e18f152"], "path_name": ["中国", "广东省", "韶关市", "南雄市"], "status": "active", "sort": 1829, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "abf1f93e-13e5-4dd1-b938-ead58a4a6ab3", "_rev": "2-3f33645224d683f44b840d6c42bbc9ad", "type": "region", "code": "410527", "name": "内黄县", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "abf1f93e-13e5-4dd1-b938-ead58a4a6ab3"], "path_name": ["中国", "河南省", "安阳市", "内黄县"], "status": "active", "sort": 1837, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "b2af03b1-db7d-410a-b2a9-f8db9a3eb8e2", "_rev": "2-6250da296153298ff3a1a28c5a7e93f8", "type": "region", "code": "420624", "name": "南漳县", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "b2af03b1-db7d-410a-b2a9-f8db9a3eb8e2"], "path_name": ["中国", "湖北省", "襄阳市", "南漳县"], "status": "active", "sort": 1832, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "cf86370d-665f-463c-a6c5-22410245611c", "_rev": "2-f6aba2d1d213444b9c3a67f3c1e1247d", "type": "region", "code": "411321", "name": "南召县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "cf86370d-665f-463c-a6c5-22410245611c"], "path_name": ["中国", "河南省", "南阳市", "南召县"], "status": "active", "sort": 1833, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "d37c4f14-fe4c-4ac2-8987-638e59852d6c", "_rev": "2-e591c80b756dc208a55b7e5008e22d74", "type": "region", "code": "632725", "name": "囊谦县", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "d37c4f14-fe4c-4ac2-8987-638e59852d6c"], "path_name": ["中国", "青海省", "玉树藏族自治州", "囊谦县"], "status": "active", "sort": 1835, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "f94214cf-521a-4054-82c8-876197b84501", "_rev": "2-090ea0b1ff59e6564e26f3392b9c4d8e", "type": "region", "code": "130523", "name": "内丘县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "f94214cf-521a-4054-82c8-876197b84501"], "path_name": ["中国", "河北省", "邢台市", "内丘县"], "status": "active", "sort": 1838, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "fd6f71e7-0046-40f2-956d-987c4de0fdd6", "_rev": "2-6335cf92a6f3402a2a454b3c9130d21f", "type": "region", "code": "430921", "name": "南县", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "fd6f71e7-0046-40f2-956d-987c4de0fdd6"], "path_name": ["中国", "湖南省", "益阳市", "南县"], "status": "active", "sort": 1828, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:14"} +{"_id": "103459f1-a0d7-4b93-854e-ffd99deb9976", "_rev": "2-a6b94ba45f236b07cc35429977ceb872", "type": "region", "code": "540629", "name": "尼玛县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "103459f1-a0d7-4b93-854e-ffd99deb9976"], "path_name": ["中国", "西藏自治区", "那曲市", "尼玛县"], "status": "active", "sort": 1842, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "385d7a1b-d403-49b5-b17c-5637c8c8b44e", "_rev": "2-4fdb15af2fb8c2a53d9b42d0118c456a", "type": "region", "code": "411325", "name": "内乡县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "385d7a1b-d403-49b5-b17c-5637c8c8b44e"], "path_name": ["中国", "河南省", "南阳市", "内乡县"], "status": "active", "sort": 1839, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "49446060-416d-471f-b24a-f30b0bea3b02", "_rev": "2-6b06f55ee62c7a8d3cdad128be3d2139", "type": "region", "code": "230207", "name": "碾子山区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "49446060-416d-471f-b24a-f30b0bea3b02"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "碾子山区"], "status": "active", "sort": 1844, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "904e2786-a708-4000-b91f-03edf093dcc7", "_rev": "2-936d1003ee48d1ddbb266143a6c0c265", "type": "region", "code": "231183", "name": "嫩江市", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "904e2786-a708-4000-b91f-03edf093dcc7"], "path_name": ["中国", "黑龙江省", "黑河市", "嫩江市"], "status": "active", "sort": 1840, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "9cd2a636-64f7-42c2-bb96-c05484701720", "_rev": "2-27e2110a1f55fc6184c4acbb3bd30807", "type": "region", "code": "654028", "name": "尼勒克县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "9cd2a636-64f7-42c2-bb96-c05484701720"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "尼勒克县"], "status": "active", "sort": 1841, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "bb432b08-3806-476d-b574-a9d8921524e6", "_rev": "2-cc592ed231ec286ffce9c67fb96a9c19", "type": "region", "code": "231084", "name": "宁安市", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "bb432b08-3806-476d-b574-a9d8921524e6"], "path_name": ["中国", "黑龙江省", "牡丹江市", "宁安市"], "status": "active", "sort": 1847, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "c0dfb167-aa28-4845-bccf-7414460abca2", "_rev": "2-b05dab7699fba8bf67c857fa5dea3cc7", "type": "region", "code": "150429", "name": "宁城县", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "c0dfb167-aa28-4845-bccf-7414460abca2"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "宁城县"], "status": "active", "sort": 1848, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "c6bfd32d-33dd-4a4b-9002-eb5c3c907003", "_rev": "2-fb31cae05f1bc972dffb871b8d381ed0", "type": "region", "code": "540235", "name": "聂拉木县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "c6bfd32d-33dd-4a4b-9002-eb5c3c907003"], "path_name": ["中国", "西藏自治区", "日喀则市", "聂拉木县"], "status": "active", "sort": 1845, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "d8f96756-8f48-4232-bb26-e436637d9a92", "_rev": "2-47e5d19393cdf7a0e21fe01cb67957e9", "type": "region", "code": "540123", "name": "尼木县", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "d8f96756-8f48-4232-bb26-e436637d9a92"], "path_name": ["中国", "西藏自治区", "拉萨市", "尼木县"], "status": "active", "sort": 1843, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "ff280802-65ae-4c2d-b9f3-a9e4c3309770", "_rev": "2-1c29ac8670d9c70042753d5a4696146f", "type": "region", "code": "540623", "name": "聂荣县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "ff280802-65ae-4c2d-b9f3-a9e4c3309770"], "path_name": ["中国", "西藏自治区", "那曲市", "聂荣县"], "status": "active", "sort": 1846, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:15"} +{"_id": "2fc31415-f821-4f49-a987-73d44c5d7853", "_rev": "2-cd0d817ba60ef0f9b4b6b5e653dc33c5", "type": "region", "code": "350424", "name": "宁化县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "2fc31415-f821-4f49-a987-73d44c5d7853"], "path_name": ["中国", "福建省", "三明市", "宁化县"], "status": "active", "sort": 1854, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "3836c03b-6aad-4204-b871-c8e1a9a57691", "_rev": "2-0c1c2b6acb9656a98472549decd4dcf8", "type": "region", "code": "360730", "name": "宁都县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "3836c03b-6aad-4204-b871-c8e1a9a57691"], "path_name": ["中国", "江西省", "赣州市", "宁都县"], "status": "active", "sort": 1849, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "44d17985-8231-48e4-b94e-02320262a469", "_rev": "2-96ec3612b15331a32fa91088035a93ad", "type": "region", "code": "411423", "name": "宁陵县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "44d17985-8231-48e4-b94e-02320262a469"], "path_name": ["中国", "河南省", "商丘市", "宁陵县"], "status": "active", "sort": 1859, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "5794f9f3-17b6-4ace-934e-7afffa14c0b0", "_rev": "2-79dedb3d5bc78cfff17bbc9477d56b57", "type": "region", "code": "130528", "name": "宁晋县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "5794f9f3-17b6-4ace-934e-7afffa14c0b0"], "path_name": ["中国", "河北省", "邢台市", "宁晋县"], "status": "active", "sort": 1857, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "75a66a8b-3981-4f0b-abd4-62edbe1ad283", "_rev": "2-fb773b26ea1bb5557c13d90beeeadf51", "type": "region", "code": "530821", "name": "宁洱哈尼族彝族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "75a66a8b-3981-4f0b-abd4-62edbe1ad283"], "path_name": ["中国", "云南省", "普洱市", "宁洱哈尼族彝族自治县"], "status": "active", "sort": 1850, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "7fb0f216-69fa-4b0f-9544-b4ea773e776a", "_rev": "2-3d6ca3c941e7b2f8f77635cd6d60cc91", "type": "region", "code": "371422", "name": "宁津县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "7fb0f216-69fa-4b0f-9544-b4ea773e776a"], "path_name": ["中国", "山东省", "德州市", "宁津县"], "status": "active", "sort": 1856, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "94231dbc-720d-43e4-9866-c90d0d03ff49", "_rev": "2-d247da096309be9b2145db495f095f99", "type": "region", "code": "330226", "name": "宁海县", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "94231dbc-720d-43e4-9866-c90d0d03ff49"], "path_name": ["中国", "浙江省", "宁波市", "宁海县"], "status": "active", "sort": 1852, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "966fd846-7033-4aa6-87c2-3b901ab527b0", "_rev": "2-3562b6456f89b50bbf067b93bf84d6a7", "type": "region", "code": "530724", "name": "宁蒗彝族自治县", "parent_id": "b712f371-149e-4b45-aa88-755c77561518", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518", "966fd846-7033-4aa6-87c2-3b901ab527b0"], "path_name": ["中国", "云南省", "丽江市", "宁蒗彝族自治县"], "status": "active", "sort": 1858, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "a9312010-d9a6-4db7-83a8-1332ace6a55e", "_rev": "2-6bdf6d8db24f3589ff418ac28feaa6ab", "type": "region", "code": "341881", "name": "宁国市", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "a9312010-d9a6-4db7-83a8-1332ace6a55e"], "path_name": ["中国", "安徽省", "宣城市", "宁国市"], "status": "active", "sort": 1851, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "c2c18ecd-c433-430d-95fd-4079a154979c", "_rev": "2-7b9880b4d2327b10bf75be9b6dea3099", "type": "region", "code": "120117", "name": "宁河区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "c2c18ecd-c433-430d-95fd-4079a154979c"], "path_name": ["中国", "天津市", "宁河区"], "status": "active", "sort": 1853, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "d2e68848-859c-4116-9c81-f03b2ccaf83f", "_rev": "2-ef9bb5eee9aca5c6093a7fa2b57988b1", "type": "region", "code": "220702", "name": "宁江区", "parent_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8", "d2e68848-859c-4116-9c81-f03b2ccaf83f"], "path_name": ["中国", "吉林省", "松原市", "宁江区"], "status": "active", "sort": 1855, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:16"} +{"_id": "2f8d3621-5939-4205-8bd5-426d4473c6d5", "_rev": "2-a1b0c8d23a59a5577eb1218271b43ce4", "type": "region", "code": "140925", "name": "宁武县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "2f8d3621-5939-4205-8bd5-426d4473c6d5"], "path_name": ["中国", "山西省", "忻州市", "宁武县"], "status": "active", "sort": 1864, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "421b724d-e595-4c01-97eb-6ee9df844e8b", "_rev": "2-a1cb8a92834d1b3a25a9232307cff3da", "type": "region", "code": "451422", "name": "宁明县", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "421b724d-e595-4c01-97eb-6ee9df844e8b"], "path_name": ["中国", "广西壮族自治区", "崇左市", "宁明县"], "status": "active", "sort": 1860, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "510fb6ec-1ffa-412b-b5a3-5f8f55a04150", "_rev": "2-74bc348b41aa764f3e7b37967c1698c9", "type": "region", "code": "370921", "name": "宁阳县", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "510fb6ec-1ffa-412b-b5a3-5f8f55a04150"], "path_name": ["中国", "山东省", "泰安市", "宁阳县"], "status": "active", "sort": 1867, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "8bed4f55-46b2-4a10-b8f6-6ffedf61068c", "_rev": "2-3b943fe84e4083197f30da21feefca77", "type": "region", "code": "220122", "name": "农安县", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "8bed4f55-46b2-4a10-b8f6-6ffedf61068c"], "path_name": ["中国", "吉林省", "长春市", "农安县"], "status": "active", "sort": 1869, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "b3731183-aa34-4472-b432-1d7bc1430942", "_rev": "2-251afc7ed273e315fbddcc4a806a42c8", "type": "region", "code": "610923", "name": "宁陕县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "b3731183-aa34-4472-b432-1d7bc1430942"], "path_name": ["中国", "陕西省", "安康市", "宁陕县"], "status": "active", "sort": 1863, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "b7ccadc9-61a0-421a-9f49-80233efc8761", "_rev": "2-165553a9706420a6b4e25a8ccd6bc67e", "type": "region", "code": "513427", "name": "宁南县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "b7ccadc9-61a0-421a-9f49-80233efc8761"], "path_name": ["中国", "四川省", "凉山彝族自治州", "宁南县"], "status": "active", "sort": 1861, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "c7e64b1c-8a7f-459f-9efe-441e0b89a05d", "_rev": "2-20b8f8eca905f739de288f7df6ff9810", "type": "region", "code": "431126", "name": "宁远县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "c7e64b1c-8a7f-459f-9efe-441e0b89a05d"], "path_name": ["中国", "湖南省", "永州市", "宁远县"], "status": "active", "sort": 1868, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "cb0119b7-94bd-4396-b14c-f6c21e40e3d5", "_rev": "2-cda8df6e77200ec690e60e3056ad26fb", "type": "region", "code": "621026", "name": "宁县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "cb0119b7-94bd-4396-b14c-f6c21e40e3d5"], "path_name": ["中国", "甘肃省", "庆阳市", "宁县"], "status": "active", "sort": 1865, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "e9dfd7ed-0e0f-4687-8b7a-f93ac370dbb5", "_rev": "2-5914f01993c8e98fd357674c5dec849c", "type": "region", "code": "430182", "name": "宁乡市", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "e9dfd7ed-0e0f-4687-8b7a-f93ac370dbb5"], "path_name": ["中国", "湖南省", "长沙市", "宁乡市"], "status": "active", "sort": 1866, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "f7fae254-67af-457e-8ebb-5bcd52c86a26", "_rev": "2-0479de344c56376838fd7dcea29fcc7b", "type": "region", "code": "330304", "name": "瓯海区", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "f7fae254-67af-457e-8ebb-5bcd52c86a26"], "path_name": ["中国", "浙江省", "温州市", "瓯海区"], "status": "active", "sort": 1870, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "fc08ea0c-99f3-4140-88ff-a88c32832bca", "_rev": "2-4306c110548026c29f2a0d24d19df908", "type": "region", "code": "610726", "name": "宁强县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "fc08ea0c-99f3-4140-88ff-a88c32832bca"], "path_name": ["中国", "陕西省", "汉中市", "宁强县"], "status": "active", "sort": 1862, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:17"} +{"_id": "0a289ff4-c241-446f-937f-7651d7fe2e94", "_rev": "2-8f05d651bcd3c71b5e8ef8939b213c8d", "type": "region", "code": "520281", "name": "盘州市", "parent_id": "b284639e-6eb4-4c35-add3-3f31cef7708a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "b284639e-6eb4-4c35-add3-3f31cef7708a", "0a289ff4-c241-446f-937f-7651d7fe2e94"], "path_name": ["中国", "贵州省", "六盘水市", "盘州市"], "status": "active", "sort": 1874, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "25b17110-c1b0-45ed-aff7-ab74e8b7e7d1", "_rev": "2-9683e00869849b6052faa4110e887be2", "type": "region", "code": "511403", "name": "彭山区", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "25b17110-c1b0-45ed-aff7-ab74e8b7e7d1"], "path_name": ["中国", "四川省", "眉山市", "彭山区"], "status": "active", "sort": 1877, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "3872b5af-9afe-4d2b-8e3b-bae335a65dd8", "_rev": "2-509c61b45249b1b731db988acf4d1949", "type": "region", "code": "360430", "name": "彭泽县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "3872b5af-9afe-4d2b-8e3b-bae335a65dd8"], "path_name": ["中国", "江西省", "九江市", "彭泽县"], "status": "active", "sort": 1880, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "475f3e13-4834-4efd-8abc-58ec5ab1d7e5", "_rev": "2-a7125894f096dd4f21b5c66b7b8214a0", "type": "region", "code": "640425", "name": "彭阳县", "parent_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "475f3e13-4834-4efd-8abc-58ec5ab1d7e5"], "path_name": ["中国", "宁夏回族自治区", "固原市", "彭阳县"], "status": "active", "sort": 1879, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "51b0709c-ed1f-4ff3-a70c-9a6ff688910c", "_rev": "2-b54df5dce60f11d59d54b777c1a2791a", "type": "region", "code": "340406", "name": "潘集区", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "51b0709c-ed1f-4ff3-a70c-9a6ff688910c"], "path_name": ["中国", "安徽省", "淮南市", "潘集区"], "status": "active", "sort": 1871, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "7e445845-b5f2-47d1-8870-538eff1e474f", "_rev": "2-39ef3e54c237c7a99cc38dab4db2b8a9", "type": "region", "code": "220284", "name": "磐石市", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "7e445845-b5f2-47d1-8870-538eff1e474f"], "path_name": ["中国", "吉林省", "吉林市", "磐石市"], "status": "active", "sort": 1876, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "842eec12-8f1a-40a8-ab85-3b333573c54c", "_rev": "2-6b81c0027c20371d540d0ed026d9bbe3", "type": "region", "code": "500243", "name": "彭水苗族土家族自治县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "842eec12-8f1a-40a8-ab85-3b333573c54c"], "path_name": ["中国", "重庆市", "彭水苗族土家族自治县"], "status": "active", "sort": 1878, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "90b82de9-35e6-403e-aefa-a745d7acbf29", "_rev": "2-50111825e64f7ef0c79e1e06384e2fd9", "type": "region", "code": "211122", "name": "盘山县", "parent_id": "2729f5aa-8f01-438d-b063-a39d05296b69", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "2729f5aa-8f01-438d-b063-a39d05296b69", "90b82de9-35e6-403e-aefa-a745d7acbf29"], "path_name": ["中国", "辽宁省", "盘锦市", "盘山县"], "status": "active", "sort": 1873, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "c1c2a510-66f7-4ece-800d-d8b5c58c943f", "_rev": "2-6bf766da3a6d4430b959799bcb25c2bb", "type": "region", "code": "530103", "name": "盘龙区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "c1c2a510-66f7-4ece-800d-d8b5c58c943f"], "path_name": ["中国", "云南省", "昆明市", "盘龙区"], "status": "active", "sort": 1872, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "e32da8e5-31e5-4bbb-ac07-817383ce2a5e", "_rev": "2-69b1812f0af81d4154a1413e3057ab7e", "type": "region", "code": "330727", "name": "磐安县", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "e32da8e5-31e5-4bbb-ac07-817383ce2a5e"], "path_name": ["中国", "浙江省", "金华市", "磐安县"], "status": "active", "sort": 1875, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:18"} +{"_id": "0ddedcbf-43e5-4459-8fc3-09b11bcf3184", "_rev": "2-bc2892e2d1f75de92ded08a7ffa7db39", "type": "region", "code": "630203", "name": "平安区", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "0ddedcbf-43e5-4459-8fc3-09b11bcf3184"], "path_name": ["中国", "青海省", "海东市", "平安区"], "status": "active", "sort": 1890, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "0fdad054-47ed-4702-afc0-7ddd1fac30c3", "_rev": "2-b0a1f09a096af1877a0564237111b8ec", "type": "region", "code": "440703", "name": "蓬江区", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "0fdad054-47ed-4702-afc0-7ddd1fac30c3"], "path_name": ["中国", "广东省", "江门市", "蓬江区"], "status": "active", "sort": 1883, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "3011d90b-97fa-4afd-af0d-7338c4b8db6b", "_rev": "2-8bb9db6afb37a061e9d76fb1f8cb387f", "type": "region", "code": "511323", "name": "蓬安县", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "3011d90b-97fa-4afd-af0d-7338c4b8db6b"], "path_name": ["中国", "四川省", "南充市", "蓬安县"], "status": "active", "sort": 1882, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "692e3aab-5559-49f1-9aaf-b65700577647", "_rev": "2-e552f6d6bd5be298b882887fd344e27a", "type": "region", "code": "370614", "name": "蓬莱区", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "692e3aab-5559-49f1-9aaf-b65700577647"], "path_name": ["中国", "山东省", "烟台市", "蓬莱区"], "status": "active", "sort": 1884, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "80a0c2fe-3d07-491e-88b8-908f1d8db602", "_rev": "2-c905c04c6dc3e0a11c5d32a46dbb29f9", "type": "region", "code": "510921", "name": "蓬溪县", "parent_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "80a0c2fe-3d07-491e-88b8-908f1d8db602"], "path_name": ["中国", "四川省", "遂宁市", "蓬溪县"], "status": "active", "sort": 1885, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "a320d8ae-79bb-402a-8292-e940e9191fd5", "_rev": "2-5f3569fa1620801a3a95b60d66f2f42e", "type": "region", "code": "510117", "name": "郫都区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "a320d8ae-79bb-402a-8292-e940e9191fd5"], "path_name": ["中国", "四川省", "成都市", "郫都区"], "status": "active", "sort": 1888, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "ac2d0d45-6f68-45b4-b57b-2ed2779e27b0", "_rev": "2-5c673c0652b7a1019578c20c048463ea", "type": "region", "code": "140932", "name": "偏关县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "ac2d0d45-6f68-45b4-b57b-2ed2779e27b0"], "path_name": ["中国", "山西省", "忻州市", "偏关县"], "status": "active", "sort": 1889, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "bd3f578e-042b-4ab6-aac3-974c43f45864", "_rev": "2-f18024c7e36390220ea49511b2928c1a", "type": "region", "code": "510182", "name": "彭州市", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "bd3f578e-042b-4ab6-aac3-974c43f45864"], "path_name": ["中国", "四川省", "成都市", "彭州市"], "status": "active", "sort": 1881, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "bf0b6545-bad5-4d81-9892-747c1953adf7", "_rev": "2-5a477f91c7f8fe0f8b472621a40bd1d2", "type": "region", "code": "653223", "name": "皮山县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "bf0b6545-bad5-4d81-9892-747c1953adf7"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "皮山县"], "status": "active", "sort": 1887, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "bfedaf3d-32eb-4436-b57d-11f18035ce00", "_rev": "2-c78326e2f9ecdd97bae2443a1b52f4d3", "type": "region", "code": "320382", "name": "邳州市", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "bfedaf3d-32eb-4436-b57d-11f18035ce00"], "path_name": ["中国", "江苏省", "徐州市", "邳州市"], "status": "active", "sort": 1886, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:19"} +{"_id": "10173fef-740f-4aef-9e75-7b447c511eed", "_rev": "2-fb26232aa2c4983b241e724a9934f3c4", "type": "region", "code": "511923", "name": "平昌县", "parent_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "10173fef-740f-4aef-9e75-7b447c511eed"], "path_name": ["中国", "四川省", "巴中市", "平昌县"], "status": "active", "sort": 1892, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "11dafa04-58dd-4fad-bf22-9ff740f43567", "_rev": "2-66ca600be2700bdd901ecbde32e5e5c5", "type": "region", "code": "350628", "name": "平和县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "11dafa04-58dd-4fad-bf22-9ff740f43567"], "path_name": ["中国", "福建省", "漳州市", "平和县"], "status": "active", "sort": 1900, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "1bcd3c41-3988-4176-a5c6-b488c165976b", "_rev": "2-3a0032a4537ae5a0733942a614392009", "type": "region", "code": "451103", "name": "平桂区", "parent_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "1bcd3c41-3988-4176-a5c6-b488c165976b"], "path_name": ["中国", "广西壮族自治区", "贺州市", "平桂区"], "status": "active", "sort": 1898, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "1ef901d5-8a6f-4779-afc0-312b70e5b508", "_rev": "2-da4370dc026c07fa2f465cd17aa778e9", "type": "region", "code": "451082", "name": "平果市", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "1ef901d5-8a6f-4779-afc0-312b70e5b508"], "path_name": ["中国", "广西壮族自治区", "百色市", "平果市"], "status": "active", "sort": 1899, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "1f23bf11-fb19-47c0-b8fd-3b3b63a29ce2", "_rev": "2-678fd9b90567dc4736ded022aae33fbe", "type": "region", "code": "620403", "name": "平川区", "parent_id": "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "44cb4d26-46cf-4c71-8f90-5e071ae5415c", "1f23bf11-fb19-47c0-b8fd-3b3b63a29ce2"], "path_name": ["中国", "甘肃省", "白银市", "平川区"], "status": "active", "sort": 1893, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "623a1e27-b4f8-4f7c-aa26-542d04912a41", "_rev": "2-85fb5ce7d996b7f0b0a5ebd60a568058", "type": "region", "code": "520403", "name": "平坝区", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "623a1e27-b4f8-4f7c-aa26-542d04912a41"], "path_name": ["中国", "贵州省", "安顺市", "平坝区"], "status": "active", "sort": 1891, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "7ed5c765-34ec-4366-9f4c-1cba57842f7e", "_rev": "2-6fdff52caf8cd33fc23bb35f9add650e", "type": "region", "code": "370283", "name": "平度市", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "7ed5c765-34ec-4366-9f4c-1cba57842f7e"], "path_name": ["中国", "山东省", "青岛市", "平度市"], "status": "active", "sort": 1895, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "9999f6f4-813a-4188-82c9-d98dc285c1ee", "_rev": "2-8068d5636ad4d748e71e9fd3467528cf", "type": "region", "code": "110117", "name": "平谷区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "9999f6f4-813a-4188-82c9-d98dc285c1ee"], "path_name": ["中国", "北京市", "平谷区"], "status": "active", "sort": 1897, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "b371f469-1b0b-430c-9aa2-5f0491b7f50d", "_rev": "2-b0085dfb105ed41fb6a1003a00e592e6", "type": "region", "code": "230108", "name": "平房区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "b371f469-1b0b-430c-9aa2-5f0491b7f50d"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "平房区"], "status": "active", "sort": 1896, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "bf1ad01b-c2c1-4964-8dda-2d0a30fa02dc", "_rev": "2-d3964a793043a82280b47cd0276c0daf", "type": "region", "code": "140321", "name": "平定县", "parent_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "bf1ad01b-c2c1-4964-8dda-2d0a30fa02dc"], "path_name": ["中国", "山西省", "阳泉市", "平定县"], "status": "active", "sort": 1894, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "e5875003-a041-4aff-b114-3aff81b682c6", "_rev": "2-056a5ba591416945c0431389d507d0f4", "type": "region", "code": "330482", "name": "平湖市", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "e5875003-a041-4aff-b114-3aff81b682c6"], "path_name": ["中国", "浙江省", "嘉兴市", "平湖市"], "status": "active", "sort": 1901, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:20"} +{"_id": "19edeae0-fddf-4b87-828a-2503cb53cc2c", "_rev": "2-72112f3568c16973119816784457f3c8", "type": "region", "code": "450330", "name": "平乐县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "19edeae0-fddf-4b87-828a-2503cb53cc2c"], "path_name": ["中国", "广西壮族自治区", "桂林市", "平乐县"], "status": "active", "sort": 1903, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "224645a9-fb03-4981-97d5-a5066dc0879e", "_rev": "2-942ce1d7a8ebd63897bfc50f7f81e924", "type": "region", "code": "411503", "name": "平桥区", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "224645a9-fb03-4981-97d5-a5066dc0879e"], "path_name": ["中国", "河南省", "信阳市", "平桥区"], "status": "active", "sort": 1909, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "2843f752-d467-4014-bb15-85ff1317636c", "_rev": "2-c028d9bb613c2653f510c0ef86e77300", "type": "region", "code": "430626", "name": "平江县", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "2843f752-d467-4014-bb15-85ff1317636c"], "path_name": ["中国", "湖南省", "岳阳市", "平江县"], "status": "active", "sort": 1902, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "40c3a33a-0bf9-4ed5-978f-94bdf6e6a020", "_rev": "2-a56ba2e9182811659c57c2a38581d371", "type": "region", "code": "610926", "name": "平利县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "40c3a33a-0bf9-4ed5-978f-94bdf6e6a020"], "path_name": ["中国", "陕西省", "安康市", "平利县"], "status": "active", "sort": 1904, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "4d2bc024-b5fa-4603-8403-151ce79efaf7", "_rev": "2-77d56afd2e5c94f470924abf75536b0f", "type": "region", "code": "140603", "name": "平鲁区", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "4d2bc024-b5fa-4603-8403-151ce79efaf7"], "path_name": ["中国", "山西省", "朔州市", "平鲁区"], "status": "active", "sort": 1905, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "803de6f0-647f-4373-b664-9f668dfaea05", "_rev": "2-9eb2f9b0e67bb399c9ccb7f324199c2a", "type": "region", "code": "210502", "name": "平山区", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "803de6f0-647f-4373-b664-9f668dfaea05"], "path_name": ["中国", "辽宁省", "本溪市", "平山区"], "status": "active", "sort": 1911, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "8dafbab0-25fc-4c0e-9905-e5022140bbc2", "_rev": "2-536d9a8c7afa1fba2c5cdc6d2b1e5093", "type": "region", "code": "130881", "name": "平泉市", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "8dafbab0-25fc-4c0e-9905-e5022140bbc2"], "path_name": ["中国", "河北省", "承德市", "平泉市"], "status": "active", "sort": 1910, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "b29c812f-a9ca-4639-8002-364382635482", "_rev": "2-0b1af585ca1647e6c907b5d1ae690e6d", "type": "region", "code": "140829", "name": "平陆县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "b29c812f-a9ca-4639-8002-364382635482"], "path_name": ["中国", "山西省", "运城市", "平陆县"], "status": "active", "sort": 1906, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "bd204d9a-bd6e-4081-9167-068796898a3d", "_rev": "2-11a4a1b151f4e26265f9c196bf5d89dd", "type": "region", "code": "130131", "name": "平山县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "bd204d9a-bd6e-4081-9167-068796898a3d"], "path_name": ["中国", "河北省", "石家庄市", "平山县"], "status": "active", "sort": 1912, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "d3718ec1-3796-4219-a2f8-f18f0ac10aba", "_rev": "2-52e528ede3c546b4968eb70515a83d50", "type": "region", "code": "450821", "name": "平南县", "parent_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1", "d3718ec1-3796-4219-a2f8-f18f0ac10aba"], "path_name": ["中国", "广西壮族自治区", "贵港市", "平南县"], "status": "active", "sort": 1908, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "e10600ef-1fea-4b2f-a82c-8371d37f6e40", "_rev": "2-8e0bf3768e1b68478ab4c5a4ed2165fe", "type": "region", "code": "640221", "name": "平罗县", "parent_id": "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "e6b1efcc-9dd0-4870-bfac-a2a71bc07708", "e10600ef-1fea-4b2f-a82c-8371d37f6e40"], "path_name": ["中国", "宁夏回族自治区", "石嘴山市", "平罗县"], "status": "active", "sort": 1907, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:21"} +{"_id": "071724fe-c63b-4467-b1ba-891acdf6d417", "_rev": "2-1849781dbd12d9a513910e96822e6221", "type": "region", "code": "130532", "name": "平乡县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "071724fe-c63b-4467-b1ba-891acdf6d417"], "path_name": ["中国", "河北省", "邢台市", "平乡县"], "status": "active", "sort": 1917, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "080b54d7-9df2-477c-8cb8-f02502aeeb9d", "_rev": "2-898187cfddceb2b0ffa77f41d7abe0e0", "type": "region", "code": "330326", "name": "平阳县", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "080b54d7-9df2-477c-8cb8-f02502aeeb9d"], "path_name": ["中国", "浙江省", "温州市", "平阳县"], "status": "active", "sort": 1918, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "08a8d15c-1348-4645-86e6-ac8857bb1c19", "_rev": "2-52dd5265a3f0c9463fe00a23a4d2e7cb", "type": "region", "code": "371326", "name": "平邑县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "08a8d15c-1348-4645-86e6-ac8857bb1c19"], "path_name": ["中国", "山东省", "临沂市", "平邑县"], "status": "active", "sort": 1920, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "0c85c01a-e51f-48cd-93de-38de4462aa12", "_rev": "2-fcf66ab9dbe15248918ac8f438e76eaf", "type": "region", "code": "140425", "name": "平顺县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "0c85c01a-e51f-48cd-93de-38de4462aa12"], "path_name": ["中国", "山西省", "长治市", "平顺县"], "status": "active", "sort": 1913, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "382129a6-62ba-4283-927c-b358673b7b29", "_rev": "2-26608469b55af8b6a2c226c714fbfc92", "type": "region", "code": "510727", "name": "平武县", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "382129a6-62ba-4283-927c-b358673b7b29"], "path_name": ["中国", "四川省", "绵阳市", "平武县"], "status": "active", "sort": 1916, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "3b294b1d-99d1-4657-8256-2d10dd432130", "_rev": "2-a562b03884868d8324555d4ab48eb8a3", "type": "region", "code": "411723", "name": "平舆县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "3b294b1d-99d1-4657-8256-2d10dd432130"], "path_name": ["中国", "河南省", "驻马店市", "平舆县"], "status": "active", "sort": 1922, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "3c72cce0-b734-486d-8170-58213e245468", "_rev": "2-5ea267061e10fe0733fdf00d117a75cc", "type": "region", "code": "350128", "name": "平潭县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "3c72cce0-b734-486d-8170-58213e245468"], "path_name": ["中国", "福建省", "福州市", "平潭县"], "status": "active", "sort": 1914, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "6e6d36e5-85fc-46e9-9bb7-a31d628c7d85", "_rev": "2-ddf6e48e07ccb7e27ecb2f08f9dd10ec", "type": "region", "code": "140728", "name": "平遥县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "6e6d36e5-85fc-46e9-9bb7-a31d628c7d85"], "path_name": ["中国", "山西省", "晋中市", "平遥县"], "status": "active", "sort": 1919, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "75880a58-fc8b-410d-82a9-05366f2b65d8", "_rev": "2-7d1817ba922db9d33f7216e69835db81", "type": "region", "code": "522727", "name": "平塘县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "75880a58-fc8b-410d-82a9-05366f2b65d8"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "平塘县"], "status": "active", "sort": 1915, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "bc8d0b09-2b6b-45a5-87e9-df17491f3201", "_rev": "2-644f66df14e7e53c775d8578a4fd1625", "type": "region", "code": "370124", "name": "平阴县", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "bc8d0b09-2b6b-45a5-87e9-df17491f3201"], "path_name": ["中国", "山东省", "济南市", "平阴县"], "status": "active", "sort": 1921, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:22"} +{"_id": "580f8ee6-7003-4c17-849a-5bebd319b1b1", "_rev": "2-02aa5d85bca31ff700cd9807b573f144", "type": "region", "code": "440804", "name": "坡头区", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "580f8ee6-7003-4c17-849a-5bebd319b1b1"], "path_name": ["中国", "广东省", "湛江市", "坡头区"], "status": "active", "sort": 1929, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "6902688a-e193-4469-a5ce-b1d4d7e1d783", "_rev": "2-d9b88d028585793549c7782086bbd57d", "type": "region", "code": "532523", "name": "屏边苗族自治县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "6902688a-e193-4469-a5ce-b1d4d7e1d783"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "屏边苗族自治县"], "status": "active", "sort": 1926, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "79f31e95-0aa1-41f0-905e-e132bf8e0659", "_rev": "2-ce33dcf2a9eeb7a195d5f27652eea791", "type": "region", "code": "451481", "name": "凭祥市", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "79f31e95-0aa1-41f0-905e-e132bf8e0659"], "path_name": ["中国", "广西壮族自治区", "崇左市", "凭祥市"], "status": "active", "sort": 1925, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "877a5183-cec3-4378-bf55-ae5e3848843d", "_rev": "2-691295091a476892f677381c7d17f1b2", "type": "region", "code": "610526", "name": "蒲城县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "877a5183-cec3-4378-bf55-ae5e3848843d"], "path_name": ["中国", "陕西省", "渭南市", "蒲城县"], "status": "active", "sort": 1932, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "9ddfba03-cc85-4ca3-805d-040afbb5e8cb", "_rev": "2-821a10a8fc0384b356819fe203886fb7", "type": "region", "code": "361128", "name": "鄱阳县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "9ddfba03-cc85-4ca3-805d-040afbb5e8cb"], "path_name": ["中国", "江西省", "上饶市", "鄱阳县"], "status": "active", "sort": 1931, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "a98e47d1-a472-429b-bc80-ff25d9dcf153", "_rev": "2-470f61526eb648879c4c82defff0668e", "type": "region", "code": "130981", "name": "泊头市", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "a98e47d1-a472-429b-bc80-ff25d9dcf153"], "path_name": ["中国", "河北省", "沧州市", "泊头市"], "status": "active", "sort": 1930, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "ab3972cf-186f-4309-8ec3-05ca33af715c", "_rev": "2-024d0959f906d8b87b959e2754925bb8", "type": "region", "code": "371426", "name": "平原县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "ab3972cf-186f-4309-8ec3-05ca33af715c"], "path_name": ["中国", "山东省", "德州市", "平原县"], "status": "active", "sort": 1923, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "b21e0cfb-e0c8-4766-88fe-8d4aac93279e", "_rev": "2-127462ea8f7521d5d4ad51fc7e1f91dc", "type": "region", "code": "350923", "name": "屏南县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "b21e0cfb-e0c8-4766-88fe-8d4aac93279e"], "path_name": ["中国", "福建省", "宁德市", "屏南县"], "status": "active", "sort": 1927, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "d28e98d9-0ea9-4143-ba94-50e4de1e1894", "_rev": "2-eb2da529322919722397c2613a2ac0ca", "type": "region", "code": "511529", "name": "屏山县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "d28e98d9-0ea9-4143-ba94-50e4de1e1894"], "path_name": ["中国", "四川省", "宜宾市", "屏山县"], "status": "active", "sort": 1928, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "dccdec23-89fb-4865-ad48-dd79e13d656d", "_rev": "2-1ab57ea0d1e768d7052fd5cd29a10cc5", "type": "region", "code": "441426", "name": "平远县", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "dccdec23-89fb-4865-ad48-dd79e13d656d"], "path_name": ["中国", "广东省", "梅州市", "平远县"], "status": "active", "sort": 1924, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:23"} +{"_id": "12c3bf74-91f2-4669-9953-efefa312691c", "_rev": "2-71dc2108afe696dc5ccc9154c39b8150", "type": "region", "code": "450722", "name": "浦北县", "parent_id": "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "12c3bf74-91f2-4669-9953-efefa312691c"], "path_name": ["中国", "广西壮族自治区", "钦州市", "浦北县"], "status": "active", "sort": 1936, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "196dc5c8-e6ba-44bf-a770-afa0c1291986", "_rev": "2-4cca0bb771ead2474e9062e49d3d9911", "type": "region", "code": "410928", "name": "濮阳县", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "196dc5c8-e6ba-44bf-a770-afa0c1291986"], "path_name": ["中国", "河南省", "濮阳市", "濮阳县"], "status": "active", "sort": 1935, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "25ff31e3-0123-4c64-a356-de145c0658e0", "_rev": "2-1b5f434095072c7562c7268ac895293d", "type": "region", "code": "141033", "name": "蒲县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "25ff31e3-0123-4c64-a356-de145c0658e0"], "path_name": ["中国", "山西省", "临汾市", "蒲县"], "status": "active", "sort": 1934, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "46dfe767-865e-49fd-be60-58302cc5e7ec", "_rev": "2-4ac574a4199f48260bd3f9e592ea3ec5", "type": "region", "code": "310115", "name": "浦东新区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "46dfe767-865e-49fd-be60-58302cc5e7ec"], "path_name": ["中国", "上海市", "浦东新区"], "status": "active", "sort": 1938, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "6814d286-1cd2-47db-a7cc-e2e41e23a1c7", "_rev": "2-8b8aed86467601f249eb7c6fc8c0ba54", "type": "region", "code": "330726", "name": "浦江县", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "6814d286-1cd2-47db-a7cc-e2e41e23a1c7"], "path_name": ["中国", "浙江省", "金华市", "浦江县"], "status": "active", "sort": 1939, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "6becfc2e-f9e7-48af-aac6-104996fbb096", "_rev": "2-1c7cb8538e97cfa6a96a81ec8a8e282e", "type": "region", "code": "510131", "name": "蒲江县", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "6becfc2e-f9e7-48af-aac6-104996fbb096"], "path_name": ["中国", "四川省", "成都市", "蒲江县"], "status": "active", "sort": 1933, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "7c3c3181-0100-412e-a74b-cb9a64e9232d", "_rev": "2-2827ad3aff13354e7421886fe42a9a73", "type": "region", "code": "320111", "name": "浦口区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "7c3c3181-0100-412e-a74b-cb9a64e9232d"], "path_name": ["中国", "江苏省", "南京市", "浦口区"], "status": "active", "sort": 1940, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "b13fdb6d-755a-44ba-a50a-9f33f785ee05", "_rev": "2-1f193826d5c928ed9222211a13b9440d", "type": "region", "code": "350722", "name": "浦城县", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "b13fdb6d-755a-44ba-a50a-9f33f785ee05"], "path_name": ["中国", "福建省", "南平市", "浦城县"], "status": "active", "sort": 1937, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "d5ca1640-55bd-483d-8612-e4412a8732ba", "_rev": "2-107400286863603fa8d6184ae1d3e1cb", "type": "region", "code": "520422", "name": "普定县", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "d5ca1640-55bd-483d-8612-e4412a8732ba"], "path_name": ["中国", "贵州省", "安顺市", "普定县"], "status": "active", "sort": 1942, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "d60787f1-a29b-4c06-834e-c0812f1e6bd5", "_rev": "2-d02add1c780508e2ac62901d04ef2a7e", "type": "region", "code": "522323", "name": "普安县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "d60787f1-a29b-4c06-834e-c0812f1e6bd5"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "普安县"], "status": "active", "sort": 1941, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:24"} +{"_id": "04109ec4-adaf-45a7-bac3-6f04b59bff5b", "_rev": "2-9b1c3d52a59ec0e949d7472eb00605a6", "type": "region", "code": "445281", "name": "普宁市", "parent_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326", "04109ec4-adaf-45a7-bac3-6f04b59bff5b"], "path_name": ["中国", "广东省", "揭阳市", "普宁市"], "status": "active", "sort": 1946, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "1557fac2-9c28-4be1-b1f8-e67c52fc6937", "_rev": "2-74189f2dd9950c9a6755508c717bde04", "type": "region", "code": "520502", "name": "七星关区", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "1557fac2-9c28-4be1-b1f8-e67c52fc6937"], "path_name": ["中国", "贵州省", "毕节市", "七星关区"], "status": "active", "sort": 1948, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "22ebbde7-5aa2-4100-9935-0d79d42d4c02", "_rev": "2-52d1f34b21b480d37a717ca9a58516eb", "type": "region", "code": "450305", "name": "七星区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "22ebbde7-5aa2-4100-9935-0d79d42d4c02"], "path_name": ["中国", "广西壮族自治区", "桂林市", "七星区"], "status": "active", "sort": 1949, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "336915d3-a7d8-4c70-b05a-a8103cdf1ca3", "_rev": "2-42578ab5cd55e7ab8170a251f36c2b8d", "type": "region", "code": "370686", "name": "栖霞市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "336915d3-a7d8-4c70-b05a-a8103cdf1ca3"], "path_name": ["中国", "山东省", "烟台市", "栖霞市"], "status": "active", "sort": 1951, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "501d4cbb-af5f-4674-85aa-e87d18c24131", "_rev": "2-4d94c423f912f6f1e77bab93446f5af1", "type": "region", "code": "542521", "name": "普兰县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "501d4cbb-af5f-4674-85aa-e87d18c24131"], "path_name": ["中国", "西藏自治区", "阿里地区", "普兰县"], "status": "active", "sort": 1945, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "567aef1e-8a35-4a14-803a-48f0fac4db2a", "_rev": "2-51d020a47143babc5f76668f0f27d0a9", "type": "region", "code": "210214", "name": "普兰店区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "567aef1e-8a35-4a14-803a-48f0fac4db2a"], "path_name": ["中国", "辽宁省", "大连市", "普兰店区"], "status": "active", "sort": 1944, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "5863e60c-2653-4bdd-a126-542b773187e8", "_rev": "2-b7ee50204ee17bdefc4283633348af73", "type": "region", "code": "620103", "name": "七里河区", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "5863e60c-2653-4bdd-a126-542b773187e8"], "path_name": ["中国", "甘肃省", "兰州市", "七里河区"], "status": "active", "sort": 1947, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "5985eef5-521a-4d76-a289-856e25d167a8", "_rev": "2-d3434dde916c196e76e79aefc5fbcd0d", "type": "region", "code": "513428", "name": "普格县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "5985eef5-521a-4d76-a289-856e25d167a8"], "path_name": ["中国", "四川省", "凉山彝族自治州", "普格县"], "status": "active", "sort": 1943, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "5c67f14e-069f-477b-88de-074d42371311", "_rev": "2-7755592e237e58a665ac42f298f214db", "type": "region", "code": "320113", "name": "栖霞区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "5c67f14e-069f-477b-88de-074d42371311"], "path_name": ["中国", "江苏省", "南京市", "栖霞区"], "status": "active", "sort": 1950, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "a70371d2-4abc-4f10-ba78-cee895513247", "_rev": "2-53b915541aed6660a3e7fa71ceef3d57", "type": "region", "code": "371425", "name": "齐河县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "a70371d2-4abc-4f10-ba78-cee895513247"], "path_name": ["中国", "山东省", "德州市", "齐河县"], "status": "active", "sort": 1952, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:25"} +{"_id": "1b00e49a-3b73-4250-9aad-2946c482fb53", "_rev": "2-61a33dc27d992fb69cfa9d9b4456032b", "type": "region", "code": "430426", "name": "祁东县", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "1b00e49a-3b73-4250-9aad-2946c482fb53"], "path_name": ["中国", "湖南省", "衡阳市", "祁东县"], "status": "active", "sort": 1953, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "2014d53a-34b1-471e-9e84-1e260dca730d", "_rev": "2-c3a00922892c39737846b643e6d027c9", "type": "region", "code": "431181", "name": "祁阳市", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "2014d53a-34b1-471e-9e84-1e260dca730d"], "path_name": ["中国", "湖南省", "永州市", "祁阳市"], "status": "active", "sort": 1957, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "4694a892-9500-473c-812d-9935dbd920ac", "_rev": "2-9adf49e5d985c4d3cb143c4a31d2536f", "type": "region", "code": "500110", "name": "綦江区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "4694a892-9500-473c-812d-9935dbd920ac"], "path_name": ["中国", "重庆市", "綦江区"], "status": "active", "sort": 1962, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "4f210552-ba67-4614-9c85-e66e201bede4", "_rev": "2-6820eee73e094b392ff9482fdae94963", "type": "region", "code": "632222", "name": "祁连县", "parent_id": "2bf3b2cb-593a-43d2-8935-ee539787b601", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "2bf3b2cb-593a-43d2-8935-ee539787b601", "4f210552-ba67-4614-9c85-e66e201bede4"], "path_name": ["中国", "青海省", "海北藏族自治州", "祁连县"], "status": "active", "sort": 1954, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "59b19341-7b72-454a-bb46-2796b12a1246", "_rev": "2-5568c04f2fba65cb86059ad16a3c21af", "type": "region", "code": "410622", "name": "淇县", "parent_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7", "59b19341-7b72-454a-bb46-2796b12a1246"], "path_name": ["中国", "河南省", "鹤壁市", "淇县"], "status": "active", "sort": 1961, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "63efa347-c230-4495-95e5-afab9612715a", "_rev": "2-51528756ddcf4980b31bd4689930395a", "type": "region", "code": "341024", "name": "祁门县", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "63efa347-c230-4495-95e5-afab9612715a"], "path_name": ["中国", "安徽省", "黄山市", "祁门县"], "status": "active", "sort": 1955, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "6ecc488f-637d-4b31-9a46-86c100eab4a1", "_rev": "2-f9b6e5bc7a77b27bb4e5cc7d19a1037b", "type": "region", "code": "140727", "name": "祁县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "6ecc488f-637d-4b31-9a46-86c100eab4a1"], "path_name": ["中国", "山西省", "晋中市", "祁县"], "status": "active", "sort": 1956, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "7d52b0f7-72a0-4028-8063-ecda3d0c02af", "_rev": "2-f917a43c131731afde801e80b0eae97e", "type": "region", "code": "421126", "name": "蕲春县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "7d52b0f7-72a0-4028-8063-ecda3d0c02af"], "path_name": ["中国", "湖北省", "黄冈市", "蕲春县"], "status": "active", "sort": 1963, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "a0751432-55c2-456d-938c-1c474df0924d", "_rev": "2-9bbf0564f27c81cd5610034d88a77c2b", "type": "region", "code": "410611", "name": "淇滨区", "parent_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7", "a0751432-55c2-456d-938c-1c474df0924d"], "path_name": ["中国", "河南省", "鹤壁市", "淇滨区"], "status": "active", "sort": 1960, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "adbd8a92-7755-4092-80c7-d002daf56086", "_rev": "2-06cc14d38fd33d054941fd9fe1691895", "type": "region", "code": "610323", "name": "岐山县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "adbd8a92-7755-4092-80c7-d002daf56086"], "path_name": ["中国", "陕西省", "宝鸡市", "岐山县"], "status": "active", "sort": 1958, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "e671900e-e548-4743-aedc-13ff9624887f", "_rev": "2-98328e236d69d727755e478412835789", "type": "region", "code": "652325", "name": "奇台县", "parent_id": "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "f6ba89b7-7141-420b-9a13-d0d89d6709cb", "e671900e-e548-4743-aedc-13ff9624887f"], "path_name": ["中国", "新疆维吾尔自治区", "昌吉回族自治州", "奇台县"], "status": "active", "sort": 1959, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:26"} +{"_id": "04df4287-8e3b-472d-b917-54c9cdfa834d", "_rev": "2-23a2097618435434bb1c3a247e70ff48", "type": "region", "code": "610328", "name": "千阳县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "04df4287-8e3b-472d-b917-54c9cdfa834d"], "path_name": ["中国", "陕西省", "宝鸡市", "千阳县"], "status": "active", "sort": 1968, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "18590475-3a46-498f-a3ec-1935c694c3a9", "_rev": "2-869420b85994f01ee2d43dda817ed1ef", "type": "region", "code": "530302", "name": "麒麟区", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "18590475-3a46-498f-a3ec-1935c694c3a9"], "path_name": ["中国", "云南省", "曲靖市", "麒麟区"], "status": "active", "sort": 1964, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "31449a79-a794-48e4-b6b3-58206dda1bb2", "_rev": "2-cc1841a664ad054dfbfc1ccc8052d47c", "type": "region", "code": "410221", "name": "杞县", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "31449a79-a794-48e4-b6b3-58206dda1bb2"], "path_name": ["中国", "河南省", "开封市", "杞县"], "status": "active", "sort": 1965, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "6df07306-074d-41a2-8a2d-4023575a0ef2", "_rev": "2-f063556659df479ab5b712c04b937d17", "type": "region", "code": "130227", "name": "迁西县", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "6df07306-074d-41a2-8a2d-4023575a0ef2"], "path_name": ["中国", "河北省", "唐山市", "迁西县"], "status": "active", "sort": 1970, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "817da4a5-be0c-4aa1-b1c8-5a27d49852ff", "_rev": "2-51a7e640103f308cbf67837494d39570", "type": "region", "code": "511603", "name": "前锋区", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "817da4a5-be0c-4aa1-b1c8-5a27d49852ff"], "path_name": ["中国", "四川省", "广安市", "前锋区"], "status": "active", "sort": 1972, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "8a70f1e6-fc13-4e04-b02e-97f55ff63435", "_rev": "2-e6c03d2d97fa9c15fb2d4aef70bd36af", "type": "region", "code": "320681", "name": "启东市", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "8a70f1e6-fc13-4e04-b02e-97f55ff63435"], "path_name": ["中国", "江苏省", "南通市", "启东市"], "status": "active", "sort": 1966, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "a1d9dd41-1a5e-4ae6-8f21-f1f03a858f58", "_rev": "2-b758212f040ee2949b60921bd71db489", "type": "region", "code": "361124", "name": "铅山县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "a1d9dd41-1a5e-4ae6-8f21-f1f03a858f58"], "path_name": ["中国", "江西省", "上饶市", "铅山县"], "status": "active", "sort": 1971, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "d04bfe0d-3785-4d12-83b0-3dd4b84036b7", "_rev": "2-aac0e1a5394e1b617c622b88e94190f6", "type": "region", "code": "220721", "name": "前郭尔罗斯蒙古族自治县", "parent_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8", "d04bfe0d-3785-4d12-83b0-3dd4b84036b7"], "path_name": ["中国", "吉林省", "松原市", "前郭尔罗斯蒙古族自治县"], "status": "active", "sort": 1973, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "d9817d03-ff06-4d58-85b7-cf2f163cd468", "_rev": "2-20dcae8605ddce147f0bf4cb6c6c0461", "type": "region", "code": "130283", "name": "迁安市", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "d9817d03-ff06-4d58-85b7-cf2f163cd468"], "path_name": ["中国", "河北省", "唐山市", "迁安市"], "status": "active", "sort": 1969, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "ecefa513-e39e-48a5-9a74-c703cb2540aa", "_rev": "2-6f299abcc1016808523d17e5c0707b80", "type": "region", "code": "210311", "name": "千山区", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "ecefa513-e39e-48a5-9a74-c703cb2540aa"], "path_name": ["中国", "辽宁省", "鞍山市", "千山区"], "status": "active", "sort": 1967, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:27"} +{"_id": "0416273e-f802-4c39-92ab-e1dfc155e9a4", "_rev": "2-1a29212119b4ef258bd02d4d0c9822b1", "type": "region", "code": "610424", "name": "乾县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "0416273e-f802-4c39-92ab-e1dfc155e9a4"], "path_name": ["中国", "陕西省", "咸阳市", "乾县"], "status": "active", "sort": 1976, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "145a1657-d62a-4eef-9a82-30d5c673d2a9", "_rev": "2-5ee5e52dc3689b1ac2e55b5d128eb6a8", "type": "region", "code": "500114", "name": "黔江区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "145a1657-d62a-4eef-9a82-30d5c673d2a9"], "path_name": ["中国", "重庆市", "黔江区"], "status": "active", "sort": 1980, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "23cc5f12-f770-4e48-b0e9-3181d0cfba2f", "_rev": "2-9858ff37f21e7d83ff0ad14cdeaa269b", "type": "region", "code": "429005", "name": "潜江市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23cc5f12-f770-4e48-b0e9-3181d0cfba2f"], "path_name": ["中国", "湖北省", "潜江市"], "status": "active", "sort": 1978, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "4e8ed604-8811-4c20-9461-aa5903508f11", "_rev": "2-a5708fd5575e307b46abe5990b895613", "type": "region", "code": "420000", "name": "直辖", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "4e8ed604-8811-4c20-9461-aa5903508f11"], "path_name": ["中国", "湖北省", "直辖"], "status": "active", "sort": 1977, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "7866d2e8-0055-4571-a10c-ac180b556203", "_rev": "2-3f328c0511411ecfc8e27a1c4500bf25", "type": "region", "code": "520581", "name": "黔西市", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "7866d2e8-0055-4571-a10c-ac180b556203"], "path_name": ["中国", "贵州省", "毕节市", "黔西市"], "status": "active", "sort": 1981, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "d08d359b-e51e-4ac2-b53c-4423bcc765ec", "_rev": "2-cf53ff806d199e6ec13b195724dfd2c5", "type": "region", "code": "340882", "name": "潜山市", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "d08d359b-e51e-4ac2-b53c-4423bcc765ec"], "path_name": ["中国", "安徽省", "安庆市", "潜山市"], "status": "active", "sort": 1979, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "d6c2384f-0358-4403-a3ba-630fad394d2c", "_rev": "2-e28e05fca45e048b4ca5425ccd56c57e", "type": "region", "code": "220723", "name": "乾安县", "parent_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8", "d6c2384f-0358-4403-a3ba-630fad394d2c"], "path_name": ["中国", "吉林省", "松原市", "乾安县"], "status": "active", "sort": 1975, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "e3acabdf-59fc-4895-b6ca-2dba8101b5ba", "_rev": "2-0803ae3af27f4e14474fccf9ac3e34e6", "type": "region", "code": "420104", "name": "硚口区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "e3acabdf-59fc-4895-b6ca-2dba8101b5ba"], "path_name": ["中国", "湖北省", "武汉市", "硚口区"], "status": "active", "sort": 1982, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "f824671a-e5f4-4e4d-baa1-f1ee71da6642", "_rev": "2-7fd3dee3dea9ac9d7aedfcea2f9d8feb", "type": "region", "code": "230804", "name": "前进区", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "f824671a-e5f4-4e4d-baa1-f1ee71da6642"], "path_name": ["中国", "黑龙江省", "佳木斯市", "前进区"], "status": "active", "sort": 1974, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:28"} +{"_id": "020a1c95-e11a-4d17-8529-2a08f96e3b20", "_rev": "2-1e2271af8a733fd847e7cacd4069b64c", "type": "region", "code": "341602", "name": "谯城区", "parent_id": "32858a4f-58fe-4415-bbf3-22718a25b966", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "32858a4f-58fe-4415-bbf3-22718a25b966", "020a1c95-e11a-4d17-8529-2a08f96e3b20"], "path_name": ["中国", "安徽省", "亳州市", "谯城区"], "status": "active", "sort": 1983, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "05b9ec4d-a2e7-43ca-8a60-59d2b8c135dd", "_rev": "2-31752c950ff134e807f5e084e006552d", "type": "region", "code": "620522", "name": "秦安县", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "05b9ec4d-a2e7-43ca-8a60-59d2b8c135dd"], "path_name": ["中国", "甘肃省", "天水市", "秦安县"], "status": "active", "sort": 1989, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "1bc6b24c-5fc6-4711-8cca-3ff068d7cff1", "_rev": "2-3105a7507973f8ccb0a620ee916528a8", "type": "region", "code": "610402", "name": "秦都区", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "1bc6b24c-5fc6-4711-8cca-3ff068d7cff1"], "path_name": ["中国", "陕西省", "咸阳市", "秦都区"], "status": "active", "sort": 1990, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "347d69bc-8972-4920-bf1e-c0f44b8d5197", "_rev": "2-401811584e2b50c72a311e407a9b4421", "type": "region", "code": "450703", "name": "钦北区", "parent_id": "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "347d69bc-8972-4920-bf1e-c0f44b8d5197"], "path_name": ["中国", "广西壮族自治区", "钦州市", "钦北区"], "status": "active", "sort": 1987, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "3c99ac8c-c7c5-4208-88b0-ce69fd18f2a5", "_rev": "2-04ec783454d24cb369dd55b251b8b39c", "type": "region", "code": "620502", "name": "秦州区", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "3c99ac8c-c7c5-4208-88b0-ce69fd18f2a5"], "path_name": ["中国", "甘肃省", "天水市", "秦州区"], "status": "active", "sort": 1992, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "48fbe8c4-2315-441f-b515-c9dd35915a00", "_rev": "2-b934f7f423293c6374d55d982aac2ebf", "type": "region", "code": "530622", "name": "巧家县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "48fbe8c4-2315-441f-b515-c9dd35915a00"], "path_name": ["中国", "云南省", "昭通市", "巧家县"], "status": "active", "sort": 1984, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "4c1a54b2-59db-474f-8340-a2fc9d7cfa05", "_rev": "2-f24d8eb096a126eb96c169159f9a0df3", "type": "region", "code": "320104", "name": "秦淮区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "4c1a54b2-59db-474f-8340-a2fc9d7cfa05"], "path_name": ["中国", "江苏省", "南京市", "秦淮区"], "status": "active", "sort": 1991, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "67290646-7c46-4ae8-87d7-0a2c749f73fc", "_rev": "2-5625766e393a22b09820e47b901769a5", "type": "region", "code": "230904", "name": "茄子河区", "parent_id": "457b8969-a83b-457f-b231-06d5349d40a1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "457b8969-a83b-457f-b231-06d5349d40a1", "67290646-7c46-4ae8-87d7-0a2c749f73fc"], "path_name": ["中国", "黑龙江省", "七台河市", "茄子河区"], "status": "active", "sort": 1985, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "bc8fc506-44dc-4720-ac75-a287c6f0ab02", "_rev": "2-1c016b785e3249953935e7ce6f60116e", "type": "region", "code": "450702", "name": "钦南区", "parent_id": "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "0481a129-d323-4108-84ac-9fb3aa8a4eeb", "bc8fc506-44dc-4720-ac75-a287c6f0ab02"], "path_name": ["中国", "广西壮族自治区", "钦州市", "钦南区"], "status": "active", "sort": 1988, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "df0a2c6b-b80a-4dc0-a2af-bbeca11cf36b", "_rev": "2-aa433e6138f7c21f5fd2d600a72b23e3", "type": "region", "code": "652825", "name": "且末县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "df0a2c6b-b80a-4dc0-a2af-bbeca11cf36b"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "且末县"], "status": "active", "sort": 1986, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:29"} +{"_id": "13f416d1-9e07-4242-8131-e646fc2f73b4", "_rev": "2-a800c3c5b47249795ea721a6bff83f62", "type": "region", "code": "130321", "name": "青龙满族自治县", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "13f416d1-9e07-4242-8131-e646fc2f73b4"], "path_name": ["中国", "河北省", "秦皇岛市", "青龙满族自治县"], "status": "active", "sort": 2001, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "3c062a85-f3b4-478d-bb93-090e07530f6f", "_rev": "2-3b9323e125efde389485e644ddda10ae", "type": "region", "code": "310118", "name": "青浦区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "3c062a85-f3b4-478d-bb93-090e07530f6f"], "path_name": ["中国", "上海市", "青浦区"], "status": "active", "sort": 2002, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "756fb3a9-e563-4240-85d9-728c7248c7ee", "_rev": "2-5b89630b0cfa111e2f7b7e4657f2798e", "type": "region", "code": "510113", "name": "青白江区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "756fb3a9-e563-4240-85d9-728c7248c7ee"], "path_name": ["中国", "四川省", "成都市", "青白江区"], "status": "active", "sort": 1997, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "75856039-c8bd-4e1f-ba3a-28edd47cb950", "_rev": "2-2f8a4218285ce9a3f1fa4f172d8d7b36", "type": "region", "code": "140430", "name": "沁县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "75856039-c8bd-4e1f-ba3a-28edd47cb950"], "path_name": ["中国", "山西省", "长治市", "沁县"], "status": "active", "sort": 1994, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "8c2a3916-8efd-4916-96a0-adcb6901df9e", "_rev": "2-f7696ab907d22a8ca6420a2bb5b8fb79", "type": "region", "code": "654325", "name": "青河县", "parent_id": "5037280a-54dd-4c8a-89e4-5ea5704032de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5037280a-54dd-4c8a-89e4-5ea5704032de", "8c2a3916-8efd-4916-96a0-adcb6901df9e"], "path_name": ["中国", "新疆维吾尔自治区", "阿勒泰地区", "青河县"], "status": "active", "sort": 2000, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "946b3577-0040-4ef8-9821-e0e189e62f50", "_rev": "2-fba220b55ff1bf5c3f59c90d6ee8339e", "type": "region", "code": "140521", "name": "沁水县", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "946b3577-0040-4ef8-9821-e0e189e62f50"], "path_name": ["中国", "山西省", "晋城市", "沁水县"], "status": "active", "sort": 1993, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "c9ae9fe6-7c64-41b3-a7fe-4ab9b885088a", "_rev": "2-356d60b889f9ed0f6e750f0bb8c86f00", "type": "region", "code": "510822", "name": "青川县", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "c9ae9fe6-7c64-41b3-a7fe-4ab9b885088a"], "path_name": ["中国", "四川省", "广元市", "青川县"], "status": "active", "sort": 1998, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "cbc9f66b-4f84-49c5-81af-27cfccb0b8d4", "_rev": "2-92493aac5700e9cdfa1b810c109cde01", "type": "region", "code": "231223", "name": "青冈县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "cbc9f66b-4f84-49c5-81af-27cfccb0b8d4"], "path_name": ["中国", "黑龙江省", "绥化市", "青冈县"], "status": "active", "sort": 1999, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "e571ab3b-f444-4acd-9961-77f6098c1e93", "_rev": "2-2c24a117280ec720435db452ca6ef447", "type": "region", "code": "410882", "name": "沁阳市", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "e571ab3b-f444-4acd-9961-77f6098c1e93"], "path_name": ["中国", "河南省", "焦作市", "沁阳市"], "status": "active", "sort": 1995, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "fec1d682-c48d-4a65-94a6-06456da01819", "_rev": "2-7cd87bda1fa73f11e2d50a8c6fcedadc", "type": "region", "code": "140431", "name": "沁源县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "fec1d682-c48d-4a65-94a6-06456da01819"], "path_name": ["中国", "山西省", "长治市", "沁源县"], "status": "active", "sort": 1996, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:30"} +{"_id": "0987aaaf-28c9-4c90-b624-689ddcb79a1b", "_rev": "2-215c125bae8dfc5026d1051ed00d3a38", "type": "region", "code": "510105", "name": "青羊区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "0987aaaf-28c9-4c90-b624-689ddcb79a1b"], "path_name": ["中国", "四川省", "成都市", "青羊区"], "status": "active", "sort": 2009, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "1623d20a-16ef-4bd7-ab5e-5c38274fc3e3", "_rev": "2-9b70f9923537371ad826ffeb16a19f2a", "type": "region", "code": "360803", "name": "青原区", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "1623d20a-16ef-4bd7-ab5e-5c38274fc3e3"], "path_name": ["中国", "江西省", "吉安市", "青原区"], "status": "active", "sort": 2011, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "2711d1e2-aba5-469e-a6c4-598be8bab35a", "_rev": "2-446037cbbbad59b1144a32d626b7fdbe", "type": "region", "code": "450103", "name": "青秀区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "2711d1e2-aba5-469e-a6c4-598be8bab35a"], "path_name": ["中国", "广西壮族自治区", "南宁市", "青秀区"], "status": "active", "sort": 2008, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "5e88e101-e93b-4d65-813d-92b9522c2781", "_rev": "2-0afa2d5d608eebc695085297fcb2150c", "type": "region", "code": "360111", "name": "青山湖区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "5e88e101-e93b-4d65-813d-92b9522c2781"], "path_name": ["中国", "江西省", "南昌市", "青山湖区"], "status": "active", "sort": 2003, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "71d55b6f-f552-4135-9610-a015c856ec90", "_rev": "2-3e945866a46a93e1d8fb96adc4feb8d3", "type": "region", "code": "640381", "name": "青铜峡市", "parent_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858", "71d55b6f-f552-4135-9610-a015c856ec90"], "path_name": ["中国", "宁夏回族自治区", "吴忠市", "青铜峡市"], "status": "active", "sort": 2006, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "a0688aa8-2d9f-4108-9c3f-c4f83e5d35ef", "_rev": "2-9712650fcd8d982bf92b19112b778f17", "type": "region", "code": "331121", "name": "青田县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "a0688aa8-2d9f-4108-9c3f-c4f83e5d35ef"], "path_name": ["中国", "浙江省", "丽水市", "青田县"], "status": "active", "sort": 2005, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "ad643bfc-b99f-436b-bfe1-67e6c80fe4b5", "_rev": "2-bb46657d57ac54d5143d6526eb583c6a", "type": "region", "code": "511425", "name": "青神县", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "ad643bfc-b99f-436b-bfe1-67e6c80fe4b5"], "path_name": ["中国", "四川省", "眉山市", "青神县"], "status": "active", "sort": 2004, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "e92bd51d-5014-4c1b-8f53-d8cecee98e68", "_rev": "2-24008d36d98c25cb2c6bed29e695bd56", "type": "region", "code": "360104", "name": "青云谱区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "e92bd51d-5014-4c1b-8f53-d8cecee98e68"], "path_name": ["中国", "江西省", "南昌市", "青云谱区"], "status": "active", "sort": 2012, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "f17d7a5b-bac2-4bbc-a324-b9b62b60458e", "_rev": "2-a360b0a64919246aab77e21246d5d0b2", "type": "region", "code": "130922", "name": "青县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "f17d7a5b-bac2-4bbc-a324-b9b62b60458e"], "path_name": ["中国", "河北省", "沧州市", "青县"], "status": "active", "sort": 2007, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "f560ce58-831f-4766-87e2-659c7dada0cf", "_rev": "2-ae1d1c23fefbc5b2b318e01be4bc864e", "type": "region", "code": "341723", "name": "青阳县", "parent_id": "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "f560ce58-831f-4766-87e2-659c7dada0cf"], "path_name": ["中国", "安徽省", "池州市", "青阳县"], "status": "active", "sort": 2010, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:31"} +{"_id": "13ff0752-142f-4429-85ed-e481beef94c6", "_rev": "2-6c261bef967ae92db994b7c6ca87b8ef", "type": "region", "code": "150124", "name": "清水河县", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "13ff0752-142f-4429-85ed-e481beef94c6"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "清水河县"], "status": "active", "sort": 2022, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "22894540-0b40-4858-b2cf-2f8bbc7c2d65", "_rev": "2-b3d6e17aeca789f6c583fddc86f9df99", "type": "region", "code": "350423", "name": "清流县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "22894540-0b40-4858-b2cf-2f8bbc7c2d65"], "path_name": ["中国", "福建省", "三明市", "清流县"], "status": "active", "sort": 2021, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "37d4c74f-1d97-4b74-b94e-327b3eef9481", "_rev": "2-5dcb26b5cfab2c1b9d44521649cf630c", "type": "region", "code": "211204", "name": "清河区", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "37d4c74f-1d97-4b74-b94e-327b3eef9481"], "path_name": ["中国", "辽宁省", "铁岭市", "清河区"], "status": "active", "sort": 2017, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "3f24142f-c425-4428-bd5a-5699d215a73b", "_rev": "2-f64bb2e7017ec883d1849f0aa1037719", "type": "region", "code": "320812", "name": "清江浦区", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "3f24142f-c425-4428-bd5a-5699d215a73b"], "path_name": ["中国", "江苏省", "淮安市", "清江浦区"], "status": "active", "sort": 2020, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "6996a98d-2bbd-4217-af55-ae2901787eec", "_rev": "2-4209127b8a5046c5d82a274436087ccb", "type": "region", "code": "610830", "name": "清涧县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "6996a98d-2bbd-4217-af55-ae2901787eec"], "path_name": ["中国", "陕西省", "榆林市", "清涧县"], "status": "active", "sort": 2019, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "8a869450-652e-4d79-8ff9-bbea5a48306f", "_rev": "2-3234da7d8df04fe0033ec6265a0f3777", "type": "region", "code": "130534", "name": "清河县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "8a869450-652e-4d79-8ff9-bbea5a48306f"], "path_name": ["中国", "河北省", "邢台市", "清河县"], "status": "active", "sort": 2018, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "9645eed0-1f52-4f05-b67d-fcc6d27204e2", "_rev": "2-268b935a3d9a43944d5c6516be482014", "type": "region", "code": "370781", "name": "青州市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "9645eed0-1f52-4f05-b67d-fcc6d27204e2"], "path_name": ["中国", "山东省", "潍坊市", "青州市"], "status": "active", "sort": 2013, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "9bcf6306-937f-4f98-b5d0-cf2424350d86", "_rev": "2-eafc8843a6a58ba70b680a25073f178f", "type": "region", "code": "210905", "name": "清河门区", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "9bcf6306-937f-4f98-b5d0-cf2424350d86"], "path_name": ["中国", "辽宁省", "阜新市", "清河门区"], "status": "active", "sort": 2016, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "a38b97bb-38f9-4a2a-89a9-2a3c7a35ef94", "_rev": "2-27fb3ce8d6808833e7517748a8a9608a", "type": "region", "code": "441802", "name": "清城区", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "a38b97bb-38f9-4a2a-89a9-2a3c7a35ef94"], "path_name": ["中国", "广东省", "清远市", "清城区"], "status": "active", "sort": 2014, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "d8bad041-0ee7-462a-8129-a4da8b7440e3", "_rev": "2-26214ba3bb7fd687d31797ecb8c653d7", "type": "region", "code": "410922", "name": "清丰县", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "d8bad041-0ee7-462a-8129-a4da8b7440e3"], "path_name": ["中国", "河南省", "濮阳市", "清丰县"], "status": "active", "sort": 2015, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:32"} +{"_id": "05277e85-7b58-45a8-a27c-a506b8dcb45d", "_rev": "2-6bb4fb321a9f5c9ebdbf710cb3f17193", "type": "region", "code": "520181", "name": "清镇市", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "05277e85-7b58-45a8-a27c-a506b8dcb45d"], "path_name": ["中国", "贵州省", "贵阳市", "清镇市"], "status": "active", "sort": 2028, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "0692d637-ef13-4c8e-ab11-ecdf805009cb", "_rev": "2-0b7262ed0031254aa90928ab4d496cc7", "type": "region", "code": "621021", "name": "庆城县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "0692d637-ef13-4c8e-ab11-ecdf805009cb"], "path_name": ["中国", "甘肃省", "庆阳市", "庆城县"], "status": "active", "sort": 2031, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "1b5989fb-dcdd-471f-830e-2d83cbd50c01", "_rev": "2-d4ba7b0f70015df305da8264967c12d1", "type": "region", "code": "441803", "name": "清新区", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "1b5989fb-dcdd-471f-830e-2d83cbd50c01"], "path_name": ["中国", "广东省", "清远市", "清新区"], "status": "active", "sort": 2024, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "3666823f-ab60-4782-8003-9a6b23be338a", "_rev": "2-46c5eeead8b45be2720717aa99fc6cda", "type": "region", "code": "231224", "name": "庆安县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "3666823f-ab60-4782-8003-9a6b23be338a"], "path_name": ["中国", "黑龙江省", "绥化市", "庆安县"], "status": "active", "sort": 2030, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "488652a2-d9ae-4817-a102-f41e8499cb0c", "_rev": "2-2fbd77bb09f13ee450fdc76ea08dcdc3", "type": "region", "code": "210423", "name": "清原满族自治县", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "488652a2-d9ae-4817-a102-f41e8499cb0c"], "path_name": ["中国", "辽宁省", "抚顺市", "清原满族自治县"], "status": "active", "sort": 2026, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "4ca01a65-8963-4efb-bbb6-2e3ff1c440ef", "_rev": "2-72e9195e41efd9c65df0f53a774176b3", "type": "region", "code": "331126", "name": "庆元县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "4ca01a65-8963-4efb-bbb6-2e3ff1c440ef"], "path_name": ["中国", "浙江省", "丽水市", "庆元县"], "status": "active", "sort": 2032, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "51bd615a-a285-43da-9d33-0b2d7c033fb0", "_rev": "2-96ed0b7338e2ec168b2fd88662d2e955", "type": "region", "code": "140121", "name": "清徐县", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "51bd615a-a285-43da-9d33-0b2d7c033fb0"], "path_name": ["中国", "山西省", "太原市", "清徐县"], "status": "active", "sort": 2025, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "b2d72389-1bd9-49db-bc33-213aec3e5de0", "_rev": "2-f6d88b852d7e217587fa37372be5dd4b", "type": "region", "code": "620521", "name": "清水县", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "b2d72389-1bd9-49db-bc33-213aec3e5de0"], "path_name": ["中国", "甘肃省", "天水市", "清水县"], "status": "active", "sort": 2023, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "ed160c74-258d-4f8e-a3c1-a431dcbfb394", "_rev": "2-f85f71683d101ffb4bdaa25816611996", "type": "region", "code": "522324", "name": "晴隆县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "ed160c74-258d-4f8e-a3c1-a431dcbfb394"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "晴隆县"], "status": "active", "sort": 2029, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "fa53c959-5399-4ff0-a8a4-38a5cdfbd5ff", "_rev": "2-89daba644f56c73bf411834d0257711a", "type": "region", "code": "130608", "name": "清苑区", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "fa53c959-5399-4ff0-a8a4-38a5cdfbd5ff"], "path_name": ["中国", "河北省", "保定市", "清苑区"], "status": "active", "sort": 2027, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:33"} +{"_id": "438e96a1-6803-4cc6-b174-7a8eaa48c67e", "_rev": "2-0022ec62d010a70d17a343b53b184a09", "type": "region", "code": "460107", "name": "琼山区", "parent_id": "47252588-5858-42d8-b06b-be7953896c75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "47252588-5858-42d8-b06b-be7953896c75", "438e96a1-6803-4cc6-b174-7a8eaa48c67e"], "path_name": ["中国", "海南省", "海口市", "琼山区"], "status": "active", "sort": 2037, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "55b15eff-2cd5-4c6f-8645-af17b4f932cd", "_rev": "2-5146346d8dc542bbf8b5cbab071c23ea", "type": "region", "code": "370881", "name": "曲阜市", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "55b15eff-2cd5-4c6f-8645-af17b4f932cd"], "path_name": ["中国", "山东省", "济宁市", "曲阜市"], "status": "active", "sort": 2041, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "57c310ff-b81a-499b-a859-ec3acaac0b71", "_rev": "2-5c84e4e9a9134ce51b19b712f749a38e", "type": "region", "code": "371423", "name": "庆云县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "57c310ff-b81a-499b-a859-ec3acaac0b71"], "path_name": ["中国", "山东省", "德州市", "庆云县"], "status": "active", "sort": 2033, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "5a532b7f-902e-4caa-9424-536aedf7920c", "_rev": "2-d54255d20f397fbc96d31b1c153e76b4", "type": "region", "code": "540524", "name": "琼结县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "5a532b7f-902e-4caa-9424-536aedf7920c"], "path_name": ["中国", "西藏自治区", "山南市", "琼结县"], "status": "active", "sort": 2036, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "8fc8f46b-575a-446a-98ed-fca4deb6cd28", "_rev": "2-5d497ce3a4dff4a339f76bc2640cf9d0", "type": "region", "code": "469002", "name": "琼海市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "8fc8f46b-575a-446a-98ed-fca4deb6cd28"], "path_name": ["中国", "海南省", "琼海市"], "status": "active", "sort": 2035, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "935b28c1-f31b-4730-9eeb-433284df31c3", "_rev": "2-0ac82e698228f96d429ff62306295db6", "type": "region", "code": "130430", "name": "邱县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "935b28c1-f31b-4730-9eeb-433284df31c3"], "path_name": ["中国", "河北省", "邯郸市", "邱县"], "status": "active", "sort": 2040, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "9bcbad8c-51c9-42c6-8530-2d133ed7a141", "_rev": "2-8b7d6f6d60c4ee693608c3281d58cb5a", "type": "region", "code": "469030", "name": "琼中黎族苗族自治县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "9bcbad8c-51c9-42c6-8530-2d133ed7a141"], "path_name": ["中国", "海南省", "琼中黎族苗族自治县"], "status": "active", "sort": 2038, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "cea72d22-0dd7-4d68-a435-bf689bbc68f0", "_rev": "2-115b4cd9a1f8a0992e73d34d38927a7e", "type": "region", "code": "532626", "name": "丘北县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "cea72d22-0dd7-4d68-a435-bf689bbc68f0"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "丘北县"], "status": "active", "sort": 2039, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "e83f37e9-acb2-4571-90c8-cd77bd6f6cd5", "_rev": "2-c5a9af52342c697853a66e5390794083", "type": "region", "code": "510183", "name": "邛崃市", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "e83f37e9-acb2-4571-90c8-cd77bd6f6cd5"], "path_name": ["中国", "四川省", "成都市", "邛崃市"], "status": "active", "sort": 2034, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:34"} +{"_id": "04e76846-0f12-477b-9873-cc4745923322", "_rev": "2-a33a6746331c0da256bdd69ad1569aa1", "type": "region", "code": "540525", "name": "曲松县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "04e76846-0f12-477b-9873-cc4745923322"], "path_name": ["中国", "西藏自治区", "山南市", "曲松县"], "status": "active", "sort": 2045, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "17cdde27-f31c-4ab9-b834-120aff17361c", "_rev": "2-ac3837c34c152f6d1dbb84635c85bf76", "type": "region", "code": "540124", "name": "曲水县", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "17cdde27-f31c-4ab9-b834-120aff17361c"], "path_name": ["中国", "西藏自治区", "拉萨市", "曲水县"], "status": "active", "sort": 2044, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "1e862cb1-5fd3-42aa-9abb-48762e137a4b", "_rev": "2-329e1fd36e448a9f4d2c957b37ffbc33", "type": "region", "code": "130435", "name": "曲周县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "1e862cb1-5fd3-42aa-9abb-48762e137a4b"], "path_name": ["中国", "河北省", "邯郸市", "曲周县"], "status": "active", "sort": 2048, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "4982ce24-7b23-4cd2-9442-e9d3ff8110b7", "_rev": "2-6b52e86fde644c7091b69461085fdeb6", "type": "region", "code": "330803", "name": "衢江区", "parent_id": "c4f10f77-6439-4fed-a07e-71750547f973", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "c4f10f77-6439-4fed-a07e-71750547f973", "4982ce24-7b23-4cd2-9442-e9d3ff8110b7"], "path_name": ["中国", "浙江省", "衢州市", "衢江区"], "status": "active", "sort": 2050, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "5810cf15-5452-4d09-88f6-1cc760737343", "_rev": "2-b9cca1b828f0e6901ff20c6a46dd560d", "type": "region", "code": "130634", "name": "曲阳县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "5810cf15-5452-4d09-88f6-1cc760737343"], "path_name": ["中国", "河北省", "保定市", "曲阳县"], "status": "active", "sort": 2047, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "5988f3d9-3581-4d28-9214-4f77f1495b4a", "_rev": "2-c127aaf2dc9ef8f3862d99fcfc104b24", "type": "region", "code": "632726", "name": "曲麻莱县", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "5988f3d9-3581-4d28-9214-4f77f1495b4a"], "path_name": ["中国", "青海省", "玉树藏族自治州", "曲麻莱县"], "status": "active", "sort": 2043, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "698083ad-f90b-494f-ac5d-ff4f78309184", "_rev": "2-bd2ee14f12696f03b02861b901351fe1", "type": "region", "code": "511725", "name": "渠县", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "698083ad-f90b-494f-ac5d-ff4f78309184"], "path_name": ["中国", "四川省", "达州市", "渠县"], "status": "active", "sort": 2049, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "7574a80e-a7e3-42fb-bdb2-7e03b3b8bf0a", "_rev": "2-7b328dc7fc3e1cd4317bad892b9dbd4c", "type": "region", "code": "341124", "name": "全椒县", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "7574a80e-a7e3-42fb-bdb2-7e03b3b8bf0a"], "path_name": ["中国", "安徽省", "滁州市", "全椒县"], "status": "active", "sort": 2051, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "c968381d-238f-4e88-ab84-1c121e69aafb", "_rev": "2-26ec11595b1c91f62fe7d88b8f9597da", "type": "region", "code": "440205", "name": "曲江区", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "c968381d-238f-4e88-ab84-1c121e69aafb"], "path_name": ["中国", "广东省", "韶关市", "曲江区"], "status": "active", "sort": 2042, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "df2496ea-52c2-465c-8e1b-bb4cfedb17c5", "_rev": "2-ddc6bc329b007aa0ae5fba097130f23b", "type": "region", "code": "141021", "name": "曲沃县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "df2496ea-52c2-465c-8e1b-bb4cfedb17c5"], "path_name": ["中国", "山西省", "临汾市", "曲沃县"], "status": "active", "sort": 2046, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:35"} +{"_id": "25cd966c-f337-4542-8fcc-19ece2cb55ce", "_rev": "2-8135d0ca80e1eeed2cdc693831bdb1ac", "type": "region", "code": "411725", "name": "确山县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "25cd966c-f337-4542-8fcc-19ece2cb55ce"], "path_name": ["中国", "河南省", "驻马店市", "确山县"], "status": "active", "sort": 2056, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "5424477a-22ee-45b4-af5b-b7936dfdf3ed", "_rev": "2-624c7bc34b00bb5a329f8437167eb085", "type": "region", "code": "230524", "name": "饶河县", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "5424477a-22ee-45b4-af5b-b7936dfdf3ed"], "path_name": ["中国", "黑龙江省", "双鸭山市", "饶河县"], "status": "active", "sort": 2059, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "59dfb210-3105-46a1-a225-4afb80d7e8fb", "_rev": "2-cda76dd49152573fb7f4e29f9b959757", "type": "region", "code": "513230", "name": "壤塘县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "59dfb210-3105-46a1-a225-4afb80d7e8fb"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "壤塘县"], "status": "active", "sort": 2057, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "6cc539f2-e660-4bbc-8274-daaf04dc0e4a", "_rev": "2-0d2ec89deeae6a176edc734145da8f55", "type": "region", "code": "350505", "name": "泉港区", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "6cc539f2-e660-4bbc-8274-daaf04dc0e4a"], "path_name": ["中国", "福建省", "泉州市", "泉港区"], "status": "active", "sort": 2054, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "aa9cb326-c94b-4d4f-b65e-6b9955c21efd", "_rev": "2-d1a43aec7de57cf65f5f767c702115cd", "type": "region", "code": "360729", "name": "全南县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "aa9cb326-c94b-4d4f-b65e-6b9955c21efd"], "path_name": ["中国", "江西省", "赣州市", "全南县"], "status": "active", "sort": 2052, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "af428336-135f-4234-9377-c56a52ddc6de", "_rev": "2-ddb8bcefdf70e51112fb6dba2eef8a8a", "type": "region", "code": "320311", "name": "泉山区", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "af428336-135f-4234-9377-c56a52ddc6de"], "path_name": ["中国", "江苏省", "徐州市", "泉山区"], "status": "active", "sort": 2055, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "b66fae94-b4da-4254-8fb3-a4c579148368", "_rev": "2-f60b773fa080091549fad6357808fbbd", "type": "region", "code": "230604", "name": "让胡路区", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "b66fae94-b4da-4254-8fb3-a4c579148368"], "path_name": ["中国", "黑龙江省", "大庆市", "让胡路区"], "status": "active", "sort": 2058, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "cff17a78-fbbb-445c-95b0-282be96a6546", "_rev": "2-4ff60c58b345ba52f67daaf8882819d2", "type": "region", "code": "131124", "name": "饶阳县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "cff17a78-fbbb-445c-95b0-282be96a6546"], "path_name": ["中国", "河北省", "衡水市", "饶阳县"], "status": "active", "sort": 2061, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "ecf537a2-72c5-4a25-b9b1-b97e87497b89", "_rev": "2-301206086ccd9aa42d013e31a9c6a0e5", "type": "region", "code": "450324", "name": "全州县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "ecf537a2-72c5-4a25-b9b1-b97e87497b89"], "path_name": ["中国", "广西壮族自治区", "桂林市", "全州县"], "status": "active", "sort": 2053, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "f9f3c26f-d4b4-4a7a-a1a8-09191e6d7499", "_rev": "2-54263cc4704d942eca7ce4ac6dbbd8ce", "type": "region", "code": "445122", "name": "饶平县", "parent_id": "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "f9f3c26f-d4b4-4a7a-a1a8-09191e6d7499"], "path_name": ["中国", "广东省", "潮州市", "饶平县"], "status": "active", "sort": 2060, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:36"} +{"_id": "0cc8d822-e86e-4305-a9dc-c37961e9896c", "_rev": "2-1a7aeade4c25e52657dab61f51ef0954", "type": "region", "code": "500153", "name": "荣昌区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "0cc8d822-e86e-4305-a9dc-c37961e9896c"], "path_name": ["中国", "重庆市", "荣昌区"], "status": "active", "sort": 2071, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "29c34cd8-4644-49a5-bc2d-a245ed373871", "_rev": "2-5999ae2167270787f638eef8041c6dda", "type": "region", "code": "440224", "name": "仁化县", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "29c34cd8-4644-49a5-bc2d-a245ed373871"], "path_name": ["中国", "广东省", "韶关市", "仁化县"], "status": "active", "sort": 2064, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "ab033c0e-6f97-45b4-af29-ae3906ab1230", "_rev": "2-7af4ac838d361323fbb995d4e1dfd367", "type": "region", "code": "510411", "name": "仁和区", "parent_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971", "ab033c0e-6f97-45b4-af29-ae3906ab1230"], "path_name": ["中国", "四川省", "攀枝花市", "仁和区"], "status": "active", "sort": 2063, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "cd0c33c0-e0cc-4a82-88b1-7570c4ee1625", "_rev": "2-ff4c7d6f25e37103eb6ff5d48c84bf66", "type": "region", "code": "511421", "name": "仁寿县", "parent_id": "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ab5225d4-2bf1-4ffc-a0b5-a82335fe6b82", "cd0c33c0-e0cc-4a82-88b1-7570c4ee1625"], "path_name": ["中国", "四川省", "眉山市", "仁寿县"], "status": "active", "sort": 2066, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "e3543d3d-6dbf-4af0-9929-e969da6a7e48", "_rev": "2-bc26dbebb1df748dc21c020e64b2ebf2", "type": "region", "code": "520382", "name": "仁怀市", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "e3543d3d-6dbf-4af0-9929-e969da6a7e48"], "path_name": ["中国", "贵州省", "遵义市", "仁怀市"], "status": "active", "sort": 2065, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "e70b8bed-843b-47ad-bb49-32369871e8da", "_rev": "2-dde9ff26f38f369e5ba093907f8d6b79", "type": "region", "code": "370811", "name": "任城区", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "e70b8bed-843b-47ad-bb49-32369871e8da"], "path_name": ["中国", "山东省", "济宁市", "任城区"], "status": "active", "sort": 2067, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "f2cb35b0-c464-4a31-8f29-cceb45fefdea", "_rev": "2-90757df287bf73af36c759a457111290", "type": "region", "code": "540229", "name": "仁布县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "f2cb35b0-c464-4a31-8f29-cceb45fefdea"], "path_name": ["中国", "西藏自治区", "日喀则市", "仁布县"], "status": "active", "sort": 2062, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "f3144487-3066-4b62-9d3c-50613f3a8a2b", "_rev": "2-280ba43f530c0d03b1f3975709b9a109", "type": "region", "code": "542524", "name": "日土县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "f3144487-3066-4b62-9d3c-50613f3a8a2b"], "path_name": ["中国", "西藏自治区", "阿里地区", "日土县"], "status": "active", "sort": 2070, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "f96330b2-5465-4138-97b1-2c81d1033a05", "_rev": "2-8abcd51c1aa4d703b963809a2de5a2c4", "type": "region", "code": "130982", "name": "任丘市", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "f96330b2-5465-4138-97b1-2c81d1033a05"], "path_name": ["中国", "河北省", "沧州市", "任丘市"], "status": "active", "sort": 2068, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "fbc6f013-87f5-4084-bf44-06c404c7037d", "_rev": "2-f53fac504905fa4fa1dde1e85aeb5cfc", "type": "region", "code": "130505", "name": "任泽区", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "fbc6f013-87f5-4084-bf44-06c404c7037d"], "path_name": ["中国", "河北省", "邢台市", "任泽区"], "status": "active", "sort": 2069, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:37"} +{"_id": "093853e2-ed68-4f46-917a-05beb3f227dd", "_rev": "2-3e5b073dfdc059508568676d870d37b8", "type": "region", "code": "450224", "name": "融安县", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "093853e2-ed68-4f46-917a-05beb3f227dd"], "path_name": ["中国", "广西壮族自治区", "柳州市", "融安县"], "status": "active", "sort": 2078, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "150d3457-5145-468d-bc6f-2cbcec802c59", "_rev": "2-bf87984a9e82daf50f29ba0da8dda37b", "type": "region", "code": "445202", "name": "榕城区", "parent_id": "0f66a848-78e4-4f6d-a244-3b30bec8f326", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "0f66a848-78e4-4f6d-a244-3b30bec8f326", "150d3457-5145-468d-bc6f-2cbcec802c59"], "path_name": ["中国", "广东省", "揭阳市", "榕城区"], "status": "active", "sort": 2076, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "4b94393b-92fb-472f-a13c-c88692ad6c25", "_rev": "2-36d0bfd6ce06b9a6af86514e8d47bb88", "type": "region", "code": "450225", "name": "融水苗族自治县", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "4b94393b-92fb-472f-a13c-c88692ad6c25"], "path_name": ["中国", "广西壮族自治区", "柳州市", "融水苗族自治县"], "status": "active", "sort": 2079, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "5fc77dd3-5916-46d7-ae6b-50333286fb44", "_rev": "2-61561757c9604e925581f372ee51e259", "type": "region", "code": "522632", "name": "榕江县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "5fc77dd3-5916-46d7-ae6b-50333286fb44"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "榕江县"], "status": "active", "sort": 2077, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "65b7257f-00f7-42c2-bf8b-1afd2bcaabb4", "_rev": "2-2f59712fa8a596f1f9efc2222b92315c", "type": "region", "code": "510321", "name": "荣县", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "65b7257f-00f7-42c2-bf8b-1afd2bcaabb4"], "path_name": ["中国", "四川省", "自贡市", "荣县"], "status": "active", "sort": 2073, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "69be710e-84c9-4ad6-931c-f3cf9923a8bc", "_rev": "2-b56ffb8e6a04e5964f774d55becbbc40", "type": "region", "code": "450921", "name": "容县", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "69be710e-84c9-4ad6-931c-f3cf9923a8bc"], "path_name": ["中国", "广西壮族自治区", "玉林市", "容县"], "status": "active", "sort": 2075, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "9ff985c9-b538-4fb1-b8a0-752a16e40fd0", "_rev": "2-b8943a2f75d658a0cb6c9fbfa16627c7", "type": "region", "code": "320623", "name": "如东县", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "9ff985c9-b538-4fb1-b8a0-752a16e40fd0"], "path_name": ["中国", "江苏省", "南通市", "如东县"], "status": "active", "sort": 2080, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "db8f8d02-1c4f-4cfd-b36f-6fb16800bb71", "_rev": "2-d920adae9ac6501c88fb970cf86f4744", "type": "region", "code": "130629", "name": "容城县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "db8f8d02-1c4f-4cfd-b36f-6fb16800bb71"], "path_name": ["中国", "河北省", "保定市", "容城县"], "status": "active", "sort": 2074, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "fabc6c16-7662-49bc-9f8d-2e30c1b3e0b8", "_rev": "2-6398326c0c084d016ff95474b28856e4", "type": "region", "code": "320682", "name": "如皋市", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "fabc6c16-7662-49bc-9f8d-2e30c1b3e0b8"], "path_name": ["中国", "江苏省", "南通市", "如皋市"], "status": "active", "sort": 2081, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "ff0f0f20-8d4a-46c7-a2ec-1b7c0977f22c", "_rev": "2-88c453af9aedbe805c031784856150b7", "type": "region", "code": "371082", "name": "荣成市", "parent_id": "d9d54a2d-e477-45c2-ad57-dde7563e520a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "d9d54a2d-e477-45c2-ad57-dde7563e520a", "ff0f0f20-8d4a-46c7-a2ec-1b7c0977f22c"], "path_name": ["中国", "山东省", "威海市", "荣成市"], "status": "active", "sort": 2072, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:38"} +{"_id": "18431fd5-f446-4ea7-aa6e-aa9150e077aa", "_rev": "2-12b64f1c074073c1f02c1859a3e59600", "type": "region", "code": "330381", "name": "瑞安市", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "18431fd5-f446-4ea7-aa6e-aa9150e077aa"], "path_name": ["中国", "浙江省", "温州市", "瑞安市"], "status": "active", "sort": 2089, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "417778eb-5375-4288-b40a-5aa8d7adec29", "_rev": "2-64b21a63f456a388c74a61b9cd3ec9d1", "type": "region", "code": "140830", "name": "芮城县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "417778eb-5375-4288-b40a-5aa8d7adec29"], "path_name": ["中国", "山西省", "运城市", "芮城县"], "status": "active", "sort": 2088, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "4deb06b8-b69e-4e01-af55-e6c3e2b90690", "_rev": "2-b487d0b4841c8b8dca0d7cd91032e027", "type": "region", "code": "360481", "name": "瑞昌市", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "4deb06b8-b69e-4e01-af55-e6c3e2b90690"], "path_name": ["中国", "江西省", "九江市", "瑞昌市"], "status": "active", "sort": 2090, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "83c1cdc5-114b-49d5-b6af-de92cd451f35", "_rev": "2-dba4f3dab66c6ee82e6fea0c1ad83c47", "type": "region", "code": "440232", "name": "乳源瑶族自治县", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "83c1cdc5-114b-49d5-b6af-de92cd451f35"], "path_name": ["中国", "广东省", "韶关市", "乳源瑶族自治县"], "status": "active", "sort": 2087, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "9ade6d9d-2d86-4438-8cb5-70eb0c59bd61", "_rev": "2-3a199757a4e57be6f6a96ab86c190c54", "type": "region", "code": "410482", "name": "汝州市", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "9ade6d9d-2d86-4438-8cb5-70eb0c59bd61"], "path_name": ["中国", "河南省", "平顶山市", "汝州市"], "status": "active", "sort": 2085, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "d81f6e98-6e16-4dea-9f00-202a9acae2fc", "_rev": "2-9dc2cc5537b8666c89bd9cb25f7514b5", "type": "region", "code": "371083", "name": "乳山市", "parent_id": "d9d54a2d-e477-45c2-ad57-dde7563e520a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "d9d54a2d-e477-45c2-ad57-dde7563e520a", "d81f6e98-6e16-4dea-9f00-202a9acae2fc"], "path_name": ["中国", "山东省", "威海市", "乳山市"], "status": "active", "sort": 2086, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "e5dbcc2d-8915-46ca-9333-3543068315c5", "_rev": "2-3492c7b09ff146da5a71ee28f3eb2152", "type": "region", "code": "411727", "name": "汝南县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "e5dbcc2d-8915-46ca-9333-3543068315c5"], "path_name": ["中国", "河南省", "驻马店市", "汝南县"], "status": "active", "sort": 2083, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "e99c5cab-857d-4c3b-af09-a45c28d52280", "_rev": "2-99bc03b45101c81ec067eadd9d080607", "type": "region", "code": "410326", "name": "汝阳县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "e99c5cab-857d-4c3b-af09-a45c28d52280"], "path_name": ["中国", "河南省", "洛阳市", "汝阳县"], "status": "active", "sort": 2084, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "fd0f1c3b-1bd2-4e27-8898-097f29d3a25b", "_rev": "2-3e96aab80fe34f21979e801a9805d143", "type": "region", "code": "431026", "name": "汝城县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "fd0f1c3b-1bd2-4e27-8898-097f29d3a25b"], "path_name": ["中国", "湖南省", "郴州市", "汝城县"], "status": "active", "sort": 2082, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:39"} +{"_id": "0413a584-e998-4ec9-8abf-8175908513f3", "_rev": "2-56dc1067530f415284e35147b5c67424", "type": "region", "code": "150105", "name": "赛罕区", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "0413a584-e998-4ec9-8abf-8175908513f3"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "赛罕区"], "status": "active", "sort": 2099, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "06026788-7213-422f-8201-63ea1e840263", "_rev": "2-2fac9c69da45a80adb6e63c88dcdcb74", "type": "region", "code": "522732", "name": "三都水族自治县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "06026788-7213-422f-8201-63ea1e840263"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "三都水族自治县"], "status": "active", "sort": 2100, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "2a537156-8569-46ac-8082-b1ab814c7aca", "_rev": "2-67ff7df773a2f7b79e149f375c45f89f", "type": "region", "code": "540224", "name": "萨迦县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "2a537156-8569-46ac-8082-b1ab814c7aca"], "path_name": ["中国", "西藏自治区", "日喀则市", "萨迦县"], "status": "active", "sort": 2098, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "57b378d2-46fb-4947-929e-90a53a53e92a", "_rev": "2-89cf538aab377e5185e62b6a414f6915", "type": "region", "code": "230602", "name": "萨尔图区", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "57b378d2-46fb-4947-929e-90a53a53e92a"], "path_name": ["中国", "黑龙江省", "大庆市", "萨尔图区"], "status": "active", "sort": 2096, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "59aea801-71d1-4735-b8a1-f092a4b68248", "_rev": "2-b245163cc152bbee9dedd4b7575bc716", "type": "region", "code": "360781", "name": "瑞金市", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "59aea801-71d1-4735-b8a1-f092a4b68248"], "path_name": ["中国", "江西省", "赣州市", "瑞金市"], "status": "active", "sort": 2091, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "5c24a36f-5e67-42f4-a0f7-4507394fdc38", "_rev": "2-b111c1d63a23b820476cd06f748685b8", "type": "region", "code": "652824", "name": "若羌县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "5c24a36f-5e67-42f4-a0f7-4507394fdc38"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "若羌县"], "status": "active", "sort": 2095, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "bc4bf237-a433-4e00-b14f-e6ce87f9fb77", "_rev": "2-89f9a1561b30c440f2982208ade2cc80", "type": "region", "code": "513232", "name": "若尔盖县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "bc4bf237-a433-4e00-b14f-e6ce87f9fb77"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "若尔盖县"], "status": "active", "sort": 2094, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "c1f5537c-9861-47b0-8e28-52b08f92fb2a", "_rev": "2-9b5169c2ac49e97d8b0562b6b9d07b41", "type": "region", "code": "540236", "name": "萨嘎县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "c1f5537c-9861-47b0-8e28-52b08f92fb2a"], "path_name": ["中国", "西藏自治区", "日喀则市", "萨嘎县"], "status": "active", "sort": 2097, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "d4a965bb-b540-476c-93dd-068b534659db", "_rev": "2-c354c598955ee77302867c2a7eae4ff5", "type": "region", "code": "533102", "name": "瑞丽市", "parent_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c", "d4a965bb-b540-476c-93dd-068b534659db"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州", "瑞丽市"], "status": "active", "sort": 2092, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "e142d8a1-9e72-4bf4-9d8f-344b5c2b84a5", "_rev": "2-1c78603391d79192bc005b35262c748d", "type": "region", "code": "321111", "name": "润州区", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "e142d8a1-9e72-4bf4-9d8f-344b5c2b84a5"], "path_name": ["中国", "江苏省", "镇江市", "润州区"], "status": "active", "sort": 2093, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:40"} +{"_id": "05bb46f3-29c8-4c07-b50a-788eecaebd6d", "_rev": "2-0547b5b4c528b1fc3e66d7643520d6d7", "type": "region", "code": "540523", "name": "桑日县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "05bb46f3-29c8-4c07-b50a-788eecaebd6d"], "path_name": ["中国", "西藏自治区", "山南市", "桑日县"], "status": "active", "sort": 2109, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "0f77d00f-22a5-4509-b399-f143dba8a16b", "_rev": "2-72a8d7903e581fb8fa44a3119259ea70", "type": "region", "code": "610422", "name": "三原县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "0f77d00f-22a5-4509-b399-f143dba8a16b"], "path_name": ["中国", "陕西省", "咸阳市", "三原县"], "status": "active", "sort": 2108, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "14d01094-745c-45dd-9d90-264da3d5680f", "_rev": "2-4fef8eda49eb32cec3281ef0139a46ab", "type": "region", "code": "450226", "name": "三江侗族自治县", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "14d01094-745c-45dd-9d90-264da3d5680f"], "path_name": ["中国", "广西壮族自治区", "柳州市", "三江侗族自治县"], "status": "active", "sort": 2102, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "17482386-6b43-4f38-8cf3-f841962c21fc", "_rev": "2-e8ab5d497d4f51b68620e8339a6e4628", "type": "region", "code": "522624", "name": "三穗县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "17482386-6b43-4f38-8cf3-f841962c21fc"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "三穗县"], "status": "active", "sort": 2105, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "3d298cdb-06d9-4192-9150-d5b617937bb6", "_rev": "2-21d1cff8e662f68cd29da37f0abc18c0", "type": "region", "code": "510722", "name": "三台县", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "3d298cdb-06d9-4192-9150-d5b617937bb6"], "path_name": ["中国", "四川省", "绵阳市", "三台县"], "status": "active", "sort": 2106, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "3f38fb31-4962-4776-aab7-d998884bcea8", "_rev": "2-4c6c3b7f5fe058ca6b0b3ee6570c86ec", "type": "region", "code": "131082", "name": "三河市", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "3f38fb31-4962-4776-aab7-d998884bcea8"], "path_name": ["中国", "河北省", "廊坊市", "三河市"], "status": "active", "sort": 2101, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "8e7c8a97-5f22-4263-88af-792a9acdb597", "_rev": "2-8b919514e92521dfc5995eaa2c499bf7", "type": "region", "code": "350404", "name": "三元区", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "8e7c8a97-5f22-4263-88af-792a9acdb597"], "path_name": ["中国", "福建省", "三明市", "三元区"], "status": "active", "sort": 2107, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "96820ca2-b316-4ce7-82f2-6d9782e41bf2", "_rev": "2-752b313e38ef409c7b9b4643defe0d84", "type": "region", "code": "440607", "name": "三水区", "parent_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "96820ca2-b316-4ce7-82f2-6d9782e41bf2"], "path_name": ["中国", "广东省", "佛山市", "三水区"], "status": "active", "sort": 2104, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "ed51056c-0fa6-4134-a2c8-32acb84715e9", "_rev": "2-78edc83561a62208b172416338a7fecd", "type": "region", "code": "430822", "name": "桑植县", "parent_id": "ddb90f83-c981-4cc1-a157-a085d328dd64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "ddb90f83-c981-4cc1-a157-a085d328dd64", "ed51056c-0fa6-4134-a2c8-32acb84715e9"], "path_name": ["中国", "湖南省", "张家界市", "桑植县"], "status": "active", "sort": 2110, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "fda5d41b-695c-4e9a-8d59-bc498c55bc46", "_rev": "2-9e0ef19ba85ce3c692a1da22e8104c99", "type": "region", "code": "331022", "name": "三门县", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "fda5d41b-695c-4e9a-8d59-bc498c55bc46"], "path_name": ["中国", "浙江省", "台州市", "三门县"], "status": "active", "sort": 2103, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:41"} +{"_id": "1f1f0fab-70b0-41c3-a7d8-05f88ef45846", "_rev": "2-17d0749c9acdc29fa7643d753570e445", "type": "region", "code": "500106", "name": "沙坪坝区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "1f1f0fab-70b0-41c3-a7d8-05f88ef45846"], "path_name": ["中国", "重庆市", "沙坪坝区"], "status": "active", "sort": 2116, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "37f343a6-3dff-4107-9f5f-211e9ecbfc62", "_rev": "2-6bd75903ccf5674a273b593e30f3d226", "type": "region", "code": "540202", "name": "桑珠孜区", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "37f343a6-3dff-4107-9f5f-211e9ecbfc62"], "path_name": ["中国", "西藏自治区", "日喀则市", "桑珠孜区"], "status": "active", "sort": 2111, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "82a9a940-f44b-44fe-8000-a1425a50bd4a", "_rev": "2-a4ba1676a778ae019d9dd76d98373544", "type": "region", "code": "513333", "name": "色达县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "82a9a940-f44b-44fe-8000-a1425a50bd4a"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "色达县"], "status": "active", "sort": 2112, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "8d7d9832-b9c2-4d3d-99cf-2fe27c38625c", "_rev": "2-2a8d1b1f67b0f8f8a28aa008bc790e19", "type": "region", "code": "130582", "name": "沙河市", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "8d7d9832-b9c2-4d3d-99cf-2fe27c38625c"], "path_name": ["中国", "河北省", "邢台市", "沙河市"], "status": "active", "sort": 2115, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "9f31cf1b-19ab-4cdb-a5e1-b745a26d24eb", "_rev": "2-1a93a25373372f6192deb92924d591e3", "type": "region", "code": "210204", "name": "沙河口区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "9f31cf1b-19ab-4cdb-a5e1-b745a26d24eb"], "path_name": ["中国", "辽宁省", "大连市", "沙河口区"], "status": "active", "sort": 2114, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "a19e25d1-39a9-4e2d-8cc9-4810ea23d4ee", "_rev": "2-8dda44ef42b2a963e363c254a3788e7f", "type": "region", "code": "654203", "name": "沙湾市", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "a19e25d1-39a9-4e2d-8cc9-4810ea23d4ee"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "沙湾市"], "status": "active", "sort": 2120, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "dcd7e27d-b800-4419-8c13-ba270c44fcd8", "_rev": "2-b3f78e967e65190553bb32b0a13da46b", "type": "region", "code": "640502", "name": "沙坡头区", "parent_id": "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "dcd7e27d-b800-4419-8c13-ba270c44fcd8"], "path_name": ["中国", "宁夏回族自治区", "中卫市", "沙坡头区"], "status": "active", "sort": 2117, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "f60a2409-ef49-4fe2-a9c0-f99221e82667", "_rev": "2-f6cdc3c5aec4663463dddd296ed6ed82", "type": "region", "code": "421002", "name": "沙市区", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "f60a2409-ef49-4fe2-a9c0-f99221e82667"], "path_name": ["中国", "湖北省", "荆州市", "沙市区"], "status": "active", "sort": 2118, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "fae0656f-7fd2-48f4-83fe-00220ad68d5d", "_rev": "2-a41f2b8dd8d76b5b36c5aebbb4710ad3", "type": "region", "code": "540602", "name": "色尼区", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "fae0656f-7fd2-48f4-83fe-00220ad68d5d"], "path_name": ["中国", "西藏自治区", "那曲市", "色尼区"], "status": "active", "sort": 2113, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "ffd96a3b-2ab9-4746-b7ea-30ca565a94a8", "_rev": "2-59b2d19255aad23376cb83366e0a9f22", "type": "region", "code": "511111", "name": "沙湾区", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "ffd96a3b-2ab9-4746-b7ea-30ca565a94a8"], "path_name": ["中国", "四川省", "乐山市", "沙湾区"], "status": "active", "sort": 2119, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:42"} +{"_id": "1fa1c26e-792d-4af5-9e8d-4acca714c648", "_rev": "2-45a172ef4c4854a3a74a3fa36c6f4dd7", "type": "region", "code": "650103", "name": "沙依巴克区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "1fa1c26e-792d-4af5-9e8d-4acca714c648"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "沙依巴克区"], "status": "active", "sort": 2124, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "2ec81968-7e10-4e25-9394-cd11430f82be", "_rev": "2-7bc030d82292edb0cda41fbf0bbe7e08", "type": "region", "code": "620725", "name": "山丹县", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "2ec81968-7e10-4e25-9394-cd11430f82be"], "path_name": ["中国", "甘肃省", "张掖市", "山丹县"], "status": "active", "sort": 2127, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "38349c09-6a2d-403c-b10a-7e9175631980", "_rev": "2-5eba9d83b96515a04f04bce0b571022d", "type": "region", "code": "420822", "name": "沙洋县", "parent_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "38349c09-6a2d-403c-b10a-7e9175631980"], "path_name": ["中国", "湖北省", "荆门市", "沙洋县"], "status": "active", "sort": 2123, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "48953fdd-96f2-4c38-b65e-c761b6cf0521", "_rev": "2-b529f8a9934c7cf4f35d822d76a1aabf", "type": "region", "code": "653125", "name": "莎车县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "48953fdd-96f2-4c38-b65e-c761b6cf0521"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "莎车县"], "status": "active", "sort": 2125, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "8ed94279-ef9b-47f1-be93-f33054a72743", "_rev": "2-442bfb9dda737799c04f3c15da9fd403", "type": "region", "code": "410603", "name": "山城区", "parent_id": "7120d453-683b-4686-96fe-3aab3a6672c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "7120d453-683b-4686-96fe-3aab3a6672c7", "8ed94279-ef9b-47f1-be93-f33054a72743"], "path_name": ["中国", "河南省", "鹤壁市", "山城区"], "status": "active", "sort": 2126, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "8fb8eb76-f7f2-49c7-8590-fc48ed2cf14a", "_rev": "2-8f4b978971d41bc02f6bf189c28d81b7", "type": "region", "code": "652924", "name": "沙雅县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "8fb8eb76-f7f2-49c7-8590-fc48ed2cf14a"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "沙雅县"], "status": "active", "sort": 2122, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "9e0ba833-2c12-4019-8220-e202a2e2ba27", "_rev": "2-a5f3f8730d8163dfcabd00953749ca9c", "type": "region", "code": "350405", "name": "沙县区", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "9e0ba833-2c12-4019-8220-e202a2e2ba27"], "path_name": ["中国", "福建省", "三明市", "沙县区"], "status": "active", "sort": 2121, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "b47bce0e-1a38-4598-8e7b-9fe57d2913bd", "_rev": "2-56620597353f5f65a793af43dca642e9", "type": "region", "code": "130303", "name": "山海关区", "parent_id": "82e20e1b-f89b-4de3-ac93-811b532e8885", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "82e20e1b-f89b-4de3-ac93-811b532e8885", "b47bce0e-1a38-4598-8e7b-9fe57d2913bd"], "path_name": ["中国", "河北省", "秦皇岛市", "山海关区"], "status": "active", "sort": 2128, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "_rev": "2-808e04b1b69dfe47bba8be9c0869fa49", "type": "region", "code": "370400", "name": "枣庄市", "parent_id": "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631"], "path_name": ["中国", "山东省", "枣庄市"], "status": "active", "sort": 2129, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:43"} +{"_id": "24bbd3ae-91d9-4968-b828-bff59efc471d", "_rev": "2-8469127662ea02289601b7138fdf3e53", "type": "region", "code": "411203", "name": "陕州区", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "24bbd3ae-91d9-4968-b828-bff59efc471d"], "path_name": ["中国", "河南省", "三门峡市", "陕州区"], "status": "active", "sort": 2134, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "38fe8768-dc9f-40bb-a22c-087026ecbd0e", "_rev": "2-19ebdec96f4f54b54ebd8b1f478c289c", "type": "region", "code": "370406", "name": "山亭区", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "38fe8768-dc9f-40bb-a22c-087026ecbd0e"], "path_name": ["中国", "山东省", "枣庄市", "山亭区"], "status": "active", "sort": 2130, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "590d36ec-de0e-4bbc-bd35-42bb9712ba87", "_rev": "2-bb0d59aa5872a0ef9ea83e54f3d8ee75", "type": "region", "code": "150923", "name": "商都县", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "590d36ec-de0e-4bbc-bd35-42bb9712ba87"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "商都县"], "status": "active", "sort": 2137, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "a86ff04a-6c50-4de4-b922-84ddb2ccb637", "_rev": "2-13dae6ee929736e1cf8b7d28c258d655", "type": "region", "code": "650421", "name": "鄯善县", "parent_id": "b55ac900-77d7-4ee6-b754-c22960a6801d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "b55ac900-77d7-4ee6-b754-c22960a6801d", "a86ff04a-6c50-4de4-b922-84ddb2ccb637"], "path_name": ["中国", "新疆维吾尔自治区", "吐鲁番市", "鄯善县"], "status": "active", "sort": 2135, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "af376879-7ba0-43f3-afa2-334284faf2bf", "_rev": "2-c810ce25ab8964c79b8ec5f7a6b6e0c5", "type": "region", "code": "611024", "name": "山阳县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "af376879-7ba0-43f3-afa2-334284faf2bf"], "path_name": ["中国", "陕西省", "商洛市", "山阳县"], "status": "active", "sort": 2132, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "b62db551-9518-4540-8383-31a657ba867a", "_rev": "2-1dd06c40176c73a0a34539fa8d7a8f39", "type": "region", "code": "140621", "name": "山阴县", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "b62db551-9518-4540-8383-31a657ba867a"], "path_name": ["中国", "山西省", "朔州市", "山阴县"], "status": "active", "sort": 2133, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "ce477263-74ff-4528-8701-79f2c7528fcd", "_rev": "2-8c2154506430fa0377c2ecfc86c9c23d", "type": "region", "code": "411524", "name": "商城县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "ce477263-74ff-4528-8701-79f2c7528fcd"], "path_name": ["中国", "河南省", "信阳市", "商城县"], "status": "active", "sort": 2136, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "e7e81082-1618-465c-9f99-4b6d0f9d902b", "_rev": "2-0d5d90075a8f2969b39978126ed887bb", "type": "region", "code": "410811", "name": "山阳区", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "e7e81082-1618-465c-9f99-4b6d0f9d902b"], "path_name": ["中国", "河南省", "焦作市", "山阳区"], "status": "active", "sort": 2131, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "f71f2323-8748-4562-b952-5cf0386388c3", "_rev": "2-1615226c480e3c50356a9f2054c3e9d8", "type": "region", "code": "370126", "name": "商河县", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "f71f2323-8748-4562-b952-5cf0386388c3"], "path_name": ["中国", "山东省", "济南市", "商河县"], "status": "active", "sort": 2138, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:44"} +{"_id": "055b5c1f-1b2f-4a69-9c8e-1f005d8682ca", "_rev": "2-ea098f5d2e231777c10f2898993feff1", "type": "region", "code": "140404", "name": "上党区", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "055b5c1f-1b2f-4a69-9c8e-1f005d8682ca"], "path_name": ["中国", "山西省", "长治市", "上党区"], "status": "active", "sort": 2144, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "18c342ed-62a1-44ae-b7f6-9137bd1c7848", "_rev": "2-65a5a4893af99c7d2f6502ccede973f6", "type": "region", "code": "330102", "name": "上城区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "18c342ed-62a1-44ae-b7f6-9137bd1c7848"], "path_name": ["中国", "浙江省", "杭州市", "上城区"], "status": "active", "sort": 2143, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "1df2001c-b2f3-4603-8314-f6cda1e01264", "_rev": "2-7e526535ddcf2c231d3c233010855475", "type": "region", "code": "350823", "name": "上杭县", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "1df2001c-b2f3-4603-8314-f6cda1e01264"], "path_name": ["中国", "福建省", "龙岩市", "上杭县"], "status": "active", "sort": 2146, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "2ee7af47-7bc0-460e-8924-5d6162113ffa", "_rev": "2-d7343eefc9f19ca17adaee87445ac68d", "type": "region", "code": "611023", "name": "商南县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "2ee7af47-7bc0-460e-8924-5d6162113ffa"], "path_name": ["中国", "陕西省", "商洛市", "商南县"], "status": "active", "sort": 2139, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "60820091-9391-46fd-a0a0-2370c97b2abf", "_rev": "2-9b41974ab9fb313921a3ca51762e2519", "type": "region", "code": "410106", "name": "上街区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "60820091-9391-46fd-a0a0-2370c97b2abf"], "path_name": ["中国", "河南省", "郑州市", "上街区"], "status": "active", "sort": 2147, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "a7d08932-476e-4300-b143-3ef0ff4f1420", "_rev": "2-571f0c27188fb0d8417c82443e30b808", "type": "region", "code": "360923", "name": "上高县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "a7d08932-476e-4300-b143-3ef0ff4f1420"], "path_name": ["中国", "江西省", "宜春市", "上高县"], "status": "active", "sort": 2145, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "b5ee48e9-35bd-4c20-97ad-2d6d00d4927b", "_rev": "2-05085d9d7af4b064370073c685aba655", "type": "region", "code": "611002", "name": "商州区", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "b5ee48e9-35bd-4c20-97ad-2d6d00d4927b"], "path_name": ["中国", "陕西省", "商洛市", "商州区"], "status": "active", "sort": 2141, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "c694db13-4f29-4865-b5c2-43ec57b0725e", "_rev": "2-6018355cf4cb9cc36816ed25f9251cd9", "type": "region", "code": "360322", "name": "上栗县", "parent_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "c694db13-4f29-4865-b5c2-43ec57b0725e"], "path_name": ["中国", "江西省", "萍乡市", "上栗县"], "status": "active", "sort": 2148, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "d54d2a70-f420-4134-8cd4-e9ec10dd0939", "_rev": "2-5f29fc55acafab9338121fd78e6bc842", "type": "region", "code": "411722", "name": "上蔡县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "d54d2a70-f420-4134-8cd4-e9ec10dd0939"], "path_name": ["中国", "河南省", "驻马店市", "上蔡县"], "status": "active", "sort": 2142, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "d6094ba6-0615-491d-9c99-76180b3fc93b", "_rev": "2-b4aae13b3f53e52ea533a15726ce3d4e", "type": "region", "code": "411623", "name": "商水县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "d6094ba6-0615-491d-9c99-76180b3fc93b"], "path_name": ["中国", "河南省", "周口市", "商水县"], "status": "active", "sort": 2140, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:45"} +{"_id": "0a612c40-d298-4fa9-8ba7-731444ce2640", "_rev": "2-1614383953d6634debf49032f9513f9a", "type": "region", "code": "130725", "name": "尚义县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "0a612c40-d298-4fa9-8ba7-731444ce2640"], "path_name": ["中国", "河北省", "张家口市", "尚义县"], "status": "active", "sort": 2154, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "0bc9f363-11b4-4c47-842b-272630d290f1", "_rev": "2-4771db1ed0984d428c1ef90f3173ce54", "type": "region", "code": "450125", "name": "上林县", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "0bc9f363-11b4-4c47-842b-272630d290f1"], "path_name": ["中国", "广西壮族自治区", "南宁市", "上林县"], "status": "active", "sort": 2149, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "6fc96244-e94d-4de5-aae8-9d06766cbc7f", "_rev": "2-d61ad2d5d0ab8e751243b93236d07a68", "type": "region", "code": "230183", "name": "尚志市", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "6fc96244-e94d-4de5-aae8-9d06766cbc7f"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "尚志市"], "status": "active", "sort": 2155, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "_rev": "2-ba68a838b755f711ba456bd006d9b33c", "type": "region", "code": "430300", "name": "湘潭市", "parent_id": "2d3ae8de-386c-4512-bf7a-7b14d653876d", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960"], "path_name": ["中国", "湖南省", "湘潭市"], "status": "active", "sort": 2156, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "9682ff52-2843-44c2-8666-d2816e90ab87", "_rev": "2-99aeea2707edce099d49fbe546679c79", "type": "region", "code": "450621", "name": "上思县", "parent_id": "19375806-f12d-48a5-a6e6-c376e0b720fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "19375806-f12d-48a5-a6e6-c376e0b720fb", "9682ff52-2843-44c2-8666-d2816e90ab87"], "path_name": ["中国", "广西壮族自治区", "防城港市", "上思县"], "status": "active", "sort": 2151, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "afa37080-9867-43d0-9453-fab256544fd5", "_rev": "2-b36443455183e3b2675924cfe612d6d4", "type": "region", "code": "360724", "name": "上犹县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "afa37080-9867-43d0-9453-fab256544fd5"], "path_name": ["中国", "江西省", "赣州市", "上犹县"], "status": "active", "sort": 2152, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "c8e297f7-d58e-44b7-8cb4-b9ec8002608a", "_rev": "2-c2a8924084d9b119027318deffe3871c", "type": "region", "code": "330604", "name": "上虞区", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "c8e297f7-d58e-44b7-8cb4-b9ec8002608a"], "path_name": ["中国", "浙江省", "绍兴市", "上虞区"], "status": "active", "sort": 2153, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "cbb08d11-0f99-45eb-af65-92a47a29c349", "_rev": "2-dfbb5113c2b1edd2a5d9f19eb92daca2", "type": "region", "code": "361104", "name": "广信区", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "cbb08d11-0f99-45eb-af65-92a47a29c349"], "path_name": ["中国", "江西省", "上饶市", "广信区"], "status": "active", "sort": 2150, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "faa7f6ae-74e3-4154-aa81-829bce3e5d42", "_rev": "2-14bccf3a1ffa03487c959074293a72b7", "type": "region", "code": "430382", "name": "韶山市", "parent_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960", "faa7f6ae-74e3-4154-aa81-829bce3e5d42"], "path_name": ["中国", "湖南省", "湘潭市", "韶山市"], "status": "active", "sort": 2157, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:46"} +{"_id": "0db830ab-13bd-4c16-a82a-e0a493621323", "_rev": "2-fd96fbefa8bfdcdfd29d0366a9e29f5a", "type": "region", "code": "350781", "name": "邵武市", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "0db830ab-13bd-4c16-a82a-e0a493621323"], "path_name": ["中国", "福建省", "南平市", "邵武市"], "status": "active", "sort": 2159, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "108d4fbb-d18d-4c87-a96e-81e7348c954d", "_rev": "2-cbe1a97e7bef4975902f28e0428e8d5f", "type": "region", "code": "540625", "name": "申扎县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "108d4fbb-d18d-4c87-a96e-81e7348c954d"], "path_name": ["中国", "西藏自治区", "那曲市", "申扎县"], "status": "active", "sort": 2166, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "2bc3e766-932e-44f3-87f8-6ec8dbab61a2", "_rev": "2-6afb7e1c0d1a954a7d7fba83d4e6b028", "type": "region", "code": "341021", "name": "歙县", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "2bc3e766-932e-44f3-87f8-6ec8dbab61a2"], "path_name": ["中国", "安徽省", "黄山市", "歙县"], "status": "active", "sort": 2165, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "4b86ebd4-56b5-45fa-a5f0-07cfb8a74079", "_rev": "2-286992d8fc5f9dc201a52a2fd55d290a", "type": "region", "code": "510981", "name": "射洪市", "parent_id": "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "604f75f8-c22d-4dc2-ad6a-b3f8b5a56d97", "4b86ebd4-56b5-45fa-a5f0-07cfb8a74079"], "path_name": ["中国", "四川省", "遂宁市", "射洪市"], "status": "active", "sort": 2162, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "57273c04-d95e-42a8-bedd-320d3adefd4c", "_rev": "2-ce97e8b9027dc5fe3e70528ee0e5b9c4", "type": "region", "code": "430582", "name": "邵东市", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "57273c04-d95e-42a8-bedd-320d3adefd4c"], "path_name": ["中国", "湖南省", "邵阳市", "邵东市"], "status": "active", "sort": 2158, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "5bafda3b-3161-4689-a451-2a67440a224d", "_rev": "2-9bd4b072b1630c057bc0f3879d74767b", "type": "region", "code": "320924", "name": "射阳县", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "5bafda3b-3161-4689-a451-2a67440a224d"], "path_name": ["中国", "江苏省", "盐城市", "射阳县"], "status": "active", "sort": 2163, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "9be6c9c2-9059-4222-b29d-75c1d60ba787", "_rev": "2-753a5cc70b8153300240e193d316ec06", "type": "region", "code": "130426", "name": "涉县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "9be6c9c2-9059-4222-b29d-75c1d60ba787"], "path_name": ["中国", "河北省", "邯郸市", "涉县"], "status": "active", "sort": 2164, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "b86a6af6-dc24-4ed3-846e-b8c22832e3fd", "_rev": "2-98e12c458d7e2a3ba053f51b2ec26e5f", "type": "region", "code": "430523", "name": "邵阳县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "b86a6af6-dc24-4ed3-846e-b8c22832e3fd"], "path_name": ["中国", "湖南省", "邵阳市", "邵阳县"], "status": "active", "sort": 2160, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "dae7af65-3ec0-4ef5-b086-b334c5333e15", "_rev": "2-6e99d1e200ebccf5f5577966efbb0d23", "type": "region", "code": "411327", "name": "社旗县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "dae7af65-3ec0-4ef5-b086-b334c5333e15"], "path_name": ["中国", "河南省", "南阳市", "社旗县"], "status": "active", "sort": 2161, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:47"} +{"_id": "3c64a162-9a05-437b-ada1-1b4bb6fdf658", "_rev": "2-8556e05475949258c8b307d4bcdedd75", "type": "region", "code": "210103", "name": "沈河区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "3c64a162-9a05-437b-ada1-1b4bb6fdf658"], "path_name": ["中国", "辽宁省", "沈阳市", "沈河区"], "status": "active", "sort": 2175, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "4e1b316e-201d-4a71-be18-ba240d2e7eae", "_rev": "2-12c35eb4d44b4849d158df35d9112624", "type": "region", "code": "131182", "name": "深州市", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "4e1b316e-201d-4a71-be18-ba240d2e7eae"], "path_name": ["中国", "河北省", "衡水市", "深州市"], "status": "active", "sort": 2169, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "65cb2ac6-9b66-4de4-a993-05b7c46bd757", "_rev": "2-8033ab28cd569b7e87c8db680ec0981b", "type": "region", "code": "429021", "name": "神农架林区", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "65cb2ac6-9b66-4de4-a993-05b7c46bd757"], "path_name": ["中国", "湖北省", "神农架林区"], "status": "active", "sort": 2173, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "736c64ce-d356-4eb8-a59d-209fcc2bab6d", "_rev": "2-dbd7e6d0f976671027eb58e7e2b35428", "type": "region", "code": "140927", "name": "神池县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "736c64ce-d356-4eb8-a59d-209fcc2bab6d"], "path_name": ["中国", "山西省", "忻州市", "神池县"], "status": "active", "sort": 2171, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "75425263-4ee2-45a3-bf65-5f642063f3e0", "_rev": "2-d131b8d24d2ecc002018115fb5f3bbf7", "type": "region", "code": "510682", "name": "什邡市", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "75425263-4ee2-45a3-bf65-5f642063f3e0"], "path_name": ["中国", "四川省", "德阳市", "什邡市"], "status": "active", "sort": 2170, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "9d21032c-c0f8-40bd-bec3-b116fe9cdd53", "_rev": "2-b3a9321a23f6226a2ea1e1531c168709", "type": "region", "code": "210113", "name": "沈北新区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "9d21032c-c0f8-40bd-bec3-b116fe9cdd53"], "path_name": ["中国", "辽宁省", "沈阳市", "沈北新区"], "status": "active", "sort": 2174, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "ab5b6282-ddb3-410a-aac0-2d046742995d", "_rev": "2-38700650f4a17efa14dbd5502de61efb", "type": "region", "code": "130128", "name": "深泽县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "ab5b6282-ddb3-410a-aac0-2d046742995d"], "path_name": ["中国", "河北省", "石家庄市", "深泽县"], "status": "active", "sort": 2168, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "b682c34f-a03a-4d30-9b95-281c75726a1c", "_rev": "2-ca96ff4e020babbc980de03e064dea60", "type": "region", "code": "371522", "name": "莘县", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "b682c34f-a03a-4d30-9b95-281c75726a1c"], "path_name": ["中国", "山东省", "聊城市", "莘县"], "status": "active", "sort": 2167, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "c996b9c8-003a-4cbb-b83b-5ca47083c846", "_rev": "2-27beeced0e1822795912bb12b1b29ec6", "type": "region", "code": "610881", "name": "神木市", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "c996b9c8-003a-4cbb-b83b-5ca47083c846"], "path_name": ["中国", "陕西省", "榆林市", "神木市"], "status": "active", "sort": 2172, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:48"} +{"_id": "259e3c81-98d7-4000-990a-08c28fd8ea32", "_rev": "2-a4f41b8c1119cf057fa51cb54db6b360", "type": "region", "code": "522623", "name": "施秉县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "259e3c81-98d7-4000-990a-08c28fd8ea32"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "施秉县"], "status": "active", "sort": 2180, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "3285e23f-47bd-4a37-9257-fddf8efa8416", "_rev": "2-1bb8d8b186198944f16a3c84e5b652c4", "type": "region", "code": "430204", "name": "石峰区", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "3285e23f-47bd-4a37-9257-fddf8efa8416"], "path_name": ["中国", "湖南省", "株洲市", "石峰区"], "status": "active", "sort": 2184, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "32afe778-a773-47d0-bcbe-f8d9b17b670f", "_rev": "2-580eed4a6b0e3dbc5ffd0f64f7e15d5c", "type": "region", "code": "411624", "name": "沈丘县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "32afe778-a773-47d0-bcbe-f8d9b17b670f"], "path_name": ["中国", "河南省", "周口市", "沈丘县"], "status": "active", "sort": 2176, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "5446428c-0588-4316-a6f2-fe020edf7bc1", "_rev": "2-6f6df4680a657578d7e244223a960e05", "type": "region", "code": "530521", "name": "施甸县", "parent_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2", "5446428c-0588-4316-a6f2-fe020edf7bc1"], "path_name": ["中国", "云南省", "保山市", "施甸县"], "status": "active", "sort": 2181, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "5710627c-6f0b-47f3-94c2-8b10f1db0925", "_rev": "2-bc88be02c59e2ff69be902f1f7617939", "type": "region", "code": "530323", "name": "师宗县", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "5710627c-6f0b-47f3-94c2-8b10f1db0925"], "path_name": ["中国", "云南省", "曲靖市", "师宗县"], "status": "active", "sort": 2179, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "860ecdc3-c5d4-42f0-8321-ad562d9e9160", "_rev": "2-8c6fa8a2527741f5e6325147ae2d57c4", "type": "region", "code": "411502", "name": "浉河区", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "860ecdc3-c5d4-42f0-8321-ad562d9e9160"], "path_name": ["中国", "河南省", "信阳市", "浉河区"], "status": "active", "sort": 2182, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "b1a128bb-8f4f-4b04-b002-c3092c82fadb", "_rev": "2-859db150ed809825b94e22e680d1b456", "type": "region", "code": "330922", "name": "嵊泗县", "parent_id": "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "b1a128bb-8f4f-4b04-b002-c3092c82fadb"], "path_name": ["中国", "浙江省", "舟山市", "嵊泗县"], "status": "active", "sort": 2177, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "eda47feb-7b9e-4998-91ae-4501ae7fb8b7", "_rev": "2-58ccedbdc370714ef53e7c0b7b1afd3e", "type": "region", "code": "360735", "name": "石城县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "eda47feb-7b9e-4998-91ae-4501ae7fb8b7"], "path_name": ["中国", "江西省", "赣州市", "石城县"], "status": "active", "sort": 2183, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "fd340b89-d347-42c8-b2a5-ae230736ba8c", "_rev": "2-39b051eb3d24242fab096a229de519c4", "type": "region", "code": "330683", "name": "嵊州市", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "fd340b89-d347-42c8-b2a5-ae230736ba8c"], "path_name": ["中国", "浙江省", "绍兴市", "嵊州市"], "status": "active", "sort": 2178, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:49"} +{"_id": "39af8bca-f7cb-4341-83ca-5f184e9a3e35", "_rev": "2-2cd7cb1d09bc59513fbff10345aba3be", "type": "region", "code": "430726", "name": "石门县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "39af8bca-f7cb-4341-83ca-5f184e9a3e35"], "path_name": ["中国", "湖南省", "常德市", "石门县"], "status": "active", "sort": 2192, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "4553cc3e-579f-4006-b747-d2513ce65f0c", "_rev": "2-18504a0423545dd3881dd365d2078117", "type": "region", "code": "410404", "name": "石龙区", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "4553cc3e-579f-4006-b747-d2513ce65f0c"], "path_name": ["中国", "河南省", "平顶山市", "石龙区"], "status": "active", "sort": 2190, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "4a7c1b94-84a1-4c39-814f-49d9419e7295", "_rev": "2-0460967b37dca76d3cb4ef49dae79600", "type": "region", "code": "150205", "name": "石拐区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "4a7c1b94-84a1-4c39-814f-49d9419e7295"], "path_name": ["中国", "内蒙古自治区", "包头市", "石拐区"], "status": "active", "sort": 2186, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "5f04fea7-0f73-4447-b271-55efce0c8c08", "_rev": "2-a57a5e0e798b7a7af62a5f90a9cd6930", "type": "region", "code": "659001", "name": "石河子市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5f04fea7-0f73-4447-b271-55efce0c8c08"], "path_name": ["中国", "新疆维吾尔自治区", "石河子市"], "status": "active", "sort": 2187, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "716ecc67-73d1-4d5c-9b1e-b5cd3141b284", "_rev": "2-f2cc15704933b7b5cefda6bf17d54433", "type": "region", "code": "430407", "name": "石鼓区", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "716ecc67-73d1-4d5c-9b1e-b5cd3141b284"], "path_name": ["中国", "湖南省", "衡阳市", "石鼓区"], "status": "active", "sort": 2185, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "761f1c28-9362-4d69-bad6-9442a828553f", "_rev": "2-d84ef7685089332e18541e6adda01427", "type": "region", "code": "511824", "name": "石棉县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "761f1c28-9362-4d69-bad6-9442a828553f"], "path_name": ["中国", "四川省", "雅安市", "石棉县"], "status": "active", "sort": 2193, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "76ad7dc5-5030-4785-936c-168563987921", "_rev": "2-a4e4858e705cdf905cc9eeadef3dccc3", "type": "region", "code": "141126", "name": "石楼县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "76ad7dc5-5030-4785-936c-168563987921"], "path_name": ["中国", "山西省", "吕梁市", "石楼县"], "status": "active", "sort": 2191, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "f3887f6b-7f5a-412f-b844-bed327c0f567", "_rev": "2-b267caf9e609980fb18849a6b939f728", "type": "region", "code": "530126", "name": "石林彝族自治县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "f3887f6b-7f5a-412f-b844-bed327c0f567"], "path_name": ["中国", "云南省", "昆明市", "石林彝族自治县"], "status": "active", "sort": 2189, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "fcb77470-a65b-40f2-a17c-e799cbbe5c79", "_rev": "2-6a0295dc5319862ea37ca22c00c6feb8", "type": "region", "code": "110107", "name": "石景山区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "fcb77470-a65b-40f2-a17c-e799cbbe5c79"], "path_name": ["中国", "北京市", "石景山区"], "status": "active", "sort": 2188, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:50"} +{"_id": "096ce150-bc97-4b93-b79a-6b0bca433065", "_rev": "2-9d9a1b71ea6911af0d0380f412e8f82a", "type": "region", "code": "350581", "name": "石狮市", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "096ce150-bc97-4b93-b79a-6b0bca433065"], "path_name": ["中国", "福建省", "泉州市", "石狮市"], "status": "active", "sort": 2198, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "2fe0ef30-dca7-4811-9900-7ff9d0ecc5f3", "_rev": "2-f846bf49924f05299eb6a292f9d73ce1", "type": "region", "code": "341722", "name": "石台县", "parent_id": "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "41f74115-fc6b-4ba3-87f9-2f8df90f1cce", "2fe0ef30-dca7-4811-9900-7ff9d0ecc5f3"], "path_name": ["中国", "安徽省", "池州市", "石台县"], "status": "active", "sort": 2200, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "83e640d8-5cdb-49d0-aea8-d9c77b518998", "_rev": "2-b22cd108c3cb4205cd5bbe3c1cf7eac9", "type": "region", "code": "532525", "name": "石屏县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "83e640d8-5cdb-49d0-aea8-d9c77b518998"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "石屏县"], "status": "active", "sort": 2194, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "98fd505b-f08a-49bd-be0f-8f3dde714cbc", "_rev": "2-0a5f0ae46bbf8c4c36e5ede8b5e8b194", "type": "region", "code": "421081", "name": "石首市", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "98fd505b-f08a-49bd-be0f-8f3dde714cbc"], "path_name": ["中国", "湖北省", "荆州市", "石首市"], "status": "active", "sort": 2199, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "99c2976a-1ff3-4064-a028-0d36901d842f", "_rev": "2-78eea1dee83c14d8f2f6adf39c12d0c0", "type": "region", "code": "520623", "name": "石阡县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "99c2976a-1ff3-4064-a028-0d36901d842f"], "path_name": ["中国", "贵州省", "铜仁市", "石阡县"], "status": "active", "sort": 2195, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "9ea6648a-1497-45d0-99f8-ed6c2afa4c69", "_rev": "2-f0597580f877d356d291351f679c4755", "type": "region", "code": "440222", "name": "始兴县", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "9ea6648a-1497-45d0-99f8-ed6c2afa4c69"], "path_name": ["中国", "广东省", "韶关市", "始兴县"], "status": "active", "sort": 2202, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "e69c69ec-86e0-4171-abcd-8460d421fa99", "_rev": "2-5c4ee07c1f7273a7e3cf2e35bec0ef42", "type": "region", "code": "513332", "name": "石渠县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "e69c69ec-86e0-4171-abcd-8460d421fa99"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "石渠县"], "status": "active", "sort": 2196, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "ea79dd8f-eb00-4bfd-a5a3-c085d4f595d4", "_rev": "2-6a867811a70b15c812b8b8b0d59a1e40", "type": "region", "code": "500240", "name": "石柱土家族自治县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "ea79dd8f-eb00-4bfd-a5a3-c085d4f595d4"], "path_name": ["中国", "重庆市", "石柱土家族自治县"], "status": "active", "sort": 2201, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "f5f7906a-df54-4868-a43f-164ecdaedf78", "_rev": "2-5e30d305371ed1fc8cc8075fa5e9b718", "type": "region", "code": "610922", "name": "石泉县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "f5f7906a-df54-4868-a43f-164ecdaedf78"], "path_name": ["中国", "陕西省", "安康市", "石泉县"], "status": "active", "sort": 2197, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:51"} +{"_id": "1bd4ba82-cd3a-4e3f-899f-85a6c485e4c3", "_rev": "2-074cd935a6a648d74846412889080f3d", "type": "region", "code": "370203", "name": "市北区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "1bd4ba82-cd3a-4e3f-899f-85a6c485e4c3"], "path_name": ["中国", "山东省", "青岛市", "市北区"], "status": "active", "sort": 2203, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "2ba6dc6f-d34f-4e54-85a8-a22095dc38c3", "_rev": "2-8780585614df08299a1ed072f3782144", "type": "region", "code": "341523", "name": "舒城县", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "2ba6dc6f-d34f-4e54-85a8-a22095dc38c3"], "path_name": ["中国", "安徽省", "六安市", "舒城县"], "status": "active", "sort": 2209, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "321a2df9-7ff9-436b-aa57-f1d1271b56ab", "_rev": "2-4df73ccba42fce35f3e9b29fa83921c1", "type": "region", "code": "350924", "name": "寿宁县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "321a2df9-7ff9-436b-aa57-f1d1271b56ab"], "path_name": ["中国", "福建省", "宁德市", "寿宁县"], "status": "active", "sort": 2206, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "6c276e1f-4034-4b84-9e43-2be6bb504157", "_rev": "2-e98264a9c2a340a320012365334e013c", "type": "region", "code": "653121", "name": "疏附县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "6c276e1f-4034-4b84-9e43-2be6bb504157"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "疏附县"], "status": "active", "sort": 2211, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "8199b89f-5b95-4615-a79d-4347957f09ae", "_rev": "2-0d31a8ecd4bed2d025ab3e95a9427d4f", "type": "region", "code": "220283", "name": "舒兰市", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "8199b89f-5b95-4615-a79d-4347957f09ae"], "path_name": ["中国", "吉林省", "吉林市", "舒兰市"], "status": "active", "sort": 2210, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "8fa25b00-72d8-4d3f-88dd-a9e55400c07e", "_rev": "2-acd704f5ab635a36068ea96fb8364ca5", "type": "region", "code": "340422", "name": "寿县", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "8fa25b00-72d8-4d3f-88dd-a9e55400c07e"], "path_name": ["中国", "安徽省", "淮南市", "寿县"], "status": "active", "sort": 2207, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "b8914057-d2fc-4775-b656-2841c07cb012", "_rev": "2-26fe501cb3c0f5e7fd55424e48d3d97c", "type": "region", "code": "370783", "name": "寿光市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "b8914057-d2fc-4775-b656-2841c07cb012"], "path_name": ["中国", "山东省", "潍坊市", "寿光市"], "status": "active", "sort": 2205, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "c28c0f6f-4e50-4c65-9fec-de443cb4dc58", "_rev": "2-56729c3f970486fdf011e6bc615b134a", "type": "region", "code": "370202", "name": "市南区", "parent_id": "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "861dc6e8-c5f2-42e9-b584-d9c6238ad780", "c28c0f6f-4e50-4c65-9fec-de443cb4dc58"], "path_name": ["中国", "山东省", "青岛市", "市南区"], "status": "active", "sort": 2204, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "e896716c-6fdc-4c1f-8d3a-dda9e77c8698", "_rev": "2-bb2fbba2dbf674056f34bbee7535b8d9", "type": "region", "code": "140725", "name": "寿阳县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "e896716c-6fdc-4c1f-8d3a-dda9e77c8698"], "path_name": ["中国", "山西省", "晋中市", "寿阳县"], "status": "active", "sort": 2208, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:52"} +{"_id": "1007e529-6055-42ee-91b9-c8f6e52feddb", "_rev": "2-b47ad623cd8ab048b7bbc988b8f319ac", "type": "region", "code": "230113", "name": "双城区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "1007e529-6055-42ee-91b9-c8f6e52feddb"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "双城区"], "status": "active", "sort": 2217, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "1b6578ae-866b-463c-b5ca-6b1dea597474", "_rev": "2-1c49c7be60d60a633918e12b4ebe80fc", "type": "region", "code": "653122", "name": "疏勒县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "1b6578ae-866b-463c-b5ca-6b1dea597474"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "疏勒县"], "status": "active", "sort": 2212, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "51eca4fb-0c26-445d-8462-557e75643bf9", "_rev": "2-fe4cbee1b3c82364afe541e2769a61a2", "type": "region", "code": "431321", "name": "双峰县", "parent_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "51eca4fb-0c26-445d-8462-557e75643bf9"], "path_name": ["中国", "湖南省", "娄底市", "双峰县"], "status": "active", "sort": 2218, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "a891f842-ef9f-4493-8253-17f45997ddc3", "_rev": "2-3ee1353c6dfdee899af183c5e8ef7423", "type": "region", "code": "321322", "name": "沭阳县", "parent_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "a891f842-ef9f-4493-8253-17f45997ddc3"], "path_name": ["中国", "江苏省", "宿迁市", "沭阳县"], "status": "active", "sort": 2215, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "a8e1c47a-2d54-4762-8b55-5c71f36a8b07", "_rev": "2-ea6b2c80015a0cde8b42559058ebc212", "type": "region", "code": "532322", "name": "双柏县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "a8e1c47a-2d54-4762-8b55-5c71f36a8b07"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "双柏县"], "status": "active", "sort": 2216, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "abf46149-0729-4828-8b19-95b984259456", "_rev": "2-2e75e714b7fc92e717e79ee23f673779", "type": "region", "code": "340104", "name": "蜀山区", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "abf46149-0729-4828-8b19-95b984259456"], "path_name": ["中国", "安徽省", "合肥市", "蜀山区"], "status": "active", "sort": 2213, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "ce0129ea-c076-4684-bba4-ba82e77fc0d9", "_rev": "2-24f56740e4356a028f862a0ddd18a687", "type": "region", "code": "540630", "name": "双湖县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "ce0129ea-c076-4684-bba4-ba82e77fc0d9"], "path_name": ["中国", "西藏自治区", "那曲市", "双湖县"], "status": "active", "sort": 2220, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "_rev": "2-9f6d4b47911c1f6a59cd7317ab14e68a", "type": "region", "code": "321300", "name": "宿迁市", "parent_id": "026d57d5-1440-4cde-8a0f-addef34578e9", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3"], "path_name": ["中国", "江苏省", "宿迁市"], "status": "active", "sort": 2214, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "ebd279cf-983a-4bc7-85a6-11682acf9c7e", "_rev": "2-12297ce84e70a20e9cdaea7376018d2e", "type": "region", "code": "659007", "name": "双河市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "ebd279cf-983a-4bc7-85a6-11682acf9c7e"], "path_name": ["中国", "新疆维吾尔自治区", "双河市"], "status": "active", "sort": 2219, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:53"} +{"_id": "0579f9fd-ed44-4a4b-908e-9a2c8618267f", "_rev": "2-10e0e8a24967ecd66a6a58d245656be5", "type": "region", "code": "530925", "name": "双江拉祜族佤族布朗族傣族自治县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "0579f9fd-ed44-4a4b-908e-9a2c8618267f"], "path_name": ["中国", "云南省", "临沧市", "双江拉祜族佤族布朗族傣族自治县"], "status": "active", "sort": 2221, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "29c45195-cb25-4049-b1a4-4d8bb0ae2bbd", "_rev": "2-cc70f7b7d29304bc60f95bd55512f4e5", "type": "region", "code": "220382", "name": "双辽市", "parent_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50", "29c45195-cb25-4049-b1a4-4d8bb0ae2bbd"], "path_name": ["中国", "吉林省", "四平市", "双辽市"], "status": "active", "sort": 2222, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "2daa9b08-9685-4313-b479-9b90602639e6", "_rev": "2-fc7f5addc34d601242fbdeab7ad7cf63", "type": "region", "code": "510116", "name": "双流区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "2daa9b08-9685-4313-b479-9b90602639e6"], "path_name": ["中国", "四川省", "成都市", "双流区"], "status": "active", "sort": 2223, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "30f6350d-99c5-43eb-94d4-908d4f0b1ce5", "_rev": "2-0ae2b5d110e42063a7ba025ba9ef3409", "type": "region", "code": "130802", "name": "双桥区", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "30f6350d-99c5-43eb-94d4-908d4f0b1ce5"], "path_name": ["中国", "河北省", "承德市", "双桥区"], "status": "active", "sort": 2226, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "81ecef45-35fb-4a18-8d65-945afcd80b71", "_rev": "2-45ae7da7b0484339dceb482eff2b991d", "type": "region", "code": "430502", "name": "双清区", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "81ecef45-35fb-4a18-8d65-945afcd80b71"], "path_name": ["中国", "湖南省", "邵阳市", "双清区"], "status": "active", "sort": 2227, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "893fe81e-532e-44c7-977a-a72d309a7ebf", "_rev": "2-272c76dfb9372cd48da0e63c56adaf07", "type": "region", "code": "220112", "name": "双阳区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "893fe81e-532e-44c7-977a-a72d309a7ebf"], "path_name": ["中国", "吉林省", "长春市", "双阳区"], "status": "active", "sort": 2230, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "b0c37186-5c3e-4046-9939-02a36da8858c", "_rev": "2-17f6c84e9cd46182e5766a38a9bed010", "type": "region", "code": "130803", "name": "双滦区", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "b0c37186-5c3e-4046-9939-02a36da8858c"], "path_name": ["中国", "河北省", "承德市", "双滦区"], "status": "active", "sort": 2224, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "ca9f5a19-ca6a-4292-8a27-45775d02c3a8", "_rev": "2-6ba5f295245ed90f9b28788a9fd391dd", "type": "region", "code": "211302", "name": "双塔区", "parent_id": "35cae45a-c493-40eb-923d-1ad7b346feb9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "35cae45a-c493-40eb-923d-1ad7b346feb9", "ca9f5a19-ca6a-4292-8a27-45775d02c3a8"], "path_name": ["中国", "辽宁省", "朝阳市", "双塔区"], "status": "active", "sort": 2228, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "d1964291-0673-4ce8-a451-f602d650f554", "_rev": "2-bd0decd80f5ceae75e998dce2b70d060", "type": "region", "code": "431123", "name": "双牌县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "d1964291-0673-4ce8-a451-f602d650f554"], "path_name": ["中国", "湖南省", "永州市", "双牌县"], "status": "active", "sort": 2225, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "e3e24f33-32ec-42e5-a694-df6aab7f688f", "_rev": "2-814de02243edf1372b199d3c3db81ac7", "type": "region", "code": "211102", "name": "双台子区", "parent_id": "2729f5aa-8f01-438d-b063-a39d05296b69", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "2729f5aa-8f01-438d-b063-a39d05296b69", "e3e24f33-32ec-42e5-a694-df6aab7f688f"], "path_name": ["中国", "辽宁省", "盘锦市", "双台子区"], "status": "active", "sort": 2229, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:54"} +{"_id": "225037e3-b6f5-497a-bea4-7ea0f353cf7b", "_rev": "2-09cfbaea3f67f731065bd3958804f3b7", "type": "region", "code": "520204", "name": "水城区", "parent_id": "b284639e-6eb4-4c35-add3-3f31cef7708a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "b284639e-6eb4-4c35-add3-3f31cef7708a", "225037e3-b6f5-497a-bea4-7ea0f353cf7b"], "path_name": ["中国", "贵州省", "六盘水市", "水城区"], "status": "active", "sort": 2231, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "246a613a-27d5-42d9-a1ce-62591fa91e96", "_rev": "2-dfcb658cc6fb6067705dc6e45f322266", "type": "region", "code": "210411", "name": "顺城区", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "246a613a-27d5-42d9-a1ce-62591fa91e96"], "path_name": ["中国", "辽宁省", "抚顺市", "顺城区"], "status": "active", "sort": 2235, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "4e0a4fac-8b7e-4eb5-8278-9756ca0a93bb", "_rev": "2-b9e6fe92b66ed5337e6d4a4005a8189a", "type": "region", "code": "440606", "name": "顺德区", "parent_id": "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "f0b175fd-6f44-4e05-8eaf-e7e7f3a49c03", "4e0a4fac-8b7e-4eb5-8278-9756ca0a93bb"], "path_name": ["中国", "广东省", "佛山市", "顺德区"], "status": "active", "sort": 2236, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "5dfbe145-dadd-4baa-8fd4-c9f91a715ca3", "_rev": "2-3292e6a36eb8386ef02d9c8f011a6efe", "type": "region", "code": "650105", "name": "水磨沟区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "5dfbe145-dadd-4baa-8fd4-c9f91a715ca3"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "水磨沟区"], "status": "active", "sort": 2233, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "77c5bbbf-4464-4139-bcf5-499f030adb49", "_rev": "2-c83ff5acf5b470e5c75d1dd4dcb0249d", "type": "region", "code": "130636", "name": "顺平县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "77c5bbbf-4464-4139-bcf5-499f030adb49"], "path_name": ["中国", "河北省", "保定市", "顺平县"], "status": "active", "sort": 2238, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "8ead2dcc-9aa5-4679-9864-5e2c94c7d381", "_rev": "2-7d32cf360b6744c54e76c31aa68aade4", "type": "region", "code": "410203", "name": "顺河回族区", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "8ead2dcc-9aa5-4679-9864-5e2c94c7d381"], "path_name": ["中国", "河南省", "开封市", "顺河回族区"], "status": "active", "sort": 2237, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "a38798b5-e9ad-4b50-8aee-3be4598d6bdf", "_rev": "2-300800069f4d9c11d3e61b4c50eba44a", "type": "region", "code": "511302", "name": "顺庆区", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "a38798b5-e9ad-4b50-8aee-3be4598d6bdf"], "path_name": ["中国", "四川省", "南充市", "顺庆区"], "status": "active", "sort": 2239, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "b0b74ae4-0844-4b23-8e44-4e640770d424", "_rev": "2-6f78a24d0a1c13cd0f1cdc1cfb7a1c43", "type": "region", "code": "530681", "name": "水富市", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "b0b74ae4-0844-4b23-8e44-4e640770d424"], "path_name": ["中国", "云南省", "昭通市", "水富市"], "status": "active", "sort": 2232, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "d7b52707-811d-4e70-b13a-5cb92f6cf1a9", "_rev": "2-9caaadf3f4c0d6ff6c031830026c7695", "type": "region", "code": "350721", "name": "顺昌县", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "d7b52707-811d-4e70-b13a-5cb92f6cf1a9"], "path_name": ["中国", "福建省", "南平市", "顺昌县"], "status": "active", "sort": 2234, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:55"} +{"_id": "2819b508-cffa-4b93-a34c-73892a7ff13c", "_rev": "2-6d7c221c5c1d008a1714f89dbf8b167d", "type": "region", "code": "441284", "name": "四会市", "parent_id": "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5651df8f-fe10-4b6c-b85f-3efa2bbe4508", "2819b508-cffa-4b93-a34c-73892a7ff13c"], "path_name": ["中国", "广东省", "肇庆市", "四会市"], "status": "active", "sort": 2246, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "2d9e4aeb-b9c7-4741-8185-1af1965ead95", "_rev": "2-ff57e997f715e62244e370dfcc70fe59", "type": "region", "code": "140602", "name": "朔城区", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "2d9e4aeb-b9c7-4741-8185-1af1965ead95"], "path_name": ["中国", "山西省", "朔州市", "朔城区"], "status": "active", "sort": 2241, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "3e5191ec-bb65-4523-b21d-2b2525a77741", "_rev": "2-d8e45c6c2c6885d20ce01ab3b5349e5f", "type": "region", "code": "530802", "name": "思茅区", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "3e5191ec-bb65-4523-b21d-2b2525a77741"], "path_name": ["中国", "云南省", "普洱市", "思茅区"], "status": "active", "sort": 2242, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "7d577f95-b6ae-4632-b180-3ee57f41e363", "_rev": "2-79ded0f55556a2a7858047aa257014ca", "type": "region", "code": "110113", "name": "顺义区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "7d577f95-b6ae-4632-b180-3ee57f41e363"], "path_name": ["中国", "北京市", "顺义区"], "status": "active", "sort": 2240, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "9c6cc914-43e9-4245-8b10-554907a0c7f3", "_rev": "2-947550374324ac9297d26643d4f5f8cf", "type": "region", "code": "230505", "name": "四方台区", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "9c6cc914-43e9-4245-8b10-554907a0c7f3"], "path_name": ["中国", "黑龙江省", "双鸭山市", "四方台区"], "status": "active", "sort": 2245, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "a826ce64-a265-41c6-81e3-68786919645f", "_rev": "2-9802672b21bbc1825263505a79814067", "type": "region", "code": "150929", "name": "四子王旗", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "a826ce64-a265-41c6-81e3-68786919645f"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "四子王旗"], "status": "active", "sort": 2247, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "deeee3fa-c2b8-4f2a-be3f-f6748846c79a", "_rev": "2-0c22b1d9867b278241f401ade65ee2e9", "type": "region", "code": "520624", "name": "思南县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "deeee3fa-c2b8-4f2a-be3f-f6748846c79a"], "path_name": ["中国", "贵州省", "铜仁市", "思南县"], "status": "active", "sort": 2244, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "e3473ddf-1330-4f3c-a486-0dfdf938ff87", "_rev": "2-56230ceab93f5de7a95ee14175912e68", "type": "region", "code": "321324", "name": "泗洪县", "parent_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "e3473ddf-1330-4f3c-a486-0dfdf938ff87"], "path_name": ["中国", "江苏省", "宿迁市", "泗洪县"], "status": "active", "sort": 2248, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "ee71063d-b9b0-4e93-a450-eb68e2a484bb", "_rev": "2-a574e9c0d74f8a13631e81a8a5068eb7", "type": "region", "code": "350203", "name": "思明区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "ee71063d-b9b0-4e93-a450-eb68e2a484bb"], "path_name": ["中国", "福建省", "厦门市", "思明区"], "status": "active", "sort": 2243, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:56"} +{"_id": "33f31c6d-3d7c-445e-a0ec-617f0d28dbda", "_rev": "2-10c29f5de85174dd04724a1fdd90b952", "type": "region", "code": "310117", "name": "松江区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "33f31c6d-3d7c-445e-a0ec-617f0d28dbda"], "path_name": ["中国", "上海市", "松江区"], "status": "active", "sort": 2253, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "487c3271-01c8-4626-b2da-208de1610b2e", "_rev": "2-a0a55365c1b4cb26c49d4004a688e2be", "type": "region", "code": "370831", "name": "泗水县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "487c3271-01c8-4626-b2da-208de1610b2e"], "path_name": ["中国", "山东省", "济宁市", "泗水县"], "status": "active", "sort": 2249, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "4daa1600-62ae-42b5-afb1-d77045ac8e0f", "_rev": "2-2537bc91f88d443c6257104611f27c5a", "type": "region", "code": "341324", "name": "泗县", "parent_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "4daa1600-62ae-42b5-afb1-d77045ac8e0f"], "path_name": ["中国", "安徽省", "宿州市", "泗县"], "status": "active", "sort": 2250, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "56a0a63f-2ffa-4efe-8f74-46a14798db52", "_rev": "2-f3289e829fc7bc579a410d021e759e38", "type": "region", "code": "520628", "name": "松桃苗族自治县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "56a0a63f-2ffa-4efe-8f74-46a14798db52"], "path_name": ["中国", "贵州省", "铜仁市", "松桃苗族自治县"], "status": "active", "sort": 2255, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "6a227be2-5b6e-4dfb-ad70-6933c55c6d7a", "_rev": "2-b32563fadf83a236134876809eca89bb", "type": "region", "code": "350724", "name": "松溪县", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "6a227be2-5b6e-4dfb-ad70-6933c55c6d7a"], "path_name": ["中国", "福建省", "南平市", "松溪县"], "status": "active", "sort": 2256, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "7635613f-15fd-48bc-ac93-eda711a590f7", "_rev": "2-5bef39f1e4d166770dbb34406588ec01", "type": "region", "code": "321323", "name": "泗阳县", "parent_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "7635613f-15fd-48bc-ac93-eda711a590f7"], "path_name": ["中国", "江苏省", "宿迁市", "泗阳县"], "status": "active", "sort": 2251, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "c5a09371-df6e-4026-9e74-7b92155fd1cc", "_rev": "2-caa9907d81b931844ac953b6cdae23a7", "type": "region", "code": "513224", "name": "松潘县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "c5a09371-df6e-4026-9e74-7b92155fd1cc"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "松潘县"], "status": "active", "sort": 2254, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "e9997d0c-bcbb-4aa0-beaa-c55a4f9d1ce6", "_rev": "2-07f25bbb0d64afc35d8e1bf7a5451ffe", "type": "region", "code": "230109", "name": "松北区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "e9997d0c-bcbb-4aa0-beaa-c55a4f9d1ce6"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "松北区"], "status": "active", "sort": 2252, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:57"} +{"_id": "2c510344-5854-4c05-8c2e-e95bfae6e68a", "_rev": "2-1c186b53c4f65490f2ed9aee54c62bf1", "type": "region", "code": "152524", "name": "苏尼特右旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "2c510344-5854-4c05-8c2e-e95bfae6e68a"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "苏尼特右旗"], "status": "active", "sort": 2262, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "3ce73c7a-eefc-4e89-926f-6afce0929c9b", "_rev": "2-9ae2ba1d26046f3448cab6802c6e6e0f", "type": "region", "code": "421087", "name": "松滋市", "parent_id": "23f69c24-b804-4e6d-8651-c220e2d33187", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "23f69c24-b804-4e6d-8651-c220e2d33187", "3ce73c7a-eefc-4e89-926f-6afce0929c9b"], "path_name": ["中国", "湖北省", "荆州市", "松滋市"], "status": "active", "sort": 2258, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "3ebf6608-5e20-4dd7-865d-31748e56dac4", "_rev": "2-cabd8cb8d9bf80a28a2f92e786d831ae", "type": "region", "code": "410325", "name": "嵩县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "3ebf6608-5e20-4dd7-865d-31748e56dac4"], "path_name": ["中国", "河南省", "洛阳市", "嵩县"], "status": "active", "sort": 2260, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "aba65a6d-2f1f-4123-adce-b4a2a542f2a8", "_rev": "2-2f04f2ff0d57632d454e3a398b88d5f4", "type": "region", "code": "331124", "name": "松阳县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "aba65a6d-2f1f-4123-adce-b4a2a542f2a8"], "path_name": ["中国", "浙江省", "丽水市", "松阳县"], "status": "active", "sort": 2257, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "c1c4f7fb-28db-41e3-9f3c-65dbd83afcbd", "_rev": "2-e2c7e3ee64dd036ba89027cfef6caa2c", "type": "region", "code": "210111", "name": "苏家屯区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "c1c4f7fb-28db-41e3-9f3c-65dbd83afcbd"], "path_name": ["中国", "辽宁省", "沈阳市", "苏家屯区"], "status": "active", "sort": 2261, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "f1a2f513-5797-4061-9ea7-c7b6eff94e80", "_rev": "2-1fb196e9100a3a4cedbff2706bec5590", "type": "region", "code": "530127", "name": "嵩明县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "f1a2f513-5797-4061-9ea7-c7b6eff94e80"], "path_name": ["中国", "云南省", "昆明市", "嵩明县"], "status": "active", "sort": 2259, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:58"} +{"_id": "5524ba8b-3e7d-4ae4-bcf5-ab2f5dbd7e5c", "_rev": "2-725c9600a43dbcba98e013e6472a68d1", "type": "region", "code": "620923", "name": "肃北蒙古族自治县", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "5524ba8b-3e7d-4ae4-bcf5-ab2f5dbd7e5c"], "path_name": ["中国", "甘肃省", "酒泉市", "肃北蒙古族自治县"], "status": "active", "sort": 2265, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "6511cb64-f2d6-4fd4-b06a-6b82a0e70999", "_rev": "2-2ffea6fe68ebcab357f8616cf97b294a", "type": "region", "code": "321302", "name": "宿城区", "parent_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "6511cb64-f2d6-4fd4-b06a-6b82a0e70999"], "path_name": ["中国", "江苏省", "宿迁市", "宿城区"], "status": "active", "sort": 2269, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "65a56f7e-1fd4-436c-9a52-49c6897cc29a", "_rev": "2-a9365226096cb7fc857dfe8f219a4c94", "type": "region", "code": "620721", "name": "肃南裕固族自治县", "parent_id": "11d52ea7-c364-46ba-a787-04e322711812", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "11d52ea7-c364-46ba-a787-04e322711812", "65a56f7e-1fd4-436c-9a52-49c6897cc29a"], "path_name": ["中国", "甘肃省", "张掖市", "肃南裕固族自治县"], "status": "active", "sort": 2266, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "8481ec2b-b530-44eb-a51d-157015081a7c", "_rev": "2-1f91b12531bf996f4133673ace1e5dcb", "type": "region", "code": "620902", "name": "肃州区", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "8481ec2b-b530-44eb-a51d-157015081a7c"], "path_name": ["中国", "甘肃省", "酒泉市", "肃州区"], "status": "active", "sort": 2268, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "8f68fe75-d4cd-4cc4-978d-49a98bb5c462", "_rev": "2-b64a5ce1ff9c598d465b22cadaafbb91", "type": "region", "code": "130926", "name": "肃宁县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "8f68fe75-d4cd-4cc4-978d-49a98bb5c462"], "path_name": ["中国", "河北省", "沧州市", "肃宁县"], "status": "active", "sort": 2267, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "b62c8649-e204-4734-a895-c41d28950226", "_rev": "2-5c24cc3520a4b99ef66e6e76b471bf72", "type": "region", "code": "340826", "name": "宿松县", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "b62c8649-e204-4734-a895-c41d28950226"], "path_name": ["中国", "安徽省", "安庆市", "宿松县"], "status": "active", "sort": 2270, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "f2e2f979-05e2-4161-94c1-95f579af0673", "_rev": "2-33a71c19ef69587a27ff2e13caa8586c", "type": "region", "code": "152523", "name": "苏尼特左旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "f2e2f979-05e2-4161-94c1-95f579af0673"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "苏尼特左旗"], "status": "active", "sort": 2263, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "fa84bc82-4eca-41cd-b96b-fe3a9b70b913", "_rev": "2-152e750cc5d4e433e137771e8e91a2c3", "type": "region", "code": "431003", "name": "苏仙区", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "fa84bc82-4eca-41cd-b96b-fe3a9b70b913"], "path_name": ["中国", "湖南省", "郴州市", "苏仙区"], "status": "active", "sort": 2264, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:02:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:02:59"} +{"_id": "187c27dd-b904-4b6d-babc-4a4a46a5aa79", "_rev": "2-0df8fe444e3fa11605da04eb5b105deb", "type": "region", "code": "321311", "name": "宿豫区", "parent_id": "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "ded09ff4-6982-4dfb-af01-0ef58c9e46b3", "187c27dd-b904-4b6d-babc-4a4a46a5aa79"], "path_name": ["中国", "江苏省", "宿迁市", "宿豫区"], "status": "active", "sort": 2271, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "56da0916-b995-447f-8c79-79bb3d1c60d6", "_rev": "2-e1391dce22163923915a2a1132c6c92b", "type": "region", "code": "411403", "name": "睢阳区", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "56da0916-b995-447f-8c79-79bb3d1c60d6"], "path_name": ["中国", "河南省", "商丘市", "睢阳区"], "status": "active", "sort": 2274, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "61416195-8994-4c8e-a3cb-6d31a8996352", "_rev": "2-74e1fd23fa4fcd365a3f4b0699810ee0", "type": "region", "code": "411422", "name": "睢县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "61416195-8994-4c8e-a3cb-6d31a8996352"], "path_name": ["中国", "河南省", "商丘市", "睢县"], "status": "active", "sort": 2273, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "70adc0c2-fd71-419d-9826-d928967b163c", "_rev": "2-d000ac4b58e9a0ebda2f4a40850dddf1", "type": "region", "code": "230400", "name": "鹤岗市", "parent_id": "318d1515-26ea-4b81-b071-4cf0ea855ba3", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c"], "path_name": ["中国", "黑龙江省", "鹤岗市"], "status": "active", "sort": 2276, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "8ba73f61-c0b6-404e-848f-11b3ddb8682a", "_rev": "2-0384c54ea6930fdee7c399a59cc23b01", "type": "region", "code": "230422", "name": "绥滨县", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "8ba73f61-c0b6-404e-848f-11b3ddb8682a"], "path_name": ["中国", "黑龙江省", "鹤岗市", "绥滨县"], "status": "active", "sort": 2277, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "b4c11e82-2dc9-4a9c-9c70-c2514d35ff89", "_rev": "2-073a70797b0ec2fe5af35072160bb253", "type": "region", "code": "340621", "name": "濉溪县", "parent_id": "5a306b32-cd23-49dc-910d-326cd0c36b00", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "5a306b32-cd23-49dc-910d-326cd0c36b00", "b4c11e82-2dc9-4a9c-9c70-c2514d35ff89"], "path_name": ["中国", "安徽省", "淮北市", "濉溪县"], "status": "active", "sort": 2275, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "b9ffe5af-888c-4402-9e16-e46c139e0f97", "_rev": "2-d068a4d7fe497f77a9dff22693afa3d1", "type": "region", "code": "320324", "name": "睢宁县", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "b9ffe5af-888c-4402-9e16-e46c139e0f97"], "path_name": ["中国", "江苏省", "徐州市", "睢宁县"], "status": "active", "sort": 2272, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "e5511932-50a1-45af-ac17-dd2b2eef6eb3", "_rev": "2-15b0ea58b4a8ec4ce7288d148d263430", "type": "region", "code": "610826", "name": "绥德县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "e5511932-50a1-45af-ac17-dd2b2eef6eb3"], "path_name": ["中国", "陕西省", "榆林市", "绥德县"], "status": "active", "sort": 2278, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:00"} +{"_id": "17bae74a-2be8-4b3d-8282-08c2b87d6c3b", "_rev": "2-0fee1d3d86cd8eccf78cb4513ca81dca", "type": "region", "code": "231226", "name": "绥棱县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "17bae74a-2be8-4b3d-8282-08c2b87d6c3b"], "path_name": ["中国", "黑龙江省", "绥化市", "绥棱县"], "status": "active", "sort": 2281, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "200fd917-9a6b-4deb-a293-4cda627410f6", "_rev": "2-d0fe991b5b17a80a3ee55f11ec82f2fb", "type": "region", "code": "430527", "name": "绥宁县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "200fd917-9a6b-4deb-a293-4cda627410f6"], "path_name": ["中国", "湖南省", "邵阳市", "绥宁县"], "status": "active", "sort": 2282, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "23f3a738-2d7e-47bc-a621-5ba1cea288a5", "_rev": "2-82bb2008630bade4bf4903c1eb7d1ac7", "type": "region", "code": "231081", "name": "绥芬河市", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "23f3a738-2d7e-47bc-a621-5ba1cea288a5"], "path_name": ["中国", "黑龙江省", "牡丹江市", "绥芬河市"], "status": "active", "sort": 2279, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "5ff8af9d-3855-4bab-92fc-f0a77f950163", "_rev": "2-46320c3858be2c907769b1fb5cbab51a", "type": "region", "code": "530626", "name": "绥江县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "5ff8af9d-3855-4bab-92fc-f0a77f950163"], "path_name": ["中国", "云南省", "昭通市", "绥江县"], "status": "active", "sort": 2280, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "8241d004-4538-4b69-bca2-1eebc6969eb0", "_rev": "2-82de54760c157dc67bf32afaddd8a592", "type": "region", "code": "421321", "name": "随县", "parent_id": "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "8418e6c9-727e-4c6c-96e5-ba86d8d6eb81", "8241d004-4538-4b69-bca2-1eebc6969eb0"], "path_name": ["中国", "湖北省", "随州市", "随县"], "status": "active", "sort": 2285, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "cc7a5462-65d2-46ff-893d-a9dc80438bf7", "_rev": "2-7f4bb905730d88da079cc1e86ef721dc", "type": "region", "code": "211421", "name": "绥中县", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "cc7a5462-65d2-46ff-893d-a9dc80438bf7"], "path_name": ["中国", "辽宁省", "葫芦岛市", "绥中县"], "status": "active", "sort": 2284, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "f93fc009-d1de-4501-915a-681d50850871", "_rev": "2-dbe53dde066211e820c7ee459b256f09", "type": "region", "code": "520323", "name": "绥阳县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "f93fc009-d1de-4501-915a-681d50850871"], "path_name": ["中国", "贵州省", "遵义市", "绥阳县"], "status": "active", "sort": 2283, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:01"} +{"_id": "3dfd8812-14ee-4680-ad85-860c2d9f7efd", "_rev": "2-9f29e2f31672c44f3b867ce01c189d9a", "type": "region", "code": "540626", "name": "索县", "parent_id": "162dde4e-0e55-421a-8826-b4993a0f3a58", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "162dde4e-0e55-421a-8826-b4993a0f3a58", "3dfd8812-14ee-4680-ad85-860c2d9f7efd"], "path_name": ["中国", "西藏自治区", "那曲市", "索县"], "status": "active", "sort": 2291, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "5af96bfa-a44f-44e5-b67f-27dbafeed7f9", "_rev": "2-12ad31e754f1b7e70aa79d9aed82a5c6", "type": "region", "code": "360827", "name": "遂川县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "5af96bfa-a44f-44e5-b67f-27dbafeed7f9"], "path_name": ["中国", "江西省", "吉安市", "遂川县"], "status": "active", "sort": 2287, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "5d48fccc-7ea6-4d9d-8619-7da3ffe17eb2", "_rev": "2-553f03d70c03122e0983f5ac434cef69", "type": "region", "code": "411728", "name": "遂平县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "5d48fccc-7ea6-4d9d-8619-7da3ffe17eb2"], "path_name": ["中国", "河南省", "驻马店市", "遂平县"], "status": "active", "sort": 2288, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "60ac07a9-cb67-41e5-b1d7-89cc8a8aa2cb", "_rev": "2-498811167642c88f71d32dbd3838d955", "type": "region", "code": "331123", "name": "遂昌县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "60ac07a9-cb67-41e5-b1d7-89cc8a8aa2cb"], "path_name": ["中国", "浙江省", "丽水市", "遂昌县"], "status": "active", "sort": 2286, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "7b2dbfe0-9de9-4a47-bdef-327a20305835", "_rev": "2-d8810722f536a958c33cc2e4c0aa8877", "type": "region", "code": "440823", "name": "遂溪县", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "7b2dbfe0-9de9-4a47-bdef-327a20305835"], "path_name": ["中国", "广东省", "湛江市", "遂溪县"], "status": "active", "sort": 2289, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "8cb0581c-8fc3-4b05-8feb-77a50e9a7bce", "_rev": "2-f31bccd818f1beb62573ee7ef86c9a08", "type": "region", "code": "232722", "name": "塔河县", "parent_id": "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "a3ba5a37-3994-4d6a-be5b-f7378f134f04", "8cb0581c-8fc3-4b05-8feb-77a50e9a7bce"], "path_name": ["中国", "黑龙江省", "大兴安岭地区", "塔河县"], "status": "active", "sort": 2293, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "ddc1bd13-0b51-4af5-bfac-79bfdfd91a69", "_rev": "2-f1a919953efe0ed5bd28cc5b3c9bbe2b", "type": "region", "code": "654201", "name": "塔城市", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "ddc1bd13-0b51-4af5-bfac-79bfdfd91a69"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "塔城市"], "status": "active", "sort": 2292, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "ee3a38b9-9aae-43d7-802e-0f38aef65517", "_rev": "2-06964b83142bf6373eca38f19b29b872", "type": "region", "code": "231124", "name": "孙吴县", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "ee3a38b9-9aae-43d7-802e-0f38aef65517"], "path_name": ["中国", "黑龙江省", "黑河市", "孙吴县"], "status": "active", "sort": 2290, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:02"} +{"_id": "262dd13a-4949-4cc9-9aa0-f029031a60f2", "_rev": "2-9c4cc3385abe43b0ad568e256aa535ab", "type": "region", "code": "522630", "name": "台江县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "262dd13a-4949-4cc9-9aa0-f029031a60f2"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "台江县"], "status": "active", "sort": 2298, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "3590228c-cc93-48d8-911b-97494be9a9aa", "_rev": "2-5cebdd5bed7472faa4d337184d92d9b8", "type": "region", "code": "410927", "name": "台前县", "parent_id": "dab66463-c599-414e-b019-5420d011030e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "dab66463-c599-414e-b019-5420d011030e", "3590228c-cc93-48d8-911b-97494be9a9aa"], "path_name": ["中国", "河南省", "濮阳市", "台前县"], "status": "active", "sort": 2299, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "3a5c1790-bf4f-45ca-8c37-79086cb9dcbd", "_rev": "2-6bfc119780b6abcf6e8f148cd84860a8", "type": "region", "code": "610331", "name": "太白县", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "3a5c1790-bf4f-45ca-8c37-79086cb9dcbd"], "path_name": ["中国", "陕西省", "宝鸡市", "太白县"], "status": "active", "sort": 2301, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "c7ee95c2-8d69-402e-a3b2-9fc6b86229f3", "_rev": "2-01308f41c28b04a1610e1eca7c095155", "type": "region", "code": "653131", "name": "塔什库尔干塔吉克自治县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "c7ee95c2-8d69-402e-a3b2-9fc6b86229f3"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "塔什库尔干塔吉克自治县"], "status": "active", "sort": 2294, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "cbca7495-d28e-4b03-bcab-de129468acf8", "_rev": "2-51df4c74a76a6436b1755cb92d04f823", "type": "region", "code": "370405", "name": "台儿庄区", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "cbca7495-d28e-4b03-bcab-de129468acf8"], "path_name": ["中国", "山东省", "枣庄市", "台儿庄区"], "status": "active", "sort": 2296, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "f2e7b451-cd54-4c78-b6ac-1236a9d75b95", "_rev": "2-18989ad59cc4aaacd254ffa0013f5c3c", "type": "region", "code": "440781", "name": "台山市", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "f2e7b451-cd54-4c78-b6ac-1236a9d75b95"], "path_name": ["中国", "广东省", "江门市", "台山市"], "status": "active", "sort": 2300, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "f6096794-6da2-4bd8-a904-df5ab8509d08", "_rev": "2-d5c6d24af1141c9e16906c1922b76f1c", "type": "region", "code": "210321", "name": "台安县", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "f6096794-6da2-4bd8-a904-df5ab8509d08"], "path_name": ["中国", "辽宁省", "鞍山市", "台安县"], "status": "active", "sort": 2295, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "f919562b-fac1-4fea-b8c0-64f610980ae7", "_rev": "2-43fcf40aa1c14026b3ec005d4955eea6", "type": "region", "code": "350103", "name": "台江区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "f919562b-fac1-4fea-b8c0-64f610980ae7"], "path_name": ["中国", "福建省", "福州市", "台江区"], "status": "active", "sort": 2297, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:03"} +{"_id": "16db9b5f-28b8-4051-b1f9-6e4d9e4023bd", "_rev": "2-0e39b3c53125dc43816a05ed946365fa", "type": "region", "code": "210711", "name": "太和区", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "16db9b5f-28b8-4051-b1f9-6e4d9e4023bd"], "path_name": ["中国", "辽宁省", "锦州市", "太和区"], "status": "active", "sort": 2304, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "4ca3f70e-baca-4d97-8d8e-b8c22a065555", "_rev": "2-a9f92ebe5898e82d48c367b9b78c0fc6", "type": "region", "code": "210904", "name": "太平区", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "4ca3f70e-baca-4d97-8d8e-b8c22a065555"], "path_name": ["中国", "辽宁省", "阜新市", "太平区"], "status": "active", "sort": 2308, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "55b2277a-29c5-4e72-a421-d961b03130d7", "_rev": "2-68b5e299ff93007a0321a90d5930fb1c", "type": "region", "code": "340825", "name": "太湖县", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "55b2277a-29c5-4e72-a421-d961b03130d7"], "path_name": ["中国", "安徽省", "安庆市", "太湖县"], "status": "active", "sort": 2306, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "5c109629-dee8-445d-8b5e-764301fc624c", "_rev": "2-8fed9381ef089cdefe27a72565ca9162", "type": "region", "code": "152527", "name": "太仆寺旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "5c109629-dee8-445d-8b5e-764301fc624c"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "太仆寺旗"], "status": "active", "sort": 2309, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "619cd489-7c56-4ce9-a920-bb38bef5a59e", "_rev": "2-4ab45deff048aead3acd889d4d1f1df0", "type": "region", "code": "140703", "name": "太谷区", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "619cd489-7c56-4ce9-a920-bb38bef5a59e"], "path_name": ["中国", "山西省", "晋中市", "太谷区"], "status": "active", "sort": 2303, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "696a2837-04ae-4914-ae4d-9a69b2ed55b5", "_rev": "2-51ec35c3e3fb457fbda470b501ab8a78", "type": "region", "code": "411627", "name": "太康县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "696a2837-04ae-4914-ae4d-9a69b2ed55b5"], "path_name": ["中国", "河南省", "周口市", "太康县"], "status": "active", "sort": 2307, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "788ad1a6-c118-43bc-a5c6-f7037299d6c3", "_rev": "2-a89d2c87133adc01b76b56b78d55bd3a", "type": "region", "code": "341222", "name": "太和县", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "788ad1a6-c118-43bc-a5c6-f7037299d6c3"], "path_name": ["中国", "安徽省", "阜阳市", "太和县"], "status": "active", "sort": 2305, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "82a5c2a4-7280-4a88-9b2d-715d70fa572e", "_rev": "2-801aaea41e4b50cd7ad6fcc9cc322960", "type": "region", "code": "320585", "name": "太仓市", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "82a5c2a4-7280-4a88-9b2d-715d70fa572e"], "path_name": ["中国", "江苏省", "苏州市", "太仓市"], "status": "active", "sort": 2302, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:04"} +{"_id": "21726456-c2a7-4847-81d1-7177b754f30d", "_rev": "2-cb4a112855f4a531be5835ea510a7544", "type": "region", "code": "321283", "name": "泰兴市", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "21726456-c2a7-4847-81d1-7177b754f30d"], "path_name": ["中国", "江苏省", "泰州市", "泰兴市"], "status": "active", "sort": 2316, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "284d8bb3-238d-4bd5-bf58-909590cd2eb8", "_rev": "2-00c502969a59b08aa84cd548469a8c68", "type": "region", "code": "371322", "name": "郯城县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "284d8bb3-238d-4bd5-bf58-909590cd2eb8"], "path_name": ["中国", "山东省", "临沂市", "郯城县"], "status": "active", "sort": 2317, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "28cdb626-c94d-4ce8-aea4-a7709c3fd8db", "_rev": "2-a1588ace9e601386fab5e3a8f24f8300", "type": "region", "code": "330329", "name": "泰顺县", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "28cdb626-c94d-4ce8-aea4-a7709c3fd8db"], "path_name": ["中国", "浙江省", "温州市", "泰顺县"], "status": "active", "sort": 2315, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "6b6e85cb-ba84-467a-9330-c774e8ccade5", "_rev": "2-3bdafed874dd4a301e75875f39695f78", "type": "region", "code": "360826", "name": "泰和县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "6b6e85cb-ba84-467a-9330-c774e8ccade5"], "path_name": ["中国", "江西省", "吉安市", "泰和县"], "status": "active", "sort": 2311, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "7582acdd-564e-48ac-9519-1b38c4642dba", "_rev": "2-ad895039056790827b1eb5d67a2c1293", "type": "region", "code": "230224", "name": "泰来县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "7582acdd-564e-48ac-9519-1b38c4642dba"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "泰来县"], "status": "active", "sort": 2312, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "77a8f4bb-252e-4ea8-8005-3f28b36a82a8", "_rev": "2-703be7fdecd132c563d5869845fe4b2b", "type": "region", "code": "350429", "name": "泰宁县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "77a8f4bb-252e-4ea8-8005-3f28b36a82a8"], "path_name": ["中国", "福建省", "三明市", "泰宁县"], "status": "active", "sort": 2313, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "e207e2da-e7ac-4a7d-bae9-175586760e06", "_rev": "2-352d7f7b7b96e0d8327c1318062889c3", "type": "region", "code": "370902", "name": "泰山区", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "e207e2da-e7ac-4a7d-bae9-175586760e06"], "path_name": ["中国", "山东省", "泰安市", "泰山区"], "status": "active", "sort": 2314, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "fea6f654-ef84-46fd-abf5-893feec03f7b", "_rev": "2-e397b727fb7c072a3f98bf7b885022b3", "type": "region", "code": "211011", "name": "太子河区", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "fea6f654-ef84-46fd-abf5-893feec03f7b"], "path_name": ["中国", "辽宁省", "辽阳市", "太子河区"], "status": "active", "sort": 2310, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:05"} +{"_id": "10f77a66-5f39-4533-9fba-5809bb0448e8", "_rev": "2-cb63820784f6acb5f99e597404247622", "type": "region", "code": "220802", "name": "洮北区", "parent_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "10f77a66-5f39-4533-9fba-5809bb0448e8"], "path_name": ["中国", "吉林省", "白城市", "洮北区"], "status": "active", "sort": 2322, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "76737c59-39d0-4562-aeb5-4079a14d5ae7", "_rev": "2-2534a48f8524338249f1561adbc10765", "type": "region", "code": "230903", "name": "桃山区", "parent_id": "457b8969-a83b-457f-b231-06d5349d40a1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "457b8969-a83b-457f-b231-06d5349d40a1", "76737c59-39d0-4562-aeb5-4079a14d5ae7"], "path_name": ["中国", "黑龙江省", "七台河市", "桃山区"], "status": "active", "sort": 2326, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "7b878a84-cf8c-4fbb-9fb3-e1bfde1d2049", "_rev": "2-a21fe9b25a0c0f5d5f32c55f2d6253cb", "type": "region", "code": "410523", "name": "汤阴县", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "7b878a84-cf8c-4fbb-9fb3-e1bfde1d2049"], "path_name": ["中国", "河南省", "安阳市", "汤阴县"], "status": "active", "sort": 2319, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "98b0c96f-1234-48fb-bfc2-57cf747e2d15", "_rev": "2-fe3d996c3b12707935842fb29ac5a2e8", "type": "region", "code": "130627", "name": "唐县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "98b0c96f-1234-48fb-bfc2-57cf747e2d15"], "path_name": ["中国", "河北省", "保定市", "唐县"], "status": "active", "sort": 2321, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "b02198cc-e635-4b59-abfd-520f16c1d193", "_rev": "2-0191678abf095bfc7caf5a794016e303", "type": "region", "code": "411328", "name": "唐河县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "b02198cc-e635-4b59-abfd-520f16c1d193"], "path_name": ["中国", "河南省", "南阳市", "唐河县"], "status": "active", "sort": 2320, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "caba00e2-164a-4346-9a2a-39ed51fe062e", "_rev": "2-dcf0eaeae1825040536f843a1f1de7d8", "type": "region", "code": "220881", "name": "洮南市", "parent_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "caba00e2-164a-4346-9a2a-39ed51fe062e"], "path_name": ["中国", "吉林省", "白城市", "洮南市"], "status": "active", "sort": 2323, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "d3429e6d-1490-4ad1-998d-c8cb7fc8c955", "_rev": "2-e22f92613eb3ac82906ddb7d70689493", "type": "region", "code": "450804", "name": "覃塘区", "parent_id": "ba01700c-89be-4290-9a0a-0e34b87337d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "ba01700c-89be-4290-9a0a-0e34b87337d1", "d3429e6d-1490-4ad1-998d-c8cb7fc8c955"], "path_name": ["中国", "广西壮族自治区", "贵港市", "覃塘区"], "status": "active", "sort": 2318, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "d5f578bb-14d9-4814-b6f6-4c01e346f1b8", "_rev": "2-18aa7114b244b7efe99b9b19b1d9ff57", "type": "region", "code": "430922", "name": "桃江县", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "d5f578bb-14d9-4814-b6f6-4c01e346f1b8"], "path_name": ["中国", "湖南省", "益阳市", "桃江县"], "status": "active", "sort": 2325, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "e52ba13b-d8ae-468a-8bcd-0ef66547094d", "_rev": "2-a1d78ff8283d71b136deeee7cf9ad0c3", "type": "region", "code": "131102", "name": "桃城区", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "e52ba13b-d8ae-468a-8bcd-0ef66547094d"], "path_name": ["中国", "河北省", "衡水市", "桃城区"], "status": "active", "sort": 2324, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:06"} +{"_id": "0c32eb0e-3ed8-4aaf-9466-2fea9bf89c09", "_rev": "2-05d38c55a52cf2454223dde502bc2c39", "type": "region", "code": "430725", "name": "桃源县", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "0c32eb0e-3ed8-4aaf-9466-2fea9bf89c09"], "path_name": ["中国", "湖南省", "常德市", "桃源县"], "status": "active", "sort": 2327, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "1c47a44d-fa28-4fbb-a809-5a82117ad5c4", "_rev": "2-55995a60fe1967554a818670221793a5", "type": "region", "code": "451222", "name": "天峨县", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "1c47a44d-fa28-4fbb-a809-5a82117ad5c4"], "path_name": ["中国", "广西壮族自治区", "河池市", "天峨县"], "status": "active", "sort": 2333, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "1c5d3d98-fcfb-4e35-a0b4-0a13d9ca8435", "_rev": "2-bdc6bb42b80cba1aa50311404c1195bb", "type": "region", "code": "440106", "name": "天河区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "1c5d3d98-fcfb-4e35-a0b4-0a13d9ca8435"], "path_name": ["中国", "广东省", "广州市", "天河区"], "status": "active", "sort": 2334, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "2223b575-c632-412f-88d3-df45ce10422d", "_rev": "2-c50e8daba220385f5d703d2f88686ce9", "type": "region", "code": "451425", "name": "天等县", "parent_id": "11deb1d1-7486-4444-99e1-7fcc3b467a54", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "11deb1d1-7486-4444-99e1-7fcc3b467a54", "2223b575-c632-412f-88d3-df45ce10422d"], "path_name": ["中国", "广西壮族自治区", "崇左市", "天等县"], "status": "active", "sort": 2332, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "b3a9dc7a-9de5-42ee-a00c-7ffacff0d359", "_rev": "2-67c5dcc53b45a3b141885408b6c422f7", "type": "region", "code": "370481", "name": "滕州市", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "b3a9dc7a-9de5-42ee-a00c-7ffacff0d359"], "path_name": ["中国", "山东省", "枣庄市", "滕州市"], "status": "active", "sort": 2330, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "bae500e2-1e92-49c3-84e2-8bcc8d14f989", "_rev": "2-474c23bd90e2b87f70cf8a6755d173db", "type": "region", "code": "654027", "name": "特克斯县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "bae500e2-1e92-49c3-84e2-8bcc8d14f989"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "特克斯县"], "status": "active", "sort": 2328, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "bc1dd263-4264-4fb9-b8ac-f5490c07c82d", "_rev": "2-debc2a3d9c32fa8e2043d110593ef9ce", "type": "region", "code": "530581", "name": "腾冲市", "parent_id": "57871ad6-c367-4be2-91db-da8e97cce5c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "57871ad6-c367-4be2-91db-da8e97cce5c2", "bc1dd263-4264-4fb9-b8ac-f5490c07c82d"], "path_name": ["中国", "云南省", "保山市", "腾冲市"], "status": "active", "sort": 2329, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "be28fa56-c61b-4643-a532-a127aceab6ed", "_rev": "2-fdf20c11175e41a277f10eaa542faff7", "type": "region", "code": "450422", "name": "藤县", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "be28fa56-c61b-4643-a532-a127aceab6ed"], "path_name": ["中国", "广西壮族自治区", "梧州市", "藤县"], "status": "active", "sort": 2331, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:07"} +{"_id": "09de5332-9840-4845-96d2-c402d88f1485", "_rev": "2-2835d3aaf57988e8a389c20fbb1864e8", "type": "region", "code": "650102", "name": "天山区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "09de5332-9840-4845-96d2-c402d88f1485"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "天山区"], "status": "active", "sort": 2340, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "421b8dd4-2d71-4e26-8824-9052907371f0", "_rev": "2-8ab9e1619d2ab8b8b5f79f0d107b59ef", "type": "region", "code": "331023", "name": "天台县", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "421b8dd4-2d71-4e26-8824-9052907371f0"], "path_name": ["中国", "浙江省", "台州市", "天台县"], "status": "active", "sort": 2341, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "49c424b0-21a3-48f8-aea2-114e5c4d508b", "_rev": "2-1a6e8c6c2fd75fe6b0dd8ef57602b9f4", "type": "region", "code": "430103", "name": "天心区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "49c424b0-21a3-48f8-aea2-114e5c4d508b"], "path_name": ["中国", "湖南省", "长沙市", "天心区"], "status": "active", "sort": 2342, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "4c8da7e9-ef2a-4cec-b573-1eea7e918b66", "_rev": "2-5b3ec42725f001f19c039195e32216f7", "type": "region", "code": "320402", "name": "天宁区", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "4c8da7e9-ef2a-4cec-b573-1eea7e918b66"], "path_name": ["中国", "江苏省", "常州市", "天宁区"], "status": "active", "sort": 2337, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "6defd2fe-76d8-4242-ab54-425731764857", "_rev": "2-b6b9940715036c32b9300becc7be66c8", "type": "region", "code": "511825", "name": "天全县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "6defd2fe-76d8-4242-ab54-425731764857"], "path_name": ["中国", "四川省", "雅安市", "天全县"], "status": "active", "sort": 2339, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "78f2b785-6823-4676-8017-ad669e8460a8", "_rev": "2-85c23f6efe6ce684a24b5bd15cd4ee21", "type": "region", "code": "429006", "name": "天门市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "78f2b785-6823-4676-8017-ad669e8460a8"], "path_name": ["中国", "湖北省", "天门市"], "status": "active", "sort": 2336, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "a0dbe79e-10de-489c-8e33-64439b3f5704", "_rev": "2-ed663b072771ab51da7d16f643689db8", "type": "region", "code": "460204", "name": "天涯区", "parent_id": "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "a0dbe79e-10de-489c-8e33-64439b3f5704"], "path_name": ["中国", "海南省", "三亚市", "天涯区"], "status": "active", "sort": 2343, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "d5bb9664-480a-4e8a-a466-73e6b1c94c1e", "_rev": "2-8b2ae34100d5bfa45d06f8c7e83d821f", "type": "region", "code": "632823", "name": "天峻县", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "d5bb9664-480a-4e8a-a466-73e6b1c94c1e"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "天峻县"], "status": "active", "sort": 2335, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "e5ed22eb-377b-4b15-8af1-0e8e42414131", "_rev": "2-393de5dcefd0a3dc46d4ef43786926ec", "type": "region", "code": "370105", "name": "天桥区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "e5ed22eb-377b-4b15-8af1-0e8e42414131"], "path_name": ["中国", "山东省", "济南市", "天桥区"], "status": "active", "sort": 2338, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:08"} +{"_id": "190b2e02-6e5b-4b85-b7da-41977bd3bc8a", "_rev": "2-9e478b7cda765844e37407edff408eec", "type": "region", "code": "522627", "name": "天柱县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "190b2e02-6e5b-4b85-b7da-41977bd3bc8a"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "天柱县"], "status": "active", "sort": 2347, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "2e2eeb80-5642-4424-aaf0-62df515f5ba4", "_rev": "2-2afc67e556851a76968416d5818c6639", "type": "region", "code": "620623", "name": "天祝藏族自治县", "parent_id": "8adb19ec-7d97-4233-8709-19769b980943", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "8adb19ec-7d97-4233-8709-19769b980943", "2e2eeb80-5642-4424-aaf0-62df515f5ba4"], "path_name": ["中国", "甘肃省", "武威市", "天祝藏族自治县"], "status": "active", "sort": 2348, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "35798086-ef08-4373-a26b-27f3811d006b", "_rev": "2-e2485a16b7547ca9a631451398cfe7b2", "type": "region", "code": "451022", "name": "田东县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "35798086-ef08-4373-a26b-27f3811d006b"], "path_name": ["中国", "广西壮族自治区", "百色市", "田东县"], "status": "active", "sort": 2349, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "a1b2e8e5-b978-42c4-802e-7abb5f52b5bf", "_rev": "2-8116032834c4bd2b45f6f564830e1e1f", "type": "region", "code": "430211", "name": "天元区", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "a1b2e8e5-b978-42c4-802e-7abb5f52b5bf"], "path_name": ["中国", "湖南省", "株洲市", "天元区"], "status": "active", "sort": 2344, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "adc1a93b-a5b4-4b62-9a31-61a9cc3f7781", "_rev": "2-160e8ff06ae313d1e9e239e0ac7e3061", "type": "region", "code": "341181", "name": "天长市", "parent_id": "b87153df-cf03-45bd-a33b-2043f9e916c6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b87153df-cf03-45bd-a33b-2043f9e916c6", "adc1a93b-a5b4-4b62-9a31-61a9cc3f7781"], "path_name": ["中国", "安徽省", "滁州市", "天长市"], "status": "active", "sort": 2345, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "b22b0e83-a678-4825-bb14-d4c388960a2a", "_rev": "2-48ee9afc4ddcd2cc9b0e12f62535b77e", "type": "region", "code": "451029", "name": "田林县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "b22b0e83-a678-4825-bb14-d4c388960a2a"], "path_name": ["中国", "广西壮族自治区", "百色市", "田林县"], "status": "active", "sort": 2351, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "c58b683b-74c8-454a-a7e4-6c92a6a51d6e", "_rev": "2-15b9b08d2f7ee17229ffb0bb274fdc85", "type": "region", "code": "451003", "name": "田阳区", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "c58b683b-74c8-454a-a7e4-6c92a6a51d6e"], "path_name": ["中国", "广西壮族自治区", "百色市", "田阳区"], "status": "active", "sort": 2352, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "d9f26c4d-68a1-4510-a5b1-3714a700e20c", "_rev": "2-36160423c54c70b51f42dc9565580317", "type": "region", "code": "140222", "name": "天镇县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "d9f26c4d-68a1-4510-a5b1-3714a700e20c"], "path_name": ["中国", "山西省", "大同市", "天镇县"], "status": "active", "sort": 2346, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "eb904c2d-afa8-438c-8e45-eb230f6386db", "_rev": "2-1842856fdea1f6c394066a5c4dad6372", "type": "region", "code": "340403", "name": "田家庵区", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "eb904c2d-afa8-438c-8e45-eb230f6386db"], "path_name": ["中国", "安徽省", "淮南市", "田家庵区"], "status": "active", "sort": 2350, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:09"} +{"_id": "1260ee34-b5d1-4382-87cc-fea062eddc38", "_rev": "2-7dfa7153e118224683e5e04597f6718e", "type": "region", "code": "230204", "name": "铁锋区", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "1260ee34-b5d1-4382-87cc-fea062eddc38"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "铁锋区"], "status": "active", "sort": 2353, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "17940237-ea49-4ac5-af09-b205ae64e604", "_rev": "2-674766c685a02344ba0e54d2ff8fe0f8", "type": "region", "code": "421222", "name": "通城县", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "17940237-ea49-4ac5-af09-b205ae64e604"], "path_name": ["中国", "湖北省", "咸宁市", "通城县"], "status": "active", "sort": 2360, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "1ef35400-36e1-43f8-ae5b-140027e842fc", "_rev": "2-770a4a45d02bd00a0256de1f317a342e", "type": "region", "code": "211221", "name": "铁岭县", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "1ef35400-36e1-43f8-ae5b-140027e842fc"], "path_name": ["中国", "辽宁省", "铁岭市", "铁岭县"], "status": "active", "sort": 2355, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "307dcf17-dd01-480a-a47b-314bfdd2ba44", "_rev": "2-dacca37e8bdb29877e204934f1f4caee", "type": "region", "code": "420205", "name": "铁山区", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "307dcf17-dd01-480a-a47b-314bfdd2ba44"], "path_name": ["中国", "湖北省", "黄石市", "铁山区"], "status": "active", "sort": 2358, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "314cd99b-cbc4-450b-8e2b-968860e9f9bc", "_rev": "2-cd5c9003e431f0c5d0b98f25c7fb7ba0", "type": "region", "code": "450512", "name": "铁山港区", "parent_id": "365589cb-9802-4c16-a2c9-01214670c990", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "365589cb-9802-4c16-a2c9-01214670c990", "314cd99b-cbc4-450b-8e2b-968860e9f9bc"], "path_name": ["中国", "广西壮族自治区", "北海市", "铁山港区"], "status": "active", "sort": 2357, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "9613d32e-a830-4338-af08-84156b939139", "_rev": "2-633c620c0216a5a543ddf5a0e0d45551", "type": "region", "code": "511702", "name": "通川区", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "9613d32e-a830-4338-af08-84156b939139"], "path_name": ["中国", "四川省", "达州市", "通川区"], "status": "active", "sort": 2361, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "c25c182d-5521-4987-9e09-b40bd3b40b53", "_rev": "2-5f3c977fed2c9f0ae15fe2228fe2acf6", "type": "region", "code": "659006", "name": "铁门关市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c25c182d-5521-4987-9e09-b40bd3b40b53"], "path_name": ["中国", "新疆维吾尔自治区", "铁门关市"], "status": "active", "sort": 2356, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "cdbf0fbe-5dd9-4fec-b0e6-8dfd0673ea00", "_rev": "2-9268822daf9a3a4bf5e55b9afc2e7fe7", "type": "region", "code": "230781", "name": "铁力市", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "cdbf0fbe-5dd9-4fec-b0e6-8dfd0673ea00"], "path_name": ["中国", "黑龙江省", "伊春市", "铁力市"], "status": "active", "sort": 2354, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "d6aa2901-402c-4481-a588-0c731cbde9fa", "_rev": "2-e15510c5a946c24cc06296e3d83c9964", "type": "region", "code": "320902", "name": "亭湖区", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "d6aa2901-402c-4481-a588-0c731cbde9fa"], "path_name": ["中国", "江苏省", "盐城市", "亭湖区"], "status": "active", "sort": 2359, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:10"} +{"_id": "02fccb42-8216-4c62-b53b-8325d2669bc6", "_rev": "2-798c7b385b8ebda26edcd650e8e3b8b5", "type": "region", "code": "421224", "name": "通山县", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "02fccb42-8216-4c62-b53b-8325d2669bc6"], "path_name": ["中国", "湖北省", "咸宁市", "通山县"], "status": "active", "sort": 2367, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "0b690146-a8e6-410d-be26-28e83dc524be", "_rev": "2-76d4bbdabeda8c192b35ba01432dcab2", "type": "region", "code": "230128", "name": "通河县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "0b690146-a8e6-410d-be26-28e83dc524be"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "通河县"], "status": "active", "sort": 2364, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "272d1ba7-098d-43a9-97b2-2f759c00dd0c", "_rev": "2-c818aee77076431bc1d12d2516960876", "type": "region", "code": "220521", "name": "通化县", "parent_id": "713e9697-05ef-4505-b145-c7f66b1dea31", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "713e9697-05ef-4505-b145-c7f66b1dea31", "272d1ba7-098d-43a9-97b2-2f759c00dd0c"], "path_name": ["中国", "吉林省", "通化市", "通化县"], "status": "active", "sort": 2365, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "2c81a5f0-dbe2-4303-87a9-489946e04acf", "_rev": "2-dee5fb7199b6a150bcc9f2d2f085ec00", "type": "region", "code": "621121", "name": "通渭县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "2c81a5f0-dbe2-4303-87a9-489946e04acf"], "path_name": ["中国", "甘肃省", "定西市", "通渭县"], "status": "active", "sort": 2368, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "59534288-098f-4a0d-bc15-f8ec16f3480b", "_rev": "2-eb90acada4d52dc7e3156176651e8273", "type": "region", "code": "431230", "name": "通道侗族自治县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "59534288-098f-4a0d-bc15-f8ec16f3480b"], "path_name": ["中国", "湖南省", "怀化市", "通道侗族自治县"], "status": "active", "sort": 2362, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "5cbc1253-7af3-4ba3-a521-2c76c3b9d52c", "_rev": "2-7e2235b786a93db92626754d03eea212", "type": "region", "code": "220822", "name": "通榆县", "parent_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "5cbc1253-7af3-4ba3-a521-2c76c3b9d52c"], "path_name": ["中国", "吉林省", "白城市", "通榆县"], "status": "active", "sort": 2370, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "606d66cb-2560-4847-a184-92be3cd020e3", "_rev": "2-c1e25e5f47985c7cbaf0703af4f31cbe", "type": "region", "code": "530423", "name": "通海县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "606d66cb-2560-4847-a184-92be3cd020e3"], "path_name": ["中国", "云南省", "玉溪市", "通海县"], "status": "active", "sort": 2363, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "96b22e2a-2e1d-492c-8711-c1bab289de1d", "_rev": "2-6ded864964475c0d8fa156a79752d2a8", "type": "region", "code": "410222", "name": "通许县", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "96b22e2a-2e1d-492c-8711-c1bab289de1d"], "path_name": ["中国", "河南省", "开封市", "通许县"], "status": "active", "sort": 2369, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "ff7e2d07-939b-4058-a348-de9da0636eab", "_rev": "2-3a235fd500caf3664d71d95f52fcbcb2", "type": "region", "code": "511921", "name": "通江县", "parent_id": "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "a6af389a-fcc4-4c6e-bcfe-ba676d85b40e", "ff7e2d07-939b-4058-a348-de9da0636eab"], "path_name": ["中国", "四川省", "巴中市", "通江县"], "status": "active", "sort": 2366, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:11"} +{"_id": "4cb260dc-dc2a-4d26-bccc-f25cd1fec9ae", "_rev": "2-b7711f501bc13027d882dcf9ba9e44f8", "type": "region", "code": "330122", "name": "桐庐县", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "4cb260dc-dc2a-4d26-bccc-f25cd1fec9ae"], "path_name": ["中国", "浙江省", "杭州市", "桐庐县"], "status": "active", "sort": 2378, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "5c0308c0-fd5f-4901-9d84-2a21c16461b3", "_rev": "2-ebdd14b60229a2b2ca2f64c2be2ca2cf", "type": "region", "code": "340881", "name": "桐城市", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "5c0308c0-fd5f-4901-9d84-2a21c16461b3"], "path_name": ["中国", "安徽省", "安庆市", "桐城市"], "status": "active", "sort": 2377, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "6bf3eb64-8e00-43fd-8b3c-9c8b839a6108", "_rev": "2-6f86c280e96272db93910f9cee07561e", "type": "region", "code": "632301", "name": "同仁市", "parent_id": "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "6bf3eb64-8e00-43fd-8b3c-9c8b839a6108"], "path_name": ["中国", "青海省", "黄南藏族自治州", "同仁市"], "status": "active", "sort": 2374, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "8458c793-1577-4f28-9723-d04a70e623a4", "_rev": "2-f81cfdbd1ef51675d46600d32092d8ac", "type": "region", "code": "640324", "name": "同心县", "parent_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858", "8458c793-1577-4f28-9723-d04a70e623a4"], "path_name": ["中国", "宁夏回族自治区", "吴忠市", "同心县"], "status": "active", "sort": 2375, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "86c46c08-5392-4e2b-bf49-c65061876ed7", "_rev": "2-7065cb4465e942ca01efb030a8eab86b", "type": "region", "code": "411330", "name": "桐柏县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "86c46c08-5392-4e2b-bf49-c65061876ed7"], "path_name": ["中国", "河南省", "南阳市", "桐柏县"], "status": "active", "sort": 2376, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "aa839286-5127-45be-a4e0-7172324c278a", "_rev": "2-dcfeb919f0f36d77992fb7a8cb921537", "type": "region", "code": "350212", "name": "同安区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "aa839286-5127-45be-a4e0-7172324c278a"], "path_name": ["中国", "福建省", "厦门市", "同安区"], "status": "active", "sort": 2371, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "c54ee1bf-bdea-4d08-9a67-db37d3eb2652", "_rev": "2-5ab070c9085ac1582eb0395c425d1b8f", "type": "region", "code": "230881", "name": "同江市", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "c54ee1bf-bdea-4d08-9a67-db37d3eb2652"], "path_name": ["中国", "黑龙江省", "佳木斯市", "同江市"], "status": "active", "sort": 2373, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "dc5321bc-215a-4a60-94b7-deadbfebc335", "_rev": "2-6d7f16cc104b3bc8d6b858f4d0ca1ad6", "type": "region", "code": "632522", "name": "同德县", "parent_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd", "dc5321bc-215a-4a60-94b7-deadbfebc335"], "path_name": ["中国", "青海省", "海南藏族自治州", "同德县"], "status": "active", "sort": 2372, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:12"} +{"_id": "241cdd2c-5220-4d88-8f2f-af17fdc402e7", "_rev": "2-d1c7559256dbce9762513026f1be3af0", "type": "region", "code": "330483", "name": "桐乡市", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "241cdd2c-5220-4d88-8f2f-af17fdc402e7"], "path_name": ["中国", "浙江省", "嘉兴市", "桐乡市"], "status": "active", "sort": 2379, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "277cf221-8942-4e64-b01c-6ba26e26a77f", "_rev": "2-43a4f3b48ec6adc5a8cfd2b2b06bea20", "type": "region", "code": "610522", "name": "潼关县", "parent_id": "f41720d0-c30e-4101-a492-4c61c13392fb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f41720d0-c30e-4101-a492-4c61c13392fb", "277cf221-8942-4e64-b01c-6ba26e26a77f"], "path_name": ["中国", "陕西省", "渭南市", "潼关县"], "status": "active", "sort": 2385, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "6ba15dcb-2140-439b-9e6d-ddcd140577af", "_rev": "2-dc8e03792df1d5ca4eceacb69ab77c50", "type": "region", "code": "340705", "name": "铜官区", "parent_id": "71264234-0fc8-42ac-8ede-c65d1f42516f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "71264234-0fc8-42ac-8ede-c65d1f42516f", "6ba15dcb-2140-439b-9e6d-ddcd140577af"], "path_name": ["中国", "安徽省", "铜陵市", "铜官区"], "status": "active", "sort": 2382, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "a858f7e7-380e-48a3-a165-189e34bc6718", "_rev": "2-5137d3d64a7067974f09292f14bc2425", "type": "region", "code": "650106", "name": "头屯河区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "a858f7e7-380e-48a3-a165-189e34bc6718"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "头屯河区"], "status": "active", "sort": 2387, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "b02e9ef5-1610-474d-863b-11941f322d7e", "_rev": "2-cf1e1cd39de5f1688de20997c379500f", "type": "region", "code": "320312", "name": "铜山区", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "b02e9ef5-1610-474d-863b-11941f322d7e"], "path_name": ["中国", "江苏省", "徐州市", "铜山区"], "status": "active", "sort": 2384, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "b2f24466-d8e1-424e-a8e9-e8fd8578b351", "_rev": "2-e966ab40a11a0ca8f746ddcbb59b866f", "type": "region", "code": "500152", "name": "潼南区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "b2f24466-d8e1-424e-a8e9-e8fd8578b351"], "path_name": ["中国", "重庆市", "潼南区"], "status": "active", "sort": 2386, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "bdfc19ca-d8e5-4d0c-8017-6e5911b914d0", "_rev": "2-5248f5fad6dc57d217e2f89247572843", "type": "region", "code": "520322", "name": "桐梓县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "bdfc19ca-d8e5-4d0c-8017-6e5911b914d0"], "path_name": ["中国", "贵州省", "遵义市", "桐梓县"], "status": "active", "sort": 2380, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "defe6fd8-95c9-4b0a-a13a-c6999137d426", "_rev": "2-e8682954fb4991e93e67baee90698ea3", "type": "region", "code": "360926", "name": "铜鼓县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "defe6fd8-95c9-4b0a-a13a-c6999137d426"], "path_name": ["中国", "江西省", "宜春市", "铜鼓县"], "status": "active", "sort": 2381, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "e8852308-9498-4528-a688-f6b089654017", "_rev": "2-8f955908d84413f91f5eb4d6d82a9323", "type": "region", "code": "500151", "name": "铜梁区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e8852308-9498-4528-a688-f6b089654017"], "path_name": ["中国", "重庆市", "铜梁区"], "status": "active", "sort": 2383, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:13"} +{"_id": "1fc82327-ad81-4a0b-b466-3986edee45d4", "_rev": "2-7ccb43b0aa18959dc1131847f293530e", "type": "region", "code": "150221", "name": "土默特右旗", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "1fc82327-ad81-4a0b-b466-3986edee45d4"], "path_name": ["中国", "内蒙古自治区", "包头市", "土默特右旗"], "status": "active", "sort": 2391, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "772d5022-5489-4892-8faf-8b7d3a962958", "_rev": "2-9db56db507cdb6204faaf2d29403f17b", "type": "region", "code": "469022", "name": "屯昌县", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "772d5022-5489-4892-8faf-8b7d3a962958"], "path_name": ["中国", "海南省", "屯昌县"], "status": "active", "sort": 2394, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "87e1e554-74b8-4e02-87e6-21102d50adcb", "_rev": "2-b7be8638cec4391e1771b823c822d911", "type": "region", "code": "659003", "name": "图木舒克市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "87e1e554-74b8-4e02-87e6-21102d50adcb"], "path_name": ["中国", "新疆维吾尔自治区", "图木舒克市"], "status": "active", "sort": 2390, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "9d32fb9d-5c5b-46ef-8256-6f11f88c8464", "_rev": "2-859f3d6e8ff483e13c5295b6ce5da44c", "type": "region", "code": "152224", "name": "突泉县", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "9d32fb9d-5c5b-46ef-8256-6f11f88c8464"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "突泉县"], "status": "active", "sort": 2388, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "a5b8fe8c-73a4-47f8-9b05-231c4b3be10c", "_rev": "2-e368d252ad2cccb7208016fab4656f6c", "type": "region", "code": "421121", "name": "团风县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "a5b8fe8c-73a4-47f8-9b05-231c4b3be10c"], "path_name": ["中国", "湖北省", "黄冈市", "团风县"], "status": "active", "sort": 2393, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "f10c4741-07d6-4968-8ece-9126738df86f", "_rev": "2-9d17d0634a75f63cc06ca04e86cb1840", "type": "region", "code": "150121", "name": "土默特左旗", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "f10c4741-07d6-4968-8ece-9126738df86f"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "土默特左旗"], "status": "active", "sort": 2392, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "f9b96eb0-8a99-4ae1-a611-8949462139a9", "_rev": "2-5853957a32c9b2fe1363a54f6690c8f3", "type": "region", "code": "222402", "name": "图们市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "f9b96eb0-8a99-4ae1-a611-8949462139a9"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "图们市"], "status": "active", "sort": 2389, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:14"} +{"_id": "3173753a-9273-4c37-b2d5-77f99a88bb62", "_rev": "2-d29bcce488616bc1c4f72e4d5eb67021", "type": "region", "code": "140109", "name": "万柏林区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "3173753a-9273-4c37-b2d5-77f99a88bb62"], "path_name": ["中国", "山西省", "太原市", "万柏林区"], "status": "active", "sort": 2403, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "549b76e4-e0f4-40af-9014-a78d95b32bbe", "_rev": "2-667492415b9a656ebeae98b96a71475c", "type": "region", "code": "360828", "name": "万安县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "549b76e4-e0f4-40af-9014-a78d95b32bbe"], "path_name": ["中国", "江西省", "吉安市", "万安县"], "status": "active", "sort": 2402, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "8e008a04-270f-48ee-9e0f-abdfd6a5b6d3", "_rev": "2-bcd631ff72029eb8bd4bff96b364483b", "type": "region", "code": "210281", "name": "瓦房店市", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "8e008a04-270f-48ee-9e0f-abdfd6a5b6d3"], "path_name": ["中国", "辽宁省", "大连市", "瓦房店市"], "status": "active", "sort": 2400, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "8fff7163-75bd-4cfc-bec0-ce9e3b00e531", "_rev": "2-f62e2a7dbc1b87ba5f59fecfad9ae6c5", "type": "region", "code": "150122", "name": "托克托县", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "8fff7163-75bd-4cfc-bec0-ce9e3b00e531"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "托克托县"], "status": "active", "sort": 2397, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "969e37de-eb09-46a6-9ca9-72f6f4414d40", "_rev": "2-f073b019bcd188edc39498e883f7d611", "type": "region", "code": "341002", "name": "屯溪区", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "969e37de-eb09-46a6-9ca9-72f6f4414d40"], "path_name": ["中国", "安徽省", "黄山市", "屯溪区"], "status": "active", "sort": 2396, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "bc7ea0eb-3fad-4e82-b02b-fa862b352080", "_rev": "2-abb3d003f44b02efc9d1b350267f75d3", "type": "region", "code": "140405", "name": "屯留区", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "bc7ea0eb-3fad-4e82-b02b-fa862b352080"], "path_name": ["中国", "山西省", "长治市", "屯留区"], "status": "active", "sort": 2395, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "ce900d2a-e872-42b5-8bbd-c6d2341c1048", "_rev": "2-fd97da2c42367d06dcbca135b4ede3d0", "type": "region", "code": "650422", "name": "托克逊县", "parent_id": "b55ac900-77d7-4ee6-b754-c22960a6801d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "b55ac900-77d7-4ee6-b754-c22960a6801d", "ce900d2a-e872-42b5-8bbd-c6d2341c1048"], "path_name": ["中国", "新疆维吾尔自治区", "吐鲁番市", "托克逊县"], "status": "active", "sort": 2398, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "ddfa4d27-327f-4d1e-a1e3-c49ecee13d46", "_rev": "2-4fa89b5f45f8edaccdf88ad86cb989cf", "type": "region", "code": "654224", "name": "托里县", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "ddfa4d27-327f-4d1e-a1e3-c49ecee13d46"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "托里县"], "status": "active", "sort": 2399, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "f4c2eb71-c806-4a33-af70-6f46cb4be3b4", "_rev": "2-3a4ccb965fbe80a621fe75881cb217d1", "type": "region", "code": "411302", "name": "宛城区", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "f4c2eb71-c806-4a33-af70-6f46cb4be3b4"], "path_name": ["中国", "河南省", "南阳市", "宛城区"], "status": "active", "sort": 2401, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:15"} +{"_id": "10ed4b0a-a274-4b04-a5e9-8f6e1e33637f", "_rev": "2-4fb9f458db945d3064be6df437afba0a", "type": "region", "code": "130708", "name": "万全区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "10ed4b0a-a274-4b04-a5e9-8f6e1e33637f"], "path_name": ["中国", "河北省", "张家口市", "万全区"], "status": "active", "sort": 2406, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "2e924e68-c513-40a3-8759-30d4af67ab5d", "_rev": "2-44716b459de9e4d2803b647b4af3c542", "type": "region", "code": "511781", "name": "万源市", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "2e924e68-c513-40a3-8759-30d4af67ab5d"], "path_name": ["中国", "四川省", "达州市", "万源市"], "status": "active", "sort": 2410, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "32bbe5de-7f30-4dce-bf24-f15adcdb470d", "_rev": "2-a692a92d363a45ae6076e952b02f0f09", "type": "region", "code": "520603", "name": "万山区", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "32bbe5de-7f30-4dce-bf24-f15adcdb470d"], "path_name": ["中国", "贵州省", "铜仁市", "万山区"], "status": "active", "sort": 2408, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "39735328-22ad-41a7-8681-3d9a10f84663", "_rev": "2-ec4fd33a5de2e486908cfa709ad71a2b", "type": "region", "code": "469006", "name": "万宁市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "39735328-22ad-41a7-8681-3d9a10f84663"], "path_name": ["中国", "海南省", "万宁市"], "status": "active", "sort": 2405, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "4d1d023d-e0ef-4197-848b-42ed9431a9df", "_rev": "2-792e99fb2b8bc57aef6081592fb319b8", "type": "region", "code": "140822", "name": "万荣县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "4d1d023d-e0ef-4197-848b-42ed9431a9df"], "path_name": ["中国", "山西省", "运城市", "万荣县"], "status": "active", "sort": 2407, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "d0bd32b7-3059-40b7-8001-1ac9aee1f461", "_rev": "2-4d89fcfb6e3842225c35eb0bbebd4d5b", "type": "region", "code": "360922", "name": "万载县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "d0bd32b7-3059-40b7-8001-1ac9aee1f461"], "path_name": ["中国", "江西省", "宜春市", "万载县"], "status": "active", "sort": 2411, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "ec73168b-d8dc-44ea-b9eb-a38d0769b0dc", "_rev": "2-4213d239b34adfc3a1c521c85ae1b56f", "type": "region", "code": "450403", "name": "万秀区", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "ec73168b-d8dc-44ea-b9eb-a38d0769b0dc"], "path_name": ["中国", "广西壮族自治区", "梧州市", "万秀区"], "status": "active", "sort": 2409, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "f8218514-2315-4202-aee4-e4de77c22af6", "_rev": "2-fa8fb903313eb5789614fdabf12f6cb8", "type": "region", "code": "361129", "name": "万年县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "f8218514-2315-4202-aee4-e4de77c22af6"], "path_name": ["中国", "江西省", "上饶市", "万年县"], "status": "active", "sort": 2404, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:16"} +{"_id": "47271d7b-6d0d-4b87-899e-749f29d47a9b", "_rev": "2-b927adc28d138c5052fcbfe4ceed42f4", "type": "region", "code": "210404", "name": "望花区", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "47271d7b-6d0d-4b87-899e-749f29d47a9b"], "path_name": ["中国", "辽宁省", "抚顺市", "望花区"], "status": "active", "sort": 2419, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "5561338f-43e7-4245-bcbd-95d89e524c29", "_rev": "2-e60bbde4fb8820a380cb58579dabc369", "type": "region", "code": "610202", "name": "王益区", "parent_id": "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "5561338f-43e7-4245-bcbd-95d89e524c29"], "path_name": ["中国", "陕西省", "铜川市", "王益区"], "status": "active", "sort": 2415, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "861ba203-7c33-401b-9005-94374bbf6b8b", "_rev": "2-aa392bc33ef359f3c139a253536425ae", "type": "region", "code": "430112", "name": "望城区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "861ba203-7c33-401b-9005-94374bbf6b8b"], "path_name": ["中国", "湖南省", "长沙市", "望城区"], "status": "active", "sort": 2417, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "8be65c78-3c1d-42a1-8cb5-741452e4e7c7", "_rev": "2-576081809a42318ad9a4f953a417b46b", "type": "region", "code": "500101", "name": "万州区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "8be65c78-3c1d-42a1-8cb5-741452e4e7c7"], "path_name": ["中国", "重庆市", "万州区"], "status": "active", "sort": 2412, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "99b88d57-3af4-4195-8bc8-00bbfd8145fb", "_rev": "2-f2506a6ab423e1e1543b48eb22d04651", "type": "region", "code": "510821", "name": "旺苍县", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "99b88d57-3af4-4195-8bc8-00bbfd8145fb"], "path_name": ["中国", "四川省", "广元市", "旺苍县"], "status": "active", "sort": 2416, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "a9899019-f581-41de-8658-91a233100b0a", "_rev": "2-af393d4e2432ff35c0ecac17de2948e0", "type": "region", "code": "130631", "name": "望都县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "a9899019-f581-41de-8658-91a233100b0a"], "path_name": ["中国", "河北省", "保定市", "望都县"], "status": "active", "sort": 2418, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "_rev": "2-b7834ed7fb513885478d6433f17ea185", "type": "region", "code": "610200", "name": "铜川市", "parent_id": "b61e52c4-093b-46a1-8517-f587b4e02800", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51"], "path_name": ["中国", "陕西省", "铜川市"], "status": "active", "sort": 2414, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "ee2d6767-4972-4ecd-ba65-3cb42f79d5b9", "_rev": "2-482045a75e3b60e5a28ecda7c616b18f", "type": "region", "code": "222424", "name": "汪清县", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "ee2d6767-4972-4ecd-ba65-3cb42f79d5b9"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "汪清县"], "status": "active", "sort": 2413, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:17"} +{"_id": "2ff5410d-392f-478c-8400-8854e4aa6853", "_rev": "2-48268983e65df10485a1087401e8c849", "type": "region", "code": "511024", "name": "威远县", "parent_id": "73916687-f3ab-40c0-823d-537abee71925", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925", "2ff5410d-392f-478c-8400-8854e4aa6853"], "path_name": ["中国", "四川省", "内江市", "威远县"], "status": "active", "sort": 2426, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "3e68ae54-bb85-4611-9685-30f56e8e9b80", "_rev": "2-498564ee91f6c51f3d1ed2715d47aa75", "type": "region", "code": "130533", "name": "威县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "3e68ae54-bb85-4611-9685-30f56e8e9b80"], "path_name": ["中国", "河北省", "邢台市", "威县"], "status": "active", "sort": 2424, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "3e993b42-e22e-4b5a-a58a-7d368eddcf5a", "_rev": "2-85eb7ffc58f2085a8561ebd5853867ee", "type": "region", "code": "340827", "name": "望江县", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "3e993b42-e22e-4b5a-a58a-7d368eddcf5a"], "path_name": ["中国", "安徽省", "安庆市", "望江县"], "status": "active", "sort": 2420, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "3eeab8b6-1ede-4f73-8f13-dc53c44e3957", "_rev": "2-aeeafc3643effe5fe1b7cf84f0ac0c15", "type": "region", "code": "520526", "name": "威宁彝族回族苗族自治县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "3eeab8b6-1ede-4f73-8f13-dc53c44e3957"], "path_name": ["中国", "贵州省", "毕节市", "威宁彝族回族苗族自治县"], "status": "active", "sort": 2423, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "70d5b673-0899-426c-8c4c-2cf2cefbee33", "_rev": "2-558ca3c530ee663ac0644fd22c33d51f", "type": "region", "code": "370826", "name": "微山县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "70d5b673-0899-426c-8c4c-2cf2cefbee33"], "path_name": ["中国", "山东省", "济宁市", "微山县"], "status": "active", "sort": 2427, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "7502434c-27da-4b2e-a9b1-464bb135bc57", "_rev": "2-9b85b1deb21076621658bfec6e5747bd", "type": "region", "code": "522326", "name": "望谟县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "7502434c-27da-4b2e-a9b1-464bb135bc57"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "望谟县"], "status": "active", "sort": 2422, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "802e15e8-6fca-4eea-a6a0-9656bc4b84f3", "_rev": "2-48862fc9a8bf89722b326cad6ddc99bf", "type": "region", "code": "530629", "name": "威信县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "802e15e8-6fca-4eea-a6a0-9656bc4b84f3"], "path_name": ["中国", "云南省", "昭通市", "威信县"], "status": "active", "sort": 2425, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "872e013f-6ee8-42a4-b71e-ca581a1f3049", "_rev": "2-8a9cd0e2ef0f6455194108c1b08efbba", "type": "region", "code": "231221", "name": "望奎县", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "872e013f-6ee8-42a4-b71e-ca581a1f3049"], "path_name": ["中国", "黑龙江省", "绥化市", "望奎县"], "status": "active", "sort": 2421, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:18"} +{"_id": "0d1e6562-b15c-4318-ac1c-224586081d4f", "_rev": "2-2578ef4d817024e1d3cb0c2aca2d8977", "type": "region", "code": "652823", "name": "尉犁县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "0d1e6562-b15c-4318-ac1c-224586081d4f"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "尉犁县"], "status": "active", "sort": 2436, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "613d2d87-04d1-4b79-a6aa-b20ff4297621", "_rev": "2-87afaf36e56996d1e33424cc17c29871", "type": "region", "code": "130828", "name": "围场满族蒙古族自治县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "613d2d87-04d1-4b79-a6aa-b20ff4297621"], "path_name": ["中国", "河北省", "承德市", "围场满族蒙古族自治县"], "status": "active", "sort": 2429, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "7c37800a-47a9-4e84-8078-c516d5c77c11", "_rev": "2-7636209e96a9ccc4cee8ad9cda9a956b", "type": "region", "code": "410703", "name": "卫滨区", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "7c37800a-47a9-4e84-8078-c516d5c77c11"], "path_name": ["中国", "河南省", "新乡市", "卫滨区"], "status": "active", "sort": 2432, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "7f7df5db-e7e6-4ba5-b8df-d0d620f07270", "_rev": "2-b0b69874bf0f5cd4abd8bea6740e0d91", "type": "region", "code": "610112", "name": "未央区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "7f7df5db-e7e6-4ba5-b8df-d0d620f07270"], "path_name": ["中国", "陕西省", "西安市", "未央区"], "status": "active", "sort": 2435, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "a7a66696-b283-4e8d-94b5-0472a6a83517", "_rev": "2-9f7c6375ec0d113768fd2976cdd168f7", "type": "region", "code": "370702", "name": "潍城区", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "a7a66696-b283-4e8d-94b5-0472a6a83517"], "path_name": ["中国", "山东省", "潍坊市", "潍城区"], "status": "active", "sort": 2431, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "b983e306-0b0a-47a8-a7dd-d973f5214856", "_rev": "2-1ec98af23bb1bd215b8287a99dc38638", "type": "region", "code": "410403", "name": "卫东区", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "b983e306-0b0a-47a8-a7dd-d973f5214856"], "path_name": ["中国", "河南省", "平顶山市", "卫东区"], "status": "active", "sort": 2433, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "daa9bd9d-115a-408a-a75e-cc8cd06d3c02", "_rev": "2-095fdccf74564ddeb4acff105fdc82a4", "type": "region", "code": "410781", "name": "卫辉市", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "daa9bd9d-115a-408a-a75e-cc8cd06d3c02"], "path_name": ["中国", "河南省", "新乡市", "卫辉市"], "status": "active", "sort": 2434, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "e634c023-a031-4ad2-b2b4-2be2acb475b3", "_rev": "2-660757548a0b35ac7b6afaeeb116b5b8", "type": "region", "code": "533423", "name": "维西傈僳族自治县", "parent_id": "22541e1f-4305-4e26-ab12-d13e07bca1be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "22541e1f-4305-4e26-ab12-d13e07bca1be", "e634c023-a031-4ad2-b2b4-2be2acb475b3"], "path_name": ["中国", "云南省", "迪庆藏族自治州", "维西傈僳族自治县"], "status": "active", "sort": 2430, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "f11767d0-7629-4e41-8cd6-b5f9376e86fb", "_rev": "2-2c99b411deb5632463c6cbec7566042d", "type": "region", "code": "532927", "name": "巍山彝族回族自治县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "f11767d0-7629-4e41-8cd6-b5f9376e86fb"], "path_name": ["中国", "云南省", "大理白族自治州", "巍山彝族回族自治县"], "status": "active", "sort": 2428, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:19"} +{"_id": "34e3c6ef-9a56-4b08-a620-7f1a314239aa", "_rev": "2-9780b4e47ac0b569502462ed3cb22786", "type": "region", "code": "410223", "name": "尉氏县", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "34e3c6ef-9a56-4b08-a620-7f1a314239aa"], "path_name": ["中国", "河南省", "开封市", "尉氏县"], "status": "active", "sort": 2437, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "4ee20d09-0105-40f5-a5e3-65b82f5c5b39", "_rev": "2-a3ef45c1e0fc13ef5633a0850451118c", "type": "region", "code": "510115", "name": "温江区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "4ee20d09-0105-40f5-a5e3-65b82f5c5b39"], "path_name": ["中国", "四川省", "成都市", "温江区"], "status": "active", "sort": 2444, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "63d03f11-a483-4f34-8850-35713976af66", "_rev": "2-b0efba4058f97aa9ade0dec2036b7927", "type": "region", "code": "130726", "name": "蔚县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "63d03f11-a483-4f34-8850-35713976af66"], "path_name": ["中国", "河北省", "张家口市", "蔚县"], "status": "active", "sort": 2441, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "6d7bdc6d-419f-4f02-9e8d-7008a31caec8", "_rev": "2-dee11d0894b5acd8e90874820d4ccbae", "type": "region", "code": "621123", "name": "渭源县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "6d7bdc6d-419f-4f02-9e8d-7008a31caec8"], "path_name": ["中国", "甘肃省", "定西市", "渭源县"], "status": "active", "sort": 2440, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "6dbcb93e-abef-49a9-b059-6e2c41be450d", "_rev": "2-d234f83091867fc729647ccff1eda48e", "type": "region", "code": "610302", "name": "渭滨区", "parent_id": "91209b19-f992-4655-b960-123b12149c80", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "91209b19-f992-4655-b960-123b12149c80", "6dbcb93e-abef-49a9-b059-6e2c41be450d"], "path_name": ["中国", "陕西省", "宝鸡市", "渭滨区"], "status": "active", "sort": 2438, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "87505d9b-0ef1-4f0e-b16c-68d02e17e8fc", "_rev": "2-6f1c5139e09b58a775fdbede36154c19", "type": "region", "code": "610404", "name": "渭城区", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "87505d9b-0ef1-4f0e-b16c-68d02e17e8fc"], "path_name": ["中国", "陕西省", "咸阳市", "渭城区"], "status": "active", "sort": 2439, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "8a69439a-de8c-46d2-93a4-5b308483461c", "_rev": "2-82b11a9d1c2ce41d8c50dd6501909a04", "type": "region", "code": "411002", "name": "魏都区", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "8a69439a-de8c-46d2-93a4-5b308483461c"], "path_name": ["中国", "河南省", "许昌市", "魏都区"], "status": "active", "sort": 2442, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "99ef5e14-22e8-4555-b2ef-d2a4e69868ce", "_rev": "2-ca186e3c27280e232f4c56d4e2ea2a3b", "type": "region", "code": "130434", "name": "魏县", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "99ef5e14-22e8-4555-b2ef-d2a4e69868ce"], "path_name": ["中国", "河北省", "邯郸市", "魏县"], "status": "active", "sort": 2443, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:20"} +{"_id": "1be6197b-8996-46f3-9440-01dde6509098", "_rev": "2-b2f84fbf18dd2cd4a792a95dd37fcab7", "type": "region", "code": "131026", "name": "文安县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "1be6197b-8996-46f3-9440-01dde6509098"], "path_name": ["中国", "河北省", "廊坊市", "文安县"], "status": "active", "sort": 2449, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "2ea34fe7-52be-4f1b-900a-e782124edf29", "_rev": "2-995bb2998928b83e7b1f6493a253a37c", "type": "region", "code": "652922", "name": "温宿县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "2ea34fe7-52be-4f1b-900a-e782124edf29"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "温宿县"], "status": "active", "sort": 2447, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "3ce021d9-1dbb-4c5f-869f-7f6adc1a2973", "_rev": "2-f56af23fd3a2a566521358f7030f2d92", "type": "region", "code": "330328", "name": "文成县", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "3ce021d9-1dbb-4c5f-869f-7f6adc1a2973"], "path_name": ["中国", "浙江省", "温州市", "文成县"], "status": "active", "sort": 2451, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "474fc5c6-99e2-4499-849f-a730298bcd9c", "_rev": "2-1302c8444efd875dc511f65f437097ce", "type": "region", "code": "652723", "name": "温泉县", "parent_id": "e64d86ab-5882-486d-9aff-e40ebc901640", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "e64d86ab-5882-486d-9aff-e40ebc901640", "474fc5c6-99e2-4499-849f-a730298bcd9c"], "path_name": ["中国", "新疆维吾尔自治区", "博尔塔拉蒙古自治州", "温泉县"], "status": "active", "sort": 2446, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "b96b5b34-b967-4876-9b9b-ea97ee28bb71", "_rev": "2-293b63661508f25343f4e76a0d31ea3b", "type": "region", "code": "410502", "name": "文峰区", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "b96b5b34-b967-4876-9b9b-ea97ee28bb71"], "path_name": ["中国", "河南省", "安阳市", "文峰区"], "status": "active", "sort": 2453, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "c1ea2ee3-b402-4921-a93f-21a10afc474f", "_rev": "2-2237137b659672dc945dbd4cb38ad3fa", "type": "region", "code": "469005", "name": "文昌市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "c1ea2ee3-b402-4921-a93f-21a10afc474f"], "path_name": ["中国", "海南省", "文昌市"], "status": "active", "sort": 2450, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "c5b8106f-079e-4682-9d7d-85f62e41ad0a", "_rev": "2-ac67590788d2af8c887b6d88e0095a25", "type": "region", "code": "410825", "name": "温县", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "c5b8106f-079e-4682-9d7d-85f62e41ad0a"], "path_name": ["中国", "河南省", "焦作市", "温县"], "status": "active", "sort": 2448, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "e3a5dfcd-e884-435d-8df5-5d846388e2fe", "_rev": "2-f9afceb2109aefd3d31228a1c058ae63", "type": "region", "code": "331081", "name": "温岭市", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "e3a5dfcd-e884-435d-8df5-5d846388e2fe"], "path_name": ["中国", "浙江省", "台州市", "温岭市"], "status": "active", "sort": 2445, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "f3b2006d-9d62-4f40-b537-26df24deef34", "_rev": "2-c1c5d0951308873749f703352cbd3580", "type": "region", "code": "371003", "name": "文登区", "parent_id": "d9d54a2d-e477-45c2-ad57-dde7563e520a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "d9d54a2d-e477-45c2-ad57-dde7563e520a", "f3b2006d-9d62-4f40-b537-26df24deef34"], "path_name": ["中国", "山东省", "威海市", "文登区"], "status": "active", "sort": 2452, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:21"} +{"_id": "1bb5cd7a-0f1d-4986-916d-68a0d21c6749", "_rev": "2-4ac3014edb8f89c1e7452c71113b9a14", "type": "region", "code": "621222", "name": "文县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "1bb5cd7a-0f1d-4986-916d-68a0d21c6749"], "path_name": ["中国", "甘肃省", "陇南市", "文县"], "status": "active", "sort": 2457, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "26d83c05-ffe4-4f59-aaf0-cde60376669b", "_rev": "2-9151febe4e9b08887833e0b0fdfd03a2", "type": "region", "code": "141121", "name": "文水县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "26d83c05-ffe4-4f59-aaf0-cde60376669b"], "path_name": ["中国", "山西省", "吕梁市", "文水县"], "status": "active", "sort": 2456, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "38943c66-6a87-4733-9898-cb38573e04d4", "_rev": "2-2cf766f4725e19980a0035b6c93553e2", "type": "region", "code": "140823", "name": "闻喜县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "38943c66-6a87-4733-9898-cb38573e04d4"], "path_name": ["中国", "山西省", "运城市", "闻喜县"], "status": "active", "sort": 2458, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "5a29fe00-f5e8-47e5-a75a-56bae82dd314", "_rev": "2-0f5fe5a3cce9df333f9e12013c54f4f2", "type": "region", "code": "150426", "name": "翁牛特旗", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "5a29fe00-f5e8-47e5-a75a-56bae82dd314"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "翁牛特旗"], "status": "active", "sort": 2461, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "72d866a9-691c-478e-9304-9fe559236f8a", "_rev": "2-299c493b8aa7e4e0df058a9877172217", "type": "region", "code": "370830", "name": "汶上县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "72d866a9-691c-478e-9304-9fe559236f8a"], "path_name": ["中国", "山东省", "济宁市", "汶上县"], "status": "active", "sort": 2460, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "8a1eac8d-c7f3-4646-a7ed-66df9b1b55a9", "_rev": "2-8db2d76bb390a82a62f3f92ee853b998", "type": "region", "code": "211003", "name": "文圣区", "parent_id": "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "eff63158-d3af-4cdc-82a5-4a1f5403f0d1", "8a1eac8d-c7f3-4646-a7ed-66df9b1b55a9"], "path_name": ["中国", "辽宁省", "辽阳市", "文圣区"], "status": "active", "sort": 2455, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "c7189e30-f5e4-4815-82ea-00c91b021d01", "_rev": "2-8f60410eb3894653f898e80d4c9413ca", "type": "region", "code": "532601", "name": "文山市", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "c7189e30-f5e4-4815-82ea-00c91b021d01"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "文山市"], "status": "active", "sort": 2454, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "c760c667-d921-4c47-91b5-6afbe6038d7c", "_rev": "2-d9c32d2f88e0539b8b7e94f7407be969", "type": "region", "code": "513221", "name": "汶川县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "c760c667-d921-4c47-91b5-6afbe6038d7c"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "汶川县"], "status": "active", "sort": 2459, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:22"} +{"_id": "162e8c1f-c456-46e9-9560-bd708ecff9d9", "_rev": "2-8d10ba7b45d231f93c53f8b127d6a337", "type": "region", "code": "150825", "name": "乌拉特后旗", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "162e8c1f-c456-46e9-9560-bd708ecff9d9"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "乌拉特后旗"], "status": "active", "sort": 2469, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "1dbe0558-93d7-44fa-9c7b-c441fc1b461b", "_rev": "2-dd1c70854b15ae2416a03f24b6ceaa3f", "type": "region", "code": "341621", "name": "涡阳县", "parent_id": "32858a4f-58fe-4415-bbf3-22718a25b966", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "32858a4f-58fe-4415-bbf3-22718a25b966", "1dbe0558-93d7-44fa-9c7b-c441fc1b461b"], "path_name": ["中国", "安徽省", "亳州市", "涡阳县"], "status": "active", "sort": 2464, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "1eb6b16f-51f6-4d76-a4e5-c0cfbc7f20e4", "_rev": "2-f12c769bac1cfb5ced79c934848bae8d", "type": "region", "code": "411303", "name": "卧龙区", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "1eb6b16f-51f6-4d76-a4e5-c0cfbc7f20e4"], "path_name": ["中国", "河南省", "南阳市", "卧龙区"], "status": "active", "sort": 2465, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "2a90e5a7-dc8f-4592-b56e-a6751adda7e4", "_rev": "2-55d8023da94b35d534f6d5fc85f817ed", "type": "region", "code": "440229", "name": "翁源县", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "2a90e5a7-dc8f-4592-b56e-a6751adda7e4"], "path_name": ["中国", "广东省", "韶关市", "翁源县"], "status": "active", "sort": 2462, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "4f6de6cd-0ac8-414f-b4c5-af7110062041", "_rev": "2-70bd69bf076c89344428b639ac708d1f", "type": "region", "code": "650205", "name": "乌尔禾区", "parent_id": "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "8f02a71e-0194-4e83-877a-dab6b0d61bb1", "4f6de6cd-0ac8-414f-b4c5-af7110062041"], "path_name": ["中国", "新疆维吾尔自治区", "克拉玛依市", "乌尔禾区"], "status": "active", "sort": 2468, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "56ae4410-3821-4201-a0bf-68b57eaae2fd", "_rev": "2-e569d7db6e745d3acec3dd6d9d7925cd", "type": "region", "code": "522725", "name": "瓮安县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "56ae4410-3821-4201-a0bf-68b57eaae2fd"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "瓮安县"], "status": "active", "sort": 2463, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "98d206d3-614d-46c5-a5b7-e4250ed856a8", "_rev": "2-2636603113921704a57e1a4f24c645c6", "type": "region", "code": "520112", "name": "乌当区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "98d206d3-614d-46c5-a5b7-e4250ed856a8"], "path_name": ["中国", "贵州省", "贵阳市", "乌当区"], "status": "active", "sort": 2467, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "ad9f73f6-9c84-47b2-9bac-ed23c3ac3f6d", "_rev": "2-a25413f51a5f85adc136bfd0db7a0d1b", "type": "region", "code": "150304", "name": "乌达区", "parent_id": "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "8decc9aa-7bb7-496e-aa12-3b36d56355f3", "ad9f73f6-9c84-47b2-9bac-ed23c3ac3f6d"], "path_name": ["中国", "内蒙古自治区", "乌海市", "乌达区"], "status": "active", "sort": 2466, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:23"} +{"_id": "137ab35b-0bf5-41ac-99af-56242da77adf", "_rev": "2-cbab42ede0d7192abd4fe0732e415f2a", "type": "region", "code": "650121", "name": "乌鲁木齐县", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "137ab35b-0bf5-41ac-99af-56242da77adf"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "乌鲁木齐县"], "status": "active", "sort": 2474, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "189d5e20-e3cd-4002-8a4b-6645f8df045b", "_rev": "2-cb49fd0864acff7a70589e75063baf65", "type": "region", "code": "150823", "name": "乌拉特前旗", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "189d5e20-e3cd-4002-8a4b-6645f8df045b"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "乌拉特前旗"], "status": "active", "sort": 2470, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "3967bb39-23be-4aa6-a4d2-06c705f222fb", "_rev": "2-f28ab455911f30d8e19274a86dd44482", "type": "region", "code": "653024", "name": "乌恰县", "parent_id": "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5ecc38d3-9cb8-422d-abe0-6824d3c8ceff", "3967bb39-23be-4aa6-a4d2-06c705f222fb"], "path_name": ["中国", "新疆维吾尔自治区", "克孜勒苏柯尔克孜自治州", "乌恰县"], "status": "active", "sort": 2475, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "4cd8cb5b-d6c2-4d44-85ac-da0fa3a8132a", "_rev": "2-1a9458c0868e50fe88ad880e60275b53", "type": "region", "code": "632821", "name": "乌兰县", "parent_id": "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "56c9e4da-8ac1-4bb2-8f2f-920da15aaa55", "4cd8cb5b-d6c2-4d44-85ac-da0fa3a8132a"], "path_name": ["中国", "青海省", "海西蒙古族藏族自治州", "乌兰县"], "status": "active", "sort": 2473, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "70d6d059-2104-4252-986b-b1038151cbc9", "_rev": "2-68d26e88b3b4af8c7c06203deb756a89", "type": "region", "code": "652927", "name": "乌什县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "70d6d059-2104-4252-986b-b1038151cbc9"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "乌什县"], "status": "active", "sort": 2476, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "86a31536-12f4-4188-b24b-a9a8243eefd2", "_rev": "2-f266719bc6333a3eece649972c505994", "type": "region", "code": "150824", "name": "乌拉特中旗", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "86a31536-12f4-4188-b24b-a9a8243eefd2"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "乌拉特中旗"], "status": "active", "sort": 2471, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "a70a33ba-727c-4df3-9cb1-c1c26c97ac49", "_rev": "2-96057b13904ce21a1de2ce0e6261d304", "type": "region", "code": "152201", "name": "乌兰浩特市", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "a70a33ba-727c-4df3-9cb1-c1c26c97ac49"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "乌兰浩特市"], "status": "active", "sort": 2472, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "aba7a19c-9282-45b2-9cb8-5c328d3a0e2c", "_rev": "2-ddf9496ff99876f18904f1b19805eafd", "type": "region", "code": "150626", "name": "乌审旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "aba7a19c-9282-45b2-9cb8-5c328d3a0e2c"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "乌审旗"], "status": "active", "sort": 2477, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:24"} +{"_id": "1dc98c5e-a6d4-4a24-8d74-6115f7551fb7", "_rev": "2-674c82915ed8a89d73bec0fca9a6872c", "type": "region", "code": "340210", "name": "湾沚区", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "1dc98c5e-a6d4-4a24-8d74-6115f7551fb7"], "path_name": ["中国", "安徽省", "芜湖市", "湾沚区"], "status": "active", "sort": 2484, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "6a144677-ec72-44dd-8c8f-143f8c972a39", "_rev": "2-ca031b8e39ca028f32b40207a718f759", "type": "region", "code": "610829", "name": "吴堡县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "6a144677-ec72-44dd-8c8f-143f8c972a39"], "path_name": ["中国", "陕西省", "榆林市", "吴堡县"], "status": "active", "sort": 2485, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "95e0ac26-a8d5-4c4f-b08d-c5b7304aef89", "_rev": "2-63053ed4d5a228ab665241156a1e2bf5", "type": "region", "code": "654202", "name": "乌苏市", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "95e0ac26-a8d5-4c4f-b08d-c5b7304aef89"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "乌苏市"], "status": "active", "sort": 2478, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "97c57aa6-7b64-42b1-a111-2a93abc0d670", "_rev": "2-d4ec8a2a6fbab66b5323e19743ba6b63", "type": "region", "code": "340281", "name": "无为市", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "97c57aa6-7b64-42b1-a111-2a93abc0d670"], "path_name": ["中国", "安徽省", "芜湖市", "无为市"], "status": "active", "sort": 2483, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "bdf3b054-d4f2-46b3-9ebd-0d203029d809", "_rev": "2-b7f26e03b5cb8d0711cd452feaca0181", "type": "region", "code": "500238", "name": "巫溪县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "bdf3b054-d4f2-46b3-9ebd-0d203029d809"], "path_name": ["中国", "重庆市", "巫溪县"], "status": "active", "sort": 2480, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "c495ba05-9250-4095-acac-0d04c57974fa", "_rev": "2-c5860ce5dd01d6c0d1095f1c24ca28d0", "type": "region", "code": "500237", "name": "巫山县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "c495ba05-9250-4095-acac-0d04c57974fa"], "path_name": ["中国", "重庆市", "巫山县"], "status": "active", "sort": 2479, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "d3acf398-d4c8-4d92-8033-8730f059e382", "_rev": "2-bc0d332df0ec4dca3ece51218ee30f9e", "type": "region", "code": "371623", "name": "无棣县", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "d3acf398-d4c8-4d92-8033-8730f059e382"], "path_name": ["中国", "山东省", "滨州市", "无棣县"], "status": "active", "sort": 2481, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "ec532f0c-5b7c-40ef-88f9-bd4d5224235f", "_rev": "2-1f2ae04f83a2a080be17dd22d2d943fd", "type": "region", "code": "130130", "name": "无极县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "ec532f0c-5b7c-40ef-88f9-bd4d5224235f"], "path_name": ["中国", "河北省", "石家庄市", "无极县"], "status": "active", "sort": 2482, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:25"} +{"_id": "15242666-2401-4281-b31a-6847ed573880", "_rev": "2-8707abb005d308d48ad6d6ee969a4109", "type": "region", "code": "130928", "name": "吴桥县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "15242666-2401-4281-b31a-6847ed573880"], "path_name": ["中国", "河北省", "沧州市", "吴桥县"], "status": "active", "sort": 2489, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "2a9d5e68-c228-4e6c-9927-6595a5280b59", "_rev": "2-c53c1dc279daeba59f0d3109517250cd", "type": "region", "code": "230184", "name": "五常市", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "2a9d5e68-c228-4e6c-9927-6595a5280b59"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "五常市"], "status": "active", "sort": 2492, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "31c55d3a-9ca1-4b6c-bed0-45bd0a8f9fa6", "_rev": "2-2135fff73defbf6609d54eed2985f75b", "type": "region", "code": "231182", "name": "五大连池市", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "31c55d3a-9ca1-4b6c-bed0-45bd0a8f9fa6"], "path_name": ["中国", "黑龙江省", "黑河市", "五大连池市"], "status": "active", "sort": 2493, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "6c438d6f-6226-4f37-a811-51d93a6ff0db", "_rev": "2-eae946da16273c04478d316e26cb7389", "type": "region", "code": "420529", "name": "五峰土家族自治县", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "6c438d6f-6226-4f37-a811-51d93a6ff0db"], "path_name": ["中国", "湖北省", "宜昌市", "五峰土家族自治县"], "status": "active", "sort": 2494, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "8e585944-0507-427b-99c3-86a2c06c2cc3", "_rev": "2-6eb067f26b3ac3650a38ec150b30e782", "type": "region", "code": "330502", "name": "吴兴区", "parent_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "8e585944-0507-427b-99c3-86a2c06c2cc3"], "path_name": ["中国", "浙江省", "湖州市", "吴兴区"], "status": "active", "sort": 2490, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "b52bd1de-81f5-4dde-b7e7-00b17172d6f1", "_rev": "2-0ca81de7aa094b1501f05736bd8dde4c", "type": "region", "code": "610626", "name": "吴起县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "b52bd1de-81f5-4dde-b7e7-00b17172d6f1"], "path_name": ["中国", "陕西省", "延安市", "吴起县"], "status": "active", "sort": 2488, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "ba05955b-2ee5-4fc5-a0a1-bee7f1795646", "_rev": "2-0d0cbcaf3428513505f15753aa27c81b", "type": "region", "code": "440883", "name": "吴川市", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "ba05955b-2ee5-4fc5-a0a1-bee7f1795646"], "path_name": ["中国", "广东省", "湛江市", "吴川市"], "status": "active", "sort": 2486, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "ca4125f7-8107-4863-bb9f-1795c2ba2639", "_rev": "2-8b7448c506cc420accf17a7ef5b5e05d", "type": "region", "code": "320509", "name": "吴江区", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "ca4125f7-8107-4863-bb9f-1795c2ba2639"], "path_name": ["中国", "江苏省", "苏州市", "吴江区"], "status": "active", "sort": 2487, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "f5231dc3-75a7-4446-9f02-77a3c67e6c08", "_rev": "2-5a8f526083ee2e0131cf026680f2a3f1", "type": "region", "code": "320506", "name": "吴中区", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "f5231dc3-75a7-4446-9f02-77a3c67e6c08"], "path_name": ["中国", "江苏省", "苏州市", "吴中区"], "status": "active", "sort": 2491, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:26"} +{"_id": "0b17b5b7-f681-48ec-93b8-dc11d8d5e4e1", "_rev": "2-f5779dc05db2b0376aa12e64275f353b", "type": "region", "code": "340322", "name": "五河县", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "0b17b5b7-f681-48ec-93b8-dc11d8d5e4e1"], "path_name": ["中国", "安徽省", "蚌埠市", "五河县"], "status": "active", "sort": 2495, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "0d011301-1d14-41aa-a6a4-1ad376ab5236", "_rev": "2-65b9cd1c1b792c3122dcfa42dadac615", "type": "region", "code": "140922", "name": "五台县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "0d011301-1d14-41aa-a6a4-1ad376ab5236"], "path_name": ["中国", "山西省", "忻州市", "五台县"], "status": "active", "sort": 2500, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "12f7f760-13ef-41aa-9b0c-31cb2cdcffa0", "_rev": "2-da53f2a9da105fb09aa9e0eb89c3a7d1", "type": "region", "code": "150821", "name": "五原县", "parent_id": "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "e2bc785e-4844-4d87-9a43-ee5db4ceb5b5", "12f7f760-13ef-41aa-9b0c-31cb2cdcffa0"], "path_name": ["中国", "内蒙古自治区", "巴彦淖尔市", "五原县"], "status": "active", "sort": 2502, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "1956be74-3d85-4092-8353-9610e45b80ae", "_rev": "2-3ddf723c2e9213617eee3b04217b45ce", "type": "region", "code": "371121", "name": "五莲县", "parent_id": "da26105e-dedf-4275-9619-5d4354c2cc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "da26105e-dedf-4275-9619-5d4354c2cc42", "1956be74-3d85-4092-8353-9610e45b80ae"], "path_name": ["中国", "山东省", "日照市", "五莲县"], "status": "active", "sort": 2499, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "620d860e-b2fc-435c-917e-805d748a805b", "_rev": "2-0f332b968f7dc59571a92ce13f285b12", "type": "region", "code": "530102", "name": "五华区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "620d860e-b2fc-435c-917e-805d748a805b"], "path_name": ["中国", "云南省", "昆明市", "五华区"], "status": "active", "sort": 2496, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "654abaf5-0a8d-420d-9326-46ed39ee287c", "_rev": "2-69d78f6acc3e01b8674e7a049529d35c", "type": "region", "code": "441424", "name": "五华县", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "654abaf5-0a8d-420d-9326-46ed39ee287c"], "path_name": ["中国", "广东省", "梅州市", "五华县"], "status": "active", "sort": 2497, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "871493f9-51da-492d-98bd-589a2273770f", "_rev": "2-5f74229acf3b49239f3d2588e2967761", "type": "region", "code": "659004", "name": "五家渠市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "871493f9-51da-492d-98bd-589a2273770f"], "path_name": ["中国", "新疆维吾尔自治区", "五家渠市"], "status": "active", "sort": 2498, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "a4e90381-ff05-4ab9-816f-880a23684a9f", "_rev": "2-c7067005d54b27efbde766b8b82725d4", "type": "region", "code": "511112", "name": "五通桥区", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "a4e90381-ff05-4ab9-816f-880a23684a9f"], "path_name": ["中国", "四川省", "乐山市", "五通桥区"], "status": "active", "sort": 2501, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:27"} +{"_id": "05fab107-ed64-42f1-868f-ee67f0056ba4", "_rev": "2-7bda3287d62d9534fd3ec0d4bf997bd1", "type": "region", "code": "130481", "name": "武安市", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "05fab107-ed64-42f1-868f-ee67f0056ba4"], "path_name": ["中国", "河北省", "邯郸市", "武安市"], "status": "active", "sort": 2506, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "098e0f4b-3088-44ef-896d-32f9f51032a2", "_rev": "2-7dbd84cd01e41e4108b9db867a94606a", "type": "region", "code": "621202", "name": "武都区", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "098e0f4b-3088-44ef-896d-32f9f51032a2"], "path_name": ["中国", "甘肃省", "陇南市", "武都区"], "status": "active", "sort": 2511, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "26d49ab4-318c-48e4-8d8a-b874fe23d863", "_rev": "2-68ee316cb263c12bb6b6c0d5e26d5c5a", "type": "region", "code": "140928", "name": "五寨县", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "26d49ab4-318c-48e4-8d8a-b874fe23d863"], "path_name": ["中国", "山西省", "忻州市", "五寨县"], "status": "active", "sort": 2503, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "2d2e8d95-caca-4ebf-b0dc-f43483805921", "_rev": "2-1aeac5d13475cb756df901d89379801c", "type": "region", "code": "420106", "name": "武昌区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "2d2e8d95-caca-4ebf-b0dc-f43483805921"], "path_name": ["中国", "湖北省", "武汉市", "武昌区"], "status": "active", "sort": 2507, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "32da3968-1c95-476a-b70c-5517d1fb56b3", "_rev": "2-a31e890e2813a3d1f0b1a20a73b16c2d", "type": "region", "code": "420503", "name": "伍家岗区", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "32da3968-1c95-476a-b70c-5517d1fb56b3"], "path_name": ["中国", "湖北省", "宜昌市", "伍家岗区"], "status": "active", "sort": 2505, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "4dccb215-92e6-4ae7-85be-86a1968fa7ae", "_rev": "2-a6e17a07672882491faed676a2cceffe", "type": "region", "code": "150125", "name": "武川县", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "4dccb215-92e6-4ae7-85be-86a1968fa7ae"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "武川县"], "status": "active", "sort": 2509, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "5a92d56c-e41f-47f7-9d6c-2df32de37ce6", "_rev": "2-373635bd96fe862238c0f405ab326204", "type": "region", "code": "469001", "name": "五指山市", "parent_id": "9451e451-b557-4227-a27a-90566ba8f9d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "5a92d56c-e41f-47f7-9d6c-2df32de37ce6"], "path_name": ["中国", "海南省", "五指山市"], "status": "active", "sort": 2504, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "631b6dab-fec5-453f-968f-5c0d9a10d6e3", "_rev": "2-50d006b7b464011f2be28580ba463d5d", "type": "region", "code": "532329", "name": "武定县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "631b6dab-fec5-453f-968f-5c0d9a10d6e3"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "武定县"], "status": "active", "sort": 2510, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "fee5e734-7890-4a25-ae44-d332cc8a4ed9", "_rev": "2-fe54784c85758254dc979b8b7461ab28", "type": "region", "code": "371428", "name": "武城县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "fee5e734-7890-4a25-ae44-d332cc8a4ed9"], "path_name": ["中国", "山东省", "德州市", "武城县"], "status": "active", "sort": 2508, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:28"} +{"_id": "148bb79c-e9a1-453f-bfb3-f0ae5747d732", "_rev": "2-7feb8767657eae42a45644ce87117367", "type": "region", "code": "320412", "name": "武进区", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "148bb79c-e9a1-453f-bfb3-f0ae5747d732"], "path_name": ["中国", "江苏省", "常州市", "武进区"], "status": "active", "sort": 2516, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "7b42e864-9635-44e9-b30e-6db0f190a53f", "_rev": "2-a77cdf08c8bb8b5c64252916fb5d8cbc", "type": "region", "code": "430581", "name": "武冈市", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "7b42e864-9635-44e9-b30e-6db0f190a53f"], "path_name": ["中国", "湖南省", "邵阳市", "武冈市"], "status": "active", "sort": 2512, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "7e8a9eb1-9b8e-4cd1-8d57-73f1b8a713b2", "_rev": "2-faa04013dc7e9323dfdedfaea45e9384", "type": "region", "code": "500156", "name": "武隆区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "7e8a9eb1-9b8e-4cd1-8d57-73f1b8a713b2"], "path_name": ["中国", "重庆市", "武隆区"], "status": "active", "sort": 2519, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "8b770123-ace9-4084-9a90-4e3d3ff2fa35", "_rev": "2-73cb1fcb581f7b53e5868a469a5e43c9", "type": "region", "code": "510107", "name": "武侯区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "8b770123-ace9-4084-9a90-4e3d3ff2fa35"], "path_name": ["中国", "四川省", "成都市", "武侯区"], "status": "active", "sort": 2514, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "b2b84964-b1ab-46b5-9040-18f0dad0909b", "_rev": "2-9c168d4f1af62d47825b3f7dc87b4320", "type": "region", "code": "430811", "name": "武陵源区", "parent_id": "ddb90f83-c981-4cc1-a157-a085d328dd64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "ddb90f83-c981-4cc1-a157-a085d328dd64", "b2b84964-b1ab-46b5-9040-18f0dad0909b"], "path_name": ["中国", "湖南省", "张家界市", "武陵源区"], "status": "active", "sort": 2518, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "b357ce75-bcd7-4b52-9d9a-5c30935bea80", "_rev": "2-086fd4fc83387f5567ffdb5696f6fa59", "type": "region", "code": "430702", "name": "武陵区", "parent_id": "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "03013af3-8d2d-49d7-a9ab-c66ee4db67b1", "b357ce75-bcd7-4b52-9d9a-5c30935bea80"], "path_name": ["中国", "湖南省", "常德市", "武陵区"], "status": "active", "sort": 2517, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "dfc331c0-2cb1-4642-b816-4a0b75a6fe31", "_rev": "2-f7d970f6b8cfde29d3c8d9b313671042", "type": "region", "code": "440203", "name": "武江区", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "dfc331c0-2cb1-4642-b816-4a0b75a6fe31"], "path_name": ["中国", "广东省", "韶关市", "武江区"], "status": "active", "sort": 2515, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "e11480f0-ca9d-473f-8caf-d7fefc17b572", "_rev": "2-d75e1099374b5e764e072b2a98707a26", "type": "region", "code": "610431", "name": "武功县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "e11480f0-ca9d-473f-8caf-d7fefc17b572"], "path_name": ["中国", "陕西省", "咸阳市", "武功县"], "status": "active", "sort": 2513, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:29"} +{"_id": "2224703e-22af-4bca-a05d-23f05a24a1c7", "_rev": "2-22f63b582bc42ba71c70a4a8dca3237a", "type": "region", "code": "450110", "name": "武鸣区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "2224703e-22af-4bca-a05d-23f05a24a1c7"], "path_name": ["中国", "广西壮族自治区", "南宁市", "武鸣区"], "status": "active", "sort": 2520, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "50b64f83-e30d-4c3c-afd4-97a03c0521a0", "_rev": "2-6fee5667607ba7ea3b9cf731828ded5d", "type": "region", "code": "350824", "name": "武平县", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "50b64f83-e30d-4c3c-afd4-97a03c0521a0"], "path_name": ["中国", "福建省", "龙岩市", "武平县"], "status": "active", "sort": 2522, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "51547dc5-679f-49ca-ae87-3dfead5a21a8", "_rev": "2-e2aef3a14cafcc7d3654fd3f21ddd1b2", "type": "region", "code": "120114", "name": "武清区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "51547dc5-679f-49ca-ae87-3dfead5a21a8"], "path_name": ["中国", "天津市", "武清区"], "status": "active", "sort": 2524, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "6ba5267b-523b-4e63-a350-976b525e158b", "_rev": "2-bc6fe86d948083375c8df2e420a71004", "type": "region", "code": "511622", "name": "武胜县", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "6ba5267b-523b-4e63-a350-976b525e158b"], "path_name": ["中国", "四川省", "广安市", "武胜县"], "status": "active", "sort": 2526, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "a58decf8-b4f1-47da-b808-a638236cd2c9", "_rev": "2-8dd627ebf2c4fdf682d723fdf9ee53b3", "type": "region", "code": "620524", "name": "武山县", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "a58decf8-b4f1-47da-b808-a638236cd2c9"], "path_name": ["中国", "甘肃省", "天水市", "武山县"], "status": "active", "sort": 2525, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "e3147d0f-9811-44d5-ad40-b8acadbfa743", "_rev": "2-ea29f15529348eae62be73f2d6f0489e", "type": "region", "code": "131123", "name": "武强县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "e3147d0f-9811-44d5-ad40-b8acadbfa743"], "path_name": ["中国", "河北省", "衡水市", "武强县"], "status": "active", "sort": 2523, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "ea0990d2-c9e6-4864-b75c-cb3d832e45ff", "_rev": "2-19e09aa699800a8350460df0ed30c819", "type": "region", "code": "360423", "name": "武宁县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "ea0990d2-c9e6-4864-b75c-cb3d832e45ff"], "path_name": ["中国", "江西省", "九江市", "武宁县"], "status": "active", "sort": 2521, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "f69a9d87-0192-42d3-afa4-0f4851784427", "_rev": "2-b43525470a8f4df317d3e2fc14867da8", "type": "region", "code": "140429", "name": "武乡县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "f69a9d87-0192-42d3-afa4-0f4851784427"], "path_name": ["中国", "山西省", "长治市", "武乡县"], "status": "active", "sort": 2527, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:30"} +{"_id": "00abad27-f9a9-4d17-abe9-875e3ac1355e", "_rev": "2-52a8e441e24caab20293be9317964183", "type": "region", "code": "410823", "name": "武陟县", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "00abad27-f9a9-4d17-abe9-875e3ac1355e"], "path_name": ["中国", "河南省", "焦作市", "武陟县"], "status": "active", "sort": 2533, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "0cc9dd4a-f4f8-4c62-8086-dd75d96e1ceb", "_rev": "2-76d07a4f813321583c9dfaf52165c60b", "type": "region", "code": "330723", "name": "武义县", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "0cc9dd4a-f4f8-4c62-8086-dd75d96e1ceb"], "path_name": ["中国", "浙江省", "金华市", "武义县"], "status": "active", "sort": 2531, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "1e689d3b-4467-400d-bf3c-d33435a9bd4d", "_rev": "2-cac8acf09ff52adeb2f19e72d225333a", "type": "region", "code": "131122", "name": "武邑县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "1e689d3b-4467-400d-bf3c-d33435a9bd4d"], "path_name": ["中国", "河北省", "衡水市", "武邑县"], "status": "active", "sort": 2532, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "26e326d0-5392-4d67-8783-660eaf48372e", "_rev": "2-03b1f019198999d7f3cb4ca53edb101e", "type": "region", "code": "451323", "name": "武宣县", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "26e326d0-5392-4d67-8783-660eaf48372e"], "path_name": ["中国", "广西壮族自治区", "来宾市", "武宣县"], "status": "active", "sort": 2528, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "694c3384-9d7b-4d8d-9439-56052650e59e", "_rev": "2-0dd99bb0e4ba5a0e1c8df7edbacb2ca7", "type": "region", "code": "421182", "name": "武穴市", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "694c3384-9d7b-4d8d-9439-56052650e59e"], "path_name": ["中国", "湖北省", "黄冈市", "武穴市"], "status": "active", "sort": 2529, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "ec15ee92-14eb-43f6-8afa-9f1050e30c4e", "_rev": "2-8e86a5418e4adbe51c81852353bfed38", "type": "region", "code": "350782", "name": "武夷山市", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "ec15ee92-14eb-43f6-8afa-9f1050e30c4e"], "path_name": ["中国", "福建省", "南平市", "武夷山市"], "status": "active", "sort": 2530, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:31"} +{"_id": "3b469f40-96c3-45c4-9bed-0fa95f02c2f4", "_rev": "2-80fc123d9d2d6bfe202d285aab4a020b", "type": "region", "code": "410481", "name": "舞钢市", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "3b469f40-96c3-45c4-9bed-0fa95f02c2f4"], "path_name": ["中国", "河南省", "平顶山市", "舞钢市"], "status": "active", "sort": 2534, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "5beefa64-21e4-4ced-9cfd-20973cbbadff", "_rev": "2-376f6f887e9b73e301de957a7ae27752", "type": "region", "code": "330702", "name": "婺城区", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "5beefa64-21e4-4ced-9cfd-20973cbbadff"], "path_name": ["中国", "浙江省", "金华市", "婺城区"], "status": "active", "sort": 2537, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "89a74cea-23db-4d9d-a7af-502b53d6f154", "_rev": "2-a3ab9adfd068d10c1ba3718dc2536f73", "type": "region", "code": "411121", "name": "舞阳县", "parent_id": "d41f466d-690a-4104-b545-35ba392a52d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2", "89a74cea-23db-4d9d-a7af-502b53d6f154"], "path_name": ["中国", "河南省", "漯河市", "舞阳县"], "status": "active", "sort": 2535, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "915a60f6-1db2-4b4b-b2b1-891d7ddd7f69", "_rev": "2-db631f3acb06bd1a1b036c110c6030ea", "type": "region", "code": "520326", "name": "务川仡佬族苗族自治县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "915a60f6-1db2-4b4b-b2b1-891d7ddd7f69"], "path_name": ["中国", "贵州省", "遵义市", "务川仡佬族苗族自治县"], "status": "active", "sort": 2536, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "a77d8091-b798-4068-82ad-22eb1a57681f", "_rev": "2-69c59318e42eb765909503f9972232e9", "type": "region", "code": "110102", "name": "西城区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "a77d8091-b798-4068-82ad-22eb1a57681f"], "path_name": ["中国", "北京市", "西城区"], "status": "active", "sort": 2540, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "d6db5e49-28f8-42ad-8ddf-ba68681018c6", "_rev": "2-0ad7c0505ed89c0428553b32fdef2462", "type": "region", "code": "513401", "name": "西昌市", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "d6db5e49-28f8-42ad-8ddf-ba68681018c6"], "path_name": ["中国", "四川省", "凉山彝族自治州", "西昌市"], "status": "active", "sort": 2539, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "fb4fb537-2d49-44e2-a3ec-891aa00fcec7", "_rev": "2-cbc0960ce9a1c23916b967520de560ee", "type": "region", "code": "361130", "name": "婺源县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "fb4fb537-2d49-44e2-a3ec-891aa00fcec7"], "path_name": ["中国", "江西省", "上饶市", "婺源县"], "status": "active", "sort": 2538, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:32"} +{"_id": "123f363a-50cb-4c04-b9fe-fa6c09740b25", "_rev": "2-962306f68d43455468da451cac69d9d3", "type": "region", "code": "211223", "name": "西丰县", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "123f363a-50cb-4c04-b9fe-fa6c09740b25"], "path_name": ["中国", "辽宁省", "铁岭市", "西丰县"], "status": "active", "sort": 2543, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "36cbe8d9-a5bb-4727-a7d9-44b5eb6ebcd5", "_rev": "2-33bed6629c799d239bb9a91fa0fb847f", "type": "region", "code": "410303", "name": "西工区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "36cbe8d9-a5bb-4727-a7d9-44b5eb6ebcd5"], "path_name": ["中国", "河南省", "洛阳市", "西工区"], "status": "active", "sort": 2546, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "45af246c-3fb4-477f-b674-bccede559e02", "_rev": "2-2bbf906a634e6a608bf05cde17440864", "type": "region", "code": "532623", "name": "西畴县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "45af246c-3fb4-477f-b674-bccede559e02"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "西畴县"], "status": "active", "sort": 2542, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "7202b2fb-d2a4-4112-aa3f-a2f9d63dee1b", "_rev": "2-0afa5b25d27750a69b8a9b6e2c0d8ea6", "type": "region", "code": "511325", "name": "西充县", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "7202b2fb-d2a4-4112-aa3f-a2f9d63dee1b"], "path_name": ["中国", "四川省", "南充市", "西充县"], "status": "active", "sort": 2541, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "9b97636a-a920-4afb-8458-0cc2361333f4", "_rev": "2-5d103a142dcdb9f901a644c06cb36ff7", "type": "region", "code": "210203", "name": "西岗区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "9b97636a-a920-4afb-8458-0cc2361333f4"], "path_name": ["中国", "辽宁省", "大连市", "西岗区"], "status": "active", "sort": 2545, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "eb934cd1-847e-400e-b80d-35244c691fa6", "_rev": "2-e63fa7c851c4908a83a0341d535b7b0c", "type": "region", "code": "621002", "name": "西峰区", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "eb934cd1-847e-400e-b80d-35244c691fa6"], "path_name": ["中国", "甘肃省", "庆阳市", "西峰区"], "status": "active", "sort": 2544, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:33"} +{"_id": "1482ae0d-69d1-415b-b7de-754cdeb7c405", "_rev": "2-e2e8f7ccacd35a364bb9e5115dae5fef", "type": "region", "code": "640422", "name": "西吉县", "parent_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "1482ae0d-69d1-415b-b7de-754cdeb7c405"], "path_name": ["中国", "宁夏回族自治区", "固原市", "西吉县"], "status": "active", "sort": 2550, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "240a325a-fc67-45e7-8fb1-5d97837b77e6", "_rev": "2-5a01fd3107db0449fb4511273f94010a", "type": "region", "code": "530829", "name": "西盟佤族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "240a325a-fc67-45e7-8fb1-5d97837b77e6"], "path_name": ["中国", "云南省", "普洱市", "西盟佤族自治县"], "status": "active", "sort": 2553, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "499f0316-e30c-4094-b034-2592bb09df10", "_rev": "2-94024aade3bd829383d7a4ce1b0fc2e0", "type": "region", "code": "411622", "name": "西华县", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "499f0316-e30c-4094-b034-2592bb09df10"], "path_name": ["中国", "河南省", "周口市", "西华县"], "status": "active", "sort": 2549, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "73525992-07ba-42f9-a355-3c4ba9b6fab2", "_rev": "2-ac606ee70d695684b673be425b5343d7", "type": "region", "code": "451030", "name": "西林县", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "73525992-07ba-42f9-a355-3c4ba9b6fab2"], "path_name": ["中国", "广西壮族自治区", "百色市", "西林县"], "status": "active", "sort": 2551, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "7630d6db-0f2c-4058-b0ff-43ff84dc3141", "_rev": "2-699a11ba6cbb9734a7eb8254f0717126", "type": "region", "code": "620104", "name": "西固区", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "7630d6db-0f2c-4058-b0ff-43ff84dc3141"], "path_name": ["中国", "甘肃省", "兰州市", "西固区"], "status": "active", "sort": 2547, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "b0bc2c31-e60b-4757-9837-e25c1da6afb8", "_rev": "2-7937f851d6641f3a1af20a2be2683d73", "type": "region", "code": "420502", "name": "西陵区", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "b0bc2c31-e60b-4757-9837-e25c1da6afb8"], "path_name": ["中国", "湖北省", "宜昌市", "西陵区"], "status": "active", "sort": 2552, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "ee2a1305-15a0-4a3d-994c-924136465914", "_rev": "2-19ab94f64e0507c3820d2cf98f99fc54", "type": "region", "code": "621225", "name": "西和县", "parent_id": "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7cc41d70-d154-4108-8dc1-c903c8adfd1a", "ee2a1305-15a0-4a3d-994c-924136465914"], "path_name": ["中国", "甘肃省", "陇南市", "西和县"], "status": "active", "sort": 2548, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:34"} +{"_id": "43361401-b50b-45bb-9bb4-3149c319c071", "_rev": "2-1fb475848d7dc40c12bffa9e7ae02672", "type": "region", "code": "120111", "name": "西青区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "43361401-b50b-45bb-9bb4-3149c319c071"], "path_name": ["中国", "天津市", "西青区"], "status": "active", "sort": 2555, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "64a74514-ef1f-40d9-be6f-3de3e5f23d95", "_rev": "2-5fd139c1b122ea55208a75af70be221f", "type": "region", "code": "411721", "name": "西平县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "64a74514-ef1f-40d9-be6f-3de3e5f23d95"], "path_name": ["中国", "河南省", "驻马店市", "西平县"], "status": "active", "sort": 2554, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "64d68906-c1f0-4846-ab60-0055a0fe8c7a", "_rev": "2-1a81e004bbe318f6737a425a52959ef6", "type": "region", "code": "510403", "name": "西区", "parent_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971", "64d68906-c1f0-4846-ab60-0055a0fe8c7a"], "path_name": ["中国", "四川省", "攀枝花市", "西区"], "status": "active", "sort": 2556, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "b0a54fd9-522a-4bc6-a719-8b4e37d18a06", "_rev": "2-7e32c032ec5f5cfd849b023a165c342b", "type": "region", "code": "411323", "name": "西峡县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "b0a54fd9-522a-4bc6-a719-8b4e37d18a06"], "path_name": ["中国", "河南省", "南阳市", "西峡县"], "status": "active", "sort": 2561, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "bfc32810-1e9e-429d-9425-33d72daeec30", "_rev": "2-14aea332c6147a8480d7d1a73c632599", "type": "region", "code": "210803", "name": "西市区", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "bfc32810-1e9e-429d-9425-33d72daeec30"], "path_name": ["中国", "辽宁省", "营口市", "西市区"], "status": "active", "sort": 2559, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "e9eb7eaf-2e7c-441a-9e91-cc56d2f1e363", "_rev": "2-6039cb8711a574026078d5d251ac1fc9", "type": "region", "code": "530112", "name": "西山区", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "e9eb7eaf-2e7c-441a-9e91-cc56d2f1e363"], "path_name": ["中国", "云南省", "昆明市", "西山区"], "status": "active", "sort": 2558, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "f279a0a1-f694-4763-9f5c-243753c86c67", "_rev": "2-3d67587cbc8589a314add64f6c684841", "type": "region", "code": "152526", "name": "西乌珠穆沁旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "f279a0a1-f694-4763-9f5c-243753c86c67"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "西乌珠穆沁旗"], "status": "active", "sort": 2560, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "fbfd58c9-6025-4a86-b525-aea5d9a377ee", "_rev": "2-a426d8b701aa1187ab7d334eb3767711", "type": "region", "code": "420203", "name": "西塞山区", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "fbfd58c9-6025-4a86-b525-aea5d9a377ee"], "path_name": ["中国", "湖北省", "黄石市", "西塞山区"], "status": "active", "sort": 2557, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:35"} +{"_id": "185b9fe6-e2e7-4bdf-8f31-5e301b3da72f", "_rev": "2-6d5b46745ce0d5e65d22a9712add3604", "type": "region", "code": "640105", "name": "西夏区", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "185b9fe6-e2e7-4bdf-8f31-5e301b3da72f"], "path_name": ["中国", "宁夏回族自治区", "银川市", "西夏区"], "status": "active", "sort": 2562, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "1c5011e5-7737-480a-8618-2d7f45c7899e", "_rev": "2-be7d807340990a9f26af6a83eab08eea", "type": "region", "code": "411528", "name": "息县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "1c5011e5-7737-480a-8618-2d7f45c7899e"], "path_name": ["中国", "河南省", "信阳市", "息县"], "status": "active", "sort": 2568, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "4f0dd8ae-24b4-4343-a29c-a0f4fd8de0be", "_rev": "2-542ae448af9b179580da052af76e1008", "type": "region", "code": "520122", "name": "息烽县", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "4f0dd8ae-24b4-4343-a29c-a0f4fd8de0be"], "path_name": ["中国", "贵州省", "贵阳市", "息烽县"], "status": "active", "sort": 2567, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "5c29cdf8-d535-480d-a624-56a47aa22c05", "_rev": "2-141ae3c8f5d84978c4c0421cd80d7ca5", "type": "region", "code": "140724", "name": "昔阳县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "5c29cdf8-d535-480d-a624-56a47aa22c05"], "path_name": ["中国", "山西省", "晋中市", "昔阳县"], "status": "active", "sort": 2566, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "86c0d7f9-b4e1-4a45-821b-93311dd0bdeb", "_rev": "2-dac8c4c60dd13a0fac66348cad1479cc", "type": "region", "code": "610724", "name": "西乡县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "86c0d7f9-b4e1-4a45-821b-93311dd0bdeb"], "path_name": ["中国", "陕西省", "汉中市", "西乡县"], "status": "active", "sort": 2564, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "8a6baa7b-e665-41b2-b778-61f3545bf257", "_rev": "2-8a6be62ad1b289c0f7d41a07d6b484d7", "type": "region", "code": "520402", "name": "西秀区", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "8a6baa7b-e665-41b2-b778-61f3545bf257"], "path_name": ["中国", "贵州省", "安顺市", "西秀区"], "status": "active", "sort": 2565, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "fe7bb89e-07aa-480c-b711-2b980a864fab", "_rev": "2-bf5228f66c4c1d25473b198ecab44c09", "type": "region", "code": "450107", "name": "西乡塘区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "fe7bb89e-07aa-480c-b711-2b980a864fab"], "path_name": ["中国", "广西壮族自治区", "南宁市", "西乡塘区"], "status": "active", "sort": 2563, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:36"} +{"_id": "27881d10-6c93-40b8-98f4-f5db0bc0ba56", "_rev": "2-8a9d84fd535bd7f1cbd27fc1d36e0965", "type": "region", "code": "152502", "name": "锡林浩特市", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "27881d10-6c93-40b8-98f4-f5db0bc0ba56"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "锡林浩特市"], "status": "active", "sort": 2571, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "59b4b430-c648-4197-bb53-f365fd7b022d", "_rev": "2-b6fdd1e8771b6320c59b7e70aaa2e592", "type": "region", "code": "320205", "name": "锡山区", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "59b4b430-c648-4197-bb53-f365fd7b022d"], "path_name": ["中国", "江苏省", "无锡市", "锡山区"], "status": "active", "sort": 2572, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "5fdd9a08-aa67-4fb5-a948-9559fcad72ff", "_rev": "2-ce1dda357ae7c91c6c20054d391bda26", "type": "region", "code": "520330", "name": "习水县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "5fdd9a08-aa67-4fb5-a948-9559fcad72ff"], "path_name": ["中国", "贵州省", "遵义市", "习水县"], "status": "active", "sort": 2574, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "866c156a-7d87-40f1-b34c-65096b2c8ee7", "_rev": "2-616c5a3a49f5a980fca2a68cbc49e7a0", "type": "region", "code": "421125", "name": "浠水县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "866c156a-7d87-40f1-b34c-65096b2c8ee7"], "path_name": ["中国", "湖北省", "黄冈市", "浠水县"], "status": "active", "sort": 2569, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "93d3dde6-2e0c-40ef-89b1-fc6290e89ae0", "_rev": "2-06f5e8116738fbea5b9719b88803c237", "type": "region", "code": "210503", "name": "溪湖区", "parent_id": "ffb9d628-e575-41bb-98c9-bdf7e5021358", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ffb9d628-e575-41bb-98c9-bdf7e5021358", "93d3dde6-2e0c-40ef-89b1-fc6290e89ae0"], "path_name": ["中国", "辽宁省", "本溪市", "溪湖区"], "status": "active", "sort": 2573, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "d64705d9-9e3e-400a-bdf5-72026d09078c", "_rev": "2-d4d3c406ecaa7770b29877c77a0c1eba", "type": "region", "code": "411326", "name": "淅川县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "d64705d9-9e3e-400a-bdf5-72026d09078c"], "path_name": ["中国", "河南省", "南阳市", "淅川县"], "status": "active", "sort": 2570, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:37"} +{"_id": "0d7834c7-2ce4-420f-99e8-6c7af540cbde", "_rev": "2-ee676cee36a6ec6d62c4dfc2e55df92c", "type": "region", "code": "513432", "name": "喜德县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "0d7834c7-2ce4-420f-99e8-6c7af540cbde"], "path_name": ["中国", "四川省", "凉山彝族自治州", "喜德县"], "status": "active", "sort": 2576, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "18947216-aae8-4df4-97a3-6e9216f55dd1", "_rev": "2-59ac1dd8a475100ee084a1531e586108", "type": "region", "code": "210911", "name": "细河区", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "18947216-aae8-4df4-97a3-6e9216f55dd1"], "path_name": ["中国", "辽宁省", "阜新市", "细河区"], "status": "active", "sort": 2577, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "2c413339-4774-4e31-aec6-55d9d0eceb5c", "_rev": "2-03dcb490e04f1e4cd6c2b11b1adfe654", "type": "region", "code": "141031", "name": "隰县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "2c413339-4774-4e31-aec6-55d9d0eceb5c"], "path_name": ["中国", "山西省", "临汾市", "隰县"], "status": "active", "sort": 2575, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "42dfb6fd-574a-49cb-9289-a019c7d0e551", "_rev": "2-8716ee9e4d786fd8f60f56af2bdcf0a1", "type": "region", "code": "350921", "name": "霞浦县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "42dfb6fd-574a-49cb-9289-a019c7d0e551"], "path_name": ["中国", "福建省", "宁德市", "霞浦县"], "status": "active", "sort": 2579, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "670ef416-5971-4243-ad59-6baea6126d62", "_rev": "2-9131ce220bd9403a2cc8932a25ddcc2a", "type": "region", "code": "130706", "name": "下花园区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "670ef416-5971-4243-ad59-6baea6126d62"], "path_name": ["中国", "河北省", "张家口市", "下花园区"], "status": "active", "sort": 2581, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "a9279e95-6576-4824-b23b-db374288d80a", "_rev": "2-81015e7efe34a3ddac4a606ba41a1891", "type": "region", "code": "440803", "name": "霞山区", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "a9279e95-6576-4824-b23b-db374288d80a"], "path_name": ["中国", "广东省", "湛江市", "霞山区"], "status": "active", "sort": 2580, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "bb188443-28fe-4545-925e-22d278434e7b", "_rev": "2-695048fa0ee687f61e2e10752cf3b37f", "type": "region", "code": "360823", "name": "峡江县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "bb188443-28fe-4545-925e-22d278434e7b"], "path_name": ["中国", "江西省", "吉安市", "峡江县"], "status": "active", "sort": 2578, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "bf1d1fe3-f5e8-436f-9fd5-ef2d9160d1d8", "_rev": "2-f1c7e1082a2b9517341bb98983401be0", "type": "region", "code": "420204", "name": "下陆区", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "bf1d1fe3-f5e8-436f-9fd5-ef2d9160d1d8"], "path_name": ["中国", "湖北省", "黄石市", "下陆区"], "status": "active", "sort": 2582, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:38"} +{"_id": "1bfb3e33-d966-4f17-b182-7fd5644c9582", "_rev": "2-2e8647391647d19e2bb7a2cd7c54fb5f", "type": "region", "code": "421202", "name": "咸安区", "parent_id": "707689d2-cf10-4ec3-a757-d02c17fd5322", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "707689d2-cf10-4ec3-a757-d02c17fd5322", "1bfb3e33-d966-4f17-b182-7fd5644c9582"], "path_name": ["中国", "湖北省", "咸宁市", "咸安区"], "status": "active", "sort": 2590, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "3cd49603-4642-46e9-824f-6f722a54bc96", "_rev": "2-5843845bdf92fbdf6fda066693198e9d", "type": "region", "code": "140828", "name": "夏县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "3cd49603-4642-46e9-824f-6f722a54bc96"], "path_name": ["中国", "山西省", "运城市", "夏县"], "status": "active", "sort": 2585, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "4794c68a-b8b5-4fba-84db-c6f3f6d3eb07", "_rev": "2-18baf9162dcb35f9264e5baf79da0f9c", "type": "region", "code": "623027", "name": "夏河县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "4794c68a-b8b5-4fba-84db-c6f3f6d3eb07"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "夏河县"], "status": "active", "sort": 2583, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "5631141d-71b1-45b1-a933-bc088efec9de", "_rev": "2-38154fe4d70e179ff4e839f16e583fc0", "type": "region", "code": "371427", "name": "夏津县", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "5631141d-71b1-45b1-a933-bc088efec9de"], "path_name": ["中国", "山东省", "德州市", "夏津县"], "status": "active", "sort": 2584, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "5e2c4d84-db33-428d-92ea-8aaf43867d2d", "_rev": "2-90b0a508141c798ab8732126652a5002", "type": "region", "code": "411426", "name": "夏邑县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "5e2c4d84-db33-428d-92ea-8aaf43867d2d"], "path_name": ["中国", "河南省", "商丘市", "夏邑县"], "status": "active", "sort": 2586, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "6cc4594b-3786-43e2-b03b-2682f5878bfa", "_rev": "2-fd0ddecf0c319f5b1abd2bde3bf3ecb7", "type": "region", "code": "429004", "name": "仙桃市", "parent_id": "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6cc4594b-3786-43e2-b03b-2682f5878bfa"], "path_name": ["中国", "湖北省", "仙桃市"], "status": "active", "sort": 2588, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "751eb28a-9ac0-4d4e-a817-e312b91e2439", "_rev": "2-959fe0f177d36a9177f328ae2ea8f665", "type": "region", "code": "331024", "name": "仙居县", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "751eb28a-9ac0-4d4e-a817-e312b91e2439"], "path_name": ["中国", "浙江省", "台州市", "仙居县"], "status": "active", "sort": 2587, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "b416fdc4-40d5-4de3-9b0c-9e1573a99aa0", "_rev": "2-eb805f1152399b5f6713afe86abde6ef", "type": "region", "code": "350322", "name": "仙游县", "parent_id": "60031958-e67a-4094-8ab0-04087026e22e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e", "b416fdc4-40d5-4de3-9b0c-9e1573a99aa0"], "path_name": ["中国", "福建省", "莆田市", "仙游县"], "status": "active", "sort": 2589, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:39"} +{"_id": "536f2c1f-147d-4fe6-84a6-b91c6c99f443", "_rev": "2-7e23920c9ba0c551daf0504abb66020a", "type": "region", "code": "230110", "name": "香坊区", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "536f2c1f-147d-4fe6-84a6-b91c6c99f443"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "香坊区"], "status": "active", "sort": 2598, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "5eefd245-3df3-4b29-b69f-72ff2cce198d", "_rev": "2-01d6c6c68fb2e1b2aa4cd72f881e6b95", "type": "region", "code": "320507", "name": "相城区", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "5eefd245-3df3-4b29-b69f-72ff2cce198d"], "path_name": ["中国", "江苏省", "苏州市", "相城区"], "status": "active", "sort": 2596, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "866ff551-d442-4898-b436-78b351237a9a", "_rev": "2-d43bb93e0661beec9330fe46e62d6396", "type": "region", "code": "130929", "name": "献县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "866ff551-d442-4898-b436-78b351237a9a"], "path_name": ["中国", "河北省", "沧州市", "献县"], "status": "active", "sort": 2592, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "9693a3e9-c845-43f6-ac75-b83ee61242dc", "_rev": "2-edabec3e7d6edf181bdbe19080efd6bd", "type": "region", "code": "422826", "name": "咸丰县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "9693a3e9-c845-43f6-ac75-b83ee61242dc"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "咸丰县"], "status": "active", "sort": 2591, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "97ffd2dc-19f0-4445-9800-595a08d2fcaf", "_rev": "2-7c956465f5b0ebfe693becea04407bcd", "type": "region", "code": "340603", "name": "相山区", "parent_id": "5a306b32-cd23-49dc-910d-326cd0c36b00", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "5a306b32-cd23-49dc-910d-326cd0c36b00", "97ffd2dc-19f0-4445-9800-595a08d2fcaf"], "path_name": ["中国", "安徽省", "淮北市", "相山区"], "status": "active", "sort": 2597, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "bac3aab4-2274-4158-97f4-08ca9f7ccf8a", "_rev": "2-4628e669cc4125b5567e41db9321b92f", "type": "region", "code": "350602", "name": "芗城区", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "bac3aab4-2274-4158-97f4-08ca9f7ccf8a"], "path_name": ["中国", "福建省", "漳州市", "芗城区"], "status": "active", "sort": 2595, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "c3d2203a-e25a-4220-b7f0-594a4693c78d", "_rev": "2-10b254b5f30dcaf527f55bcec051f2c5", "type": "region", "code": "141029", "name": "乡宁县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "c3d2203a-e25a-4220-b7f0-594a4693c78d"], "path_name": ["中国", "山西省", "临汾市", "乡宁县"], "status": "active", "sort": 2594, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "d20ecdbc-f124-4d22-b28d-e5663134ef0f", "_rev": "2-bd4df0f5e6c76ff02961168ea545a179", "type": "region", "code": "513336", "name": "乡城县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "d20ecdbc-f124-4d22-b28d-e5663134ef0f"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "乡城县"], "status": "active", "sort": 2593, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:40"} +{"_id": "0b2e022a-894a-4393-aef4-e5009a60ab6d", "_rev": "2-46d885079758697d5aa491ca8e0434e8", "type": "region", "code": "440402", "name": "香洲区", "parent_id": "b7fabac9-498e-46d6-b70c-57d75f45f857", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7fabac9-498e-46d6-b70c-57d75f45f857", "0b2e022a-894a-4393-aef4-e5009a60ab6d"], "path_name": ["中国", "广东省", "珠海市", "香洲区"], "status": "active", "sort": 2603, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "640d0d14-238b-430b-9292-1a079363dd5f", "_rev": "2-996bf80a804402a9ea12ae78bfa11cad", "type": "region", "code": "131024", "name": "香河县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "640d0d14-238b-430b-9292-1a079363dd5f"], "path_name": ["中国", "河北省", "廊坊市", "香河县"], "status": "active", "sort": 2602, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "64cecd4b-17bd-4540-9d8b-95613238ab19", "_rev": "2-f1fbac83fdb9e507deff6054f3cfed1c", "type": "region", "code": "533401", "name": "香格里拉市", "parent_id": "22541e1f-4305-4e26-ab12-d13e07bca1be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "22541e1f-4305-4e26-ab12-d13e07bca1be", "64cecd4b-17bd-4540-9d8b-95613238ab19"], "path_name": ["中国", "云南省", "迪庆藏族自治州", "香格里拉市"], "status": "active", "sort": 2601, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "a492ebdf-8961-42e9-ab1d-9544934ba071", "_rev": "2-84763bd791c358a6cb0a7f5ae4e94dde", "type": "region", "code": "810000", "name": "直辖", "parent_id": "ee7ec754-2a9c-472d-ac78-0de2dd26d013", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ee7ec754-2a9c-472d-ac78-0de2dd26d013", "a492ebdf-8961-42e9-ab1d-9544934ba071"], "path_name": ["中国", "香港特别行政区", "直辖"], "status": "active", "sort": 2600, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "c3432b73-b94a-41f6-9460-c3a7714c5dc5", "_rev": "2-5cccb98b7cd5afde9e8abf9d2030b261", "type": "region", "code": "360313", "name": "湘东区", "parent_id": "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "10ec7c99-0dc3-49ec-a2c1-f63fe713cf79", "c3432b73-b94a-41f6-9460-c3a7714c5dc5"], "path_name": ["中国", "江西省", "萍乡市", "湘东区"], "status": "active", "sort": 2604, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "cec8bfba-70cc-4656-bba3-49965c215f31", "_rev": "2-68525a0c50791836c8bcabb862b644da", "type": "region", "code": "445102", "name": "湘桥区", "parent_id": "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a2e932e2-929d-4906-8e1b-4eaefdafbd60", "cec8bfba-70cc-4656-bba3-49965c215f31"], "path_name": ["中国", "广东省", "潮州市", "湘桥区"], "status": "active", "sort": 2605, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "ee7ec754-2a9c-472d-ac78-0de2dd26d013", "_rev": "2-2a0088ecde7c0a7ade65776bbe00cc36", "type": "region", "code": "810000", "name": "香港特别行政区", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ee7ec754-2a9c-472d-ac78-0de2dd26d013"], "path_name": ["中国", "香港特别行政区"], "status": "active", "sort": 2599, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:41"} +{"_id": "0bb1b7a8-3bd4-4541-a6cb-0a21a89dfa12", "_rev": "2-b2c8d79304a0cb6255a3200048afca78", "type": "region", "code": "430321", "name": "湘潭县", "parent_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960", "0bb1b7a8-3bd4-4541-a6cb-0a21a89dfa12"], "path_name": ["中国", "湖南省", "湘潭市", "湘潭县"], "status": "active", "sort": 2606, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:42"} +{"_id": "58b255a3-7f32-469d-aa1e-ec060bd634e6", "_rev": "2-914b1cf4e90e3a40984c2c08de3fd19b", "type": "region", "code": "420602", "name": "襄城区", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "58b255a3-7f32-469d-aa1e-ec060bd634e6"], "path_name": ["中国", "湖北省", "襄阳市", "襄城区"], "status": "active", "sort": 2609, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:42"} +{"_id": "ab1d7537-2d11-4c16-bd92-80fe3118d02c", "_rev": "2-84c91dd7d64baaec08eab8607ff75e60", "type": "region", "code": "430624", "name": "湘阴县", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "ab1d7537-2d11-4c16-bd92-80fe3118d02c"], "path_name": ["中国", "湖南省", "岳阳市", "湘阴县"], "status": "active", "sort": 2608, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:42"} +{"_id": "c9fcd9c7-1533-45df-a458-d951207b7a69", "_rev": "2-d083bf1b4087ed7e3fd59f29e04741b6", "type": "region", "code": "430381", "name": "湘乡市", "parent_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960", "c9fcd9c7-1533-45df-a458-d951207b7a69"], "path_name": ["中国", "湖南省", "湘潭市", "湘乡市"], "status": "active", "sort": 2607, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:42"} +{"_id": "e8b1eb3d-7711-41f8-bb66-669e74eb55a5", "_rev": "2-44da787839731c6409260101bb36e2b5", "type": "region", "code": "411025", "name": "襄城县", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "e8b1eb3d-7711-41f8-bb66-669e74eb55a5"], "path_name": ["中国", "河南省", "许昌市", "襄城县"], "status": "active", "sort": 2610, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:42"} +{"_id": "0c215a95-3773-4448-b50a-40c8eb1daa0a", "_rev": "2-f7ad519d3928f828779e658501ba08fe", "type": "region", "code": "152528", "name": "镶黄旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "0c215a95-3773-4448-b50a-40c8eb1daa0a"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "镶黄旗"], "status": "active", "sort": 2614, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "19e9bf8f-4696-4b22-b239-1bf1db40a077", "_rev": "2-93f2118c08a6253247f7592380acf858", "type": "region", "code": "140423", "name": "襄垣县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "19e9bf8f-4696-4b22-b239-1bf1db40a077"], "path_name": ["中国", "山西省", "长治市", "襄垣县"], "status": "active", "sort": 2612, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "2ebfb0f3-25bb-4a08-aabf-3d2d6681837d", "_rev": "2-9749f9782cb77ebe32d71f2b7ce45ab5", "type": "region", "code": "350213", "name": "翔安区", "parent_id": "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "9cbcf429-14f3-48aa-b4e3-8300c4a54094", "2ebfb0f3-25bb-4a08-aabf-3d2d6681837d"], "path_name": ["中国", "福建省", "厦门市", "翔安区"], "status": "active", "sort": 2617, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "4eae03bf-84a6-47f9-b802-5bd814b17054", "_rev": "2-b708103df6e953ed4907f3f2946a54f8", "type": "region", "code": "141023", "name": "襄汾县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "4eae03bf-84a6-47f9-b802-5bd814b17054"], "path_name": ["中国", "山西省", "临汾市", "襄汾县"], "status": "active", "sort": 2611, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "555b63d4-c73e-4478-8d79-74a0a6b26704", "_rev": "2-408b31fcdc1a4c7b17a5da253bf26819", "type": "region", "code": "420607", "name": "襄州区", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "555b63d4-c73e-4478-8d79-74a0a6b26704"], "path_name": ["中国", "湖北省", "襄阳市", "襄州区"], "status": "active", "sort": 2613, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "5d23d410-d75b-419c-af20-c3794f7fcc30", "_rev": "2-8844ef73e4735e65a1b4468b811dabf8", "type": "region", "code": "410212", "name": "祥符区", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "5d23d410-d75b-419c-af20-c3794f7fcc30"], "path_name": ["中国", "河南省", "开封市", "祥符区"], "status": "active", "sort": 2615, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "61e0fe93-a03b-4d0f-a8ef-dd777d17be98", "_rev": "2-53cdf9d86029f2de543e3c4fe348fb4d", "type": "region", "code": "320921", "name": "响水县", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "61e0fe93-a03b-4d0f-a8ef-dd777d17be98"], "path_name": ["中国", "江苏省", "盐城市", "响水县"], "status": "active", "sort": 2618, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "97ca951c-2d2d-4fc5-8818-8185104f7bcf", "_rev": "2-a41a9da86f38a769daa4597c0161ab80", "type": "region", "code": "532923", "name": "祥云县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "97ca951c-2d2d-4fc5-8818-8185104f7bcf"], "path_name": ["中国", "云南省", "大理白族自治州", "祥云县"], "status": "active", "sort": 2616, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:43"} +{"_id": "0370a2c8-f6ef-4e7c-8b38-304d796cec96", "_rev": "2-0fe2980d039b51785b93d7852c05206b", "type": "region", "code": "420505", "name": "猇亭区", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "0370a2c8-f6ef-4e7c-8b38-304d796cec96"], "path_name": ["中国", "湖北省", "宜昌市", "猇亭区"], "status": "active", "sort": 2625, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "5b47c4ea-387c-48bc-a4de-c0e7ed482048", "_rev": "2-02dd4d88794131f6a07464e39c280c96", "type": "region", "code": "341322", "name": "萧县", "parent_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "5b47c4ea-387c-48bc-a4de-c0e7ed482048"], "path_name": ["中国", "安徽省", "宿州市", "萧县"], "status": "active", "sort": 2624, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "6b803919-79fe-4a20-bb76-5ce09b22bb4c", "_rev": "2-1e154a4dc9041f0b0329b7a18c81c8f4", "type": "region", "code": "330109", "name": "萧山区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "6b803919-79fe-4a20-bb76-5ce09b22bb4c"], "path_name": ["中国", "浙江省", "杭州市", "萧山区"], "status": "active", "sort": 2623, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "89c389ad-0bac-456e-9005-853c5b615846", "_rev": "2-9c0ab244ec9eca69c1cb4ff3a2ffe672", "type": "region", "code": "451322", "name": "象州县", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "89c389ad-0bac-456e-9005-853c5b615846"], "path_name": ["中国", "广西壮族自治区", "来宾市", "象州县"], "status": "active", "sort": 2622, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "a7c6a993-ced0-4bdb-8a51-90cb425d4b8f", "_rev": "2-03e02030ac62109da048ec6d89c6069f", "type": "region", "code": "450304", "name": "象山区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "a7c6a993-ced0-4bdb-8a51-90cb425d4b8f"], "path_name": ["中国", "广西壮族自治区", "桂林市", "象山区"], "status": "active", "sort": 2620, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "b85826c3-e69e-4cbe-bf1c-3d76f768ed2c", "_rev": "2-3b1f60c733eb30dd3005d1a2de5d5e01", "type": "region", "code": "330225", "name": "象山县", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "b85826c3-e69e-4cbe-bf1c-3d76f768ed2c"], "path_name": ["中国", "浙江省", "宁波市", "象山县"], "status": "active", "sort": 2621, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "f0b13d7a-e032-4ad8-b68d-f9e86ac6e438", "_rev": "2-240742c1a8eebdded80dd116f43f946e", "type": "region", "code": "411681", "name": "项城市", "parent_id": "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "1f070ceb-db4c-42a4-8ed8-06bb3038c2e3", "f0b13d7a-e032-4ad8-b68d-f9e86ac6e438"], "path_name": ["中国", "河南省", "周口市", "项城市"], "status": "active", "sort": 2619, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:44"} +{"_id": "41264069-cf0a-4c1c-934b-af1326f70bab", "_rev": "2-a79afa15cdf655c0366d2ff9544c4048", "type": "region", "code": "540227", "name": "谢通门县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "41264069-cf0a-4c1c-934b-af1326f70bab"], "path_name": ["中国", "西藏自治区", "日喀则市", "谢通门县"], "status": "active", "sort": 2632, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "849bcfd0-d6ba-4155-aae9-8352bed4f0f9", "_rev": "2-3b2397f972c3c7ba252b15f088741aab", "type": "region", "code": "420921", "name": "孝昌县", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "849bcfd0-d6ba-4155-aae9-8352bed4f0f9"], "path_name": ["中国", "湖北省", "孝感市", "孝昌县"], "status": "active", "sort": 2628, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "97552f83-6725-4690-8cc2-923c8bc78d4e", "_rev": "2-40cb277e48107a20f61963f1602c2a83", "type": "region", "code": "130181", "name": "辛集市", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "97552f83-6725-4690-8cc2-923c8bc78d4e"], "path_name": ["中国", "河北省", "石家庄市", "辛集市"], "status": "active", "sort": 2633, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "a0e89bf5-526d-4550-8641-c9bc75eccc46", "_rev": "2-131db7738f012482624b63f1f3d1e635", "type": "region", "code": "340404", "name": "谢家集区", "parent_id": "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4024d294-8293-47f3-8ab1-dd9b7e1dfafb", "a0e89bf5-526d-4550-8641-c9bc75eccc46"], "path_name": ["中国", "安徽省", "淮南市", "谢家集区"], "status": "active", "sort": 2631, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "b1393eab-83c0-48f2-b27d-b9eb98563bac", "_rev": "2-eec59744ebd0c5070ded7e3479bb9f45", "type": "region", "code": "141181", "name": "孝义市", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "b1393eab-83c0-48f2-b27d-b9eb98563bac"], "path_name": ["中国", "山西省", "吕梁市", "孝义市"], "status": "active", "sort": 2630, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "b5f44bdb-67f9-4d39-9867-95140f70625a", "_rev": "2-b0b64ba57502a6b86a1a3da850992e2d", "type": "region", "code": "140105", "name": "小店区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "b5f44bdb-67f9-4d39-9867-95140f70625a"], "path_name": ["中国", "山西省", "太原市", "小店区"], "status": "active", "sort": 2626, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "c7896c66-5e65-4411-b400-355438926219", "_rev": "2-0a629c21c39ee80c6ae5c6f5c8e1648e", "type": "region", "code": "420902", "name": "孝南区", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "c7896c66-5e65-4411-b400-355438926219"], "path_name": ["中国", "湖北省", "孝感市", "孝南区"], "status": "active", "sort": 2629, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "f78d7661-ff59-4c5e-acbf-43381967075b", "_rev": "2-6c412682f95320b506df882328b8ed9d", "type": "region", "code": "513227", "name": "小金县", "parent_id": "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "9a37405d-d939-44ab-b2f6-e1c8b93d643e", "f78d7661-ff59-4c5e-acbf-43381967075b"], "path_name": ["中国", "四川省", "阿坝藏族羌族自治州", "小金县"], "status": "active", "sort": 2627, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:45"} +{"_id": "1e994ede-8ba6-45f7-893f-a13810874a4e", "_rev": "2-832cc456c43ccc92637dcd29c2f85676", "type": "region", "code": "410323", "name": "新安县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "1e994ede-8ba6-45f7-893f-a13810874a4e"], "path_name": ["中国", "河南省", "洛阳市", "新安县"], "status": "active", "sort": 2636, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "43a2f32d-9e5c-4da5-aeed-60f6fd8541b2", "_rev": "2-b6f4f19a23a87a5d2dad5aab626ae113", "type": "region", "code": "451321", "name": "忻城县", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "43a2f32d-9e5c-4da5-aeed-60f6fd8541b2"], "path_name": ["中国", "广西壮族自治区", "来宾市", "忻城县"], "status": "active", "sort": 2634, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "868b521b-b57d-42c5-a5ed-567c86e80e29", "_rev": "2-bad742090d3ac788255df23747e66f62", "type": "region", "code": "210422", "name": "新宾满族自治县", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "868b521b-b57d-42c5-a5ed-567c86e80e29"], "path_name": ["中国", "辽宁省", "抚顺市", "新宾满族自治县"], "status": "active", "sort": 2640, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "b2c30d0e-aada-407c-8ad9-87fb9e15dc29", "_rev": "2-1a58474bb7f1b2ee2e1c0ec5fc9dd2b2", "type": "region", "code": "320411", "name": "新北区", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "b2c30d0e-aada-407c-8ad9-87fb9e15dc29"], "path_name": ["中国", "江苏省", "常州市", "新北区"], "status": "active", "sort": 2639, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "c03bc002-de40-4274-a604-564206ccecac", "_rev": "2-8ac44f6cb5b0331f63a33d0e71c30ac6", "type": "region", "code": "411729", "name": "新蔡县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "c03bc002-de40-4274-a604-564206ccecac"], "path_name": ["中国", "河南省", "驻马店市", "新蔡县"], "status": "active", "sort": 2641, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "dfff5076-8b0c-4f3e-bf89-4c9c52266d00", "_rev": "2-ba32c5eb9aee09c8c4d3eed3a0f72c4b", "type": "region", "code": "150727", "name": "新巴尔虎右旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "dfff5076-8b0c-4f3e-bf89-4c9c52266d00"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "新巴尔虎右旗"], "status": "active", "sort": 2637, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "f6e78681-55a8-40cc-8e60-5b0d84d36b6a", "_rev": "2-03596676ec440ddc4d67558d55d0b28b", "type": "region", "code": "140902", "name": "忻府区", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "f6e78681-55a8-40cc-8e60-5b0d84d36b6a"], "path_name": ["中国", "山西省", "忻州市", "忻府区"], "status": "active", "sort": 2635, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "fab8ef1c-e819-4ac5-bc34-965ddbe08e7b", "_rev": "2-dec856498ff27c9de8914e0ba07a9604", "type": "region", "code": "150726", "name": "新巴尔虎左旗", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "fab8ef1c-e819-4ac5-bc34-965ddbe08e7b"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "新巴尔虎左旗"], "status": "active", "sort": 2638, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:46"} +{"_id": "13c80ba8-ca70-411b-9f8a-12d11c58303b", "_rev": "2-71f788907ac545930a42b45ce59424c4", "type": "region", "code": "210402", "name": "新抚区", "parent_id": "e9f1bb31-4607-4025-b7de-266dce0d6050", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e9f1bb31-4607-4025-b7de-266dce0d6050", "13c80ba8-ca70-411b-9f8a-12d11c58303b"], "path_name": ["中国", "辽宁省", "抚顺市", "新抚区"], "status": "active", "sort": 2645, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "35d56845-157c-4f9b-b8e1-2cdd79673c00", "_rev": "2-d483ebd48dd09c06aa37595a67878b89", "type": "region", "code": "440233", "name": "新丰县", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "35d56845-157c-4f9b-b8e1-2cdd79673c00"], "path_name": ["中国", "广东省", "韶关市", "新丰县"], "status": "active", "sort": 2644, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "3ddc9b48-4768-42dd-b5a9-24b73b31c1d7", "_rev": "2-d171231d7d6b640271d9c2c5cceec97f", "type": "region", "code": "431322", "name": "新化县", "parent_id": "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "5d456719-d56a-4b37-b5eb-e1524d2b11f1", "3ddc9b48-4768-42dd-b5a9-24b73b31c1d7"], "path_name": ["中国", "湖南省", "娄底市", "新化县"], "status": "active", "sort": 2649, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "48ca95ee-ff02-41fa-98e0-8ef0b2fa695a", "_rev": "2-491f29e06325f6112c5770ee9a0daa74", "type": "region", "code": "330624", "name": "新昌县", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "48ca95ee-ff02-41fa-98e0-8ef0b2fa695a"], "path_name": ["中国", "浙江省", "绍兴市", "新昌县"], "status": "active", "sort": 2642, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "55f5199b-5e35-45b7-b5d8-effe79c27b53", "_rev": "2-27201df45f33c4d89221eeff77701218", "type": "region", "code": "510114", "name": "新都区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "55f5199b-5e35-45b7-b5d8-effe79c27b53"], "path_name": ["中国", "四川省", "成都市", "新都区"], "status": "active", "sort": 2643, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "56590052-a652-49c7-a91e-ff4475fe1563", "_rev": "2-95da38292bef3314e0c83e8bd82a74f9", "type": "region", "code": "652925", "name": "新和县", "parent_id": "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "cc5ab23e-bc3b-4043-bab1-6b368b4ebafe", "56590052-a652-49c7-a91e-ff4475fe1563"], "path_name": ["中国", "新疆维吾尔自治区", "阿克苏地区", "新和县"], "status": "active", "sort": 2647, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "95ce1b9d-1cbb-4fa1-980f-76f95ec06bf2", "_rev": "2-ba07020066c6b9179932c9d592b575f0", "type": "region", "code": "360824", "name": "新干县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "95ce1b9d-1cbb-4fa1-980f-76f95ec06bf2"], "path_name": ["中国", "江西省", "吉安市", "新干县"], "status": "active", "sort": 2646, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "b5a9934c-3cb5-4e3f-b598-557023bc1459", "_rev": "2-877681f13da5c093292f52bcca1d0e0d", "type": "region", "code": "130530", "name": "新河县", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "b5a9934c-3cb5-4e3f-b598-557023bc1459"], "path_name": ["中国", "河北省", "邢台市", "新河县"], "status": "active", "sort": 2648, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:47"} +{"_id": "3a317a3e-74fe-4adc-a1a5-ec82ca345403", "_rev": "2-da0525aefd447fb8f9d9913a3d7ae07a", "type": "region", "code": "130184", "name": "新乐市", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "3a317a3e-74fe-4adc-a1a5-ec82ca345403"], "path_name": ["中国", "河北省", "石家庄市", "新乐市"], "status": "active", "sort": 2655, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "4142da6a-cc75-4e36-9693-57f435d14e21", "_rev": "2-cb372c3806250abbf41223e9fab76450", "type": "region", "code": "431227", "name": "新晃侗族自治县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "4142da6a-cc75-4e36-9693-57f435d14e21"], "path_name": ["中国", "湖南省", "怀化市", "新晃侗族自治县"], "status": "active", "sort": 2650, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "4ee33578-741f-4780-b39e-839c8aceeb38", "_rev": "2-57303d57ad5a653b394e09710fe6ed0f", "type": "region", "code": "140825", "name": "新绛县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "4ee33578-741f-4780-b39e-839c8aceeb38"], "path_name": ["中国", "山西省", "运城市", "新绛县"], "status": "active", "sort": 2653, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "51a86bd8-0833-4aeb-aa95-d80f8cd377bf", "_rev": "2-1a930d08b52aa6d986bc92bafcbc5039", "type": "region", "code": "440705", "name": "新会区", "parent_id": "751fe173-89d4-4ab7-9d9e-88552163bc42", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "751fe173-89d4-4ab7-9d9e-88552163bc42", "51a86bd8-0833-4aeb-aa95-d80f8cd377bf"], "path_name": ["中国", "广东省", "江门市", "新会区"], "status": "active", "sort": 2651, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "88e35957-25c5-46c2-aea0-8edd6101627d", "_rev": "2-4e6ed62c239362fbbfa7f56a813cd565", "type": "region", "code": "360112", "name": "新建区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "88e35957-25c5-46c2-aea0-8edd6101627d"], "path_name": ["中国", "江西省", "南昌市", "新建区"], "status": "active", "sort": 2652, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "920aadca-0edd-433a-a929-af7ae679b3f0", "_rev": "2-1e27502da14cb80a8415f8319001b6d3", "type": "region", "code": "510118", "name": "新津区", "parent_id": "783bd23c-8f7c-40e8-9199-f3512c797285", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "783bd23c-8f7c-40e8-9199-f3512c797285", "920aadca-0edd-433a-a929-af7ae679b3f0"], "path_name": ["中国", "四川省", "成都市", "新津区"], "status": "active", "sort": 2654, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:48"} +{"_id": "2f2640ef-36c5-4331-ad43-157a538a10b9", "_rev": "2-4357fbc3339e2179e39d90670f3de111", "type": "region", "code": "210181", "name": "新民市", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "2f2640ef-36c5-4331-ad43-157a538a10b9"], "path_name": ["中国", "辽宁省", "沈阳市", "新民市"], "status": "active", "sort": 2659, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "429202e2-7858-4563-9354-1a276740aa25", "_rev": "2-ff7f6e9f73b9ee23f8e1aedf77f7d173", "type": "region", "code": "530427", "name": "新平彝族傣族自治县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "429202e2-7858-4563-9354-1a276740aa25"], "path_name": ["中国", "云南省", "玉溪市", "新平彝族傣族自治县"], "status": "active", "sort": 2661, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "4b9973ea-6996-42e0-951d-eeeeb2a13fbe", "_rev": "2-4f93335540c50033871fa7c964cf3da8", "type": "region", "code": "430528", "name": "新宁县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "4b9973ea-6996-42e0-951d-eeeeb2a13fbe"], "path_name": ["中国", "湖南省", "邵阳市", "新宁县"], "status": "active", "sort": 2660, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "50a2b5e0-1653-4143-95d0-1f685f21fd81", "_rev": "2-2ea6daac723dbe459f5b9e33fce49672", "type": "region", "code": "210903", "name": "新邱区", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "50a2b5e0-1653-4143-95d0-1f685f21fd81"], "path_name": ["中国", "辽宁省", "阜新市", "新邱区"], "status": "active", "sort": 2662, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "909fecab-0e0d-494e-88e2-3521f57ac312", "_rev": "2-ed620258ebecac9fefb6a80494ac595a", "type": "region", "code": "513329", "name": "新龙县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "909fecab-0e0d-494e-88e2-3521f57ac312"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "新龙县"], "status": "active", "sort": 2656, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "91c3316c-488c-460c-ab29-424c6489e6f7", "_rev": "2-4eaf6183b0a1772dc9c14cb7567dcba6", "type": "region", "code": "410183", "name": "新密市", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "91c3316c-488c-460c-ab29-424c6489e6f7"], "path_name": ["中国", "河南省", "郑州市", "新密市"], "status": "active", "sort": 2658, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "ffc5e838-143e-428c-99c9-66d9e37114f2", "_rev": "2-c1bbf49f8e9268798d86da3f4a6bb9d4", "type": "region", "code": "350802", "name": "新罗区", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "ffc5e838-143e-428c-99c9-66d9e37114f2"], "path_name": ["中国", "福建省", "龙岩市", "新罗区"], "status": "active", "sort": 2657, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:49"} +{"_id": "5c0c884e-eb92-4ecc-9c61-b357376b7fa9", "_rev": "2-cfc4e24b4034edf4a22ad5f8f298faf1", "type": "region", "code": "320214", "name": "新吴区", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "5c0c884e-eb92-4ecc-9c61-b357376b7fa9"], "path_name": ["中国", "江苏省", "无锡市", "新吴区"], "status": "active", "sort": 2667, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "6b408429-b212-474b-8d4c-c7e2a54b96cc", "_rev": "2-49a666c6348bdecd320177896a005e87", "type": "region", "code": "650104", "name": "新市区", "parent_id": "3abd428f-0237-4555-bc6a-0185f7c66a20", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3abd428f-0237-4555-bc6a-0185f7c66a20", "6b408429-b212-474b-8d4c-c7e2a54b96cc"], "path_name": ["中国", "新疆维吾尔自治区", "乌鲁木齐市", "新市区"], "status": "active", "sort": 2664, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "6bd532ca-32da-420d-8a7d-d5cbfe509993", "_rev": "2-fb1deb90708e9a5f665381030a67b999", "type": "region", "code": "411523", "name": "新县", "parent_id": "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9f79dc3d-5a60-4562-8d8a-d6cea05feb32", "6bd532ca-32da-420d-8a7d-d5cbfe509993"], "path_name": ["中国", "河南省", "信阳市", "新县"], "status": "active", "sort": 2668, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "a41dbc01-4c5b-4de6-89cb-d3d877b382fb", "_rev": "2-bc577804925f750e3bf1d5b22e64598c", "type": "region", "code": "370982", "name": "新泰市", "parent_id": "6283fd4c-6615-407c-ab11-34187f45c7b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "6283fd4c-6615-407c-ab11-34187f45c7b7", "a41dbc01-4c5b-4de6-89cb-d3d877b382fb"], "path_name": ["中国", "山东省", "泰安市", "新泰市"], "status": "active", "sort": 2665, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "e91a1f80-3855-476c-8600-054e52b813a7", "_rev": "2-a016b45800777e37a460e1944e02c46d", "type": "region", "code": "430522", "name": "新邵县", "parent_id": "a1c77315-b929-48c2-ae83-44cb81785e5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "a1c77315-b929-48c2-ae83-44cb81785e5b", "e91a1f80-3855-476c-8600-054e52b813a7"], "path_name": ["中国", "湖南省", "邵阳市", "新邵县"], "status": "active", "sort": 2663, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "f3b49b1c-421d-4d22-b3e7-1d1b3e8ba335", "_rev": "2-9694799e11f12188b2e5926284972672", "type": "region", "code": "431128", "name": "新田县", "parent_id": "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "bb0b84cf-aece-4bab-aa06-95b9ac5604e2", "f3b49b1c-421d-4d22-b3e7-1d1b3e8ba335"], "path_name": ["中国", "湖南省", "永州市", "新田县"], "status": "active", "sort": 2666, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:50"} +{"_id": "4797dac3-5181-4783-8b48-9a1b6f342ec2", "_rev": "2-bb9db9a8c408e70629b13fb387ce7eff", "type": "region", "code": "230902", "name": "新兴区", "parent_id": "457b8969-a83b-457f-b231-06d5349d40a1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "457b8969-a83b-457f-b231-06d5349d40a1", "4797dac3-5181-4783-8b48-9a1b6f342ec2"], "path_name": ["中国", "黑龙江省", "七台河市", "新兴区"], "status": "active", "sort": 2670, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "5c0240d6-90d9-4029-ab4c-fa9802fa419c", "_rev": "2-dfd10b628b0634c7dfb179a48f819b62", "type": "region", "code": "410721", "name": "新乡县", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "5c0240d6-90d9-4029-ab4c-fa9802fa419c"], "path_name": ["中国", "河南省", "新乡市", "新乡县"], "status": "active", "sort": 2669, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "802e9035-b3e5-44f0-a97a-ea3bb7b0bc30", "_rev": "2-eaccd6caf7e45abf149352325d623073", "type": "region", "code": "410184", "name": "新郑市", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "802e9035-b3e5-44f0-a97a-ea3bb7b0bc30"], "path_name": ["中国", "河南省", "郑州市", "新郑市"], "status": "active", "sort": 2675, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "87d256ac-d1a9-4590-8f9e-7a95fee6a4a9", "_rev": "2-96524472daae1bcfd7f769f7b1b0e12d", "type": "region", "code": "411329", "name": "新野县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "87d256ac-d1a9-4590-8f9e-7a95fee6a4a9"], "path_name": ["中国", "河南省", "南阳市", "新野县"], "status": "active", "sort": 2672, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "9e0c6042-6a55-4ac5-9a05-1435d7785113", "_rev": "2-a5f73d8e9f6a1d476af7471c15e07875", "type": "region", "code": "445321", "name": "新兴县", "parent_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "9e0c6042-6a55-4ac5-9a05-1435d7785113"], "path_name": ["中国", "广东省", "云浮市", "新兴县"], "status": "active", "sort": 2671, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "cb17803c-1d06-47ab-ab3d-d8326370f33e", "_rev": "2-b793bbdde05c0229c33b942e8d5e4872", "type": "region", "code": "654025", "name": "新源县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "cb17803c-1d06-47ab-ab3d-d8326370f33e"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "新源县"], "status": "active", "sort": 2674, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "dbf061be-986f-4cd2-8a56-b7df39326f8f", "_rev": "2-e04dea0cc70324a04cef522671a45763", "type": "region", "code": "320381", "name": "新沂市", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "dbf061be-986f-4cd2-8a56-b7df39326f8f"], "path_name": ["中国", "江苏省", "徐州市", "新沂市"], "status": "active", "sort": 2673, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "f41b250e-f4bf-46f2-819d-8b41619cf987", "_rev": "2-69d8f7506858c7b03d275d855307d0fe", "type": "region", "code": "420117", "name": "新洲区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "f41b250e-f4bf-46f2-819d-8b41619cf987"], "path_name": ["中国", "湖北省", "武汉市", "新洲区"], "status": "active", "sort": 2676, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:51"} +{"_id": "04a9aacc-4acd-4429-8a6f-a1af05eb1caf", "_rev": "2-07adba246edd449d171a30dd6df89ca4", "type": "region", "code": "410182", "name": "荥阳市", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "04a9aacc-4acd-4429-8a6f-a1af05eb1caf"], "path_name": ["中国", "河南省", "郑州市", "荥阳市"], "status": "active", "sort": 2682, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "47c26104-a126-487e-97bb-20dac9350b0b", "_rev": "2-d017c8adedf88d22341912440ba9576e", "type": "region", "code": "511822", "name": "荥经县", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "47c26104-a126-487e-97bb-20dac9350b0b"], "path_name": ["中国", "四川省", "雅安市", "荥经县"], "status": "active", "sort": 2681, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "611b735d-f4db-4838-876f-810a7d9c93be", "_rev": "2-8c72cd6c3b5fad951fc21836d5e1059e", "type": "region", "code": "361102", "name": "信州区", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "611b735d-f4db-4838-876f-810a7d9c93be"], "path_name": ["中国", "江西省", "上饶市", "信州区"], "status": "active", "sort": 2679, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "762a7ed6-a305-4f6e-ab0d-7ce3e92d8cd9", "_rev": "2-c19ec308183d1fec8ce10298f4a068f6", "type": "region", "code": "360722", "name": "信丰县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "762a7ed6-a305-4f6e-ab0d-7ce3e92d8cd9"], "path_name": ["中国", "江西省", "赣州市", "信丰县"], "status": "active", "sort": 2677, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "8a37c671-58a9-4e76-a51f-11968a36987a", "_rev": "2-67d0db75912d96335188027355c7a1ed", "type": "region", "code": "440983", "name": "信宜市", "parent_id": "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "a6371aff-87e5-48bf-a5bb-26b838fe69e0", "8a37c671-58a9-4e76-a51f-11968a36987a"], "path_name": ["中国", "广东省", "茂名市", "信宜市"], "status": "active", "sort": 2678, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "90100c8f-e3bf-405e-8f18-75aee8dfe8a8", "_rev": "2-d9426a5bbf8416630ba1c429b8776348", "type": "region", "code": "130125", "name": "行唐县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "90100c8f-e3bf-405e-8f18-75aee8dfe8a8"], "path_name": ["中国", "河北省", "石家庄市", "行唐县"], "status": "active", "sort": 2680, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "bca379bd-8395-496b-bb02-440a7510955e", "_rev": "2-8dc82d51b4f436266d7b5f75a0547e16", "type": "region", "code": "450325", "name": "兴安县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "bca379bd-8395-496b-bb02-440a7510955e"], "path_name": ["中国", "广西壮族自治区", "桂林市", "兴安县"], "status": "active", "sort": 2683, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:52"} +{"_id": "19f0052e-5de2-45ed-9622-1edf6d9dbd8c", "_rev": "2-ad7e463a24209fa24fb714afbdbd8d03", "type": "region", "code": "211481", "name": "兴城市", "parent_id": "feb442ad-1072-46ee-a814-0ca247ae7e26", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "feb442ad-1072-46ee-a814-0ca247ae7e26", "19f0052e-5de2-45ed-9622-1edf6d9dbd8c"], "path_name": ["中国", "辽宁省", "葫芦岛市", "兴城市"], "status": "active", "sort": 2685, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "1b8d916a-8204-40af-be9b-13923f6f9aec", "_rev": "2-c90ba83cdfecac2f6f2b41a53ed2e508", "type": "region", "code": "321281", "name": "兴化市", "parent_id": "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "83d8f9d0-a36e-4ac5-b190-e56a48ec8dd7", "1b8d916a-8204-40af-be9b-13923f6f9aec"], "path_name": ["中国", "江苏省", "泰州市", "兴化市"], "status": "active", "sort": 2689, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "55d2ade2-68e6-4c1c-8d02-451be93a774d", "_rev": "2-633548a3b760bf4316d163d7d89b329f", "type": "region", "code": "632524", "name": "兴海县", "parent_id": "0af105a5-33f9-49b0-ace1-807dd3a967cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0af105a5-33f9-49b0-ace1-807dd3a967cd", "55d2ade2-68e6-4c1c-8d02-451be93a774d"], "path_name": ["中国", "青海省", "海南藏族自治州", "兴海县"], "status": "active", "sort": 2687, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "d5ec1211-61a4-4062-8b31-977f08ac8548", "_rev": "2-0b3ee9b56047111bae76b51d8b93c17e", "type": "region", "code": "150924", "name": "兴和县", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "d5ec1211-61a4-4062-8b31-977f08ac8548"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "兴和县"], "status": "active", "sort": 2688, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "e5b51205-856e-40d2-8b53-8e9b301fcd71", "_rev": "2-bdc84b9ce897e7fb34dd51cef1cca09e", "type": "region", "code": "360732", "name": "兴国县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "e5b51205-856e-40d2-8b53-8e9b301fcd71"], "path_name": ["中国", "江西省", "赣州市", "兴国县"], "status": "active", "sort": 2686, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "f465b246-d866-4964-8a8b-5b5d3645165b", "_rev": "2-acb6ba1bb657ad7c47b8e1deb9204e5d", "type": "region", "code": "451302", "name": "兴宾区", "parent_id": "218e190a-7140-43f6-89db-e48db7f443ee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "218e190a-7140-43f6-89db-e48db7f443ee", "f465b246-d866-4964-8a8b-5b5d3645165b"], "path_name": ["中国", "广西壮族自治区", "来宾市", "兴宾区"], "status": "active", "sort": 2684, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:53"} +{"_id": "05ab8a9d-a12b-4bbb-9c50-a3a5393726b2", "_rev": "2-5c1b9a05eddaf09140b6def48e92460c", "type": "region", "code": "130822", "name": "兴隆县", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "05ab8a9d-a12b-4bbb-9c50-a3a5393726b2"], "path_name": ["中国", "河北省", "承德市", "兴隆县"], "status": "active", "sort": 2691, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "8aabe6c1-46e4-4f16-963a-8209654c1afe", "_rev": "2-1608c6873c8a89cf1e80ad1e90a8b263", "type": "region", "code": "441481", "name": "兴宁市", "parent_id": "2872c59c-c92a-46f4-9141-3f7f07d79078", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "2872c59c-c92a-46f4-9141-3f7f07d79078", "8aabe6c1-46e4-4f16-963a-8209654c1afe"], "path_name": ["中国", "广东省", "梅州市", "兴宁市"], "status": "active", "sort": 2693, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "a92e1647-ee43-48e6-88b9-8e4e0fc4786c", "_rev": "2-32a6f5ab299addf93959e60f58206d5a", "type": "region", "code": "450102", "name": "兴宁区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "a92e1647-ee43-48e6-88b9-8e4e0fc4786c"], "path_name": ["中国", "广西壮族自治区", "南宁市", "兴宁区"], "status": "active", "sort": 2692, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "c5f8ad3a-e6a1-4bc5-879e-75a631157469", "_rev": "2-a93ab2b2f0020f009f7e3e3b1b4bc07d", "type": "region", "code": "211103", "name": "兴隆台区", "parent_id": "2729f5aa-8f01-438d-b063-a39d05296b69", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "2729f5aa-8f01-438d-b063-a39d05296b69", "c5f8ad3a-e6a1-4bc5-879e-75a631157469"], "path_name": ["中国", "辽宁省", "盘锦市", "兴隆台区"], "status": "active", "sort": 2690, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "d8ec810d-9f68-46b8-946e-9ba0aba745e1", "_rev": "2-d17042158ce66111e495729cf0e498d3", "type": "region", "code": "640104", "name": "兴庆区", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "d8ec810d-9f68-46b8-946e-9ba0aba745e1"], "path_name": ["中国", "宁夏回族自治区", "银川市", "兴庆区"], "status": "active", "sort": 2695, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "e47a4855-8b81-4cad-a8a0-0ad47d46b8c6", "_rev": "2-0b9f34fb79f862eb7eee489e032eb430", "type": "region", "code": "610481", "name": "兴平市", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "e47a4855-8b81-4cad-a8a0-0ad47d46b8c6"], "path_name": ["中国", "陕西省", "咸阳市", "兴平市"], "status": "active", "sort": 2694, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:54"} +{"_id": "530a9be0-4cbb-4715-ba8b-aa5db24ccbac", "_rev": "2-519e88e8aada0c5a2147ac58fd453000", "type": "region", "code": "511528", "name": "兴文县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "530a9be0-4cbb-4715-ba8b-aa5db24ccbac"], "path_name": ["中国", "四川省", "宜宾市", "兴文县"], "status": "active", "sort": 2698, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:55"} +{"_id": "59f20320-9e82-4365-b5ab-476e8b35ae1a", "_rev": "2-51b8031eafc41e5017b87ec439e59f2d", "type": "region", "code": "522302", "name": "兴仁市", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "59f20320-9e82-4365-b5ab-476e8b35ae1a"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "兴仁市"], "status": "active", "sort": 2696, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:55"} +{"_id": "9158c15e-4bf6-471b-83ba-7c2bf4a5db59", "_rev": "2-48ac58612f20b065ee6988b79c60f6ff", "type": "region", "code": "420526", "name": "兴山县", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "9158c15e-4bf6-471b-83ba-7c2bf4a5db59"], "path_name": ["中国", "湖北省", "宜昌市", "兴山县"], "status": "active", "sort": 2697, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:55"} +{"_id": "0dee0c2c-c600-42ec-925c-c07ad05e071a", "_rev": "2-65adb320ac18b3cbf26e8c4327ea1782", "type": "region", "code": "130638", "name": "雄县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "0dee0c2c-c600-42ec-925c-c07ad05e071a"], "path_name": ["中国", "河北省", "保定市", "雄县"], "status": "active", "sort": 2703, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "110bf589-f1ac-4e28-9244-5c7323877b5b", "_rev": "2-d195ba37652442f7fa9c9251e4725570", "type": "region", "code": "522301", "name": "兴义市", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "110bf589-f1ac-4e28-9244-5c7323877b5b"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "兴义市"], "status": "active", "sort": 2701, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "502fb4b9-aeff-4884-b89f-db660d10627a", "_rev": "2-3d8483bceb87027fb4ab223860fd0234", "type": "region", "code": "450924", "name": "兴业县", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "502fb4b9-aeff-4884-b89f-db660d10627a"], "path_name": ["中国", "广西壮族自治区", "玉林市", "兴业县"], "status": "active", "sort": 2700, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "55efcf87-199d-4a56-b38a-a1a3ddbbadb9", "_rev": "2-9afc16d0811762c70bf28cd6503a7002", "type": "region", "code": "140107", "name": "杏花岭区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "55efcf87-199d-4a56-b38a-a1a3ddbbadb9"], "path_name": ["中国", "山西省", "太原市", "杏花岭区"], "status": "active", "sort": 2702, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "7623ec1f-29a4-4674-a3b6-5aab5fb12bff", "_rev": "2-14ae262324b978c2837ceacb729babac", "type": "region", "code": "360424", "name": "修水县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "7623ec1f-29a4-4674-a3b6-5aab5fb12bff"], "path_name": ["中国", "江西省", "九江市", "修水县"], "status": "active", "sort": 2705, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "85df6efd-7292-4bd5-9952-622c24c72180", "_rev": "2-51f8d96403ddcf25fa70c3f23592c1cc", "type": "region", "code": "141123", "name": "兴县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "85df6efd-7292-4bd5-9952-622c24c72180"], "path_name": ["中国", "山西省", "吕梁市", "兴县"], "status": "active", "sort": 2699, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "bdf80ef6-3bfe-491c-ba40-baba85dfd359", "_rev": "2-2d30805bf40fa0f15aa36620cfae9af8", "type": "region", "code": "341022", "name": "休宁县", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "bdf80ef6-3bfe-491c-ba40-baba85dfd359"], "path_name": ["中国", "安徽省", "黄山市", "休宁县"], "status": "active", "sort": 2704, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:56"} +{"_id": "130c010a-134a-4fe0-be5f-a4f55cf11785", "_rev": "2-e6384b2d58af64fa928ad9a04e9d33f9", "type": "region", "code": "450302", "name": "秀峰区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "130c010a-134a-4fe0-be5f-a4f55cf11785"], "path_name": ["中国", "广西壮族自治区", "桂林市", "秀峰区"], "status": "active", "sort": 2708, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "a2b19f5e-4e86-4768-8e10-420fe06aaf33", "_rev": "2-64e9092263db2a65e40192d32b0e94a3", "type": "region", "code": "350305", "name": "秀屿区", "parent_id": "60031958-e67a-4094-8ab0-04087026e22e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "60031958-e67a-4094-8ab0-04087026e22e", "a2b19f5e-4e86-4768-8e10-420fe06aaf33"], "path_name": ["中国", "福建省", "莆田市", "秀屿区"], "status": "active", "sort": 2711, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "ae8e65ac-4b25-4c3f-9740-16957fe48c85", "_rev": "2-9c43e792664d10618f161477600ac269", "type": "region", "code": "460105", "name": "秀英区", "parent_id": "47252588-5858-42d8-b06b-be7953896c75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "47252588-5858-42d8-b06b-be7953896c75", "ae8e65ac-4b25-4c3f-9740-16957fe48c85"], "path_name": ["中国", "海南省", "海口市", "秀英区"], "status": "active", "sort": 2710, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "b63c8c8d-1923-4777-92c2-b2d2823af36a", "_rev": "2-382fc92a9c2941e04aa8a7b76659afe8", "type": "region", "code": "410821", "name": "修武县", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "b63c8c8d-1923-4777-92c2-b2d2823af36a"], "path_name": ["中国", "河南省", "焦作市", "修武县"], "status": "active", "sort": 2707, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "bbf30946-ea98-46a9-bf88-9108b08bf71b", "_rev": "2-ee129b72eb42682b6ef655eaae3d98f8", "type": "region", "code": "500241", "name": "秀山土家族苗族自治县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "bbf30946-ea98-46a9-bf88-9108b08bf71b"], "path_name": ["中国", "重庆市", "秀山土家族苗族自治县"], "status": "active", "sort": 2709, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "ebade4ec-c3da-4fde-a40d-f943599f65ac", "_rev": "2-4f09ce29de0910abb14206aa9430498e", "type": "region", "code": "520123", "name": "修文县", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "ebade4ec-c3da-4fde-a40d-f943599f65ac"], "path_name": ["中国", "贵州省", "贵阳市", "修文县"], "status": "active", "sort": 2706, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:57"} +{"_id": "7b66f7d1-14ad-4184-a10a-1007893c3b07", "_rev": "2-18876824c159f89fd1e2e0f45a154f50", "type": "region", "code": "210323", "name": "岫岩满族自治县", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "7b66f7d1-14ad-4184-a10a-1007893c3b07"], "path_name": ["中国", "辽宁省", "鞍山市", "岫岩满族自治县"], "status": "active", "sort": 2713, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:58"} +{"_id": "8c50e7c1-8961-41f8-8140-0be9abe427db", "_rev": "2-f0f0f5961a5abddc67e679ead17fab26", "type": "region", "code": "330411", "name": "秀洲区", "parent_id": "81b29181-d3ca-4eca-97df-062092a084d5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "81b29181-d3ca-4eca-97df-062092a084d5", "8c50e7c1-8961-41f8-8140-0be9abe427db"], "path_name": ["中国", "浙江省", "嘉兴市", "秀洲区"], "status": "active", "sort": 2712, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:58"} +{"_id": "9e34d16e-967e-42ce-9ca1-ef1bc42ab1ed", "_rev": "2-eebdaec7a5b7a4601bce8e3044a1d041", "type": "region", "code": "320830", "name": "盱眙县", "parent_id": "34384b3d-c349-49f5-97cd-497b027aa733", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "34384b3d-c349-49f5-97cd-497b027aa733", "9e34d16e-967e-42ce-9ca1-ef1bc42ab1ed"], "path_name": ["中国", "江苏省", "淮安市", "盱眙县"], "status": "active", "sort": 2714, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:58"} +{"_id": "1d644ad2-4c0f-41c9-9235-b4837add66a7", "_rev": "2-71b6d7e050915985783c5a4625d02f53", "type": "region", "code": "440825", "name": "徐闻县", "parent_id": "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "5b25002b-e9f1-4c15-b3bb-a9713dde8e76", "1d644ad2-4c0f-41c9-9235-b4837add66a7"], "path_name": ["中国", "广东省", "湛江市", "徐闻县"], "status": "active", "sort": 2717, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:59"} +{"_id": "928e7ef3-bb5b-460c-b453-026c431dd4cb", "_rev": "2-9edc3b7ba32678a5c5987d6a2b9499e0", "type": "region", "code": "130609", "name": "徐水区", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "928e7ef3-bb5b-460c-b453-026c431dd4cb"], "path_name": ["中国", "河北省", "保定市", "徐水区"], "status": "active", "sort": 2716, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:59"} +{"_id": "c00b20ec-c0b9-4265-bfcd-0062feec397c", "_rev": "2-48f6236a8209039e7be1e9ef49eb13c0", "type": "region", "code": "310104", "name": "徐汇区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "c00b20ec-c0b9-4265-bfcd-0062feec397c"], "path_name": ["中国", "上海市", "徐汇区"], "status": "active", "sort": 2715, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:03:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:03:59"} +{"_id": "0029f348-4165-413c-8206-29b5e0b2465c", "_rev": "2-3c9d56b433ce5d33e90df33ba617d0b1", "type": "region", "code": "422825", "name": "宣恩县", "parent_id": "006e7367-c780-47c1-b50c-e8b72f9e96f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "006e7367-c780-47c1-b50c-e8b72f9e96f9", "0029f348-4165-413c-8206-29b5e0b2465c"], "path_name": ["中国", "湖北省", "恩施土家族苗族自治州", "宣恩县"], "status": "active", "sort": 2721, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "11c656e1-b1bf-4ab3-83eb-9fb2f162f50b", "_rev": "2-d85a352a9fb2e141acb12e4aa55d870b", "type": "region", "code": "130705", "name": "宣化区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "11c656e1-b1bf-4ab3-83eb-9fb2f162f50b"], "path_name": ["中国", "河北省", "张家口市", "宣化区"], "status": "active", "sort": 2723, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "23aae779-9dbd-4301-8c13-53dd3b4743ca", "_rev": "2-7e3164a6c8bac9a4a6b2468452cdfeda", "type": "region", "code": "511504", "name": "叙州区", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "23aae779-9dbd-4301-8c13-53dd3b4743ca"], "path_name": ["中国", "四川省", "宜宾市", "叙州区"], "status": "active", "sort": 2719, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "2f48ddda-cbe2-4a57-9bc8-2905469903c6", "_rev": "2-a178d324dac21eb0cb53786b1f2ef9ad", "type": "region", "code": "510524", "name": "叙永县", "parent_id": "0844a4ff-3243-476e-be58-a1cbfe3b9318", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "0844a4ff-3243-476e-be58-a1cbfe3b9318", "2f48ddda-cbe2-4a57-9bc8-2905469903c6"], "path_name": ["中国", "四川省", "泸州市", "叙永县"], "status": "active", "sort": 2718, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "370a33b4-386b-4633-9b2e-5d54319a5e1d", "_rev": "2-14deee160075c7887fc6e434273954f1", "type": "region", "code": "511722", "name": "宣汉县", "parent_id": "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "ea0937e0-7bbd-4d40-b4c8-08e9433dd0de", "370a33b4-386b-4633-9b2e-5d54319a5e1d"], "path_name": ["中国", "四川省", "达州市", "宣汉县"], "status": "active", "sort": 2722, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "ccf745ed-6938-4b0e-92ff-b43e6fd65c80", "_rev": "2-51898900ed05de818836740e2d596c37", "type": "region", "code": "431224", "name": "溆浦县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "ccf745ed-6938-4b0e-92ff-b43e6fd65c80"], "path_name": ["中国", "湖南省", "怀化市", "溆浦县"], "status": "active", "sort": 2720, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:00"} +{"_id": "b72bede3-09a5-44f6-9d23-e1566315970c", "_rev": "2-1ad91e0e7beadeef30061a60fb93310e", "type": "region", "code": "530381", "name": "宣威市", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "b72bede3-09a5-44f6-9d23-e1566315970c"], "path_name": ["中国", "云南省", "曲靖市", "宣威市"], "status": "active", "sort": 2724, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:01"} +{"_id": "cd0a009c-7b0c-47d7-bf7c-ee9bfce4d7e0", "_rev": "2-e3627868b7a4ae82724afe675b931253", "type": "region", "code": "341802", "name": "宣州区", "parent_id": "07528f46-4960-4158-9e7a-a1330457d998", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "07528f46-4960-4158-9e7a-a1330457d998", "cd0a009c-7b0c-47d7-bf7c-ee9bfce4d7e0"], "path_name": ["中国", "安徽省", "宣城市", "宣州区"], "status": "active", "sort": 2725, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:01"} +{"_id": "3dc56a32-e3b9-40dd-a2dd-85b8f394416c", "_rev": "2-692677c6a862245d3d43b5cab237f181", "type": "region", "code": "530129", "name": "寻甸回族彝族自治县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "3dc56a32-e3b9-40dd-a2dd-85b8f394416c"], "path_name": ["中国", "云南省", "昆明市", "寻甸回族彝族自治县"], "status": "active", "sort": 2730, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "422efc02-4bfc-4ce9-855c-5a7cebca982a", "_rev": "2-e7c1cba039b2a736eb9f1c2f32c3c5fa", "type": "region", "code": "370403", "name": "薛城区", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "422efc02-4bfc-4ce9-855c-5a7cebca982a"], "path_name": ["中国", "山东省", "枣庄市", "薛城区"], "status": "active", "sort": 2727, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "726bb1c9-5012-424b-9464-d65d2f808ede", "_rev": "2-29a3ffc87c328315b3010ac53f506e3a", "type": "region", "code": "610429", "name": "旬邑县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "726bb1c9-5012-424b-9464-d65d2f808ede"], "path_name": ["中国", "陕西省", "咸阳市", "旬邑县"], "status": "active", "sort": 2729, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "ad9bf6b6-e795-42df-bef2-fa7e80637e7a", "_rev": "2-058b46507601e86d3728b17696029d0b", "type": "region", "code": "320102", "name": "玄武区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "ad9bf6b6-e795-42df-bef2-fa7e80637e7a"], "path_name": ["中国", "江苏省", "南京市", "玄武区"], "status": "active", "sort": 2726, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "b5c8fb21-bb30-484c-b8e4-5d06d5bc5bb1", "_rev": "2-079f4c797338da60b7b3d043a80fad01", "type": "region", "code": "360734", "name": "寻乌县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "b5c8fb21-bb30-484c-b8e4-5d06d5bc5bb1"], "path_name": ["中国", "江西省", "赣州市", "寻乌县"], "status": "active", "sort": 2731, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "f245e2f0-5f24-4590-8faa-b56a928872ea", "_rev": "2-a0a65a608c4a9a9de1124e79f06f5d19", "type": "region", "code": "610981", "name": "旬阳市", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "f245e2f0-5f24-4590-8faa-b56a928872ea"], "path_name": ["中国", "陕西省", "安康市", "旬阳市"], "status": "active", "sort": 2728, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:02"} +{"_id": "58bd3fc3-80a6-4aa5-b5f1-4dfbc183d1a5", "_rev": "2-16cb7fecde30b0c9442b2a25f4a62227", "type": "region", "code": "231123", "name": "逊克县", "parent_id": "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "b3642c1c-c4b0-41d1-b011-2e69c6669b67", "58bd3fc3-80a6-4aa5-b5f1-4dfbc183d1a5"], "path_name": ["中国", "黑龙江省", "黑河市", "逊克县"], "status": "active", "sort": 2734, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "5a873c94-99d0-4b2d-b1b9-bc0f003f7575", "_rev": "2-32f80e792fcbb6cb338e8fd87a4246d5", "type": "region", "code": "540233", "name": "亚东县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "5a873c94-99d0-4b2d-b1b9-bc0f003f7575"], "path_name": ["中国", "西藏自治区", "日喀则市", "亚东县"], "status": "active", "sort": 2738, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "986fa180-602a-419f-b839-670897faf93c", "_rev": "2-024844507a15c52b85d1818db1af4b85", "type": "region", "code": "460205", "name": "崖州区", "parent_id": "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "9451e451-b557-4227-a27a-90566ba8f9d8", "b30dbbda-23cd-4ebe-97fa-987d10f19ec3", "986fa180-602a-419f-b839-670897faf93c"], "path_name": ["中国", "海南省", "三亚市", "崖州区"], "status": "active", "sort": 2736, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "d8973dd5-1ec6-4bb7-a038-d159dad38c17", "_rev": "2-69aa447f272cab543ad678552a79eadf", "type": "region", "code": "630225", "name": "循化撒拉族自治县", "parent_id": "3ae36194-4fc1-437d-bd63-e194f59be715", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "3ae36194-4fc1-437d-bd63-e194f59be715", "d8973dd5-1ec6-4bb7-a038-d159dad38c17"], "path_name": ["中国", "青海省", "海东市", "循化撒拉族自治县"], "status": "active", "sort": 2733, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "e64f92ac-895b-46d5-bfff-9e1fe2428087", "_rev": "2-16bc85392d1d2b185b598798b5132102", "type": "region", "code": "360403", "name": "浔阳区", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "e64f92ac-895b-46d5-bfff-9e1fe2428087"], "path_name": ["中国", "江西省", "九江市", "浔阳区"], "status": "active", "sort": 2732, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "eb25d428-8290-4ede-8b1d-324318a52be6", "_rev": "2-5504f12209edb58bec61e1a43c1ce6b2", "type": "region", "code": "150782", "name": "牙克石市", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "eb25d428-8290-4ede-8b1d-324318a52be6"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "牙克石市"], "status": "active", "sort": 2735, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "ef5157ae-7cb2-4edc-91e1-bf93477f5ee0", "_rev": "2-57c332189dbd676ab5570779fb97f3eb", "type": "region", "code": "513325", "name": "雅江县", "parent_id": "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "fb8d1177-9e90-4c81-9eb4-33d8f2f8efa8", "ef5157ae-7cb2-4edc-91e1-bf93477f5ee0"], "path_name": ["中国", "四川省", "甘孜藏族自治州", "雅江县"], "status": "active", "sort": 2737, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "fca6a322-069b-472f-8216-c7d760fa96cc", "_rev": "2-39dbdf762e032360533e84ad17f41bfe", "type": "region", "code": "652826", "name": "焉耆回族自治县", "parent_id": "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7879272d-a0b5-4da4-8aca-cdb4d1e10e98", "fca6a322-069b-472f-8216-c7d760fa96cc"], "path_name": ["中国", "新疆维吾尔自治区", "巴音郭楞蒙古自治州", "焉耆回族自治县"], "status": "active", "sort": 2739, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:03"} +{"_id": "182870b2-dfc2-4335-9902-ea7df6eab66b", "_rev": "2-1ed0d78e9a339193ad537e767f29200d", "type": "region", "code": "610622", "name": "延川县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "182870b2-dfc2-4335-9902-ea7df6eab66b"], "path_name": ["中国", "陕西省", "延安市", "延川县"], "status": "active", "sort": 2741, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "3ced258c-7e75-415d-9d33-72f0ad3dbdb0", "_rev": "2-c0dd3b94324b209ef7a9e2a07fb83895", "type": "region", "code": "350702", "name": "延平区", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "3ced258c-7e75-415d-9d33-72f0ad3dbdb0"], "path_name": ["中国", "福建省", "南平市", "延平区"], "status": "active", "sort": 2744, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "5c90dde2-31be-4636-9571-02140536c101", "_rev": "2-9194e892947c01a8c85f445b0a5d5197", "type": "region", "code": "222401", "name": "延吉市", "parent_id": "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "af6eebce-ea2a-45b3-becd-a2ff60ec8d97", "5c90dde2-31be-4636-9571-02140536c101"], "path_name": ["中国", "吉林省", "延边朝鲜族自治州", "延吉市"], "status": "active", "sort": 2742, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "5d21f3fc-37d6-4b86-954b-de6c5c37ed06", "_rev": "2-4791c9cc31a61414cf85c2b35947d475", "type": "region", "code": "110119", "name": "延庆区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "5d21f3fc-37d6-4b86-954b-de6c5c37ed06"], "path_name": ["中国", "北京市", "延庆区"], "status": "active", "sort": 2745, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "83ee26f7-2afb-4065-b0e6-827e3c236b22", "_rev": "2-347d32c9ef6187ef24ef751313a7efbd", "type": "region", "code": "411024", "name": "鄢陵县", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "83ee26f7-2afb-4065-b0e6-827e3c236b22"], "path_name": ["中国", "河南省", "许昌市", "鄢陵县"], "status": "active", "sort": 2740, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "8845a820-89fb-46a2-bafa-37b3dc5be2bd", "_rev": "2-5e52b94477e49aad9b26b12d3cc5c61f", "type": "region", "code": "230129", "name": "延寿县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "8845a820-89fb-46a2-bafa-37b3dc5be2bd"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "延寿县"], "status": "active", "sort": 2746, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "a698ef74-7365-41e2-baf7-28d8dc20a85f", "_rev": "2-f3d7a6dfde69b0375db7174004003ab5", "type": "region", "code": "410726", "name": "延津县", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "a698ef74-7365-41e2-baf7-28d8dc20a85f"], "path_name": ["中国", "河南省", "新乡市", "延津县"], "status": "active", "sort": 2743, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:04"} +{"_id": "146ee780-a04f-4393-bdcd-c5d1ff9b2524", "_rev": "2-b07a0bba1ec66fec1c57f3241d4273f8", "type": "region", "code": "520627", "name": "沿河土家族自治县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "146ee780-a04f-4393-bdcd-c5d1ff9b2524"], "path_name": ["中国", "贵州省", "铜仁市", "沿河土家族自治县"], "status": "active", "sort": 2749, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "609f7193-9ef2-4d61-bc3e-65430f879cc7", "_rev": "2-d90c9ba7ccf76cf52d4f5272713e833c", "type": "region", "code": "640323", "name": "盐池县", "parent_id": "086d54f0-ca02-4210-b0e6-59840ab76858", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "086d54f0-ca02-4210-b0e6-59840ab76858", "609f7193-9ef2-4d61-bc3e-65430f879cc7"], "path_name": ["中国", "宁夏回族自治区", "吴忠市", "盐池县"], "status": "active", "sort": 2752, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "a7f6b7b2-269d-4bb8-a9ec-cef7bda9a656", "_rev": "2-6556f5f9832d710b0d2b271643f87de4", "type": "region", "code": "510311", "name": "沿滩区", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "a7f6b7b2-269d-4bb8-a9ec-cef7bda9a656"], "path_name": ["中国", "四川省", "自贡市", "沿滩区"], "status": "active", "sort": 2750, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "a97fadcb-51b6-4a9c-8dea-e39a2c8b8b77", "_rev": "2-baee375d66244bcc0352e779dea9dbea", "type": "region", "code": "510422", "name": "盐边县", "parent_id": "7497a7ff-bc70-460a-8575-5a102ec07971", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "7497a7ff-bc70-460a-8575-5a102ec07971", "a97fadcb-51b6-4a9c-8dea-e39a2c8b8b77"], "path_name": ["中国", "四川省", "攀枝花市", "盐边县"], "status": "active", "sort": 2751, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "f18f0c99-9478-42f0-b7de-2269a95e51de", "_rev": "2-29b5b8287214fd4d9c0bff213f610498", "type": "region", "code": "430225", "name": "炎陵县", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "f18f0c99-9478-42f0-b7de-2269a95e51de"], "path_name": ["中国", "湖南省", "株洲市", "炎陵县"], "status": "active", "sort": 2748, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "f7f7ef4c-c26d-4a6a-bfed-659594785a38", "_rev": "2-ff85756f4b8abb706e05f3860ce24d5d", "type": "region", "code": "610621", "name": "延长县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "f7f7ef4c-c26d-4a6a-bfed-659594785a38"], "path_name": ["中国", "陕西省", "延安市", "延长县"], "status": "active", "sort": 2747, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:05"} +{"_id": "2c25488b-298a-4c66-9fb6-956a561547bc", "_rev": "2-2ee3e55feb424e968f9b30371a30dc1c", "type": "region", "code": "510723", "name": "盐亭县", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "2c25488b-298a-4c66-9fb6-956a561547bc"], "path_name": ["中国", "四川省", "绵阳市", "盐亭县"], "status": "active", "sort": 2758, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "30bae779-2f5c-47ed-bfdd-374f91fcb002", "_rev": "2-54f801f27086962ffd12402583c329cf", "type": "region", "code": "320903", "name": "盐都区", "parent_id": "69fdc9ac-d158-40a7-99df-0308440a86d9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "69fdc9ac-d158-40a7-99df-0308440a86d9", "30bae779-2f5c-47ed-bfdd-374f91fcb002"], "path_name": ["中国", "江苏省", "盐城市", "盐都区"], "status": "active", "sort": 2753, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "3e9e2f16-ea39-407c-9d8c-0e6da170cf29", "_rev": "2-045c42fd735526b409ac66b4a68fa8f4", "type": "region", "code": "440308", "name": "盐田区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "3e9e2f16-ea39-407c-9d8c-0e6da170cf29"], "path_name": ["中国", "广东省", "深圳市", "盐田区"], "status": "active", "sort": 2757, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "4e2d38e4-9d5d-46b6-a4a3-a5df8a786e1a", "_rev": "2-7843e02891135b31ee39d86b0573ebbc", "type": "region", "code": "130925", "name": "盐山县", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "4e2d38e4-9d5d-46b6-a4a3-a5df8a786e1a"], "path_name": ["中国", "河北省", "沧州市", "盐山县"], "status": "active", "sort": 2756, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "9049fd7c-2199-413d-8339-52a7e7a542b4", "_rev": "2-c60fed6e40911db1490a33cf4aa0039b", "type": "region", "code": "140802", "name": "盐湖区", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "9049fd7c-2199-413d-8339-52a7e7a542b4"], "path_name": ["中国", "山西省", "运城市", "盐湖区"], "status": "active", "sort": 2754, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "c6872403-853f-4983-93e8-6366dc5cda53", "_rev": "2-6c41e4a763cc325c6667df18fb8dccd8", "type": "region", "code": "513423", "name": "盐源县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "c6872403-853f-4983-93e8-6366dc5cda53"], "path_name": ["中国", "四川省", "凉山彝族自治州", "盐源县"], "status": "active", "sort": 2759, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "f1438c5c-b971-49ea-89f2-0d152d0658ec", "_rev": "2-9a4c17cd05011c3f4681a8207e37c50f", "type": "region", "code": "530623", "name": "盐津县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "f1438c5c-b971-49ea-89f2-0d152d0658ec"], "path_name": ["中国", "云南省", "昭通市", "盐津县"], "status": "active", "sort": 2755, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:06"} +{"_id": "3a0af68a-329f-4a56-962f-4ad3b4744e0c", "_rev": "2-6c10fb635e27b3ef72e0d71537743a00", "type": "region", "code": "610114", "name": "阎良区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "3a0af68a-329f-4a56-962f-4ad3b4744e0c"], "path_name": ["中国", "陕西省", "西安市", "阎良区"], "status": "active", "sort": 2760, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "55e991d2-aacb-41de-a561-2d6f83697f8d", "_rev": "2-1b4a7c8cf694a44e5aeb3e2ffc647c82", "type": "region", "code": "532622", "name": "砚山县", "parent_id": "c3552067-a338-4778-9194-8f263ff50891", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "c3552067-a338-4778-9194-8f263ff50891", "55e991d2-aacb-41de-a561-2d6f83697f8d"], "path_name": ["中国", "云南省", "文山壮族苗族自治州", "砚山县"], "status": "active", "sort": 2764, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "5f87df62-e374-458a-a634-47698834d716", "_rev": "2-881f85f890f49ece764a2415d88501c5", "type": "region", "code": "411103", "name": "郾城区", "parent_id": "d41f466d-690a-4104-b545-35ba392a52d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2", "5f87df62-e374-458a-a634-47698834d716"], "path_name": ["中国", "河南省", "漯河市", "郾城区"], "status": "active", "sort": 2762, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "6ef47ce8-78d1-4cc5-8188-657be20ee244", "_rev": "2-ccaaf00e749beab1ee8b49f88ea9be89", "type": "region", "code": "430406", "name": "雁峰区", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "6ef47ce8-78d1-4cc5-8188-657be20ee244"], "path_name": ["中国", "湖南省", "衡阳市", "雁峰区"], "status": "active", "sort": 2765, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "c8c0b5f0-0f02-4c0a-90d8-9773c3bb30ce", "_rev": "2-92bc213e2af095e511de37f34e382f6b", "type": "region", "code": "370812", "name": "兖州区", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "c8c0b5f0-0f02-4c0a-90d8-9773c3bb30ce"], "path_name": ["中国", "山东省", "济宁市", "兖州区"], "status": "active", "sort": 2761, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "ea14bc10-16eb-4382-b699-95a6751c7dbd", "_rev": "2-475b9d0cf57050c190e4407c66fa2d0f", "type": "region", "code": "512002", "name": "雁江区", "parent_id": "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "acc6d237-1be9-4f80-ad2c-e75ac22e5ff3", "ea14bc10-16eb-4382-b699-95a6751c7dbd"], "path_name": ["中国", "四川省", "资阳市", "雁江区"], "status": "active", "sort": 2766, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "ee12b778-11e5-4466-853f-a87246b26bbe", "_rev": "2-9f9154808a64ece72c5bd496b685ff10", "type": "region", "code": "410307", "name": "偃师区", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "ee12b778-11e5-4466-853f-a87246b26bbe"], "path_name": ["中国", "河南省", "洛阳市", "偃师区"], "status": "active", "sort": 2763, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:07"} +{"_id": "32f6528e-b401-4731-afdf-33cfe521ca0a", "_rev": "2-cae9a03649a36f7cf967f497a14b382d", "type": "region", "code": "441704", "name": "阳东区", "parent_id": "52904b33-a73a-4461-bf0f-e3e5521c68c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "52904b33-a73a-4461-bf0f-e3e5521c68c7", "32f6528e-b401-4731-afdf-33cfe521ca0a"], "path_name": ["中国", "广东省", "阳江市", "阳东区"], "status": "active", "sort": 2772, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "5d88b62b-8209-42cb-9197-82a503aa8cca", "_rev": "2-c75b5fd00044510d1a489233f434906e", "type": "region", "code": "441781", "name": "阳春市", "parent_id": "52904b33-a73a-4461-bf0f-e3e5521c68c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "52904b33-a73a-4461-bf0f-e3e5521c68c7", "5d88b62b-8209-42cb-9197-82a503aa8cca"], "path_name": ["中国", "广东省", "阳江市", "阳春市"], "status": "active", "sort": 2771, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "5eb7f607-3078-4764-bd57-5e51839b2943", "_rev": "2-b720b06e1e5c07e4e9b0536fb75ddc87", "type": "region", "code": "371521", "name": "阳谷县", "parent_id": "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "b0fe179c-6ccc-46e9-a125-5cee9e49a0c5", "5eb7f607-3078-4764-bd57-5e51839b2943"], "path_name": ["中国", "山东省", "聊城市", "阳谷县"], "status": "active", "sort": 2774, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "6f92f4b3-cdc6-43cd-bd4f-1574803be5fa", "_rev": "2-0edde14b724494ddac3c9e893e39ebf1", "type": "region", "code": "140221", "name": "阳高县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "6f92f4b3-cdc6-43cd-bd4f-1574803be5fa"], "path_name": ["中国", "山西省", "大同市", "阳高县"], "status": "active", "sort": 2773, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "70956d21-bf85-4a11-be72-aecfdc0fe9a6", "_rev": "2-cfa6fec0c64d58e6648b7e6d9924b204", "type": "region", "code": "610113", "name": "雁塔区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "70956d21-bf85-4a11-be72-aecfdc0fe9a6"], "path_name": ["中国", "陕西省", "西安市", "雁塔区"], "status": "active", "sort": 2768, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "80371c88-e65f-4d5c-93c1-7e38ea0fb0df", "_rev": "2-e74d137be04e5b0f59726a3760abcdbb", "type": "region", "code": "321182", "name": "扬中市", "parent_id": "f304f5dd-c2e4-449d-bf9a-75f01a140137", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "f304f5dd-c2e4-449d-bf9a-75f01a140137", "80371c88-e65f-4d5c-93c1-7e38ea0fb0df"], "path_name": ["中国", "江苏省", "镇江市", "扬中市"], "status": "active", "sort": 2769, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "d87faae0-ecb9-43eb-bc6e-620bbb9ddd2c", "_rev": "2-8afeda7c98caa024edcd46212e024308", "type": "region", "code": "140522", "name": "阳城县", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "d87faae0-ecb9-43eb-bc6e-620bbb9ddd2c"], "path_name": ["中国", "山西省", "晋城市", "阳城县"], "status": "active", "sort": 2770, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "e694fd44-8848-4345-ab63-a46c1eaba0f1", "_rev": "2-7ada26e1bbcd31f54e6feadaa97ff622", "type": "region", "code": "450311", "name": "雁山区", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "e694fd44-8848-4345-ab63-a46c1eaba0f1"], "path_name": ["中国", "广西壮族自治区", "桂林市", "雁山区"], "status": "active", "sort": 2767, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:08"} +{"_id": "13aedc53-41d2-4648-9dca-44ddeb1af12e", "_rev": "2-c9e51c419be94b94a630f0d8760b964d", "type": "region", "code": "371622", "name": "阳信县", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "13aedc53-41d2-4648-9dca-44ddeb1af12e"], "path_name": ["中国", "山东省", "滨州市", "阳信县"], "status": "active", "sort": 2781, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "613ada77-139a-424a-a693-ab838a5baa02", "_rev": "2-72e9679f393b13a1e91ac20cffea70fc", "type": "region", "code": "130727", "name": "阳原县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "613ada77-139a-424a-a693-ab838a5baa02"], "path_name": ["中国", "河北省", "张家口市", "阳原县"], "status": "active", "sort": 2782, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "9708f579-d01b-4681-ac2a-c01214c8c340", "_rev": "2-5c7f586b71adb2d7b3f30a92ab6c6a5b", "type": "region", "code": "441721", "name": "阳西县", "parent_id": "52904b33-a73a-4461-bf0f-e3e5521c68c7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "52904b33-a73a-4461-bf0f-e3e5521c68c7", "9708f579-d01b-4681-ac2a-c01214c8c340"], "path_name": ["中国", "广东省", "阳江市", "阳西县"], "status": "active", "sort": 2779, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "9d9624be-b8ab-43fb-a2dd-7e792d3a1012", "_rev": "2-a8711316c4028c6e961d151d48e49440", "type": "region", "code": "441823", "name": "阳山县", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "9d9624be-b8ab-43fb-a2dd-7e792d3a1012"], "path_name": ["中国", "广东省", "清远市", "阳山县"], "status": "active", "sort": 2777, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "a46691bf-d8be-4e8c-96e1-07a9a70b1da7", "_rev": "2-647652ecc5da35816eb3d4f628f71043", "type": "region", "code": "231003", "name": "阳明区", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "a46691bf-d8be-4e8c-96e1-07a9a70b1da7"], "path_name": ["中国", "黑龙江省", "牡丹江市", "阳明区"], "status": "active", "sort": 2775, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "a8972333-7576-4ad1-8d9f-ffc066951e7a", "_rev": "2-822fc6104a90d72af2ef3cb4d99b7cd2", "type": "region", "code": "450321", "name": "阳朔县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "a8972333-7576-4ad1-8d9f-ffc066951e7a"], "path_name": ["中国", "广西壮族自治区", "桂林市", "阳朔县"], "status": "active", "sort": 2778, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "dfbe94df-0001-4095-a5c7-8fb9ee39727c", "_rev": "2-a8df4ba249316ea7b93d14e8b656b53a", "type": "region", "code": "420222", "name": "阳新县", "parent_id": "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "e1d6a4ca-370a-4fd0-8dff-582c53dad274", "dfbe94df-0001-4095-a5c7-8fb9ee39727c"], "path_name": ["中国", "湖北省", "黄石市", "阳新县"], "status": "active", "sort": 2780, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "f1d99051-20b4-4f0e-b9c6-34076b30e680", "_rev": "2-a4b8cdd9e72946be911c556ed8ade6d0", "type": "region", "code": "140122", "name": "阳曲县", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "f1d99051-20b4-4f0e-b9c6-34076b30e680"], "path_name": ["中国", "山西省", "太原市", "阳曲县"], "status": "active", "sort": 2776, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:09"} +{"_id": "0e3277cb-f400-41c9-8f3d-31195185c585", "_rev": "2-3966c0df37ed1fe596862d84a6c72ba8", "type": "region", "code": "610723", "name": "洋县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "0e3277cb-f400-41c9-8f3d-31195185c585"], "path_name": ["中国", "陕西省", "汉中市", "洋县"], "status": "active", "sort": 2785, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "28b3c674-f8a3-4122-a01e-60f5de5c338e", "_rev": "2-664ba16aaf8159213583f1f23ac44587", "type": "region", "code": "340102", "name": "瑶海区", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "28b3c674-f8a3-4122-a01e-60f5de5c338e"], "path_name": ["中国", "安徽省", "合肥市", "瑶海区"], "status": "active", "sort": 2789, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "52f4342f-d161-4b7f-83da-c52ceb67b95a", "_rev": "2-7128c94bb5678ccae2c67b0972fe0d7d", "type": "region", "code": "532325", "name": "姚安县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "52f4342f-d161-4b7f-83da-c52ceb67b95a"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "姚安县"], "status": "active", "sort": 2788, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "58ca5d6f-2462-43cc-ba71-117830c0c6c6", "_rev": "2-6287fde91a1443ec85ee9e693d19298b", "type": "region", "code": "610403", "name": "杨陵区", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "58ca5d6f-2462-43cc-ba71-117830c0c6c6"], "path_name": ["中国", "陕西省", "咸阳市", "杨陵区"], "status": "active", "sort": 2783, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "74782f8e-4a02-4eaa-9ce9-172bf08c8949", "_rev": "2-56fcdcd25f5c4085f23eb4a011c53c51", "type": "region", "code": "310110", "name": "杨浦区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "74782f8e-4a02-4eaa-9ce9-172bf08c8949"], "path_name": ["中国", "上海市", "杨浦区"], "status": "active", "sort": 2784, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "88ec43fd-d3fd-4f5e-a9e5-240ef204b289", "_rev": "2-87c52d12e4931871a5c86757131846de", "type": "region", "code": "532922", "name": "漾濞彝族自治县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "88ec43fd-d3fd-4f5e-a9e5-240ef204b289"], "path_name": ["中国", "云南省", "大理白族自治州", "漾濞彝族自治县"], "status": "active", "sort": 2786, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "a9cc956a-78e6-436f-a87e-78ce4f8c800e", "_rev": "2-3a53fc831d8ea9dee8384195f7cb5ea1", "type": "region", "code": "141002", "name": "尧都区", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "a9cc956a-78e6-436f-a87e-78ce4f8c800e"], "path_name": ["中国", "山西省", "临汾市", "尧都区"], "status": "active", "sort": 2787, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:10"} +{"_id": "129eb521-80bd-4525-9241-8ca2f6c1c76a", "_rev": "2-1f9f35a27b91897b3032a46b56e049ac", "type": "region", "code": "610204", "name": "耀州区", "parent_id": "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "129eb521-80bd-4525-9241-8ca2f6c1c76a"], "path_name": ["中国", "陕西省", "铜川市", "耀州区"], "status": "active", "sort": 2790, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "1e4549b5-0d52-4cf3-be13-e7524a70eda2", "_rev": "2-001f6f4f1b877b6a3160bbfd131bdf84", "type": "region", "code": "341504", "name": "叶集区", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "1e4549b5-0d52-4cf3-be13-e7524a70eda2"], "path_name": ["中国", "安徽省", "六安市", "叶集区"], "status": "active", "sort": 2792, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "2416ab6d-4188-4fb1-b7ad-c65784a6e2a2", "_rev": "2-7c17a90300c313f168695de869676513", "type": "region", "code": "410329", "name": "伊川县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "2416ab6d-4188-4fb1-b7ad-c65784a6e2a2"], "path_name": ["中国", "河南省", "洛阳市", "伊川县"], "status": "active", "sort": 2794, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "6d915a46-4e19-4f09-b04c-ee8c4d823a1b", "_rev": "2-695216ad3b590daf5dfa6073390f5f23", "type": "region", "code": "654021", "name": "伊宁县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "6d915a46-4e19-4f09-b04c-ee8c4d823a1b"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "伊宁县"], "status": "active", "sort": 2797, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "7e4b49e7-2587-4b9e-ab68-4222177fc1ae", "_rev": "2-ec209022e1b4c4a3b563231413672b05", "type": "region", "code": "653126", "name": "叶城县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "7e4b49e7-2587-4b9e-ab68-4222177fc1ae"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "叶城县"], "status": "active", "sort": 2791, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "c268813c-f225-4f4b-91b7-24aedec10989", "_rev": "2-ae5ea3e8544c20eb16cdde9bc2049dd5", "type": "region", "code": "150627", "name": "伊金霍洛旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "c268813c-f225-4f4b-91b7-24aedec10989"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "伊金霍洛旗"], "status": "active", "sort": 2795, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "e96da550-c58e-4b9b-b256-3e8ba2765fe3", "_rev": "2-023c6898b902ba5b0f294dea30eb0a75", "type": "region", "code": "654002", "name": "伊宁市", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "e96da550-c58e-4b9b-b256-3e8ba2765fe3"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "伊宁市"], "status": "active", "sort": 2796, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "f7dd9ac7-d48f-4f8f-b37e-2e2d0b0b1291", "_rev": "2-75ad230d19ce42541d75211ae6d67b8c", "type": "region", "code": "410422", "name": "叶县", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "f7dd9ac7-d48f-4f8f-b37e-2e2d0b0b1291"], "path_name": ["中国", "河南省", "平顶山市", "叶县"], "status": "active", "sort": 2793, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:11"} +{"_id": "12d1b31e-67b4-4132-ae5d-b67fd149e115", "_rev": "2-b4b1013f17887effa35ed05a8bac206c", "type": "region", "code": "321081", "name": "仪征市", "parent_id": "a7718be3-f983-49e5-88ec-2533b065984e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "a7718be3-f983-49e5-88ec-2533b065984e", "12d1b31e-67b4-4132-ae5d-b67fd149e115"], "path_name": ["中国", "江苏省", "扬州市", "仪征市"], "status": "active", "sort": 2805, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "267ce9b8-9093-4faf-b255-29a49e8223ca", "_rev": "2-8e79308619cdf8e05310129f3e8817ff", "type": "region", "code": "220323", "name": "伊通满族自治县", "parent_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50", "267ce9b8-9093-4faf-b255-29a49e8223ca"], "path_name": ["中国", "吉林省", "四平市", "伊通满族自治县"], "status": "active", "sort": 2798, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "51adb629-f6bf-48e8-b54d-625012b23856", "_rev": "2-a7a6cbe9fa9a41cf256e2986f042b840", "type": "region", "code": "341023", "name": "黟县", "parent_id": "057e3b35-7d92-440a-89d3-b9a9d44ab001", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "057e3b35-7d92-440a-89d3-b9a9d44ab001", "51adb629-f6bf-48e8-b54d-625012b23856"], "path_name": ["中国", "安徽省", "黄山市", "黟县"], "status": "active", "sort": 2803, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "a1b0a811-483c-451c-950e-86b6132c16e8", "_rev": "2-09361ddccb875726696debccdc0846dc", "type": "region", "code": "511324", "name": "仪陇县", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "a1b0a811-483c-451c-950e-86b6132c16e8"], "path_name": ["中国", "四川省", "南充市", "仪陇县"], "status": "active", "sort": 2804, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "b3979fec-1185-4414-b2cb-de61bf069d94", "_rev": "2-fc3bc97a2f9fc096bc5ca17f61366659", "type": "region", "code": "650502", "name": "伊州区", "parent_id": "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "b3979fec-1185-4414-b2cb-de61bf069d94"], "path_name": ["中国", "新疆维吾尔自治区", "哈密市", "伊州区"], "status": "active", "sort": 2800, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "b7af2a41-583b-4f15-8205-59fc189c22d1", "_rev": "2-9fcbfd54dd93f271c8fcb952a425c4ed", "type": "region", "code": "650522", "name": "伊吾县", "parent_id": "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "ed2580dc-5d77-43c3-b2b1-e2914eb5377c", "b7af2a41-583b-4f15-8205-59fc189c22d1"], "path_name": ["中国", "新疆维吾尔自治区", "哈密市", "伊吾县"], "status": "active", "sort": 2799, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "b9ffd7ad-edc9-41a4-ae60-b157e2a65e4f", "_rev": "2-ed23f1673fb0a1129db87df894a7c045", "type": "region", "code": "230223", "name": "依安县", "parent_id": "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3a868e2f-0afb-43f5-9a96-ebb29bd2b821", "b9ffd7ad-edc9-41a4-ae60-b157e2a65e4f"], "path_name": ["中国", "黑龙江省", "齐齐哈尔市", "依安县"], "status": "active", "sort": 2801, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "ed27ebf1-0cd6-40de-b8c2-f27f893fd842", "_rev": "2-3a499894c469175514f140838ba95208", "type": "region", "code": "230123", "name": "依兰县", "parent_id": "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e2f258f7-11b1-4a1a-82a3-9c0f6336d1b5", "ed27ebf1-0cd6-40de-b8c2-f27f893fd842"], "path_name": ["中国", "黑龙江省", "哈尔滨市", "依兰县"], "status": "active", "sort": 2802, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:12"} +{"_id": "11760d07-ca54-4d3e-a071-7979b07ea9c4", "_rev": "2-5c17bcab5848a6b4fc5cf806234c07b0", "type": "region", "code": "370323", "name": "沂源县", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "11760d07-ca54-4d3e-a071-7979b07ea9c4"], "path_name": ["中国", "山东省", "淄博市", "沂源县"], "status": "active", "sort": 2809, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "8d66c5ac-97ff-4bb0-9176-93cb09e87a61", "_rev": "2-9fbe02ca6fefaf8114d922aa867fe744", "type": "region", "code": "420581", "name": "宜都市", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "8d66c5ac-97ff-4bb0-9176-93cb09e87a61"], "path_name": ["中国", "湖北省", "宜昌市", "宜都市"], "status": "active", "sort": 2812, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "a6076a48-22eb-46dc-81b3-c3c66a3b9842", "_rev": "2-1a350881915875e74e326e4520244b12", "type": "region", "code": "610630", "name": "宜川县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "a6076a48-22eb-46dc-81b3-c3c66a3b9842"], "path_name": ["中国", "陕西省", "延安市", "宜川县"], "status": "active", "sort": 2811, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "ad862f10-beb9-49f3-bb44-1bf5f8002326", "_rev": "2-7d0569062f2f142166c03fb6b6635ec5", "type": "region", "code": "420684", "name": "宜城市", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "ad862f10-beb9-49f3-bb44-1bf5f8002326"], "path_name": ["中国", "湖北省", "襄阳市", "宜城市"], "status": "active", "sort": 2810, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "b9001dbc-8446-4d9d-9509-eb8cdb303145", "_rev": "2-e165cdd7052cf9e72c4c571b65b27816", "type": "region", "code": "371323", "name": "沂水县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "b9001dbc-8446-4d9d-9509-eb8cdb303145"], "path_name": ["中国", "山东省", "临沂市", "沂水县"], "status": "active", "sort": 2808, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "c8948ccd-e355-403a-817c-5eb680d7871d", "_rev": "2-b4100b08cf1bd9fcaffd84cb6b6a1af8", "type": "region", "code": "420506", "name": "夷陵区", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "c8948ccd-e355-403a-817c-5eb680d7871d"], "path_name": ["中国", "湖北省", "宜昌市", "夷陵区"], "status": "active", "sort": 2806, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "d2334bed-1c5b-4b36-852b-4d2fd4c1029a", "_rev": "2-451bab86ada002f678e07f69de1e1ea1", "type": "region", "code": "371321", "name": "沂南县", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "d2334bed-1c5b-4b36-852b-4d2fd4c1029a"], "path_name": ["中国", "山东省", "临沂市", "沂南县"], "status": "active", "sort": 2807, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:13"} +{"_id": "1d84dfdd-bb8c-434d-84af-2c16b2418fb0", "_rev": "2-50df17bda2a711da85f1e36090e946c9", "type": "region", "code": "530125", "name": "宜良县", "parent_id": "63a4e3b1-45eb-4669-a4d3-b0737459815f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "63a4e3b1-45eb-4669-a4d3-b0737459815f", "1d84dfdd-bb8c-434d-84af-2c16b2418fb0"], "path_name": ["中国", "云南省", "昆明市", "宜良县"], "status": "active", "sort": 2816, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "27e0ec10-13da-47c5-b1ba-4eaa1c235efb", "_rev": "2-e23676b6ad4c5fe614a02600744131ad", "type": "region", "code": "361026", "name": "宜黄县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "27e0ec10-13da-47c5-b1ba-4eaa1c235efb"], "path_name": ["中国", "江西省", "抚州市", "宜黄县"], "status": "active", "sort": 2814, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "305eed78-f48f-443f-9666-8646638d81f8", "_rev": "2-12d461cc9cf1bc7c02b2e4052aca6fdb", "type": "region", "code": "320282", "name": "宜兴市", "parent_id": "522d3f22-7bd8-42b2-9e20-736733fb0a07", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "522d3f22-7bd8-42b2-9e20-736733fb0a07", "305eed78-f48f-443f-9666-8646638d81f8"], "path_name": ["中国", "江苏省", "无锡市", "宜兴市"], "status": "active", "sort": 2817, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "7adb771a-cf7a-45cb-aa2b-75e63b003c2b", "_rev": "2-02638db33fa2d4ecc0ed6fcbd29ce3dc", "type": "region", "code": "610222", "name": "宜君县", "parent_id": "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "7adb771a-cf7a-45cb-aa2b-75e63b003c2b"], "path_name": ["中国", "陕西省", "铜川市", "宜君县"], "status": "active", "sort": 2815, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "7efd5b58-077e-4167-bcfc-3b55336281e8", "_rev": "2-f3c116b30e26d70118c9fe08669be824", "type": "region", "code": "360924", "name": "宜丰县", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "7efd5b58-077e-4167-bcfc-3b55336281e8"], "path_name": ["中国", "江西省", "宜春市", "宜丰县"], "status": "active", "sort": 2813, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "8a129335-0907-4431-bed6-7822f650af41", "_rev": "2-d92309ef10bf76e42afaa7cbda809067", "type": "region", "code": "340811", "name": "宜秀区", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "8a129335-0907-4431-bed6-7822f650af41"], "path_name": ["中国", "安徽省", "安庆市", "宜秀区"], "status": "active", "sort": 2818, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:14"} +{"_id": "00db42db-71b2-4958-9f83-ddac57336c6e", "_rev": "2-546f5d66764ea9c5ae6c394a3779a74c", "type": "region", "code": "451203", "name": "宜州区", "parent_id": "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "2386b8d3-547d-4a9f-ad50-0ef10d38af7b", "00db42db-71b2-4958-9f83-ddac57336c6e"], "path_name": ["中国", "广西壮族自治区", "河池市", "宜州区"], "status": "active", "sort": 2821, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "092daa68-9233-4675-8339-a3d859b83a22", "_rev": "2-411a59159e8ab2f9ffde4c43bd42d4e4", "type": "region", "code": "530628", "name": "彝良县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "092daa68-9233-4675-8339-a3d859b83a22"], "path_name": ["中国", "云南省", "昭通市", "彝良县"], "status": "active", "sort": 2822, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "0cbde181-c5ad-490c-926a-dd64b3b2a951", "_rev": "2-b22e7eab6397a7dc86096e912e441eac", "type": "region", "code": "410327", "name": "宜阳县", "parent_id": "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "2f92a62a-651c-4c62-8ad9-5ffff074ad82", "0cbde181-c5ad-490c-926a-dd64b3b2a951"], "path_name": ["中国", "河南省", "洛阳市", "宜阳县"], "status": "active", "sort": 2819, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "62b6d6a3-e088-44b3-87ad-51f77f2c7958", "_rev": "2-d4dd42ca39f9a859f72bde4937c56356", "type": "region", "code": "411281", "name": "义马市", "parent_id": "9236183a-68f0-4d94-9c75-80286fb5ce16", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "9236183a-68f0-4d94-9c75-80286fb5ce16", "62b6d6a3-e088-44b3-87ad-51f77f2c7958"], "path_name": ["中国", "河南省", "三门峡市", "义马市"], "status": "active", "sort": 2826, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "93f2c5cc-bcab-43a6-bf4d-2b90f90fc69a", "_rev": "2-ab905ea79b1bb2b8470c064e1ea06096", "type": "region", "code": "340209", "name": "弋江区", "parent_id": "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "1eee2734-deac-4c9d-85cc-b89b9aa18f06", "93f2c5cc-bcab-43a6-bf4d-2b90f90fc69a"], "path_name": ["中国", "安徽省", "芜湖市", "弋江区"], "status": "active", "sort": 2823, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "953cbec3-babd-4d4e-9e1b-9f3ba1d55a3b", "_rev": "2-99f7ce84244e631e6d057440ae94da12", "type": "region", "code": "431022", "name": "宜章县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "953cbec3-babd-4d4e-9e1b-9f3ba1d55a3b"], "path_name": ["中国", "湖南省", "郴州市", "宜章县"], "status": "active", "sort": 2820, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "b90f25bb-c1bc-4775-b083-b6749ebe03f5", "_rev": "2-080b8c38d265e46df91dc59743e0bc80", "type": "region", "code": "340706", "name": "义安区", "parent_id": "71264234-0fc8-42ac-8ede-c65d1f42516f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "71264234-0fc8-42ac-8ede-c65d1f42516f", "b90f25bb-c1bc-4775-b083-b6749ebe03f5"], "path_name": ["中国", "安徽省", "铜陵市", "义安区"], "status": "active", "sort": 2825, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "bddc708b-82e6-4e7e-bb0e-eccc5aff2fd0", "_rev": "2-17531cdd5a7305ee5c12d2f8a913b414", "type": "region", "code": "361126", "name": "弋阳县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "bddc708b-82e6-4e7e-bb0e-eccc5aff2fd0"], "path_name": ["中国", "江西省", "上饶市", "弋阳县"], "status": "active", "sort": 2824, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:15"} +{"_id": "3d85a10a-0a0d-458b-8a97-75459725da7a", "_rev": "2-142c9f37d2ebe7073445efe13dc959a3", "type": "region", "code": "210727", "name": "义县", "parent_id": "1b1cc869-add9-4a89-964f-4321cd10ce89", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "1b1cc869-add9-4a89-964f-4321cd10ce89", "3d85a10a-0a0d-458b-8a97-75459725da7a"], "path_name": ["中国", "辽宁省", "锦州市", "义县"], "status": "active", "sort": 2828, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "45bb19ef-0f41-492f-a431-466bd32cfcd1", "_rev": "2-a5d9dd22dbc54ea05dd67e39b25336dd", "type": "region", "code": "330782", "name": "义乌市", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "45bb19ef-0f41-492f-a431-466bd32cfcd1"], "path_name": ["中国", "浙江省", "金华市", "义乌市"], "status": "active", "sort": 2827, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "78e42be1-e3ef-487d-9b1a-03dd81dfeaf4", "_rev": "2-4627dcf125d0569143e4bcb9d08f24b6", "type": "region", "code": "411702", "name": "驿城区", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "78e42be1-e3ef-487d-9b1a-03dd81dfeaf4"], "path_name": ["中国", "河南省", "驻马店市", "驿城区"], "status": "active", "sort": 2832, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "7f28b027-2e3b-4d3d-a10f-d1458e5e0879", "_rev": "2-01e9b866371d2c4fa6d362604a5e3fee", "type": "region", "code": "130633", "name": "易县", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "7f28b027-2e3b-4d3d-a10f-d1458e5e0879"], "path_name": ["中国", "河北省", "保定市", "易县"], "status": "active", "sort": 2830, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "c8a69edc-52c0-4157-91ea-1db633e3a35b", "_rev": "2-3913d27ca57b3173a227df08b2c0a129", "type": "region", "code": "370404", "name": "峄城区", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "c8a69edc-52c0-4157-91ea-1db633e3a35b"], "path_name": ["中国", "山东省", "枣庄市", "峄城区"], "status": "active", "sort": 2831, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "d7a72bc1-1e70-4ba4-9767-8547afa375de", "_rev": "2-ad20f758f6c7e698edfccb278adef0d8", "type": "region", "code": "530425", "name": "易门县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "d7a72bc1-1e70-4ba4-9767-8547afa375de"], "path_name": ["中国", "云南省", "玉溪市", "易门县"], "status": "active", "sort": 2829, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:16"} +{"_id": "099a4cd3-42d1-4ac5-8737-0787d4666dc5", "_rev": "2-3abcba62e83e2d780d8be296f2b4dfee", "type": "region", "code": "410505", "name": "殷都区", "parent_id": "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b04fabe3-44d4-4e4f-a87e-0a13cc6f6ed9", "099a4cd3-42d1-4ac5-8737-0787d4666dc5"], "path_name": ["中国", "河南省", "安阳市", "殷都区"], "status": "active", "sort": 2834, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "17cda3c3-c070-4709-b8d5-1ab648bce864", "_rev": "2-ff0004ff62a1c1ead47b3270b643071b", "type": "region", "code": "211202", "name": "银州区", "parent_id": "d558d142-a7ad-4cee-bcba-e18af7c1061d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "d558d142-a7ad-4cee-bcba-e18af7c1061d", "17cda3c3-c070-4709-b8d5-1ab648bce864"], "path_name": ["中国", "辽宁省", "铁岭市", "银州区"], "status": "active", "sort": 2836, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "4d94865b-17fe-4b5f-954e-fae98dd30765", "_rev": "2-a0e55bed5cfbbc0ee3bdb98c336cd8f5", "type": "region", "code": "450503", "name": "银海区", "parent_id": "365589cb-9802-4c16-a2c9-01214670c990", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "365589cb-9802-4c16-a2c9-01214670c990", "4d94865b-17fe-4b5f-954e-fae98dd30765"], "path_name": ["中国", "广西壮族自治区", "北海市", "银海区"], "status": "active", "sort": 2835, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "67adab0f-00e3-46f1-a582-34216d666a5c", "_rev": "2-7a2e5f738a9a5d8fcbd6a0de3bef0e42", "type": "region", "code": "141022", "name": "翼城县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "67adab0f-00e3-46f1-a582-34216d666a5c"], "path_name": ["中国", "山西省", "临汾市", "翼城县"], "status": "active", "sort": 2833, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "cfa9b3a1-2d4e-4e7e-a0d0-5776ced6a88e", "_rev": "2-14ed895ad00509d7bcf12c0f47249a5d", "type": "region", "code": "330212", "name": "鄞州区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "cfa9b3a1-2d4e-4e7e-a0d0-5776ced6a88e"], "path_name": ["中国", "浙江省", "宁波市", "鄞州区"], "status": "active", "sort": 2837, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "e558fb63-9287-41c4-8c77-63d068f27401", "_rev": "2-502352f4841060001a17d2e963a04bc8", "type": "region", "code": "520625", "name": "印江土家族苗族自治县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "e558fb63-9287-41c4-8c77-63d068f27401"], "path_name": ["中国", "贵州省", "铜仁市", "印江土家族苗族自治县"], "status": "active", "sort": 2838, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "f91ae931-88b2-4670-9163-3dc364ca3646", "_rev": "2-8ce7778fa89513904349979655c6ef87", "type": "region", "code": "610203", "name": "印台区", "parent_id": "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "d45cf21c-ccf5-4ed7-b6ab-6554a90f8b51", "f91ae931-88b2-4670-9163-3dc364ca3646"], "path_name": ["中国", "陕西省", "铜川市", "印台区"], "status": "active", "sort": 2839, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:17"} +{"_id": "161160ff-b85b-479f-8b60-fed6330cf333", "_rev": "2-eba2b2ef676ec19ff58308761cb66d35", "type": "region", "code": "130804", "name": "鹰手营子矿区", "parent_id": "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "32f92ec8-5317-43e5-b5bf-57a0d4b19783", "161160ff-b85b-479f-8b60-fed6330cf333"], "path_name": ["中国", "河北省", "承德市", "鹰手营子矿区"], "status": "active", "sort": 2845, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "24cb40fd-da12-42cc-b524-1efc66be2c0a", "_rev": "2-333b95d739771d4b0197d8d20170c686", "type": "region", "code": "441881", "name": "英德市", "parent_id": "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ee8c858b-2046-416f-b17a-8ca6b9be6e97", "24cb40fd-da12-42cc-b524-1efc66be2c0a"], "path_name": ["中国", "广东省", "清远市", "英德市"], "status": "active", "sort": 2842, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "317f7279-6ff5-402f-8a6d-e899cc99213f", "_rev": "2-50af49e7b40af3396aca6aae3096b4a9", "type": "region", "code": "140622", "name": "应县", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "317f7279-6ff5-402f-8a6d-e899cc99213f"], "path_name": ["中国", "山西省", "朔州市", "应县"], "status": "active", "sort": 2841, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "36fcf23c-0f66-464c-a3c1-0bf6d9859a7c", "_rev": "2-b33ce0685b2935217fd90e90e952b513", "type": "region", "code": "420981", "name": "应城市", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "36fcf23c-0f66-464c-a3c1-0bf6d9859a7c"], "path_name": ["中国", "湖北省", "孝感市", "应城市"], "status": "active", "sort": 2840, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "78e3df34-7487-4c66-ae35-de0d425df339", "_rev": "2-f2dd0e0fe97158156dad5f045beecae1", "type": "region", "code": "653123", "name": "英吉沙县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "78e3df34-7487-4c66-ae35-de0d425df339"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "英吉沙县"], "status": "active", "sort": 2843, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "823f693c-5239-4120-b75f-8ec698f0aee9", "_rev": "2-c17d7686eb13742a4d4f8a258ad515a1", "type": "region", "code": "421124", "name": "英山县", "parent_id": "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "9c37e74e-1e85-4b9e-87aa-fc86a0af87a4", "823f693c-5239-4120-b75f-8ec698f0aee9"], "path_name": ["中国", "湖北省", "黄冈市", "英山县"], "status": "active", "sort": 2844, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "f449dd57-db16-48da-be5f-73ab56520d86", "_rev": "2-4e4a0b6fb4ce2cfb4d9d7a89d67c2e46", "type": "region", "code": "340802", "name": "迎江区", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "f449dd57-db16-48da-be5f-73ab56520d86"], "path_name": ["中国", "安徽省", "安庆市", "迎江区"], "status": "active", "sort": 2846, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:18"} +{"_id": "18f2c008-0137-4c8f-b1b9-ce85a6d8e87b", "_rev": "2-4e8d8182be2843962176defa32a4d437", "type": "region", "code": "533123", "name": "盈江县", "parent_id": "be8debac-6125-42fb-bbae-6b6af4a53c9c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "be8debac-6125-42fb-bbae-6b6af4a53c9c", "18f2c008-0137-4c8f-b1b9-ce85a6d8e87b"], "path_name": ["中国", "云南省", "德宏傣族景颇族自治州", "盈江县"], "status": "active", "sort": 2848, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "2b48487a-f117-439e-ad7e-6dbab9f02b6f", "_rev": "2-d8d8808403d25727b2e3f22b6b72e7ed", "type": "region", "code": "341202", "name": "颍州区", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "2b48487a-f117-439e-ad7e-6dbab9f02b6f"], "path_name": ["中国", "安徽省", "阜阳市", "颍州区"], "status": "active", "sort": 2853, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "55269238-859f-40c8-98d8-849f0e1448a5", "_rev": "2-18d7d3d02624aee991d41315c5a5ac40", "type": "region", "code": "511322", "name": "营山县", "parent_id": "aadcf6b9-73fc-433e-95b6-c857242d4752", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "aadcf6b9-73fc-433e-95b6-c857242d4752", "55269238-859f-40c8-98d8-849f0e1448a5"], "path_name": ["中国", "四川省", "南充市", "营山县"], "status": "active", "sort": 2849, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "5ba449f4-f18e-4f75-ae57-199a99e9e25e", "_rev": "2-511e8e7529a790a3245b105f68fad421", "type": "region", "code": "140106", "name": "迎泽区", "parent_id": "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d59a04f7-bc5f-41bd-ab9a-15a81db9d8cb", "5ba449f4-f18e-4f75-ae57-199a99e9e25e"], "path_name": ["中国", "山西省", "太原市", "迎泽区"], "status": "active", "sort": 2847, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "8c928eff-6998-4788-b129-a8c04c277c92", "_rev": "2-ec71f121f18529cc66e106a5aed7d5db", "type": "region", "code": "341203", "name": "颍东区", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "8c928eff-6998-4788-b129-a8c04c277c92"], "path_name": ["中国", "安徽省", "阜阳市", "颍东区"], "status": "active", "sort": 2850, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "9307732f-d244-4904-83d7-60809b2077f2", "_rev": "2-31327e0bb9d24c183145aafa922f05a6", "type": "region", "code": "450109", "name": "邕宁区", "parent_id": "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "7c6b613f-9c0d-4211-9b95-7b06111c54fd", "9307732f-d244-4904-83d7-60809b2077f2"], "path_name": ["中国", "广西壮族自治区", "南宁市", "邕宁区"], "status": "active", "sort": 2854, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "9e0529a7-f264-444c-a509-92d87f11bba9", "_rev": "2-1f1e48cc651cfd9bc1792fbd28d924b4", "type": "region", "code": "341204", "name": "颍泉区", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "9e0529a7-f264-444c-a509-92d87f11bba9"], "path_name": ["中国", "安徽省", "阜阳市", "颍泉区"], "status": "active", "sort": 2851, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "b33d59ec-81ac-4c5c-b0f4-665d341232d8", "_rev": "2-75b13c26a2546934a4f56642a041fb49", "type": "region", "code": "341226", "name": "颍上县", "parent_id": "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "9d01d984-23f0-4dfb-aa04-8ff4a70e531a", "b33d59ec-81ac-4c5c-b0f4-665d341232d8"], "path_name": ["中国", "安徽省", "阜阳市", "颍上县"], "status": "active", "sort": 2852, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:19"} +{"_id": "26e92cb7-b1b9-45bc-8658-5209e0c692e1", "_rev": "2-eb9e70bf4dc14c59a266b3019d9743db", "type": "region", "code": "500118", "name": "永川区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "26e92cb7-b1b9-45bc-8658-5209e0c692e1"], "path_name": ["中国", "重庆市", "永川区"], "status": "active", "sort": 2858, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "34ff9171-db47-4978-b690-fa5a02cc2ff6", "_rev": "2-76defb568b075bbd97739395c69de1a3", "type": "region", "code": "530923", "name": "永德县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "34ff9171-db47-4978-b690-fa5a02cc2ff6"], "path_name": ["中国", "云南省", "临沧市", "永德县"], "status": "active", "sort": 2860, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "78fab6b9-91e5-491d-9e22-3843d1129b30", "_rev": "2-0dce051d442fe5e75edbdb846c00ec89", "type": "region", "code": "411481", "name": "永城市", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "78fab6b9-91e5-491d-9e22-3843d1129b30"], "path_name": ["中国", "河南省", "商丘市", "永城市"], "status": "active", "sort": 2857, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "981bc22b-bcc5-4e50-b87d-4751c2ef6f3d", "_rev": "2-c2066d6c6785929cd86cfdae64e03fbe", "type": "region", "code": "620321", "name": "永昌县", "parent_id": "63325c4e-3c74-48e2-8473-7975b1e78a92", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "63325c4e-3c74-48e2-8473-7975b1e78a92", "981bc22b-bcc5-4e50-b87d-4751c2ef6f3d"], "path_name": ["中国", "甘肃省", "金昌市", "永昌县"], "status": "active", "sort": 2856, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "dde0690e-00d4-499b-8b7f-5b281f51834d", "_rev": "2-6d105695b1ba9b3d3626c50095a8045f", "type": "region", "code": "350525", "name": "永春县", "parent_id": "a9ca8097-d46e-4881-9549-bb6d615b8e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "a9ca8097-d46e-4881-9549-bb6d615b8e57", "dde0690e-00d4-499b-8b7f-5b281f51834d"], "path_name": ["中国", "福建省", "泉州市", "永春县"], "status": "active", "sort": 2859, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "f5615761-3df8-454f-bf0e-d30e2d17488e", "_rev": "2-5be6d45caf8bd98f09c00eb2fcf34d83", "type": "region", "code": "350481", "name": "永安市", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "f5615761-3df8-454f-bf0e-d30e2d17488e"], "path_name": ["中国", "福建省", "三明市", "永安市"], "status": "active", "sort": 2855, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:20", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:20"} +{"_id": "229082b9-eb40-406f-b7ba-0a56abb844c7", "_rev": "2-818fb6d7f9880a3086256fe04243f204", "type": "region", "code": "620121", "name": "永登县", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "229082b9-eb40-406f-b7ba-0a56abb844c7"], "path_name": ["中国", "甘肃省", "兰州市", "永登县"], "status": "active", "sort": 2861, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:21"} +{"_id": "3f35de11-1982-4f51-9ace-00b26708ac5d", "_rev": "2-68318df0f3deee5b357ecf0f76eda3d6", "type": "region", "code": "450326", "name": "永福县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "3f35de11-1982-4f51-9ace-00b26708ac5d"], "path_name": ["中国", "广西壮族自治区", "桂林市", "永福县"], "status": "active", "sort": 2863, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:21"} +{"_id": "82b46414-e05c-45c6-8a64-887a85c4c004", "_rev": "2-ab96f4f24ba23e44214735582703e467", "type": "region", "code": "360825", "name": "永丰县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "82b46414-e05c-45c6-8a64-887a85c4c004"], "path_name": ["中国", "江西省", "吉安市", "永丰县"], "status": "active", "sort": 2862, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:21"} +{"_id": "cf41fcca-6d98-44d2-9a9c-b0a8a52c60ef", "_rev": "2-f6ab309d6ef16b294ad5f43a55b8a614", "type": "region", "code": "141032", "name": "永和县", "parent_id": "c03e860d-ebf0-4323-a157-0764e90168fe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "c03e860d-ebf0-4323-a157-0764e90168fe", "cf41fcca-6d98-44d2-9a9c-b0a8a52c60ef"], "path_name": ["中国", "山西省", "临汾市", "永和县"], "status": "active", "sort": 2864, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:21"} +{"_id": "e1728807-66ec-43a1-bb56-4780abb59d5a", "_rev": "2-9ffcb34eafc5b63185ec5b89c79a5c75", "type": "region", "code": "220221", "name": "永吉县", "parent_id": "1037e030-aa75-4dd9-8cb0-86be8b358d41", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "1037e030-aa75-4dd9-8cb0-86be8b358d41", "e1728807-66ec-43a1-bb56-4780abb59d5a"], "path_name": ["中国", "吉林省", "吉林市", "永吉县"], "status": "active", "sort": 2865, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:21", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:21"} +{"_id": "107b24a9-934b-49a7-8f92-4aa9a63ca2f8", "_rev": "2-83b2801c7c43b250fad69d5d13cc7748", "type": "region", "code": "330784", "name": "永康市", "parent_id": "97e27591-6146-42c0-9a1f-cb950ccc1c64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "97e27591-6146-42c0-9a1f-cb950ccc1c64", "107b24a9-934b-49a7-8f92-4aa9a63ca2f8"], "path_name": ["中国", "浙江省", "金华市", "永康市"], "status": "active", "sort": 2869, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "10f63f9f-7c78-491a-88d3-953b6700c3c9", "_rev": "2-b5e40e4e69644a43a4c72824e1d8cdcf", "type": "region", "code": "640121", "name": "永宁县", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "10f63f9f-7c78-491a-88d3-953b6700c3c9"], "path_name": ["中国", "宁夏回族自治区", "银川市", "永宁县"], "status": "active", "sort": 2871, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "5f264777-d62d-4a48-90e0-8a5def8da9ca", "_rev": "2-74c801eb3906a71624845246534647d0", "type": "region", "code": "330324", "name": "永嘉县", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "5f264777-d62d-4a48-90e0-8a5def8da9ca"], "path_name": ["中国", "浙江省", "温州市", "永嘉县"], "status": "active", "sort": 2867, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "6b064430-b26b-4fe8-b44a-e3a608a07083", "_rev": "2-88017dd2db60acddd1a5e068a3a2e4ca", "type": "region", "code": "130408", "name": "永年区", "parent_id": "84c086af-94ee-40f9-9046-e7efc10f7c9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "84c086af-94ee-40f9-9046-e7efc10f7c9f", "6b064430-b26b-4fe8-b44a-e3a608a07083"], "path_name": ["中国", "河北省", "邯郸市", "永年区"], "status": "active", "sort": 2870, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "cb53a6de-e4ba-49e7-bb68-959c1c4a4dfe", "_rev": "2-f853760c689e90c59201f0176fd11108", "type": "region", "code": "532928", "name": "永平县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "cb53a6de-e4ba-49e7-bb68-959c1c4a4dfe"], "path_name": ["中国", "云南省", "大理白族自治州", "永平县"], "status": "active", "sort": 2872, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "d1c87bd9-429e-44d5-8f71-fb88bcf4f03d", "_rev": "2-9749627a141157cc87ada4c12dba2f20", "type": "region", "code": "140881", "name": "永济市", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "d1c87bd9-429e-44d5-8f71-fb88bcf4f03d"], "path_name": ["中国", "山西省", "运城市", "永济市"], "status": "active", "sort": 2866, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "ef2185ca-6379-46d7-b46a-16319d152031", "_rev": "2-1fa9efa40edae0ec68718f4b32ca6543", "type": "region", "code": "622923", "name": "永靖县", "parent_id": "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "d04f0fb2-df49-4d7e-9c72-652bcb65a838", "ef2185ca-6379-46d7-b46a-16319d152031"], "path_name": ["中国", "甘肃省", "临夏回族自治州", "永靖县"], "status": "active", "sort": 2868, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:22", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:22"} +{"_id": "166faa50-e80a-417c-b719-197e13f1eb7c", "_rev": "2-bdc1c3ccc71bb5d533e4967c78f5bbf4", "type": "region", "code": "530625", "name": "永善县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "166faa50-e80a-417c-b719-197e13f1eb7c"], "path_name": ["中国", "云南省", "昭通市", "永善县"], "status": "active", "sort": 2875, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "16b3d9ea-19e0-4094-ae4c-b995dde4d761", "_rev": "2-1b56c86a2aab45d761b1f1acf8a8ed23", "type": "region", "code": "532327", "name": "永仁县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "16b3d9ea-19e0-4094-ae4c-b995dde4d761"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "永仁县"], "status": "active", "sort": 2874, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "2572a07b-f2ba-4928-a227-e9b5a3e79f9f", "_rev": "2-a710c73e70cc0ec91f723f2f57231bf0", "type": "region", "code": "530722", "name": "永胜县", "parent_id": "b712f371-149e-4b45-aa88-755c77561518", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518", "2572a07b-f2ba-4928-a227-e9b5a3e79f9f"], "path_name": ["中国", "云南省", "丽江市", "永胜县"], "status": "active", "sort": 2876, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "7bcbc9b8-fcb4-4440-b90b-cd42e5bfa88a", "_rev": "2-4f6cc4e9830d779788e61b97129a41dd", "type": "region", "code": "131023", "name": "永清县", "parent_id": "bee2622a-07c4-4b01-9c9b-b2529c675ade", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "bee2622a-07c4-4b01-9c9b-b2529c675ade", "7bcbc9b8-fcb4-4440-b90b-cd42e5bfa88a"], "path_name": ["中国", "河北省", "廊坊市", "永清县"], "status": "active", "sort": 2873, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "99368b3e-0619-4d5d-b7e9-4c27dd94ac48", "_rev": "2-c2cb324ccf48c5e845578877a60cd847", "type": "region", "code": "433127", "name": "永顺县", "parent_id": "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "84dbe938-41ca-40e1-9d18-c3e06b29bc4a", "99368b3e-0619-4d5d-b7e9-4c27dd94ac48"], "path_name": ["中国", "湖南省", "湘西土家族苗族自治州", "永顺县"], "status": "active", "sort": 2878, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "aa5bdab5-bf8e-4c73-bd67-f389569600b8", "_rev": "2-5fec435f2af10184dcdc00453bcab839", "type": "region", "code": "610426", "name": "永寿县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "aa5bdab5-bf8e-4c73-bd67-f389569600b8"], "path_name": ["中国", "陕西省", "咸阳市", "永寿县"], "status": "active", "sort": 2877, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:23", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:23"} +{"_id": "039bcfc3-1575-47a3-a269-60a606f59cab", "_rev": "2-1060753d755dca723bd22cad39101d28", "type": "region", "code": "360425", "name": "永修县", "parent_id": "0687eb8c-277e-43f9-88e6-0274e729cd75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0687eb8c-277e-43f9-88e6-0274e729cd75", "039bcfc3-1575-47a3-a269-60a606f59cab"], "path_name": ["中国", "江西省", "九江市", "永修县"], "status": "active", "sort": 2882, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "15a31e8b-c32e-4a42-b197-9b7abe499608", "_rev": "2-969f5274e7bd7071aaafe95e0034d614", "type": "region", "code": "360830", "name": "永新县", "parent_id": "0f060db1-a126-46c0-88a7-400639a495a0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "0f060db1-a126-46c0-88a7-400639a495a0", "15a31e8b-c32e-4a42-b197-9b7abe499608"], "path_name": ["中国", "江西省", "吉安市", "永新县"], "status": "active", "sort": 2880, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "4544e390-9b92-436b-bd95-a12553694e6d", "_rev": "2-08ddb504e3cae3f50035f97968596a29", "type": "region", "code": "430223", "name": "攸县", "parent_id": "2ce62fec-c9cd-4118-a473-b9042e326d57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "2ce62fec-c9cd-4118-a473-b9042e326d57", "4544e390-9b92-436b-bd95-a12553694e6d"], "path_name": ["中国", "湖南省", "株洲市", "攸县"], "status": "active", "sort": 2884, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "529bec43-adc1-46fd-96db-dc734569ec23", "_rev": "2-44dcffc9f5730e648c23446f25481e09", "type": "region", "code": "431023", "name": "永兴县", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "529bec43-adc1-46fd-96db-dc734569ec23"], "path_name": ["中国", "湖南省", "郴州市", "永兴县"], "status": "active", "sort": 2881, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "649a98a9-e6d7-416a-aab2-45a4614187f0", "_rev": "2-0d301b804d31acfb7f6bd12c2d5bae07", "type": "region", "code": "350125", "name": "永泰县", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "649a98a9-e6d7-416a-aab2-45a4614187f0"], "path_name": ["中国", "福建省", "福州市", "永泰县"], "status": "active", "sort": 2879, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "fbf2ede4-5354-406c-98ac-4c1376da5a02", "_rev": "2-c4a664723a7289a93a1e8a1f63b6d1cc", "type": "region", "code": "341302", "name": "埇桥区", "parent_id": "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "fbeaacdf-becb-43db-8ca3-be9cd0fdeb2f", "fbf2ede4-5354-406c-98ac-4c1376da5a02"], "path_name": ["中国", "安徽省", "宿州市", "埇桥区"], "status": "active", "sort": 2883, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:24", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:24"} +{"_id": "0cceba3f-312c-45f8-b784-ca4c6743aa86", "_rev": "2-3d282f0148add0fd1e75773bc6aa0c8d", "type": "region", "code": "510704", "name": "游仙区", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "0cceba3f-312c-45f8-b784-ca4c6743aa86"], "path_name": ["中国", "四川省", "绵阳市", "游仙区"], "status": "active", "sort": 2886, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "36823d53-d124-420f-978a-08edbd9ccb89", "_rev": "2-9332fdb3515e9dc0a74e958b5d9fc347", "type": "region", "code": "230522", "name": "友谊县", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "36823d53-d124-420f-978a-08edbd9ccb89"], "path_name": ["中国", "黑龙江省", "双鸭山市", "友谊县"], "status": "active", "sort": 2887, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "3b05ec38-cc65-4557-8d57-aa6ca089dfcb", "_rev": "2-8106b13a6a2cd7a7e61627ac8ffebedb", "type": "region", "code": "140623", "name": "右玉县", "parent_id": "9eb84e2c-259a-4405-8af9-c48187807250", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "9eb84e2c-259a-4405-8af9-c48187807250", "3b05ec38-cc65-4557-8d57-aa6ca089dfcb"], "path_name": ["中国", "山西省", "朔州市", "右玉县"], "status": "active", "sort": 2890, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "92b85fb3-3f55-4ffe-bbf2-a89d0d7c1c0d", "_rev": "2-75bb456e1f4e05023b14186b45a0920b", "type": "region", "code": "350426", "name": "尤溪县", "parent_id": "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "d32fa2ff-a19a-40b3-82b3-8c60ec5c4048", "92b85fb3-3f55-4ffe-bbf2-a89d0d7c1c0d"], "path_name": ["中国", "福建省", "三明市", "尤溪县"], "status": "active", "sort": 2885, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "be6a5ad8-1521-41c9-a3ae-3cd529619956", "_rev": "2-330c0b57795b41cf134626a51070db9e", "type": "region", "code": "360731", "name": "于都县", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "be6a5ad8-1521-41c9-a3ae-3cd529619956"], "path_name": ["中国", "江西省", "赣州市", "于都县"], "status": "active", "sort": 2891, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "c117c17a-3df6-4848-a579-f5ddf771e2b7", "_rev": "2-2761545c71766658922616fbbcf02614", "type": "region", "code": "451002", "name": "右江区", "parent_id": "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "96a7ce25-8121-401f-a3b2-c63b08af4f9f", "c117c17a-3df6-4848-a579-f5ddf771e2b7"], "path_name": ["中国", "广西壮族自治区", "百色市", "右江区"], "status": "active", "sort": 2889, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "ea01a648-88b4-4710-894d-5882c1f04587", "_rev": "2-0788a9fcd531164b96333a235ff41bcb", "type": "region", "code": "500242", "name": "酉阳土家族苗族自治县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "ea01a648-88b4-4710-894d-5882c1f04587"], "path_name": ["中国", "重庆市", "酉阳土家族苗族自治县"], "status": "active", "sort": 2888, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:25", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:25"} +{"_id": "6aa32164-083f-4948-be74-530cd0cf0ec9", "_rev": "2-4a8b2c7378b18eb127b567d04bc6daa7", "type": "region", "code": "361127", "name": "余干县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "6aa32164-083f-4948-be74-530cd0cf0ec9"], "path_name": ["中国", "江西省", "上饶市", "余干县"], "status": "active", "sort": 2894, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:26"} +{"_id": "6eeee331-ea0f-4b34-b6e0-03d0f4df2091", "_rev": "2-454b05cf05fdc6481846d80d09dc3fb9", "type": "region", "code": "210114", "name": "于洪区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "6eeee331-ea0f-4b34-b6e0-03d0f4df2091"], "path_name": ["中国", "辽宁省", "沈阳市", "于洪区"], "status": "active", "sort": 2892, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:26"} +{"_id": "96480919-1f5c-484e-be27-5c910f7a837d", "_rev": "2-6090cd619cb75bd8ae08d208520c63b0", "type": "region", "code": "330110", "name": "余杭区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "96480919-1f5c-484e-be27-5c910f7a837d"], "path_name": ["中国", "浙江省", "杭州市", "余杭区"], "status": "active", "sort": 2895, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:26"} +{"_id": "d4ec1935-ecbb-4e9c-bd6b-cfad7600dd48", "_rev": "2-dfa768bfc7a908746e5d149122460d39", "type": "region", "code": "653226", "name": "于田县", "parent_id": "6a765f6d-ef04-42f0-942f-38632a965cee", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "6a765f6d-ef04-42f0-942f-38632a965cee", "d4ec1935-ecbb-4e9c-bd6b-cfad7600dd48"], "path_name": ["中国", "新疆维吾尔自治区", "和田地区", "于田县"], "status": "active", "sort": 2893, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:26", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:26"} +{"_id": "237f1886-4ba9-4824-a41b-f74f11804616", "_rev": "2-35221c46ef5eea5fd1d973c19738f292", "type": "region", "code": "360603", "name": "余江区", "parent_id": "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "237f1886-4ba9-4824-a41b-f74f11804616"], "path_name": ["中国", "江西省", "鹰潭市", "余江区"], "status": "active", "sort": 2896, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "484e6fe9-c195-4736-9a66-c2d6447a3b6e", "_rev": "2-c7a646e504386bccbaa0f123065d13a9", "type": "region", "code": "330281", "name": "余姚市", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "484e6fe9-c195-4736-9a66-c2d6447a3b6e"], "path_name": ["中国", "浙江省", "宁波市", "余姚市"], "status": "active", "sort": 2898, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "8fd10483-1fb7-4ef2-acfd-9a226d4edfc9", "_rev": "2-10220891854497411700d8bd2f01d7f5", "type": "region", "code": "450203", "name": "鱼峰区", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "8fd10483-1fb7-4ef2-acfd-9a226d4edfc9"], "path_name": ["中国", "广西壮族自治区", "柳州市", "鱼峰区"], "status": "active", "sort": 2900, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "ca32d473-1d82-4d9c-9000-b0ec18af9f5f", "_rev": "2-6096c2ce5b6439186dca875aefdada77", "type": "region", "code": "370827", "name": "鱼台县", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "ca32d473-1d82-4d9c-9000-b0ec18af9f5f"], "path_name": ["中国", "山东省", "济宁市", "鱼台县"], "status": "active", "sort": 2901, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "de0bfb11-d44d-465f-bb9b-888e31b52e1b", "_rev": "2-62441e5a61a359310623c361b01d73e0", "type": "region", "code": "140322", "name": "盂县", "parent_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "de0bfb11-d44d-465f-bb9b-888e31b52e1b"], "path_name": ["中国", "山西省", "阳泉市", "盂县"], "status": "active", "sort": 2899, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "e334e41b-8ff8-43f6-ada8-d580a7798e4a", "_rev": "2-49f4e4d7984b6807c4c0462f421401e5", "type": "region", "code": "520329", "name": "余庆县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "e334e41b-8ff8-43f6-ada8-d580a7798e4a"], "path_name": ["中国", "贵州省", "遵义市", "余庆县"], "status": "active", "sort": 2897, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:27", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:27"} +{"_id": "66a62b25-cf57-4589-be53-068a520293b5", "_rev": "2-93cae286813f515f7dbcef612be5c730", "type": "region", "code": "220182", "name": "榆树市", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "66a62b25-cf57-4589-be53-068a520293b5"], "path_name": ["中国", "吉林省", "长春市", "榆树市"], "status": "active", "sort": 2907, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "6d84679e-a609-4f37-b7cd-fd505c8a4327", "_rev": "2-5c9efedd9296cae9eb993671005a2411", "type": "region", "code": "500112", "name": "渝北区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "6d84679e-a609-4f37-b7cd-fd505c8a4327"], "path_name": ["中国", "重庆市", "渝北区"], "status": "active", "sort": 2902, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "868858fa-eb6c-4423-9342-a5cf66c0bd17", "_rev": "2-3dad8be8c698b81c24d831d0a4222bc9", "type": "region", "code": "140702", "name": "榆次区", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "868858fa-eb6c-4423-9342-a5cf66c0bd17"], "path_name": ["中国", "山西省", "晋中市", "榆次区"], "status": "active", "sort": 2905, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "90b2371d-b54d-4c5e-a01d-dcce6f61ee9d", "_rev": "2-73d5c47125636d4783e30437bcfc6c61", "type": "region", "code": "140721", "name": "榆社县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "90b2371d-b54d-4c5e-a01d-dcce6f61ee9d"], "path_name": ["中国", "山西省", "晋中市", "榆社县"], "status": "active", "sort": 2906, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "b12c368e-18ab-43b7-ba57-ed1079194281", "_rev": "2-43bfe2580d316ab7fc6e595234410946", "type": "region", "code": "360502", "name": "渝水区", "parent_id": "4a909020-7ac2-4724-9de8-09eacf02ff2a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4a909020-7ac2-4724-9de8-09eacf02ff2a", "b12c368e-18ab-43b7-ba57-ed1079194281"], "path_name": ["中国", "江西省", "新余市", "渝水区"], "status": "active", "sort": 2903, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "d4596464-699f-496f-9c48-ab8dbb909a83", "_rev": "2-1f21b32562e42b794b7d8c2a85e618a4", "type": "region", "code": "610802", "name": "榆阳区", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "d4596464-699f-496f-9c48-ab8dbb909a83"], "path_name": ["中国", "陕西省", "榆林市", "榆阳区"], "status": "active", "sort": 2908, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "dba77fcc-428d-4d44-8f50-2b9cdaa010bd", "_rev": "2-ccdca753bf19eb55b6271a4e6e31af2d", "type": "region", "code": "500103", "name": "渝中区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "dba77fcc-428d-4d44-8f50-2b9cdaa010bd"], "path_name": ["中国", "重庆市", "渝中区"], "status": "active", "sort": 2904, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:28", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:28"} +{"_id": "1944c76b-2ffe-43c1-ad80-c9bc0b4445c5", "_rev": "2-e62e19b3181652b1467ee32c86c44838", "type": "region", "code": "411425", "name": "虞城县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "1944c76b-2ffe-43c1-ad80-c9bc0b4445c5"], "path_name": ["中国", "河南省", "商丘市", "虞城县"], "status": "active", "sort": 2910, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "2a89bad9-f241-42eb-99d7-fe264d1f823d", "_rev": "2-35eda065e4f076555314ea076673e7d6", "type": "region", "code": "620123", "name": "榆中县", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "2a89bad9-f241-42eb-99d7-fe264d1f823d"], "path_name": ["中国", "甘肃省", "兰州市", "榆中县"], "status": "active", "sort": 2909, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "4a9ba699-54fe-4dc1-a054-288e0e777fac", "_rev": "2-f7002604540c4808819301251ea8b345", "type": "region", "code": "320114", "name": "雨花台区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "4a9ba699-54fe-4dc1-a054-288e0e777fac"], "path_name": ["中国", "江苏省", "南京市", "雨花台区"], "status": "active", "sort": 2914, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "4cbf7f13-c4ca-4824-af94-b0ac1aee5407", "_rev": "2-7d09c7d2f6aa2e165b1da91251b2065e", "type": "region", "code": "430302", "name": "雨湖区", "parent_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960", "4cbf7f13-c4ca-4824-af94-b0ac1aee5407"], "path_name": ["中国", "湖南省", "湘潭市", "雨湖区"], "status": "active", "sort": 2912, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "5965b125-35e7-48ca-b8e0-7c6b3990c8e7", "_rev": "2-92250f1bcd5b8f5a13616c2307edd267", "type": "region", "code": "511802", "name": "雨城区", "parent_id": "af88eca6-8e21-44d8-852e-81325e3ab2be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "af88eca6-8e21-44d8-852e-81325e3ab2be", "5965b125-35e7-48ca-b8e0-7c6b3990c8e7"], "path_name": ["中国", "四川省", "雅安市", "雨城区"], "status": "active", "sort": 2911, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "8efc66a6-fe7c-40bb-9751-e10ff13b43e0", "_rev": "2-3316744be210ce56d4deb800230474e1", "type": "region", "code": "430111", "name": "雨花区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "8efc66a6-fe7c-40bb-9751-e10ff13b43e0"], "path_name": ["中国", "湖南省", "长沙市", "雨花区"], "status": "active", "sort": 2913, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "cbdcb451-e002-4a7a-bc8a-1e4bb5bb0cc7", "_rev": "2-4f8e8f7969cadd39b3d40bc9cefb9011", "type": "region", "code": "340504", "name": "雨山区", "parent_id": "6b82a758-caee-40b5-aab7-a567e2e4115b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "6b82a758-caee-40b5-aab7-a567e2e4115b", "cbdcb451-e002-4a7a-bc8a-1e4bb5bb0cc7"], "path_name": ["中国", "安徽省", "马鞍山市", "雨山区"], "status": "active", "sort": 2915, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:29", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:29"} +{"_id": "046946e9-2b15-4a18-a0ff-2d22f881cc0d", "_rev": "2-dad8c585276fd245e4522a3681cb0632", "type": "region", "code": "410205", "name": "禹王台区", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "046946e9-2b15-4a18-a0ff-2d22f881cc0d"], "path_name": ["中国", "河南省", "开封市", "禹王台区"], "status": "active", "sort": 2918, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "052198a2-18de-4424-a4e6-733c161a1dc5", "_rev": "2-1277833b720ac2d8eb98d2e6e6b7da66", "type": "region", "code": "371482", "name": "禹城市", "parent_id": "428f2225-a19e-4788-a0d2-6dbefb720a7d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "428f2225-a19e-4788-a0d2-6dbefb720a7d", "052198a2-18de-4424-a4e6-733c161a1dc5"], "path_name": ["中国", "山东省", "德州市", "禹城市"], "status": "active", "sort": 2916, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "5a2513ab-3dd3-4bb9-a4d5-8fc319784210", "_rev": "2-bf7c4ec042270036aa14c543728ec838", "type": "region", "code": "411081", "name": "禹州市", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "5a2513ab-3dd3-4bb9-a4d5-8fc319784210"], "path_name": ["中国", "河南省", "许昌市", "禹州市"], "status": "active", "sort": 2919, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "8ac8811d-094b-4b58-8b2e-c975a289bfdd", "_rev": "2-dc963f09abe26cd144d5b42b038a4880", "type": "region", "code": "340304", "name": "禹会区", "parent_id": "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "4695124d-ec7c-4f70-beaf-d39cae3a4dcd", "8ac8811d-094b-4b58-8b2e-c975a289bfdd"], "path_name": ["中国", "安徽省", "蚌埠市", "禹会区"], "status": "active", "sort": 2917, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "90026e44-6bf3-4c4d-9ca9-b37c66a06657", "_rev": "2-12b428764fa96294595a08842058c2c8", "type": "region", "code": "331083", "name": "玉环市", "parent_id": "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "d5bae14c-a1b8-4362-98dc-e14f33cc6987", "90026e44-6bf3-4c4d-9ca9-b37c66a06657"], "path_name": ["中国", "浙江省", "台州市", "玉环市"], "status": "active", "sort": 2920, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "b42d8655-2c48-4a1b-ab55-bda079c06aa8", "_rev": "2-ed899defd75bf7cfd6f10daf4de8a2ae", "type": "region", "code": "620981", "name": "玉门市", "parent_id": "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "53e9d07c-262d-45f9-a9ef-e9ae95e292d3", "b42d8655-2c48-4a1b-ab55-bda079c06aa8"], "path_name": ["中国", "甘肃省", "酒泉市", "玉门市"], "status": "active", "sort": 2922, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "b4af490b-0d29-4ef1-bc27-addcbcb765c4", "_rev": "2-8c56cc864ef9b48d617dac412a195780", "type": "region", "code": "530721", "name": "玉龙纳西族自治县", "parent_id": "b712f371-149e-4b45-aa88-755c77561518", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "b712f371-149e-4b45-aa88-755c77561518", "b4af490b-0d29-4ef1-bc27-addcbcb765c4"], "path_name": ["中国", "云南省", "丽江市", "玉龙纳西族自治县"], "status": "active", "sort": 2921, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:30", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:30"} +{"_id": "2a56a8ea-b646-42ff-8e9b-ac5ccc80515d", "_rev": "2-025cb43f6c172f12bea2de187b09226b", "type": "region", "code": "361123", "name": "玉山县", "parent_id": "2c485663-0690-4045-a90b-68d4005a4ab5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "2c485663-0690-4045-a90b-68d4005a4ab5", "2a56a8ea-b646-42ff-8e9b-ac5ccc80515d"], "path_name": ["中国", "江西省", "上饶市", "玉山县"], "status": "active", "sort": 2925, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "83aab66c-88b5-447a-98f3-7018e76d2808", "_rev": "2-302e871e74904d5507ada270d368506d", "type": "region", "code": "520622", "name": "玉屏侗族自治县", "parent_id": "3086a0f2-836f-444f-ace9-2c65b7ace471", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "3086a0f2-836f-444f-ace9-2c65b7ace471", "83aab66c-88b5-447a-98f3-7018e76d2808"], "path_name": ["中国", "贵州省", "铜仁市", "玉屏侗族自治县"], "status": "active", "sort": 2923, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "890599a0-c412-4fe6-8323-09467878779d", "_rev": "2-07f8f1b8bb9643b01d83375519b01722", "type": "region", "code": "150104", "name": "玉泉区", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "890599a0-c412-4fe6-8323-09467878779d"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "玉泉区"], "status": "active", "sort": 2924, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "89bac888-a1cf-415a-9157-8929eb10bca1", "_rev": "2-891590bfb11c8ff11a9067a8f74830b6", "type": "region", "code": "130229", "name": "玉田县", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "89bac888-a1cf-415a-9157-8929eb10bca1"], "path_name": ["中国", "河北省", "唐山市", "玉田县"], "status": "active", "sort": 2927, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "99104e99-b2ef-498b-a2e2-e58d726cf928", "_rev": "2-bb6a1fd8d511758939da8c0c826d4cae", "type": "region", "code": "450902", "name": "玉州区", "parent_id": "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "bb5efba8-3b82-4f2a-8d87-37de105adb3c", "99104e99-b2ef-498b-a2e2-e58d726cf928"], "path_name": ["中国", "广西壮族自治区", "玉林市", "玉州区"], "status": "active", "sort": 2928, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "a9d4fd10-65f1-4e51-b6c1-7027e4c28e17", "_rev": "2-4abfbad7106b4ddb7a17afb56d8e8a50", "type": "region", "code": "445322", "name": "郁南县", "parent_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "a9d4fd10-65f1-4e51-b6c1-7027e4c28e17"], "path_name": ["中国", "广东省", "云浮市", "郁南县"], "status": "active", "sort": 2929, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "ffea4d79-874f-4c6f-86c0-be5eba28fa57", "_rev": "2-7076ae4e55bf7276e222687cfa893667", "type": "region", "code": "632701", "name": "玉树市", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "ffea4d79-874f-4c6f-86c0-be5eba28fa57"], "path_name": ["中国", "青海省", "玉树藏族自治州", "玉树市"], "status": "active", "sort": 2926, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:31", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:31"} +{"_id": "08873f65-7852-46ac-9929-a9791b833d34", "_rev": "2-096ab95810af7b43b2c757f8b8c6aa70", "type": "region", "code": "654225", "name": "裕民县", "parent_id": "3cfb4990-085b-44e4-a4c1-7d038f06e378", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "3cfb4990-085b-44e4-a4c1-7d038f06e378", "08873f65-7852-46ac-9929-a9791b833d34"], "path_name": ["中国", "新疆维吾尔自治区", "塔城地区", "裕民县"], "status": "active", "sort": 2932, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "5d857d8d-598a-4589-b936-28896351e673", "_rev": "2-6c85fb1fe0e0b7d4b385633e5cae6324", "type": "region", "code": "532328", "name": "元谋县", "parent_id": "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "aa66d64d-1b75-432e-b5aa-8337cc9eeb8b", "5d857d8d-598a-4589-b936-28896351e673"], "path_name": ["中国", "云南省", "楚雄彝族自治州", "元谋县"], "status": "active", "sort": 2936, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "7849921f-57f3-4cdb-af78-dc16f3db394b", "_rev": "2-e7c043617fefec5c9ad7b46503d8d079", "type": "region", "code": "210602", "name": "元宝区", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "7849921f-57f3-4cdb-af78-dc16f3db394b"], "path_name": ["中国", "辽宁省", "丹东市", "元宝区"], "status": "active", "sort": 2933, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "89f475c1-61a9-46a5-95b4-f6b2d48f46c9", "_rev": "2-44533d9c9cd11e822f135173d66c7804", "type": "region", "code": "341503", "name": "裕安区", "parent_id": "995b6218-3325-433d-9b4b-00ff0c92aee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "995b6218-3325-433d-9b4b-00ff0c92aee0", "89f475c1-61a9-46a5-95b4-f6b2d48f46c9"], "path_name": ["中国", "安徽省", "六安市", "裕安区"], "status": "active", "sort": 2930, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "b5c30e99-944e-4c1a-b0b6-46f2b38fc8e2", "_rev": "2-621c3f386afef074ed722e0aa9ba786e", "type": "region", "code": "130108", "name": "裕华区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "b5c30e99-944e-4c1a-b0b6-46f2b38fc8e2"], "path_name": ["中国", "河北省", "石家庄市", "裕华区"], "status": "active", "sort": 2931, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "cc9d9858-996f-4917-9123-3e734ddeb278", "_rev": "2-24d1acf0d8cec3461333bb8a7ed31d7c", "type": "region", "code": "150403", "name": "元宝山区", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "cc9d9858-996f-4917-9123-3e734ddeb278"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "元宝山区"], "status": "active", "sort": 2934, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "eb2b89e0-77cb-426a-9235-f49908befa29", "_rev": "2-1900215b0e5980f3de1c3a6bb6df6dc2", "type": "region", "code": "530428", "name": "元江哈尼族彝族傣族自治县", "parent_id": "ad3a579e-8207-424c-becf-4663e24dd98e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "ad3a579e-8207-424c-becf-4663e24dd98e", "eb2b89e0-77cb-426a-9235-f49908befa29"], "path_name": ["中国", "云南省", "玉溪市", "元江哈尼族彝族傣族自治县"], "status": "active", "sort": 2935, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:32", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:32"} +{"_id": "4dbe46bd-29c8-4341-b04f-ad6c2f819a94", "_rev": "2-350087a5f8ae7f0e586290068be5d818", "type": "region", "code": "430981", "name": "沅江市", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "4dbe46bd-29c8-4341-b04f-ad6c2f819a94"], "path_name": ["中国", "湖南省", "益阳市", "沅江市"], "status": "active", "sort": 2939, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "536e25b1-738a-43d0-bce2-18f8bbcc340a", "_rev": "2-05eae71034e6beef5fd0b265e5530a41", "type": "region", "code": "130132", "name": "元氏县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "536e25b1-738a-43d0-bce2-18f8bbcc340a"], "path_name": ["中国", "河北省", "石家庄市", "元氏县"], "status": "active", "sort": 2937, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "544e3fa0-be3e-49cf-bb05-9f451b4dc929", "_rev": "2-5825acbe17b08063d92e33d071ad1579", "type": "region", "code": "360902", "name": "袁州区", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "544e3fa0-be3e-49cf-bb05-9f451b4dc929"], "path_name": ["中国", "江西省", "宜春市", "袁州区"], "status": "active", "sort": 2942, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "81643310-b617-4e0a-a2d7-16dcbab54595", "_rev": "2-3b4e72422764d6e592c2bc1e9603a681", "type": "region", "code": "532528", "name": "元阳县", "parent_id": "766431ea-6604-486c-b31a-3ac5c16d3bb5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "766431ea-6604-486c-b31a-3ac5c16d3bb5", "81643310-b617-4e0a-a2d7-16dcbab54595"], "path_name": ["中国", "云南省", "红河哈尼族彝族自治州", "元阳县"], "status": "active", "sort": 2938, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "ca153efa-b400-4cdd-9cbc-8e455a59a813", "_rev": "2-eb589155258b58aca849a0219a5b3e2a", "type": "region", "code": "140827", "name": "垣曲县", "parent_id": "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "200e2ec2-166f-40e4-913b-f6899fe7ccc0", "ca153efa-b400-4cdd-9cbc-8e455a59a813"], "path_name": ["中国", "山西省", "运城市", "垣曲县"], "status": "active", "sort": 2941, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "dfa8b927-72b2-4563-afe8-3293301734ce", "_rev": "2-d2444e6f8317c78a247e88fea9ec7935", "type": "region", "code": "431222", "name": "沅陵县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "dfa8b927-72b2-4563-afe8-3293301734ce"], "path_name": ["中国", "湖南省", "怀化市", "沅陵县"], "status": "active", "sort": 2940, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:33", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:33"} +{"_id": "116eb627-590d-46e2-9a49-cf4f9ac55f64", "_rev": "2-a7a584a50b32e90dd4714b06a327ce36", "type": "region", "code": "441602", "name": "源城区", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "116eb627-590d-46e2-9a49-cf4f9ac55f64"], "path_name": ["中国", "广东省", "河源市", "源城区"], "status": "active", "sort": 2946, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:34"} +{"_id": "21293327-c50b-4c52-a037-e0ee51850c76", "_rev": "2-14b4930091f59d06c9914c41d43133ad", "type": "region", "code": "640402", "name": "原州区", "parent_id": "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "5b1529fc-4e12-4fd0-983f-0c5f255988e8", "21293327-c50b-4c52-a037-e0ee51850c76"], "path_name": ["中国", "宁夏回族自治区", "固原市", "原州区"], "status": "active", "sort": 2945, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:34"} +{"_id": "b1ba7f93-5bf2-4ccc-8be8-a1694333201e", "_rev": "2-a9d859cf8a826a5b538ec8e7a18b2392", "type": "region", "code": "140981", "name": "原平市", "parent_id": "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "1ba2c111-1131-4853-aff7-6dc0e7398b7b", "b1ba7f93-5bf2-4ccc-8be8-a1694333201e"], "path_name": ["中国", "山西省", "忻州市", "原平市"], "status": "active", "sort": 2943, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:34"} +{"_id": "dcd57dba-2542-41f3-bd6e-d9c83b7794d9", "_rev": "2-07b4e26480fbbc0729d82bd5d1c8a460", "type": "region", "code": "410725", "name": "原阳县", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "dcd57dba-2542-41f3-bd6e-d9c83b7794d9"], "path_name": ["中国", "河南省", "新乡市", "原阳县"], "status": "active", "sort": 2944, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:34", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:34"} +{"_id": "323b5fd8-51e2-44fc-8586-d09c92a03ba7", "_rev": "2-1c4d5a04361506d1dcbf7663dfd15276", "type": "region", "code": "420525", "name": "远安县", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "323b5fd8-51e2-44fc-8586-d09c92a03ba7"], "path_name": ["中国", "湖北省", "宜昌市", "远安县"], "status": "active", "sort": 2948, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "48de1437-89d1-4554-96a5-dc5527056b6b", "_rev": "2-6e95868550cefeadbfae591b37c47618", "type": "region", "code": "653128", "name": "岳普湖县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "48de1437-89d1-4554-96a5-dc5527056b6b"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "岳普湖县"], "status": "active", "sort": 2952, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "66a6ade4-fac6-4228-8f2e-ef5e31d7f05b", "_rev": "2-e29a3a5dcf298f52a3c1c7f4a3130070", "type": "region", "code": "511621", "name": "岳池县", "parent_id": "48007738-432a-4731-ba7c-c29ff84708ba", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "48007738-432a-4731-ba7c-c29ff84708ba", "66a6ade4-fac6-4228-8f2e-ef5e31d7f05b"], "path_name": ["中国", "四川省", "广安市", "岳池县"], "status": "active", "sort": 2950, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "97cec82b-7aee-4b9c-b465-f06ccaf23f18", "_rev": "2-a1e913aa2d155b2f4ee8a4a4b98e1518", "type": "region", "code": "430304", "name": "岳塘区", "parent_id": "786299e6-25b9-4f9b-9778-1c081f0ff960", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "786299e6-25b9-4f9b-9778-1c081f0ff960", "97cec82b-7aee-4b9c-b465-f06ccaf23f18"], "path_name": ["中国", "湖南省", "湘潭市", "岳塘区"], "status": "active", "sort": 2953, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "b1128bfc-712d-4764-a34a-3edb06b3798b", "_rev": "2-da85144c9d4a5ed5037d35036731caec", "type": "region", "code": "411102", "name": "源汇区", "parent_id": "d41f466d-690a-4104-b545-35ba392a52d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2", "b1128bfc-712d-4764-a34a-3edb06b3798b"], "path_name": ["中国", "河南省", "漯河市", "源汇区"], "status": "active", "sort": 2947, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "c1479042-662c-440c-ae4a-7e8f42c6959a", "_rev": "2-d961b920180f1a099164264d91d2e224", "type": "region", "code": "360602", "name": "月湖区", "parent_id": "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "98a7db25-5be5-4e1f-bbad-8f70ea994ab3", "c1479042-662c-440c-ae4a-7e8f42c6959a"], "path_name": ["中国", "江西省", "鹰潭市", "月湖区"], "status": "active", "sort": 2949, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "d2aea5ac-ca24-4edc-9ade-796295d0a938", "_rev": "2-8d2e65d1d398b50a01650ac9a821e69a", "type": "region", "code": "430104", "name": "岳麓区", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "d2aea5ac-ca24-4edc-9ade-796295d0a938"], "path_name": ["中国", "湖南省", "长沙市", "岳麓区"], "status": "active", "sort": 2951, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:35", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:35"} +{"_id": "13c6be29-6a9c-448f-9413-92df00ed3032", "_rev": "2-f7e95a1ffbe43c5d1a6b138685f5482f", "type": "region", "code": "430621", "name": "岳阳县", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "13c6be29-6a9c-448f-9413-92df00ed3032"], "path_name": ["中国", "湖南省", "岳阳市", "岳阳县"], "status": "active", "sort": 2956, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "1c94009e-cd58-44e1-b1ca-6e82fb0becb6", "_rev": "2-8dcda4cdd1da1611aa03db36c28412b3", "type": "region", "code": "513434", "name": "越西县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "1c94009e-cd58-44e1-b1ca-6e82fb0becb6"], "path_name": ["中国", "四川省", "凉山彝族自治州", "越西县"], "status": "active", "sort": 2958, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "55163236-beee-4b64-a05e-2f05f7121f5b", "_rev": "2-1b106a462bba99bb1a8e67939cad6148", "type": "region", "code": "445303", "name": "云安区", "parent_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "55163236-beee-4b64-a05e-2f05f7121f5b"], "path_name": ["中国", "广东省", "云浮市", "云安区"], "status": "active", "sort": 2960, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "694d6532-979d-4df5-978f-71d91cc41cd4", "_rev": "2-6a55ea82c68e660fd80a869263239985", "type": "region", "code": "330602", "name": "越城区", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "694d6532-979d-4df5-978f-71d91cc41cd4"], "path_name": ["中国", "浙江省", "绍兴市", "越城区"], "status": "active", "sort": 2957, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "9fe5a883-340a-457d-ac21-98d547ec75b9", "_rev": "2-1c992336288e7b69389933b1be3f8c3b", "type": "region", "code": "440104", "name": "越秀区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "9fe5a883-340a-457d-ac21-98d547ec75b9"], "path_name": ["中国", "广东省", "广州市", "越秀区"], "status": "active", "sort": 2959, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "e29fe95e-ed8e-48ab-a428-f2b41aca313a", "_rev": "2-75d10a3608b2cf3c220d6ce27c6a7c9d", "type": "region", "code": "430602", "name": "岳阳楼区", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "e29fe95e-ed8e-48ab-a428-f2b41aca313a"], "path_name": ["中国", "湖南省", "岳阳市", "岳阳楼区"], "status": "active", "sort": 2955, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "fd3e0069-64d0-4062-9428-7a36e05ae848", "_rev": "2-eb919991a7cf29ed780ec56693199d1c", "type": "region", "code": "340828", "name": "岳西县", "parent_id": "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "d1ca9abb-f5d3-4db8-bd42-0e83f642a50b", "fd3e0069-64d0-4062-9428-7a36e05ae848"], "path_name": ["中国", "安徽省", "安庆市", "岳西县"], "status": "active", "sort": 2954, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:36", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:36"} +{"_id": "02e9eae9-5632-46f0-82ec-74b13e2e3a2b", "_rev": "2-f8895b712dd8aba7d1aea2416b2bd747", "type": "region", "code": "430603", "name": "云溪区", "parent_id": "720acaee-453d-4b07-bbbf-ac4e872579ac", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "720acaee-453d-4b07-bbbf-ac4e872579ac", "02e9eae9-5632-46f0-82ec-74b13e2e3a2b"], "path_name": ["中国", "湖南省", "岳阳市", "云溪区"], "status": "active", "sort": 2966, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "55ea8ea7-2614-44b8-888e-7f1b98dda891", "_rev": "2-2f58ee195dd8a6b4f60db1c1781932fd", "type": "region", "code": "445302", "name": "云城区", "parent_id": "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "724f2bba-4b18-4b3e-b2fe-d7135b7154de", "55ea8ea7-2614-44b8-888e-7f1b98dda891"], "path_name": ["中国", "广东省", "云浮市", "云城区"], "status": "active", "sort": 2961, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "98c40e76-3a2c-4155-a943-a1b79582bdb9", "_rev": "2-14d4de2dc46b95766b70c138c5321e70", "type": "region", "code": "420923", "name": "云梦县", "parent_id": "6047db89-3a46-4027-a700-049b59e2a8f9", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "6047db89-3a46-4027-a700-049b59e2a8f9", "98c40e76-3a2c-4155-a943-a1b79582bdb9"], "path_name": ["中国", "湖北省", "孝感市", "云梦县"], "status": "active", "sort": 2965, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "cdb25957-cb28-4133-a374-52473e0f1a33", "_rev": "2-a45bc3a2c6a261285b615b697c39852f", "type": "region", "code": "331125", "name": "云和县", "parent_id": "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0c9432ff-4d94-47cd-bb99-f9528ca584f7", "cdb25957-cb28-4133-a374-52473e0f1a33"], "path_name": ["中国", "浙江省", "丽水市", "云和县"], "status": "active", "sort": 2962, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "d092f2c8-1b2a-4b55-bd7b-ae62073ac8ef", "_rev": "2-565b1cf31d0ca8776a5dcaa03db90bef", "type": "region", "code": "532929", "name": "云龙县", "parent_id": "5142db19-97bc-4e37-918e-ea90a11ace1f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5142db19-97bc-4e37-918e-ea90a11ace1f", "d092f2c8-1b2a-4b55-bd7b-ae62073ac8ef"], "path_name": ["中国", "云南省", "大理白族自治州", "云龙县"], "status": "active", "sort": 2964, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "de323d9a-f612-47e9-a2d2-42795e7ba90c", "_rev": "2-2ad402265bd9ce2b266363296ee50a36", "type": "region", "code": "530922", "name": "云县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "de323d9a-f612-47e9-a2d2-42795e7ba90c"], "path_name": ["中国", "云南省", "临沧市", "云县"], "status": "active", "sort": 2967, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "e092cf57-c3a1-4a64-96ca-bbef38f7cead", "_rev": "2-9597861fb70814c836278b87190b6b16", "type": "region", "code": "320303", "name": "云龙区", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "e092cf57-c3a1-4a64-96ca-bbef38f7cead"], "path_name": ["中国", "江苏省", "徐州市", "云龙区"], "status": "active", "sort": 2963, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:37", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:37"} +{"_id": "33fc5244-350e-4577-bfd3-6d0640c9fc23", "_rev": "2-c701a70414a087d0f82476c9aa9f177d", "type": "region", "code": "140215", "name": "云州区", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "33fc5244-350e-4577-bfd3-6d0640c9fc23"], "path_name": ["中国", "山西省", "大同市", "云州区"], "status": "active", "sort": 2971, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "34c51fee-07c9-413a-a692-4dfc57cceda4", "_rev": "2-ee334b4da89fefcc555061701428eff6", "type": "region", "code": "520103", "name": "云岩区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "34c51fee-07c9-413a-a692-4dfc57cceda4"], "path_name": ["中国", "贵州省", "贵阳市", "云岩区"], "status": "active", "sort": 2969, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "50275268-3484-4845-b260-703025660054", "_rev": "2-38e50001501e176076eade39a5c7c493", "type": "region", "code": "420322", "name": "郧西县", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "50275268-3484-4845-b260-703025660054"], "path_name": ["中国", "湖北省", "十堰市", "郧西县"], "status": "active", "sort": 2972, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "aae50a4e-3ed4-4696-9cc0-a1fba1c5bdbf", "_rev": "2-1597a4ebf54fcdf249a7c5cb4533630c", "type": "region", "code": "420304", "name": "郧阳区", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "aae50a4e-3ed4-4696-9cc0-a1fba1c5bdbf"], "path_name": ["中国", "湖北省", "十堰市", "郧阳区"], "status": "active", "sort": 2973, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "c7ee8f79-a7b1-4abe-ad76-726efeb0e919", "_rev": "2-0bb4f81149cee6087f56668375443b8c", "type": "region", "code": "350622", "name": "云霄县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "c7ee8f79-a7b1-4abe-ad76-726efeb0e919"], "path_name": ["中国", "福建省", "漳州市", "云霄县"], "status": "active", "sort": 2968, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "e672dbb2-fd3a-45ad-b260-9332803714b7", "_rev": "2-23514e4dca102abd6cc9d5396b914dd9", "type": "region", "code": "500235", "name": "云阳县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e672dbb2-fd3a-45ad-b260-9332803714b7"], "path_name": ["中国", "重庆市", "云阳县"], "status": "active", "sort": 2970, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "f35a450c-06a4-4618-90cb-f85bb51ab3c4", "_rev": "2-bf2563da6b3d90790c03072a931eb2b2", "type": "region", "code": "511527", "name": "筠连县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "f35a450c-06a4-4618-90cb-f85bb51ab3c4"], "path_name": ["中国", "四川省", "宜宾市", "筠连县"], "status": "active", "sort": 2974, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:38", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:38"} +{"_id": "4ac3555f-6cb4-4c33-8e0d-95f0924c7790", "_rev": "2-88c8f3fbfd13e9922ca43c94d818dfa4", "type": "region", "code": "371725", "name": "郓城县", "parent_id": "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "57bc9a5c-7f3d-4f26-b630-2110fde0194a", "4ac3555f-6cb4-4c33-8e0d-95f0924c7790"], "path_name": ["中国", "山东省", "菏泽市", "郓城县"], "status": "active", "sort": 2976, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "500e7417-c7a2-432c-ba70-185c5bcdf945", "_rev": "2-11bbe62a5a8ab389eb5c5233f36c6e06", "type": "region", "code": "131121", "name": "枣强县", "parent_id": "fa1c829e-b469-4296-8313-c7dd9fda61e0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "fa1c829e-b469-4296-8313-c7dd9fda61e0", "500e7417-c7a2-432c-ba70-185c5bcdf945"], "path_name": ["中国", "河北省", "衡水市", "枣强县"], "status": "active", "sort": 2979, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "7d818348-ac7e-45c6-a3c0-3312584a93dd", "_rev": "2-bab309c32f8e81b80026f67efe418788", "type": "region", "code": "632722", "name": "杂多县", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "7d818348-ac7e-45c6-a3c0-3312584a93dd"], "path_name": ["中国", "青海省", "玉树藏族自治州", "杂多县"], "status": "active", "sort": 2977, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "875b9a37-dd2d-4ea2-8f4f-96ea4faa087c", "_rev": "2-5b484dc54bde7866d65524a9e83424e3", "type": "region", "code": "632323", "name": "泽库县", "parent_id": "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "57bcfd82-2aff-4980-8c51-1dfd6af82a90", "875b9a37-dd2d-4ea2-8f4f-96ea4faa087c"], "path_name": ["中国", "青海省", "黄南藏族自治州", "泽库县"], "status": "active", "sort": 2981, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "8f4a594a-f9c4-4727-9669-30984ff9f84b", "_rev": "2-89fe2d97c7c43246bfe08c5338a44ecd", "type": "region", "code": "420683", "name": "枣阳市", "parent_id": "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "bcd72d8b-729c-418a-8ce6-9e5b50b38e97", "8f4a594a-f9c4-4727-9669-30984ff9f84b"], "path_name": ["中国", "湖北省", "襄阳市", "枣阳市"], "status": "active", "sort": 2980, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "9a1196ea-af28-4afd-86b3-9807f6fa994d", "_rev": "2-4d278512ea8543a1f811a7f3d3529c9d", "type": "region", "code": "130129", "name": "赞皇县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "9a1196ea-af28-4afd-86b3-9807f6fa994d"], "path_name": ["中国", "河北省", "石家庄市", "赞皇县"], "status": "active", "sort": 2978, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "a4b46f72-56f2-4cf9-bb5c-51a62d7d5e6e", "_rev": "2-527a2b94e73b0c3350c7a20c8431dc98", "type": "region", "code": "130903", "name": "运河区", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "a4b46f72-56f2-4cf9-bb5c-51a62d7d5e6e"], "path_name": ["中国", "河北省", "沧州市", "运河区"], "status": "active", "sort": 2975, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:39", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:39"} +{"_id": "432c1de1-41c9-4b10-9da0-394a0adf6766", "_rev": "2-c6edb67b32335a7f4c31e4e7619db724", "type": "region", "code": "150526", "name": "扎鲁特旗", "parent_id": "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "16d63f2b-fffb-4a19-b8d3-5ad7f96c78ea", "432c1de1-41c9-4b10-9da0-394a0adf6766"], "path_name": ["中国", "内蒙古自治区", "通辽市", "扎鲁特旗"], "status": "active", "sort": 2988, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "69a95a03-38b7-4216-9b1e-26a2f56782c2", "_rev": "2-8333da2b86ba7ba96600a50d7154a7a8", "type": "region", "code": "150783", "name": "扎兰屯市", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "69a95a03-38b7-4216-9b1e-26a2f56782c2"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "扎兰屯市"], "status": "active", "sort": 2987, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "98c2345b-5e3d-41a3-9336-239621cf33f4", "_rev": "2-9bfade44fea02a5b40a9a7522806a13a", "type": "region", "code": "653124", "name": "泽普县", "parent_id": "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "c60eb0fb-ba77-45a9-8378-3a6d7fddd1ea", "98c2345b-5e3d-41a3-9336-239621cf33f4"], "path_name": ["中国", "新疆维吾尔自治区", "喀什地区", "泽普县"], "status": "active", "sort": 2982, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "adb690f5-bdca-42f4-8914-81542f2a67b0", "_rev": "2-423f7e59e1858127fe8f81a925d061fa", "type": "region", "code": "440118", "name": "增城区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "adb690f5-bdca-42f4-8914-81542f2a67b0"], "path_name": ["中国", "广东省", "广州市", "增城区"], "status": "active", "sort": 2984, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "b1e0c494-96c6-45fa-8199-efcd2b3c2319", "_rev": "2-ffae607b4bc1d7bf92df0b6bdd10fe61", "type": "region", "code": "152223", "name": "扎赉特旗", "parent_id": "47a18671-a828-4b12-8f93-d835d77c658f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "47a18671-a828-4b12-8f93-d835d77c658f", "b1e0c494-96c6-45fa-8199-efcd2b3c2319"], "path_name": ["中国", "内蒙古自治区", "兴安盟", "扎赉特旗"], "status": "active", "sort": 2986, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "d9425485-4942-4de4-98a6-cc1f5db73fab", "_rev": "2-3db18c4b65944e03d47a690c823640d5", "type": "region", "code": "140525", "name": "泽州县", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "d9425485-4942-4de4-98a6-cc1f5db73fab"], "path_name": ["中国", "山西省", "晋城市", "泽州县"], "status": "active", "sort": 2983, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "ff7667d0-03d0-400f-976c-11afcd1cb366", "_rev": "2-3ffeaf1b15b78822a8bb28bc97ee0fc3", "type": "region", "code": "150703", "name": "扎赉诺尔区", "parent_id": "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9f1df8eb-08cf-44f2-a061-6bee4fbbdda6", "ff7667d0-03d0-400f-976c-11afcd1cb366"], "path_name": ["中国", "内蒙古自治区", "呼伦贝尔市", "扎赉诺尔区"], "status": "active", "sort": 2985, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:40", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:40"} +{"_id": "20acc4ab-1185-4979-b4d6-fa9dcbf34d13", "_rev": "2-d3004e0163603cfc1b962142c26c64b9", "type": "region", "code": "540521", "name": "扎囊县", "parent_id": "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a4785a9-0b35-4d45-bac4-c2b6cd6628d4", "20acc4ab-1185-4979-b4d6-fa9dcbf34d13"], "path_name": ["中国", "西藏自治区", "山南市", "扎囊县"], "status": "active", "sort": 2989, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:41"} +{"_id": "8f5835ca-1b93-4683-ae98-f5786eb9ba72", "_rev": "2-3b38156e1708100fdf8a0126f6452b15", "type": "region", "code": "542522", "name": "札达县", "parent_id": "38306de2-4b1a-494a-af52-41adbaeffd52", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "38306de2-4b1a-494a-af52-41adbaeffd52", "8f5835ca-1b93-4683-ae98-f5786eb9ba72"], "path_name": ["中国", "西藏自治区", "阿里地区", "札达县"], "status": "active", "sort": 2990, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:41"} +{"_id": "add37922-e8ee-4b25-a5ef-bf14f360031c", "_rev": "2-16fabba77ce82a27fb115383bbb4f51d", "type": "region", "code": "371603", "name": "沾化区", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "add37922-e8ee-4b25-a5ef-bf14f360031c"], "path_name": ["中国", "山东省", "滨州市", "沾化区"], "status": "active", "sort": 2992, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:41"} +{"_id": "c9bc58c3-4f9b-4f77-a57a-ce039af93028", "_rev": "2-1c72060ebcfe79e658f90d381135d85d", "type": "region", "code": "611026", "name": "柞水县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "c9bc58c3-4f9b-4f77-a57a-ce039af93028"], "path_name": ["中国", "陕西省", "商洛市", "柞水县"], "status": "active", "sort": 2991, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:41", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:41"} +{"_id": "032bf399-558f-497d-b720-5a0182d9d98b", "_rev": "2-ffdbae9e9e024bddb003ce94d8b32103", "type": "region", "code": "620525", "name": "张家川回族自治县", "parent_id": "e10ab669-9c66-48d1-9430-c3865782b72c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "e10ab669-9c66-48d1-9430-c3865782b72c", "032bf399-558f-497d-b720-5a0182d9d98b"], "path_name": ["中国", "甘肃省", "天水市", "张家川回族自治县"], "status": "active", "sort": 2998, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "45dedf3b-1821-46ba-8e3f-a8de9904ab2d", "_rev": "2-ee7c750b3333e43f10bf11e1e99cd082", "type": "region", "code": "210802", "name": "站前区", "parent_id": "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "19ae2c83-06e0-41cc-acc4-3d86db9d1a64", "45dedf3b-1821-46ba-8e3f-a8de9904ab2d"], "path_name": ["中国", "辽宁省", "营口市", "站前区"], "status": "active", "sort": 2994, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "695a0638-d062-4fe3-b89a-ae6a36aa32fb", "_rev": "2-824e5817bec91dfe44ba40139ac136b5", "type": "region", "code": "410411", "name": "湛河区", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "695a0638-d062-4fe3-b89a-ae6a36aa32fb"], "path_name": ["中国", "河南省", "平顶山市", "湛河区"], "status": "active", "sort": 2995, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "77d7cf1c-7545-4782-8632-b9b69a043ab3", "_rev": "2-9c22cb8357688a64807f395ecfe33f40", "type": "region", "code": "370303", "name": "张店区", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "77d7cf1c-7545-4782-8632-b9b69a043ab3"], "path_name": ["中国", "山东省", "淄博市", "张店区"], "status": "active", "sort": 2997, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "8232f9b4-325c-4df9-b6f4-375901b1eecd", "_rev": "2-cc50df2324b8f39c0a4aa385ecfac49d", "type": "region", "code": "130722", "name": "张北县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "8232f9b4-325c-4df9-b6f4-375901b1eecd"], "path_name": ["中国", "河北省", "张家口市", "张北县"], "status": "active", "sort": 2996, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "84ff9ef8-364f-4726-9f66-81e307085c5a", "_rev": "2-6ba54ca195d233fd9e20dba50b163f3f", "type": "region", "code": "530303", "name": "沾益区", "parent_id": "60267a8b-217c-4fb7-924c-0d94f9ba681d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "60267a8b-217c-4fb7-924c-0d94f9ba681d", "84ff9ef8-364f-4726-9f66-81e307085c5a"], "path_name": ["中国", "云南省", "曲靖市", "沾益区"], "status": "active", "sort": 2993, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:42", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:42"} +{"_id": "072728d0-6561-4fc8-9850-2d1d1bb03c7f", "_rev": "2-9bb57d7c1d506c513336263e67621342", "type": "region", "code": "350881", "name": "漳平市", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "072728d0-6561-4fc8-9850-2d1d1bb03c7f"], "path_name": ["中国", "福建省", "龙岩市", "漳平市"], "status": "active", "sort": 3004, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "31c43398-61b9-4575-a93f-6539858ac140", "_rev": "2-2032a1991a263585ba064cf093e85563", "type": "region", "code": "210922", "name": "彰武县", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "31c43398-61b9-4575-a93f-6539858ac140"], "path_name": ["中国", "辽宁省", "阜新市", "彰武县"], "status": "active", "sort": 3003, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "3987ddaa-2b86-4c16-a668-c016f0fe88ed", "_rev": "2-ecf2d2237102ae13f5eb264e861b3a18", "type": "region", "code": "360702", "name": "章贡区", "parent_id": "1dd7c152-69ff-4149-ab2f-02829bf028cd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "1dd7c152-69ff-4149-ab2f-02829bf028cd", "3987ddaa-2b86-4c16-a668-c016f0fe88ed"], "path_name": ["中国", "江西省", "赣州市", "章贡区"], "status": "active", "sort": 3001, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "6d0d97e7-d603-4a59-bd7f-6a087dd2e03f", "_rev": "2-11e4f7f9e708de5d5e17cfcd1939618c", "type": "region", "code": "320582", "name": "张家港市", "parent_id": "e1932036-d503-4116-813b-ac825e18adb3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "e1932036-d503-4116-813b-ac825e18adb3", "6d0d97e7-d603-4a59-bd7f-6a087dd2e03f"], "path_name": ["中国", "江苏省", "苏州市", "张家港市"], "status": "active", "sort": 2999, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "a9c97d1e-d3f2-4071-9e65-c0ef1c305295", "_rev": "2-5643281c33d94921ecec8b0bf377b068", "type": "region", "code": "420303", "name": "张湾区", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "a9c97d1e-d3f2-4071-9e65-c0ef1c305295"], "path_name": ["中国", "湖北省", "十堰市", "张湾区"], "status": "active", "sort": 3000, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "e8c71824-338f-4136-9255-d32032f16f38", "_rev": "2-269ced2a834ef97e855aee7071f5699a", "type": "region", "code": "370114", "name": "章丘区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "e8c71824-338f-4136-9255-d32032f16f38"], "path_name": ["中国", "山东省", "济南市", "章丘区"], "status": "active", "sort": 3002, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:43", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:43"} +{"_id": "0cfeb20e-f847-4ca0-b3b4-fd0144587c3f", "_rev": "2-12b2a37f694fa0e5d15bfa3e66c01511", "type": "region", "code": "220623", "name": "长白朝鲜族自治县", "parent_id": "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "816b6901-0a44-4d33-8b5c-3ebd8354fa1a", "0cfeb20e-f847-4ca0-b3b4-fd0144587c3f"], "path_name": ["中国", "吉林省", "白山市", "长白朝鲜族自治县"], "status": "active", "sort": 3008, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "787c81ae-a50f-4265-887d-6954aafe8d65", "_rev": "2-171644401451f2be327177da8e53b373", "type": "region", "code": "340121", "name": "长丰县", "parent_id": "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "b091b7ac-2565-4c2c-9f6a-94e3dd1ce260", "787c81ae-a50f-4265-887d-6954aafe8d65"], "path_name": ["中国", "安徽省", "合肥市", "长丰县"], "status": "active", "sort": 3009, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "90a914c2-424e-42ff-bc40-6cc6e3597392", "_rev": "2-dabf2d23b7232db498ba7440dfe0f1ec", "type": "region", "code": "360982", "name": "樟树市", "parent_id": "b07b53e0-2b61-4d27-93cc-34b2876dd336", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "b07b53e0-2b61-4d27-93cc-34b2876dd336", "90a914c2-424e-42ff-bc40-6cc6e3597392"], "path_name": ["中国", "江西省", "宜春市", "樟树市"], "status": "active", "sort": 3007, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "9db94538-bce0-4241-b563-df9bfa07f2bc", "_rev": "2-f2a3c8f26c71bfce5df92b28b32f85e6", "type": "region", "code": "350623", "name": "漳浦县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "9db94538-bce0-4241-b563-df9bfa07f2bc"], "path_name": ["中国", "福建省", "漳州市", "漳浦县"], "status": "active", "sort": 3005, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "ac6a2cd7-5020-4c42-b8d6-67bfac84abd4", "_rev": "2-9cb39e34e8c743733c2f3d28dc19b4d8", "type": "region", "code": "411082", "name": "长葛市", "parent_id": "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "650ab4d0-a995-4ba7-8d2f-5440b62e8314", "ac6a2cd7-5020-4c42-b8d6-67bfac84abd4"], "path_name": ["中国", "河南省", "许昌市", "长葛市"], "status": "active", "sort": 3010, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "e8fd9120-bf89-497a-94d7-fd355b2d5b19", "_rev": "2-e608a783e1f557471e2c1588c16e074c", "type": "region", "code": "621125", "name": "漳县", "parent_id": "fd8ef270-f9a0-4745-a260-7d515c757cda", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fd8ef270-f9a0-4745-a260-7d515c757cda", "e8fd9120-bf89-497a-94d7-fd355b2d5b19"], "path_name": ["中国", "甘肃省", "定西市", "漳县"], "status": "active", "sort": 3006, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:44", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:44"} +{"_id": "0133bba4-3ae6-41a8-a8d4-2f5a5e5dc584", "_rev": "2-bd1929e01e8a0825d4ec8bc093cca18b", "type": "region", "code": "350112", "name": "长乐区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "0133bba4-3ae6-41a8-a8d4-2f5a5e5dc584"], "path_name": ["中国", "福建省", "福州市", "长乐区"], "status": "active", "sort": 3012, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "0f23a57c-62c5-4538-b51c-b6533ca0d702", "_rev": "2-8734cb4be518aeb13db16d5718affe2d", "type": "region", "code": "511524", "name": "长宁县", "parent_id": "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "65ab5107-6e6c-4e90-a804-f055cb1e1e03", "0f23a57c-62c5-4538-b51c-b6533ca0d702"], "path_name": ["中国", "四川省", "宜宾市", "长宁县"], "status": "active", "sort": 3015, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "2077d235-0f63-45da-b58d-36fa7bcf557a", "_rev": "2-ad2c0b179c5e32f3ef024de672ac3f21", "type": "region", "code": "430121", "name": "长沙县", "parent_id": "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "4bcd9c83-8bca-464c-b2e1-f9c339da1f91", "2077d235-0f63-45da-b58d-36fa7bcf557a"], "path_name": ["中国", "湖南省", "长沙市", "长沙县"], "status": "active", "sort": 3017, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "40976ae2-98f8-4de8-b623-446810bdd275", "_rev": "2-30cbd5ef7921d7551cf07b21f27745b2", "type": "region", "code": "220722", "name": "长岭县", "parent_id": "85f6bada-ddaa-453b-88df-77e09fae0dd8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "85f6bada-ddaa-453b-88df-77e09fae0dd8", "40976ae2-98f8-4de8-b623-446810bdd275"], "path_name": ["中国", "吉林省", "松原市", "长岭县"], "status": "active", "sort": 3013, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "7dd0a10d-ea5f-47b7-a27e-2e0cea3be7d0", "_rev": "2-a1a17aefa23384d51982cde4fa138afc", "type": "region", "code": "370113", "name": "长清区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "7dd0a10d-ea5f-47b7-a27e-2e0cea3be7d0"], "path_name": ["中国", "山东省", "济南市", "长清区"], "status": "active", "sort": 3016, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "aa1265e1-c098-41b1-9229-9550b34b5af6", "_rev": "2-6c52ecf5c5fedb74a99a10f2d2ce54c7", "type": "region", "code": "210224", "name": "长海县", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "aa1265e1-c098-41b1-9229-9550b34b5af6"], "path_name": ["中国", "辽宁省", "大连市", "长海县"], "status": "active", "sort": 3011, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "c13adebb-92be-4712-bd89-b55ccbf27cf6", "_rev": "2-3db084052fea2ce47028e639b5be56b0", "type": "region", "code": "310105", "name": "长宁区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "c13adebb-92be-4712-bd89-b55ccbf27cf6"], "path_name": ["中国", "上海市", "长宁区"], "status": "active", "sort": 3014, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:45", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:45"} +{"_id": "7fa00bd8-5a34-4c66-9229-3d303a367a93", "_rev": "2-3ba269c18bdd5098630c0ca38b908515", "type": "region", "code": "610428", "name": "长武县", "parent_id": "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "6ef8d97d-b58a-4ecd-be87-09fc561ef47c", "7fa00bd8-5a34-4c66-9229-3d303a367a93"], "path_name": ["中国", "陕西省", "咸阳市", "长武县"], "status": "active", "sort": 3022, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "972e07f8-8424-4a46-9a9a-5ac7cfb91432", "_rev": "2-5e59e005fd8cfd5bfcfb7e3f65c155ea", "type": "region", "code": "350821", "name": "长汀县", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "972e07f8-8424-4a46-9a9a-5ac7cfb91432"], "path_name": ["中国", "福建省", "龙岩市", "长汀县"], "status": "active", "sort": 3021, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "b2b9a23a-0999-4638-85ec-b75c180e14db", "_rev": "2-63c502d1974966032ce1444fb6cb20a6", "type": "region", "code": "330522", "name": "长兴县", "parent_id": "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "0df8fb1e-cdec-496b-925c-e7fd2bd479c2", "b2b9a23a-0999-4638-85ec-b75c180e14db"], "path_name": ["中国", "浙江省", "湖州市", "长兴县"], "status": "active", "sort": 3023, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "d9e8cd85-c86d-42e0-918e-fe1aa60f65a5", "_rev": "2-689c26b83d5feac5cdafa5394cdc69b9", "type": "region", "code": "522729", "name": "长顺县", "parent_id": "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "f5a52d74-9ab0-49b5-a6f6-d250877c743b", "d9e8cd85-c86d-42e0-918e-fe1aa60f65a5"], "path_name": ["中国", "贵州省", "黔南布依族苗族自治州", "长顺县"], "status": "active", "sort": 3019, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "dbc0b446-dd22-4060-a462-6d19f4b1c8d4", "_rev": "2-719c192fec845b8c37a9336fa52a63a4", "type": "region", "code": "350605", "name": "长泰区", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "dbc0b446-dd22-4060-a462-6d19f4b1c8d4"], "path_name": ["中国", "福建省", "漳州市", "长泰区"], "status": "active", "sort": 3020, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "e2b6837c-35c2-4572-9c97-fdaba84b6c7b", "_rev": "2-aa89eef78b984e9493555d459984a9c2", "type": "region", "code": "500115", "name": "长寿区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "e2b6837c-35c2-4572-9c97-fdaba84b6c7b"], "path_name": ["中国", "重庆市", "长寿区"], "status": "active", "sort": 3018, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:46", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:46"} +{"_id": "1c784c62-f82f-45d9-a25c-81bf0bfa8730", "_rev": "2-c583ce19300a413508162cde2cf0f957", "type": "region", "code": "510811", "name": "昭化区", "parent_id": "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "cb331cb1-bbaa-439b-9355-141f6c0bcf91", "1c784c62-f82f-45d9-a25c-81bf0bfa8730"], "path_name": ["中国", "四川省", "广元市", "昭化区"], "status": "active", "sort": 3029, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "2760e171-e87f-4782-b7b2-9f51b071fb57", "_rev": "2-7f45a679b457140cee7aa58313102272", "type": "region", "code": "410783", "name": "长垣市", "parent_id": "0d378148-8639-4bac-9f93-03e546a0e143", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "0d378148-8639-4bac-9f93-03e546a0e143", "2760e171-e87f-4782-b7b2-9f51b071fb57"], "path_name": ["中国", "河南省", "新乡市", "长垣市"], "status": "active", "sort": 3025, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "401503e3-af5c-4e1a-906f-c3be0bf4be72", "_rev": "2-42d2d57eb2d824519b18e92c4e865878", "type": "region", "code": "370685", "name": "招远市", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "401503e3-af5c-4e1a-906f-c3be0bf4be72"], "path_name": ["中国", "山东省", "烟台市", "招远市"], "status": "active", "sort": 3028, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "98476f78-5da9-46ae-abb9-ff5bb8dcd4e4", "_rev": "2-d7e41dd536cb6692b88540d33316e0aa", "type": "region", "code": "513431", "name": "昭觉县", "parent_id": "1b6f4672-7a33-4186-a68e-7df1255701d0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "1b6f4672-7a33-4186-a68e-7df1255701d0", "98476f78-5da9-46ae-abb9-ff5bb8dcd4e4"], "path_name": ["中国", "四川省", "凉山彝族自治州", "昭觉县"], "status": "active", "sort": 3030, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "9dbe9689-c5bb-431e-86b8-7790c9414030", "_rev": "2-68928279770464909b8e0b65bc0ae3e8", "type": "region", "code": "420528", "name": "长阳土家族自治县", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "9dbe9689-c5bb-431e-86b8-7790c9414030"], "path_name": ["中国", "湖北省", "宜昌市", "长阳土家族自治县"], "status": "active", "sort": 3024, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "dac45d1f-941e-49af-ae5b-0e4aa68b9358", "_rev": "2-805e934f2146fb25a42e0c2fd6c0796e", "type": "region", "code": "140428", "name": "长子县", "parent_id": "83a79d7a-1eff-4195-958f-fa9de8b5089a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "83a79d7a-1eff-4195-958f-fa9de8b5089a", "dac45d1f-941e-49af-ae5b-0e4aa68b9358"], "path_name": ["中国", "山西省", "长治市", "长子县"], "status": "active", "sort": 3027, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "f0e9b24b-f1ab-44b3-97f0-74afdcbe46cc", "_rev": "2-7e93b4c6a610cd401594b4907e5ddba3", "type": "region", "code": "450405", "name": "长洲区", "parent_id": "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "294e5ea6-76cb-4ed4-9921-6fb25bbf7ae4", "f0e9b24b-f1ab-44b3-97f0-74afdcbe46cc"], "path_name": ["中国", "广西壮族自治区", "梧州市", "长洲区"], "status": "active", "sort": 3026, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:47", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:47"} +{"_id": "01c68cdb-ee21-40aa-b4f4-d64de4c94146", "_rev": "2-d1d1516e24e836c413ea066d2c5a9119", "type": "region", "code": "231282", "name": "肇东市", "parent_id": "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "fb9e5a62-00d9-4b7f-8934-5cea46996f44", "01c68cdb-ee21-40aa-b4f4-d64de4c94146"], "path_name": ["中国", "黑龙江省", "绥化市", "肇东市"], "status": "active", "sort": 3037, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "29cde11d-4d58-44bd-8e26-8b38bf9b5fca", "_rev": "2-7f2582583883527dd75dcbe7a798c5ec", "type": "region", "code": "451121", "name": "昭平县", "parent_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "29cde11d-4d58-44bd-8e26-8b38bf9b5fca"], "path_name": ["中国", "广西壮族自治区", "贺州市", "昭平县"], "status": "active", "sort": 3031, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "6ded50ec-0145-492a-96ca-5030d08e200c", "_rev": "2-84077cf7c5d9fa740dd7f6f1b2007ccf", "type": "region", "code": "130133", "name": "赵县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "6ded50ec-0145-492a-96ca-5030d08e200c"], "path_name": ["中国", "河北省", "石家庄市", "赵县"], "status": "active", "sort": 3036, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "7501e5fe-25a6-400b-ad73-0ff1c913da14", "_rev": "2-5fa6d60a0f627abe35a6e1d174aba8eb", "type": "region", "code": "530602", "name": "昭阳区", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "7501e5fe-25a6-400b-ad73-0ff1c913da14"], "path_name": ["中国", "云南省", "昭通市", "昭阳区"], "status": "active", "sort": 3033, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "d300a986-9bbc-43df-9eb6-697725e327d6", "_rev": "2-d2d2abd62c94cf92a17679d452d24985", "type": "region", "code": "350624", "name": "诏安县", "parent_id": "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "f21283f3-4958-4c1c-a070-04b4d9f07e6d", "d300a986-9bbc-43df-9eb6-697725e327d6"], "path_name": ["中国", "福建省", "漳州市", "诏安县"], "status": "active", "sort": 3035, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "d996e413-c6df-4092-a160-1cd4d4db1732", "_rev": "2-33093014a794dcc7dcfd1dedd28417ff", "type": "region", "code": "654026", "name": "昭苏县", "parent_id": "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "7ded4e4a-c57f-4cf9-a0b4-ccd9dd7e417a", "d996e413-c6df-4092-a160-1cd4d4db1732"], "path_name": ["中国", "新疆维吾尔自治区", "伊犁哈萨克自治州", "昭苏县"], "status": "active", "sort": 3032, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "e07fb5c1-8bcc-4fa3-b9ce-afb187cef83c", "_rev": "2-44793d801583c671bdedff096e9c6833", "type": "region", "code": "411104", "name": "召陵区", "parent_id": "d41f466d-690a-4104-b545-35ba392a52d2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d41f466d-690a-4104-b545-35ba392a52d2", "e07fb5c1-8bcc-4fa3-b9ce-afb187cef83c"], "path_name": ["中国", "河南省", "漯河市", "召陵区"], "status": "active", "sort": 3034, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:48", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:48"} +{"_id": "527d9db3-8ebf-4d7c-a6d9-c94e44d649d1", "_rev": "2-7fde42ef4ee2c665f1f45ae439f76298", "type": "region", "code": "230621", "name": "肇州县", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "527d9db3-8ebf-4d7c-a6d9-c94e44d649d1"], "path_name": ["中国", "黑龙江省", "大庆市", "肇州县"], "status": "active", "sort": 3039, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:49"} +{"_id": "54ab109c-6e4a-483a-9e50-ad5527a6a3f3", "_rev": "2-09b2c8b002cda600ddf85c5f837e824e", "type": "region", "code": "411424", "name": "柘城县", "parent_id": "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "d2d6fd34-bccb-4e7d-a76d-de7063203fab", "54ab109c-6e4a-483a-9e50-ad5527a6a3f3"], "path_name": ["中国", "河南省", "商丘市", "柘城县"], "status": "active", "sort": 3040, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:49"} +{"_id": "b261431c-6481-46e8-8e32-e2a538fa9a28", "_rev": "2-03d205a385c7d20d78f8dd8eb0e35738", "type": "region", "code": "350926", "name": "柘荣县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "b261431c-6481-46e8-8e32-e2a538fa9a28"], "path_name": ["中国", "福建省", "宁德市", "柘荣县"], "status": "active", "sort": 3041, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:49"} +{"_id": "c925afe2-0c47-4377-a891-cea82e9a65b6", "_rev": "2-7d4a11f68d495a17311953a3e8d84960", "type": "region", "code": "230622", "name": "肇源县", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "c925afe2-0c47-4377-a891-cea82e9a65b6"], "path_name": ["中国", "黑龙江省", "大庆市", "肇源县"], "status": "active", "sort": 3038, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:49", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:49"} +{"_id": "2fb26c33-7c67-43f6-a782-218abe822f0b", "_rev": "2-e90b40a0fd2cae5e2ee31272d6cfb2d5", "type": "region", "code": "610728", "name": "镇巴县", "parent_id": "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "9b647d6d-9b3a-4ed7-9ed9-c75463074371", "2fb26c33-7c67-43f6-a782-218abe822f0b"], "path_name": ["中国", "陕西省", "汉中市", "镇巴县"], "status": "active", "sort": 3047, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "6822f655-5f4c-47a3-8371-2a56967aaafc", "_rev": "2-f1670b023978be060edf257c21cd6577", "type": "region", "code": "210603", "name": "振兴区", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "6822f655-5f4c-47a3-8371-2a56967aaafc"], "path_name": ["中国", "辽宁省", "丹东市", "振兴区"], "status": "active", "sort": 3045, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "756ba498-5887-4e31-9b63-56e3548b879f", "_rev": "2-e411336ad6ea7776b21513371a09f2f1", "type": "region", "code": "440204", "name": "浈江区", "parent_id": "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "b7ad8aa8-6832-485d-8229-04aa15ccb5d8", "756ba498-5887-4e31-9b63-56e3548b879f"], "path_name": ["中国", "广东省", "韶关市", "浈江区"], "status": "active", "sort": 3043, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "c20657c6-5677-4d44-9d88-b30497cbacb9", "_rev": "2-2748de6ad433cf3edba7365f633c6409", "type": "region", "code": "611025", "name": "镇安县", "parent_id": "5cb325bc-1563-4386-a3de-faedce955a86", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5cb325bc-1563-4386-a3de-faedce955a86", "c20657c6-5677-4d44-9d88-b30497cbacb9"], "path_name": ["中国", "陕西省", "商洛市", "镇安县"], "status": "active", "sort": 3046, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "dc1881bf-4e29-447d-9784-392912cfdc4c", "_rev": "2-0c723129e67f8959f35cb25ff4e45311", "type": "region", "code": "522325", "name": "贞丰县", "parent_id": "eff34dee-745f-4615-a074-5491d809d053", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "eff34dee-745f-4615-a074-5491d809d053", "dc1881bf-4e29-447d-9784-392912cfdc4c"], "path_name": ["中国", "贵州省", "黔西南布依族苗族自治州", "贞丰县"], "status": "active", "sort": 3042, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "dd3acd24-9bcd-48f9-9809-223c9375be97", "_rev": "2-3681818403f3b55fe59fedd47c366cb1", "type": "region", "code": "210604", "name": "振安区", "parent_id": "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "ec52ce61-88e0-49d0-b3e7-066a26c64da3", "dd3acd24-9bcd-48f9-9809-223c9375be97"], "path_name": ["中国", "辽宁省", "丹东市", "振安区"], "status": "active", "sort": 3044, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:50", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:50"} +{"_id": "11a6cde8-2c48-4790-b8b1-ad8f221175ea", "_rev": "2-265522c45e42bba57708dcf0a9aad377", "type": "region", "code": "530627", "name": "镇雄县", "parent_id": "59c79f26-08a9-49f0-8646-e9dca8b4580e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "59c79f26-08a9-49f0-8646-e9dca8b4580e", "11a6cde8-2c48-4790-b8b1-ad8f221175ea"], "path_name": ["中国", "云南省", "昭通市", "镇雄县"], "status": "active", "sort": 3054, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "27233116-f61f-4d8e-af76-4c38f9571671", "_rev": "2-791ce15cc29c5e5a17d34c1fe9b9a05e", "type": "region", "code": "330211", "name": "镇海区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "27233116-f61f-4d8e-af76-4c38f9571671"], "path_name": ["中国", "浙江省", "宁波市", "镇海区"], "status": "active", "sort": 3048, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "669d9a14-3565-42ea-a700-18563b40bafe", "_rev": "2-1fc3f9d23215249c715eccd875bc0dae", "type": "region", "code": "411324", "name": "镇平县", "parent_id": "87eea72d-2a92-4f6e-9234-b183c72053ed", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "87eea72d-2a92-4f6e-9234-b183c72053ed", "669d9a14-3565-42ea-a700-18563b40bafe"], "path_name": ["中国", "河南省", "南阳市", "镇平县"], "status": "active", "sort": 3052, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "8fcf103f-6b07-4710-9a68-98d51a1baaf8", "_rev": "2-8c969c5e715712fe32948472375badc0", "type": "region", "code": "520423", "name": "镇宁布依族苗族自治县", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "8fcf103f-6b07-4710-9a68-98d51a1baaf8"], "path_name": ["中国", "贵州省", "安顺市", "镇宁布依族苗族自治县"], "status": "active", "sort": 3051, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "960582c4-fbc8-4022-b3ce-2573a4bf8c0b", "_rev": "2-05a227dabafb0d5c560e310b6df3af67", "type": "region", "code": "530924", "name": "镇康县", "parent_id": "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "5c2dad09-f6e9-44df-ac23-9f48db7019b7", "960582c4-fbc8-4022-b3ce-2573a4bf8c0b"], "path_name": ["中国", "云南省", "临沧市", "镇康县"], "status": "active", "sort": 3049, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "af250e35-1ca6-490d-a277-1b0085334a9a", "_rev": "2-781cb4582bdfd5581f8310a4edeeda4b", "type": "region", "code": "220821", "name": "镇赉县", "parent_id": "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "fbbff7a7-cdd6-4018-b72e-7a5088ee5ee0", "af250e35-1ca6-490d-a277-1b0085334a9a"], "path_name": ["中国", "吉林省", "白城市", "镇赉县"], "status": "active", "sort": 3050, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "fd34384d-f2ac-4c72-9b85-d5978c97e4d1", "_rev": "2-96cbb94df946d7395840e961bb61eb5d", "type": "region", "code": "610927", "name": "镇坪县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "fd34384d-f2ac-4c72-9b85-d5978c97e4d1"], "path_name": ["中国", "陕西省", "安康市", "镇坪县"], "status": "active", "sort": 3053, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:51", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:51"} +{"_id": "4460f708-33ee-4b2a-a4fe-b793494effa6", "_rev": "2-331d0138b571765223d719a8ffef8170", "type": "region", "code": "130123", "name": "正定县", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "4460f708-33ee-4b2a-a4fe-b793494effa6"], "path_name": ["中国", "河北省", "石家庄市", "正定县"], "status": "active", "sort": 3060, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "d849240e-c88d-4b0a-bed0-bda99737035b", "_rev": "2-331ec56fc472c68f7a59c05d54478daa", "type": "region", "code": "522625", "name": "镇远县", "parent_id": "97cca774-d712-483a-84c6-cb20498abeb2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "97cca774-d712-483a-84c6-cb20498abeb2", "d849240e-c88d-4b0a-bed0-bda99737035b"], "path_name": ["中国", "贵州省", "黔东南苗族侗族自治州", "镇远县"], "status": "active", "sort": 3057, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "da0c183e-7f5b-4ecc-96f2-214b670cfd56", "_rev": "2-9dac4839d16e570eb33df9a5c98f254a", "type": "region", "code": "430408", "name": "蒸湘区", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "da0c183e-7f5b-4ecc-96f2-214b670cfd56"], "path_name": ["中国", "湖南省", "衡阳市", "蒸湘区"], "status": "active", "sort": 3058, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "e2230d55-23ec-4db2-8ecc-b331005db0df", "_rev": "2-1abfe2439ee81e3283d4b978aea8e10f", "type": "region", "code": "520324", "name": "正安县", "parent_id": "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "8c7cf5b3-41ec-444d-9fb9-cdf8dbaa6d23", "e2230d55-23ec-4db2-8ecc-b331005db0df"], "path_name": ["中国", "贵州省", "遵义市", "正安县"], "status": "active", "sort": 3059, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "ed27c868-21ad-4631-9267-ebcf011dfd32", "_rev": "2-24bd6af193d79c0b0d2ac935f8e3912b", "type": "region", "code": "530825", "name": "镇沅彝族哈尼族拉祜族自治县", "parent_id": "164b3b0b-9d2f-4945-8804-67778d892592", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b5409f81-46bd-44f5-a9e0-4887b3811a00", "164b3b0b-9d2f-4945-8804-67778d892592", "ed27c868-21ad-4631-9267-ebcf011dfd32"], "path_name": ["中国", "云南省", "普洱市", "镇沅彝族哈尼族拉祜族自治县"], "status": "active", "sort": 3055, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "f4fbdc53-bef7-48ce-a87b-d13626522636", "_rev": "2-33f8a701aebb0cde77b681bf011eef5e", "type": "region", "code": "621027", "name": "镇原县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "f4fbdc53-bef7-48ce-a87b-d13626522636"], "path_name": ["中国", "甘肃省", "庆阳市", "镇原县"], "status": "active", "sort": 3056, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:52", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:52"} +{"_id": "8b50c99e-8fd2-49e7-993e-31624ddbe098", "_rev": "2-98d4b1de3917d4c00793850292a6b4b8", "type": "region", "code": "152530", "name": "正蓝旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "8b50c99e-8fd2-49e7-993e-31624ddbe098"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "正蓝旗"], "status": "active", "sort": 3061, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "bac0f395-bbaa-4498-baeb-efcaf29cb32b", "_rev": "2-f18aab24be7084c85db2faa03f30afb9", "type": "region", "code": "621025", "name": "正宁县", "parent_id": "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "fea3bcb1-1341-4d5a-a280-30262b1ae16b", "bac0f395-bbaa-4498-baeb-efcaf29cb32b"], "path_name": ["中国", "甘肃省", "庆阳市", "正宁县"], "status": "active", "sort": 3062, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "c2a250ee-0804-48bf-afaa-8dd9f09ef36e", "_rev": "2-5608ea0a9d1c227780ee979421d76fd8", "type": "region", "code": "411724", "name": "正阳县", "parent_id": "84d41721-d1c0-434d-91aa-a37094329514", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "84d41721-d1c0-434d-91aa-a37094329514", "c2a250ee-0804-48bf-afaa-8dd9f09ef36e"], "path_name": ["中国", "河南省", "驻马店市", "正阳县"], "status": "active", "sort": 3064, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "ee242a89-134b-478a-af50-a757a436f124", "_rev": "2-a6b00f9de4db880e1146e0423cc1c051", "type": "region", "code": "152529", "name": "正镶白旗", "parent_id": "41d3c980-0698-4f5d-958a-ce793af303a5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "41d3c980-0698-4f5d-958a-ce793af303a5", "ee242a89-134b-478a-af50-a757a436f124"], "path_name": ["中国", "内蒙古自治区", "锡林郭勒盟", "正镶白旗"], "status": "active", "sort": 3063, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "f1466667-7e9f-4de0-afe2-fce1e406492e", "_rev": "2-0aa760d686dc997029017c3a51985988", "type": "region", "code": "370602", "name": "芝罘区", "parent_id": "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "32a18a85-cf47-43da-ab41-ce072c8fcc2e", "f1466667-7e9f-4de0-afe2-fce1e406492e"], "path_name": ["中国", "山东省", "烟台市", "芝罘区"], "status": "active", "sort": 3066, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "fdd6cbe3-3a7d-4088-a634-552c3cd954d0", "_rev": "2-2d77a4ab5b12ee41ae03cf0221f3a95b", "type": "region", "code": "420583", "name": "枝江市", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "fdd6cbe3-3a7d-4088-a634-552c3cd954d0"], "path_name": ["中国", "湖北省", "宜昌市", "枝江市"], "status": "active", "sort": 3067, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "fe1a920a-6b9d-477d-96c4-6520602225bc", "_rev": "2-278b5ca44730d066e44fd569bf846ae6", "type": "region", "code": "350725", "name": "政和县", "parent_id": "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "7ff08b5e-413d-4a11-b1c4-cfb9d7f1ce95", "fe1a920a-6b9d-477d-96c4-6520602225bc"], "path_name": ["中国", "福建省", "南平市", "政和县"], "status": "active", "sort": 3065, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:53", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:53"} +{"_id": "2430f3e1-9090-48e3-ba2b-d7a342baabb5", "_rev": "2-72765682eb00682edd779427b40b3968", "type": "region", "code": "431228", "name": "芷江侗族自治县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "2430f3e1-9090-48e3-ba2b-d7a342baabb5"], "path_name": ["中国", "湖南省", "怀化市", "芷江侗族自治县"], "status": "active", "sort": 3069, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "6d01ab0f-4e38-420e-82ef-5f9be1e02806", "_rev": "2-6e5aab5ab214405291a55817a668ebdc", "type": "region", "code": "431221", "name": "中方县", "parent_id": "d12277c0-3cb5-4956-8341-8fe1c4af6236", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "d12277c0-3cb5-4956-8341-8fe1c4af6236", "6d01ab0f-4e38-420e-82ef-5f9be1e02806"], "path_name": ["中国", "湖南省", "怀化市", "中方县"], "status": "active", "sort": 3072, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "7bf03358-72ac-482e-8e26-110c1a443be0", "_rev": "2-cdfb594dc526f9b8df6adf5ad3fe0f36", "type": "region", "code": "520524", "name": "织金县", "parent_id": "62563f38-d54b-45ef-8c49-30b727fccb75", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "62563f38-d54b-45ef-8c49-30b727fccb75", "7bf03358-72ac-482e-8e26-110c1a443be0"], "path_name": ["中国", "贵州省", "毕节市", "织金县"], "status": "active", "sort": 3068, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "897a7b72-a8f8-4b8e-bad8-71074adeac2b", "_rev": "2-29615c9d1f681ab4aeffb05a72679c9a", "type": "region", "code": "410122", "name": "中牟县", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "897a7b72-a8f8-4b8e-bad8-71074adeac2b"], "path_name": ["中国", "河南省", "郑州市", "中牟县"], "status": "active", "sort": 3074, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "a8200e51-8279-4c52-809d-ed5df1d541d0", "_rev": "2-05872c4c02c9921367df2d7dc143154a", "type": "region", "code": "510623", "name": "中江县", "parent_id": "63d797a5-5304-49a9-aef1-1c52e497b184", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "63d797a5-5304-49a9-aef1-1c52e497b184", "a8200e51-8279-4c52-809d-ed5df1d541d0"], "path_name": ["中国", "四川省", "德阳市", "中江县"], "status": "active", "sort": 3073, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "ae40957f-7d36-47e5-978e-85f3f136ad85", "_rev": "2-443174a3edb3826669f2e67cec37e653", "type": "region", "code": "632724", "name": "治多县", "parent_id": "98c3d5ca-65c8-46e8-819b-03ab45dda423", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "98c3d5ca-65c8-46e8-819b-03ab45dda423", "ae40957f-7d36-47e5-978e-85f3f136ad85"], "path_name": ["中国", "青海省", "玉树藏族自治州", "治多县"], "status": "active", "sort": 3071, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "e213857d-f7b5-4367-88f0-907bdc2890ff", "_rev": "2-8668acebff6dda5a60f209475c354d35", "type": "region", "code": "610625", "name": "志丹县", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "e213857d-f7b5-4367-88f0-907bdc2890ff"], "path_name": ["中国", "陕西省", "延安市", "志丹县"], "status": "active", "sort": 3070, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "e9dc7e94-9bb9-4419-bc03-2a8eff853046", "_rev": "2-704bd1e44beec7040e0e040fc9656ac5", "type": "region", "code": "640521", "name": "中宁县", "parent_id": "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "33620fb9-3d5b-43f8-900c-7978e9ebbbe3", "e9dc7e94-9bb9-4419-bc03-2a8eff853046"], "path_name": ["中国", "宁夏回族自治区", "中卫市", "中宁县"], "status": "active", "sort": 3075, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:54", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:54"} +{"_id": "1b7cace6-5033-4717-900d-52361ffd3f7c", "_rev": "2-a944974960cf99325fc9331ed61af179", "type": "region", "code": "442000", "name": "中山市", "parent_id": "266aa57c-d98f-46eb-bd0a-2228814baf12", "region_type": "city", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "1b7cace6-5033-4717-900d-52361ffd3f7c"], "path_name": ["中国", "广东省", "中山市"], "status": "active", "sort": 3076, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "24cfa589-99cf-437b-ac00-620a62e8cde9", "_rev": "2-4153052afe6d4dac62b65a1cf4559589", "type": "region", "code": "410102", "name": "中原区", "parent_id": "b82b72f7-3f66-484b-8117-5f6fe99962c3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "b82b72f7-3f66-484b-8117-5f6fe99962c3", "24cfa589-99cf-437b-ac00-620a62e8cde9"], "path_name": ["中国", "河南省", "郑州市", "中原区"], "status": "active", "sort": 3078, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "2bc3470d-c556-45e6-a559-ff9f0220f422", "_rev": "2-756b636ed793892bb0a104ebec376bfa", "type": "region", "code": "520201", "name": "钟山区", "parent_id": "b284639e-6eb4-4c35-add3-3f31cef7708a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "b284639e-6eb4-4c35-add3-3f31cef7708a", "2bc3470d-c556-45e6-a559-ff9f0220f422"], "path_name": ["中国", "贵州省", "六盘水市", "钟山区"], "status": "active", "sort": 3082, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "63255b63-177a-41e2-9174-8d7d671d4d50", "_rev": "2-81f10b6d9472ce2301ad0a0ac1821ddd", "type": "region", "code": "500233", "name": "忠县", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "63255b63-177a-41e2-9174-8d7d671d4d50"], "path_name": ["中国", "重庆市", "忠县"], "status": "active", "sort": 3080, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "6b49cfbb-58c5-4694-b388-426093cfa5ed", "_rev": "2-021fbece3514354bed3e9b57ed12fa04", "type": "region", "code": "320404", "name": "钟楼区", "parent_id": "56d836dd-2a34-438b-b583-b880b4ff5e68", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "56d836dd-2a34-438b-b583-b880b4ff5e68", "6b49cfbb-58c5-4694-b388-426093cfa5ed"], "path_name": ["中国", "江苏省", "常州市", "钟楼区"], "status": "active", "sort": 3081, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "764fcb59-5ac7-45ee-9c1a-915585f940cb", "_rev": "2-edaa62739044da761c441997ab609b6b", "type": "region", "code": "141129", "name": "中阳县", "parent_id": "6adb4223-728b-4181-b19c-935d9a5ad67d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "6adb4223-728b-4181-b19c-935d9a5ad67d", "764fcb59-5ac7-45ee-9c1a-915585f940cb"], "path_name": ["中国", "山西省", "吕梁市", "中阳县"], "status": "active", "sort": 3077, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "b4dac644-42b2-4d5f-98ec-642db50a1db1", "_rev": "2-2dff8d6fb7500ffad1ff10648ff86610", "type": "region", "code": "410803", "name": "中站区", "parent_id": "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "f84e6acd-b0fd-413f-ba30-2a3ef3cd90c2", "b4dac644-42b2-4d5f-98ec-642db50a1db1"], "path_name": ["中国", "河南省", "焦作市", "中站区"], "status": "active", "sort": 3079, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:55", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:55"} +{"_id": "06c2f935-68fd-44b1-a7c8-e7e6df2c17c1", "_rev": "2-1c5485d6ce983374c53e128bb304f73f", "type": "region", "code": "350925", "name": "周宁县", "parent_id": "5b0fcd8e-9578-4199-a829-841ab7caed5b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "5b0fcd8e-9578-4199-a829-841ab7caed5b", "06c2f935-68fd-44b1-a7c8-e7e6df2c17c1"], "path_name": ["中国", "福建省", "宁德市", "周宁县"], "status": "active", "sort": 3088, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "16cb61ea-6e2a-4182-bfd8-f68c7c404890", "_rev": "2-28ed1e9900aeb713f875d40396aa6186", "type": "region", "code": "370306", "name": "周村区", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "16cb61ea-6e2a-4182-bfd8-f68c7c404890"], "path_name": ["中国", "山东省", "淄博市", "周村区"], "status": "active", "sort": 3087, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "189acb1d-20e5-492a-8556-7c32e4b73552", "_rev": "2-5d1741980839f9c3aadaecc5a6a566b2", "type": "region", "code": "420881", "name": "钟祥市", "parent_id": "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "10c281a6-0f56-4bff-ac4b-f5460b9b78a8", "189acb1d-20e5-492a-8556-7c32e4b73552"], "path_name": ["中国", "湖北省", "荆门市", "钟祥市"], "status": "active", "sort": 3084, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "1dc63780-56fe-4bf0-b727-eb1c5780d798", "_rev": "2-7ac73bff1e04b43b446aaf4bfdd34122", "type": "region", "code": "610124", "name": "周至县", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "1dc63780-56fe-4bf0-b727-eb1c5780d798"], "path_name": ["中国", "陕西省", "西安市", "周至县"], "status": "active", "sort": 3089, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "52a0414e-d20a-449a-a208-c6e2497cbad8", "_rev": "2-9efe614b0ff8787e38849fe19c8fe073", "type": "region", "code": "623023", "name": "舟曲县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "52a0414e-d20a-449a-a208-c6e2497cbad8"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "舟曲县"], "status": "active", "sort": 3086, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "886bde4d-a389-41ab-9b3b-ae58b278372a", "_rev": "2-21bf857c4bd9b333cf5a4254f83ea92e", "type": "region", "code": "451122", "name": "钟山县", "parent_id": "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "5f41175c-bd81-4b11-bdc2-306e1b8f4ac2", "886bde4d-a389-41ab-9b3b-ae58b278372a"], "path_name": ["中国", "广西壮族自治区", "贺州市", "钟山县"], "status": "active", "sort": 3083, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "e9ffc4e2-6d48-4987-8220-1bbfb228bcaf", "_rev": "2-3a93d34948487fda23ae40aca2157fd6", "type": "region", "code": "540232", "name": "仲巴县", "parent_id": "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "b38b00f0-3896-4d7b-9ed5-146fb3aa65ae", "e9ffc4e2-6d48-4987-8220-1bbfb228bcaf"], "path_name": ["中国", "西藏自治区", "日喀则市", "仲巴县"], "status": "active", "sort": 3085, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:56", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:56"} +{"_id": "0a5f17aa-bcc7-469a-88a5-e815dc850d88", "_rev": "2-88f7f9320b5c5be38da6277d60b89b00", "type": "region", "code": "620825", "name": "庄浪县", "parent_id": "887433d3-8504-4f8d-b3fe-3fe3819c704e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "887433d3-8504-4f8d-b3fe-3fe3819c704e", "0a5f17aa-bcc7-469a-88a5-e815dc850d88"], "path_name": ["中国", "甘肃省", "平凉市", "庄浪县"], "status": "active", "sort": 3096, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "28156293-bd8c-42d0-9b11-386615290d28", "_rev": "2-cbf1001b4aa9ad048618865c58f5b5aa", "type": "region", "code": "210283", "name": "庄河市", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "28156293-bd8c-42d0-9b11-386615290d28"], "path_name": ["中国", "辽宁省", "大连市", "庄河市"], "status": "active", "sort": 3095, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "51cc85f5-8707-42cb-8fbb-22ccd7e01f04", "_rev": "2-bf685fc76828c83b9b4c19b18f7a5bc4", "type": "region", "code": "430405", "name": "珠晖区", "parent_id": "cc891c6a-474d-4b2a-b7be-7b7d86457067", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "cc891c6a-474d-4b2a-b7be-7b7d86457067", "51cc85f5-8707-42cb-8fbb-22ccd7e01f04"], "path_name": ["中国", "湖南省", "衡阳市", "珠晖区"], "status": "active", "sort": 3090, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "88f4d234-9dc9-4e90-b4fc-2abf54ac4f93", "_rev": "2-9e13532c5cd800d093003a96a41a6d1c", "type": "region", "code": "330681", "name": "诸暨市", "parent_id": "529daba3-e926-4403-b572-16a0844faea0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "529daba3-e926-4403-b572-16a0844faea0", "88f4d234-9dc9-4e90-b4fc-2abf54ac4f93"], "path_name": ["中国", "浙江省", "绍兴市", "诸暨市"], "status": "active", "sort": 3092, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "8e1c0177-d75d-47b4-bf32-3a1fc56a428f", "_rev": "2-a37700828d11b6356bad6c740b5d2467", "type": "region", "code": "420324", "name": "竹溪县", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "8e1c0177-d75d-47b4-bf32-3a1fc56a428f"], "path_name": ["中国", "湖北省", "十堰市", "竹溪县"], "status": "active", "sort": 3094, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "a514d487-2970-4acc-8648-445d812ad5f2", "_rev": "2-5b5514fe9a2b999096eefb8e1a8862a8", "type": "region", "code": "420323", "name": "竹山县", "parent_id": "906c7511-d3cb-40df-985a-71c776aaf962", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "906c7511-d3cb-40df-985a-71c776aaf962", "a514d487-2970-4acc-8648-445d812ad5f2"], "path_name": ["中国", "湖北省", "十堰市", "竹山县"], "status": "active", "sort": 3093, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "dc7008b0-99c8-4f0c-aeb8-5ebc207bcc5c", "_rev": "2-65c5585670f7f46efb8cb83e6d8b9852", "type": "region", "code": "370782", "name": "诸城市", "parent_id": "43b83737-4f68-4995-9d9d-1d757b85ab19", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "43b83737-4f68-4995-9d9d-1d757b85ab19", "dc7008b0-99c8-4f0c-aeb8-5ebc207bcc5c"], "path_name": ["中国", "山东省", "潍坊市", "诸城市"], "status": "active", "sort": 3091, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:57", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:57"} +{"_id": "01464e4a-c12f-4726-ba54-86cef60a9f0a", "_rev": "2-5f971f9295319e8ed893b4d0d6097501", "type": "region", "code": "150622", "name": "准格尔旗", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "01464e4a-c12f-4726-ba54-86cef60a9f0a"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "准格尔旗"], "status": "active", "sort": 3097, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "0b84905e-93fc-49d4-8d08-6467331f7c46", "_rev": "2-250d686ae86a53d904ce1401094386f2", "type": "region", "code": "623022", "name": "卓尼县", "parent_id": "7f2533bf-e256-44fd-bee4-376581134d02", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "7f2533bf-e256-44fd-bee4-376581134d02", "0b84905e-93fc-49d4-8d08-6467331f7c46"], "path_name": ["中国", "甘肃省", "甘南藏族自治州", "卓尼县"], "status": "active", "sort": 3100, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "0fdd30d1-819a-40b0-bcdb-221d3a5bc925", "_rev": "2-f6975e837f4e1a3c3d5272886de95706", "type": "region", "code": "150921", "name": "卓资县", "parent_id": "102272e7-858c-444d-b249-fc548c12be6d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "102272e7-858c-444d-b249-fc548c12be6d", "0fdd30d1-819a-40b0-bcdb-221d3a5bc925"], "path_name": ["中国", "内蒙古自治区", "乌兰察布市", "卓资县"], "status": "active", "sort": 3101, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "4ba920f2-5e4b-4d8a-95d4-a305fce38937", "_rev": "2-049da3dfba3a428a48e38949cbdd0a72", "type": "region", "code": "130681", "name": "涿州市", "parent_id": "3296412a-6f98-4070-b1c4-6d09f652c1db", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "3296412a-6f98-4070-b1c4-6d09f652c1db", "4ba920f2-5e4b-4d8a-95d4-a305fce38937"], "path_name": ["中国", "河北省", "保定市", "涿州市"], "status": "active", "sort": 3099, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "83ef10bc-2686-421c-89a3-0ca62f64f809", "_rev": "2-408f470ca202c532843f98667fb838a1", "type": "region", "code": "431081", "name": "资兴市", "parent_id": "7bd6963b-9008-4756-96d0-3cba7d5e8777", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "7bd6963b-9008-4756-96d0-3cba7d5e8777", "83ef10bc-2686-421c-89a3-0ca62f64f809"], "path_name": ["中国", "湖南省", "郴州市", "资兴市"], "status": "active", "sort": 3103, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "a9c10903-7b54-449e-82ee-9dcb71b819ad", "_rev": "2-3de44cd96cbfd19e36a1eeb57fc03c11", "type": "region", "code": "130731", "name": "涿鹿县", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "a9c10903-7b54-449e-82ee-9dcb71b819ad"], "path_name": ["中国", "河北省", "张家口市", "涿鹿县"], "status": "active", "sort": 3098, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "fb2025b0-6417-4b1e-8acc-1097bd3ddf97", "_rev": "2-0dbe33dd7e2af4965ffc72ce127fd52d", "type": "region", "code": "361028", "name": "资溪县", "parent_id": "4aad809b-5895-4e21-8089-d18d20fdc3e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "4aad809b-5895-4e21-8089-d18d20fdc3e5", "fb2025b0-6417-4b1e-8acc-1097bd3ddf97"], "path_name": ["中国", "江西省", "抚州市", "资溪县"], "status": "active", "sort": 3102, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:58", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:58"} +{"_id": "02246a3b-44a3-43ac-b79c-48caa16af5a7", "_rev": "2-60a51c43b775de058785c2b0c3c998d1", "type": "region", "code": "420527", "name": "秭归县", "parent_id": "f87eba79-f825-463c-b18d-6e1b022a06f0", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "f87eba79-f825-463c-b18d-6e1b022a06f0", "02246a3b-44a3-43ac-b79c-48caa16af5a7"], "path_name": ["中国", "湖北省", "宜昌市", "秭归县"], "status": "active", "sort": 3110, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "154af2ec-2f15-4f4c-8003-08bcaeb3122b", "_rev": "2-6fce07738118fbd296fae4396b8bc2bf", "type": "region", "code": "511025", "name": "资中县", "parent_id": "73916687-f3ab-40c0-823d-537abee71925", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925", "154af2ec-2f15-4f4c-8003-08bcaeb3122b"], "path_name": ["中国", "四川省", "内江市", "资中县"], "status": "active", "sort": 3106, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "27b86fe7-067e-4f72-a28c-82f2e9ef52ae", "_rev": "2-bf48087e814829701529de7a39d27ca1", "type": "region", "code": "370302", "name": "淄川区", "parent_id": "a55777b5-16e2-429d-883d-09315ea80cbd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "a55777b5-16e2-429d-883d-09315ea80cbd", "27b86fe7-067e-4f72-a28c-82f2e9ef52ae"], "path_name": ["中国", "山东省", "淄博市", "淄川区"], "status": "active", "sort": 3107, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "403d5aac-f3b9-4825-87b8-22905fbed73e", "_rev": "2-c2938c373587cb4ee11bb307b13773c8", "type": "region", "code": "610831", "name": "子洲县", "parent_id": "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "fb09aac6-6ee3-44d4-9cb1-226fd935f142", "403d5aac-f3b9-4825-87b8-22905fbed73e"], "path_name": ["中国", "陕西省", "榆林市", "子洲县"], "status": "active", "sort": 3109, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "6bb7db79-c1af-4d3f-bc8c-83e355adb046", "_rev": "2-65f3dc9580773a52fef931767d601534", "type": "region", "code": "610681", "name": "子长市", "parent_id": "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "b5104e03-8109-43f6-b3bc-2faff1b5cd06", "6bb7db79-c1af-4d3f-bc8c-83e355adb046"], "path_name": ["中国", "陕西省", "延安市", "子长市"], "status": "active", "sort": 3108, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "72849878-175d-4d45-8ed6-a92e2859ce25", "_rev": "2-03dfd43d86d5d5318ccc2b801a75bdc5", "type": "region", "code": "450329", "name": "资源县", "parent_id": "24dffe09-642d-4849-95e2-dc0924391534", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "24dffe09-642d-4849-95e2-dc0924391534", "72849878-175d-4d45-8ed6-a92e2859ce25"], "path_name": ["中国", "广西壮族自治区", "桂林市", "资源县"], "status": "active", "sort": 3105, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "a37c6706-3a87-404b-bc89-abca558c199b", "_rev": "2-bad9160e4573c3af6bb906f82b547fe7", "type": "region", "code": "430902", "name": "资阳区", "parent_id": "1f71b401-094a-4b89-9f43-264b9f949fcc", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "1f71b401-094a-4b89-9f43-264b9f949fcc", "a37c6706-3a87-404b-bc89-abca558c199b"], "path_name": ["中国", "湖南省", "益阳市", "资阳区"], "status": "active", "sort": 3104, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:04:59", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:04:59"} +{"_id": "1b3209eb-9ed1-4452-9ecf-553ca9c5cb41", "_rev": "2-6fe91146ebec65ad01731de7734258f5", "type": "region", "code": "441621", "name": "紫金县", "parent_id": "6133532c-af38-48df-94e3-69733cb1b758", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "6133532c-af38-48df-94e3-69733cb1b758", "1b3209eb-9ed1-4452-9ecf-553ca9c5cb41"], "path_name": ["中国", "广东省", "河源市", "紫金县"], "status": "active", "sort": 3112, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "7b027bbe-7ba4-4029-a34e-5691f2b618c4", "_rev": "2-2821b5c56a7a51d4a9879325e8434bdc", "type": "region", "code": "520425", "name": "紫云苗族布依族自治县", "parent_id": "688234ab-c844-4e8a-98ba-aa15ea8ead49", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "688234ab-c844-4e8a-98ba-aa15ea8ead49", "7b027bbe-7ba4-4029-a34e-5691f2b618c4"], "path_name": ["中国", "贵州省", "安顺市", "紫云苗族布依族自治县"], "status": "active", "sort": 3114, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "7cef9c3a-c00b-4eda-a76f-af1dcc49238c", "_rev": "2-c1e04e0808a7670de802d37accf8e5c4", "type": "region", "code": "510725", "name": "梓潼县", "parent_id": "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "6f7471f8-ec28-427f-979d-2d50e9c9a73d", "7cef9c3a-c00b-4eda-a76f-af1dcc49238c"], "path_name": ["中国", "四川省", "绵阳市", "梓潼县"], "status": "active", "sort": 3111, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "865fd104-ad71-462f-8194-a477a27482c2", "_rev": "2-30f268d0d31b9275003a6c5e376b8dc0", "type": "region", "code": "610924", "name": "紫阳县", "parent_id": "5c6249ff-bbfd-4d48-ae42-165a81c448be", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "5c6249ff-bbfd-4d48-ae42-165a81c448be", "865fd104-ad71-462f-8194-a477a27482c2"], "path_name": ["中国", "陕西省", "安康市", "紫阳县"], "status": "active", "sort": 3113, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "a29a9662-d158-418b-921b-e931746178df", "_rev": "2-b6ce587bf6b8e72e0935817ae0090635", "type": "region", "code": "510302", "name": "自流井区", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "a29a9662-d158-418b-921b-e931746178df"], "path_name": ["中国", "四川省", "自贡市", "自流井区"], "status": "active", "sort": 3115, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "fe4eab66-30bc-4344-97e4-9bd96eeaa51b", "_rev": "2-89c50724831f05af9db1621123c45395", "type": "region", "code": "370883", "name": "邹城市", "parent_id": "4e21c904-81d8-4504-ba67-35c7d8f514fd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "4e21c904-81d8-4504-ba67-35c7d8f514fd", "fe4eab66-30bc-4344-97e4-9bd96eeaa51b"], "path_name": ["中国", "山东省", "济宁市", "邹城市"], "status": "active", "sort": 3116, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:00", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:00"} +{"_id": "2c4ced1f-b1d7-4c0f-89e3-9f535b255d45", "_rev": "2-031530cb6f5ad48d4c426f6a02140af3", "type": "region", "code": "140722", "name": "左权县", "parent_id": "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "b9f29382-9d08-4b4b-9b5f-b42076cd01b3", "2c4ced1f-b1d7-4c0f-89e3-9f535b255d45"], "path_name": ["中国", "山西省", "晋中市", "左权县"], "status": "active", "sort": 3120, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:01"} +{"_id": "7d2cc983-b550-45e4-880f-503d08b15bcd", "_rev": "2-75ebbb0e59bd13faf396684fafc150b8", "type": "region", "code": "371600", "name": "邹平市", "parent_id": "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "aa96c7cc-20e6-4b33-add5-8a3883bfdc5e", "7d2cc983-b550-45e4-880f-503d08b15bcd"], "path_name": ["中国", "山东省", "滨州市", "邹平市"], "status": "active", "sort": 3117, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:01"} +{"_id": "87607c6d-a622-454e-8537-5ba84788c922", "_rev": "2-fd172beb0c804abcf8f73b09893794af", "type": "region", "code": "140226", "name": "左云县", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "87607c6d-a622-454e-8537-5ba84788c922"], "path_name": ["中国", "山西省", "大同市", "左云县"], "status": "active", "sort": 3121, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:01"} +{"_id": "afda8f8f-f84f-4b67-a919-63917cdb2fd7", "_rev": "2-7857dcf48a94c6543124ac0d77eb7725", "type": "region", "code": "540327", "name": "左贡县", "parent_id": "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "7a36bedc-7b42-4b52-a8fa-12a0cdaba875", "afda8f8f-f84f-4b67-a919-63917cdb2fd7"], "path_name": ["中国", "西藏自治区", "昌都市", "左贡县"], "status": "active", "sort": 3119, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:01"} +{"_id": "b72b9b4b-5522-44be-911b-b49ba2546ab9", "_rev": "2-362989c3c4fa1abfc63715fe8d6f0c73", "type": "region", "code": "130281", "name": "遵化市", "parent_id": "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "de72cb8a-29c5-4288-8c6e-4ed25a44d87d", "b72b9b4b-5522-44be-911b-b49ba2546ab9"], "path_name": ["中国", "河北省", "唐山市", "遵化市"], "status": "active", "sort": 3118, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:01", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:01"} +{"_id": "1bfbcbd6-fa28-4e94-8dce-c5d6d20219d9", "_rev": "2-499adf6272e75bcb5ca27be566a635e7", "type": "region", "code": "230723", "name": "汤旺县", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "1bfbcbd6-fa28-4e94-8dce-c5d6d20219d9"], "path_name": ["中国", "黑龙江省", "伊春市", "汤旺县"], "status": "active", "sort": 3125, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "2e5177c0-bea3-4db5-b9fa-4e92a4bdb231", "_rev": "2-eb8bae620c2a6b7b07fc83575cba2a7c", "type": "region", "code": "230724", "name": "丰林县", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "2e5177c0-bea3-4db5-b9fa-4e92a4bdb231"], "path_name": ["中国", "黑龙江省", "伊春市", "丰林县"], "status": "active", "sort": 3126, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "7685f39f-6703-4db0-aeb7-0d25d177691a", "_rev": "2-d1c6a5ac32eab0ec78b6a6a1abd86034", "type": "region", "code": "230803", "name": "向阳区", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "7685f39f-6703-4db0-aeb7-0d25d177691a"], "path_name": ["中国", "黑龙江省", "佳木斯市", "向阳区"], "status": "active", "sort": 3122, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "a14f9eef-bb56-4711-9fdd-bcad16257b21", "_rev": "2-d784b16e76c8988ee46c721aea920b96", "type": "region", "code": "230719", "name": "友好区", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "a14f9eef-bb56-4711-9fdd-bcad16257b21"], "path_name": ["中国", "黑龙江省", "伊春市", "友好区"], "status": "active", "sort": 3127, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "b16f9dbf-3482-45c4-a959-4e233eadefb6", "_rev": "2-05f9dbeb1dd56a3648bf45b488106831", "type": "region", "code": "230421", "name": "萝北县", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "b16f9dbf-3482-45c4-a959-4e233eadefb6"], "path_name": ["中国", "黑龙江省", "鹤岗市", "萝北县"], "status": "active", "sort": 3124, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "c720c169-c788-4913-aa79-4bd7407cddaf", "_rev": "2-ddd88e29ef2e65282ddb9d82a2352f37", "type": "region", "code": "230725", "name": "大箐山县", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "c720c169-c788-4913-aa79-4bd7407cddaf"], "path_name": ["中国", "黑龙江省", "伊春市", "大箐山县"], "status": "active", "sort": 3123, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:02", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:02"} +{"_id": "0260e108-9c05-4e04-a452-b4bba19d5ab0", "_rev": "2-a0fdefee4d9ea54446aad0fff2165462", "type": "region", "code": "230751", "name": "金林区", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "0260e108-9c05-4e04-a452-b4bba19d5ab0"], "path_name": ["中国", "黑龙江省", "伊春市", "金林区"], "status": "active", "sort": 3130, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "0c59e91e-8663-4a3b-852e-a276791f98ee", "_rev": "2-d69391268548c8d9354c02685c80bcd8", "type": "region", "code": "230726", "name": "南岔县", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "0c59e91e-8663-4a3b-852e-a276791f98ee"], "path_name": ["中国", "黑龙江省", "伊春市", "南岔县"], "status": "active", "sort": 3129, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "282c8d64-f9ed-4448-85cd-ed4fef71869e", "_rev": "2-a550686dcb9f44fbe8d053e48aa9cada", "type": "region", "code": "230406", "name": "东山区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "282c8d64-f9ed-4448-85cd-ed4fef71869e"], "path_name": ["中国", "黑龙江省", "鹤岗市", "东山区"], "status": "active", "sort": 3132, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "51074f90-383d-45d2-90c2-d2940d9d46d0", "_rev": "2-df042610b4a3f36312319735aa591920", "type": "region", "code": "230717", "name": "伊美区", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "51074f90-383d-45d2-90c2-d2940d9d46d0"], "path_name": ["中国", "黑龙江省", "伊春市", "伊美区"], "status": "active", "sort": 3131, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "5e75c5b2-4424-46ea-b429-d11f7eb04f84", "_rev": "2-8ecbdab4f9f1f05a2418cf16b43f41b5", "type": "region", "code": "230718", "name": "乌翠区", "parent_id": "be0f52d2-6b30-477f-9555-45d7f3e6a730", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "be0f52d2-6b30-477f-9555-45d7f3e6a730", "5e75c5b2-4424-46ea-b429-d11f7eb04f84"], "path_name": ["中国", "黑龙江省", "伊春市", "乌翠区"], "status": "active", "sort": 3128, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "72947191-358d-4a6c-ad0b-5a113409f299", "_rev": "2-cb39cfaec928115dcf8e61db58ab6f27", "type": "region", "code": "230828", "name": "汤原县", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "72947191-358d-4a6c-ad0b-5a113409f299"], "path_name": ["中国", "黑龙江省", "佳木斯市", "汤原县"], "status": "active", "sort": 3133, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:03", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:03"} +{"_id": "1ce0be50-ef75-4ead-8652-703886e49506", "_rev": "2-f8eae1d743391a8287c263175c929443", "type": "region", "code": "230407", "name": "兴山区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "1ce0be50-ef75-4ead-8652-703886e49506"], "path_name": ["中国", "黑龙江省", "鹤岗市", "兴山区"], "status": "active", "sort": 3138, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "2aba42d4-5a9c-40b9-8032-13e0abcd3edf", "_rev": "2-fd7b60073f4dea056816e850dfb737a5", "type": "region", "code": "230805", "name": "东风区", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "2aba42d4-5a9c-40b9-8032-13e0abcd3edf"], "path_name": ["中国", "黑龙江省", "佳木斯市", "东风区"], "status": "active", "sort": 3139, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "40d78db1-deaf-430b-84f3-d2dcbf5c8e29", "_rev": "2-dae4ac71f785b1aaa2da3a5003837281", "type": "region", "code": "230405", "name": "兴安区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "40d78db1-deaf-430b-84f3-d2dcbf5c8e29"], "path_name": ["中国", "黑龙江省", "鹤岗市", "兴安区"], "status": "active", "sort": 3134, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "b1cc5e7c-243a-4231-9a17-075f3eea3df8", "_rev": "2-ee98bed87fa564731397c29d5bcca228", "type": "region", "code": "230402", "name": "向阳区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "b1cc5e7c-243a-4231-9a17-075f3eea3df8"], "path_name": ["中国", "黑龙江省", "鹤岗市", "向阳区"], "status": "active", "sort": 3137, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "d07ddc9c-7d44-44a3-9fc2-3830a9cedf81", "_rev": "2-a17b388d9ebde80af8b9da681a0e93fd", "type": "region", "code": "230404", "name": "南山区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "d07ddc9c-7d44-44a3-9fc2-3830a9cedf81"], "path_name": ["中国", "黑龙江省", "鹤岗市", "南山区"], "status": "active", "sort": 3135, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "fb37e62b-e10f-452b-b68a-598df6515bdc", "_rev": "2-a2ea2ac64971a33a081029da34e257b4", "type": "region", "code": "230403", "name": "工农区", "parent_id": "70adc0c2-fd71-419d-9826-d928967b163c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "70adc0c2-fd71-419d-9826-d928967b163c", "fb37e62b-e10f-452b-b68a-598df6515bdc"], "path_name": ["中国", "黑龙江省", "鹤岗市", "工农区"], "status": "active", "sort": 3136, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:04", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:04"} +{"_id": "0982ce01-7d81-455c-aebc-2ef5364bfa8f", "_rev": "2-6da83835dd857d2634edbe86d3bdabd8", "type": "region", "code": "350102", "name": "鼓楼区", "parent_id": "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "bc82e81d-b8cd-4722-85f7-42b70a43f4b6", "0982ce01-7d81-455c-aebc-2ef5364bfa8f"], "path_name": ["中国", "福建省", "福州市", "鼓楼区"], "status": "active", "sort": 3141, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "44fc45fb-8b05-4faa-ae76-e5b4c8cec54d", "_rev": "2-f139eedee845c6839f9813b36e4f0730", "type": "region", "code": "410204", "name": "鼓楼区", "parent_id": "6c352fd2-4ea3-407c-9aff-c99721d275c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "6c352fd2-4ea3-407c-9aff-c99721d275c5", "44fc45fb-8b05-4faa-ae76-e5b4c8cec54d"], "path_name": ["中国", "河南省", "开封市", "鼓楼区"], "status": "active", "sort": 3143, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "46f48976-80b4-4486-81cc-a00ba4e5def6", "_rev": "2-1623675f5cda14fee687883dab6414bf", "type": "region", "code": "330903", "name": "普陀区", "parent_id": "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "1aa2d21f-69bf-46de-9e8c-5d5059d51f55", "46f48976-80b4-4486-81cc-a00ba4e5def6"], "path_name": ["中国", "浙江省", "舟山市", "普陀区"], "status": "active", "sort": 3145, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "c888641d-c755-49f1-ae18-0a03065b0e2a", "_rev": "2-fc3e538365c3c6702b6a7016e23380aa", "type": "region", "code": "150603", "name": "康巴什区", "parent_id": "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "9ba26209-7671-464d-9d6b-c3ae1cf50acd", "c888641d-c755-49f1-ae18-0a03065b0e2a"], "path_name": ["中国", "内蒙古自治区", "鄂尔多斯市", "康巴什区"], "status": "active", "sort": 3140, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "e76f52b3-2539-4f0d-a3ab-d8605a751d0c", "_rev": "2-315e04e6f5cf428275cb47abf4e072e3", "type": "region", "code": "320302", "name": "鼓楼区", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "e76f52b3-2539-4f0d-a3ab-d8605a751d0c"], "path_name": ["中国", "江苏省", "徐州市", "鼓楼区"], "status": "active", "sort": 3144, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "f8155601-9937-433a-8fc2-d78d87ddfacd", "_rev": "2-98c8f8d7196fa2e420b342bcccd32bce", "type": "region", "code": "320106", "name": "鼓楼区", "parent_id": "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "4ef7f804-81ec-473c-802c-21bfe01c1ab2", "f8155601-9937-433a-8fc2-d78d87ddfacd"], "path_name": ["中国", "江苏省", "南京市", "鼓楼区"], "status": "active", "sort": 3142, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:05", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:05"} +{"_id": "6a8b826e-32af-4bcb-80aa-c9a8e4241326", "_rev": "2-8030309720020c151ae548f0dea1327a", "type": "region", "code": "120102", "name": "河东区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "6a8b826e-32af-4bcb-80aa-c9a8e4241326"], "path_name": ["中国", "天津市", "河东区"], "status": "active", "sort": 3147, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "810fc2e4-5ee5-4ff3-ad8c-185e7fb10ece", "_rev": "2-d86da901661d058cf2b2e874c9717072", "type": "region", "code": "120101", "name": "和平区", "parent_id": "025ae602-a72e-4f8a-9ec5-347da940651a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "025ae602-a72e-4f8a-9ec5-347da940651a", "810fc2e4-5ee5-4ff3-ad8c-185e7fb10ece"], "path_name": ["中国", "天津市", "和平区"], "status": "active", "sort": 3149, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "b276f67e-fc4c-4cd2-8317-4f2b3c5aaab7", "_rev": "2-b58ac1f71913b80c93e22a019f9d2846", "type": "region", "code": "130503", "name": "信都区", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "b276f67e-fc4c-4cd2-8317-4f2b3c5aaab7"], "path_name": ["中国", "河北省", "邢台市", "信都区"], "status": "active", "sort": 3151, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "c98bb2a9-5052-4063-9e15-63c4c06116cc", "_rev": "2-34a2ba37d3a55518b82c7844948b15c6", "type": "region", "code": "130703", "name": "桥西区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "c98bb2a9-5052-4063-9e15-63c4c06116cc"], "path_name": ["中国", "河北省", "张家口市", "桥西区"], "status": "active", "sort": 3152, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "caebae47-b2a1-4e5f-9733-5b13abf58cb0", "_rev": "2-3fa289b89f3c0fdd115e8ad5daf02e2e", "type": "region", "code": "371312", "name": "河东区", "parent_id": "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "42d68eb3-495b-4331-98e5-d5cf851ed9e5", "caebae47-b2a1-4e5f-9733-5b13abf58cb0"], "path_name": ["中国", "山东省", "临沂市", "河东区"], "status": "active", "sort": 3148, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "cd564676-46c8-4db9-8e20-50e3cc9db436", "_rev": "2-258d204dc6fb15987e84a4a2f9bd59a0", "type": "region", "code": "310107", "name": "普陀区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "cd564676-46c8-4db9-8e20-50e3cc9db436"], "path_name": ["中国", "上海市", "普陀区"], "status": "active", "sort": 3146, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "d33da3e4-5cf1-49c4-9e66-29918167b4e6", "_rev": "2-f362b29b2565950a249842b66fe1db39", "type": "region", "code": "210102", "name": "和平区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "d33da3e4-5cf1-49c4-9e66-29918167b4e6"], "path_name": ["中国", "辽宁省", "沈阳市", "和平区"], "status": "active", "sort": 3150, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:06", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:06"} +{"_id": "3652de66-56eb-4e7f-9e5d-9165a2bef869", "_rev": "2-663ce7ea76b448ca02dbd6852ce41bad", "type": "region", "code": "441502", "name": "城区", "parent_id": "eafc0190-06e6-4b93-b74a-35161879139a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "eafc0190-06e6-4b93-b74a-35161879139a", "3652de66-56eb-4e7f-9e5d-9165a2bef869"], "path_name": ["中国", "广东省", "汕尾市", "城区"], "status": "active", "sort": 3154, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "6576e3b8-01c8-4c87-9b74-6228cde7c735", "_rev": "2-6b7db048f21a3f47680c8e4b69793de1", "type": "region", "code": "210303", "name": "铁西区", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "6576e3b8-01c8-4c87-9b74-6228cde7c735"], "path_name": ["中国", "辽宁省", "鞍山市", "铁西区"], "status": "active", "sort": 3157, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "b5bd10bb-1f0c-440b-ba83-83a4ec3cd99a", "_rev": "2-1839232752c10c80dbbe1bcdfe175e56", "type": "region", "code": "140302", "name": "城区", "parent_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "b5bd10bb-1f0c-440b-ba83-83a4ec3cd99a"], "path_name": ["中国", "山西省", "阳泉市", "城区"], "status": "active", "sort": 3156, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "ce7dda5d-e9cb-4736-8743-256e81a3bc85", "_rev": "2-04a83be901aaf9bdd05c4633cb344702", "type": "region", "code": "220302", "name": "铁西区", "parent_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50", "ce7dda5d-e9cb-4736-8743-256e81a3bc85"], "path_name": ["中国", "吉林省", "四平市", "铁西区"], "status": "active", "sort": 3158, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "d84b865c-03a0-4860-84c1-70347dc9ada7", "_rev": "2-61f3fff904a32f85fb4ee31cfa311341", "type": "region", "code": "140502", "name": "城区", "parent_id": "d385c5e7-7000-4e01-ba90-679388fab027", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "d385c5e7-7000-4e01-ba90-679388fab027", "d84b865c-03a0-4860-84c1-70347dc9ada7"], "path_name": ["中国", "山西省", "晋城市", "城区"], "status": "active", "sort": 3155, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "dc596991-c114-4b5d-96f6-32cbaf497447", "_rev": "2-821ddae476a155d9d099bdc2bd956677", "type": "region", "code": "130104", "name": "桥西区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "dc596991-c114-4b5d-96f6-32cbaf497447"], "path_name": ["中国", "河北省", "石家庄市", "桥西区"], "status": "active", "sort": 3153, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:07", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:07"} +{"_id": "0325095a-2713-43eb-86b3-00927aec1264", "_rev": "2-d2d0a09cf43f2fc73c1a36c8c0bf5912", "type": "region", "code": "210902", "name": "海州区", "parent_id": "82f97460-eb12-485e-8eed-d5bed01b0ce1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "82f97460-eb12-485e-8eed-d5bed01b0ce1", "0325095a-2713-43eb-86b3-00927aec1264"], "path_name": ["中国", "辽宁省", "阜新市", "海州区"], "status": "active", "sort": 3160, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "438c7688-be04-4f02-a730-bc82d58310e1", "_rev": "2-a1daa4829df9910beaeb6eab18bc5765", "type": "region", "code": "220403", "name": "西安区", "parent_id": "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "12f5e424-1bca-435d-a7b0-ef28a8c3fb67", "438c7688-be04-4f02-a730-bc82d58310e1"], "path_name": ["中国", "吉林省", "辽源市", "西安区"], "status": "active", "sort": 3164, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "595d1609-e1d0-4314-b328-83deafa54b4c", "_rev": "2-00d2500c126a3f7eb9a76c23fdc68c4b", "type": "region", "code": "320706", "name": "海州区", "parent_id": "574d38cc-00ac-4cb2-b566-16fd44367c84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "574d38cc-00ac-4cb2-b566-16fd44367c84", "595d1609-e1d0-4314-b328-83deafa54b4c"], "path_name": ["中国", "江苏省", "连云港市", "海州区"], "status": "active", "sort": 3161, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "9415a847-adb3-4e24-9bcf-ca27ecf471c9", "_rev": "2-11cb06950caf9443abeb5df8bc24056d", "type": "region", "code": "210302", "name": "铁东区", "parent_id": "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "e0c6b3e3-45c7-4bd7-b8ed-eaab781a94c5", "9415a847-adb3-4e24-9bcf-ca27ecf471c9"], "path_name": ["中国", "辽宁省", "鞍山市", "铁东区"], "status": "active", "sort": 3163, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "a488ea9f-10c1-4c74-abc7-8326d5945ad1", "_rev": "2-b13a34df53db9b9c59f9a356a200be8c", "type": "region", "code": "220303", "name": "铁东区", "parent_id": "458f58f2-56a5-481d-974b-540eb8c4ed50", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "458f58f2-56a5-481d-974b-540eb8c4ed50", "a488ea9f-10c1-4c74-abc7-8326d5945ad1"], "path_name": ["中国", "吉林省", "四平市", "铁东区"], "status": "active", "sort": 3162, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "cd5357e7-a2bd-492d-8125-9f7461c781aa", "_rev": "2-98d9e5b89e89a405f8135c942db3ca01", "type": "region", "code": "210106", "name": "铁西区", "parent_id": "b3c2caee-101d-4519-9f6d-a80af0b0475c", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "b3c2caee-101d-4519-9f6d-a80af0b0475c", "cd5357e7-a2bd-492d-8125-9f7461c781aa"], "path_name": ["中国", "辽宁省", "沈阳市", "铁西区"], "status": "active", "sort": 3159, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:08", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:08"} +{"_id": "1b3ac4ae-bd87-4bf4-87eb-2b5803a0d4f0", "_rev": "2-158be2b55f295cbd60a88a0ce515cd2f", "type": "region", "code": "140311", "name": "郊区", "parent_id": "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "8e75a3e9-ce3b-4596-a7ac-45dd8e074bd7", "1b3ac4ae-bd87-4bf4-87eb-2b5803a0d4f0"], "path_name": ["中国", "山西省", "阳泉市", "郊区"], "status": "active", "sort": 3166, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:09"} +{"_id": "6a72a6bb-6837-4fb9-8cd5-f6c0d1a8bcfd", "_rev": "2-d1c5f80d8927c14397eade3c09e8a173", "type": "region", "code": "231005", "name": "西安区", "parent_id": "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "3acee7fb-bd8d-41e5-a76c-420b7a28745d", "6a72a6bb-6837-4fb9-8cd5-f6c0d1a8bcfd"], "path_name": ["中国", "黑龙江省", "牡丹江市", "西安区"], "status": "active", "sort": 3165, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:09"} +{"_id": "a0ce034c-597e-43a7-af41-df38b545702b", "_rev": "2-38d557ec82cc23142202a9f3de42573d", "type": "region", "code": "230811", "name": "郊区", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "a0ce034c-597e-43a7-af41-df38b545702b"], "path_name": ["中国", "黑龙江省", "佳木斯市", "郊区"], "status": "active", "sort": 3167, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:09"} +{"_id": "c098348e-cd3a-4092-92b5-b6baf887816a", "_rev": "2-486d1c99b9123783f0e5b865181d062b", "type": "region", "code": "340711", "name": "郊区", "parent_id": "71264234-0fc8-42ac-8ede-c65d1f42516f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "f9c1309f-213a-40ca-aed4-4f92dbe24b40", "71264234-0fc8-42ac-8ede-c65d1f42516f", "c098348e-cd3a-4092-92b5-b6baf887816a"], "path_name": ["中国", "安徽省", "铜陵市", "郊区"], "status": "active", "sort": 3168, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:09"} +{"_id": "daa996ab-cdde-46d8-bda8-9d315f3596c3", "_rev": "2-fbec75ba17df40482ec202787fb12b8c", "type": "region", "code": "310113", "name": "宝山区", "parent_id": "a6cfa94e-8b94-474a-9f74-ba1903efa171", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "a6cfa94e-8b94-474a-9f74-ba1903efa171", "daa996ab-cdde-46d8-bda8-9d315f3596c3"], "path_name": ["中国", "上海市", "宝山区"], "status": "active", "sort": 3169, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:09"} +{"_id": "14255e4b-28ec-4c4c-9e7c-0d7bfc6a21db", "_rev": "2-3723e5ac8efde77ee02de4c4cb88753d", "type": "region", "code": "511102", "name": "市中区", "parent_id": "2fe797e7-a6c5-437f-91fc-c695ed520d39", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "2fe797e7-a6c5-437f-91fc-c695ed520d39", "14255e4b-28ec-4c4c-9e7c-0d7bfc6a21db"], "path_name": ["中国", "四川省", "乐山市", "市中区"], "status": "active", "sort": 3175, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "4a227a14-ce27-4156-a58f-29429e911b90", "_rev": "2-39bac4aecd109420d243293ae62a4a13", "type": "region", "code": "511002", "name": "市中区", "parent_id": "73916687-f3ab-40c0-823d-537abee71925", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "73916687-f3ab-40c0-823d-537abee71925", "4a227a14-ce27-4156-a58f-29429e911b90"], "path_name": ["中国", "四川省", "内江市", "市中区"], "status": "active", "sort": 3174, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "4e75b94d-ec7d-4768-957c-5c87d0c6e8af", "_rev": "2-7c6781892347bbcd93b495a0ac68ec5e", "type": "region", "code": "230506", "name": "宝山区", "parent_id": "8599bdcf-0343-439c-9f65-35b6f1ab5710", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "8599bdcf-0343-439c-9f65-35b6f1ab5710", "4e75b94d-ec7d-4768-957c-5c87d0c6e8af"], "path_name": ["中国", "黑龙江省", "双鸭山市", "宝山区"], "status": "active", "sort": 3170, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "953e84c0-7185-4972-bd51-fffd5df5ace5", "_rev": "2-e3d9be1669fe58fa8e8c217c398586cb", "type": "region", "code": "360103", "name": "西湖区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "953e84c0-7185-4972-bd51-fffd5df5ace5"], "path_name": ["中国", "江西省", "南昌市", "西湖区"], "status": "active", "sort": 3172, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "ac26c813-017e-4180-8be3-0d47acb3ffed", "_rev": "2-e3a4d64e88548f68541410674beca9e9", "type": "region", "code": "330383", "name": "龙港市", "parent_id": "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "ecac78ec-dcdd-4f9b-b3fe-01223129fc84", "ac26c813-017e-4180-8be3-0d47acb3ffed"], "path_name": ["中国", "浙江省", "温州市", "龙港市"], "status": "active", "sort": 3173, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "dc5e6477-a6dd-43fe-820a-5882b03a9225", "_rev": "2-714d585bf8992103f8dfc862096f634e", "type": "region", "code": "330106", "name": "西湖区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "dc5e6477-a6dd-43fe-820a-5882b03a9225"], "path_name": ["中国", "浙江省", "杭州市", "西湖区"], "status": "active", "sort": 3171, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "e5622ab6-5429-4094-a1aa-7dd44162482b", "_rev": "2-cb4d5ddda069379ae7238e450c1cae91", "type": "region", "code": "370402", "name": "市中区", "parent_id": "cea7583f-132f-48b1-a0fa-88776ddcc631", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "cea7583f-132f-48b1-a0fa-88776ddcc631", "e5622ab6-5429-4094-a1aa-7dd44162482b"], "path_name": ["中国", "山东省", "枣庄市", "市中区"], "status": "active", "sort": 3176, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:10", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:10"} +{"_id": "39d6ef14-3e39-4cf1-ba98-7c60efeab5cb", "_rev": "2-44564c5941d4c42edfbc132264b04199", "type": "region", "code": "370103", "name": "市中区", "parent_id": "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ab79bab3-0963-4af7-b5d2-e0bd8a053a90", "bc4129d9-530e-42fb-bf44-4870e6eeeaae", "39d6ef14-3e39-4cf1-ba98-7c60efeab5cb"], "path_name": ["中国", "山东省", "济南市", "市中区"], "status": "active", "sort": 3177, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "42f20acf-b989-4fa9-9b55-5d7b097432e0", "_rev": "2-cc4fbde711b0043d3ffce026ea67c471", "type": "region", "code": "410402", "name": "新华区", "parent_id": "bd0f26b9-f490-4167-8725-6889c6db0ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "aa73f5f7-52ae-42aa-9ca8-3206004b1d62", "bd0f26b9-f490-4167-8725-6889c6db0ab6", "42f20acf-b989-4fa9-9b55-5d7b097432e0"], "path_name": ["中国", "河南省", "平顶山市", "新华区"], "status": "active", "sort": 3178, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "64342981-decd-4311-ad1b-2c60a3886548", "_rev": "2-708d3e74e9f6423f6eb3b0dae524ab3f", "type": "region", "code": "430802", "name": "永定区", "parent_id": "ddb90f83-c981-4cc1-a157-a085d328dd64", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2d3ae8de-386c-4512-bf7a-7b14d653876d", "ddb90f83-c981-4cc1-a157-a085d328dd64", "64342981-decd-4311-ad1b-2c60a3886548"], "path_name": ["中国", "湖南省", "张家界市", "永定区"], "status": "active", "sort": 3182, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "661a462d-21a5-458f-a5e2-f6424e2855ad", "_rev": "2-a586059411d66680893604f9d54f60d4", "type": "region", "code": "130902", "name": "新华区", "parent_id": "d58c0380-9a1e-479d-8062-64034fb36657", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d58c0380-9a1e-479d-8062-64034fb36657", "661a462d-21a5-458f-a5e2-f6424e2855ad"], "path_name": ["中国", "河北省", "沧州市", "新华区"], "status": "active", "sort": 3180, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "f215ebcd-212c-4d71-b55f-5abbfafea99f", "_rev": "2-b748b35f8e2c788c7c18c18a1522dfd4", "type": "region", "code": "130105", "name": "新华区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "f215ebcd-212c-4d71-b55f-5abbfafea99f"], "path_name": ["中国", "河北省", "石家庄市", "新华区"], "status": "active", "sort": 3179, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "ff5d867f-73c5-414d-8c9b-81d7b09a915d", "_rev": "2-92377ac27714fbfb06fce60d2edcc7d2", "type": "region", "code": "350803", "name": "永定区", "parent_id": "ca138940-878c-4646-9da2-0a261af9bbbe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "92a65ae8-d94c-4bb0-a2ba-d0215f688ab0", "ca138940-878c-4646-9da2-0a261af9bbbe", "ff5d867f-73c5-414d-8c9b-81d7b09a915d"], "path_name": ["中国", "福建省", "龙岩市", "永定区"], "status": "active", "sort": 3181, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:11", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:11"} +{"_id": "0415a4f4-33f3-42ad-bb74-de5c898c698c", "_rev": "2-275338719decd207e3b9576230279c4c", "type": "region", "code": "330205", "name": "江北区", "parent_id": "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "7deee7bc-9525-4e67-9dea-09bc9cf0330b", "0415a4f4-33f3-42ad-bb74-de5c898c698c"], "path_name": ["中国", "浙江省", "宁波市", "江北区"], "status": "active", "sort": 3188, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "48dbc46b-0481-4aa6-83a6-8a80bb7892a2", "_rev": "2-802b82d7228785a0cb7548f865a54be0", "type": "region", "code": "440300", "name": "广东省", "parent_id": "a351efb9-a756-4e31-8b18-785328bb4105", "region_type": "province", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "48dbc46b-0481-4aa6-83a6-8a80bb7892a2"], "path_name": ["中国", "广东省"], "status": "active", "sort": 3185, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "5015e8b8-5389-4474-bf27-44ab43c39e4f", "_rev": "2-e401ef0b518e6f110932a77c63a61e69", "type": "region", "code": "440309", "name": "龙华区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "5015e8b8-5389-4474-bf27-44ab43c39e4f"], "path_name": ["中国", "广东省", "深圳市", "龙华区"], "status": "active", "sort": 3183, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "6084a327-570e-431b-8a4b-7a92cb81b9d8", "_rev": "2-eb3e7ec1f62496ea0eef9d354f328e33", "type": "region", "code": "500105", "name": "江北区", "parent_id": "1786f327-1701-4bcc-a954-3c2d2c55ad76", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1786f327-1701-4bcc-a954-3c2d2c55ad76", "6084a327-570e-431b-8a4b-7a92cb81b9d8"], "path_name": ["中国", "重庆市", "江北区"], "status": "active", "sort": 3187, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "b43de7a2-3f6f-4bf3-a413-fa704f587b79", "_rev": "2-03a2d1c3cc24ee3c23e50d569b9a85c3", "type": "region", "code": "440311", "name": "光明区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "b43de7a2-3f6f-4bf3-a413-fa704f587b79"], "path_name": ["中国", "广东省", "深圳市", "光明区"], "status": "active", "sort": 3184, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "bf781cc8-9de3-4a55-8241-f1ec0d44e26f", "_rev": "2-9197cb7ee3d21d8de28c4be2a688eda5", "type": "region", "code": "440305", "name": "南山区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "bf781cc8-9de3-4a55-8241-f1ec0d44e26f"], "path_name": ["中国", "广东省", "深圳市", "南山区"], "status": "active", "sort": 3186, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:12"} +{"_id": "2ee0324a-c8c3-47cd-9e37-c9fd85bce0ee", "_rev": "2-98a59ca8d917d47b83c526598e51df89", "type": "region", "code": "540102", "name": "城关区", "parent_id": "eb8cc5ab-7978-4802-b779-8c72e94a739f", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "2a82d1f6-086c-4f04-8937-a96526c66506", "eb8cc5ab-7978-4802-b779-8c72e94a739f", "2ee0324a-c8c3-47cd-9e37-c9fd85bce0ee"], "path_name": ["中国", "西藏自治区", "拉萨市", "城关区"], "status": "active", "sort": 3192, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:13"} +{"_id": "808c7bd4-de94-41c4-813b-b678c701eb3b", "_rev": "2-e7b8c6b5c2eb47b7fdbb3779ff498679", "type": "region", "code": "620102", "name": "城关区", "parent_id": "89365205-f1d5-4caf-b5a4-0be50b12826d", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "5e570f62-f00e-449b-9d44-031e1dd5940e", "89365205-f1d5-4caf-b5a4-0be50b12826d", "808c7bd4-de94-41c4-813b-b678c701eb3b"], "path_name": ["中国", "甘肃省", "兰州市", "城关区"], "status": "active", "sort": 3191, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:13"} +{"_id": "86bf5752-a93a-452c-997d-cab754869822", "_rev": "2-f1ce2f22ec47fae6e9abd9d4c77f6865", "type": "region", "code": "130102", "name": "长安区", "parent_id": "db885fc1-c95c-472c-b7e7-d2af84ece924", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "db885fc1-c95c-472c-b7e7-d2af84ece924", "86bf5752-a93a-452c-997d-cab754869822"], "path_name": ["中国", "河北省", "石家庄市", "长安区"], "status": "active", "sort": 3193, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:13"} +{"_id": "cd89b301-751e-4744-9d40-0d859fd0e1df", "_rev": "2-a76ede253ab8cfeb5803fe8f7aa0a16a", "type": "region", "code": "520113", "name": "白云区", "parent_id": "538f2d70-5d18-4b6e-89e4-cb829092109a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1ad44eee-f1bd-4c23-a3b6-47211ef5fdca", "538f2d70-5d18-4b6e-89e4-cb829092109a", "cd89b301-751e-4744-9d40-0d859fd0e1df"], "path_name": ["中国", "贵州省", "贵阳市", "白云区"], "status": "active", "sort": 3190, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:13"} +{"_id": "e026096b-056a-4f97-b196-a64032326b93", "_rev": "2-18ab5eb503ce66138977ba574f5bd2ae", "type": "region", "code": "440111", "name": "白云区", "parent_id": "4cef36ce-759e-44ba-b60f-a67cc324c18e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "4cef36ce-759e-44ba-b60f-a67cc324c18e", "e026096b-056a-4f97-b196-a64032326b93"], "path_name": ["中国", "广东省", "广州市", "白云区"], "status": "active", "sort": 3189, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:13", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:13"} +{"_id": "01a75cff-d4a1-443a-8edf-5824a0ca2192", "_rev": "2-0e3f0c3c2da433f51fe337718ea48557", "type": "region", "code": "659010", "name": "胡杨河市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "01a75cff-d4a1-443a-8edf-5824a0ca2192"], "path_name": ["中国", "新疆维吾尔自治区", "胡杨河市"], "status": "active", "sort": 3197, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:14"} +{"_id": "1bd7b7fa-86bb-421a-96c0-2290e43c7fd1", "_rev": "2-43e8eacde44c851097140befdf5404a9", "type": "region", "code": "610116", "name": "长安区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "1bd7b7fa-86bb-421a-96c0-2290e43c7fd1"], "path_name": ["中国", "陕西省", "西安市", "长安区"], "status": "active", "sort": 3194, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:14"} +{"_id": "5a64a343-57db-4e0d-bef9-aa2aa7eae23f", "_rev": "2-5efafc13fc0857eb5be52272b0ab2300", "type": "region", "code": "659009", "name": "昆玉市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "5a64a343-57db-4e0d-bef9-aa2aa7eae23f"], "path_name": ["中国", "新疆维吾尔自治区", "昆玉市"], "status": "active", "sort": 3198, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:14"} +{"_id": "6e70d271-3277-4c22-9990-2461d43ff7a1", "_rev": "2-efa96b48547da31d4f199b004c4565fc", "type": "region", "code": "450202", "name": "城中区", "parent_id": "1dac6965-3077-4b43-acc2-91948878ede4", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "c03ad107-6aba-4c80-85cb-8bbcbbd96ec9", "1dac6965-3077-4b43-acc2-91948878ede4", "6e70d271-3277-4c22-9990-2461d43ff7a1"], "path_name": ["中国", "广西壮族自治区", "柳州市", "城中区"], "status": "active", "sort": 3195, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:14"} +{"_id": "a743a371-d8b0-4cf5-abc6-4dfdf5194c6d", "_rev": "2-88b3df164e1c89730da71c63efdfbb0f", "type": "region", "code": "630103", "name": "城中区", "parent_id": "0fb27508-2582-47de-b782-833eec780ea1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "46542235-7bbc-4c95-a6e8-7149292078e5", "0fb27508-2582-47de-b782-833eec780ea1", "a743a371-d8b0-4cf5-abc6-4dfdf5194c6d"], "path_name": ["中国", "青海省", "西宁市", "城中区"], "status": "active", "sort": 3196, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:14", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:14"} +{"_id": "111b1061-d4e1-4ed7-820b-cc871bd2f1c7", "_rev": "2-f26175fd2425e44a884c128f1571878a", "type": "region", "code": "110105", "name": "朝阳区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "111b1061-d4e1-4ed7-820b-cc871bd2f1c7"], "path_name": ["中国", "北京市", "朝阳区"], "status": "active", "sort": 3201, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "2040b182-8267-4964-bb29-68094a666a1f", "_rev": "2-f029b6e42192ea43eec26fccbbb157a6", "type": "region", "code": "220104", "name": "朝阳区", "parent_id": "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "e2930638-ee2f-4e46-b8f7-8e84adedb0aa", "2c839d7c-6f39-400b-bdb3-1124d225e8c1", "2040b182-8267-4964-bb29-68094a666a1f"], "path_name": ["中国", "吉林省", "长春市", "朝阳区"], "status": "active", "sort": 3202, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "54cafd01-8346-49a0-b263-53d41ca47ff1", "_rev": "2-b293e7459f910939bf09252278f3be4f", "type": "region", "code": "150102", "name": "新城区", "parent_id": "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "1705d6e2-d01e-4d02-ada1-2b66cc0b2ac3", "54cafd01-8346-49a0-b263-53d41ca47ff1"], "path_name": ["中国", "内蒙古自治区", "呼和浩特市", "新城区"], "status": "active", "sort": 3200, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "68a97685-8aab-4609-818c-49e62f66c2ee", "_rev": "2-851ea433f123d979c1da0e762e4cc578", "type": "region", "code": "610102", "name": "新城区", "parent_id": "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "b61e52c4-093b-46a1-8517-f587b4e02800", "f75d8a5e-dde3-49f4-b8c4-d38b92674af2", "68a97685-8aab-4609-818c-49e62f66c2ee"], "path_name": ["中国", "陕西省", "西安市", "新城区"], "status": "active", "sort": 3199, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "c8a0ba6e-1e08-4d23-b8cc-ba4d6af4dddf", "_rev": "2-77a01f66961e727c009cf7e6208f07aa", "type": "region", "code": "320612", "name": "通州区", "parent_id": "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "5bffcc6b-fda4-4571-8c3b-2167fa6cc50a", "c8a0ba6e-1e08-4d23-b8cc-ba4d6af4dddf"], "path_name": ["中国", "江苏省", "南通市", "通州区"], "status": "active", "sort": 3204, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "d6128d30-58d6-41d1-a3e1-a36dfe553db1", "_rev": "2-d837daa828823a24c84e48a1b3f60b0d", "type": "region", "code": "110112", "name": "通州区", "parent_id": "7e3426ea-f2ed-4d67-8d13-4f8797205519", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "7e3426ea-f2ed-4d67-8d13-4f8797205519", "d6128d30-58d6-41d1-a3e1-a36dfe553db1"], "path_name": ["中国", "北京市", "通州区"], "status": "active", "sort": 3203, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:15", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:15"} +{"_id": "04d6bc18-6a71-40e0-ac0c-4e48bc592c01", "_rev": "2-e3361c1d22a0b371caf770a61f4a1db0", "type": "region", "code": "420107", "name": "青山区", "parent_id": "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "1d38d0dc-c2f0-4830-be67-035cb3ec0a5f", "a194d59f-30ea-4069-89ab-b8b3c7a5b42e", "04d6bc18-6a71-40e0-ac0c-4e48bc592c01"], "path_name": ["中国", "湖北省", "武汉市", "青山区"], "status": "active", "sort": 3208, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "16611b3f-f5c9-46cf-8d51-08d3d40b2eb6", "_rev": "2-c428a3d75ee49316173d005b6b3cc650", "type": "region", "code": "150204", "name": "青山区", "parent_id": "d8d36aea-4487-4ae0-a56e-44675ff47702", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "d8d36aea-4487-4ae0-a56e-44675ff47702", "16611b3f-f5c9-46cf-8d51-08d3d40b2eb6"], "path_name": ["中国", "内蒙古自治区", "包头市", "青山区"], "status": "active", "sort": 3207, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "4ccf3d42-f77e-4f9e-af9e-15e4626ba204", "_rev": "2-3da0a350539dfcd02e181b3f539aa32f", "type": "region", "code": "130702", "name": "桥东区", "parent_id": "2664220f-38cf-47cc-8e39-ab9beac72939", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "2664220f-38cf-47cc-8e39-ab9beac72939", "4ccf3d42-f77e-4f9e-af9e-15e4626ba204"], "path_name": ["中国", "河北省", "张家口市", "桥东区"], "status": "active", "sort": 3206, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "6d490cec-3269-4168-bd0a-a6a5e9bfaf04", "_rev": "2-8917ee12a0075068b1d8d8dc6867fa86", "type": "region", "code": "360113", "name": "红谷滩区", "parent_id": "f4486d5c-8740-4480-8eef-81126bc88fce", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "f4486d5c-8740-4480-8eef-81126bc88fce", "6d490cec-3269-4168-bd0a-a6a5e9bfaf04"], "path_name": ["中国", "江西省", "南昌市", "红谷滩区"], "status": "active", "sort": 3209, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "e41bce31-abf8-41e3-b340-2318504d596b", "_rev": "2-882fe88ab974ec7440d0ecc3c1b7a6de", "type": "region", "code": "230606", "name": "大同区", "parent_id": "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "5ccde7ae-aa5f-4167-a465-9f54b9e9c313", "e41bce31-abf8-41e3-b340-2318504d596b"], "path_name": ["中国", "黑龙江省", "大庆市", "大同区"], "status": "active", "sort": 3210, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "ff9298e4-3bd2-4e02-b3fb-f57b2ea3258e", "_rev": "2-a6fd74fbf5484291f52165560ed229f2", "type": "region", "code": "130502", "name": "襄都区", "parent_id": "d351bdad-14e4-49d9-adb2-01dbc329068a", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "3310e691-b8b3-4b79-a5b4-16bd081977d4", "d351bdad-14e4-49d9-adb2-01dbc329068a", "ff9298e4-3bd2-4e02-b3fb-f57b2ea3258e"], "path_name": ["中国", "河北省", "邢台市", "襄都区"], "status": "active", "sort": 3205, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:16", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:16"} +{"_id": "19aacf77-12db-42ab-8db7-2356ef6b0b82", "_rev": "2-db4ca74732bf2425eb55f0e3f6e93623", "type": "region", "code": "210202", "name": "中山区", "parent_id": "add376c7-08e7-4686-8aa4-220e132f0e57", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "14008d23-62b3-4ec8-91b4-a672b95168f6", "add376c7-08e7-4686-8aa4-220e132f0e57", "19aacf77-12db-42ab-8db7-2356ef6b0b82"], "path_name": ["中国", "辽宁省", "大连市", "中山区"], "status": "active", "sort": 3214, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "322c324a-59c6-4f0b-8179-54780868efcd", "_rev": "2-5ac875f83686cd9abba0dd35049a0089", "type": "region", "code": "440310", "name": "坪山区", "parent_id": "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "266aa57c-d98f-46eb-bd0a-2228814baf12", "ca368bfd-c1a1-4487-aeca-77fcd85089b3", "322c324a-59c6-4f0b-8179-54780868efcd"], "path_name": ["中国", "广东省", "深圳市", "坪山区"], "status": "active", "sort": 3215, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "3767e6b7-88be-49ad-bd9b-69c9601786e7", "_rev": "2-c351dffd482edfa15483a76c23f72648", "type": "region", "code": "150404", "name": "松山区", "parent_id": "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "dfcbc6b1-34a5-4df2-a862-4c3366ab38e3", "491734d2-7dbd-42ec-b599-e0e6ddf28ab6", "3767e6b7-88be-49ad-bd9b-69c9601786e7"], "path_name": ["中国", "内蒙古自治区", "赤峰市", "松山区"], "status": "active", "sort": 3212, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "4a5a2224-4f6c-4ae6-93e6-5e696c447985", "_rev": "2-d2531763dc2980034549d8150ec4e432", "type": "region", "code": "510304", "name": "大安区", "parent_id": "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "d2fe720b-2e6a-41fc-bc99-934255987ba8", "656e2f9a-bf3f-4a5e-b96e-87649e8cc390", "4a5a2224-4f6c-4ae6-93e6-5e696c447985"], "path_name": ["中国", "四川省", "自贡市", "大安区"], "status": "active", "sort": 3213, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "9dd8aa4c-e529-459f-8f6d-98f5b6fd20d9", "_rev": "2-d7aac91fda97bb5e736b91aaea143777", "type": "region", "code": "659011", "name": "新星市", "parent_id": "ff1a9968-a2b8-43d3-8628-082308a153ff", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "ff1a9968-a2b8-43d3-8628-082308a153ff", "9dd8aa4c-e529-459f-8f6d-98f5b6fd20d9"], "path_name": ["中国", "新疆维吾尔自治区", "新星市"], "status": "active", "sort": 3216, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "db9dcaf8-f771-4f0e-8f29-c602ebd11804", "_rev": "2-52d32cea787187777d121c2f0d792b81", "type": "region", "code": "230822", "name": "桦南县", "parent_id": "e6922639-48ed-4dba-9d77-900f17e6c81b", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "318d1515-26ea-4b81-b071-4cf0ea855ba3", "e6922639-48ed-4dba-9d77-900f17e6c81b", "db9dcaf8-f771-4f0e-8f29-c602ebd11804"], "path_name": ["中国", "黑龙江省", "佳木斯市", "桦南县"], "status": "active", "sort": 3211, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:17", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:17"} +{"_id": "000f7d71-79a6-4e20-aab7-f48d55e4f7e4", "_rev": "2-98d3bd61fc33f46c5d4454e6f8fcc6ca", "type": "region", "code": "330114", "name": "钱塘区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "000f7d71-79a6-4e20-aab7-f48d55e4f7e4"], "path_name": ["中国", "浙江省", "杭州市", "钱塘区"], "status": "active", "sort": 3218, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "3959f7de-b6ac-4378-b7d4-707dbcd77448", "_rev": "2-cc3e1d418a78e895c61151d18276c85d", "type": "region", "code": "330113", "name": "临平区", "parent_id": "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "81548d61-9bb8-47e5-886f-36a664df4bf9", "48ce8ea1-a281-49e6-ab6b-1f20f209ab46", "3959f7de-b6ac-4378-b7d4-707dbcd77448"], "path_name": ["中国", "浙江省", "杭州市", "临平区"], "status": "active", "sort": 3217, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "401ec9ab-e2dc-4b21-9ca6-3ef20d1efb63", "_rev": "2-f9d1d659ca9fde7082d6bc8e98e70d6f", "type": "region", "code": "140214", "name": "云冈区", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "401ec9ab-e2dc-4b21-9ca6-3ef20d1efb63"], "path_name": ["中国", "山西省", "大同市", "云冈区"], "status": "active", "sort": 3221, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "b07b40ac-093e-4d07-adeb-8e3ae0d57e93", "_rev": "2-b604599e5479934fd6fdf0b7f33ab66e", "type": "region", "code": "360203", "name": "珠山区", "parent_id": "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "afe852ff-6f11-45a5-a729-bda3ea205a79", "19e06a8c-bc68-41b6-9f50-df50b95e8afe", "b07b40ac-093e-4d07-adeb-8e3ae0d57e93"], "path_name": ["中国", "江西省", "景德镇市", "珠山区"], "status": "active", "sort": 3219, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "bb99e29b-9845-43a7-89e1-3dd69202c393", "_rev": "2-60cd24b7f5bbad3ee2f4806c23e7680d", "type": "region", "code": "140212", "name": "新荣区", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "bb99e29b-9845-43a7-89e1-3dd69202c393"], "path_name": ["中国", "山西省", "大同市", "新荣区"], "status": "active", "sort": 3222, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "d3c4d43f-5b44-47fa-b0ee-90589fedb0e5", "_rev": "2-19ef1f0c0f56bc1594aa452bf8416573", "type": "region", "code": "320322", "name": "沛县", "parent_id": "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "026d57d5-1440-4cde-8a0f-addef34578e9", "0f2eee62-1acc-4a49-86ca-e22bffe83f96", "d3c4d43f-5b44-47fa-b0ee-90589fedb0e5"], "path_name": ["中国", "江苏省", "徐州市", "沛县"], "status": "active", "sort": 3220, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:18", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:18"} +{"_id": "056489c9-b917-40a8-9b56-daafdecfa41c", "_rev": "2-a601ed39a277dc6213a65c2ef9723c93", "type": "region", "code": "640106", "name": "金凤区", "parent_id": "0ec18498-440a-408c-a8d6-83b4d47fe662", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "80ff9327-d153-4a58-9ad7-b1b173b77440", "0ec18498-440a-408c-a8d6-83b4d47fe662", "056489c9-b917-40a8-9b56-daafdecfa41c"], "path_name": ["中国", "宁夏回族自治区", "银川市", "金凤区"], "status": "active", "sort": 3224, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:19"} +{"_id": "b5f13daf-358b-4d92-8523-4adf2ae00462", "_rev": "2-2bc393d5b37f5c16801f18b70c055d2a", "type": "region", "code": "140213", "name": "平城区", "parent_id": "26b9068a-ec82-47d1-888f-8b54426f817e", "region_type": "county", "path": ["a351efb9-a756-4e31-8b18-785328bb4105", "357c52c5-5c03-48c3-bac1-413d21c0c677", "26b9068a-ec82-47d1-888f-8b54426f817e", "b5f13daf-358b-4d92-8523-4adf2ae00462"], "path_name": ["中国", "山西省", "大同市", "平城区"], "status": "active", "sort": 3223, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:05:19", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-05-30 09:05:19"} +{"_id": "031ade96-66a0-4ed7-a194-9fbc647cd440", "_rev": "1-dff02c540c5be35914f51571a85a9601", "type": "region", "code": "BS", "name": "巴哈马", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "031ade96-66a0-4ed7-a194-9fbc647cd440"], "path_name": ["境外", "巴哈马"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "034ab42a-7484-4231-b978-1118246f3faa", "_rev": "1-54532ae7933219f25ac7e74c67259ae9", "type": "region", "code": "KY", "name": "开曼群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "034ab42a-7484-4231-b978-1118246f3faa"], "path_name": ["境外", "开曼群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "04229d9b-fece-4dc8-8b06-0a9c8ab908d5", "_rev": "1-b38ca1bb95645855e1e077527e968af9", "type": "region", "code": "MH", "name": "马绍尔群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "04229d9b-fece-4dc8-8b06-0a9c8ab908d5"], "path_name": ["境外", "马绍尔群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "056beb36-98ca-4b84-8a18-7b8d4a712042", "_rev": "1-404ae70fe8a6daa2ed1f8d2cd0e843b9", "type": "region", "code": "IN", "name": "印度", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "056beb36-98ca-4b84-8a18-7b8d4a712042"], "path_name": ["境外", "印度"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "075dd033-dd5d-475b-8607-817d65148f58", "_rev": "1-12a463c36f71cad53efdf333fdbfec21", "type": "region", "code": "DO", "name": "多米尼加", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "075dd033-dd5d-475b-8607-817d65148f58"], "path_name": ["境外", "多米尼加"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "08935cfa-99b6-4104-8a05-f1e88713eeaf", "_rev": "1-6cde30157be2097b5cb0d0c92c3d75d4", "type": "region", "code": "CG", "name": "刚果(布)", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "08935cfa-99b6-4104-8a05-f1e88713eeaf"], "path_name": ["境外", "刚果(布)"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "0ba89bb2-f3d8-4401-ade6-8e282bddf7b1", "_rev": "1-8aa4802e9f6db670d8754bb4654e5d32", "type": "region", "code": "LC", "name": "圣卢西亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "0ba89bb2-f3d8-4401-ade6-8e282bddf7b1"], "path_name": ["境外", "圣卢西亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "0c65afd9-cfae-48c0-9755-e0ba3a4f6eab", "_rev": "1-3313f394001e7dba68d1cadf347e65a0", "type": "region", "code": "KP", "name": "朝鲜", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "0c65afd9-cfae-48c0-9755-e0ba3a4f6eab"], "path_name": ["境外", "朝鲜"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "0f08bc86-e577-4ed1-a8be-71b3da29d743", "_rev": "1-88f9c7b6a1faf4e74c2dc143118b0785", "type": "region", "code": "KH", "name": "柬埔寨", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "0f08bc86-e577-4ed1-a8be-71b3da29d743"], "path_name": ["境外", "柬埔寨"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "10c5a89c-4c6a-4a80-ab9b-3f6ee3038483", "_rev": "1-b46be514c933562babf9dde4080373b8", "type": "region", "code": "TM", "name": "土库曼斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "10c5a89c-4c6a-4a80-ab9b-3f6ee3038483"], "path_name": ["境外", "土库曼斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "10d31d89-16d2-4d8e-a925-6f9b11392300", "_rev": "1-d3a63cf3bd1f3c75fb25035fe303533d", "type": "region", "code": "AF", "name": "阿富汗", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "10d31d89-16d2-4d8e-a925-6f9b11392300"], "path_name": ["境外", "阿富汗"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "1239f6d0-61e8-4c25-9718-b80deaf59de0", "_rev": "1-1501c5f7ef5cf2fa3cb519fda8aa4219", "type": "region", "code": "CW", "name": "库拉索", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "1239f6d0-61e8-4c25-9718-b80deaf59de0"], "path_name": ["境外", "库拉索"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "12411dd9-d068-47d6-b874-52977ab2c926", "_rev": "1-857530fac316b7d0966785b23f2f76c2", "type": "region", "code": "TR", "name": "土耳其", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "12411dd9-d068-47d6-b874-52977ab2c926"], "path_name": ["境外", "土耳其"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "12e0e26e-d742-402e-acc2-aa1f07540798", "_rev": "1-a225c088d3c7bb7f8ffb54db6dc45787", "type": "region", "code": "MK", "name": "北马其顿", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "12e0e26e-d742-402e-acc2-aa1f07540798"], "path_name": ["境外", "北马其顿"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "172001b3-9334-4642-a9f8-11236fc01e67", "_rev": "1-9751921835b4c12e7528616b73dcf049", "type": "region", "code": "BI", "name": "布隆迪", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "172001b3-9334-4642-a9f8-11236fc01e67"], "path_name": ["境外", "布隆迪"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "17c0173b-44ad-4ad9-ad11-f51f4b92600f", "_rev": "1-ad1598a019f5e0ce2a9533bbfe68209c", "type": "region", "code": "VU", "name": "瓦努阿图", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "17c0173b-44ad-4ad9-ad11-f51f4b92600f"], "path_name": ["境外", "瓦努阿图"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "17d25d81-fc6c-46d8-b7fd-5b07f0d0a725", "_rev": "1-8c769c200af088e7f7b300ea4e38141a", "type": "region", "code": "NI", "name": "尼加拉瓜", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "17d25d81-fc6c-46d8-b7fd-5b07f0d0a725"], "path_name": ["境外", "尼加拉瓜"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "189a7194-ebd2-46c8-97a3-ca841e4997ff", "_rev": "1-1388fb529d0c0159b9547602f8074597", "type": "region", "code": "RO", "name": "罗马尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "189a7194-ebd2-46c8-97a3-ca841e4997ff"], "path_name": ["境外", "罗马尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "196308c1-5550-4588-b5c5-c0c61b096549", "_rev": "1-9aac94688311242fab91767c5123f785", "type": "region", "code": "KE", "name": "肯尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "196308c1-5550-4588-b5c5-c0c61b096549"], "path_name": ["境外", "肯尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "197c3c7c-c59b-419e-9909-4fe9f0635d5a", "_rev": "1-d376894db66a894064fcc2367d19045f", "type": "region", "code": "NA", "name": "纳米比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "197c3c7c-c59b-419e-9909-4fe9f0635d5a"], "path_name": ["境外", "纳米比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "1bbdec42-d6db-43f8-97d3-978e04d31a9f", "_rev": "1-92404272adb35c1cd6d3b144014eaae8", "type": "region", "code": "MR", "name": "毛里塔尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "1bbdec42-d6db-43f8-97d3-978e04d31a9f"], "path_name": ["境外", "毛里塔尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "1bc9fdd7-e9bc-4d7b-a587-b5d3b3d3cc3a", "_rev": "1-fbb12842873560280a40d6573949df62", "type": "region", "code": "BR", "name": "巴西", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "1bc9fdd7-e9bc-4d7b-a587-b5d3b3d3cc3a"], "path_name": ["境外", "巴西"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "1d3ec30f-43a6-43a3-a199-5ece3b550c38", "_rev": "1-36c7685492701c1a8b81861abe1e2c16", "type": "region", "code": "NL", "name": "荷兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "1d3ec30f-43a6-43a3-a199-5ece3b550c38"], "path_name": ["境外", "荷兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "20f0486c-eebc-4962-9779-ed009559e052", "_rev": "1-715b301e112b133401ccb006ff082b08", "type": "region", "code": "DM", "name": "多米尼克", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "20f0486c-eebc-4962-9779-ed009559e052"], "path_name": ["境外", "多米尼克"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "22054098-133a-4fb0-b785-7cae76284360", "_rev": "1-44ec82f0d938c96639862cc89da53ffd", "type": "region", "code": "AD", "name": "安道尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "22054098-133a-4fb0-b785-7cae76284360"], "path_name": ["境外", "安道尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "225b2ad3-189a-421c-a67c-8536e4ffe6e1", "_rev": "1-416be364559185bf1d3c979d3d1d3b7d", "type": "region", "code": "MC", "name": "摩纳哥", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "225b2ad3-189a-421c-a67c-8536e4ffe6e1"], "path_name": ["境外", "摩纳哥"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "227f727a-0676-45b0-ab75-57bea02249c3", "_rev": "1-7754decf78f07e3693ea39d11cebb680", "type": "region", "code": "NP", "name": "尼泊尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "227f727a-0676-45b0-ab75-57bea02249c3"], "path_name": ["境外", "尼泊尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "22cc786d-18ef-46f6-a78f-0eca525a6ca2", "_rev": "1-e458c6d9fd0f21d59f816899b3da5235", "type": "region", "code": "PS", "name": "巴勒斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "22cc786d-18ef-46f6-a78f-0eca525a6ca2"], "path_name": ["境外", "巴勒斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2323929d-80cb-4ed1-955b-b42b14019fb2", "_rev": "1-24cf20867f1ee40abd168e460dd7c705", "type": "region", "code": "TF", "name": "法属南部和南极领地", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2323929d-80cb-4ed1-955b-b42b14019fb2"], "path_name": ["境外", "法属南部和南极领地"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2377fd96-de3e-4f15-94c5-a39644603913", "_rev": "1-c9246a0aa1fdc22ef71a42dacde0a546", "type": "region", "code": "CH", "name": "瑞士", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2377fd96-de3e-4f15-94c5-a39644603913"], "path_name": ["境外", "瑞士"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "23c022a8-cece-4c27-9382-e507311bdb94", "_rev": "1-7cccc69b78efe950eeb71af854075038", "type": "region", "code": "ME", "name": "黑山", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "23c022a8-cece-4c27-9382-e507311bdb94"], "path_name": ["境外", "黑山"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "24dad354-199b-49d0-93d0-85dd379b720a", "_rev": "1-1d0839b6ec906647d2a7e101adb74a9d", "type": "region", "code": "UY", "name": "乌拉圭", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "24dad354-199b-49d0-93d0-85dd379b720a"], "path_name": ["境外", "乌拉圭"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "25a621b8-6af9-4cc2-ab16-9117fd2c7d2a", "_rev": "1-a1fbf1619a3bb5bc38d9175b7e721d2e", "type": "region", "code": "MD", "name": "摩尔多瓦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "25a621b8-6af9-4cc2-ab16-9117fd2c7d2a"], "path_name": ["境外", "摩尔多瓦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "25e3191b-e596-4980-908e-334f38cedd0d", "_rev": "1-de6862a8de7ebcbe4e10e01ac34c7f7d", "type": "region", "code": "IM", "name": "马恩岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "25e3191b-e596-4980-908e-334f38cedd0d"], "path_name": ["境外", "马恩岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2601e247-e89e-4e67-a458-245abb0882d2", "_rev": "1-d44969305f537bed3c43792c7af9ca1e", "type": "region", "code": "MY", "name": "马来西亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2601e247-e89e-4e67-a458-245abb0882d2"], "path_name": ["境外", "马来西亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2622cbf5-e015-4d2c-a1a5-23e47206c363", "_rev": "1-1e9d576b765041b990473d61755a6102", "type": "region", "code": "KI", "name": "基里巴斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2622cbf5-e015-4d2c-a1a5-23e47206c363"], "path_name": ["境外", "基里巴斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2697c332-3b86-4b7d-bbb9-71396c9f92cd", "_rev": "1-2d4d042a35505a3a4d0a064dfcd7e1d7", "type": "region", "code": "IO", "name": "英属印度洋领地", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2697c332-3b86-4b7d-bbb9-71396c9f92cd"], "path_name": ["境外", "英属印度洋领地"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "28411d39-5a59-49b2-9944-9a5cdd308179", "_rev": "1-692dbfd6935040459109482b7d8dadff", "type": "region", "code": "AM", "name": "亚美尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "28411d39-5a59-49b2-9944-9a5cdd308179"], "path_name": ["境外", "亚美尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2affe785-b93b-470c-82d1-3ce20e4a5142", "_rev": "1-1c13e41c1f8c4d8fec886b8a00ff3351", "type": "region", "code": "ZW", "name": "津巴布韦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2affe785-b93b-470c-82d1-3ce20e4a5142"], "path_name": ["境外", "津巴布韦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2ce024cd-349b-4a38-aee3-599283386b0e", "_rev": "1-7cdb15d1b2b2734cdea0769521c3fd3d", "type": "region", "code": "GD", "name": "格林纳达", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2ce024cd-349b-4a38-aee3-599283386b0e"], "path_name": ["境外", "格林纳达"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2d049ef7-a831-4431-bc1c-4cfa0f775e9f", "_rev": "1-cd977f9e4661fc512e82ed7a067a32ff", "type": "region", "code": "GA", "name": "加蓬", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2d049ef7-a831-4431-bc1c-4cfa0f775e9f"], "path_name": ["境外", "加蓬"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2ee2f920-981b-4ea2-bb3b-d39e046458ed", "_rev": "1-e293708ec03ab3693f93b400c8019355", "type": "region", "code": "BB", "name": "巴巴多斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2ee2f920-981b-4ea2-bb3b-d39e046458ed"], "path_name": ["境外", "巴巴多斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "2ff55011-9de2-43b4-89bc-48ff87c4cf3c", "_rev": "1-4eb7060accc2383cd45a838b1049f6fe", "type": "region", "code": "AG", "name": "安提瓜和巴布达", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "2ff55011-9de2-43b4-89bc-48ff87c4cf3c"], "path_name": ["境外", "安提瓜和巴布达"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "31703912-4e66-4504-b64d-0d57dd58395a", "_rev": "1-a7e9b0f3618ad82bc63f79d06eded7a9", "type": "region", "code": "BZ", "name": "伯利兹", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "31703912-4e66-4504-b64d-0d57dd58395a"], "path_name": ["境外", "伯利兹"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "31a4e38c-cd58-49a0-9771-bb2ffe2bc7f9", "_rev": "1-a4828a88e8bca4f71aed25db9b5f0a81", "type": "region", "code": "AQ", "name": "南极洲", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "31a4e38c-cd58-49a0-9771-bb2ffe2bc7f9"], "path_name": ["境外", "南极洲"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "336e65cc-1dda-4cc4-bc18-bf2f3730f5a7", "_rev": "1-db584c36a48411ac54bc35c82e3cb0dd", "type": "region", "code": "NG", "name": "尼日利亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "336e65cc-1dda-4cc4-bc18-bf2f3730f5a7"], "path_name": ["境外", "尼日利亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "33c87a6a-15c9-44af-84cb-48a7438fc051", "_rev": "1-5c84316b4318ab7da74d62833376393f", "type": "region", "code": "MV", "name": "马尔代夫", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "33c87a6a-15c9-44af-84cb-48a7438fc051"], "path_name": ["境外", "马尔代夫"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "343be212-0900-424d-8571-a1c65bfe85b3", "_rev": "1-f44435ddb5a5e42757c09cea4d4b9080", "type": "region", "code": "PH", "name": "菲律宾", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "343be212-0900-424d-8571-a1c65bfe85b3"], "path_name": ["境外", "菲律宾"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "34a022be-c975-42a0-ae92-83b1cea3dc72", "_rev": "1-e12689b8dadaf2023dc6d12cd40587bd", "type": "region", "code": "SL", "name": "塞拉利昂", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "34a022be-c975-42a0-ae92-83b1cea3dc72"], "path_name": ["境外", "塞拉利昂"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "34bb1840-313d-4854-a12b-b87ee8591020", "_rev": "1-ac9d1e4ee4fe3bdf51686e088ebc9891", "type": "region", "code": "DZ", "name": "阿尔及利亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "34bb1840-313d-4854-a12b-b87ee8591020"], "path_name": ["境外", "阿尔及利亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "35bfb5f5-a1cf-4dcf-a874-221024a17490", "_rev": "1-d0eab783521e82e3886230feb33fb2f7", "type": "region", "code": "SC", "name": "塞舌尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "35bfb5f5-a1cf-4dcf-a874-221024a17490"], "path_name": ["境外", "塞舌尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "37f2fb17-a378-4203-8953-b8f143b5722c", "_rev": "1-8e42a908d5bdab713659168781abfa14", "type": "region", "code": "AX", "name": "奥兰群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "37f2fb17-a378-4203-8953-b8f143b5722c"], "path_name": ["境外", "奥兰群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "38eab7d9-bc88-489e-9d07-7accb5c82e98", "_rev": "1-01742843281279ed1014ad56334301d1", "type": "region", "code": "-99", "name": "锡亚琴冰川", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "38eab7d9-bc88-489e-9d07-7accb5c82e98"], "path_name": ["境外", "锡亚琴冰川"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "3a0b086d-6a7e-4ce8-8a3a-7f8967932b96", "_rev": "1-f516d6781ef5dab9a652b170fa42d093", "type": "region", "code": "CD", "name": "刚果(金)", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "3a0b086d-6a7e-4ce8-8a3a-7f8967932b96"], "path_name": ["境外", "刚果(金)"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "3aac477f-584c-4b51-a8e3-14d0e81fba4d", "_rev": "1-95f57eb07ecb6700fd033e3570b4d2c7", "type": "region", "code": "HT", "name": "海地", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "3aac477f-584c-4b51-a8e3-14d0e81fba4d"], "path_name": ["境外", "海地"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "3aba7fa2-8196-4289-a17e-c0831e01dc1b", "_rev": "1-028fda20b44c435ba1fbd14e06ff371a", "type": "region", "code": "IS", "name": "冰岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "3aba7fa2-8196-4289-a17e-c0831e01dc1b"], "path_name": ["境外", "冰岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "3d987051-61bd-46fb-af88-28243338fdae", "_rev": "1-648b8f30218a1675e1ef061fe443bae6", "type": "region", "code": "SM", "name": "圣马力诺", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "3d987051-61bd-46fb-af88-28243338fdae"], "path_name": ["境外", "圣马力诺"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "415be66e-b985-441a-a297-63bf610ceed8", "_rev": "1-c020b263be8bb998bd480ecc22cc5d5c", "type": "region", "code": "NC", "name": "新喀里多尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "415be66e-b985-441a-a297-63bf610ceed8"], "path_name": ["境外", "新喀里多尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "419c49ea-ffce-4f18-9654-e490433b8593", "_rev": "1-c744395183ff1311c0839b1d46de0c9e", "type": "region", "code": "TH", "name": "泰国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "419c49ea-ffce-4f18-9654-e490433b8593"], "path_name": ["境外", "泰国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "41bbcf86-1329-40ea-89af-3a9ae3f8d51c", "_rev": "1-4a8fbac3d1b059e537437350bd5d1402", "type": "region", "code": "PW", "name": "帕劳", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "41bbcf86-1329-40ea-89af-3a9ae3f8d51c"], "path_name": ["境外", "帕劳"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "41f8c64c-f95a-4930-9c30-0617666713a6", "_rev": "1-96453741c53fad0c81e8defaf6ad1237", "type": "region", "code": "GB", "name": "英国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "41f8c64c-f95a-4930-9c30-0617666713a6"], "path_name": ["境外", "英国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "43315704-6280-47e1-923e-c35dfa4cfc65", "_rev": "1-068e75d919d0159ef8b0ee230e761415", "type": "region", "code": "TC", "name": "特克斯和凯科斯群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "43315704-6280-47e1-923e-c35dfa4cfc65"], "path_name": ["境外", "特克斯和凯科斯群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "43774d0a-23a6-4907-b269-f63fb5f2404d", "_rev": "1-8953242619e2b5f061704fd26ef9506c", "type": "region", "code": "PF", "name": "法属波利尼西亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "43774d0a-23a6-4907-b269-f63fb5f2404d"], "path_name": ["境外", "法属波利尼西亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "452dada0-b381-4892-8841-cf14597ade31", "_rev": "1-e4163ff58d212762a75a926caf6316a9", "type": "region", "code": "NR", "name": "瑙鲁", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "452dada0-b381-4892-8841-cf14597ade31"], "path_name": ["境外", "瑙鲁"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "458caa9f-19ef-499c-87fb-c4860b07a70c", "_rev": "1-16d9f5519baea1e05437cb8210db4adb", "type": "region", "code": "FI", "name": "芬兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "458caa9f-19ef-499c-87fb-c4860b07a70c"], "path_name": ["境外", "芬兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "46bc71fb-bba3-4be6-b066-de6092a99917", "_rev": "1-21bf642c9af90623ad2660de829de17c", "type": "region", "code": "CX", "name": "圣诞岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "46bc71fb-bba3-4be6-b066-de6092a99917"], "path_name": ["境外", "圣诞岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4848b4c2-8b70-48ca-9694-933bc73366d9", "_rev": "1-9993d72570f316e40a5df0d4581bdb20", "type": "region", "code": "SI", "name": "斯洛文尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4848b4c2-8b70-48ca-9694-933bc73366d9"], "path_name": ["境外", "斯洛文尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "48e845a6-b3bf-43b8-b1a4-620c455e1bc1", "_rev": "1-aa037b73e43e7afdf5aef232dbe555f9", "type": "region", "code": "JP", "name": "日本", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "48e845a6-b3bf-43b8-b1a4-620c455e1bc1"], "path_name": ["境外", "日本"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4ab4851a-9c45-41cd-8f88-d62521ee2a72", "_rev": "1-3ae13bffb877e79c0450a07ee5e579b3", "type": "region", "code": "PN", "name": "皮特凯恩群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4ab4851a-9c45-41cd-8f88-d62521ee2a72"], "path_name": ["境外", "皮特凯恩群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4b5a7b67-9ee7-4d4d-9544-21949dda5de9", "_rev": "1-393000e1c5f71ae0268a629992cb33ec", "type": "region", "code": "PY", "name": "巴拉圭", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4b5a7b67-9ee7-4d4d-9544-21949dda5de9"], "path_name": ["境外", "巴拉圭"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4bbea52a-20c1-456f-8490-e02c79b7ae66", "_rev": "1-c5f9a4f1f12cde1f3f5be983c51e2c11", "type": "region", "code": "MP", "name": "北马里亚纳群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4bbea52a-20c1-456f-8490-e02c79b7ae66"], "path_name": ["境外", "北马里亚纳群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4c016f0d-575a-4d3f-a2b7-ec0115008400", "_rev": "1-0180a5a14a6ddbf7217f285c0127852f", "type": "region", "code": "NE", "name": "尼日尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4c016f0d-575a-4d3f-a2b7-ec0115008400"], "path_name": ["境外", "尼日尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4cfbc697-8c14-4017-9cdd-2c701b91ef52", "_rev": "1-7b0ff0c0a4d05960cdc94d8b91342d4d", "type": "region", "code": "DK", "name": "丹麦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4cfbc697-8c14-4017-9cdd-2c701b91ef52"], "path_name": ["境外", "丹麦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4fe62853-50b0-42c7-9b31-95140900d45f", "_rev": "1-6d8cc28bc893a037d0b920a6191a06ea", "type": "region", "code": "WS", "name": "萨摩亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4fe62853-50b0-42c7-9b31-95140900d45f"], "path_name": ["境外", "萨摩亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "4fedefc7-b2c8-43f2-bcee-fc22fc9bf344", "_rev": "1-3a47ae9c6a720d99eb52090fa0e94a96", "type": "region", "code": "EC", "name": "厄瓜多尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "4fedefc7-b2c8-43f2-bcee-fc22fc9bf344"], "path_name": ["境外", "厄瓜多尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "504c7465-4208-4681-b2a3-cccd9b7a35a3", "_rev": "1-3587c6926414500d9bb1b18479696d10", "type": "region", "code": "AL", "name": "阿尔巴尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "504c7465-4208-4681-b2a3-cccd9b7a35a3"], "path_name": ["境外", "阿尔巴尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "50d7dd3f-9441-4706-a3d9-3044d903cac1", "_rev": "1-1754496b7872d96830ca491b093c5701", "type": "region", "code": "-99", "name": "北塞浦路斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "50d7dd3f-9441-4706-a3d9-3044d903cac1"], "path_name": ["境外", "北塞浦路斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "50d9cf87-e039-4b52-bf94-aa16a9f8b8ba", "_rev": "1-70580197869ad4b383f1adf5b2211298", "type": "region", "code": "CM", "name": "喀麦隆", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "50d9cf87-e039-4b52-bf94-aa16a9f8b8ba"], "path_name": ["境外", "喀麦隆"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "513a4aa0-50d2-4b79-b10e-b7895faa5a63", "_rev": "1-b9650c23641b1eb64a5d7554be2c0bef", "type": "region", "code": "MU", "name": "毛里求斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "513a4aa0-50d2-4b79-b10e-b7895faa5a63"], "path_name": ["境外", "毛里求斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "514e71fa-f500-4a5f-a60f-33f7e93ac512", "_rev": "1-51fd98db48c18b939bf1236bec9304b4", "type": "region", "code": "RU", "name": "俄罗斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "514e71fa-f500-4a5f-a60f-33f7e93ac512"], "path_name": ["境外", "俄罗斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "523a4b5a-925a-4339-8059-5c904e95b8c3", "_rev": "1-ca57f25ec127de4ff0c58680b507283c", "type": "region", "code": "MA", "name": "摩洛哥", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "523a4b5a-925a-4339-8059-5c904e95b8c3"], "path_name": ["境外", "摩洛哥"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "540799e9-12c0-4de2-855e-e6c17548c8c0", "_rev": "1-0090871d18acf09c63333d6c0340dc93", "type": "region", "code": "BT", "name": "不丹", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "540799e9-12c0-4de2-855e-e6c17548c8c0"], "path_name": ["境外", "不丹"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "545fcd2e-8eb3-4564-a10c-79a068a10ebb", "_rev": "1-e9ea471c0a0b87b48572d9aae3aa59cf", "type": "region", "code": "LI", "name": "列支敦士登", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "545fcd2e-8eb3-4564-a10c-79a068a10ebb"], "path_name": ["境外", "列支敦士登"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "55fa58fa-618e-4556-89cc-0dd6c0de9719", "_rev": "1-6fa7f443d3103fb45c1e57fc884a5f37", "type": "region", "code": "MN", "name": "蒙古", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "55fa58fa-618e-4556-89cc-0dd6c0de9719"], "path_name": ["境外", "蒙古"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "57f7c73f-9ae7-4558-8f45-635d78243a68", "_rev": "1-bb986410a60c677e64530ff5853e715d", "type": "region", "code": "AW", "name": "阿鲁巴", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "57f7c73f-9ae7-4558-8f45-635d78243a68"], "path_name": ["境外", "阿鲁巴"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5828a664-4696-4597-bc00-c47d2ae704e9", "_rev": "1-e6cf62d4f6898da0deda08fe2f9fa8f1", "type": "region", "code": "HR", "name": "克罗地亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5828a664-4696-4597-bc00-c47d2ae704e9"], "path_name": ["境外", "克罗地亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "59f722d6-18f8-40f0-91fc-e938fb3dda2d", "_rev": "1-d22a48bc42c92e3dcb4a171586904bb1", "type": "region", "code": "ER", "name": "厄立特里亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "59f722d6-18f8-40f0-91fc-e938fb3dda2d"], "path_name": ["境外", "厄立特里亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5b7df048-269d-4942-bbb7-5d7093faa7a0", "_rev": "1-e38fe2c15894ef640c6696c20c7d295a", "type": "region", "code": "SG", "name": "新加坡", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5b7df048-269d-4942-bbb7-5d7093faa7a0"], "path_name": ["境外", "新加坡"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5d377243-ce34-4b64-96af-85dd07d61d9b", "_rev": "1-a30642c64c5fb8f323a0a3806e384111", "type": "region", "code": "PT", "name": "葡萄牙", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5d377243-ce34-4b64-96af-85dd07d61d9b"], "path_name": ["境外", "葡萄牙"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5d96449b-5d57-4e23-a232-3686b0ad4181", "_rev": "1-607c0891c4a58e4b5bd76e8f6f852f0a", "type": "region", "code": "SA", "name": "沙特阿拉伯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5d96449b-5d57-4e23-a232-3686b0ad4181"], "path_name": ["境外", "沙特阿拉伯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5db4bc43-eace-4340-98e0-3d5dff64cdfa", "_rev": "1-f24b036d923273866ae9ab4419f32f0d", "type": "region", "code": "EH", "name": "西撒哈拉", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5db4bc43-eace-4340-98e0-3d5dff64cdfa"], "path_name": ["境外", "西撒哈拉"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5df2d77f-16d7-471f-a9f8-e7131374ffc5", "_rev": "1-245463d3f23887a4fdf3ac802027c06d", "type": "region", "code": "NZ", "name": "新西兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5df2d77f-16d7-471f-a9f8-e7131374ffc5"], "path_name": ["境外", "新西兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5e8805ce-6d80-4e81-93ee-11f4b500bc1d", "_rev": "1-fb046ea97eabe2af100ac8b1ac8fefbd", "type": "region", "code": "BH", "name": "巴林", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5e8805ce-6d80-4e81-93ee-11f4b500bc1d"], "path_name": ["境外", "巴林"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5f42dc9d-12cf-4f6b-9533-e52427f54799", "_rev": "1-46cdd142cd5cdbbf56b1274773620972", "type": "region", "code": "SZ", "name": "斯威士兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5f42dc9d-12cf-4f6b-9533-e52427f54799"], "path_name": ["境外", "斯威士兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "5fb8ca1c-4aad-47dd-bf6a-51fab7b71f12", "_rev": "1-6ca84b2e65669cca1057e0a1a7009aea", "type": "region", "code": "GH", "name": "加纳", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "5fb8ca1c-4aad-47dd-bf6a-51fab7b71f12"], "path_name": ["境外", "加纳"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "61c3830e-43b1-4ec8-904c-0dbc826d1d01", "_rev": "1-3696c497fe902e31b18235b8a941d070", "type": "region", "code": "GE", "name": "格鲁吉亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "61c3830e-43b1-4ec8-904c-0dbc826d1d01"], "path_name": ["境外", "格鲁吉亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "62aacaf4-0c9c-4fd6-8fdc-6389ae12c642", "_rev": "1-d68a10fb141bbb3dfe375e0a51d90a0a", "type": "region", "code": "BE", "name": "比利时", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "62aacaf4-0c9c-4fd6-8fdc-6389ae12c642"], "path_name": ["境外", "比利时"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "633370cd-3b71-4e8d-9d91-8a1e7d23f6b2", "_rev": "1-464b7fbaea78de92213226f7f34ad36d", "type": "region", "code": "IT", "name": "意大利", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "633370cd-3b71-4e8d-9d91-8a1e7d23f6b2"], "path_name": ["境外", "意大利"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "638609b3-f192-451c-acd7-1680d23c87f3", "_rev": "1-ba324e574cce205e23be28192a9cf7f0", "type": "region", "code": "CO", "name": "哥伦比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "638609b3-f192-451c-acd7-1680d23c87f3"], "path_name": ["境外", "哥伦比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "64559fec-e3bd-4674-9705-2b56c6703fd1", "_rev": "1-ae29e13a1c21da6d7b7a6f11cb44c527", "type": "region", "code": "FK", "name": "马尔维纳斯群岛(福克兰)", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "64559fec-e3bd-4674-9705-2b56c6703fd1"], "path_name": ["境外", "马尔维纳斯群岛(福克兰)"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "65956640-b8e8-4cc4-85fa-0fddea609d00", "_rev": "1-df2db3ea7407d8fbf2614b702e20da7a", "type": "region", "code": "UA", "name": "乌克兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "65956640-b8e8-4cc4-85fa-0fddea609d00"], "path_name": ["境外", "乌克兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "65e27778-8259-4f3f-84d0-8242f5fa451c", "_rev": "1-be96713c368d6eef5764a21ddcbdecd4", "type": "region", "code": "FJ", "name": "斐济", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "65e27778-8259-4f3f-84d0-8242f5fa451c"], "path_name": ["境外", "斐济"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "667da7f1-eaaa-4761-ac58-750edc6ce514", "_rev": "1-1cd6250c3979f5628f5b8ab69287af66", "type": "region", "code": "SR", "name": "苏里南", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "667da7f1-eaaa-4761-ac58-750edc6ce514"], "path_name": ["境外", "苏里南"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "66ec4d94-46a4-4afa-b6c2-cb1bac8c2d85", "_rev": "1-caaac1b1365394896c15950fb86da4bc", "type": "region", "code": "LU", "name": "卢森堡", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "66ec4d94-46a4-4afa-b6c2-cb1bac8c2d85"], "path_name": ["境外", "卢森堡"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "67715068-ffdd-4dfa-8e06-6ff4da1c6556", "_rev": "1-a36e48b83c4a14abfa71c3a76cd558a6", "type": "region", "code": "VC", "name": "圣文森特和格林纳丁斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "67715068-ffdd-4dfa-8e06-6ff4da1c6556"], "path_name": ["境外", "圣文森特和格林纳丁斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "68cb77e8-4fd6-4746-ac3c-3d738aa20153", "_rev": "1-1d5f9c879aa71591732ff667a292e18d", "type": "region", "code": "ET", "name": "埃塞俄比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "68cb77e8-4fd6-4746-ac3c-3d738aa20153"], "path_name": ["境外", "埃塞俄比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6983dcbc-8565-406f-836b-f158ca4e17fb", "_rev": "1-b551e49516f14e22be793dc2e45cd722", "type": "region", "code": "GR", "name": "希腊", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6983dcbc-8565-406f-836b-f158ca4e17fb"], "path_name": ["境外", "希腊"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6af6082f-7367-450b-9dc8-761ea9a9dff6", "_rev": "1-81558388fc876b206a822046fbf92002", "type": "region", "code": "CY", "name": "塞浦路斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6af6082f-7367-450b-9dc8-761ea9a9dff6"], "path_name": ["境外", "塞浦路斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6bc34857-e8e0-4af8-9833-7569c67179f5", "_rev": "1-5fe1b6f579389ce66275663994661fe5", "type": "region", "code": "JM", "name": "牙买加", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6bc34857-e8e0-4af8-9833-7569c67179f5"], "path_name": ["境外", "牙买加"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6dbb9d1e-e4c7-435e-a120-252a66fcd646", "_rev": "1-41cfccdbf28749b7dbc9b478e36ff344", "type": "region", "code": "CK", "name": "库克群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6dbb9d1e-e4c7-435e-a120-252a66fcd646"], "path_name": ["境外", "库克群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6edc8f0a-6c55-4110-8122-2c75321b04cf", "_rev": "1-1f08febf88d3233d44f360ef093a8e84", "type": "region", "code": "PA", "name": "巴拿马", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6edc8f0a-6c55-4110-8122-2c75321b04cf"], "path_name": ["境外", "巴拿马"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6f253e63-5afd-4d55-acc8-2327ec029591", "_rev": "1-ef2e44af536de8301878b5c0281975d9", "type": "region", "code": "HU", "name": "匈牙利", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6f253e63-5afd-4d55-acc8-2327ec029591"], "path_name": ["境外", "匈牙利"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "6fc07585-482f-43d3-8b3d-0d086e4e0b0c", "_rev": "1-77361d8e1c8aaea990ba73f260d3b0d7", "type": "region", "code": "TL", "name": "东帝汶", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "6fc07585-482f-43d3-8b3d-0d086e4e0b0c"], "path_name": ["境外", "东帝汶"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "700fa61c-a989-46c0-b500-667c4e367372", "_rev": "1-70d32a4f38dd151021d9d81317b51e29", "type": "region", "code": "CF", "name": "中非", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "700fa61c-a989-46c0-b500-667c4e367372"], "path_name": ["境外", "中非"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "72e85383-61f0-4be3-9ccb-7d6dde4ece95", "_rev": "1-60144cf65891547a41a8502b7be1a85b", "type": "region", "code": "JE", "name": "泽西岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "72e85383-61f0-4be3-9ccb-7d6dde4ece95"], "path_name": ["境外", "泽西岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "73e8c930-357c-492b-a3ae-5e46fb7915a7", "_rev": "1-50fc768ce1f5ee2fe5c82b26cc2867cc", "type": "region", "code": "VG", "name": "英属维尔京群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "73e8c930-357c-492b-a3ae-5e46fb7915a7"], "path_name": ["境外", "英属维尔京群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "76b0c05c-fa48-42d0-892c-4fa4b132326f", "_rev": "1-f149c15d82af88ee6f7fae6abd9fcf4b", "type": "region", "code": "RW", "name": "卢旺达", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "76b0c05c-fa48-42d0-892c-4fa4b132326f"], "path_name": ["境外", "卢旺达"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "789ae1eb-67d9-4c04-a37d-e286420dc8bd", "_rev": "1-c92ba34f0e6954227240dbd46b691925", "type": "region", "code": "MX", "name": "墨西哥", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "789ae1eb-67d9-4c04-a37d-e286420dc8bd"], "path_name": ["境外", "墨西哥"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "790a82e4-debb-44f0-9d58-f3abdf74412f", "_rev": "1-befaf0024a4a46bf6231cd7f4fc0e0c9", "type": "region", "code": "OM", "name": "阿曼", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "790a82e4-debb-44f0-9d58-f3abdf74412f"], "path_name": ["境外", "阿曼"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "79444d18-d992-48bc-8713-9c8066fcf715", "_rev": "1-34869a4b9daecd604bc7f44bf5901eb7", "type": "region", "code": "GG", "name": "根西岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "79444d18-d992-48bc-8713-9c8066fcf715"], "path_name": ["境外", "根西岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7a57e5a2-938d-4950-b437-907c78043bde", "_rev": "1-75e20b158ce33ad08eb2e4c9fd873704", "type": "region", "code": "TZ", "name": "坦桑尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7a57e5a2-938d-4950-b437-907c78043bde"], "path_name": ["境外", "坦桑尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7aa0a712-0d23-4472-86c8-a7f0e37c602e", "_rev": "1-c2abf8e5c714eb4e613783656b7a138f", "type": "region", "code": "PR", "name": "波多黎各", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7aa0a712-0d23-4472-86c8-a7f0e37c602e"], "path_name": ["境外", "波多黎各"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7beb607f-77b2-4bc0-b011-381bdc7e267e", "_rev": "1-934f25fcc81c4acd48b4eae94591e981", "type": "region", "code": "UM", "name": "美国本土外小岛屿", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7beb607f-77b2-4bc0-b011-381bdc7e267e"], "path_name": ["境外", "美国本土外小岛屿"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7d388d5d-035f-4bcd-a37d-21e1fbf7fa70", "_rev": "1-f0a1efe471e87f28ce0ca90571971084", "type": "region", "code": "EE", "name": "爱沙尼亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7d388d5d-035f-4bcd-a37d-21e1fbf7fa70"], "path_name": ["境外", "爱沙尼亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7de65b67-3f37-4b1a-bb1a-7f0671089108", "_rev": "1-310b5f42164a04168dfb7fe65fbe7c12", "type": "region", "code": "CA", "name": "加拿大", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7de65b67-3f37-4b1a-bb1a-7f0671089108"], "path_name": ["境外", "加拿大"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "7ea11c0c-2a44-44d7-affb-194d1659d8b2", "_rev": "1-aceb05eda46d281e90eb5abc6473979b", "type": "region", "code": "SD", "name": "苏丹", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "7ea11c0c-2a44-44d7-affb-194d1659d8b2"], "path_name": ["境外", "苏丹"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "813e86d4-9b2e-4426-8d3c-69db8d71114d", "_rev": "1-73ed058ea8a2bae12e6ca7c5d1f0948c", "type": "region", "code": "HM", "name": "赫德岛和麦克唐纳群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "813e86d4-9b2e-4426-8d3c-69db8d71114d"], "path_name": ["境外", "赫德岛和麦克唐纳群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "819733b8-3b07-4f0f-9c3d-8f7ad8d95675", "_rev": "1-ad98d496f8e308d654543e5f4e5d0105", "type": "region", "code": "SE", "name": "瑞典", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "819733b8-3b07-4f0f-9c3d-8f7ad8d95675"], "path_name": ["境外", "瑞典"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "83609372-f49b-40bb-a416-ebcf69027287", "_rev": "1-124bec1637cd33d2ebaeb194dc32701e", "type": "region", "code": "TT", "name": "特立尼达和多巴哥", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "83609372-f49b-40bb-a416-ebcf69027287"], "path_name": ["境外", "特立尼达和多巴哥"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "873c69d7-9a86-44f4-98ee-6bdd472a5cda", "_rev": "1-2b3306434584db28e4b0ca6f027e2a9c", "type": "region", "code": "BJ", "name": "贝宁", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "873c69d7-9a86-44f4-98ee-6bdd472a5cda"], "path_name": ["境外", "贝宁"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "877ded5a-521e-4588-9c4e-6a5197d778f3", "_rev": "1-435fae75798e5272c1f39546efdd8362", "type": "region", "code": "BG", "name": "保加利亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "877ded5a-521e-4588-9c4e-6a5197d778f3"], "path_name": ["境外", "保加利亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "88e4032c-f553-4f0c-9021-fc6338290e7b", "_rev": "1-28cdcca758265fdd884bc874118b446e", "type": "region", "code": "SK", "name": "斯洛伐克", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "88e4032c-f553-4f0c-9021-fc6338290e7b"], "path_name": ["境外", "斯洛伐克"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "89002aa5-d296-4886-baf4-45b662cf9a03", "_rev": "1-ce85a15d6abd1ba2ea7f29465e3620ea", "type": "region", "code": "CI", "name": "科特迪瓦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "89002aa5-d296-4886-baf4-45b662cf9a03"], "path_name": ["境外", "科特迪瓦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "8ac02258-d3d3-4343-a93b-9298db096317", "_rev": "1-1b128d1bb95196bc8d81a02305160295", "type": "region", "code": "PM", "name": "圣皮埃尔和密克隆群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "8ac02258-d3d3-4343-a93b-9298db096317"], "path_name": ["境外", "圣皮埃尔和密克隆群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "8c2c625e-ef93-47b8-b8cb-f454b636f5e5", "_rev": "1-ef516ecc10c5dff9ec2e5849c75bb4fe", "type": "region", "code": "FR", "name": "法国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "8c2c625e-ef93-47b8-b8cb-f454b636f5e5"], "path_name": ["境外", "法国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "8c367977-1f78-49ee-b1d2-5b40247f5e51", "_rev": "1-584eb7f0efca15590c17af6c5335005f", "type": "region", "code": "QA", "name": "卡塔尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "8c367977-1f78-49ee-b1d2-5b40247f5e51"], "path_name": ["境外", "卡塔尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "8c514f3c-3bb2-44a4-be65-93a50fead645", "_rev": "1-60c0370c503b4c15193d2c1773924a35", "type": "region", "code": "YE", "name": "也门", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "8c514f3c-3bb2-44a4-be65-93a50fead645"], "path_name": ["境外", "也门"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "90975742-550f-4021-8285-f9050b1142cf", "_rev": "1-349a4778325fe936cfe21caf37b1022c", "type": "region", "code": "GQ", "name": "赤道几内亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "90975742-550f-4021-8285-f9050b1142cf"], "path_name": ["境外", "赤道几内亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "91aa37e8-c7ee-4acf-a6d0-b9e25453dc2c", "_rev": "1-0f46e5671b24a3fd4f479f3fdea7a6f5", "type": "region", "code": "LA", "name": "老挝", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "91aa37e8-c7ee-4acf-a6d0-b9e25453dc2c"], "path_name": ["境外", "老挝"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "94121961-83bf-42b0-8adf-e43300ca494e", "_rev": "1-b27ca18fa77d209fcda4eee6984aafb7", "type": "region", "code": "SX", "name": "荷属圣马丁", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "94121961-83bf-42b0-8adf-e43300ca494e"], "path_name": ["境外", "荷属圣马丁"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "943d2bf8-d8d6-4426-a490-d54885fa6d65", "_rev": "1-599dd8a4fbb1b5acd6d9d8a5d25f3ba0", "type": "region", "code": "IR", "name": "伊朗", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "943d2bf8-d8d6-4426-a490-d54885fa6d65"], "path_name": ["境外", "伊朗"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9483d47a-ecea-4e05-b58c-cbb4445fbef9", "_rev": "1-a1b9d3eb9a5826193ec16cbe75c6d737", "type": "region", "code": "KW", "name": "科威特", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9483d47a-ecea-4e05-b58c-cbb4445fbef9"], "path_name": ["境外", "科威特"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "94bdeeb0-b68d-4093-bb49-f449d3460946", "_rev": "1-348ac960c734919f30d0effccf059c5b", "type": "region", "code": "GM", "name": "冈比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "94bdeeb0-b68d-4093-bb49-f449d3460946"], "path_name": ["境外", "冈比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "960f6efe-e88b-4211-8e7f-6733b4b9f9eb", "_rev": "1-2e810340aaf9873dc75ffa5f15d51151", "type": "region", "code": "MW", "name": "马拉维", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "960f6efe-e88b-4211-8e7f-6733b4b9f9eb"], "path_name": ["境外", "马拉维"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9737bdc0-fcef-46ea-b2e8-615b3745be5c", "_rev": "1-1af529e74d1f99b94f4864a470d88a04", "type": "region", "code": "MF", "name": "法属圣马丁", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9737bdc0-fcef-46ea-b2e8-615b3745be5c"], "path_name": ["境外", "法属圣马丁"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "98712db0-9cc0-42b7-96b0-62bda2017c94", "_rev": "1-31721bb568042ced3f2e96959762786e", "type": "region", "code": "ST", "name": "圣多美和普林西比", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "98712db0-9cc0-42b7-96b0-62bda2017c94"], "path_name": ["境外", "圣多美和普林西比"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9a1d7481-88b1-4efc-a7fe-a6f8ff082132", "_rev": "1-570cf752f216870fd681d079f9bb4aae", "type": "region", "code": "RS", "name": "塞尔维亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9a1d7481-88b1-4efc-a7fe-a6f8ff082132"], "path_name": ["境外", "塞尔维亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9ada8717-10d9-49a7-bfd0-117036618d64", "_rev": "1-8345133e2719ce85c71b741fc2baab64", "type": "region", "code": "SO", "name": "索马里", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9ada8717-10d9-49a7-bfd0-117036618d64"], "path_name": ["境外", "索马里"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9aee2785-e67a-4eb7-a2c0-f9c0eecf55e4", "_rev": "1-c11a1d18bf58c25cab6f008bfb931ac2", "type": "region", "code": "KR", "name": "韩国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9aee2785-e67a-4eb7-a2c0-f9c0eecf55e4"], "path_name": ["境外", "韩国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9b726261-798d-45e3-be46-660cee8371be", "_rev": "1-d25fc49dec4906d513a457851b789036", "type": "region", "code": "BL", "name": "圣巴泰勒米", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9b726261-798d-45e3-be46-660cee8371be"], "path_name": ["境外", "圣巴泰勒米"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9c33305b-28ad-4db9-bff0-c38c90abdbdb", "_rev": "1-6f80967014aa8b9d9430706b6be17475", "type": "region", "code": "IL", "name": "以色列", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9c33305b-28ad-4db9-bff0-c38c90abdbdb"], "path_name": ["境外", "以色列"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9ce0faf8-d293-46da-96ea-66f819b90c5a", "_rev": "1-0f46a0b87bc5d3402c1494cedb3eec24", "type": "region", "code": "-99", "name": "索马里兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9ce0faf8-d293-46da-96ea-66f819b90c5a"], "path_name": ["境外", "索马里兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9e7d158c-ad4a-4bee-b49d-f2f0e22b9f5c", "_rev": "1-91f8c45f0ef95b771f97088ec309d970", "type": "region", "code": "IQ", "name": "伊拉克", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9e7d158c-ad4a-4bee-b49d-f2f0e22b9f5c"], "path_name": ["境外", "伊拉克"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "9fa2e7e9-1277-4d52-b2ed-ef3370a3a9c3", "_rev": "1-c3534b9609436e1f41ae3387e3c72bb1", "type": "region", "code": "LT", "name": "立陶宛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "9fa2e7e9-1277-4d52-b2ed-ef3370a3a9c3"], "path_name": ["境外", "立陶宛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a09fc184-238f-45f9-a3ef-b86091dd51ec", "_rev": "1-258da63ff1d8988d7cb332df9de4f8b0", "type": "region", "code": "AR", "name": "阿根廷", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a09fc184-238f-45f9-a3ef-b86091dd51ec"], "path_name": ["境外", "阿根廷"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a191318a-bccb-40fa-9ad8-f867f0af6cca", "_rev": "1-706556e8de1de72372ed8e978e070d89", "type": "region", "code": "AO", "name": "安哥拉", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a191318a-bccb-40fa-9ad8-f867f0af6cca"], "path_name": ["境外", "安哥拉"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a2253fb5-4894-40e2-ae56-3c31f986a95d", "_rev": "1-c5b7adc49b338ef1f40697d1df3a803a", "type": "region", "code": "BF", "name": "布基纳法索", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a2253fb5-4894-40e2-ae56-3c31f986a95d"], "path_name": ["境外", "布基纳法索"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a383c939-d7f9-489f-9a93-4b1a1f69902e", "_rev": "1-c31ed96e84e6f379505e4716300ed576", "type": "region", "code": "WF", "name": "瓦利斯和富图纳群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a383c939-d7f9-489f-9a93-4b1a1f69902e"], "path_name": ["境外", "瓦利斯和富图纳群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a4515ced-7ccb-418f-b5e7-f96ba741dab3", "_rev": "1-f081974dae5440e837a4dfd5d333d030", "type": "region", "code": "TO", "name": "汤加", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a4515ced-7ccb-418f-b5e7-f96ba741dab3"], "path_name": ["境外", "汤加"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a469f417-e17b-423a-906b-2e62135bf45d", "_rev": "1-cfc9e5f86332f312e2bbd03c15006b3c", "type": "region", "code": "TJ", "name": "塔吉克斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a469f417-e17b-423a-906b-2e62135bf45d"], "path_name": ["境外", "塔吉克斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a4d761c2-a4e3-4d40-a209-4f0179bf6d94", "_rev": "1-c6c1ecdeac6b2f63d355e6cc84bcbaf9", "type": "region", "code": "BW", "name": "博茨瓦纳", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a4d761c2-a4e3-4d40-a209-4f0179bf6d94"], "path_name": ["境外", "博茨瓦纳"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a71b1e24-0f34-4c90-8978-054456e9187a", "_rev": "1-f440d10071697e5f451bfca1c75856d3", "type": "region", "code": "SH", "name": "圣赫勒拿", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "a71b1e24-0f34-4c90-8978-054456e9187a"], "path_name": ["境外", "圣赫勒拿"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "_rev": "2-e5f4388988fcd6433d9c034b66252036", "type": "region", "code": "world", "name": "境外", "parent_id": null, "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d"], "path_name": ["境外"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "ac7311e0-3647-4162-9101-ea0ae4ce63bf", "_rev": "1-8768c94f4dbfbb5b80cb71e4c7fdb36a", "type": "region", "code": "MS", "name": "蒙特塞拉特", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "ac7311e0-3647-4162-9101-ea0ae4ce63bf"], "path_name": ["境外", "蒙特塞拉特"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "ad4586a2-8ae7-468e-8be8-102456234130", "_rev": "1-1372af78083079d56714ca8a4beea0ed", "type": "region", "code": "FM", "name": "密克罗尼西亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "ad4586a2-8ae7-468e-8be8-102456234130"], "path_name": ["境外", "密克罗尼西亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "aed2d539-a4a5-451a-bbda-a7dec97e8dea", "_rev": "1-f2d8c772ac51d426bf46859da337510e", "type": "region", "code": "GT", "name": "危地马拉", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "aed2d539-a4a5-451a-bbda-a7dec97e8dea"], "path_name": ["境外", "危地马拉"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "af402e19-6115-4fa5-b99e-2d6e0e0e5cc9", "_rev": "1-5adb6aba6c5df06dbe05b0032e4abde6", "type": "region", "code": "EG", "name": "埃及", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "af402e19-6115-4fa5-b99e-2d6e0e0e5cc9"], "path_name": ["境外", "埃及"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "aff91f68-679c-42a4-a9bb-6ccfc6329c90", "_rev": "1-960ec7854baf8b911ce40bb56036a52a", "type": "region", "code": "ML", "name": "马里", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "aff91f68-679c-42a4-a9bb-6ccfc6329c90"], "path_name": ["境外", "马里"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b04797f3-4fa9-44f1-ae69-623ce3fd6cff", "_rev": "1-6475fa6f2941003a5c7edfa55a8461f2", "type": "region", "code": "PK", "name": "巴基斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b04797f3-4fa9-44f1-ae69-623ce3fd6cff"], "path_name": ["境外", "巴基斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b0d43c7d-e607-442c-9eeb-0f9d5e9d7326", "_rev": "1-a2eb13ddf1b3892c4c1c0a02e4f51dd7", "type": "region", "code": "JO", "name": "约旦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b0d43c7d-e607-442c-9eeb-0f9d5e9d7326"], "path_name": ["境外", "约旦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b1510f0d-a73d-4135-904e-fc539dc088c9", "_rev": "1-ad0f77fd45cf8e0c0a10dcd3b1c32977", "type": "region", "code": "FO", "name": "法罗群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b1510f0d-a73d-4135-904e-fc539dc088c9"], "path_name": ["境外", "法罗群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b240c036-ab35-4ee1-af00-eeec0c56eace", "_rev": "1-29b01e1c0e0f55c116f99b574085c387", "type": "region", "code": "VA", "name": "梵蒂冈", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b240c036-ab35-4ee1-af00-eeec0c56eace"], "path_name": ["境外", "梵蒂冈"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b29ff487-82a2-4e42-a3d2-da679b901435", "_rev": "1-3c68ffe9c7d15b73f963339c744271b4", "type": "region", "code": "CZ", "name": "捷克", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b29ff487-82a2-4e42-a3d2-da679b901435"], "path_name": ["境外", "捷克"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b338cf09-4849-4ef9-bbf6-eaa9568a595c", "_rev": "1-cc320e20b668f0088b07f38d3d9a8a25", "type": "region", "code": "LR", "name": "利比里亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b338cf09-4849-4ef9-bbf6-eaa9568a595c"], "path_name": ["境外", "利比里亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "b3535343-d0b8-4504-8396-a425f735f9b9", "_rev": "1-96ac942bf3f76e2548084b6d14f19ac0", "type": "region", "code": "NF", "name": "诺福克岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "b3535343-d0b8-4504-8396-a425f735f9b9"], "path_name": ["境外", "诺福克岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "bc490d97-2390-4510-a2ac-270dc8578ce3", "_rev": "1-60f3abb59cebd2668196a4f626b19d15", "type": "region", "code": "MZ", "name": "莫桑比克", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "bc490d97-2390-4510-a2ac-270dc8578ce3"], "path_name": ["境外", "莫桑比克"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "bd8007ba-e378-4480-88b7-51c41bdc6b3b", "_rev": "1-c8d85f0497b8c0578b90a9cf780d4637", "type": "region", "code": "ES", "name": "西班牙", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "bd8007ba-e378-4480-88b7-51c41bdc6b3b"], "path_name": ["境外", "西班牙"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "be092f1c-08d7-4bd1-bcfb-7a0bf79dbac1", "_rev": "1-35832233646e18ef49ecda1d0aa86154", "type": "region", "code": "GU", "name": "关岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "be092f1c-08d7-4bd1-bcfb-7a0bf79dbac1"], "path_name": ["境外", "关岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "bec41c0e-c5d7-4ddb-8221-66ce4b9d268f", "_rev": "1-4ddc5ceb1bf26b64302b3c9d669209df", "type": "region", "code": "BM", "name": "百慕大", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "bec41c0e-c5d7-4ddb-8221-66ce4b9d268f"], "path_name": ["境外", "百慕大"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "bf9052b2-f3b7-4cfe-9d74-8b60c879d137", "_rev": "1-5fafe38bbc2f35f21a3f71a920cf5e20", "type": "region", "code": "BA", "name": "波黑", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "bf9052b2-f3b7-4cfe-9d74-8b60c879d137"], "path_name": ["境外", "波黑"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "bfdb62d1-4426-4bdc-8060-4283a425d887", "_rev": "1-9018952f6287a01881b955a4ed239a1e", "type": "region", "code": "MG", "name": "马达加斯加", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "bfdb62d1-4426-4bdc-8060-4283a425d887"], "path_name": ["境外", "马达加斯加"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c0bf6f4b-acde-4c9d-8468-9e3af8b3f7ad", "_rev": "1-9baee9890c7376d1e3aed5a8baf66032", "type": "region", "code": "MM", "name": "缅甸", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c0bf6f4b-acde-4c9d-8468-9e3af8b3f7ad"], "path_name": ["境外", "缅甸"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c18aee31-6275-47aa-854c-8e0fa1ddb9f8", "_rev": "1-ce7ebc52adf32bd3a661682876b2ff31", "type": "region", "code": "BY", "name": "白俄罗斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c18aee31-6275-47aa-854c-8e0fa1ddb9f8"], "path_name": ["境外", "白俄罗斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c1e8b7bf-371c-497b-a792-aeb8c3f3015f", "_rev": "1-a82a1ab7f88dc26a01cd184aa6b0a295", "type": "region", "code": "DE", "name": "德国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c1e8b7bf-371c-497b-a792-aeb8c3f3015f"], "path_name": ["境外", "德国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c22e20bb-9cec-4c56-9a3c-72c9a7f70648", "_rev": "1-7ce1af7c606579fd4a6b2ac496e6818c", "type": "region", "code": "CV", "name": "佛得角", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c22e20bb-9cec-4c56-9a3c-72c9a7f70648"], "path_name": ["境外", "佛得角"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c27fcb17-c2fc-4b01-a7a6-617dc7f9acd8", "_rev": "1-c770e759255dd18ae8d168cf44d968c9", "type": "region", "code": "KN", "name": "圣基茨和尼维斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c27fcb17-c2fc-4b01-a7a6-617dc7f9acd8"], "path_name": ["境外", "圣基茨和尼维斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c4d20c42-0d44-4f9c-9c81-dd46085e84e0", "_rev": "1-b9180a8b7438de0df8ef35031137e4c8", "type": "region", "code": "KM", "name": "科摩罗", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c4d20c42-0d44-4f9c-9c81-dd46085e84e0"], "path_name": ["境外", "科摩罗"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c515c107-47af-45c5-84c8-4d27ce149986", "_rev": "1-633efd6b58c952d9a8427f991d3d0e4a", "type": "region", "code": "ID", "name": "印度尼西亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c515c107-47af-45c5-84c8-4d27ce149986"], "path_name": ["境外", "印度尼西亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "c801bc6c-4f48-495a-ad2e-cb3c0181311d", "_rev": "1-ef3619694612376620092705ffcb404d", "type": "region", "code": "SN", "name": "塞内加尔", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "c801bc6c-4f48-495a-ad2e-cb3c0181311d"], "path_name": ["境外", "塞内加尔"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "cbf7199c-e119-4eee-8304-b4df0ab78319", "_rev": "1-ced2dd1edcf8e7503b5205653a7fcd4d", "type": "region", "code": "SS", "name": "南苏丹", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "cbf7199c-e119-4eee-8304-b4df0ab78319"], "path_name": ["境外", "南苏丹"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "cc999c76-7319-461a-a843-5fc29bf3e7d4", "_rev": "1-040b267e088e3da64170f06ee46f678f", "type": "region", "code": "LK", "name": "斯里兰卡", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "cc999c76-7319-461a-a843-5fc29bf3e7d4"], "path_name": ["境外", "斯里兰卡"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "cd017481-aaa7-4a1b-829c-a3233936b18a", "_rev": "1-bb4e10168c7def08b34a0d723a6b8fd3", "type": "region", "code": "UZ", "name": "乌兹别克斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "cd017481-aaa7-4a1b-829c-a3233936b18a"], "path_name": ["境外", "乌兹别克斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "cf454e1d-51f0-4803-a067-0c7b54ccff60", "_rev": "1-487126608d42fb760d74f6f2be4fb3e6", "type": "region", "code": "BO", "name": "玻利维亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "cf454e1d-51f0-4803-a067-0c7b54ccff60"], "path_name": ["境外", "玻利维亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d03ae266-051b-4348-80ab-2d68b415d901", "_rev": "1-9a6a642f23be4dcd43e444facb7c047f", "type": "region", "code": "LV", "name": "拉脱维亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d03ae266-051b-4348-80ab-2d68b415d901"], "path_name": ["境外", "拉脱维亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d188e085-73c9-43c0-bf52-88384d2ff0a3", "_rev": "1-d384ca4e46e90c071f76e9b53d3b7b93", "type": "region", "code": "AZ", "name": "阿塞拜疆", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d188e085-73c9-43c0-bf52-88384d2ff0a3"], "path_name": ["境外", "阿塞拜疆"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d2fff824-ce51-441e-bc31-705a13683a87", "_rev": "1-5b856457734fe25e1fd9754b212cec8c", "type": "region", "code": "SY", "name": "叙利亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d2fff824-ce51-441e-bc31-705a13683a87"], "path_name": ["境外", "叙利亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d5453622-1d26-4416-9c6a-6cceb4f0571c", "_rev": "1-6310d9d9f07e02e739cd345212fec06d", "type": "region", "code": "HN", "name": "洪都拉斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d5453622-1d26-4416-9c6a-6cceb4f0571c"], "path_name": ["境外", "洪都拉斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d5796960-e8c6-4d07-8229-dd1ce56336f7", "_rev": "1-051ff4ed1ab49061106dfd2bde0568a6", "type": "region", "code": "NO", "name": "挪威", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d5796960-e8c6-4d07-8229-dd1ce56336f7"], "path_name": ["境外", "挪威"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d6773f2f-7dfa-4ea9-825d-4f3f071e39a9", "_rev": "1-4da3baadc4cef7d77f1aedf41bca2742", "type": "region", "code": "DJ", "name": "吉布提", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d6773f2f-7dfa-4ea9-825d-4f3f071e39a9"], "path_name": ["境外", "吉布提"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d6fae156-7a64-4bf5-b68e-6301d8d4698f", "_rev": "1-fe7b6107e4eee97f9b2209c1e7314d01", "type": "region", "code": "IE", "name": "爱尔兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d6fae156-7a64-4bf5-b68e-6301d8d4698f"], "path_name": ["境外", "爱尔兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d6fe7849-112c-44b9-9cc4-3add68a6609a", "_rev": "1-06791b82d810c3fdde524bcda974283d", "type": "region", "code": "TV", "name": "图瓦卢", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d6fe7849-112c-44b9-9cc4-3add68a6609a"], "path_name": ["境外", "图瓦卢"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d7aac7e4-057c-48cc-b28a-3ecb9dfb0c5a", "_rev": "1-b5cf2759e7a9b4701cc87a2b7c117372", "type": "region", "code": "BN", "name": "文莱", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d7aac7e4-057c-48cc-b28a-3ecb9dfb0c5a"], "path_name": ["境外", "文莱"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d8caee12-312d-4689-b020-fc0ebaed0964", "_rev": "1-f4fe3e6a2a2e174f8537f8184e14854d", "type": "region", "code": "AT", "name": "奥地利", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d8caee12-312d-4689-b020-fc0ebaed0964"], "path_name": ["境外", "奥地利"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "d906fcb5-c355-4a72-b9ae-f3a2bf7eb994", "_rev": "1-7082446d5387cd9500be07d0c6147a41", "type": "region", "code": "LB", "name": "黎巴嫩", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "d906fcb5-c355-4a72-b9ae-f3a2bf7eb994"], "path_name": ["境外", "黎巴嫩"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "da1917d7-0da5-4e93-8baf-96ee010743f2", "_rev": "1-efdcfedb37a5efac9b10329921643cb0", "type": "region", "code": "GN", "name": "几内亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "da1917d7-0da5-4e93-8baf-96ee010743f2"], "path_name": ["境外", "几内亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "daa4aa8b-45d0-4144-a664-81abfa8bc881", "_rev": "1-834bf4762a3e9721838717a04e378921", "type": "region", "code": "AU", "name": "澳大利亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "daa4aa8b-45d0-4144-a664-81abfa8bc881"], "path_name": ["境外", "澳大利亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "dabb7fb8-3899-4ec1-b916-43bee0068ff8", "_rev": "1-24f5434b82e5c3779276ca86d8dddfee", "type": "region", "code": "NU", "name": "纽埃", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "dabb7fb8-3899-4ec1-b916-43bee0068ff8"], "path_name": ["境外", "纽埃"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "dae002dd-6101-48c5-96a9-0d1ef42521f4", "_rev": "1-23beea85e4d1390621f278073fb7ccc5", "type": "region", "code": "ZA", "name": "南非", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "dae002dd-6101-48c5-96a9-0d1ef42521f4"], "path_name": ["境外", "南非"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "dec7d57c-f54a-407c-9320-b76054950829", "_rev": "1-b475b8d0451ab244be313d615bf196b1", "type": "region", "code": "GL", "name": "格陵兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "dec7d57c-f54a-407c-9320-b76054950829"], "path_name": ["境外", "格陵兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e2301b86-e4ae-409f-91f1-a712328715c3", "_rev": "1-2542bb674f72ce97d6e8079578096646", "type": "region", "code": "LS", "name": "莱索托", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e2301b86-e4ae-409f-91f1-a712328715c3"], "path_name": ["境外", "莱索托"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e2456c2e-3890-4ef7-b36a-e30639a8f08b", "_rev": "1-e0667724e19e77610b5391b1926dc9e7", "type": "region", "code": "GW", "name": "几内亚比绍", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e2456c2e-3890-4ef7-b36a-e30639a8f08b"], "path_name": ["境外", "几内亚比绍"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e4056ea8-0cfe-4cd9-9f7d-4810970d5d4a", "_rev": "1-068dcdae9a3073d4db497310e04faf61", "type": "region", "code": "ZM", "name": "赞比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e4056ea8-0cfe-4cd9-9f7d-4810970d5d4a"], "path_name": ["境外", "赞比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e475a51b-a086-46ef-99cf-654a897e1b49", "_rev": "1-f10e53f202ffe6e29bc759fef46bb341", "type": "region", "code": "PE", "name": "秘鲁", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e475a51b-a086-46ef-99cf-654a897e1b49"], "path_name": ["境外", "秘鲁"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e4ac74cd-f757-411a-9217-186c683ad3ca", "_rev": "1-c848ca8fffe7138cd5be50c2c5db40dc", "type": "region", "code": "TD", "name": "乍得", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e4ac74cd-f757-411a-9217-186c683ad3ca"], "path_name": ["境外", "乍得"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e4e59cad-39ad-4249-8be9-08c17997c924", "_rev": "1-14b6d1246731b99a374df9527d099a88", "type": "region", "code": "VN", "name": "越南", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e4e59cad-39ad-4249-8be9-08c17997c924"], "path_name": ["境外", "越南"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e64712b2-f65a-4d5e-88b7-7acd4c1170f1", "_rev": "1-358e3c809808cc52d561b256f62c41a4", "type": "region", "code": "KZ", "name": "哈萨克斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e64712b2-f65a-4d5e-88b7-7acd4c1170f1"], "path_name": ["境外", "哈萨克斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e66a8315-b351-47cc-9579-b73db9b5967c", "_rev": "1-c6b004e4d6750e7d53131449d358824d", "type": "region", "code": "GS", "name": "南乔治亚和南桑威奇群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e66a8315-b351-47cc-9579-b73db9b5967c"], "path_name": ["境外", "南乔治亚和南桑威奇群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e7a180b7-1b62-4007-8fde-32910f12c0bb", "_rev": "1-384363e15382f64dd093173a1b64e289", "type": "region", "code": "AI", "name": "安圭拉", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e7a180b7-1b62-4007-8fde-32910f12c0bb"], "path_name": ["境外", "安圭拉"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e96af490-0814-4776-8132-395f88ab0fa6", "_rev": "1-a1a579813aafe898a29bf7db752c5e6e", "type": "region", "code": "VI", "name": "美属维尔京群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e96af490-0814-4776-8132-395f88ab0fa6"], "path_name": ["境外", "美属维尔京群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e98e4ec1-7ddf-4cb0-9c99-0bd04e7c7dbe", "_rev": "1-000fcf1d4a7fbdf3d9749a510f7dd1b0", "type": "region", "code": "US", "name": "美国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e98e4ec1-7ddf-4cb0-9c99-0bd04e7c7dbe"], "path_name": ["境外", "美国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "e9cc1204-ef4f-49aa-9e8d-2ab4fc4ae3b5", "_rev": "1-970818aca0bcd91c1d03cf4c6afbfb76", "type": "region", "code": "TG", "name": "多哥", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "e9cc1204-ef4f-49aa-9e8d-2ab4fc4ae3b5"], "path_name": ["境外", "多哥"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "eb58cc10-c185-4e5a-bbda-531b54d1d89c", "_rev": "1-765db06c459199a470fe68662753ce54", "type": "region", "code": "MT", "name": "马耳他", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "eb58cc10-c185-4e5a-bbda-531b54d1d89c"], "path_name": ["境外", "马耳他"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "eb89adde-655b-46da-9e5e-0a3bf1e544e4", "_rev": "1-2127ca21ecf13c1ad5cb0cb5c857f56a", "type": "region", "code": "AU", "name": "阿什莫尔和卡捷群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "eb89adde-655b-46da-9e5e-0a3bf1e544e4"], "path_name": ["境外", "阿什莫尔和卡捷群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f1c7a336-3e83-494d-860c-fca27dd11a8e", "_rev": "1-8a1b6c0ee360e68bc9ffc4c3bdeed42e", "type": "region", "code": "SV", "name": "萨尔瓦多", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f1c7a336-3e83-494d-860c-fca27dd11a8e"], "path_name": ["境外", "萨尔瓦多"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f2d2479b-8524-484c-854d-930e2a748cd2", "_rev": "1-37d81bf1a3d55ecfced39242b9100f94", "type": "region", "code": "VE", "name": "委内瑞拉", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f2d2479b-8524-484c-854d-930e2a748cd2"], "path_name": ["境外", "委内瑞拉"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f332b6f2-d3a9-4569-9655-dbda9a09e5a3", "_rev": "1-12d334cf74933f0d82f8dbbe095b0194", "type": "region", "code": "PL", "name": "波兰", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f332b6f2-d3a9-4569-9655-dbda9a09e5a3"], "path_name": ["境外", "波兰"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f5295fc6-d1d8-4130-8b64-1f9ad79da5c1", "_rev": "1-16d5af2c21d9343f8d76663d4278698c", "type": "region", "code": "GY", "name": "圭亚那", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f5295fc6-d1d8-4130-8b64-1f9ad79da5c1"], "path_name": ["境外", "圭亚那"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f66694e9-e77b-4f5b-bbe2-2d3db34b0466", "_rev": "1-ce4436bb22eb683e7136aa347666fa9d", "type": "region", "code": "CL", "name": "智利", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f66694e9-e77b-4f5b-bbe2-2d3db34b0466"], "path_name": ["境外", "智利"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f76275f2-c483-4a40-be10-8ebbb0457cb7", "_rev": "1-b94434f869b08ed59f34d14779e85bbc", "type": "region", "code": "SB", "name": "所罗门群岛", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f76275f2-c483-4a40-be10-8ebbb0457cb7"], "path_name": ["境外", "所罗门群岛"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f7af3da4-89b2-469a-a96b-14537bfd7c3b", "_rev": "1-8cb84119c93ce64cabc07e9d978db8fe", "type": "region", "code": "AE", "name": "阿联酋", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f7af3da4-89b2-469a-a96b-14537bfd7c3b"], "path_name": ["境外", "阿联酋"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f7bb5ab7-99f8-497a-9a1e-e230c4892395", "_rev": "1-da9e74e454aebaea4529adbf1803db6f", "type": "region", "code": "BD", "name": "孟加拉国", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f7bb5ab7-99f8-497a-9a1e-e230c4892395"], "path_name": ["境外", "孟加拉国"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f7fb2131-02ce-4219-b191-7300f3515936", "_rev": "1-f9d58654e0ac23efa371ee4f000a3f99", "type": "region", "code": "KG", "name": "吉尔吉斯斯坦", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f7fb2131-02ce-4219-b191-7300f3515936"], "path_name": ["境外", "吉尔吉斯斯坦"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "f8116c7d-1617-4368-9f73-52cc57e340bf", "_rev": "1-ea14f2dd20bf0ecee4c6f3e7c3de67c9", "type": "region", "code": "CU", "name": "古巴", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "f8116c7d-1617-4368-9f73-52cc57e340bf"], "path_name": ["境外", "古巴"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fad575ee-0577-44ce-be01-d142b20c533c", "_rev": "1-3799768426771d385153579755c9263d", "type": "region", "code": "PG", "name": "巴布亚新几内亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fad575ee-0577-44ce-be01-d142b20c533c"], "path_name": ["境外", "巴布亚新几内亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fc9a44b9-aced-4401-9210-639da83ce8b0", "_rev": "1-22dfede8391710cbe0d1fa0eab3856ab", "type": "region", "code": "TN", "name": "突尼斯", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fc9a44b9-aced-4401-9210-639da83ce8b0"], "path_name": ["境外", "突尼斯"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fd61193f-ca8f-4934-98f0-71dff13ec3a9", "_rev": "1-be29bcea8e46766852e321c41dbccbe4", "type": "region", "code": "UG", "name": "乌干达", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fd61193f-ca8f-4934-98f0-71dff13ec3a9"], "path_name": ["境外", "乌干达"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fdad8e9f-2bb7-4f78-b459-a2c028d902e6", "_rev": "1-e6246969107e77a8a4b12a86ecf8a288", "type": "region", "code": "LY", "name": "利比亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fdad8e9f-2bb7-4f78-b459-a2c028d902e6"], "path_name": ["境外", "利比亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fdf8def2-52a9-470a-8b06-4c88d7345b42", "_rev": "1-7c9023fedddaeb11b4e6e002e22ab73d", "type": "region", "code": "CR", "name": "哥斯达黎加", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fdf8def2-52a9-470a-8b06-4c88d7345b42"], "path_name": ["境外", "哥斯达黎加"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} +{"_id": "fedf14d5-c525-4390-adbf-1f84a6e7aa97", "_rev": "1-6812c8151d96f6fd8ec27c6e6dbef011", "type": "region", "code": "AS", "name": "美属萨摩亚", "parent_id": "a77ff778-cf3c-487b-a76e-5524f5e6be0d", "region_type": "country", "path": ["a77ff778-cf3c-487b-a76e-5524f5e6be0d", "fedf14d5-c525-4390-adbf-1f84a6e7aa97"], "path_name": ["境外", "美属萨摩亚"], "status": "active", "sort": 1, "created_by": "system", "created_by_name": "system", "created_at": "2025-09-25 21:25:12", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 21:25:12"} diff --git a/filtered_datasource/datasource/filtered/supplier_1.jsonl b/filtered_datasource/datasource/filtered/supplier_1.jsonl new file mode 100644 index 0000000..aa50648 --- /dev/null +++ b/filtered_datasource/datasource/filtered/supplier_1.jsonl @@ -0,0 +1,28 @@ +{"_id": "0798431d-115a-4b1c-b95a-78470160fa9e", "_rev": "3-18cce2b2f9854c79aeb4329c31e6028c", "type": "supplier", "name": "沈阳中变电气有限责任公司", "short_name": "沈阳中变电气有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91210100564677033W", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "210000", "210100"]} +{"_id": "1098875c-e949-47b1-9f40-237eb507f890", "_rev": "3-0ef325ac17b9232224f5c9f924e2cf6f", "type": "supplier", "name": "中国水利水电第九工程局有限公司", "short_name": "中国水利水电第九工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91520000214428387H", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "1115a7f3-b2c1-4bfb-8c89-605250c402dd", "_rev": "3-6e0a5e272f35cd473d6cd82a1ad6cfa3", "type": "supplier", "name": "中国安能集团第三工程局有限公司", "short_name": "中国安能集团第三工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915101006331302278", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "_rev": "3-2857c4610fd9e9a9b8313dee83454969", "type": "supplier", "name": "中国葛洲坝集团三峡建设工程有限公司", "short_name": "中国葛洲坝集团三峡建设工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "420000", "city": "420500", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91420000615573462P", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "420000", "420500"]} +{"_id": "4be9e1da-9ebf-4a2a-b6bd-14a41ac31858", "_rev": "5-b54a288a89b9e55cee26d42b08bb69a0", "type": "supplier", "name": "中国水利水电第七工程局有限公司", "short_name": "中国水利水电第七工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000201827469M", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "357c7eaf-5a33-4999-be94-79c42bfbd955", "_rev": "3-35879fa40a8fbe379f03c7a4fa8696ad", "type": "supplier", "name": "广州擎天实业有限公司", "short_name": "广州擎天实业有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "440300", "city": "440100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91440101231240749H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "440000", "440100"]} +{"_id": "2ca09c22-68b4-4e43-b9fa-619dcda5f325", "_rev": "3-ac12e05cedcda85821240a9066aa91ef", "type": "supplier", "name": "江苏苏博特新材料股份有限公司", "short_name": "江苏苏博特新材料股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91320000768299302G", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "31b6b6d7-989b-4abe-a7e1-6d518f3a4020", "_rev": "3-bedf089583a4645867c7036dba8e7a9e", "type": "supplier", "name": "中国水利水电第十工程局有限公司", "short_name": "中国水利水电第十工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9151018120276341XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "34db820f-860c-4c6e-9326-5c7cb385bf50", "_rev": "3-e475374124da6df3a40f38043efb7237", "type": "supplier", "name": "特变电工中发上海高压开关有限公司", "short_name": "特变电工中发上海高压开关有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "310000", "city": "310000", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9131012078784664XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "310000", "310000"]} +{"_id": "4b069ce4-3687-4263-a1f2-4735c22c3f8e", "_rev": "3-9cccdfa9f992ae4f0ec07068c479487c", "type": "supplier", "name": "四川二滩国际工程咨询有限责任公司", "short_name": "四川二滩国际工程咨询有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510115201873799G", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "2e465bd8-b240-4046-bf00-187d22823f7b", "_rev": "3-2629f9e1646b7e398fd8bb41a7fc47a2", "type": "supplier", "name": "哈尔滨电机厂有限责任公司", "short_name": "哈尔滨电机厂有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "230000", "city": "230100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "912301991270479655", "created_at": "2025-09-26 17:00:05", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "230000", "230100"]} +{"_id": "3ab47229-6da8-4efb-aa44-b96866a2ce13", "_rev": "3-998c447f59be1475e690d1416384fb64", "type": "supplier", "name": "四川蜀府贸易有限公司", "short_name": "四川蜀府贸易有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100005632853965", "created_at": "2025-09-26 17:00:10", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "48a5f1a7-5d5e-41cf-8676-042f1d5316f1", "_rev": "2-d43e58afff0c5317401a22d075866c56", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:32:41", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "czyy", "company_type": "other", "name": "常州液压成套设备厂有限公司", "short_name": "常州液压", "parent_id": null, "path": [], "path_name": [], "province": "320000", "city": "320400", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91320412250851852D", "country": "100000", "region_path": ["100000", "320000", "320400"]} +{"_id": "67fa779d-2ce9-468f-b94f-a3d29f1f22c9", "_rev": "3-2c6e66d316216cfc460662bf4a40e612", "type": "supplier", "name": "杭州华新机电工程有限公司", "short_name": "杭州华新机电工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "330000", "city": "330100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913301087227885306", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "330000", "330100"]} +{"_id": "594a09af-8944-476d-b098-7aebe96ad4e8", "_rev": "3-fc6edc3d3384c95def0be02ee734a5b2", "type": "supplier", "name": "云南水电十四局东华建筑工程有限公司", "short_name": "云南水电十四局东华建筑工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530000713408946K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "6db1ed5b-f52a-4142-867c-d8b2731ead71", "_rev": "3-f769878777781eb98071dddc7c7c4968", "type": "supplier", "name": "中国水利水电第十四工程局有限公司", "short_name": "中国水利水电第十四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530100216579074C", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "538e01cd-85cb-42b3-b313-16977f7a5224", "_rev": "3-d9acfbf91ba6d83dc33c94b84127f2e3", "type": "supplier", "name": "中国水利水电第五工程局有限公司", "short_name": "中国水利水电第五工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000205804264E", "created_at": "2025-09-26 17:00:12", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "97be34dc-0a17-4ce5-baea-0f3ceee61103", "_rev": "4-4fbf33c81fff4a4a93ba8da7f99b786d", "type": "supplier", "name": "国电南京自动化股份有限公司", "short_name": "国电南京自动化股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913201007162522468", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "77316fb4-6167-432b-94e5-89c3d8a6b900", "_rev": "3-2112fbd151033d97a2c90123a02c70a3", "type": "supplier", "name": "中国水利水电夹江水工机械有限公司", "short_name": "中国水利水电夹江水工机械有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511126207500117U", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "936c6316-8d87-4681-a3b5-b90ed4804a06", "_rev": "3-a9a9b85f9cdd45dc3646e66c9a1a41aa", "type": "supplier", "name": "中国电建集团成都勘测设计研究院有限公司", "short_name": "中国电建集团成都勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100004507513971", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "98892419-6a71-4d7e-a0ac-ad5a0a15f1d6", "_rev": "3-f5bb2f9abe284037054df3b323f2482f", "type": "supplier", "name": "中国电建集团贵阳勘测设计研究院有限公司", "short_name": "中国电建集团贵阳勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9152000070966703X2", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "9c80aace-ba73-4550-8fef-3080b51027d9", "_rev": "3-0dddd7f05fccce78e17fdf4ae9975f0a", "type": "supplier", "name": "中国水利水电第四工程局有限公司", "short_name": "中国水利水电第四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "630000", "city": "630100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9163000022658124XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "630000", "630100"]} +{"_id": "930dfaf9-708e-4ec0-95f4-521b10bf1c00", "_rev": "2-5c464399a48505836497072601a60159", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:33:18", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "hnwz", "company_type": "other", "name": "某公司海南物资有限公司", "short_name": "海南物资", "parent_id": null, "path": [], "path_name": [], "province": "460000", "city": "460100", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91469007MA5TW", "country": "100000", "region_path": ["100000", "460000", "460100"]} +{"_id": "ab5ab605-f27a-461b-9a88-73d1eafde5ed", "_rev": "3-a463c974fbcb84a524d1ee6ed72e64ec", "type": "supplier", "name": "东方电气集团东方电机有限公司", "short_name": "东方电气集团东方电机有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510600", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510600671415848H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "510600"]} +{"_id": "b4656ed6-5329-4673-93c8-d11e15d6ece5", "_rev": "3-0a11b989849efb63378b8a8fddb989e4", "type": "supplier", "name": "中国水利水电建设工程咨询西北有限公司", "short_name": "中国水利水电建设工程咨询西北有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610000220530812K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "e0ceec90-0ad7-417f-a669-fd4f5db07eff", "_rev": "4-71df8660a58c5628bb55f2d39a9264fb", "type": "supplier", "name": "西安西电变压器有限责任公司", "short_name": "西安西电变压器有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610104220601553B", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "cd9e9224-a08f-4bed-81a6-b289b74506e8", "_rev": "3-572570411c03424fb3370e74b2f7f496", "type": "supplier", "name": "乐山一拉得电网自动化有限公司", "short_name": "乐山一拉得电网自动化有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511100MA6281NC0N", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "_rev": "3-269fcaf6630593cb44ee3e6a1ffd4ef9", "type": "supplier", "name": "中国水利水电第六工程局有限公司", "short_name": "中国水利水电第六工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9121011211756300XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "210000", "210100"]} diff --git a/filtered_datasource/datasource/filtered/units_1.jsonl b/filtered_datasource/datasource/filtered/units_1.jsonl new file mode 100644 index 0000000..c01da2b --- /dev/null +++ b/filtered_datasource/datasource/filtered/units_1.jsonl @@ -0,0 +1,12 @@ +{"_id": "142941ac-d308-4bbf-a018-33541c29b360", "_rev": "2-1a05c2005f7ee7991a273ed2d1862de8", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 20.0, "plan_production_date": "2026-12-31", "actual_production_date": null, "serial_number": 6} +{"_id": "22a3ed8d-6ab4-4e03-83c7-0e8d5a4f54ab", "_rev": "3-9dc5bcb654f0769e93a138efd4d8d088", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 51, "plan_production_date": "2026-10-31", "actual_production_date": null, "serial_number": 2} +{"_id": "3855f7df-3f6e-42cb-8ce5-d565b213c67c", "_rev": "5-2e4f28a89a06ff33c9b2ee6720d8d26f", "field_metadata": null, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": "2025-12-29 14:40:32", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 51, "plan_production_date": "2025-12-31", "actual_production_date": "2025-12-28", "serial_number": 3} +{"_id": "858e91ef-14b7-446d-9c60-906387add673", "_rev": "3-ede7292def387a5851bb2643c3e71f6b", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 51, "plan_production_date": "2026-08-31", "actual_production_date": null, "serial_number": 1} +{"_id": "a7cfff2e-cf35-4199-a0db-e1fd14c583ea", "_rev": "3-d944e815d4786b365cef0e81bfb6b0ff", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 20, "plan_production_date": "2026-06-30", "actual_production_date": null, "serial_number": 5} +{"_id": "f2a8c85c-e004-4228-92a0-acc90c24c405", "_rev": "5-03d079e59eddafe6484073c789427e62", "field_metadata": null, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": "2025-12-29 14:40:28", "created_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "created_by_name": "杜晓凡", "created_at": "2025-11-07 12:39:48", "updated_by": "228fd0a5-9cbb-4a2d-bafa-78e892dd13de", "updated_by_name": "杜晓凡", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", "capacity": 51, "plan_production_date": "2025-12-31", "actual_production_date": "2025-12-27", "serial_number": 4} +{"_id": "05bdc3b1-f455-4182-a50f-39ddfb3f5a69", "_rev": "5-18956223e99169a529aed64e740cbce2", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": "2025-11-21 15:19:32", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 4.3, "plan_production_date": "2028-12-31", "actual_production_date": null, "serial_number": 1} +{"_id": "82f77395-fcce-4588-bf80-02f245dd4d2c", "_rev": "2-9abd0819e349b5dea12c1fe46471bddf", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 4.3, "plan_production_date": "2028-12-31", "actual_production_date": null, "serial_number": 2} +{"_id": "a1553e0b-84f4-4c67-8f8a-acabd0bef652", "_rev": "2-5ec3a56c4939acb3cf164c71e9c20142", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 18.5, "plan_production_date": "2030-01-31", "actual_production_date": null, "serial_number": 3} +{"_id": "ade9b160-95d9-4304-a25e-b6a68416c809", "_rev": "2-074fd643919358315ffc5902d1b6af2c", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 18.5, "plan_production_date": "2030-05-31", "actual_production_date": null, "serial_number": 5} +{"_id": "e249e37c-5482-4967-8c80-dda9e141abee", "_rev": "2-d290135b54465071145eb64c4fc5eb27", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 18.5, "plan_production_date": "2030-05-31", "actual_production_date": null, "serial_number": 6} +{"_id": "f4b21193-0744-467f-8726-18956515047e", "_rev": "2-5cba3739980d5849b3c324ebbc0190c9", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 15:43:32", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-17 10:22:29", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 18.5, "plan_production_date": "2030-01-31", "actual_production_date": null, "serial_number": 4} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..fb00a81 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[project] +name = "ecm-sync-system" +version = "0.1.0" +description = "ECM sync state machine and pipeline" +readme = "README.md" +requires-python = ">=3.9" +dependencies = [ + "pydantic>=2.7,<3", + "email-validator>=2.2,<3", + "PyYAML>=6.0,<7", + "httpx>=0.27,<1", + "aiosqlite>=0.20,<1", + "pytz>=2024.1,<2027", + "fastapi>=0.115,<1", + "uvicorn>=0.30,<1", +] + +[project.scripts] +ecm-sync-run = "sync_state_machine.cli:main" + +[dependency-groups] +dev = [ + "pytest>=8.2,<9", + "pytest-asyncio>=0.23,<1", +] + +[build-system] +requires = ["setuptools>=69", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +include = ["sync_state_machine*"] + +[tool.setuptools.package-data] +sync_state_machine = ["config/*.yaml"] + +[tool.uv] +package = true diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..3b758c4 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,13 @@ +[pytest] +testpaths = tests +# 忽略第三方库的弃用警告 +filterwarnings = + ignore::PendingDeprecationWarning:starlette.* + # Python 3.14: pytest-asyncio 0.26.0 内部使用已弃用的 asyncio API + # 上游 issue: https://github.com/pytest-dev/pytest-asyncio/issues/706 + # 待 pytest-asyncio 修复后可移除以下两条过滤 + ignore:'asyncio.get_event_loop_policy' is deprecated and slated for removal in Python 3.16:DeprecationWarning:pytest_asyncio\.plugin + ignore:'asyncio.set_event_loop_policy' is deprecated and slated for removal in Python 3.16:DeprecationWarning:pytest_asyncio\.plugin + # 也可以设置异步测试的默认 loop scope +asyncio_default_fixture_loop_scope = function +addopts = --ignore=scripts/test_api_sync.py --ignore=scripts/test_api_sync_top10.py --ignore=scripts/test_api_write_real_sample.py diff --git a/run.py b/run.py new file mode 100644 index 0000000..b75bb9f --- /dev/null +++ b/run.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import argparse +import asyncio +import logging +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +from sync_state_machine.config import load_overrides_from_file +from sync_state_machine.pipeline import build_config, run_pipeline_from_config + + +def _resolve_config_path(raw_path: str) -> Path: + path = Path(raw_path) + if not path.is_absolute(): + path = PROJECT_ROOT / path + return path.resolve() + + +async def _main() -> int: + parser = argparse.ArgumentParser(description="Run sync pipeline from config override file") + parser.add_argument( + "--config_path", + required=True, + help="Path to run profile file (JSON/YAML, supports relative path, e.g. run_profiles/jsonl_to_jsonl.local.json)", + ) + args = parser.parse_args() + + cfg_path = _resolve_config_path(args.config_path) + if not cfg_path.exists() or not cfg_path.is_file(): + raise FileNotFoundError(f"Config file not found: {cfg_path}") + + overrides = load_overrides_from_file(cfg_path, PROJECT_ROOT) + config = build_config(project_root=PROJECT_ROOT, overrides=overrides) + + mode = f"{config.local_datasource.type}->{config.remote_datasource.type}" + print(f"🧩 Loaded config file: {cfg_path}") + await run_pipeline_from_config( + config, + title=f"sync_state_machine pipeline ({mode})", + print_summary=True, + ) + return 0 + + +def main() -> int: + try: + return asyncio.run(_main()) + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + return 1 + finally: + logging.shutdown() + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/run_profiles/README.md b/run_profiles/README.md new file mode 100644 index 0000000..d7a8f3d --- /dev/null +++ b/run_profiles/README.md @@ -0,0 +1,18 @@ +# Run Profiles + +- 路径:项目根目录 `run_profiles/` +- 命名:建议使用 `*.local.yaml`(该目录下 YAML 默认会被 git 忽略) + +模板来源: +- `run_profiles/preset/jsonl_to_jsonl.default.yaml` +- `run_profiles/preset/jsonl_to_api.default.yaml` + +推荐流程: +1. 从模板复制到本目录,例如: + - `run_profiles/jsonl_to_jsonl.local.yaml` + - `run_profiles/jsonl_to_api.local.yaml` +2. 按需修改后运行: + - `python run.py --config_path=run_profiles/jsonl_to_jsonl.local.yaml` + +支持占位符: +- `${PROJECT_ROOT}`:运行时替换为项目根目录绝对路径。 diff --git a/run_profiles/preset/README.md b/run_profiles/preset/README.md new file mode 100644 index 0000000..d38e4cf --- /dev/null +++ b/run_profiles/preset/README.md @@ -0,0 +1,18 @@ +# Preset Templates + +该目录存放版本管理的运行配置模板(default)。 + +当前模板: +- `jsonl_to_jsonl.default.yaml` +- `jsonl_to_api.default.yaml` + +使用方式: +1. 复制模板到项目根目录 `run_profiles/`,并重命名为你自己的文件(如 `*.local.yaml`)。 +2. 修改后通过入口运行: + - `python run.py --config_path=run_profiles/jsonl_to_jsonl.local.yaml` + +说明: +- `run_profiles/*.yaml` / `run_profiles/*.yml` 默认被 `.gitignore` 忽略,用于本地私有配置。 +- 模板内可使用 `${PROJECT_ROOT}` 占位符。 +- 模板已显式展开 datasource 与 strategies 关键字段,便于集中审查。 +- API 数据源支持全局限流配置:`api_rate_limit_max_requests` 与 `api_rate_limit_window_seconds`。 \ No newline at end of file diff --git a/run_profiles/preset/jsonl_to_api.default.yaml b/run_profiles/preset/jsonl_to_api.default.yaml new file mode 100644 index 0000000..0eba99c --- /dev/null +++ b/run_profiles/preset/jsonl_to_api.default.yaml @@ -0,0 +1,290 @@ +node_types: +- company +- supplier +- project +- contract +- contract_change +- construction_task +- construction_task_detail +- material +- material_detail +- contract_settlement +- contract_settlement_detail +- personnel +- personnel_detail +- preparation +- production +- lar +- lar_change +- project_detail_data +- units +local_datasource: + type: jsonl + jsonl_dir: ${PROJECT_ROOT}/filtered_datasource/datasource/filtered + read_only: false + target_project_ids: + - "0f9c3e22-f4bb-4803-825a-4f238eeb06d5" + - "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + handler_configs: {} +remote_datasource: + type: api + api_base_url: http://localhost:8000/api/third/v2 + api_uid: 6b18c681-92d5-4c7f-802c-df413b6504c8 + api_secret: jTk5gSHTqDIZng1zh2z6jrT8JjVgCKsmV8_7NyESbQk + api_debug: true + api_rate_limit_max_requests: 30 + api_rate_limit_window_seconds: 10.0 + poll_max_retries: 1 + poll_interval: 0.5 + target_project_ids: + # 请替换为实际的项目ID,至少需要一个 + - "0f9c3e22-f4bb-4803-825a-4f238eeb06d5" + - "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + handler_configs: + supplier: {} +persist: + backend: sqlite + db_path: ${PROJECT_ROOT}/test_results/sync_state_machine/simple_pipeline_sm.db + enable: true + wipe_on_start: false +logging: + initialize: true + file_dir: ${PROJECT_ROOT}/test_results/sync_state_machine + file_name_pattern: simple_pipeline_sm_{timestamp}.log + level: 20 +strategies: + company: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - credit_code + depend_fields: {} + local_orphan_action: none + remote_orphan_action: create_local + update_direction: pull + supplier: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - credit_code + depend_fields: {} + local_orphan_action: none + remote_orphan_action: create_local + update_direction: pull + project: + skip_sync: false + config: + auto_bind: false + auto_bind_fields: [] + pre_bind_data_id: [] + depend_fields: + company_id: company + local_orphan_action: none + remote_orphan_action: none + update_direction: push + contract: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - company_id + - code + depend_fields: + project_id: project + company_id: supplier + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_change: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - change_time + - title + depend_fields: + project_id: project + contract_id: contract + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + construction_task: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - task_type + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + construction_task_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: construction_task + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + material: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - material_type + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + material_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: material + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_settlement: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_settlement_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: contract_settlement + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + personnel: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + contract_id: contract + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + personnel_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: personnel + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + preparation: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + production: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + lar: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + lar_change: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - change_time + - title + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + project_detail_data: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - key + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push # 未在 field_direction_overrides 中列出的 key 默认 push + field_direction_key: key # 以节点 data.key 字段值作为方向查表键 + field_direction_overrides: + ensure_production: pull # 远程 → 本地 + climb_production: pull # 远程 → 本地 + challenge_production: pull # 远程 → 本地 + units: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - serial_number + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push diff --git a/run_profiles/preset/jsonl_to_jsonl.default.yaml b/run_profiles/preset/jsonl_to_jsonl.default.yaml new file mode 100644 index 0000000..dbfbf8f --- /dev/null +++ b/run_profiles/preset/jsonl_to_jsonl.default.yaml @@ -0,0 +1,284 @@ +node_types: +- company +- user +- supplier +- project +- contract +- contract_change +- construction_task +- construction_task_detail +- material +- material_detail +- contract_settlement +- contract_settlement_detail +- personnel +- personnel_detail +- preparation +- production +- lar +- lar_change +- project_detail_data +- units +local_datasource: + type: jsonl + jsonl_dir: ${PROJECT_ROOT}/filtered_datasource/datasource/filtered + read_only: false + target_project_ids: [] + handler_configs: {} +remote_datasource: + type: jsonl + jsonl_dir: ${PROJECT_ROOT}/remote_datasource/datasource + read_only: false + target_project_ids: [] + handler_configs: {} +persist: + backend: sqlite + db_path: ${PROJECT_ROOT}/test_results/sync_state_machine/full_sync_pipeline_jsonl_sm.db + enable: true + wipe_on_start: false +logging: + initialize: true + file_dir: ${PROJECT_ROOT}/test_results/sync_state_machine + file_name_pattern: jsonl_pipeline_sm_{timestamp}.log + level: 20 +strategies: + company: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - credit_code + depend_fields: {} + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + user: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - username + depend_fields: {} + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + supplier: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - credit_code + depend_fields: {} + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + project: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - name + depend_fields: + company_id: company + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - company_id + - code + depend_fields: + project_id: project + company_id: supplier + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_change: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - change_time + - title + depend_fields: + project_id: project + contract_id: contract + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + construction_task: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - task_type + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + construction_task_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: construction_task + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + material: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + - material_type + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + material_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: material + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_settlement: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - contract_id + depend_fields: + contract_id: contract + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + contract_settlement_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: contract_settlement + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + personnel: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + contract_id: contract + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + personnel_detail: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - parent_id + - date + depend_fields: + parent_id: personnel + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + preparation: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + production: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - code + depend_fields: + project_id: project + local_orphan_action: none + remote_orphan_action: none + update_direction: push + lar: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + depend_fields: + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + lar_change: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - change_time + - title + depend_fields: + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + project_detail_data: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - key + depend_fields: + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push + units: + skip_sync: false + config: + auto_bind: true + auto_bind_fields: + - project_id + - serial_number + depend_fields: + project_id: project + local_orphan_action: create_remote + remote_orphan_action: none + update_direction: push diff --git a/schemas/common/base.py b/schemas/common/base.py new file mode 100644 index 0000000..d9d8053 --- /dev/null +++ b/schemas/common/base.py @@ -0,0 +1,108 @@ +from pydantic import BaseModel, Field, ValidationError, model_validator +from typing import Any, Dict +from typing import Any, Optional, TypeVar, Generic, List +from pydantic import BaseModel, Field, model_serializer + +class BaseResponseWithID(BaseModel): + """ + Mixin: 统一处理输入中的 id/_id -> id + 约束: + - 若 id 与 _id 同时出现且值不同 -> 报错 + - 若仅 _id 出现 -> 转成 id + - 若两者都缺失 -> 报错 + - 最终保证存在 id: str + """ + id: str = Field(..., description="资源唯一标识ID") + + @model_validator(mode="before") + @classmethod + def normalize_id(cls, data: Any) -> Any: + # 仅处理 dict-like 输入;其他情况交给 Pydantic 默认流程 + if not isinstance(data, dict): + return data + + has_id = "id" in data + has__id = "_id" in data + + if has_id and has__id: + if str(data["id"]) != str(data["_id"]): + raise ValidationError([ + { + "type": "value_error", + "loc": ("id",), + "msg": "id and _id both provided but not equal", + "input": data.get("id"), + } + ], cls) + # 相同则优先保留 id,去掉 _id + data = {**data} + data.pop("_id", None) + return data + + if has__id and not has_id: + # 将 _id 统一映射为 id + data = {**data} + data["id"] = str(data["_id"]) + data.pop("_id", None) + return data + + if not has_id and not has__id: + raise ValidationError([ + { + "type": "value_error.missing", + "loc": ("id",), + "msg": "id or _id is required", + "input": data, + } + ], cls) + + # 默认返回(已有 id) + return data + +class RequestApprovalMixin(BaseModel): + """ + 请求审批相关的基础模型 + """ + pass + +T = TypeVar("T") + + +# def _build_full_response_dict(code: int, message: Optional[str], data: Any) -> dict: +# """构建与 __orjson__ 完全一致的响应字典""" +# # 处理 data 的序列化(与 __orjson__ 逻辑同步) +# if data is None: +# clean_data = {} +# elif isinstance(data, BaseModel): +# clean_data = data.model_dump() +# else: +# clean_data = data +# return { +# "code": code, +# "message": message, +# "data": clean_data +# } + +class Success(BaseModel, Generic[T]): + code: int = 200 + message: Optional[str] = "OK" + data: Optional[T] = None + + # def __init__(self, **kwargs): + # super().__init__(**kwargs) + # # 自动捕获完整响应结构到 push_log.result + # push_log = current_push_log.get() + # if push_log is not None: + # full_response = _build_full_response_dict(self.code, self.message, self.data) + # push_log.result = full_response + # +class Fail(BaseModel): + code: int = 400 + message: Optional[str] = None + data: Optional[Any] = Field(default_factory=dict) + +class PaginatedList(BaseModel, Generic[T]): + list: List[T] = Field(default_factory=list) + total: int = 0 + page: int = 1 + page_size: int = 20 \ No newline at end of file diff --git a/schemas/common/datetime.py b/schemas/common/datetime.py new file mode 100644 index 0000000..7917858 --- /dev/null +++ b/schemas/common/datetime.py @@ -0,0 +1,13 @@ +from datetime import datetime, date +import pytz + +def get_current_date(date_formate='%Y-%m-%d'): + """ + 获取当前日期字符串,格式化为指定格式,默认格式为'YYYY-MM-DD' + """ + tz = pytz.timezone('Asia/Shanghai') # 设置为中国时区 + current_date = datetime.now(tz) + return current_date.strftime(date_formate) + +def datetime_date(date: str) -> date: + return datetime.strptime(date, "%Y-%m-%d").date() \ No newline at end of file diff --git a/schemas/common/enums.py b/schemas/common/enums.py new file mode 100644 index 0000000..360a6d2 --- /dev/null +++ b/schemas/common/enums.py @@ -0,0 +1,9 @@ +from enum import Enum + +class ApprovalStatus(str, Enum): + REGISTERED = "registered" + UNDER_REVIEW = "under_review" + APPROVED = "approved" + REJECTED = "rejected" + PENDING_CONFIRM = "pending_confirm" + CONFIRMED = "confirmed" diff --git a/schemas/common/push_system.py b/schemas/common/push_system.py new file mode 100644 index 0000000..b893c74 --- /dev/null +++ b/schemas/common/push_system.py @@ -0,0 +1,178 @@ +""" +推送接口通用schema + +## 响应相关 +1. BaseResponseSchema: 所有接口响应的基础schema +2. BasePushResponseSchema: 推送接口响应的基础schema,包含push_id +3. PushResultSchema: 查询推送结果的schema + +## 请求相关 +4. BaseCreateRequestSchema[T]: 创建资源的基础请求schema(泛型),业务数据在data字段 +5. BaseUpdateRequestSchema[T]: 更新资源的基础请求schema(泛型),业务数据在data字段 +6. BaseDeleteRequestSchema: 删除资源的基础请求schema,只需resource_id +7. BulkPushRequestSchema: 批量推送请求的schema + +## 说明 +- 所有元数据字段(timestamp, nonce, signature, uid, push_id)在请求体最外层 +- push_id使用UUIDv7格式,支持时间排序,同时作为幂等键和查询键 +- 业务数据嵌套在data字段中(删除操作除外,只需resource_id) +- 所有业务Schema必须继承BasePushData,确保包含project_type字段 +- resource_id在外层,用于标识要操作的资源(更新/删除时必填) +- 使用泛型T可快速定义各业务的请求schema,T必须继承BasePushData +""" + +from pydantic import BaseModel, Field +from typing import TypeVar, Generic, Optional, List, Dict, Any +from ..project.enums import ProjectType + +# 定义泛型 +T = TypeVar('T', bound='BasePushData') + +# ==================== 业务数据基类 ==================== + +class BasePushData(BaseModel): + """ + 所有推送业务数据的基类 + + 所有业务Schema必须继承此类,确保包含project_type字段 + """ + project_type: ProjectType = Field(..., description="项目类型:offshore_wind/pumped_storage/photovoltaic等") + + +# ==================== Mixin ==================== + +class SignatureMixin(BaseModel): + """签名字段混入""" + timestamp: int = Field(..., description="毫秒级 Unix 时间戳") + nonce: str = Field(..., description="随机字符串,防止重放攻击") + sign: str = Field(..., description="签名字符串") + uid: str = Field(..., description="集团侧用户id") + + +class PushRequestMixin(BaseModel): + """推送ID字段混入""" + push_id: str = Field(..., description="推送ID,客户端生成的唯一标识(UUIDv7,支持时间排序)") + + +# ==================== 响应相关 ==================== + +class BaseResponseSchema(BaseModel): + """所有接口响应的基础schema""" + code: int = 200 + message: Optional[str] = "OK" + data: Optional[T] = None + + +class BasePushResponseSchema(BaseModel): + """推送接口响应的基础schema""" + biz_id: str | None = Field(None, description="资源ID(create操作成功后返回新创建的ID,update/delete返回原ID)") + + +class PushResultSchema(BaseModel): + """查询推送结果的schema""" + push_id: str = Field(..., description="推送ID(客户端生成的UUIDv7)") + status: str = Field(..., description="推送状态:queued/processing/success/failed") + result: Dict[str, Any] | None = Field(None, description="处理结果(成功时包含created_id等信息)") + error: str | None = Field(None, description="错误信息(失败时)") + created_at: str = Field(..., description="推送创建时间(ISO 8601格式)") + updated_at: str = Field(..., description="推送更新时间(ISO 8601格式)") + + +class PushIdsSchema(BaseModel): + """支持从请求体接收的 push_ids 列表字符串(逗号拼接)""" + push_ids: Optional[str] = Field(None, description="推送id字符串逗号拼接") + + +# ==================== 请求相关 ==================== + +class BaseCreateRequestSchema(SignatureMixin, PushRequestMixin, BaseModel, Generic[T]): + """ + 创建资源的基础请求schema(泛型) + + 泛型T必须继承BasePushData,确保包含project_type字段 + + 使用示例: + class ProjectInputSchema(BasePushData): + name: str = Field(...) + capacity: float = Field(...) + + class ProjectCreateRequest(BaseCreateRequestSchema[ProjectInputSchema]): + pass + """ + # 业务数据(嵌套) + data: T = Field(..., description="业务数据") + + +class BaseUpdateRequestSchema(SignatureMixin, PushRequestMixin, BaseModel, Generic[T]): + """ + 更新资源的基础请求schema(泛型) + + 泛型T必须继承BasePushData,确保包含project_type字段 + resource_id在外层,用于标识要更新的资源 + + 使用示例: + class ProjectInputSchema(BasePushData): + name: str = Field(...) + capacity: float = Field(...) + + class ProjectUpdateRequest(BaseUpdateRequestSchema[ProjectInputSchema]): + pass + """ + # 资源标识 + biz_id: str = Field(..., description="要更新的资源ID,类型id,如project传project_id,unit传unit_id") + + # 业务数据(嵌套) + data: T = Field(..., description="业务数据(只需包含要更新的字段)") + + +class BaseDeleteRequestSchema(SignatureMixin, PushRequestMixin, BaseModel): + """ + 删除资源的基础请求schema + + 使用示例: + class ProjectDeleteRequest(BaseDeleteRequestSchema): + pass + """ + + # 资源标识 + biz_id: str = Field(..., description="要删除的资源ID") + + +class BulkPushItem(PushRequestMixin, BaseModel): + """ + 批量推送中的单个项目 + + 注意: + - action为create时:data必填,resource_id留空 + - action为update时:data和resource_id都必填 + - action为delete时:resource_id必填,data留空 + - data必须继承BasePushData,确保包含project_type字段 + """ + action: str = Field(..., description="操作类型:create/update/delete") + resource_id: str | None = Field(None, description="资源ID(update/delete时必填,create时留空)") + data: BasePushData | None = Field(None, description="业务数据(create/update时必填,delete时留空,必须包含project_type字段)") + + +class BulkPushItemResult(BaseModel): + """批量推送中单个项目的处理结果""" + push_id: str = Field(..., description="推送ID(对应请求中的push_id)") + status: str = Field(..., description="处理状态:queued/processing/success/failed") + resource_id: str | None = Field(None, description="资源ID(create成功时返回新ID,update/delete返回原ID)") + error: str | None = Field(None, description="错误信息(失败时)") + + +class BulkPushRequestSchema(SignatureMixin, BaseModel): + """ + 批量推送请求的schema + + 一次请求可推送多条数据,每条都有独立的幂等键和操作类型 + """ + # 批量数据 + items: List[BulkPushItem] = Field(..., description="批量推送的数据列表") + + +class BulkPushResponseSchema(BaseResponseSchema): + """批量推送响应的schema""" + batch_id: str = Field(..., description="批量推送的批次ID") + total: int = Field(..., description="总数量") + results: List[BulkPushItemResult] = Field(..., description="每条数据的处理结果,包含push_id和resource_id") diff --git a/schemas/common/validators.py b/schemas/common/validators.py new file mode 100644 index 0000000..b51c65a --- /dev/null +++ b/schemas/common/validators.py @@ -0,0 +1,85 @@ +from datetime import datetime +from typing import Annotated +from pydantic import AfterValidator +from functools import lru_cache +import re + +# 预编译正则表达式,避免重复编译 +DATE_PATTERN = re.compile(r'^\d{4}-\d{2}-\d{2}$') +TIMESTAMP_PATTERNS = { + 'iso_z': re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z$'), + 'iso_offset': re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+\+00:00$'), + 'simple_space': re.compile(r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'), + 'simple_t': re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$'), +} + +@lru_cache(maxsize=1024) # 缓存最近1024个不同的日期 +def _validate_date_cached(v: str) -> str: + """缓存版本的日期验证""" + # 快速格式检查(避免无效字符串进入 strptime) + if not DATE_PATTERN.match(v): + raise ValueError(f"日期格式应为 YYYY-MM-DD,实际为: {v}") + + # 验证日期有效性(例如排除 2023-02-30) + datetime.strptime(v, "%Y-%m-%d") + return v + +def validate_date(v: str) -> str: + """校验日期格式为 YYYY-MM-DD""" + if v is None or v == "": + return v + + return _validate_date_cached(v) + +@lru_cache(maxsize=2048) # 时间戳变化更多,给更大的缓存 +def _validate_timestamp_cached(v: str) -> str: + """缓存版本的时间戳验证""" + # 按常见程度排序,优先检查最可能的格式 + if TIMESTAMP_PATTERNS['iso_z'].match(v): + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S.%fZ") + elif TIMESTAMP_PATTERNS['simple_space'].match(v): + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + elif TIMESTAMP_PATTERNS['simple_t'].match(v): + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S") + elif TIMESTAMP_PATTERNS['iso_offset'].match(v): + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S.%f+00:00") + else: + # 兜底逻辑:如果正则都不匹配,尝试原来的逻辑 + try: + if v.endswith('Z'): + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S.%fZ") + elif v.endswith('+00:00'): + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S.%f+00:00") + else: + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + datetime.strptime(v, "%Y-%m-%dT%H:%M:%S") + except ValueError: + raise ValueError("时间戳格式应为 YYYY-MM-DDTHH:MM:SS.sssZ、+00:00、YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DDTHH:MM:SS") + + return v + +def validate_timestamp(v: str) -> str: + """校验时间戳格式""" + if v is None or v == "": + return v + + return _validate_timestamp_cached(v) + +# 定义新类型 +DateStr = Annotated[str, AfterValidator(validate_date)] +TimestampStr = Annotated[str, AfterValidator(validate_timestamp)] + +# 可选:提供缓存统计功能用于调试 +def get_cache_stats(): + """获取缓存统计信息,用于性能调试""" + return { + 'date_cache': _validate_date_cached.cache_info(), + 'timestamp_cache': _validate_timestamp_cached.cache_info(), + } + +def clear_validation_cache(): + """清空验证缓存(用于测试或内存清理)""" + _validate_date_cached.cache_clear() + _validate_timestamp_cached.cache_clear() \ No newline at end of file diff --git a/schemas/company/company.py b/schemas/company/company.py new file mode 100644 index 0000000..2806588 --- /dev/null +++ b/schemas/company/company.py @@ -0,0 +1,40 @@ +from pydantic import BaseModel, Field, field_validator +from typing import List, Optional, Literal +from ..common.base import BaseResponseWithID + + +class CompanyResponse(BaseResponseWithID): + code: str = Field(..., description="公司编码") + company_type: str = Field(..., description="公司类型") + name: str = Field(..., description="公司名称") + short_name: str = Field(..., description="公司简称") + parent_id: Optional[str] = Field(None, description="父公司ID") + path: List[str] = Field(default_factory=list, description="公司路径 [..., 上级id, 本身id]") + path_name: List[str] = Field(default_factory=list, description="公司路径名称 [..., 上级名称, 本身名称]") + province: Optional[str] = Field(None, description="省份编码") # 存省份编码 + city: Optional[str] = Field(None, description="城市编码") # 存城市编码 + sort: int = Field(0, description="排序") + status: str = Field("", description="公司状态") + company_nature: Optional[list] = Field(..., description="公司性质") + credit_code: Optional[str] = Field(None, description="信用代码", examples=["914403007109310121"]) + + city_name: Optional[str] = Field(None, description="城市名称", examples=[None]) + province_name: Optional[str] = Field(None, description="省份名称", examples=[None]) + parent_name: Optional[str] = Field(None, description="父级公司名称", examples=[None]) + + @field_validator( + "path", + "path_name", + mode="before" + ) + def formate_null_to_list(cls, field_value): + if field_value is None: + return [] + return field_value + + +class CompanyListResponse(BaseModel): + page: int + page_size: int + total: int + list: List[CompanyResponse] = [] diff --git a/schemas/construction/construction.py b/schemas/construction/construction.py new file mode 100644 index 0000000..6b26905 --- /dev/null +++ b/schemas/construction/construction.py @@ -0,0 +1,121 @@ +from pydantic import BaseModel, Field, field_validator, model_validator +from fastapi import HTTPException +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID + +class PlanNode(BaseModel): + date: DateStr = Field(..., description="计划节点时间", examples=["2024-01-01"]) + quantity: float = Field(..., description="计划完成量", examples=[100.0]) + is_audit: Optional[bool] = Field(False, description="是否已审核", examples=[False]) + + @field_validator("quantity") + def validate_price(cls, v): + """验证金额必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='计划完成量不能小于等于0') + return v + +class ConstructionResponse(BaseResponseWithID): + """ + 施工任务模型,存储在CouchDB中的施工任务文档 + """ + id : str = Field(..., description="施工任务ID") + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: Optional[str] = Field(None, description="所属合同ID", examples=["contract456"]) + show_name: str = Field(..., description="展示名称", examples=["桩基础施工任务"]) + construction_section: str = Field(..., description="施工区域", examples=["GF"]) + status: Optional[int] = Field(None, description="施工状态", examples=[0]) + task_type: str = Field(..., description="施工任务类型", examples=["zjcsgg"]) + plan_start_date: Optional[DateStr] = Field(None, description="计划开工时间", examples=["2024-01-01"]) + plan_complete_date: Optional[DateStr] = Field(None, description="计划完工时间", examples=["2024-06-01"]) + actual_complete_date: Optional[DateStr] = Field(None, description="实际完工时间", examples=["2024-05-30"]) + complete_quantity: float = Field(0.0, description="实际完成量累计", examples=[0.0]) + complete_rate: float = Field(0.0, description="实际完成率(%)", examples=[0.0]) + contract_quantity: Optional[float] = Field(None, description="设计量", examples=[1000.0]) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + statistic_date: Optional[DateStr] = Field(None, description="统计节点时间", examples=["2024-05-31"]) + # sort: int = Field(0, description="排序字段", examples=[0]) + is_crucial:Optional[bool] = Field(False, description="是否为关键线路") + # 2025-10-20新增字段,延迟时间 + delay_days: Optional[int] = Field(None, description="延迟时间(天)", examples=[0]) + +class ConstructionCreate(BaseModel): + """ + 施工任务创建模型 + 不对应operation + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: Optional[str] = Field(None, description="所属合同ID", examples=["contract456"]) + show_name: str = Field(..., description="展示名称", examples=["桩基础施工任务"]) + construction_section: str = Field(..., description="施工区域", examples=["GF"]) + task_type: str = Field(..., description="施工任务类型", examples=["zjcsgg"]) + is_crucial:Optional[bool] = Field(False, description="是否为关键线路") + + + +class ConstructionUpdate(BaseModel): + """ + 施工任务更新模型 + CONSTRUCTION_BASE_INFO = "construction.base_info" + """ + id: str = Field(..., description="施工任务ID") + contract_id: Optional[str] = Field(None, description="所属合同ID", examples=["contract456"]) + show_name: str | None = Field(None, description="展示名称(仅QT类施工可以修改名称)", examples=["桩基础施工任务"]) + is_crucial:bool | None = Field(False, description="是否为关键线路") + +class ConstructionPlanUpdate(BaseModel): + """ + 施工计划更新模型 + 对应 CONSTRUCTION_PLAN = "construction.plan" + + 业务逻辑说明: + - API要求计划节点时间必须晚于计划开工日期(不能等于) + - 自动清理脏数据:如果 plan_node 有2个或以上节点,删除: + 1. 开头节点:如果其 date 等于 plan_start_date + 2. 结尾节点:如果其 date 等于 plan_complete_date + - 这样避免提交包含边界节点的数据导致API报错 + """ + id: str = Field(..., description="施工任务ID") + plan_start_date: Optional[str] = Field(None, description="计划开工时间", examples=["2024-01-01"]) + plan_complete_date: Optional[str] = Field(None, description="计划完工时间", examples=["2024-01-01"]) + contract_quantity: float = Field(..., description="设计量") + plan_node: Optional[List[PlanNode]] = Field(default_factory=list, description="计划节点列表") + + @field_validator("contract_quantity") + def validate_price(cls, v): + """验证金额必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='设计量不能小于0') + return v + + @model_validator(mode='after') + def clean_plan_nodes(self): + """ + 清理计划节点列表中的边界节点 + + 如果 plan_node 有2个或以上节点,删除: + - 开头节点:date 等于 plan_start_date + - 结尾节点:date 等于 plan_complete_date + + 这避免了API报错"计划节点时间必须晚于计划开工日期" + """ + if not self.plan_node or len(self.plan_node) < 2: + return self + + cleaned_nodes = list(self.plan_node) + + # 删除开头的边界节点 + if (self.plan_start_date and + cleaned_nodes and + cleaned_nodes[0].date == self.plan_start_date): + cleaned_nodes.pop(0) + + # 删除结尾的边界节点 + if (self.plan_complete_date and + cleaned_nodes and + cleaned_nodes[-1].date == self.plan_complete_date): + cleaned_nodes.pop() + + self.plan_node = cleaned_nodes + return self \ No newline at end of file diff --git a/schemas/construction/construction_detail.py b/schemas/construction/construction_detail.py new file mode 100644 index 0000000..6f1b301 --- /dev/null +++ b/schemas/construction/construction_detail.py @@ -0,0 +1,133 @@ +from pydantic import BaseModel, Field,field_validator +from ..common.datetime import get_current_date +from fastapi import HTTPException +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID +from ..common.enums import ApprovalStatus +from datetime import datetime + +class ConstructionDetailResponse(BaseResponseWithID): + """ + 物资明细返回值 + """ + id: str = Field(..., description="施工任务明细ID") + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属施工任务ID", examples=["task789"]) + rate: Optional[float] = Field(None, description="实际完成率", examples=[0.0]) + quantity: float = Field(0.0, ge=0, description="实际完成量累计", examples=[0.0]) + date: DateStr = Field(..., description="节点日期", examples=["2024-05-31"]) + status: Optional[int] = Field(None, description="进度状态", examples=[0]) + change_count: int = Field(0, description="变更次数", examples=[0]) + remark: Optional[str] = Field(None, description="备注") + is_complete: Optional[bool] = Field( + None, description="是否为全部完成", examples=[False] + ) + +class ConstructionDetailCreate(BaseModel): + """ + 施工明细创建模型 + CONSTRUCTION_DETAIL = "construction.detail" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属施工任务ID", examples=["task789"]) + quantity: float = Field(0.0, ge=0, description="实际完成量累计", examples=[0.0]) + date: DateStr = Field(..., description="节点日期", examples=["2024-05-31"]) + remark: Optional[str] = Field(None, description="备注") + is_complete: Optional[bool] = Field( + False, description="是否为全部完成", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + + +class ConstructionDetailUpdate(BaseModel): + """ + 施工明细更新模型 + CONSTRUCTION_DETAIL = "construction.detail" + """ + id: str = Field(..., description="施工任务明细ID") + quantity: Optional[float] = Field(None, ge=0, description="实际完成量累计", examples=[0.0]) + date: Optional[DateStr] = Field(None, description="节点日期", examples=["2024-05-31"]) + remark: Optional[str] = Field(None, description="备注") + is_complete: Optional[bool] = Field( + None, description="是否为全部完成", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus | None = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + if v is None: + return v + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v is None: + return None + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v is None: + return None + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + +class ConstructionDetailBulkUpdate(BaseModel): + detail_list: List[ConstructionDetailUpdate] \ No newline at end of file diff --git a/schemas/contract/contract.py b/schemas/contract/contract.py new file mode 100644 index 0000000..245582f --- /dev/null +++ b/schemas/contract/contract.py @@ -0,0 +1,122 @@ +from pydantic import BaseModel, Field,field_validator +from typing import List, Optional, Literal +from ..common.datetime import datetime_date,get_current_date +from fastapi import HTTPException +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID + +class ContractResponse(BaseResponseWithID): + """ + 合同返回信息 + """ + id : str = Field(..., description="合同ID") + project_id: str = Field("", description="所属项目ID") + name: str = Field("", description="合同名称") + short_name: str = Field("", description="合同简称") + code: str = Field("", description="合同编码") + contract_type: str = Field("", description="合同类型") + + currency: str = Field("CNY", description="币种") + manager_name: str = Field("", description="负责人姓名") + manager_phone: str = Field("", description="负责人电话") + + sign_company: str = Field("", description="签订公司") + company_id: str = Field("", description="签订公司id") + sign_date: DateStr = Field("", description="签订日期", examples=["2023-10-01"]) + credit_code: Optional[str] = Field("", description="签订公司信用代码") + + total_price: float = Field(0.0, description="合同金额") + sub_name: Optional[str] = Field(None, description="合同子标题") + + +class ContractCreate(BaseModel): + """ + 创建合同 + CONTRACT = "contract" + """ + name: str|None = Field(None, description="合同名称") + sub_name:str|None= Field(None, description="合同子标题") + code: str = Field("", description="合同编码") + contract_type: str = Field("", description="合同类型") + + project_id: str = Field("", description="所属项目ID") + + currency: str = Field("CNY", description="币种") + manager_name: str = Field("", description="负责人姓名") + manager_phone: str = Field("", description="负责人电话") + + sign_company: str = Field("", description="签订公司") + company_id: Optional[str] = Field(None, description="签订公司id") + sign_date: DateStr = Field("", description="签订日期", examples=["2023-10-01"]) + credit_code: Optional[str] = Field(None, description="签订公司信用代码") + + total_price: float = Field(0.0, description="合同金额") + + @field_validator("total_price") + def validate_price(cls, v): + """验证金额必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='合同金额不能小于0') + return v + + @field_validator('sign_date') + def validate_actual_date_not_future(cls, v: str) -> str: + if v == "": + return "" + try: + actual = datetime_date(v) + except ValueError: + raise HTTPException(status_code=400, detail='日期格式为(YYYY-MM-DD)') + + today = datetime_date(get_current_date()) + if actual > today: + raise HTTPException(status_code=400, detail='签约日期不能晚于今天') + return v + +class ContractUpdate(BaseModel): + """ + 更新合同 + CONTRACT = "contract" + """ + id : str = Field(..., description="合同ID") + sub_name:str|None= Field(None, description="合同子标题") + + currency: str|None = Field(None, description="币种") + + manager_name: str|None= Field(None, description="负责人姓名") + manager_phone: str|None= Field(None, description="负责人电话") + + sign_company: str|None= Field(None, description="签订公司") + company_id: Optional[str] = Field(None, description="签订公司id") + sign_date: str|None = Field(None, description="签订日期", examples=["2023-10-01"]) + credit_code: Optional[str] = Field(None, description="签订公司信用代码") + + total_price: float|None= Field(None, description="合同金额") + + @field_validator("total_price") + def validate_price(cls, v): + """验证金额必须为非负数""" + if v is None: + return None + if v < 0: + raise HTTPException(status_code=400, detail='合同金额不能小于0') + return v + + @field_validator('sign_date') + def validate_actual_date_not_future(cls, v: str): + if v is None: + return None + if v == "": + return "" + try: + actual = datetime_date(v) + except ValueError: + raise HTTPException(status_code=400, detail='日期格式为(YYYY-MM-DD)') + + today = datetime_date(get_current_date()) + if actual > today: + raise HTTPException(status_code=400, detail='签约日期不能晚于今天') + return v + + + diff --git a/schemas/contract_settlement/contract_settlement.py b/schemas/contract_settlement/contract_settlement.py new file mode 100644 index 0000000..b5a9a85 --- /dev/null +++ b/schemas/contract_settlement/contract_settlement.py @@ -0,0 +1,101 @@ +from pydantic import Field, BaseModel,field_validator,model_validator +from fastapi import HTTPException +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID + +class PlanNode(BaseModel): + date: DateStr = Field(..., description="计划节点时间", examples=["2024-01-01"]) + quantity: float = Field(..., description="计划完成量", examples=[100.0]) + is_audit: Optional[bool] = Field(False, description="是否已审核", examples=[False]) + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证计划完成量必须大于0""" + if v < 0: + raise HTTPException(status_code=400, detail='计划完成量不能小于0') + return v + +class ContractSettlementResponse(BaseResponseWithID): + """ + 合同结算返回 + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: str = Field(..., description="所属合同ID", examples=["contract456"]) + contract_type: Optional[str] = Field(None, description="合同类型") + show_name: Optional[str] = Field(None, description="合同简称", examples=["主变采购合同"]) + complete_price: float = Field(0.0, description="实际完成金额", examples=[100000.0]) + contract_price: float = Field(0.0, description="合同金额", examples=[120000.0]) + actual_complete_date: Optional[DateStr] = Field(None, description="实际结束时间", examples=["2024-06-30"]) + actual_start_date: Optional[DateStr] = Field(None, description="实际开始时间", examples=["2024-01-01"]) + plan_complete_date: Optional[DateStr] = Field(None, description="计划结束时间", examples=["2024-06-30"]) + plan_start_date: Optional[DateStr] = Field(None, description="计划开始时间", examples=["2024-01-01"]) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + status: Optional[int] = Field(None,description="供货状态", examples=[0]) + + # 2025-10-20新增字段,延迟时间 + delay_days: Optional[int] = Field(None, description="延迟时间(天)", examples=[0]) + statistic_date: Optional[DateStr] = Field( + None, description="统计节点截止日期", examples=["2024-05-31"] + ) + +class ContractSettlementCreate(BaseModel): + """ + 合同结算创建模型 + CONTRACT_SETTLEMENT_BASE_INFO = "contract_settlement.base_info" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: str = Field(..., description="所属合同ID", examples=["contract456"]) + show_name: Optional[str] = Field(None, description="合同简称", examples=["主变采购合同"]) + +class ContractSettlementUpdate(BaseModel): + """ + 合同结算更新模型 + CONTRACT_SETTLEMENT_BASE_INFO = "contract_settlement.base_info" + """ + id: str = Field(..., description="合同结算ID") + contract_id: str = Field(..., description="所属合同ID", examples=["contract456"]) + show_name: Optional[str] = Field(None, description="合同简称", examples=["主变采购合同"]) + +class ContractSettlementPlanUpdate(BaseModel): + """ + 合同结算计划节点更新模型 + CONTRACT_SETTLEMENT_PLAN_NODE = "contract_settlement.plan_node" + + 开始时间和金额在合同中维护,这里只维护计划节点和计划结束时间 + + 业务逻辑说明: + - API要求计划节点时间必须晚于计划开始时间(不能等于) + - 自动清理脏数据:如果 plan_node 有2个或以上节点,删除边界节点 + """ + id: str = Field(..., description="合同结算ID") + plan_start_date: Optional[DateStr] = Field(None, exclude=True, description="计划开始时间(不推往后端,仅用于本地首节点清洗)", examples=["2024-06-30"]) + plan_complete_date: Optional[DateStr] = Field(None, description="计划结束时间", examples=["2024-06-30"]) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + + @model_validator(mode='after') + def clean_plan_nodes(self): + """ + 清理计划节点列表中的边界节点 + + 注:settlement的plan_start_date在contract中维护,此处利用外部提供的辅助字段清除非法首尾节点。 + """ + if not self.plan_node or len(self.plan_node) < 2: + return self + + cleaned_nodes = list(self.plan_node) + + # 删除开头的边界节点 + if (self.plan_start_date and + cleaned_nodes and + cleaned_nodes[0].date == self.plan_start_date): + cleaned_nodes.pop(0) + + # 删除结尾的边界节点 + if (self.plan_complete_date and + cleaned_nodes and + cleaned_nodes[-1].date == self.plan_complete_date): + cleaned_nodes.pop() + + self.plan_node = cleaned_nodes + return self \ No newline at end of file diff --git a/schemas/contract_settlement/contract_settlement_detail.py b/schemas/contract_settlement/contract_settlement_detail.py new file mode 100644 index 0000000..ed9a352 --- /dev/null +++ b/schemas/contract_settlement/contract_settlement_detail.py @@ -0,0 +1,128 @@ +from pydantic import Field, BaseModel,field_validator +from fastapi import HTTPException +from ..common.datetime import get_current_date +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID +from ..common.enums import ApprovalStatus +from datetime import datetime + +class ContractSettlementDetailResponse(BaseResponseWithID): + """ + 合同结算明细返回模型 + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属合同结算ID", examples=["settlement789"]) + date: DateStr = Field(..., description="结算日期", examples=["2024-05-31"]) + quantity: float = Field(..., description="合同金额", examples=[0]) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field(None, description="是否完成", examples=[False]) + write_off_rate: Optional[float] = Field(None, description="核销率", examples=[0.0]) + change_count: int = Field(0, description="变更次数", examples=[0]) + status: Optional[int] = Field(None, description="进度状态", examples=[0]) + rate: Optional[float] = Field(None, description="实际完成率", examples=[0.0]) + +class ContractSettlementDetailCreate(BaseModel): + """ + 合同结算明细创建模型 + CONTRACT_SETTLEMENT_DETAIL = "contract_settlement.detail" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属合同结算ID", examples=["settlement789"]) + date: DateStr = Field(..., description="结算日期", examples=["2024-05-31"]) + quantity: float = Field(..., description="合同金额", examples=[0]) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: bool = Field(False, description="是否完成", examples=[False]) + write_off_rate: Optional[float] = Field(None, description="核销率", examples=[0.0]) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='合同金额不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v > get_current_date(): + raise HTTPException(detail='结算日期不能大于今天', status_code=400) + return v + +class ContractSettlementDetailUpdate(BaseModel): + """ + 合同结算明细更新模型 + CONTRACT_SETTLEMENT_DETAIL = "contract_settlement.detail" + """ + id: str = Field(..., description="合同明细ID") + date: DateStr | None = Field(None, description="结算日期", examples=["2024-05-31"]) + quantity: float | None = Field(None, description="合同金额", examples=[0]) + remark: str | None = Field(None, description="填报备注", examples=[""]) + is_complete: bool | None = Field(None, description="是否完成", examples=[False]) + write_off_rate: float | None = Field(None, description="核销率", examples=[0.0]) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus | None = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + if v is None: + return v + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v is None: + return None + if v < 0: + raise HTTPException(status_code=400, detail='合同金额不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v is None: + return None + if v > get_current_date(): + raise HTTPException(detail='结算日期不能大于今天', status_code=400) + return v + +class ContractSettlementDetailBulkUpdate(BaseModel): + detail_list: List[ContractSettlementDetailUpdate] \ No newline at end of file diff --git a/schemas/material/material.py b/schemas/material/material.py new file mode 100644 index 0000000..74dccf6 --- /dev/null +++ b/schemas/material/material.py @@ -0,0 +1,147 @@ +from pydantic import Field, BaseModel,field_validator,model_validator +from fastapi import HTTPException +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID + +class PlanNode(BaseModel): + date: DateStr = Field(..., description="计划节点时间", examples=["2024-01-01"]) + quantity: float = Field(..., description="计划完成量", examples=[100.0]) + is_audit: Optional[bool] = Field(False, description="是否已审核", examples=[False]) + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='计划完成量不能小于等于0') + return v + +class MaterialResponse(BaseResponseWithID): + """ + 供货模型 + """ + id : str = Field(..., description="物资ID", examples=["material123"]) + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: str = Field("", description="所属合同ID", examples=["contract456"]) + show_name: str = Field("", description="展示名称", examples=["主变"]) + material_type: str = Field("", description="物资类型") + contract_quantity: float = Field(0.0, description="合同数量", examples=[1000.0]) + plan_start_quantity: float = Field( + 0.0, description="计划首批到货量", examples=[1000.0] + ) + complete_quantity: float = Field(0.0, description="实际到货累计", examples=[0.0]) + complete_rate: float = Field(0.0, description="实际到货率(%)", examples=[0.0]) + plan_start_date: Optional[DateStr] = Field( + None, description="计划首批到货时间", examples=["2024-01-01"] + ) + plan_complete_date: Optional[DateStr] = Field( + None, description="计划全部到货时间", examples=["2024-06-01"] + ) + actual_start_date: Optional[DateStr] = Field( + None, description="实际首批到货时间", examples=["2024-01-15"] + ) + actual_complete_date: Optional[DateStr] = Field( + None, description="实际全部到货时间", examples=["2024-06-10"] + ) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + status: Optional[int] = Field(None, description="供货状态", examples=[0]) + + # 2025-10-20新增字段,延迟时间 + delay_days: Optional[int] = Field(None, description="延迟时间(天)", examples=[0]) + statistic_date: Optional[DateStr] = Field( + None, description="统计节点截止日期", examples=["2024-05-31"] + ) + +class MaterialCreate(BaseModel): + """ + 创建物资 + MATERIAL_BASE_INFO = "material.base_info" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: str = Field(..., description="所属合同ID", examples=["contract456"]) + show_name: str = Field(..., description="展示名称", examples=["主变"]) + material_type: str = Field(..., description="物资类型") + contract_quantity: float = Field(0.0, description="合同数量", examples=[1000.0]) + + @field_validator("contract_quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='合同数量不能小于0') + return v + +class MaterialUpdate(BaseModel): + """ + 更新物资 + MATERIAL_BASE_INFO = "material.base_info" + """ + id: str = Field(..., description="物资ID", examples=["material123"]) + contract_id: Optional[str] = Field(None, description="所属合同ID", examples=["contract456"]) + show_name: Optional[str] = Field(None, description="展示名称", examples=["主变"]) + + +class MaterialPlanUpdate(BaseModel): + """ + 物资计划更新模型 + MATERIAL_PLAN = "material.plan" + + 业务逻辑说明: + - API要求计划节点时间必须晚于计划首批到货时间(不能等于) + - 自动清理脏数据:如果 plan_node 有2个或以上节点,删除: + 1. 开头节点:如果其 date 等于 plan_start_date + 2. 结尾节点:如果其 date 等于 plan_complete_date + - 这样避免提交包含边界节点的数据导致API报错 + """ + id: str = Field(..., description="物资ID", examples=["material123"]) + plan_start_quantity: Optional[float] = Field( + None, description="计划首批到货量", examples=[1000.0] + ) + plan_start_date: Optional[str] = Field(None, description="计划首批到货时间", examples=["2024-01-01"]) + plan_complete_date: Optional[str] = Field(None, description="计划全部到货时间", examples=["2024-06-01"]) + contract_quantity: float = Field(..., description="合同数量", examples=[1000.0]) + plan_node: Optional[List[PlanNode]] = Field(default_factory=list, description="计划节点列表") + + @field_validator("contract_quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='合同数量不能小于0') + return v + + @field_validator("plan_start_quantity") + def validate_plan_start_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='计划首批到货量不能小于0') + return v + + @model_validator(mode='after') + def clean_plan_nodes(self): + """ + 清理计划节点列表中的边界节点 + + 如果 plan_node 有2个或以上节点,删除: + - 开头节点:date 等于 plan_start_date + - 结尾节点:date 等于 plan_complete_date + + 这避免了API报错“计划节点时间必须晚于计划首批到货时间” + """ + if not self.plan_node or len(self.plan_node) < 2: + return self + + cleaned_nodes = list(self.plan_node) + + # 删除开头的边界节点 + if (self.plan_start_date and + cleaned_nodes and + cleaned_nodes[0].date == self.plan_start_date): + cleaned_nodes.pop(0) + + # 删除结尾的边界节点 + if (self.plan_complete_date and + cleaned_nodes and + cleaned_nodes[-1].date == self.plan_complete_date): + cleaned_nodes.pop() + + self.plan_node = cleaned_nodes + return self \ No newline at end of file diff --git a/schemas/material/material_detail.py b/schemas/material/material_detail.py new file mode 100644 index 0000000..45a8aa2 --- /dev/null +++ b/schemas/material/material_detail.py @@ -0,0 +1,132 @@ +from pydantic import Field, BaseModel,field_validator +from fastapi import HTTPException +from ..common.datetime import get_current_date +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID +from ..common.enums import ApprovalStatus +from datetime import datetime + +class MaterialDetailResponse(BaseResponseWithID): + """ + 物资明细模型,存储在CouchDB中的物资明细文档 + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属物资ID", examples=["material789"]) + date: DateStr = Field(..., description="实际到货日期", examples=["2024-05-31"]) + rate: Optional[float] = Field(None, description="实际到货率(%)", examples=[0.0]) + quantity: float = Field(0.0, ge=0, description="实际到货量累计", examples=[0.0]) + status: Optional[int] = Field(None, description="状态 0:正常 1:超前 -1:延误", examples=[0]) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部到货", examples=[False] + ) + +class MaterialDetailCreate(BaseModel): + """ + 物资明细创建模型 + MATERIAL_DETAIL = "material.detail" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + parent_id: str = Field(..., description="所属物资ID", examples=["material789"]) + quantity: float = Field(0.0, ge=0, description="实际到货量累计", examples=[0.0]) + date: DateStr = Field(..., description="实际到货日期", examples=["2024-05-31"]) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部到货", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + +class MaterialDetailUpdate(BaseModel): + """ + 物资明细更新模型 + MATERIAL_DETAIL = "material.detail" + """ + id: str = Field(..., description="物资明细ID") + quantity: Optional[float] = Field(None, ge=0, description="实际到货量累计", examples=[0.0]) + date: Optional[DateStr] = Field(None, description="实际到货日期", examples=["2024-05-31"]) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部到货", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus | None = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + if v is None: + return v + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v is None: + return None + + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v is None: + return None + + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + +class MaterialDetailBulkUpdate(BaseModel): + detail_list: List[MaterialDetailUpdate] \ No newline at end of file diff --git a/schemas/power/power.py b/schemas/power/power.py new file mode 100644 index 0000000..7273f08 --- /dev/null +++ b/schemas/power/power.py @@ -0,0 +1,144 @@ +from pydantic import Field, BaseModel,field_validator,model_validator +from fastapi import HTTPException +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID + +class PlanNode(BaseModel): + date: DateStr = Field(..., description="计划节点时间", examples=["2024-01-01"]) + quantity: float = Field(..., description="计划完成量", examples=[100.0]) + is_audit: Optional[bool] = Field(False, description="是否已审核", examples=[False]) + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证计划到场人数必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='计划节点人数不能小于0') + return v + +class PowerResponse(BaseResponseWithID): + """ + 力能模型 + """ + code: Optional[str] = Field( + "personnel", + description="力能类型(人员模块拓展为力能模块,可以在本字段保存人员/机具等编码)", + examples=["personnel"], + ) + project_id: str = Field(..., description="所属项目", examples=["project123"]) + contract_id: Optional[str] = Field( + None, + description="所属合同(目前前端页面显示没有按这个字段,仅通过脚本绑定了epc合同,用于接口数据推送。后续行为待讨论)", + examples=["contract456"], + ) + show_name: str = Field("", description="展示名称", examples=["施工班组A"]) + status: Optional[int] = Field(None, description="人员状态", examples=[0]) + plan_attendance: int = Field( + 0, + description="计划出勤人数(暂时定为最后一次报明细时的计划出勤人数)", + examples=[10], + ) + actual_daily_attendance: int = Field(0, description="实际日均出勤", examples=[8]) + attendance_rate: float = Field(0.0, description="出勤率", examples=[0.8]) + statistic_date: Optional[DateStr] = Field( + None, description="统计节点", examples=["2024-05-31"] + ) + plan_exit_date: Optional[DateStr] = Field( + None, description="计划退场时间", examples=["2024-06-30"] + ) + actual_exit_date: Optional[DateStr] = Field( + None, description="实际退场时间", examples=["2024-07-05"] + ) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + plan_start_date: Optional[DateStr] = Field( + None, description="计划首批到场时间", examples=["2024-05-01"] + ) + plan_start_quantity: int = Field(0, description="计划首批到场人数", examples=[5], ge=0) + actual_start_date: Optional[DateStr] = Field( + None, description="实际首批到场时间", examples=["2024-05-02"] + ) + actual_start_quantity: Optional[int] = Field( + None, description="实际首批到场人数", examples=[4] + ) + +class PowerCreate(BaseModel): + """ + 创建力能 + POWER_BASE_INFO = "personnel.base_info" + """ + project_id: str = Field(..., description="所属项目ID", examples=["project123"]) + contract_id: Optional[str] = Field( + None, description="所属合同ID", examples=["contract456"] + ) + #show_name: str = Field(..., description="展示名称", examples=["施工班组A"]) + code: Optional[str] = Field( + "personnel", + description="力能类型(人员模块拓展为力能模块,可以在本字段保存人员/机具等编码)", + examples=["personnel"], + ) + +class PowerUpdate(BaseModel): + """ + 更新力能 + POWER_BASE_INFO = "personnel.base_info" + """ + id: str = Field(..., description="力能ID") + contract_id: Optional[str] = Field( + None, description="所属合同ID", examples=["contract456"] + ) + #show_name: Optional[str] = Field(None, description="展示名称", examples=["施工班组A"]) + +class PowerPlanUpdate(BaseModel): + """ + 力能计划更新模型 + POWER_PLAN = "personnel.plan" + + 业务逻辑说明: + - API要求计划节点时间必须晚于计划首批到场时间(不能等于) + - 自动清理脏数据:如果 plan_node 有2个或以上节点,删除边界节点 + """ + id: str = Field(..., description="力能ID") + plan_start_date: str = Field(..., description="计划首批到场时间") + plan_start_quantity: int = Field(..., description="计划首批到场人数") + plan_exit_date: DateStr = Field( + ..., description="计划退场时间", examples=["2024-06-30"] + ) + plan_node: List[PlanNode] = Field(default_factory=list, description="计划节点列表") + + @field_validator("plan_start_quantity") + def validate_quantity(cls, v): + """验证计划首批到场人数必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='计划首批进场人数必须大于等于0') + return v + + @model_validator(mode='after') + def clean_plan_nodes(self): + """ + 清理计划节点列表中的边界节点 + + 如果 plan_node 有2个或以上节点,删除: + - 开头节点:date 等于 plan_start_date + - 结尾节点:date 等于 plan_exit_date + + 这避免了API报错“计划节点时间必须晚于计划首批到场时间” + """ + if not self.plan_node or len(self.plan_node) < 2: + return self + + cleaned_nodes = list(self.plan_node) + + # 删除开头的边界节点 + if (self.plan_start_date and + cleaned_nodes and + cleaned_nodes[0].date == self.plan_start_date): + cleaned_nodes.pop(0) + + # 删除结尾的边界节点 + if (self.plan_exit_date and + cleaned_nodes and + cleaned_nodes[-1].date == self.plan_exit_date): + cleaned_nodes.pop() + + self.plan_node = cleaned_nodes + return self \ No newline at end of file diff --git a/schemas/power/power_detail.py b/schemas/power/power_detail.py new file mode 100644 index 0000000..7f3baf7 --- /dev/null +++ b/schemas/power/power_detail.py @@ -0,0 +1,133 @@ +from pydantic import Field, BaseModel,field_validator +from fastapi import HTTPException +from ..common.datetime import get_current_date +from typing import List, Optional, Literal +from ..common.validators import DateStr +from ..common.base import BaseResponseWithID +from ..common.enums import ApprovalStatus +from datetime import datetime + +class PowerDetail(BaseResponseWithID): + """ + 力能配置明细 + """ + project_id: str = Field(..., description="所属项目", examples=["project123"]) + parent_id: str = Field(..., description="所属力能配置ID", examples=["personnel789"]) + date: DateStr = Field(..., description="本次日期", examples=["2024-05-31"]) + quantity: int = Field(..., description="累计完成量", examples=[0], ge=0) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部退场", examples=[False] + ) + change_count: int = Field(0, description="变更次数", examples=[0]) + status: Optional[int] = Field(None, description="进度状态", examples=[0]) + rate: Optional[float] = Field(None, description="出勤率", examples=[0]) + +class PowerDetailCreate(BaseModel): + """ + 力能配置明细创建模型 + POWER_DETAIL = "power.detail" + """ + project_id: str = Field(..., description="所属项目", examples=["project123"]) + parent_id: str = Field(..., description="所属力能配置ID", examples=["personnel789"]) + date: DateStr = Field(..., description="本次日期", examples=["2024-05-31"]) + quantity: int = Field(..., description="累计完成量", examples=[0], ge=0) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部退场", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + +class PowerDetailUpdate(BaseModel): + """ + 力能配置明细更新模型 + POWER_DETAIL = "power.detail" + """ + id: str = Field(..., description="力能配置明细ID") + date: Optional[DateStr] = Field(None, description="本次日期", examples=["2024-05-31"]) + quantity: Optional[int] = Field(None, description="累计完成量", examples=[0], ge=0) + remark: Optional[str] = Field(None, description="填报备注", examples=[""]) + is_complete: Optional[bool] = Field( + None, description="是否为全部退场", examples=[False] + ) + confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"]) + approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"]) + approval_status: ApprovalStatus | None = Field("registered", description="审批状态", examples=["registered"]) + + @field_validator("approval_status") + def validate_approval_status(cls, v): + """验证审批字段""" + if v is None: + return v + try: + return ApprovalStatus(v) # 尝试转换 + except ValueError: + raise HTTPException(400, f"审批状态 '{v}' 无效") + + @field_validator("confirmation_time", "approval_time") + def validate_time(cls, v): + """验证时间""" + if v is None: + return v + + try: + datetime.strptime(v, "%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400) + return v + + @field_validator("quantity") + def validate_quantity(cls, v): + """验证实际完成量累计必须为非负数""" + if v is None: + return None + + if v < 0: + raise HTTPException(status_code=400, detail='实际完成量累计不能小于0') + return v + + @field_validator("date") + def validate_date(cls, v): + if v is None: + return None + + if v > get_current_date(): + raise HTTPException(detail='节点日期不能大于今天', status_code=400) + return v + +class PowerDetailBulkUpdate(BaseModel): + detail_list: List[PowerDetailUpdate] \ No newline at end of file diff --git a/schemas/project/enums.py b/schemas/project/enums.py new file mode 100644 index 0000000..5aadb35 --- /dev/null +++ b/schemas/project/enums.py @@ -0,0 +1,30 @@ +from enum import Enum +from pydantic import BaseModel, Field + +class ProgressType(str, Enum): + """推进分类枚举""" + A = "A" + B = "B" + C = "C" + +class KeyConstraints(str, Enum): + NONE = "NONE" + LAND = "LAND" + TRANSMISSION = "TRANSMISSION" + BOTH = "BOTH" + QT = "QT" + +class DBTCSCORE(BaseModel): + year: str = Field(..., description="评分年份, yyyy格式") + is_jg: bool = Field(..., description="是否为工达标投产") + score: float = Field(..., description="集团考核评分") + +class ProjectType(str, Enum): + """项目类型枚举""" + PHOTOVOLTAIC = "photovoltaic" # 光伏 + OFFSHORE_WIND = "offshore_wind" # 海风 + ONSHORE_WIND = "onshore_wind" # 陆风 + HYDROPOWER = "hydropower" # 水电 + THERMAL_POWER = "thermal_power" # 火电 + PUMPED_STORAGE = "pumped_storage" # 抽蓄 + GAS_TURBINE = "gas_turbine" # 气电 \ No newline at end of file diff --git a/schemas/project/project.py b/schemas/project/project.py new file mode 100644 index 0000000..338b083 --- /dev/null +++ b/schemas/project/project.py @@ -0,0 +1,76 @@ +""" +项目全部信息的增删查改模板,聚合了项目相关schema +""" + +from pydantic import BaseModel, Field, field_serializer +from typing import Optional +from .project_base import ( + ProjectResponseBase, + ProjectEnsureCapacity, + ProjectClimbCapacity, + ProjectChallengeCapacity, + ProjectActualConstruction, + ProjectPlanConstruction, + ProjectInvestmentDecision, + ProjectKeyConstraints, + ProjectProductionCapacity, + ProjectCompleteInvestment, + ProjectDynamicInvestment +) +from ..project_extensions.preparation import PreparationDetail +from ..project_extensions.production import ProductionDetail +from ..project_extensions.project_detail import ProjectDetailProject +from ..project_extensions.generator_unit import ( + GeneratorUnitProject, + PostGeneratorUnits +) +from ..project_extensions.lar import ( + LarDetailSchema, + LarChangeListSchema, + LarChangeUpdateSchema, + LarMainInfoUpdateSchema, + LarResettlementSchema, + LarInvestmentSchema, LarChangeDetailSchema +) +from ..project_extensions.contract_change import ( + ContractChangeResponse, + PostContractChange +) + +from ..project_multi_type import ( + PhotovoltaicExtension, + OnShoreWindExtension, + OffShoreWindExtension, + HydropowerExtension, + PumpedStorageExtension, + GasTurbineExtension, + ThermalPowerExtension +) + + +class ProjectInfoResponse(BaseModel): + """ + 项目全部信息响应模型 + """ + + project: ProjectResponseBase = Field(..., description="项目基本信息") + project_detail: list[ProjectDetailProject] = Field(..., description="项目容量信息") + generator_units: list[GeneratorUnitProject] = Field(..., description="发电单元信息列表(仅限水电、抽蓄、煤电、气电)") + lar: Optional[LarDetailSchema] = Field(None, description="移民征地信息(仅限水电、抽蓄)") + lar_change: list[LarChangeDetailSchema] = Field(default_factory=list, description="移民变更信息列表(仅限水电、抽蓄)") + contract_changes: list[ContractChangeResponse] = Field(..., description="合同变更信息列表(仅限水电、抽蓄、煤电、气电)") + + # 扩展字段 + photovoltaic_extension: PhotovoltaicExtension | None = Field(None, description="光伏项目扩展信息") + onshore_wind_extension: OnShoreWindExtension | None = Field(None, description="陆风项目扩展信息") + offshore_wind_extension: OffShoreWindExtension | None = Field(None, description="海风项目扩展信息") + hydropower_extension: HydropowerExtension | None = Field(None, description="水电项目扩展信息") + pumped_storage_extension: PumpedStorageExtension | None = Field(None, description="抽蓄项目扩展信息") + gas_turbine_extension: GasTurbineExtension | None = Field(None, description="燃气轮机项目扩展信息") + thermal_power_extension: ThermalPowerExtension | None = Field(None, description="火电项目扩展信息") + + # 投产节点 + production_list: list[ProductionDetail] = Field(default_factory=list, description="投产节点列表") + # 里程碑节点 + preparation_list: list[PreparationDetail] = Field(default_factory=list, description="里程碑节点列表") + diff --git a/schemas/project/project_base.py b/schemas/project/project_base.py new file mode 100644 index 0000000..343d6bd --- /dev/null +++ b/schemas/project/project_base.py @@ -0,0 +1,355 @@ +""" +项目数据推送相关schema +""" + +from typing import List, Optional + +from fastapi import HTTPException +from pydantic import Field, BaseModel, field_validator +from ..common.push_system import BaseUpdateRequestSchema +from ..common.base import BaseResponseWithID +from ..common.datetime import get_current_date +from ..common.validators import DateStr +from .enums import ProgressType, KeyConstraints, DBTCSCORE + +class ProjectResponseBase(BaseResponseWithID): + """ + 项目基础信息, 复制自project_model + 不进行继承,通过检查器确保字段和模型一致 + """ + # 基础信息-不允许更改 + id : str = Field(..., description="项目ID", examples=["uuid"]) + project_type: str = Field("", description="项目类型") + region_name: List[str] = Field(default_factory=list, description="项目所属区域名称", examples=[["华东", "江苏"]]) + region_path: List[str] = Field(default_factory=list, description="项目所属区域路径", examples=[["110000", "120000", "120001"]]) + province: str = Field("", description="省份(region_path第一个)", examples=["110000"]) + is_domestic :bool=Field(True, description="是否是国内项目") + company_id: str = Field("", description="所属公司ID", examples=["company123"]) + company_name: str = Field("", description="所属公司名称", examples=["国电投江苏公司"]) + syxs: Optional[str] = Field(None, description="升压站型式") + sub_type: Optional[str] = Field(None, description="光伏类别") + scgc_type: Optional[str] = Field(None, description="送出工程建设方式") + + # 基础信息-允许更改 + address: str = Field("", description="项目地址", examples=["某省某市某区"]) + code: str = Field("", description="项目编码", examples=["XM2025001"]) + name: str = Field(..., description="项目名称", examples=["XX新能源项目"]) + short_name: str = Field("", description="项目简称", examples=["XX项目"]) + manager_name: str = Field("", description="负责人姓名", examples=["张三"]) + manager_phone: str = Field("", description="负责人电话", examples=["13800000000"]) + + + # 容量信息 + authorization_date: Optional[DateStr] = Field(None, description="核准日期", examples=["2024-01-01"]) + authorized_capacity: float = Field(0.0, description="核准容量(万千瓦)", examples=[10.0]) + # 投决 + investment_decision_capacity: Optional[float] = Field(None, description="投资决策容量", examples=[8.0]) + investment_decision_date: Optional[DateStr] = Field(None, description="投资决策日期", examples=["2024-02-01"]) + # 开工 + plan_construction_capacity: float = Field(0.0, description="本年度计划开工容量", examples=[5.0]) + plan_construction_date: Optional[DateStr] = Field(None, description="本年度计划开工日期", examples=["2024-03-01"]) + actual_construction_capacity: float = Field(0.0, description="本年度实际开工容量", examples=[4.0]) + actual_construction_date: Optional[DateStr] = Field(None, description="本年度实际开工日期", examples=["2024-04-01"]) + accumulated_construction_capacity: float = Field(0.0, description="累计开工容量", examples=[12.0]) + constructing_capacity: float = Field(0.0, description="在建容量", examples=[6.0]) + + # 投产 + ensure_production_capacity: float = Field(0.0, description="本年度确保投产容量", examples=[3.0]) + challenge_production_capacity: float = Field(0.0, description="本年度揭榜投产容量", examples=[2.0]) + climb_production_capacity: float = Field(0.0, description="本年度登高投产容量", examples=[1.0]) + plan_production_date: Optional[DateStr] = Field(None, description="计划投产日期", examples=["2024-08-01"]) + plan_full_production_date: Optional[DateStr] = Field(None, description="计划全部投产日期", examples=["2024-09-01"]) + actual_production_date: Optional[DateStr] = Field(None, description="实际投产日期", examples=["2024-08-15"]) + actual_full_production_date: Optional[DateStr] = Field(None, description="实际全投日期", examples=["2024-09-10"]) + production_capacity: Optional[float] = Field(0.0, description="本年度投产容量", examples=[2.0]) + production_date: Optional[DateStr] = Field(None, description="本年度首批投产日期", examples=["2024-09-01"]) + total_production_capacity: Optional[float] = Field(0.0, description="全部投产容量", examples=[2.0]) + + # 投资 + dynamic_investment: float = Field(0.0, description="动态总投资", examples=[100000.0]) + complete_investment: float = Field(0.0, description="完成投资", examples=[80000.0]) + + # 其他信息 + progress_type: ProgressType = Field(..., description="推进分类", examples=[ProgressType.A]) + key_constraints: KeyConstraints = Field(KeyConstraints.NONE, description="关键制约", examples=[KeyConstraints.NONE]) + key_constraints_remark: Optional[str] = Field("", description="关键制约备注", examples=["无"]) + status: Optional[str] = Field(None, description="项目状态") + apply_file_ids: List[str] = Field(default_factory=list, description="申请表附件ID列表", examples=[[]]) + + # 拓展信息 + dbtc_score_list: Optional[list] = Field(default_factory=list, description='达标投产评分列表') # 这里项目用的是list而不是List + + + +class ProjectResponseBaseList(BaseModel): + page: int + page_size: int + total: int + list: List[ProjectResponseBase] = [] + + + + +# ==================== Update ==================== + +class KeyConstraintsRemarkMixin: + """关键制约备注校验混入类""" + + @field_validator("key_constraints_remark") + def validate_key_constraints_remark(cls, v): + if v is None: + return v + if len(v) > 500: + raise HTTPException(detail="关键制约备注不能超过500个字符", status_code=400) + return v + +class AuthorizationDateMixin: + """关键制约备注校验混入类""" + + @field_validator("authorization_date") + def validate_actual_date(cls, v): + if v is None: + return v + if v > get_current_date(): + raise HTTPException(detail='核准/备案日期不能大于今天', status_code=400) + return v + +class ProjectBaseInfoUpdate(BaseModel, KeyConstraintsRemarkMixin, AuthorizationDateMixin): + """ + 项目基本信息 PROJECT_BASE_INFO + """ + # 基础信息-允许更改 + id: str = Field(..., description="项目id", examples=["uuid"]) + address: str | None = Field(None, description="项目地址", examples=["某省某市某区"]) + code: str | None = Field(None, description="项目编码", examples=["XM2025001"]) + name: str = Field(..., description="项目名称", examples=["XX新能源项目"]) + short_name: str | None = Field(None, description="项目简称", examples=["XX项目"]) + manager_name: str | None = Field(None, description="负责人姓名", examples=["张三"]) + manager_phone: str | None = Field(None, description="负责人电话", examples=["13800000000"]) + # 其他信息 + progress_type: ProgressType = Field(..., description="推进分类", examples=[ProgressType.A]) + key_constraints: KeyConstraints | None = Field(None, description="关键制约", examples=[KeyConstraints.NONE]) + key_constraints_remark: str | None = Field(None, description="关键制约备注", examples=["无"]) + apply_file_ids: List[str] | None = Field(None, description="申请表附件ID列表", examples=[[]]) + # 拓展信息 + dbtc_score_list: list[DBTCSCORE] | None = Field(None, description='达标投产评分列表') # 这里项目用的是list而不是List + + # 核准 + authorization_date: DateStr | None = Field(None, description="核准日期", examples=["2024-01-01"]) + authorized_capacity: float | None = Field(None, description="核准容量(万千瓦)", examples=[10.0]) + + + +class _ProductionPlanNode(BaseModel): + year: int = Field(..., description="计划年份", examples=[2024]) + capacity: float = Field(..., description="确保投产容量", examples=[3.0]) + +class ProjectEnsureCapacity(BaseModel): + """ + PROJECT_ENSURE_CAPACITY + 填写项目确保投产容量列表,系统根据列表自动计算ensure_production_capacity字段 + """ + # 确保投产容量 + ensure_production_capacity_list : list[_ProductionPlanNode] = Field(..., description="确保投产容量列表(每次必须填写全部)") + +class ProjectClimbCapacity(BaseModel): + """ + PROJECT_CLIMB_CAPACITY + 填写项目登高投产容量列表,系统根据列表自动计算climb_production_capacity字段 + """ + # 登高投产容量 + climb_production_capacity_list : list[_ProductionPlanNode] = Field(..., description="登高投产容量列表(每次必须填写全部)") +class ProjectChallengeCapacity(BaseModel): + """ + PROJECT_CHALLENGE_CAPACITY + 填写项目揭榜投产容量列表,系统根据列表自动计算challenge_production_capacity字段 + """ + # 揭榜投产容量 + challenge_production_capacity_list : list[_ProductionPlanNode] = Field(..., description="揭榜投产容量列表(每次必须填写全部)") + + + +class _ActualNodeData(BaseModel): + capacity: float = Field(..., description="实际节点容量", examples=[4.0]) + date: DateStr = Field(..., description="实际节点日期", examples=["2024-04-01"]) +class ProjectActualConstruction(BaseModel): + """ + PROJECT_ACTUAL_CONSTRUCTION + 项目实际开工节点 + + 系统根据实际开工节点自动计算以下字段: + actual_construction_capacity 本年度实际开工容量 + actual_construction_date 本年度实际开工日期 + accumulated_construction_capacity 累计开工容量 + constructing_capacity 在建容量 + """ + actual_construction_list : list[_ActualNodeData] | None = Field(None, description="实际开工节点列表(每次必须填写全部)") + +class _PlanNodeData(BaseModel): + capacity: float = Field(..., description="计划节点容量", examples=[5.0]) + date: DateStr = Field(..., description="本年度计日期", examples=["2024-03-01"]) + + @field_validator("capacity") + def validate_capacity(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="节点容量必须大于等于0") + return v + +class ProjectPlanConstruction(BaseModel): + """ + PROJECT_PLAN_CONSTRUCTION + 项目计划开工节点 + + 系统根据计划开工节点自动计算: + plan_construction_capacity 本年度计划开工容量 + plan_construction_date 本年度计划开工日期 + """ + plan_construction_list : list[_PlanNodeData] | None = Field(None, description="计划开工节点列表(每次必须填写全部)") + +class ProjectInvestmentDecision(BaseModel): + """ + PROJECT_INVESTMENT_DECISION + 投资决策容量和日期 + """ + investment_decision_capacity: float = Field(..., description="投资决策容量", examples=[8.0]) + investment_decision_date: DateStr = Field(..., description="投资决策日期", examples=["2024-02-01"]) + + @field_validator("investment_decision_date") + def validate_investment_decision_date(cls, v): + if v is None: + return v + if v > get_current_date(): + raise HTTPException(detail='投资决策日期不能大于今天', status_code=400) + return v + @field_validator("investment_decision_capacity") + def validate_investment_decision_capacity(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="投资决策容量必须大于等于0") + return v + +class ProjectKeyConstraints(BaseModel, KeyConstraintsRemarkMixin): + """ + PROJECT_KEY_CONSTRAINTS + 关键制约 + """ + key_constraints: KeyConstraints | None = Field(None, description="关键制约", examples=[KeyConstraints.NONE]) + key_constraints_remark: str | None = Field(None, description="关键制约备注", examples=["无"]) + +class _ActualProductionNode(BaseModel): + capacity: float = Field(..., description="实际投产容量", examples=[2.0]) + date: DateStr = Field(..., description="实际投产日期", examples=["2024-08-15"]) + + @field_validator("capacity") + def validate_capacity(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="实际投产容量必须大于等于0") + return v + + @field_validator("date") + def validate_date(cls, v): + if v is None: + return v + if v > get_current_date(): + raise HTTPException(detail='实际投产日期不能大于今天', status_code=400) + return v + +class ProjectProductionCapacity(BaseModel): + """ + PROJECT_PRODUCTION_CAPACITY + 填写项目投产数据 + 每个项目在各年份或一年内可能有多次实际投产 + 系统会根据投产节点列表数据,自动计算 + production_capacity 本年度投产容量 + production_date 本年度首批投产日期 + total_production_capacity 全部投产容量 + """ + plan_production_date: DateStr | None = Field(None, description="集团公司计划投产日期", examples=["2024-08-01"]) + plan_full_production_date: DateStr | None = Field(None, description="集团公司计划全部投产日期", examples=["2024-09-01"]) + ic_plan_first_production_date: DateStr | None = Field(None, description="区域公司计划首批投产日期(只有新能源需要)",examples=["2024-08-01"]) + ic_plan_full_production_date: DateStr | None = Field(None, description="区域公司计划全投日期(只有新能源需要)",examples=["2024-09-01"]) + actual_production_date: DateStr | None = Field(None, description="实际投产日期(只有新能源需要)", examples=["2024-08-15"]) + actual_full_production_date: DateStr | None = Field(None, description="实际全投日期(只有新能源需要)", examples=["2024-09-10"]) + actual_production_list : list[_ActualProductionNode] | None = Field(None, description="实际投产节点列表(每次必须填写全部)(只有新能源需要)") + @field_validator("actual_production_date") + def validate_actual_production_date(cls, v): + if v is None: + return v + if v > get_current_date(): + raise HTTPException(detail='实际投产日期不能大于今天', status_code=400) + return v + + @field_validator("actual_full_production_date") + def validate_actual_full_production_date(cls, v): + if v is None: + return v + if v > get_current_date(): + raise HTTPException(detail='实际全投日期不能大于今天', status_code=400) + return v + +class ProjectCompleteInvestment(BaseModel): + """ + PROJECT_COMPLETE_INVESTMENT + 完成投资投资 + """ + + complete_investment: float = Field(..., description="完成投资", examples=[80000.0]) + + @field_validator("complete_investment") + def validate_complete_investment(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400,detail="完成投资必须大于等于0") + return v + +class ProjectSettlementInvestment(BaseModel): + """ + PROJECT_SETTLEMENT_INVESTMENT + 合同结算投资情况 + """ + + implementation_estimate: float = Field(..., description="执行概算", examples=[80000.0]) + static_total_investment: float = Field(..., description="静态总投资", examples=[80000.0]) + completed_investment: float = Field(..., description="完成投资", examples=[80000.0]) + dynamic_investment: float = Field(..., description="动态总投资", examples=[80000.0]) + + @field_validator("implementation_estimate") + def validate_implementation_estimate(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400,detail="执行概算必须大于等于0") + return v + + @field_validator("static_total_investment") + def validate_static_total_investment(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="静态总投资必须大于等于0") + return v + + @field_validator("completed_investment") + def validate_completed_investment(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="完成投资必须大于等于0") + return v + + @field_validator("dynamic_investment") + def validate_dynamic_investment(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="动态总投资必须大于等于0") + return v + +class ProjectDynamicInvestment(BaseModel): + """ + PROJECT_DYNAMIC_INVESTMENT + """ + # 动态总投资 + dynamic_investment: float | None = Field(None, description="动态总投资", examples=[100000.0]) + + @field_validator("dynamic_investment") + def validate_dynamic_investment(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="动态总投资必须大于等于0") + return v + +# ======================= 水电抽蓄专用 ============================= + + +# ==================== 枚举说明 用于文档自动生成 ==================== + diff --git a/schemas/project_extensions/contract_change.py b/schemas/project_extensions/contract_change.py new file mode 100644 index 0000000..703321d --- /dev/null +++ b/schemas/project_extensions/contract_change.py @@ -0,0 +1,75 @@ +""" +contract_change相关schemea +""" +from ..common.validators import DateStr +from pydantic import BaseModel, Field +from typing import Optional +from ..common.base import BaseResponseWithID +from pydantic import field_validator +from fastapi import HTTPException + +class ContractChangeResponse(BaseResponseWithID): + """ + 合同变更模型 + """ + id: Optional[str] = Field(default=None, description="合同变更ID") + project_id : Optional[str] = Field(None, description="所属项目ID") + contract_id: Optional[str] = Field(None, description="关联合同ID") + name: Optional[str] = Field(None, description="合同名称") + sub_name: Optional[str] = Field(None, description="合同子标题(epc合同和pc合同会有子标题)") + sign_company:Optional[str] = Field(None, description="签约公司") + title: Optional[str] = Field(None, description="变更事项") + reason: Optional[str] = Field(None, description="变更理由") + before_amount: Optional[float] = Field(None, description="变更前金额") + after_amount: Optional[float] = Field(None, description="变更后金额") + change_count: Optional[float] = Field(None, description="变更金额") + change_rate: Optional[str] = Field(None, description="变更比例") + change_time: Optional[str] = Field(None, description="变更时间(格式:YYYY-MM-DD)") + attachment_ids:Optional[list] = Field(None, description="附件ID列表") + attachment_names:Optional[list] = Field(None, description="附件名称列表") + created_at:Optional[str]=Field(None, description="创建时间") + created_by_name: Optional[str] = Field(None, description="创建人名称") + +class PostContractChange(BaseModel): + """ + 合同变更请求(水火抽蓄气电) + PROJECT_CONTRACT_CHANGE = "project.contract-change" + """ + + + id: str = Field(..., description="合同变更ID,更新时传入,创建时不传") + project_id: str = Field(..., description="所属项目ID") + contract_id: str = Field(..., description="合同ID") + title: str = Field(..., description="变更事项") + reason: str = Field(..., description="变更理由") + before_amount: float = Field(..., description="变更前金额") + after_amount: float = Field(..., description="变更后金额") + change_time: DateStr = Field(..., description="变更时间(格式:YYYY-MM-DD)") + attachment_ids: list = Field(..., description="附件ID列表") + + @field_validator("after_amount") + def validate_after_amount(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="变更后金额必须小于等于0") + return v + +class CreateContractChange(BaseModel): + """ + 创建合同变更请求(水火抽蓄气电) + PROJECT_CONTRACT_CHANGE = "project.contract-change" + """ + + project_id: str = Field(..., description="所属项目ID") + contract_id: str = Field(..., description="合同ID") + title: str = Field(..., description="变更事项") + reason: str = Field(..., description="变更理由") + before_amount: float = Field(..., description="变更前金额") + after_amount: float = Field(..., description="变更后金额") + change_time: DateStr = Field(..., description="变更时间(格式:YYYY-MM-DD)") + attachment_ids: list = Field(..., description="附件ID列表") + + @field_validator("after_amount") + def validate_after_amount(cls, v: float) -> float: + if v < 0: + raise HTTPException(status_code=400, detail="变更后金额不能小于0") + return v diff --git a/schemas/project_extensions/generator_unit.py b/schemas/project_extensions/generator_unit.py new file mode 100644 index 0000000..82542f3 --- /dev/null +++ b/schemas/project_extensions/generator_unit.py @@ -0,0 +1,34 @@ +from pydantic import BaseModel, Field,field_validator +from typing import Optional +from ..common.base import BaseResponseWithID +from ..common.datetime import datetime_date,get_current_date +from fastapi import HTTPException + +class GeneratorUnitProject(BaseResponseWithID): + project_id : Optional[str]= Field(None, description="项目ID") + serial_number: Optional[int] = Field(None, description="机组序号") + approval_status:Optional[str]=Field(None, description="审批状态") + capacity: Optional[float] = Field(None, description="单机容量(MW)") + plan_production_date: Optional[str] = Field(None, description="计划投产日期") + actual_production_date: Optional[str] = Field(None, description="实际投产日期") + +class PostGeneratorUnits(BaseModel): + model_config = {"populate_by_name": True} + + id:str = Field(..., description="机组ID") + project_id: str = Field(..., description="所属项目ID") + actual_production_date: str = Field(..., alias="actual_date", description="实际投产日期(格式:YYYY-MM-DD)") + + @field_validator('actual_production_date', mode="before") + def validate_actual_date_not_future(cls, v: str) -> str: + if v == "": + return "" + try: + actual = datetime_date(v) + except ValueError: + raise HTTPException(status_code=400,detail='日期格式为(YYYY-MM-DD)') + + today = datetime_date(get_current_date()) + if actual > today: + raise HTTPException(status_code=400,detail='机组日期不能晚于今天') + return v \ No newline at end of file diff --git a/schemas/project_extensions/lar.py b/schemas/project_extensions/lar.py new file mode 100644 index 0000000..046a008 --- /dev/null +++ b/schemas/project_extensions/lar.py @@ -0,0 +1,206 @@ +""" +移民征地相关schema +""" + +from pydantic import BaseModel, Field, field_validator +from typing import Optional, List +from ..common.base import BaseResponseWithID +from ..common.validators import DateStr +from ..common.datetime import get_current_date + + +class LarDetailSchema(BaseResponseWithID): + id: str = Field(..., description="移民征地id") + project_id: Optional[str] = Field(None, description="项目ID") + plan_resettlement_pop: Optional[int] = Field(None, description="计划搬迁人数") + completed_resettlement_pop: Optional[int] = Field(None, description="完成搬迁人数") + + plan_investment_amt: Optional[float] = Field(None, description="计划投资金额 ") + completed_investment_amt: Optional[float] = Field(None, description="完成投资金额 ") + + plan_urban_comp: Optional[float] = Field(None, description="计划城镇补偿金额 ") + actual_urban_comp: Optional[float] = Field(None, description="实际城镇补偿金额 ") + + plan_rural_comp: Optional[float] = Field(None, description="计划农村补偿金额 ") + actual_rural_comp: Optional[float] = Field(None, description="实际农村补偿金额 ") + + plan_spec_project_reconstr: Optional[float] = Field(None, description="计划专项工程复建 ") + actual_spec_project_reconstr: Optional[float] = Field(None, description="实际专项工程复建 ") + + plan_reservoir_bottom_cleanup: Optional[float] = Field(None, description="计划库底清理 ") + actual_reservoir_bottom_cleanup: Optional[float] = Field(None, description="实际库底清理 ") + + +class LarMainInfoUpdateSchema(BaseResponseWithID): + id: str = Field(..., description="移民征地id") + project_id: str = Field(..., description="项目id") + + plan_urban_comp: float = Field(..., description="计划城镇补偿金额 ") + actual_urban_comp: float = Field(..., description="实际城镇补偿金额 ") + + plan_rural_comp: float = Field(..., description="计划农村补偿金额 ") + actual_rural_comp: float = Field(..., description="实际农村补偿金额 ") + + plan_spec_project_reconstr: float = Field(..., description="计划专项工程复建 ") + actual_spec_project_reconstr: float = Field(..., description="实际专项工程复建 ") + + plan_reservoir_bottom_cleanup: float = Field(..., description="计划库底清理 ") + actual_reservoir_bottom_cleanup: float = Field(..., description="实际库底清理 ") + + @field_validator( + "plan_urban_comp", + "actual_urban_comp", + "plan_rural_comp", + "actual_rural_comp", + "plan_spec_project_reconstr", + "actual_spec_project_reconstr", + "plan_reservoir_bottom_cleanup", + "actual_reservoir_bottom_cleanup", + mode="before", + ) + def check_amount_field(cls, v): + from fastapi import HTTPException + if v is None or v == "": + raise HTTPException(detail='金额字段不能为空', status_code=400) + if float(v) < 0: + raise HTTPException(detail='金额字段需大于等于0', status_code=400) + return v + + +class LarResettlementSchema(BaseResponseWithID): + id: str = Field(..., description="移民征地id") + project_id: str = Field(..., description="项目id") + + plan_resettlement_pop: int = Field(..., description="计划搬迁人数") + completed_resettlement_pop: int = Field(..., description="完成搬迁人数") + + @field_validator( + "plan_resettlement_pop", + "completed_resettlement_pop", + mode="before", + ) + def check_amount_field(cls, v): + from fastapi import HTTPException + if v is None or v == "": + raise HTTPException(detail='搬迁人数不能为空', status_code=400) + if float(v) < 0: + raise HTTPException(detail='搬迁人数需大于等于0', status_code=400) + return v + + +class LarInvestmentSchema(BaseResponseWithID): + id: str = Field(..., description="移民征地id") + project_id: str = Field(..., description="项目id") + + plan_investment_amt: float = Field(..., description="计划投资金额") + completed_investment_amt: float = Field(..., description="完成投资金额") + + @field_validator( + "plan_investment_amt", + "completed_investment_amt", + mode="before", + ) + def check_amount_field(cls, v): + from fastapi import HTTPException + if v is None or v == "": + raise HTTPException(detail='金额字段不能为空', status_code=400) + if float(v) < 0: + raise HTTPException(detail='金额字段数需大于等于0', status_code=400) + return v + + +class LarChangeDetailSchema(BaseResponseWithID): + project_id: str = Field(..., description="项目ID") + title: Optional[str] = Field(None, description="变更事项") + reason: Optional[str] = Field(None, description="变更理由") + + before_amount: Optional[float] = Field(None, description="变更前金额") + after_amount: Optional[float] = Field(None, description="变更后金额") + + change_time: Optional[str] = Field(None, description="变更时间") + attachment_ids: List[str] = Field(default_factory=list, description="附件ID列表", examples=[[]]) + + created_at: Optional[str] = Field(None, description="创建时间") + created_by_name: Optional[str] = Field(None, description="创建人") + + change_amount: Optional[float] = Field(None, description="变更金额") + change_percentage: Optional[str] = Field('', description="变更比例") + + approval_status: Optional[str] = Field(None, description="审批状态") + + attachment_info: List[dict] = Field( + default_factory=list, description="文件信息", examples=[[ + { + "id": "54a0daf903a04c8e87cea1175458459d", + "name": "54a0daf903a04c8e87cea1175458459d.pdf", + "original_name": "新用户注册申请表-项目公司.pdf", + "url": "/api/file_download/54a0daf903a04c8e87cea1175458459d" + } + ]] + ) + + +class LarChangeInfoSchema(BaseResponseWithID): + title: Optional[str] = Field(None, description="变更事项") + reason: Optional[str] = Field(None, description="变更理由") + + before_amount: Optional[float] = Field(None, description="变更前金额") + after_amount: Optional[float] = Field(None, description="变更后金额") + + change_time: Optional[str] = Field(None, description="变更时间") + attachment_ids: List[str] = Field(default_factory=list, description="附件ID列表", examples=[[]]) + + approval_status: Optional[str] = Field(None, description="审批状态") + + before_amount_is_edit: Optional[bool] = Field(None, description="变更前金额是否可编辑") + + changed_count: Optional[int] = Field(None, description="已办更次数") + + +class LarChangeListSchema(BaseModel): + page: int + page_size: int + total: int + list: List[LarChangeDetailSchema] + + +class LarChangeCreateSchema(BaseModel): + title: str = Field(..., description="变更事项") + reason: str = Field(..., description="变更理由") + + before_amount: float = Field(..., description="变更前金额") + after_amount: float = Field(..., description="变更后金额") + + change_time: DateStr = Field(..., description="变更时间") + attachment_ids: List[str] = Field(default_factory=list, description="附件ID列表", examples=[[]]) + + project_id: str = Field(..., description="项目id") + + @field_validator( + "before_amount", + "after_amount", + mode="before", + ) + def check_amount_field(cls, v): + from fastapi import HTTPException + if v is None or v == "": + raise HTTPException(detail='金额字段不能为空', status_code=400) + if float(v) < 0: + raise HTTPException(detail='金额字段需大于等于0', status_code=400) + return v + + @field_validator( + "change_time", + mode="before", + ) + def check_actual_time_field(cls, v): + from fastapi import HTTPException + if v is None or v == "": + raise HTTPException(detail='移民变更时间必填', status_code=400) + if v > get_current_date(): + raise HTTPException(detail='移民变更时间不能大于当前日期', status_code=400) + return v + + +class LarChangeUpdateSchema(LarChangeCreateSchema): + id: str = Field(..., description="移民变更id") diff --git a/schemas/project_extensions/preparation.py b/schemas/project_extensions/preparation.py new file mode 100644 index 0000000..52f9d86 --- /dev/null +++ b/schemas/project_extensions/preparation.py @@ -0,0 +1,39 @@ +from pydantic import BaseModel, Field,field_validator +from typing import Optional + +from ..common.base import BaseResponseWithID +from ..common.datetime import datetime_date,get_current_date +from fastapi import HTTPException +from ..common.validators import DateStr + +class PostPreparation(BaseModel): + id:str = Field(..., description="里程碑ID") + code: str= Field(..., description="里程碑的节点编码") + acquire_date: DateStr|None = Field(None,description="取得时间") + is_exist: bool= Field(..., description="是否取得") + + @field_validator('acquire_date') + def validate_acquire_date(cls, v: Optional[DateStr]) -> Optional[DateStr]: + if v is None: + return None + try: + actual = datetime_date(v) + except ValueError: + raise HTTPException(status_code=400,detail='日期格式为(YYYY-MM-DD)') + + today = datetime_date(get_current_date()) + if actual > today: + raise HTTPException(status_code=400,detail='取得时间不能晚于今天') + return v + + +class PreparationDetail(BaseResponseWithID): + id: Optional[str] = Field(None, description="里程碑ID") + project_id: Optional[str] = Field(None, description="项目ID") + code: Optional[str] = Field(None, description="里程碑节点编码") + acquire_date: Optional[DateStr] = Field(None, description="取得时间") + is_exist: Optional[bool] = Field(None, description="是否取得") + approval_status: Optional[str] = Field(None, description="审批状态") + name: Optional[str] = Field(None, description="里程碑名称") + group: Optional[str] = Field(None, description="分组条件", examples=['KGTJLS']) + is_acquired: Optional[int] = Field(0, description="是否取得") diff --git a/schemas/project_extensions/production.py b/schemas/project_extensions/production.py new file mode 100644 index 0000000..a1cd031 --- /dev/null +++ b/schemas/project_extensions/production.py @@ -0,0 +1,39 @@ +from pydantic import BaseModel, Field, field_validator +from typing import Optional + +from ..common.base import BaseResponseWithID +from ..common.datetime import datetime_date, get_current_date +from fastapi import HTTPException +from ..common.validators import DateStr + + +class PostProduction(BaseModel): + id: str = Field(..., description="投产节点ID") + code: str = Field(..., description="节点编码") + acquire_date: DateStr | None = Field(None, description="取得时间") + is_exist: bool = Field(..., description="是否取得") + + @field_validator('acquire_date') + def validate_acquire_date(cls, v: Optional[DateStr]) -> Optional[DateStr]: + if v is None: + return None + try: + actual = datetime_date(v) + except ValueError: + raise HTTPException(status_code=400, detail='日期格式为(YYYY-MM-DD)') + + today = datetime_date(get_current_date()) + if actual > today: + raise HTTPException(status_code=400, detail='取得时间不能晚于今天') + return v + + +class ProductionDetail(BaseResponseWithID): + id: Optional[str] = Field(None, description="投产节点ID") + project_id: Optional[str] = Field(None, description="项目ID") + code: Optional[str] = Field(None, description="投产节点编码") + acquire_date: Optional[DateStr] = Field(None, description="取得时间") + is_exist: Optional[bool] = Field(None, description="是否取得") + approval_status: Optional[str] = Field(None, description="审批状态") + name: Optional[str] = Field(None, description="投产节点名称") + is_acquired: Optional[int] = Field(0, description="是否取得") diff --git a/schemas/project_extensions/project_detail.py b/schemas/project_extensions/project_detail.py new file mode 100644 index 0000000..b8c8316 --- /dev/null +++ b/schemas/project_extensions/project_detail.py @@ -0,0 +1,33 @@ +""" +项目容量信息schema +只提供返回,不提供更新接口 +""" +from enum import Enum + +from pydantic import BaseModel, Field +from typing import Optional, List +from ..common.base import BaseResponseWithID + + +class ProjectDetailKey(str, Enum): + """项目子类类型枚举""" + PLAN_CONSTRUCTION = "plan_construction" # 计划在建容量 + ACTUAL_CONSTRUCTION = "actual_construction" # 实际在建容量 + PRODUCTION = "production" # 投产容量 + ENSURE_PRODUCTION = "ensure_production" # 确保容量 + CLIMB_PRODUCTION = "climb_production" # 登高容量 + CHALLENGE_PRODUCTION = "challenge_production" # 揭榜容量 + COMPLETE_INVESTMENT = "complete_investment" # 完成投资容量 + + +class CapacityItem(BaseModel): + year: Optional[int] = Field(None, description='年') + date: Optional[str] = Field(None, description="日期,格式YYYY-MM-DD") + capacity: float = Field(..., description='容量') + is_audit: Optional[bool] = Field(False, description='是否可编辑') + + +class ProjectDetailProject(BaseResponseWithID): + project_id:str= Field(..., description="所属项目ID", examples=["project123"]) + key: Optional[ProjectDetailKey] = Field(None, description='项目子类类型') + value: Optional[List[CapacityItem]] = Field(None, description='项目子类类型值') diff --git a/schemas/project_multi_type/__init__.py b/schemas/project_multi_type/__init__.py new file mode 100644 index 0000000..fbde9cf --- /dev/null +++ b/schemas/project_multi_type/__init__.py @@ -0,0 +1,7 @@ +from .photovotaic import PhotovoltaicExtension +from .onshore_wind import OnShoreWindExtension +from .offshore_wind import OffShoreWindExtension +from .hydropower import HydropowerExtension +from .pumped_storage import PumpedStorageExtension +from .gas_turbine import GasTurbineExtension +from .thermal_power import ThermalPowerExtension \ No newline at end of file diff --git a/schemas/project_multi_type/gas_turbine.py b/schemas/project_multi_type/gas_turbine.py new file mode 100644 index 0000000..8438b1a --- /dev/null +++ b/schemas/project_multi_type/gas_turbine.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class GasTurbineExtension(BaseModel): + """ + 燃气轮机项目特定字段 + """ + pass \ No newline at end of file diff --git a/schemas/project_multi_type/hydropower.py b/schemas/project_multi_type/hydropower.py new file mode 100644 index 0000000..32c6eeb --- /dev/null +++ b/schemas/project_multi_type/hydropower.py @@ -0,0 +1,26 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class HydropowerExtension(BaseModel): + """ + 抽蓄项目特定字段 + """ + dam_type: Optional[str] = Field(None, description="大坝坝型") + storage_capacity: Optional[float] = Field(None, description="总库容") + normal_storage_level: Optional[float] = Field(None, description="正常蓄水位") + regulation_performance: Optional[str] = Field(None, description="调节性能") + workshop_type: Optional[str] = Field(None, description="厂房类型") + + precon_start_date: Optional[str] = Field(None, description="筹建准备期起始时间") + precon_end_date: Optional[str] = Field(None, description="筹建准备期终止时间") + maincon_start_date: Optional[str] = Field(None, description="主体施工期起始时间") + maincon_end_date: Optional[str] = Field(None, description="主体施⼯期终止时间") + comm_start_date: Optional[str] = Field(None, description="完建期开始起始时间") + comm_end_date: Optional[str] = Field(None, description="完建期终止时间") + + implementation_estimate: Optional[float] = Field(None, description="执行概算") + static_total_investment: Optional[float] = Field(None, description="静态总投资") + completed_investment: Optional[float] = Field(None, description="完成投资") + total_contract_quantity: Optional[float] = Field(None, description="总合同数量") + completed_settlement_quantity: Optional[float] = Field(None, description="完成结算数量") \ No newline at end of file diff --git a/schemas/project_multi_type/offshore_wind.py b/schemas/project_multi_type/offshore_wind.py new file mode 100644 index 0000000..4a9519a --- /dev/null +++ b/schemas/project_multi_type/offshore_wind.py @@ -0,0 +1,17 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class OffShoreWindExtension(BaseModel): + """ + 完整的抽蓄项⽬模型,继承了所有通⽤字段和特定字段 + """ + syxs: Optional[str] = Field(None, description="升压站型式") + + group_filing_form_id: Optional[str] = Field(None, examples=["集团备案表文件id"]) + partial_production_filing_form_id: Optional[str] = Field(None, examples=["部分投产备案表文件id"]) + all_production_filing_form_id: Optional[str] = Field(None, examples=["全部投产备案表文件id"]) + ic_plan_first_production_date: Optional[DateStr] = Field(None, description="区域公司计划首批投产日期", + examples=["2024-08-01"]) + ic_plan_full_production_date: Optional[DateStr] = Field(None, description="区域公司计划全投日期", + examples=["2024-09-01"]) diff --git a/schemas/project_multi_type/onshore_wind.py b/schemas/project_multi_type/onshore_wind.py new file mode 100644 index 0000000..8a6c324 --- /dev/null +++ b/schemas/project_multi_type/onshore_wind.py @@ -0,0 +1,18 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class OnShoreWindExtension(BaseModel): + """ + ONSHORE_WIND_EXTENSION + 陆风项目扩展信息 + """ + group_filing_form_id: Optional[str] = Field(None, examples=["集团备案表文件id"]) + partial_production_filing_form_id: Optional[str] = Field(None, examples=["部分投产备案表文件id"]) + all_production_filing_form_id: Optional[str] = Field(None, examples=["全部投产备案表文件id"]) + ic_plan_first_production_date: Optional[DateStr] = Field(None, description="区域公司计划首批投产日期", + examples=["2024-08-01"]) + ic_plan_full_production_date: Optional[DateStr] = Field(None, description="区域公司计划全投日期", + examples=["2024-09-01"]) + + diff --git a/schemas/project_multi_type/photovotaic.py b/schemas/project_multi_type/photovotaic.py new file mode 100644 index 0000000..2befc10 --- /dev/null +++ b/schemas/project_multi_type/photovotaic.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class PhotovoltaicExtension(BaseModel): + """ + 完整的光伏项⽬模型,继承了所有通⽤字段和特定字段 + """ + group_filing_form_id: Optional[str] = Field(None, examples=["集团备案表文件id"]) + partial_production_filing_form_id: Optional[str] = Field(None, examples=["部分投产备案表文件id"]) + all_production_filing_form_id: Optional[str] = Field(None, examples=["全部投产备案表文件id"]) + ic_plan_first_production_date: Optional[DateStr] = Field(None, description="区域公司计划首批投产日期", + examples=["2024-08-01"]) + ic_plan_full_production_date: Optional[DateStr] = Field(None, description="区域公司计划全投日期", + examples=["2024-09-01"]) diff --git a/schemas/project_multi_type/pumped_storage.py b/schemas/project_multi_type/pumped_storage.py new file mode 100644 index 0000000..b71e13a --- /dev/null +++ b/schemas/project_multi_type/pumped_storage.py @@ -0,0 +1,29 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + + +class PumpedStorageExtension(BaseModel): + """ + 抽蓄项目特定字段 + """ + upper_dam_type: Optional[str] = Field(None, description="上水库坝型") + upper_storage_capacity: Optional[float] = Field(None, description="上库库容(万m³)") + lower_dam_type: Optional[str] = Field(None, description="下水库坝型") + lower_storage_capacity: Optional[float] = Field(None, description="下库库容(万m³)") + rated_head: Optional[float] = Field(None, description="额定水头") + distance_to_head_ratio: Optional[float] = Field(None, description="距高比") + continuous_full_load_hours: Optional[float] = Field(None, description="连续满发小时数") + kwh_static_cost: Optional[float] = Field(None, description="单位千瓦静态投资") + precon_start_date: Optional[str] = Field(None, description="筹建准备期起始时间") + precon_end_date: Optional[str] = Field(None, description="筹建准备期终止时间") + maincon_start_date: Optional[str] = Field(None, description="主体施工期起始时间") + maincon_end_date: Optional[str] = Field(None, description="主体施⼯期终止时间") + comm_start_date: Optional[str] = Field(None, description="完建期开始起始时间") + comm_end_date: Optional[str] = Field(None, description="完建期终止时间") + + implementation_estimate:Optional[float] = Field(None, description="执行概算") + static_total_investment: Optional[float] = Field(None, description="静态总投资") + completed_investment: Optional[float] = Field(None, description="完成投资") + total_contract_quantity: Optional[float] = Field(None, description="总合同数量") + completed_settlement_quantity: Optional[float] = Field(None, description="完成结算数量") diff --git a/schemas/project_multi_type/thermal_power.py b/schemas/project_multi_type/thermal_power.py new file mode 100644 index 0000000..6c360c0 --- /dev/null +++ b/schemas/project_multi_type/thermal_power.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel, Field +from typing import List, Optional, Literal +from ..common.validators import DateStr + +class ThermalPowerExtension(BaseModel): + """ + THERMAL_POWER_EXTENSION + 火电项目扩展信息 + """ + pass \ No newline at end of file diff --git a/schemas/supplier/supplier.py b/schemas/supplier/supplier.py new file mode 100644 index 0000000..97b65de --- /dev/null +++ b/schemas/supplier/supplier.py @@ -0,0 +1,43 @@ +from pydantic import BaseModel, Field +from typing import List, Optional +from ..common.base import BaseResponseWithID + + +class SupplierDetailResponse(BaseResponseWithID): + """ + 供应商详情模型 + """ + id: str = Field(..., description="供应商ID", examples=["company:001"]) + name: str = Field(..., description="供应商名称", examples=["腾讯集团"]) + short_name: str = Field(..., description="供应商简称", examples=["腾讯"]) + code: str = Field(..., description="供应商编码", examples=["TX001"]) + company_type: str = Field(..., description="供应商类型", examples=["other"]) + parent_id: Optional[str] = Field(None, description="上级供应商ID", examples=[None]) + path: List[str] = Field(..., description="供应商所处路径", examples=[["company:001"]]) + status: str = Field(..., description="供应商状态", examples=["active"]) + sort: int = Field(..., description="排序", examples=[1]) + credit_code: Optional[str] = Field(None, description="信用代码", examples=["914403007109310121"]) + created_by: str = Field(..., description="创建者ID", examples=["user:001"]) + created_by_name: str = Field(..., description="创建者名称", examples=["张三"]) + created_at: str = Field(..., description="创建时间", examples=["2023-10-01T12:00:00Z"]) + updated_by: str = Field(..., description="更新者ID", examples=["user:001"]) + updated_by_name: str = Field(..., description="更新者名称", examples=["张三"]) + updated_at: str = Field(..., description="更新时间", examples=["2023-10-01T12:00:00Z"]) + province: Optional[str] = Field(None, description="省份编码", examples=[None]) + city: Optional[str] = Field(None, description="城市编码", examples=[None]) + company_nature: List[Optional[str]] = Field(None, description="供应商性质数组", examples=[['supplier']]) + city_name: Optional[str] = Field(None, description="城市名称", examples=[None]) + province_name: Optional[str] = Field(None, description="省份名称", examples=[None]) + region_path: Optional[list] = Field(default_factory=list, description="供应商国家城市地址编码列表") + country: Optional[str] = Field(None, description="国家编码", examples=[None]) + country_name: Optional[str] = Field(None, description="国家名称", examples=[None]) + + +class SupplierListResponse(BaseModel): + """ + 供应商list + """ + page: int + page_size: int + total: int + list: List[SupplierDetailResponse] = [] diff --git a/schemas/user/user.py b/schemas/user/user.py new file mode 100644 index 0000000..c0ca2c7 --- /dev/null +++ b/schemas/user/user.py @@ -0,0 +1,49 @@ +from typing import List, Optional, Dict +from pydantic import BaseModel, EmailStr, Field +from ..common.base import BaseResponseWithID + + +class UserListDetailItem(BaseResponseWithID): + """ + 用户列表内明细模型 + """ + id: Optional[str] = Field(default=None, description="唯一标识符") + username: Optional[str] = Field(None, description="用户名") + name: Optional[str] = Field(None, description="姓名") + phone: Optional[str] = Field(None, description="手机号") + phone_country: Optional[str] = Field(None, description="手机号国家前缀") + country_code: Optional[str] = Field(None, description="国家编码") + id_card: Optional[str] = Field(None, description="身份证号") + status: Optional[str] = Field(None, description="状态") + email: Optional[EmailStr] = Field(None, description="邮箱地址") + user_type: str = Field(..., description="用户类型") + last_login_at: Optional[str] = Field(None, description="最后登录时间") + updated_at: Optional[str] = Field(None, description="更新时间") + company_id: Optional[str] = Field(None, description="公司id") + company_name: Optional[str] = Field(None, description="公司名称") + created_at: Optional[str] = Field(None, description="创建时间") + approval_status: Optional[str] = Field(None, description="审批状态") + approval_time: Optional[str] = Field(None, description="审批通过时间") + last_login_ip: Optional[str] = Field(None, description="最后登录ip") + project_ids: Optional[List[str]] = Field([], description="权限内项目id") + contract_ids: Optional[List[str]] = Field([], description="权限内合同id") + apply_files: Optional[List[Dict]] = Field([], + examples=[ + {"id": "file:001", "name": "文件1", + "url": "https://example.com/file1.pdf"} + ], + description='申请文件' + ) + + +class UserListResponse(BaseModel): + """ + 用户列表响应模型 + """ + + page: int + page_size: int + total: int + list: List[UserListDetailItem] + + diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..28eb2b6 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,44 @@ +# 脚本目录 + +## 文件说明 + +### test_api_sync.py +主要的API数据同步测试脚本。 + +**功能:** +- 从远程API获取所有GET/LIST接口数据 +- 自动分页获取全量数据 +- 保存为JSONL格式到 `remote_datasource` 目录 +- 支持单项目模式或全量同步 + +**运行方式:** +```bash +python scripts/test_api_sync.py +``` + +**数据类型覆盖:** +- 基础数据: company, user, supplier, project +- 项目数据: contract, construction_task, material, contract_settlement, personnel +- 项目扩展: preparation, production, lar, units (从all_info获取) +- 明细数据: construction_task_detail, material_detail, contract_settlement_detail, personnel_detail + +**配置说明:** +在文件中修改以下配置: +```python +BASE_URL = "http://localhost:8000/api/third/v2" +UID = "your-uid" +SECRET_KEY = "your-secret-key" +TARGET_PROJECT_ID = "xxx-xxx-xxx" # 单项目模式,设为None则全量同步 +``` + +## 输出结果 + +数据保存在 `remote_datasource/datasource/` 目录下: +- `company_1.jsonl` - 公司数据 +- `user_1.jsonl` - 用户数据 +- `project_1.jsonl` - 项目数据 +- ... 其他数据类型 + +## 更多文档 + +详细文档请查看项目根目录的 [API_SYNC_GUIDE.md](../API_SYNC_GUIDE.md) diff --git a/scripts/analyze_state_signatures.py b/scripts/analyze_state_signatures.py new file mode 100644 index 0000000..16d6c7a --- /dev/null +++ b/scripts/analyze_state_signatures.py @@ -0,0 +1,211 @@ +"""Analyze whether state definitions are uniquely identifiable by field signatures. + +This script is intentionally placed under scripts/ (but is NOT a pytest test module) +so it can be used as a repeatable, versioned check. + +It expands each state's possible value set for: + (binding_status, action, status) and optionally data_id_exist. + +Wildcard semantics: +- '*' means "any enum value" for enum fields. +- list means "any of these values". + +For data_id_exist (optional): +- If present: bool | '*' | [bool, ...] +- If missing: treated as unknown by default, or as wildcard with --data-id-missing-wildcard. + +Usage: + python scripts/analyze_state_signatures.py + python scripts/analyze_state_signatures.py --with-data-id + python scripts/analyze_state_signatures.py --fail-on-overlap +""" + +from __future__ import annotations + +import argparse +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, Iterable, List, Mapping, Optional, Sequence, Set, Tuple + +import yaml + + +REPO_ROOT = Path(__file__).resolve().parents[1] +DEFAULT_CFG = REPO_ROOT / "sync_state_machine" / "config" / "node_state_machine.yaml" + +# Ensure repository root is importable when running as a script. +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + + +@dataclass(frozen=True) +class Collision: + signature: Tuple[Any, ...] + states: Tuple[str, ...] + + +def _load_yaml(path: Path) -> Dict[str, Any]: + with path.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + if not isinstance(data, dict): + raise TypeError(f"Top-level YAML must be a mapping: {path}") + return data + + +def _import_enum_names() -> Tuple[Set[str], Set[str], Set[str]]: + # Validate enum NAMES; values are implementation details. + from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus + + binding = {e.name for e in BindingStatus} + action = {e.name for e in SyncAction} + status = {e.name for e in SyncStatus} + return binding, action, status + + +def _expand_enum_field(value: Any, *, all_values: Set[str], field_path: str) -> Set[str]: + if isinstance(value, str): + if value == "*": + return set(all_values) + return {value} + if isinstance(value, list): + expanded: Set[str] = set() + for i, item in enumerate(value): + if not isinstance(item, str): + raise TypeError(f"{field_path}[{i}] must be a string") + if item == "*": + expanded |= set(all_values) + else: + expanded.add(item) + return expanded + raise TypeError(f"{field_path} must be str | list[str]") + + +def _expand_data_id_exist( + value: Any, + *, + field_path: str, + missing_as_wildcard: bool, +) -> Set[Optional[bool]]: + if value is None: + return {True, False} if missing_as_wildcard else {None} + if value == "*": + return {True, False} + if isinstance(value, bool): + return {value} + if isinstance(value, list): + out: Set[Optional[bool]] = set() + for i, item in enumerate(value): + if item == "*": + out |= {True, False} + elif isinstance(item, bool): + out.add(item) + else: + raise TypeError(f"{field_path}[{i}] must be bool or '*'") + return out + raise TypeError(f"{field_path} must be bool | '*' | list[bool]") + + +def _cartesian_product(*sets: Sequence[Any]) -> Iterable[Tuple[Any, ...]]: + if not sets: + return [] + acc: List[Tuple[Any, ...]] = [()] + for s in sets: + nxt: List[Tuple[Any, ...]] = [] + for prefix in acc: + for v in s: + nxt.append(prefix + (v,)) + acc = nxt + return acc + + +def _collect_state_signature_sets( + cfg: Mapping[str, Any], + *, + with_data_id: bool, + data_id_missing_as_wildcard: bool, +) -> Dict[str, Set[Tuple[Any, ...]]]: + states = cfg.get("states") + if not isinstance(states, dict): + raise TypeError("cfg.states must be a mapping") + + binding_all, action_all, status_all = _import_enum_names() + + out: Dict[str, Set[Tuple[Any, ...]]] = {} + for sid, sdef in states.items(): + if not isinstance(sdef, dict): + continue + + binding = _expand_enum_field(sdef.get("binding_status"), all_values=binding_all, field_path=f"states.{sid}.binding_status") + action = _expand_enum_field(sdef.get("action"), all_values=action_all, field_path=f"states.{sid}.action") + status = _expand_enum_field(sdef.get("status"), all_values=status_all, field_path=f"states.{sid}.status") + + if with_data_id: + data_id = _expand_data_id_exist( + sdef.get("data_id_exist"), + field_path=f"states.{sid}.data_id_exist", + missing_as_wildcard=data_id_missing_as_wildcard, + ) + signatures = set(_cartesian_product(sorted(binding), sorted(action), sorted(status), sorted(data_id, key=lambda x: str(x)))) + else: + signatures = set(_cartesian_product(sorted(binding), sorted(action), sorted(status))) + + out[str(sid)] = signatures + + return out + + +def _find_collisions(state_signatures: Mapping[str, Set[Tuple[Any, ...]]]) -> List[Collision]: + index: Dict[Tuple[Any, ...], List[str]] = {} + for sid, sigs in state_signatures.items(): + for sig in sigs: + index.setdefault(sig, []).append(sid) + + collisions: List[Collision] = [] + for sig, sids in index.items(): + if len(sids) > 1: + collisions.append(Collision(signature=sig, states=tuple(sorted(sids)))) + + collisions.sort(key=lambda c: (-len(c.states), c.signature)) + return collisions + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser(description="Analyze state signature overlaps") + parser.add_argument("--config", default=str(DEFAULT_CFG), help="Path to node_state_machine.yaml") + parser.add_argument("--with-data-id", action="store_true", help="Include data_id_exist in signature") + parser.add_argument( + "--data-id-missing-wildcard", + action="store_true", + help="If data_id_exist is missing, treat it as wildcard (True/False) instead of unknown", + ) + parser.add_argument("--fail-on-overlap", action="store_true", help="Exit non-zero if collisions exist") + parser.add_argument("--show", type=int, default=30, help="Max collisions to print") + args = parser.parse_args(list(argv) if argv is not None else None) + + cfg = _load_yaml(Path(args.config)) + state_sigs = _collect_state_signature_sets( + cfg, + with_data_id=bool(args.with_data_id), + data_id_missing_as_wildcard=bool(args.data_id_missing_wildcard), + ) + collisions = _find_collisions(state_sigs) + + dim = 4 if args.with_data_id else 3 + print(f"Config: {args.config}") + print(f"Signature dims: {dim} ({'binding,action,status,data_id' if args.with_data_id else 'binding,action,status'})") + print(f"States analyzed: {len(state_sigs)}") + print(f"Collisions: {len(collisions)}") + + if collisions: + print("\nTop collisions:") + for c in collisions[: args.show]: + print(f" {c.signature} -> {', '.join(c.states)}") + + if args.fail_on_overlap and collisions: + return 2 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/auto_test_clear.py b/scripts/auto_test_clear.py new file mode 100644 index 0000000..799df4e --- /dev/null +++ b/scripts/auto_test_clear.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +import argparse +import json + +from auto_test_init import clear_environment + + +def main() -> int: + parser = argparse.ArgumentParser(description="单独清空自动测试环境") + parser.add_argument( + "--config", + default="tests/fixtures/auto_sync/auto_test_config.yaml", + help="自动测试配置文件路径", + ) + args = parser.parse_args() + + result = clear_environment(args.config) + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/scripts/auto_test_domains/base.py b/scripts/auto_test_domains/base.py new file mode 100644 index 0000000..e21f496 --- /dev/null +++ b/scripts/auto_test_domains/base.py @@ -0,0 +1,595 @@ +from __future__ import annotations + +import json +import uuid +from pathlib import Path +from typing import Any + +import yaml + +from auto_test_lib import ( + copy_selected_files, + copy_tree_contents, + diff_record_fields, + enrich_supplier_display_fields, + latest_log_file, + merge_tree_contents, + normalize_contract_settlement_records, + normalize_construction_task_plan_nodes, + persistence_summary, + read_jsonl_records, + load_yaml_config, + run_command, + sqlite_rows, +) + + +def _tail_text(value: str | None, max_chars: int = 1000) -> str: + if not value: + return "" + if len(value) <= max_chars: + return value + return value[-max_chars:] + + +def collect_required_bindings(db_path: str, required_bindings: dict[str, list[str]]) -> dict[str, Any]: + result: dict[str, Any] = {} + for node_type, local_ids in required_bindings.items(): + result[node_type] = [] + local_nodes = sqlite_rows( + db_path, + "SELECT node_id, data_id FROM nodes WHERE collection_id = 'local' AND node_type = ?", + (node_type,), + ) + remote_nodes = sqlite_rows( + db_path, + "SELECT node_id, data_id FROM nodes WHERE collection_id = 'remote' AND node_type = ?", + (node_type,), + ) + bindings = sqlite_rows( + db_path, + "SELECT local_id, remote_id FROM bindings WHERE node_type = ?", + (node_type,), + ) + local_data_to_node = {item["data_id"]: item["node_id"] for item in local_nodes} + remote_node_to_data = {item["node_id"]: item["data_id"] for item in remote_nodes} + bound_map = {item["local_id"]: item.get("remote_id") for item in bindings} + for local_id in local_ids: + local_node_id = local_data_to_node.get(local_id) + remote_node_id = bound_map.get(local_node_id) if local_node_id else None + result[node_type].append( + { + "local_data_id": local_id, + "local_node_id": local_node_id, + "remote_node_id": remote_node_id, + "remote_data_id": remote_node_to_data.get(remote_node_id) if remote_node_id else None, + "bound": remote_node_id is not None, + } + ) + return result + + +def collect_problem_nodes(db_path: str, node_types: list[str] | None = None) -> list[dict[str, Any]]: + problems: list[dict[str, Any]] = [] + seen: set[tuple[str | None, str | None]] = set() + + sql = """ + SELECT + collection_id, + node_type, + node_id, + data_id, + bind_data_id, + action, + status, + binding_status, + error, + sync_log, + context + FROM nodes + """ + params: tuple[Any, ...] = () + if node_types: + placeholders = ", ".join("?" for _ in node_types) + sql += f" WHERE node_type IN ({placeholders})" + params = tuple(node_types) + sql += " ORDER BY node_type, collection_id, node_id" + + rows = sqlite_rows(db_path, sql, params) + for row in rows: + status = row.get("status") + binding_status = row.get("binding_status") + error = row.get("error") + has_problem = bool(error) or status == "FAILED" or (binding_status not in (None, "", "normal")) + if not has_problem: + continue + + key = (row.get("collection_id"), row.get("node_id")) + if key in seen: + continue + seen.add(key) + + problems.append( + { + "collection_id": row.get("collection_id"), + "node_type": row.get("node_type"), + "node_id": row.get("node_id"), + "data_id": row.get("data_id"), + "bind_data_id": row.get("bind_data_id"), + "action": row.get("action"), + "status": status, + "binding_status": binding_status, + "error": error, + "sync_log_tail": _tail_text(row.get("sync_log"), 1600), + "context": row.get("context"), + } + ) + + return problems + + +def collect_round_diffs(previous_dataset_dir: str | None, current_dataset_dir: str) -> dict[str, dict[str, list[str]]]: + if not previous_dataset_dir: + return {} + + previous_root = Path(previous_dataset_dir) + current_root = Path(current_dataset_dir) + diffs: dict[str, dict[str, list[str]]] = {} + + for after_file in sorted(current_root.glob("*.jsonl")): + before_file = previous_root / after_file.name + if not before_file.exists(): + continue + + node_type = _infer_node_type_from_jsonl(after_file) + before_records = read_jsonl_records(before_file) + after_records = read_jsonl_records(after_file) + file_diff: dict[str, list[str]] = {} + for record_id, after in after_records.items(): + before = before_records.get(record_id) + if not before: + continue + changed = diff_record_fields(before, after) + if changed: + file_diff[record_id] = changed + if file_diff: + diffs[node_type] = file_diff + + return diffs + + +def collect_round_diff(previous_dataset_dir: str | None, current_dataset_dir: str, domain_name: str) -> dict[str, list[str]]: + return collect_round_diffs(previous_dataset_dir, current_dataset_dir).get(domain_name, {}) + + +def _resolve_field_path(data: Any, field_path: str) -> Any: + current = data + for part in field_path.split("."): + if isinstance(current, dict): + current = current.get(part) + continue + if isinstance(current, list) and part.isdigit(): + index = int(part) + if 0 <= index < len(current): + current = current[index] + continue + return None + return current + + +def collect_node_data_by_data_ids( + db_path: str, + *, + collection_id: str, + node_type: str, + data_ids: list[str], +) -> dict[str, Any]: + if not data_ids: + return {} + + placeholders = ", ".join("?" for _ in data_ids) + rows = sqlite_rows( + db_path, + ( + "SELECT data_id, data FROM nodes " + "WHERE collection_id = ? AND node_type = ? AND data_id IN (" + f"{placeholders})" + ), + (collection_id, node_type, *data_ids), + ) + + result: dict[str, Any] = {} + for row in rows: + raw = row.get("data") + data_id = row.get("data_id") + if data_id is None or not raw: + continue + try: + result[str(data_id)] = json.loads(raw) + except json.JSONDecodeError: + continue + return result + + +def make_local_data_id(node_type: str, remote_data_id: str) -> str: + return str(uuid.uuid5(uuid.NAMESPACE_URL, f"auto-test-local:{node_type}:{remote_data_id}")) + + +def _infer_node_type_from_jsonl(file_path: Path) -> str: + name = file_path.name + if name.endswith("_1.jsonl"): + return name[:-8] + if name.endswith(".jsonl"): + return name[:-6] + return file_path.stem + + +def remap_project_scope_local_ids( + dataset_root: str | Path, + *, + remote_project_id: str, + local_project_id: str, + remap_node_types: set[str], +) -> None: + root = Path(dataset_root) + for file_path in sorted(root.glob("*.jsonl")): + node_type = _infer_node_type_from_jsonl(file_path) + raw_lines = file_path.read_text(encoding="utf-8").splitlines() + rewritten: list[str] = [] + changed = False + for line in raw_lines: + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + original = json.dumps(item, ensure_ascii=False, sort_keys=True) + + if item.get("project_id") == remote_project_id: + item["project_id"] = local_project_id + + if node_type == "project" and item.get("_id") == remote_project_id: + item["_id"] = local_project_id + elif node_type in remap_node_types and item.get("project_id") == local_project_id and item.get("_id"): + item["_id"] = make_local_data_id(node_type, str(item["_id"])) + + changed = changed or (json.dumps(item, ensure_ascii=False, sort_keys=True) != original) + rewritten.append(json.dumps(item, ensure_ascii=False)) + + if changed: + file_path.write_text("\n".join(rewritten) + "\n", encoding="utf-8") + + +def remap_project_scope_dataset_diffs( + dataset_diffs: dict[str, dict[str, list[str]]], + *, + remote_project_id: str, + local_project_id: str, + remap_node_types: set[str], +) -> dict[str, dict[str, list[str]]]: + remapped: dict[str, dict[str, list[str]]] = {} + for node_type, record_changes in dataset_diffs.items(): + remapped[node_type] = {} + for record_id, changed_fields in record_changes.items(): + new_record_id = record_id + if node_type == "project" and record_id == remote_project_id: + new_record_id = local_project_id + elif node_type in remap_node_types: + new_record_id = make_local_data_id(node_type, record_id) + remapped[node_type][new_record_id] = changed_fields + return remapped + + +def build_temp_run_profile_for_project_auto_bind( + *, + config: dict[str, Any], + report_root: str | Path, + profile_name: str, + local_project_id: str, + remote_project_id: str, + project_update_direction: str | None = None, + project_local_orphan_action: str | None = None, + project_remote_orphan_action: str | None = None, + project_detail_push_keys: set[str] | None = None, +) -> tuple[str, list[str]]: + profile = load_yaml_config(config["pipeline"]["run_profile"]) + profile.setdefault("local_datasource", {})["target_project_ids"] = [local_project_id] + profile.setdefault("remote_datasource", {})["target_project_ids"] = [remote_project_id] + + project_strategy = profile.setdefault("strategies", {}).setdefault("project", {}).setdefault("config", {}) + project_strategy["auto_bind"] = True + project_strategy["auto_bind_fields"] = ["name"] + project_strategy["pre_bind_data_id"] = [] + project_strategy["local_orphan_action"] = project_local_orphan_action or "none" + project_strategy["remote_orphan_action"] = project_remote_orphan_action or "none" + project_strategy["update_direction"] = project_update_direction or "none" + + if project_detail_push_keys: + project_detail_config = profile.setdefault("strategies", {}).setdefault("project_detail_data", {}).setdefault("config", {}) + overrides = dict(project_detail_config.get("field_direction_overrides", {})) + for key in project_detail_push_keys: + overrides.pop(key, None) + project_detail_config["field_direction_overrides"] = overrides + + runtime_dir = Path(report_root) / "runtime_configs" + runtime_dir.mkdir(parents=True, exist_ok=True) + profile_path = runtime_dir / f"{profile_name}.yaml" + profile_path.write_text(yaml.safe_dump(profile, allow_unicode=True, sort_keys=False), encoding="utf-8") + + command = list(config["pipeline"]["command"]) + if "--config_path" in command: + index = command.index("--config_path") + if index + 1 < len(command): + command[index + 1] = str(profile_path) + else: + command.append(str(profile_path)) + else: + command.extend(["--config_path", str(profile_path)]) + return str(profile_path), command + + +def run_pipeline_round( + *, + config: dict[str, Any], + dataset_dir: str, + previous_dataset_dir: str | None, + base_dataset_dir: str | None = None, + base_dataset_files: list[str] | None = None, + domain_name: str, + round_name: str, + purpose: str, + expected_changes: dict[str, Any] | None = None, + required_bindings: dict[str, list[str]] | None = None, + expected_binding_pairs: dict[str, dict[str, str]] | None = None, + require_distinct_binding_ids: dict[str, list[str]] | None = None, + expected_bound_fields: dict[str, dict[str, dict[str, dict[str, Any]]]] | None = None, + project_id_remap: dict[str, Any] | None = None, + project_detail_push_keys: set[str] | None = None, + report_root: str | Path | None = None, + coverage: dict[str, Any] | None = None, +) -> dict[str, Any]: + pipeline = config["pipeline"] + paths = config["paths"] + + if base_dataset_dir and base_dataset_files: + copy_selected_files(base_dataset_dir, paths["temp_data_dir"], base_dataset_files) + merge_tree_contents(dataset_dir, paths["temp_data_dir"]) + else: + copy_tree_contents(dataset_dir, paths["temp_data_dir"]) + common_dataset_dir = paths.get("common_dataset_dir") + if common_dataset_dir and Path(common_dataset_dir).exists(): + merge_tree_contents(common_dataset_dir, paths["temp_data_dir"]) + enrich_supplier_display_fields( + paths["temp_data_dir"], + f"{config['project_root']}/filtered_datasource/datasource/filtered/region_1.jsonl", + ) + normalize_contract_settlement_records(paths["temp_data_dir"]) + normalize_construction_task_plan_nodes(paths["temp_data_dir"]) + + command = pipeline["command"] + temp_run_profile_path = None + if project_id_remap: + local_project_id = str(project_id_remap["local_project_id"]) + remote_project_id = str(project_id_remap["remote_project_id"]) + remap_project_scope_local_ids( + paths["temp_data_dir"], + remote_project_id=remote_project_id, + local_project_id=local_project_id, + remap_node_types=set(project_id_remap.get("remap_node_types", set())), + ) + if report_root is None: + raise ValueError("project_id_remap requires report_root") + temp_run_profile_path, command = build_temp_run_profile_for_project_auto_bind( + config=config, + report_root=report_root, + profile_name=f"{domain_name}_{round_name}", + local_project_id=local_project_id, + remote_project_id=remote_project_id, + project_update_direction=project_id_remap.get("project_update_direction"), + project_local_orphan_action=project_id_remap.get("project_local_orphan_action"), + project_remote_orphan_action=project_id_remap.get("project_remote_orphan_action"), + project_detail_push_keys=project_detail_push_keys, + ) + + result = run_command(command, pipeline["project_root"]) + latest_log = latest_log_file(paths["pipeline_log_dir"]) + dataset_diff = collect_round_diff(previous_dataset_dir, dataset_dir, domain_name) + dataset_diffs = collect_round_diffs(previous_dataset_dir, dataset_dir) + if project_id_remap: + dataset_diffs = remap_project_scope_dataset_diffs( + dataset_diffs, + remote_project_id=str(project_id_remap["remote_project_id"]), + local_project_id=str(project_id_remap["local_project_id"]), + remap_node_types=set(project_id_remap.get("remap_node_types", set())), + ) + dataset_diff = dataset_diffs.get(domain_name, {}) + binding_report = collect_required_bindings(paths["persistence_db"], required_bindings or {}) + persist_report = persistence_summary(paths["persistence_db"], domain_name) + watched_problem_types = set(required_bindings or {}) + watched_problem_types.update(expected_changes or {}) + for collection_node_types in (expected_bound_fields or {}).values(): + watched_problem_types.update(collection_node_types) + watched_problem_types.add(domain_name) + problem_nodes = collect_problem_nodes( + paths["persistence_db"], + sorted(watched_problem_types) if watched_problem_types else None, + ) + + issues: list[str] = [] + if result.returncode != 0: + issues.append(f"pipeline 返回码不是 0: {result.returncode}") + + for node_type, items in binding_report.items(): + for item in items: + if not item["bound"]: + issues.append(f"{node_type} 未建立绑定: {item['local_data_id']}") + + expected_binding_pairs = expected_binding_pairs or {} + for node_type, local_to_remote in expected_binding_pairs.items(): + actual_items = {item["local_data_id"]: item for item in binding_report.get(node_type, [])} + for local_id, expected_remote_id in local_to_remote.items(): + actual = actual_items.get(local_id) + if not actual: + issues.append(f"{node_type} 缺少绑定检查记录: {local_id}") + continue + if actual.get("remote_data_id") != expected_remote_id: + issues.append( + f"{node_type} 绑定目标不符合预期: local={local_id} remote={actual.get('remote_data_id')} expected={expected_remote_id}" + ) + + require_distinct_binding_ids = require_distinct_binding_ids or {} + for node_type, local_ids in require_distinct_binding_ids.items(): + actual_items = {item["local_data_id"]: item for item in binding_report.get(node_type, [])} + for local_id in local_ids: + actual = actual_items.get(local_id) + if not actual or not actual.get("bound"): + continue + if actual.get("remote_data_id") == local_id: + issues.append(f"{node_type} 绑定后 local/remote data_id 不应相同: {local_id}") + + expected_bound_fields = expected_bound_fields or {} + verified_bound_fields: list[dict[str, Any]] = [] + for collection_id, node_types in expected_bound_fields.items(): + for node_type, local_expectations in node_types.items(): + binding_items = {item["local_data_id"]: item for item in binding_report.get(node_type, [])} + target_id_by_local: dict[str, str] = {} + for local_data_id in local_expectations: + if collection_id == "local": + target_id_by_local[local_data_id] = local_data_id + continue + remote_data_id = (binding_items.get(local_data_id) or {}).get("remote_data_id") + if remote_data_id: + target_id_by_local[local_data_id] = remote_data_id + + records = collect_node_data_by_data_ids( + paths["persistence_db"], + collection_id=collection_id, + node_type=node_type, + data_ids=list(target_id_by_local.values()), + ) + + for local_data_id, expected_fields in local_expectations.items(): + target_data_id = target_id_by_local.get(local_data_id) + record = records.get(target_data_id) if target_data_id else None + if not target_data_id or record is None: + issues.append( + f"{collection_id}.{node_type} 字段校验缺少目标记录: local={local_data_id} resolved={target_data_id}" + ) + continue + + actual_fields: dict[str, Any] = {} + mismatches: list[str] = [] + for field_path, expected_value in expected_fields.items(): + actual_value = _resolve_field_path(record, field_path) + actual_fields[field_path] = actual_value + if actual_value != expected_value: + mismatches.append( + f"{field_path}: actual={actual_value!r} expected={expected_value!r}" + ) + + verified_bound_fields.append( + { + "collection_id": collection_id, + "node_type": node_type, + "local_data_id": local_data_id, + "target_data_id": target_data_id, + "matched": not mismatches, + "expected_fields": expected_fields, + "actual_fields": actual_fields, + } + ) + if mismatches: + issues.append( + f"{collection_id}.{node_type} 字段校验失败: local={local_data_id} target={target_data_id}; " + + "; ".join(mismatches) + ) + + relevant_local_ids: set[str] = set() + for local_ids in (required_bindings or {}).values(): + relevant_local_ids.update(local_ids) + + relevant_remote_ids: set[str] = set() + for items in binding_report.values(): + for item in items: + remote_data_id = item.get("remote_data_id") + if remote_data_id: + relevant_remote_ids.add(str(remote_data_id)) + for remote_map in (expected_binding_pairs or {}).values(): + relevant_remote_ids.update(str(remote_id) for remote_id in remote_map.values() if remote_id) + + matched_verified_local_keys = { + (entry["node_type"], entry["local_data_id"]) + for entry in verified_bound_fields + if entry.get("matched") + } + + for item in problem_nodes: + item_data_id = item.get("data_id") + if item.get("collection_id") == "local": + if item_data_id not in relevant_local_ids: + continue + elif item.get("collection_id") == "remote": + if not item_data_id or item_data_id not in relevant_remote_ids: + continue + + error_text = item.get("error") or "" + if item.get("status") == "FAILED": + issues.append( + f"{item['collection_id']}.{item['node_type']} 节点失败: data_id={item.get('data_id')} action={item.get('action')} error={error_text or ''}" + ) + elif item.get("binding_status") not in (None, "", "normal"): + if ( + item.get("collection_id") == "local" + and (item.get("node_type"), item.get("data_id")) in matched_verified_local_keys + ): + continue + issues.append( + f"{item['collection_id']}.{item['node_type']} 绑定异常: data_id={item.get('data_id')} binding_status={item.get('binding_status')}" + ) + elif error_text: + continue + + expected_changes = expected_changes or {} + for node_type, record_changes in expected_changes.items(): + node_diff = dataset_diffs.get(node_type, {}) + for record_id, expected_fields in record_changes.items(): + actual_changed_fields: list[str] = node_diff.get(record_id, []) + missing = [field for field in expected_fields if field not in actual_changed_fields] + if missing: + issues.append(f"数据变更字段不完整: {record_id} 缺少 {', '.join(missing)}") + + return { + "name": round_name, + "purpose": purpose, + "dataset_dir": dataset_dir, + "returncode": result.returncode, + "passed": not issues, + "issues": issues, + "stdout_tail": result.stdout[-2000:], + "stderr_tail": result.stderr[-2000:], + "latest_log_file": latest_log, + "expected_changes": expected_changes, + "dataset_diff": dataset_diff, + "dataset_diffs": dataset_diffs, + "required_bindings": binding_report, + "expected_binding_pairs": expected_binding_pairs, + "require_distinct_binding_ids": require_distinct_binding_ids, + "verified_bound_fields": verified_bound_fields, + "problem_nodes": problem_nodes, + "persistence_summary": persist_report, + "temp_run_profile_path": temp_run_profile_path, + "coverage": coverage or {}, + } + + +def build_domain_report(domain: str, description: str, rounds: list[dict[str, Any]]) -> dict[str, Any]: + issues: list[str] = [] + for round_report in rounds: + for issue in round_report.get("issues", []): + issues.append(f"{round_report['name']}: {issue}") + return { + "domain": domain, + "description": description, + "passed": len(issues) == 0, + "issues": issues, + "rounds": rounds, + } \ No newline at end of file diff --git a/scripts/auto_test_domains/company_case.py b/scripts/auto_test_domains/company_case.py new file mode 100644 index 0000000..64d8228 --- /dev/null +++ b/scripts/auto_test_domains/company_case.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, run_pipeline_round + + +COMPANY_ID = "a1d69bf1-b95e-4832-9258-5bc35c629e9a" + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + company domain 回归。 + + company 当前只有读取与绑定语义,不支持 create/update/delete。 + 这里至少验证: + 1. `GET /company/list` 可正常加载 + 2. 本地公司记录可与远端建立绑定 + 3. 关键字段在远端确实存在 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/company" + common_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/common_baseline" + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_bind", + previous_dataset_dir=None, + base_dataset_dir=common_root, + base_dataset_files=["company_1.jsonl"], + domain_name="company", + round_name="round_1_bind", + purpose="加载公司列表并验证 company 绑定链路", + required_bindings={ + "company": [COMPANY_ID], + }, + expected_binding_pairs={ + "company": {COMPANY_ID: COMPANY_ID}, + }, + expected_bound_fields={ + "remote": { + "company": { + COMPANY_ID: { + "name": "金上公司", + "code": "028B", + } + } + } + }, + coverage={ + "api": ["GET /company/list"], + "notes": "company 为只读域,本用例显式验证远端加载、自动绑定与关键字段校验,不短路通过。", + }, + ) + + return build_domain_report( + domain="company", + description="公司 domain 的只读回归测试。验证 company 列表加载、绑定与基础字段对齐。", + rounds=[round_1], + ) \ No newline at end of file diff --git a/scripts/auto_test_domains/construction_task_case.py b/scripts/auto_test_domains/construction_task_case.py new file mode 100644 index 0000000..70f9485 --- /dev/null +++ b/scripts/auto_test_domains/construction_task_case.py @@ -0,0 +1,98 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + construction_task domain 的最小闭环回归。 + + 这个 domain 重点不是数量覆盖,而是把两个 update 接口都至少打通一次: + + 1. ConstructionUpdate + - 用 `is_crucial` 变化验证基础信息更新。 + + 2. ConstructionPlanUpdate + - 用 `plan_start_date` + - `plan_complete_date` + - `contract_quantity` + - `plan_node` + 验证计划信息更新。 + + 因此这里只保留两轮: + + - round_1_create: 创建 1 条施工任务。 + - round_2_update: 同一条任务同时修改基础信息和计划信息。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/construction_task" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + local_task_id = "0200848d-d9e7-4372-a6f6-f768bac13955" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "contract_1.jsonl", + "construction_task_1.jsonl", + ] + + rounds: list[dict[str, Any]] = [] + + # 用例 1:先把施工任务创建到远端,并确认绑定建立成功。 + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + domain_name="construction_task", + round_name="round_1_create", + purpose="首轮创建施工任务", + required_bindings={"construction_task": [local_task_id]}, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + # 用例 2:同一条任务同时修改基础字段和计划字段,覆盖两个 update 接口。 + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + domain_name="construction_task", + round_name="round_2_update", + purpose="第二轮修改关键任务标记和计划节点,验证 base update + plan update", + expected_changes={ + "construction_task": { + local_task_id: [ + "is_crucial", + "plan_start_date", + "plan_complete_date", + "contract_quantity", + "plan_node", + ] + } + }, + required_bindings={"construction_task": [local_task_id]}, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="construction_task", + description="施工任务 domain 的最小闭环测试。先创建 1 条任务,再在第二轮同时覆盖基础信息更新和计划信息更新。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/construction_task_detail_case.py b/scripts/auto_test_domains/construction_task_detail_case.py new file mode 100644 index 0000000..0c026ac --- /dev/null +++ b/scripts/auto_test_domains/construction_task_detail_case.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + construction_task_detail domain 的批量闭环回归。 + + detail 类更新走批量接口,因此这里显式选择同一个 construction_task 下的 2 条真实明细: + + 1. round_1_create + - 建立 construction_task -> construction_task_detail 绑定; + 2. round_2_update + - 同时修改 2 条 detail 的数量与备注; + - 验证批量 update 路径被真实覆盖。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/construction_task_detail" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "contract_1.jsonl", + "contract_settlement_1.jsonl", + "construction_task_1.jsonl", + ] + local_task_id = "cbb9c312-c8af-437a-a7a2-7f856c77f758" + local_detail_ids = [ + "db98ec2d-1c6b-45f4-a176-7b560a8a89fe", + "678ef40c-affa-4576-a7e2-f440d835f8a8", + ] + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="construction_task_detail", + round_name="round_1_create", + purpose="首轮建立 construction_task 与 2 条 construction_task_detail 的真实依赖链", + required_bindings={ + "construction_task": [local_task_id], + "construction_task_detail": local_detail_ids, + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="construction_task_detail", + round_name="round_2_update", + purpose="第二轮同时修改同一施工任务下 2 条 detail,验证批量 update", + expected_changes={ + "construction_task_detail": { + "db98ec2d-1c6b-45f4-a176-7b560a8a89fe": ["quantity", "remark"], + "678ef40c-affa-4576-a7e2-f440d835f8a8": ["quantity", "remark"], + } + }, + required_bindings={ + "construction_task": [local_task_id], + "construction_task_detail": local_detail_ids, + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="construction_task_detail", + description="施工任务明细 domain 的批量闭环测试。基于同一个 construction_task 下的 2 条真实 detail,先建立绑定,再在第二轮同时更新两条明细,覆盖批量 update 接口。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/contract_case.py b/scripts/auto_test_domains/contract_case.py new file mode 100644 index 0000000..f0e2631 --- /dev/null +++ b/scripts/auto_test_domains/contract_case.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + contract domain 的批量回归脚本。 + + 这里故意不用 yaml 驱动每一轮,而是直接用 Python 写出来, + 这样每个用例在代码里都能看清楚“为什么要跑”和“跑完看什么”。 + + 以 filtered_datasource 中的批量合同数据作为基础数据集, + 再用两轮 overlay 聚焦验证一条目标合同的 create / update 行为。 + + 当前保留两个核心用例: + + 1. round_1_create + - 目的:确认一条合同可以正常创建到远端。 + - 判断方式: + - pipeline 返回码必须是 0; + - 合同必须建立绑定; + + 2. round_2_update + - 目的:确认对同一条合同修改几个典型字段后,系统还能继续识别并推送 update。 + - 本轮修改字段: + - total_price + - manager_name + - manager_phone + - sign_date + - 判断方式: + - pipeline 返回码必须是 0; + - 绑定仍然存在; + - 数据集中的预期变更字段必须真的发生了变化。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/contract" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "supplier_1.jsonl", + "contract_1.jsonl", + ] + local_contract_id = "92e3de18-354c-4acf-9cb5-58ee55708fbd" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + # 用例 1:创建合同 + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract", + round_name="round_1_create", + purpose="首轮创建合同", + required_bindings={"contract": [local_contract_id]}, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + # 用例 2:更新合同几个基础字段 + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract", + round_name="round_2_update", + purpose="第二轮修改合同金额、负责人和签约日期,验证 update", + expected_changes={ + "contract": { + local_contract_id: [ + "total_price", + "manager_name", + "manager_phone", + "sign_date", + ] + } + }, + required_bindings={"contract": [local_contract_id]}, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="contract", + description="合同 domain 的批量闭环测试。基于 filtered_datasource 中的批量 company/project/supplier/contract 数据,先建立合同绑定,再修改其中 1 条合同,检查批量场景下的绑定、状态库和 update 行为。", + rounds=rounds, + ) \ No newline at end of file diff --git a/scripts/auto_test_domains/contract_change_case.py b/scripts/auto_test_domains/contract_change_case.py new file mode 100644 index 0000000..40080be --- /dev/null +++ b/scripts/auto_test_domains/contract_change_case.py @@ -0,0 +1,135 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) +CONTRACT_ID = "f3b9c510-568f-4bed-98a4-a602142e1957" +LOCAL_CONTRACT_CHANGE_ID = "d8f0a39c-0b4f-4f3e-9d91-8f6e7a11c001" + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + contract_change domain 回归。 + + 基于当前主测试项目的真实 project/contract 基线,覆盖: + + 1. round_1_create + - `POST /contract_change/create` + 2. round_2_update + - `PUT /contract_change/update` + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/contract_change" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "supplier_1.jsonl", + "project_1.jsonl", + "contract_1.jsonl", + ] + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_change", + round_name="round_1_create", + purpose="首轮创建合同变更,验证主测试项目上的 create_remote 路径", + required_bindings={ + "project": [LOCAL_PROJECT_ID], + "contract": [CONTRACT_ID], + "contract_change": [LOCAL_CONTRACT_CHANGE_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "contract_change": [LOCAL_CONTRACT_CHANGE_ID], + }, + expected_bound_fields={ + "remote": { + "contract_change": { + LOCAL_CONTRACT_CHANGE_ID: { + "project_id": REMOTE_PROJECT_ID, + "title": "自动化合同变更回归-创建", + "reason": "用于验证 contract_change create_remote 路径", + "after_amount": 9890.122299, + "change_time": "2025-11-14", + } + } + } + }, + coverage={ + "api": ["POST /contract_change/create"], + "notes": "直接依赖当前主测试项目与其既有合同,创建 1 条新的合同变更记录。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_change", + round_name="round_2_update", + purpose="第二轮更新合同变更标题/理由/金额/附件,验证 update 路径", + expected_changes={ + "contract_change": { + LOCAL_CONTRACT_CHANGE_ID: ["title", "reason", "after_amount", "attachment_ids"], + } + }, + required_bindings={ + "project": [LOCAL_PROJECT_ID], + "contract": [CONTRACT_ID], + "contract_change": [LOCAL_CONTRACT_CHANGE_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "contract_change": [LOCAL_CONTRACT_CHANGE_ID], + }, + expected_bound_fields={ + "remote": { + "contract_change": { + LOCAL_CONTRACT_CHANGE_ID: { + "title": "自动化合同变更回归-更新", + "reason": "用于验证 contract_change update 路径", + "after_amount": 9895.422299, + "attachment_ids.0": "8e72f2aa198341bf98e1441087f5246d", + "attachment_ids.1": "dc6ce1933e204cd3b1e97f1eed0cfa71", + } + } + } + }, + coverage={ + "api": ["PUT /contract_change/update"], + "notes": "在已绑定记录上显式验证 update handler 能把标题、理由、金额与附件变更推到远端。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="contract_change", + description="合同变更 domain 的闭环测试。基于主测试项目与既有合同,依次覆盖 create 与 update 两条接口。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/contract_settlement_case.py b/scripts/auto_test_domains/contract_settlement_case.py new file mode 100644 index 0000000..e16a616 --- /dev/null +++ b/scripts/auto_test_domains/contract_settlement_case.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + contract_settlement domain 的批量闭环回归。 + + 这里仍按真实依赖来组织数据,并以 filtered_datasource 中的批量 + supplier -> contract -> settlement 数据作为基础集: + + - settlement 依赖 `project_id` + - settlement 依赖 `contract_id` + - contract 又依赖 supplier + - 第二轮 settlement 的计划更新,会同步影响同一条 contract 的 + `sign_date` 与 `total_price` + + 所以这里不用“缺供应商的空合同”,而是直接选一组 + filtered_datasource 中真实存在、关系完整的 supplier -> contract -> settlement。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/contract_settlement" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "supplier_1.jsonl", + "contract_1.jsonl", + "contract_settlement_1.jsonl", + ] + local_supplier_id = "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f" + local_contract_id = "eba6d9e0-fad4-456d-a325-38f5bd064b33" + local_settlement_id = "c4ded355-fb10-46e8-b829-442bf42c16f1" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + # 用例 1:用真实依赖链先建立 supplier / contract / settlement 的绑定关系。 + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_settlement", + round_name="round_1_create", + purpose="首轮建立 supplier、contract、contract_settlement 的真实依赖链", + required_bindings={ + "supplier": [local_supplier_id], + "contract": [local_contract_id], + "contract_settlement": [local_settlement_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + # 用例 2:这条 rejected settlement 允许再次修改计划。 + # 本轮同时更新 settlement 与其对应 contract 的关键字段,保持两边一致。 + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_settlement", + round_name="round_2_update", + purpose="第二轮更新结算计划,并同步更新关联合同金额和签订日期", + expected_changes={ + "contract_settlement": { + local_settlement_id: [ + "contract_price", + "plan_start_date", + "plan_complete_date", + "plan_node", + ] + } + }, + required_bindings={ + "supplier": [local_supplier_id], + "contract": [local_contract_id], + "contract_settlement": [local_settlement_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="contract_settlement", + description="合同结算 domain 的批量闭环测试。基于 filtered_datasource 中真实存在的批量 supplier -> contract -> settlement 数据,验证 settlement 计划更新时不会破坏上游依赖,并保持批量场景下的状态库与绑定正常。", + rounds=rounds, + ) \ No newline at end of file diff --git a/scripts/auto_test_domains/contract_settlement_detail_case.py b/scripts/auto_test_domains/contract_settlement_detail_case.py new file mode 100644 index 0000000..9dff44a --- /dev/null +++ b/scripts/auto_test_domains/contract_settlement_detail_case.py @@ -0,0 +1,130 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + contract_settlement_detail domain 的批量闭环回归。 + + 选用同一条真实存在的 contract_settlement 作为 parent,构造 2 条新的明细: + + 1. round_1_create + - 建立 contract_settlement -> contract_settlement_detail 绑定; + - 覆盖 detail create 接口。 + 2. round_2_update + - 同时修改 2 条 detail 的 quantity / remark; + - 覆盖按 settlement_id 分组的批量 update 接口。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/contract_settlement_detail" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "supplier_1.jsonl", + "contract_1.jsonl", + "contract_settlement_1.jsonl", + ] + local_settlement_id = "c4ded355-fb10-46e8-b829-442bf42c16f1" + local_detail_ids = [ + "6ad2b1d0-1f86-46bb-9183-17d6c9882d31", + "ddf5dfd7-c244-46a3-992a-fce9c4a42072", + ] + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_settlement_detail", + round_name="round_1_create", + purpose="首轮在同一 settlement 下创建 2 条结算明细,建立 parent/detail 绑定", + required_bindings={ + "contract_settlement": [local_settlement_id], + "contract_settlement_detail": local_detail_ids, + }, + expected_bound_fields={ + "remote": { + "contract_settlement_detail": { + "6ad2b1d0-1f86-46bb-9183-17d6c9882d31": { + "date": "2025-10-19", + "quantity": 20000.0, + }, + "ddf5dfd7-c244-46a3-992a-fce9c4a42072": { + "date": "2025-10-20", + "quantity": 26000.5, + }, + } + } + }, + coverage={ + "api": ["POST /contract_settlement/detail/create"], + "notes": "在同一 settlement 下创建 2 条新明细,覆盖 detail create 路径。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="contract_settlement_detail", + round_name="round_2_update", + purpose="第二轮同时修改 2 条结算明细,验证按 settlement_id 分组的批量 update", + expected_changes={ + "contract_settlement_detail": { + "6ad2b1d0-1f86-46bb-9183-17d6c9882d31": ["quantity", "remark"], + "ddf5dfd7-c244-46a3-992a-fce9c4a42072": ["quantity", "remark"], + } + }, + required_bindings={ + "contract_settlement": [local_settlement_id], + "contract_settlement_detail": local_detail_ids, + }, + expected_bound_fields={ + "remote": { + "contract_settlement_detail": { + "6ad2b1d0-1f86-46bb-9183-17d6c9882d31": { + "quantity": 21000.0, + "remark": "自动化更新-明细1", + }, + "ddf5dfd7-c244-46a3-992a-fce9c4a42072": { + "quantity": 27500.75, + "remark": "自动化更新-明细2", + }, + } + } + }, + coverage={ + "api": ["PUT /contract_settlement/detail/update"], + "notes": "两条 detail 共用同一个 settlement_id,显式覆盖批量 update 接口。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="contract_settlement_detail", + description="合同结算明细 domain 的批量闭环测试。基于真实存在的 contract_settlement parent,先创建 2 条新 detail,再在第二轮同时更新两条明细,验证绑定与批量 update。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/lar_case.py b/scripts/auto_test_domains/lar_case.py new file mode 100644 index 0000000..4b17897 --- /dev/null +++ b/scripts/auto_test_domains/lar_case.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +REMOTE_LAR_ID = "718a9883-8479-4963-a58c-234d1984b117" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) +LOCAL_LAR_ID = make_local_data_id("lar", REMOTE_LAR_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + lar domain 回归。 + + LAR 随项目自动生成,因此重点验证: + + 1. round_1_create + - 既有 LAR 节点可正常加载并建立绑定。 + 2. round_2_update + - 同时修改主信息、搬迁信息、投资信息三个分组字段,确认 3 条 update API 都能走通。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/lar" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + ] + local_lar_id = LOCAL_LAR_ID + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project", "lar"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="lar", + round_name="round_1_create", + purpose="首轮建立 LAR 基线绑定,确认项目级自动生成数据可被识别", + required_bindings={ + "lar": [local_lar_id], + }, + expected_bound_fields={ + "remote": { + "lar": { + local_lar_id: { + "project_id": REMOTE_PROJECT_ID, + "completed_resettlement_pop": 83, + "completed_investment_amt": 24230.31, + "actual_rural_comp": 16644.28, + } + } + } + }, + coverage={ + "notes": "确认 LAR 可从 project all_info.lar 中加载并建立绑定。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="lar", + round_name="round_2_update", + purpose="第二轮同时修改主信息/搬迁/投资字段,验证 LAR 三条 update 子接口", + expected_changes={ + "lar": { + local_lar_id: [ + "actual_rural_comp", + "completed_resettlement_pop", + "completed_investment_amt", + ] + } + }, + required_bindings={ + "lar": [local_lar_id], + }, + expected_bound_fields={ + "remote": { + "lar": { + local_lar_id: { + "actual_rural_comp": 16645.28, + "completed_resettlement_pop": 84, + "completed_investment_amt": 24231.31, + } + } + } + }, + coverage={ + "api": [ + "PUT /lar/main", + "PUT /lar/resettlement", + "PUT /lar/investment", + ], + "notes": "单轮同时命中 3 个 LAR 子 schema,确认 handler 分组更新逻辑与后端接口都可用。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="lar", + description="移民征地 domain 的闭环测试。先绑定项目自动生成的 LAR 数据,再一次性验证主信息、搬迁、投资三条更新接口。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/lar_change_case.py b/scripts/auto_test_domains/lar_change_case.py new file mode 100644 index 0000000..672e2c3 --- /dev/null +++ b/scripts/auto_test_domains/lar_change_case.py @@ -0,0 +1,130 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) +LOCAL_LAR_CHANGE_ID = "a78be5df-c3a0-4bd7-8f31-9bdc2f22c001" + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + lar_change domain 回归。 + + 基于当前主测试项目的真实 project 基线,覆盖: + + 1. round_1_create + - `POST /lar/change` + 2. round_2_update + - `PUT /lar/change` + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/lar_change" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + ] + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="lar_change", + round_name="round_1_create", + purpose="首轮创建移民变更,验证 lar_change create_remote 路径", + required_bindings={ + "project": [LOCAL_PROJECT_ID], + "lar_change": [LOCAL_LAR_CHANGE_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "lar_change": [LOCAL_LAR_CHANGE_ID], + }, + expected_bound_fields={ + "remote": { + "lar_change": { + LOCAL_LAR_CHANGE_ID: { + "project_id": REMOTE_PROJECT_ID, + "title": "自动化移民变更回归-创建", + "reason": "用于验证 lar_change create_remote 路径", + "after_amount": 1.5, + "change_time": "2025-11-12", + } + } + } + }, + coverage={ + "api": ["POST /lar/change"], + "notes": "在当前主测试项目上创建 1 条新的移民变更记录,确认 create 接口可用。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="lar_change", + round_name="round_2_update", + purpose="第二轮更新移民变更标题/理由/金额/附件,验证 update 路径", + expected_changes={ + "lar_change": { + LOCAL_LAR_CHANGE_ID: ["title", "reason", "after_amount", "attachment_ids"], + } + }, + required_bindings={ + "project": [LOCAL_PROJECT_ID], + "lar_change": [LOCAL_LAR_CHANGE_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "lar_change": [LOCAL_LAR_CHANGE_ID], + }, + expected_bound_fields={ + "remote": { + "lar_change": { + LOCAL_LAR_CHANGE_ID: { + "title": "自动化移民变更回归-更新", + "reason": "用于验证 lar_change update 路径", + "after_amount": 2.5, + "attachment_ids.0": "3f5f674fd36c413aa121403d2199f02a", + "attachment_ids.1": "fb6e840376594c13a527ab10a0580e29", + } + } + } + }, + coverage={ + "api": ["PUT /lar/change"], + "notes": "在已绑定 lar_change 记录上验证更新链路,确认远端标题、理由、金额与附件真正变化。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="lar_change", + description="移民变更 domain 的闭环测试。基于主测试项目,依次覆盖 lar_change 的 create 与 update。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/material_case.py b/scripts/auto_test_domains/material_case.py new file mode 100644 index 0000000..cd4771d --- /dev/null +++ b/scripts/auto_test_domains/material_case.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + material domain 的批量闭环回归。 + + 这一组用例沿用 filtered_datasource 中的批量 contract/material 数据, + 只聚焦 1 条目标物资,验证两个关键能力: + + 1. round_1_create + - 先建立 contract -> material 的绑定; + 2. round_2_update + - 同一条 material 修改计划信息; + - 覆盖 `MaterialPlanUpdate`。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/material" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "supplier_1.jsonl", + "contract_1.jsonl", + "contract_settlement_1.jsonl", + "material_1.jsonl", + ] + local_contract_id = "8cb77da2-1460-42b0-9ca4-7aa5afa58b99" + local_material_id = "236c2610-f210-450a-846b-2241b2fd07f4" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="material", + round_name="round_1_create", + purpose="首轮建立 contract、material 的真实依赖链", + required_bindings={ + "contract": [local_contract_id], + "material": [local_material_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="material", + round_name="round_2_update", + purpose="第二轮修改物资计划节点,验证 plan update", + expected_changes={ + "material": { + local_material_id: [ + "contract_quantity", + "plan_complete_date", + "plan_node", + ] + } + }, + required_bindings={ + "contract": [local_contract_id], + "material": [local_material_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="material", + description="物资 domain 的批量闭环测试。基于 filtered_datasource 中真实存在的批量 contract -> material 数据,先建立绑定,再在第二轮验证计划信息更新。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/material_detail_case.py b/scripts/auto_test_domains/material_detail_case.py new file mode 100644 index 0000000..a049fda --- /dev/null +++ b/scripts/auto_test_domains/material_detail_case.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + material_detail domain 的批量闭环回归。 + + 选 1 条真实存在的物资明细,覆盖: + + 1. round_1_create + - 建立 material -> material_detail 绑定; + 2. round_2_update + - 修改明细数量与备注; + - 同时校验 parent material 的聚合字段变化不会破坏闭环。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/material_detail" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "supplier_1.jsonl", + "contract_1.jsonl", + "contract_settlement_1.jsonl", + "material_1.jsonl", + "material_detail_1.jsonl", + ] + local_material_id = "506a1188-0c20-44fc-8dba-1a36a074bfea" + local_detail_id = "e996f4ef-3cff-476c-9b1b-a3d940ac24d6" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="material_detail", + round_name="round_1_create", + purpose="首轮建立 material、material_detail 的真实依赖链", + required_bindings={ + "material": [local_material_id], + "material_detail": [local_detail_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="material_detail", + round_name="round_2_update", + purpose="第二轮修改物资明细数量与备注,验证 detail update", + expected_changes={ + "material_detail": { + local_detail_id: [ + "quantity", + "remark", + ] + } + }, + required_bindings={ + "material": [local_material_id], + "material_detail": [local_detail_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="material_detail", + description="物资明细 domain 的批量闭环测试。基于 filtered_datasource 中真实存在的批量 material -> material_detail 数据,先建立绑定,再验证明细更新及 parent material 聚合结果。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/personnel_case.py b/scripts/auto_test_domains/personnel_case.py new file mode 100644 index 0000000..240e95b --- /dev/null +++ b/scripts/auto_test_domains/personnel_case.py @@ -0,0 +1,123 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + personnel domain 的闭环回归。 + + 选 1 条真实存在的 personnel 基线,重点覆盖: + + 1. round_1_create + - 建立 project / contract / personnel 绑定; + - 确认 personnel 基线可被正常识别。 + 2. round_2_update + - 同时修改基础字段 `contract_id` 与计划字段; + - 显式验证当前 handler 的 personnel update 路径能把计划字段推到远端。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/personnel" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "contract_1.jsonl", + ] + local_personnel_id = "2006708a-dae4-4874-9207-22889cf2c886" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="personnel", + round_name="round_1_create", + purpose="首轮建立 personnel 基线绑定,确认 project/contract 依赖链可用", + required_bindings={ + "personnel": [local_personnel_id], + }, + expected_bound_fields={ + "remote": { + "personnel": { + local_personnel_id: { + "code": "personnel", + "project_id": REMOTE_PROJECT_ID, + } + } + } + }, + coverage={ + "api": ["GET /personnel/list"], + "notes": "确认 personnel 基线能被远端正确加载并建立绑定。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="personnel", + round_name="round_2_update", + purpose="第二轮同时修改 personnel 的基础字段与计划字段,验证 update 路径", + expected_changes={ + "personnel": { + local_personnel_id: [ + "contract_id", + "plan_start_date", + "plan_start_quantity", + "plan_exit_date", + "plan_node", + ] + } + }, + required_bindings={ + "personnel": [local_personnel_id], + }, + expected_bound_fields={ + "remote": { + "personnel": { + local_personnel_id: { + "plan_start_date": "2024-05-01", + "plan_start_quantity": 12, + "plan_exit_date": "2026-12-31", + "plan_node.0.date": "2024-06-01", + "plan_node.1.quantity": 20.0, + "plan_node.2.date": "2026-06-30", + } + } + } + }, + coverage={ + "api": ["PUT /personnel/update"], + "notes": "当前 handler 将基础更新与计划更新都走 personnel update 路径;本轮显式校验远端计划字段是否真正变化。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="personnel", + description="人员 domain 的闭环测试。以 1 条真实 personnel 基线为核心,先建立绑定,再在第二轮同时验证基础字段更新与计划字段更新。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/personnel_detail_case.py b/scripts/auto_test_domains/personnel_detail_case.py new file mode 100644 index 0000000..b61c497 --- /dev/null +++ b/scripts/auto_test_domains/personnel_detail_case.py @@ -0,0 +1,129 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + personnel_detail domain 的批量闭环回归。 + + 选 1 条真实存在的 personnel 作为 parent,构造 2 条新的 personnel_detail: + + 1. round_1_create + - 建立 personnel -> personnel_detail 绑定; + - 覆盖 detail create 接口。 + 2. round_2_update + - 同时修改 2 条 detail 的 quantity / remark; + - 覆盖按 personnel_id 分组的批量 update 接口。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/personnel_detail" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "contract_1.jsonl", + "personnel_1.jsonl", + ] + local_personnel_id = "2006708a-dae4-4874-9207-22889cf2c886" + local_detail_ids = [ + "1cda9548-ff40-431d-a012-fdb4dc8ce7f1", + "b21b0365-6134-409a-9fa1-d0f6c1d22944", + ] + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="personnel_detail", + round_name="round_1_create", + purpose="首轮在同一 personnel 下创建 2 条明细,建立 parent/detail 绑定", + required_bindings={ + "personnel": [local_personnel_id], + "personnel_detail": local_detail_ids, + }, + expected_bound_fields={ + "remote": { + "personnel_detail": { + "1cda9548-ff40-431d-a012-fdb4dc8ce7f1": { + "date": "2024-06-15", + "quantity": 12, + }, + "b21b0365-6134-409a-9fa1-d0f6c1d22944": { + "date": "2024-08-01", + "quantity": 18, + }, + } + } + }, + coverage={ + "api": ["POST /personnel/detail/create"], + "notes": "在同一 personnel 下创建 2 条新 detail,覆盖明细 create 路径。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="personnel_detail", + round_name="round_2_update", + purpose="第二轮同时修改 2 条 personnel_detail,验证按 personnel_id 分组的批量 update", + expected_changes={ + "personnel_detail": { + "1cda9548-ff40-431d-a012-fdb4dc8ce7f1": ["quantity", "remark"], + "b21b0365-6134-409a-9fa1-d0f6c1d22944": ["quantity", "remark"], + } + }, + required_bindings={ + "personnel": [local_personnel_id], + "personnel_detail": local_detail_ids, + }, + expected_bound_fields={ + "remote": { + "personnel_detail": { + "1cda9548-ff40-431d-a012-fdb4dc8ce7f1": { + "quantity": 15, + "remark": "自动化更新-明细1", + }, + "b21b0365-6134-409a-9fa1-d0f6c1d22944": { + "quantity": 22, + "remark": "自动化更新-明细2", + }, + } + } + }, + coverage={ + "api": ["PUT /personnel/detail/update"], + "notes": "两条 detail 共用同一个 personnel_id,显式覆盖批量 detail update 接口。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="personnel_detail", + description="人员明细 domain 的批量闭环测试。基于真实 personnel parent,先创建 2 条新 detail,再在第二轮同时更新两条明细,验证绑定与批量 update。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/preparation_case.py b/scripts/auto_test_domains/preparation_case.py new file mode 100644 index 0000000..b13a340 --- /dev/null +++ b/scripts/auto_test_domains/preparation_case.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + preparation domain 回归。 + + 该类节点无法通过独立 create 接口创建,只能依赖项目恢复/创建时自动生成。 + 因此这里验证: + + 1. round_1_create + - 通过恢复后的 project -> preparation 自动节点建立绑定; + 2. round_2_update + - 修改 1 条未取得里程碑的 `is_exist`,验证 update 接口。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/preparation" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "preparation_1.jsonl", + "production_1.jsonl", + ] + remote_project_id = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + remote_preparation_id = "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f" + local_project_id = make_local_data_id("project", remote_project_id) + local_preparation_id = make_local_data_id("preparation", remote_preparation_id) + project_id_remap = { + "remote_project_id": remote_project_id, + "local_project_id": local_project_id, + "remap_node_types": {"project", "preparation", "production", "project_detail_data"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="preparation", + round_name="round_1_create", + purpose="首轮通过项目恢复生成 preparation 节点并建立绑定", + required_bindings={ + "project": [local_project_id], + "preparation": [local_preparation_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + "preparation": {local_preparation_id: remote_preparation_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "preparation": [local_preparation_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="preparation", + round_name="round_2_update", + purpose="第二轮修改未取得里程碑的 is_exist 与 acquire_date,验证 preparation update", + expected_changes={ + "preparation": { + local_preparation_id: ["is_exist", "acquire_date"], + } + }, + required_bindings={ + "project": [local_project_id], + "preparation": [local_preparation_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + "preparation": {local_preparation_id: remote_preparation_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "preparation": [local_preparation_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="preparation", + description="项目里程碑 domain 回归。通过数据库恢复后的项目自动节点建立绑定,再验证单条里程碑的有效更新。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/production_case.py b/scripts/auto_test_domains/production_case.py new file mode 100644 index 0000000..ecee6d2 --- /dev/null +++ b/scripts/auto_test_domains/production_case.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + production domain 回归。 + + 该类节点无法通过独立 create 接口创建,只能依赖项目恢复/创建时自动生成。 + 因此这里验证: + + 1. round_1_create + - 通过恢复后的 project -> production 自动节点建立绑定; + 2. round_2_update + - 修改 1 条未取得投产节点的 `is_exist`,验证 update 接口。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/production" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + "preparation_1.jsonl", + "production_1.jsonl", + ] + remote_project_id = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + remote_production_id = "0f957d3d-367a-4f24-a6c8-0be465189335" + local_project_id = make_local_data_id("project", remote_project_id) + local_production_id = make_local_data_id("production", remote_production_id) + project_id_remap = { + "remote_project_id": remote_project_id, + "local_project_id": local_project_id, + "remap_node_types": {"project", "preparation", "production", "project_detail_data"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="production", + round_name="round_1_create", + purpose="首轮通过项目恢复生成 production 节点并建立绑定", + required_bindings={ + "project": [local_project_id], + "production": [local_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + "production": {local_production_id: remote_production_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "production": [local_production_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="production", + round_name="round_2_update", + purpose="第二轮修改未取得投产节点的 is_exist 与 acquire_date,验证 production update", + expected_changes={ + "production": { + local_production_id: ["is_exist", "acquire_date"], + } + }, + required_bindings={ + "project": [local_project_id], + "production": [local_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + "production": {local_production_id: remote_production_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "production": [local_production_id], + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="production", + description="项目投产节点 domain 回归。通过数据库恢复后的项目自动节点建立绑定,再验证单条投产节点的有效更新。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/project_case.py b/scripts/auto_test_domains/project_case.py new file mode 100644 index 0000000..bcd4cd5 --- /dev/null +++ b/scripts/auto_test_domains/project_case.py @@ -0,0 +1,192 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + project domain 回归。 + + 使用 remap 后的本地 project ID,避免直接复用真实本地 ID,覆盖: + + 1. 绑定项目基线 + 2. `PUT /project` 与 `PUT /project/key_constraints` + 3. `PUT /project/complete_investment` + `PUT /project/investment_decision` + `PUT /project/dynamic_investment` + `PUT /project/settlement_investment` + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/project" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project"}, + "project_update_direction": "push", + "project_local_orphan_action": "none", + "project_remote_orphan_action": "none", + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_bind", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=["company_1.jsonl"], + domain_name="project", + round_name="round_1_bind", + purpose="首轮建立 project 基线绑定,确认项目详情可正常加载", + required_bindings={ + "project": [LOCAL_PROJECT_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "project": [LOCAL_PROJECT_ID], + }, + expected_bound_fields={ + "remote": { + "project": { + LOCAL_PROJECT_ID: { + "name": "金沙江上游昌波水电站", + "manager_name": "杜光远", + "progress_type": "C", + } + } + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "api": ["GET /project", "GET /project/all_info"], + "notes": "先验证 project 主记录与 all_info 可被正确加载并建立绑定。", + }, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_base_info_update", + previous_dataset_dir=f"{dataset_root}/round_1_bind", + base_dataset_dir=filtered_root, + base_dataset_files=["company_1.jsonl"], + domain_name="project", + round_name="round_2_base_info_update", + purpose="第二轮修改项目基础信息与关键制约,验证 project 基础更新接口", + expected_changes={ + "project": { + LOCAL_PROJECT_ID: [ + "short_name", + "manager_name", + "manager_phone", + "key_constraints", + "key_constraints_remark", + ], + } + }, + required_bindings={ + "project": [LOCAL_PROJECT_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "project": [LOCAL_PROJECT_ID], + }, + expected_bound_fields={ + "remote": { + "project": { + LOCAL_PROJECT_ID: { + "short_name": "昌波回归项目", + "manager_name": "自动化负责人A", + "manager_phone": "13900001234", + "key_constraints": "QT", + "key_constraints_remark": "自动化回归关键制约备注", + } + } + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "api": ["PUT /project", "PUT /project/key_constraints"], + "notes": "同一轮同时命中项目基础信息与关键制约更新接口。", + }, + ) + rounds.append(round_2) + + round_3 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_3_investment_update", + previous_dataset_dir=f"{dataset_root}/round_2_base_info_update", + base_dataset_dir=filtered_root, + base_dataset_files=["company_1.jsonl"], + domain_name="project", + round_name="round_3_investment_update", + purpose="第三轮修改投决/完成投资/动态投资/结算投资字段,验证剩余 4 个 project 更新接口", + expected_changes={ + "project": { + LOCAL_PROJECT_ID: [ + "investment_decision_capacity", + "investment_decision_date", + "complete_investment", + "dynamic_investment", + "implementation_estimate", + "static_total_investment", + "completed_investment", + ], + } + }, + required_bindings={ + "project": [LOCAL_PROJECT_ID], + }, + expected_binding_pairs={ + "project": {LOCAL_PROJECT_ID: REMOTE_PROJECT_ID}, + }, + require_distinct_binding_ids={ + "project": [LOCAL_PROJECT_ID], + }, + expected_bound_fields={ + "remote": { + "project": { + LOCAL_PROJECT_ID: { + "investment_decision_capacity": 83.1, + "investment_decision_date": "2021-08-15", + "complete_investment": 125000.0, + "dynamic_investment": 1413000.5, + "implementation_estimate": 1225000.0, + "static_total_investment": 1224300.0, + "completed_investment": 194500.0, + } + } + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "api": [ + "PUT /project/complete_investment", + "PUT /project/investment_decision", + "PUT /project/dynamic_investment", + "PUT /project/settlement_investment", + ], + "notes": "单轮覆盖 project 剩余 4 条投资类更新接口。", + }, + ) + rounds.append(round_3) + + return build_domain_report( + domain="project", + description="项目 domain 的闭环测试。通过 remap 后的本地 project,覆盖绑定与 6 条 project 更新接口,并使用当前测试账号可访问的项目基线。", + rounds=rounds, + ) \ No newline at end of file diff --git a/scripts/auto_test_domains/project_detail_data_case.py b/scripts/auto_test_domains/project_detail_data_case.py new file mode 100644 index 0000000..512cd71 --- /dev/null +++ b/scripts/auto_test_domains/project_detail_data_case.py @@ -0,0 +1,427 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + project_detail_data / project_detail domain 回归。 + + 目标:覆盖 `project_detail_data` 当前支持的全部 6 个 key 及其对应更新接口: + + - `plan_construction` → `PUT /project/plan_construction` + - `actual_construction` → `PUT /project/actual_construction` + - `ensure_production` → `PUT /project/ensure_capacity` + - `climb_production` → `PUT /project/climb_capacity` + - `challenge_production` → `PUT /project/challenge_capacity` + - `production` → `PUT /project/production_capacity` + + 其中 `production` 在当前水电项目上主要验证“推送后 project 本身字段变更”; + `ensure/climb/challenge` 默认策略是 pull,本用例会在临时 profile 中仅对当前 key 切到 push, + 以确认对应后端更新接口真实可用,并在报告中展示字段校验结果。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/project_detail_data" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + ] + remote_project_id = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + remote_actual_construction_id = "c99ae2e4-809e-47dd-8b86-61674b6a5bea" + remote_production_id = "0b3f7e2d-9dc7-4f71-aac9-c9e7093df64f" + seed_ensure_production_id = "11111111-1111-4111-8111-111111111111" + seed_climb_production_id = "22222222-2222-4222-8222-222222222222" + seed_challenge_production_id = "33333333-3333-4333-8333-333333333333" + seed_plan_construction_id = "4bc5e9db-c9dc-41f1-a77d-574b4fe37b01" + local_project_id = make_local_data_id("project", remote_project_id) + local_actual_construction_id = make_local_data_id("project_detail_data", remote_actual_construction_id) + local_production_id = make_local_data_id("project_detail_data", remote_production_id) + local_plan_construction_id = make_local_data_id("project_detail_data", seed_plan_construction_id) + local_ensure_production_id = make_local_data_id("project_detail_data", seed_ensure_production_id) + local_climb_production_id = make_local_data_id("project_detail_data", seed_climb_production_id) + local_challenge_production_id = make_local_data_id("project_detail_data", seed_challenge_production_id) + project_id_remap = { + "remote_project_id": remote_project_id, + "local_project_id": local_project_id, + "remap_node_types": {"project", "preparation", "production", "project_detail_data"}, + } + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_1_create", + purpose="首轮通过项目恢复生成 project_detail_data 节点并建立绑定", + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_actual_construction_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_actual_construction_id], + }, + expected_bound_fields={ + "remote": { + "project_detail_data": { + local_actual_construction_id: { + "key": "actual_construction", + "value.0.capacity": 82.6, + "value.0.date": "2023-09-25", + } + } + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "keys": ["actual_construction"], + "api": ["PUT /project/actual_construction"], + "notes": "建立 project / actual_construction 绑定并确认基线明细加载正确。", + }, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_2_update", + purpose="第二轮修改 actual_construction 明细容量,验证 project_detail update", + expected_changes={ + "project_detail_data": { + local_actual_construction_id: ["value"], + }, + "project": { + local_project_id: [ + "actual_construction_capacity", + "actual_construction_date", + "accumulated_construction_capacity", + ], + } + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_actual_construction_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_actual_construction_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "actual_construction_capacity": 5.5, + "actual_construction_date": "2026-02-18", + "accumulated_construction_capacity": 5.5, + } + }, + "project_detail_data": { + local_actual_construction_id: { + "key": "actual_construction", + "value.0.capacity": 5.5, + "value.0.date": "2026-02-18", + } + }, + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "keys": ["actual_construction"], + "api": ["PUT /project/actual_construction"], + "notes": "确认实际开工接口会同步更新 project 实际开工日期/容量与累计开工容量。", + }, + ) + rounds.append(round_2) + + round_3 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_3_plan_construction_create", + previous_dataset_dir=f"{dataset_root}/round_2_update", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_3_plan_construction_create", + purpose="创建并推送 plan_construction,验证 /project/plan_construction 及 project 字段联动", + expected_changes={ + "project": { + local_project_id: ["plan_construction_capacity", "plan_construction_date"], + }, + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_plan_construction_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_plan_construction_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "plan_construction_capacity": 6.6, + "plan_construction_date": "2026-02-20", + } + }, + "project_detail_data": { + local_plan_construction_id: { + "key": "plan_construction", + "value.0.capacity": 6.6, + "value.0.date": "2026-02-20", + } + }, + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "keys": ["plan_construction"], + "api": ["PUT /project/plan_construction"], + "notes": "确认计划开工接口可以创建 detail,并同步 project 计划开工字段。", + }, + ) + rounds.append(round_3) + + round_5 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_5_ensure_production_push", + previous_dataset_dir=f"{dataset_root}/round_3_plan_construction_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_5_ensure_production_push", + purpose="推送 ensure_production,验证 /project/ensure_capacity 接口与 project.ensure_production_capacity 联动", + expected_changes={ + "project": { + local_project_id: ["ensure_production_capacity"], + }, + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_ensure_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_ensure_production_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "ensure_production_capacity": 21.0, + } + }, + "project_detail_data": { + local_ensure_production_id: { + "key": "ensure_production", + "value.0.year": 2025, + "value.0.capacity": 51.0, + "value.1.year": 2026, + "value.1.capacity": 21.0, + } + }, + } + }, + project_id_remap=project_id_remap, + project_detail_push_keys={"ensure_production"}, + report_root=report_root, + coverage={ + "keys": ["ensure_production"], + "api": ["PUT /project/ensure_capacity"], + "notes": "临时将 ensure_production 从 pull 切为 push,仅用于确认后端更新接口可测通。", + }, + ) + rounds.append(round_5) + + round_6 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_6_climb_production_push", + previous_dataset_dir=f"{dataset_root}/round_5_ensure_production_push", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_6_climb_production_push", + purpose="推送 climb_production,验证 /project/climb_capacity 接口与 project.climb_production_capacity 联动", + expected_changes={ + "project": { + local_project_id: ["climb_production_capacity"], + }, + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_climb_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_climb_production_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "climb_production_capacity": 22.0, + } + }, + "project_detail_data": { + local_climb_production_id: { + "key": "climb_production", + "value.0.capacity": 102.0, + "value.1.capacity": 22.0, + "value.0.year": 2025, + "value.1.year": 2026, + } + }, + } + }, + project_id_remap=project_id_remap, + project_detail_push_keys={"climb_production"}, + report_root=report_root, + coverage={ + "keys": ["climb_production"], + "api": ["PUT /project/climb_capacity"], + "notes": "验证登高投产接口,同时覆盖后端对 climb >= ensure 的约束路径。", + }, + ) + rounds.append(round_6) + + round_7 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_7_challenge_production_push", + previous_dataset_dir=f"{dataset_root}/round_6_climb_production_push", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_7_challenge_production_push", + purpose="推送 challenge_production,验证 /project/challenge_capacity 接口与 project.challenge_production_capacity 联动", + expected_changes={ + "project": { + local_project_id: ["challenge_production_capacity"], + }, + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_challenge_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_challenge_production_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "challenge_production_capacity": 23.0, + } + }, + "project_detail_data": { + local_challenge_production_id: { + "key": "challenge_production", + "value.0.capacity": 102.0, + "value.1.capacity": 23.0, + "value.0.year": 2025, + "value.1.year": 2026, + } + }, + } + }, + project_id_remap=project_id_remap, + project_detail_push_keys={"challenge_production"}, + report_root=report_root, + coverage={ + "keys": ["challenge_production"], + "api": ["PUT /project/challenge_capacity"], + "notes": "验证揭榜投产接口,同时覆盖后端对 challenge >= climb 的约束路径。", + }, + ) + rounds.append(round_7) + + round_4 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_4_production_update", + previous_dataset_dir=f"{dataset_root}/round_3_plan_construction_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="project_detail_data", + round_name="round_4_production_update", + purpose="推送 production,验证 /project/production_capacity 在当前水电项目上会更新 project 投产计划字段", + expected_changes={ + "project": { + local_project_id: [ + "plan_production_date", + "plan_full_production_date", + ], + } + }, + required_bindings={ + "project": [local_project_id], + "project_detail_data": [local_production_id], + }, + expected_binding_pairs={ + "project": {local_project_id: remote_project_id}, + }, + require_distinct_binding_ids={ + "project": [local_project_id], + "project_detail_data": [local_production_id], + }, + expected_bound_fields={ + "remote": { + "project": { + local_project_id: { + "plan_production_date": "2026-04-01", + "plan_full_production_date": "2026-06-01", + } + }, + "project_detail_data": { + local_production_id: { + "key": "production", + "value.0.capacity": 51.0, + "value.0.date": "2025-12-27", + } + }, + } + }, + project_id_remap=project_id_remap, + report_root=report_root, + coverage={ + "keys": ["production"], + "api": ["PUT /project/production_capacity"], + "notes": "在可访问项目上复用现有 production 明细记录,验证生产接口会更新 project 投产计划字段并保持 detail 绑定可解析。", + }, + ) + rounds.append(round_4) + + return build_domain_report( + domain="project_detail_data", + description="项目详情 domain 回归。覆盖 plan_construction / actual_construction / ensure_production / climb_production / challenge_production / production 六类 key,并在报告中展示对应接口与 project 字段联动校验。", + rounds=rounds, + ) diff --git a/scripts/auto_test_domains/supplier_case.py b/scripts/auto_test_domains/supplier_case.py new file mode 100644 index 0000000..a25a20f --- /dev/null +++ b/scripts/auto_test_domains/supplier_case.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, run_pipeline_round + + +SUPPLIER_ID = "1ff5b102-2f9e-496c-8591-1a8e32407c7f" + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + supplier domain 回归。 + + supplier 当前只测读取/绑定,不支持 create/update/delete。 + 同时借此确认 strategy 中没有通过“已绑定后直接跳过更新”来短路通过。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/supplier" + common_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/common_baseline" + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_bind", + previous_dataset_dir=None, + base_dataset_dir=common_root, + base_dataset_files=["supplier_1.jsonl"], + domain_name="supplier", + round_name="round_1_bind", + purpose="加载供应商列表并验证 supplier 绑定链路", + required_bindings={ + "supplier": [SUPPLIER_ID], + }, + expected_binding_pairs={ + "supplier": {SUPPLIER_ID: SUPPLIER_ID}, + }, + expected_bound_fields={ + "remote": { + "supplier": { + SUPPLIER_ID: { + "name": "中国葛洲坝集团三峡建设工程有限公司", + "credit_code": "91420000615573462P", + } + } + } + }, + coverage={ + "api": ["GET /supplier/list"], + "notes": "supplier 为只读域,本用例验证远端加载、自动绑定和基础字段一致性。", + }, + ) + + return build_domain_report( + domain="supplier", + description="供应商 domain 的只读回归测试。验证 supplier 列表加载、绑定与关键字段对齐。", + rounds=[round_1], + ) \ No newline at end of file diff --git a/scripts/auto_test_domains/units_case.py b/scripts/auto_test_domains/units_case.py new file mode 100644 index 0000000..2d2fece --- /dev/null +++ b/scripts/auto_test_domains/units_case.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +from typing import Any + +from auto_test_domains.base import build_domain_report, make_local_data_id, run_pipeline_round + + +REMOTE_PROJECT_ID = "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" +REMOTE_UNITS_ID = "05bdc3b1-f455-4182-a50f-39ddfb3f5a69" +LOCAL_PROJECT_ID = make_local_data_id("project", REMOTE_PROJECT_ID) +LOCAL_UNITS_ID = make_local_data_id("units", REMOTE_UNITS_ID) + + +def run_case(config: dict[str, Any], report_root) -> dict[str, Any]: + """ + units domain 回归。 + + 机组数据随项目自动生成,不支持 create/delete,因此这里只验证: + + 1. round_1_create + - 现有机组节点可以被正确加载并建立绑定。 + 2. round_2_update + - 修改 `actual_production_date`,确认 `PUT /units` 更新链路可用。 + """ + + dataset_root = f"{config['project_root']}/tests/fixtures/auto_sync/datasource/units" + filtered_root = f"{config['project_root']}/filtered_datasource/datasource/filtered" + base_dataset_files = [ + "company_1.jsonl", + "project_1.jsonl", + ] + local_units_id = LOCAL_UNITS_ID + project_id_remap = { + "remote_project_id": REMOTE_PROJECT_ID, + "local_project_id": LOCAL_PROJECT_ID, + "remap_node_types": {"project", "units"}, + } + + rounds: list[dict[str, Any]] = [] + + round_1 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_1_create", + previous_dataset_dir=None, + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="units", + round_name="round_1_create", + purpose="首轮建立机组基线绑定,确认项目自动生成的 units 节点可正常识别", + required_bindings={ + "units": [local_units_id], + }, + expected_bound_fields={ + "remote": { + "units": { + local_units_id: { + "project_id": REMOTE_PROJECT_ID, + "serial_number": 1, + } + } + } + }, + coverage={ + "notes": "确认 units 可从 project all_info.generator_units 中加载并建立绑定。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_1) + + round_2 = run_pipeline_round( + config=config, + dataset_dir=f"{dataset_root}/round_2_update", + previous_dataset_dir=f"{dataset_root}/round_1_create", + base_dataset_dir=filtered_root, + base_dataset_files=base_dataset_files, + domain_name="units", + round_name="round_2_update", + purpose="第二轮回填机组实际投产日期,验证 units update 路径", + expected_changes={ + "units": { + local_units_id: ["actual_production_date"], + } + }, + required_bindings={ + "units": [local_units_id], + }, + expected_bound_fields={ + "remote": { + "units": { + local_units_id: { + "actual_production_date": "2025-12-20", + } + } + } + }, + coverage={ + "api": ["PUT /units"], + "notes": "显式验证 `actual_production_date` 会通过 units 更新接口推送到远端。", + }, + project_id_remap=project_id_remap, + report_root=report_root, + ) + rounds.append(round_2) + + return build_domain_report( + domain="units", + description="机组 domain 的闭环测试。先确认自动生成节点可绑定,再验证 `PUT /units` 更新机组实际投产日期。", + rounds=rounds, + ) diff --git a/scripts/auto_test_init.py b/scripts/auto_test_init.py new file mode 100644 index 0000000..ca1855d --- /dev/null +++ b/scripts/auto_test_init.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import argparse +import json +import time +from pathlib import Path + +from auto_test_lib import ( + create_couchdb_database, + delete_couchdb_database, + ensure_parent, + load_yaml_config, + recreate_dir, + remove_path, + run_command, + start_background_process, + stop_backend_processes, + stop_process_from_pid_file, + wait_http_ready, +) + + +def clear_environment(config_path: str | Path) -> dict: + config = load_yaml_config(config_path) + + backend = config["backend"] + couchdb = config.get("couchdb", {}) + paths = config["paths"] + + backend_stopped = stop_process_from_pid_file(backend["pid_file"]) + backend_killed_pgids = stop_backend_processes(backend["root_dir"]) + + couchdb_delete_status = None + if couchdb.get("enabled", False): + couchdb_delete_status = delete_couchdb_database( + couchdb["base_url"], + couchdb["database"], + couchdb.get("username", ""), + couchdb.get("password", ""), + ) + if couchdb.get("recreate_after_delete", False): + create_couchdb_database( + couchdb["base_url"], + couchdb["database"], + couchdb.get("username", ""), + couchdb.get("password", ""), + ) + + persistence_db_existed = Path(paths["persistence_db"]).exists() + temp_dir_existed = Path(paths["temp_data_dir"]).exists() + pipeline_log_dir_existed = Path(paths["pipeline_log_dir"]).exists() + + remove_path(paths["persistence_db"]) + recreate_dir(paths["temp_data_dir"]) + recreate_dir(paths["pipeline_log_dir"]) + ensure_parent(backend["log_file"]) + + return { + "backend_stopped": backend_stopped, + "backend_killed_pgids": backend_killed_pgids, + "couchdb_delete_status": couchdb_delete_status, + "persistence_db_removed": persistence_db_existed and not Path(paths["persistence_db"]).exists(), + "temp_dir_reset": temp_dir_existed and Path(paths["temp_data_dir"]).exists(), + "pipeline_log_dir_reset": pipeline_log_dir_existed and Path(paths["pipeline_log_dir"]).exists(), + "persistence_db": paths["persistence_db"], + "temp_data_dir": paths["temp_data_dir"], + } + + +def initialize_environment(config_path: str | Path) -> dict: + config = load_yaml_config(config_path) + + backend = config["backend"] + couchdb = config.get("couchdb", {}) + paths = config["paths"] + backend_env = backend.get("env", {}) + + stop_process_from_pid_file(backend["pid_file"]) + stop_backend_processes(backend["root_dir"]) + + if couchdb.get("enabled", False): + delete_couchdb_database( + couchdb["base_url"], + couchdb["database"], + couchdb.get("username", ""), + couchdb.get("password", ""), + ) + if couchdb.get("recreate_after_delete", False): + create_couchdb_database( + couchdb["base_url"], + couchdb["database"], + couchdb.get("username", ""), + couchdb.get("password", ""), + ) + + remove_path(paths["persistence_db"]) + recreate_dir(paths["temp_data_dir"]) + recreate_dir(paths["pipeline_log_dir"]) + ensure_parent(backend["log_file"]) + ensure_parent(backend["pid_file"]) + + restore_result = None + for attempt in range(3): + restore_result = run_command(backend["restore_command"], backend["root_dir"], extra_env=backend_env) + if restore_result.returncode == 0: + break + if attempt < 2: + time.sleep(2) + if restore_result is None or restore_result.returncode != 0: + stdout = "" if restore_result is None else restore_result.stdout + stderr = "" if restore_result is None else restore_result.stderr + raise RuntimeError( + "restore_database 执行失败\n" + f"stdout:\n{stdout}\n\n" + f"stderr:\n{stderr}" + ) + + process = start_background_process( + backend["start_command"], + backend["root_dir"], + backend["log_file"], + extra_env=backend_env, + ) + Path(backend["pid_file"]).write_text(str(process.pid), encoding="utf-8") + + wait_http_ready( + backend["ready_url"], + int(backend.get("ready_timeout_seconds", 120)), + int(backend.get("ready_interval_seconds", 2)), + ) + + return { + "restore_returncode": restore_result.returncode, + "restore_stdout_tail": restore_result.stdout[-2000:], + "restore_stderr_tail": restore_result.stderr[-2000:], + "backend_pid": process.pid, + "backend_log_file": backend["log_file"], + "backend_root_dir": backend["root_dir"], + "backend_ready_url": backend["ready_url"], + "backend_start_command": backend["start_command"], + "backend_restore_command": backend["restore_command"], + "backend_env": backend_env, + "couchdb": couchdb, + "persistence_db": paths["persistence_db"], + "temp_data_dir": paths["temp_data_dir"], + "pipeline_log_dir": paths["pipeline_log_dir"], + } + + +def main() -> int: + parser = argparse.ArgumentParser(description="初始化自动测试环境") + parser.add_argument( + "--config", + default="tests/fixtures/auto_sync/auto_test_config.yaml", + help="自动测试配置文件路径", + ) + parser.add_argument( + "--clear-only", + action="store_true", + help="只执行清空环境,不做恢复和启动", + ) + args = parser.parse_args() + + if args.clear_only: + result = clear_environment(args.config) + else: + result = initialize_environment(args.config) + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/auto_test_lib.py b/scripts/auto_test_lib.py new file mode 100644 index 0000000..46d01da --- /dev/null +++ b/scripts/auto_test_lib.py @@ -0,0 +1,499 @@ +from __future__ import annotations + +import base64 +import json +import os +import shutil +import signal +import sqlite3 +import subprocess +import time +from datetime import datetime +from pathlib import Path +from typing import Any +from urllib import error, request + +import yaml + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +def replace_placeholders(value: Any) -> Any: + if isinstance(value, str): + return value.replace("${PROJECT_ROOT}", str(PROJECT_ROOT)) + if isinstance(value, list): + return [replace_placeholders(item) for item in value] + if isinstance(value, dict): + return {key: replace_placeholders(item) for key, item in value.items()} + return value + + +def load_yaml_config(path: str | Path) -> dict[str, Any]: + raw_path = Path(path) + if not raw_path.is_absolute(): + raw_path = PROJECT_ROOT / raw_path + payload = yaml.safe_load(raw_path.read_text(encoding="utf-8")) or {} + return replace_placeholders(payload) + + +def ensure_parent(path: str | Path) -> Path: + resolved = Path(path) + resolved.parent.mkdir(parents=True, exist_ok=True) + return resolved + + +def remove_path(path: str | Path) -> None: + target = Path(path) + if not target.exists(): + return + if target.is_dir(): + shutil.rmtree(target, ignore_errors=True) + else: + try: + target.unlink() + except FileNotFoundError: + pass + + +def recreate_dir(path: str | Path) -> Path: + target = Path(path) + remove_path(target) + target.mkdir(parents=True, exist_ok=True) + return target + + +def copy_tree_contents(src: str | Path, dst: str | Path) -> None: + src_path = Path(src) + dst_path = recreate_dir(dst) + for child in src_path.iterdir(): + target = dst_path / child.name + if child.is_dir(): + shutil.copytree(child, target) + else: + shutil.copy2(child, target) + + +def copy_selected_files(src: str | Path, dst: str | Path, file_names: list[str]) -> None: + src_path = Path(src) + dst_path = recreate_dir(dst) + for file_name in file_names: + source = src_path / file_name + if not source.exists(): + raise FileNotFoundError(f"基础数据文件不存在: {source}") + shutil.copy2(source, dst_path / file_name) + + +def _jsonl_record_id(item: dict[str, Any]) -> str: + record_id = item.get("_id") or item.get("id") + if not record_id: + raise ValueError(f"JSONL 记录缺少 _id/id: {item}") + return str(record_id) + + +def merge_jsonl_file(src_file: str | Path, dst_file: str | Path) -> None: + src_path = Path(src_file) + dst_path = Path(dst_file) + + merged: dict[str, dict[str, Any]] = {} + ordered_ids: list[str] = [] + + if dst_path.exists(): + for line in dst_path.read_text(encoding="utf-8").splitlines(): + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + record_id = _jsonl_record_id(item) + merged[record_id] = item + ordered_ids.append(record_id) + + for line in src_path.read_text(encoding="utf-8").splitlines(): + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + record_id = _jsonl_record_id(item) + if record_id in merged: + merged[record_id] = {**merged[record_id], **item} + else: + merged[record_id] = item + ordered_ids.append(record_id) + + lines = [json.dumps(merged[record_id], ensure_ascii=False) for record_id in ordered_ids] + dst_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def merge_tree_contents(src: str | Path, dst: str | Path) -> None: + src_path = Path(src) + dst_path = Path(dst) + dst_path.mkdir(parents=True, exist_ok=True) + for child in src_path.iterdir(): + target = dst_path / child.name + if child.is_dir(): + if target.exists(): + shutil.rmtree(target) + shutil.copytree(child, target) + else: + if child.suffix == ".jsonl" and target.exists(): + merge_jsonl_file(child, target) + else: + shutil.copy2(child, target) + + +def run_command( + command: list[str], + cwd: str | Path, + *, + capture_output: bool = True, + extra_env: dict[str, str] | None = None, +) -> subprocess.CompletedProcess[str]: + env = os.environ.copy() + if extra_env: + env.update({key: str(value) for key, value in extra_env.items()}) + return subprocess.run( + command, + cwd=str(cwd), + text=True, + capture_output=capture_output, + check=False, + env=env, + ) + + +def start_background_process( + command: list[str], + cwd: str | Path, + log_file: str | Path, + *, + extra_env: dict[str, str] | None = None, +) -> subprocess.Popen[str]: + log_path = ensure_parent(log_file) + handle = open(log_path, "a", encoding="utf-8") + env = os.environ.copy() + if extra_env: + env.update({key: str(value) for key, value in extra_env.items()}) + return subprocess.Popen( + command, + cwd=str(cwd), + stdout=handle, + stderr=subprocess.STDOUT, + text=True, + start_new_session=True, + env=env, + ) + + +def stop_process_from_pid_file(pid_file: str | Path) -> bool: + path = Path(pid_file) + if not path.exists(): + return False + try: + pid = int(path.read_text(encoding="utf-8").strip()) + except ValueError: + path.unlink(missing_ok=True) + return False + + try: + os.killpg(pid, signal.SIGTERM) + time.sleep(1) + except PermissionError: + try: + os.kill(pid, signal.SIGTERM) + time.sleep(1) + except (PermissionError, ProcessLookupError): + pass + except ProcessLookupError: + pass + finally: + path.unlink(missing_ok=True) + return True + + +def stop_backend_processes(backend_root_dir: str | Path) -> list[int]: + backend_root = str(Path(backend_root_dir).resolve()) + result = run_command( + ["ps", "-ax", "-o", "pid=,pgid=,command="], + cwd=PROJECT_ROOT, + ) + if result.returncode != 0: + return [] + + killed_pgids: list[int] = [] + for line in result.stdout.splitlines(): + raw = line.strip() + if not raw or backend_root not in raw or " run.py" not in raw: + continue + parts = raw.split(None, 2) + if len(parts) < 3: + continue + try: + pgid = int(parts[1]) + except ValueError: + continue + if pgid in killed_pgids: + continue + try: + os.killpg(pgid, signal.SIGTERM) + time.sleep(1) + except ProcessLookupError: + pass + killed_pgids.append(pgid) + return killed_pgids + + +def wait_http_ready(url: str, timeout_seconds: int, interval_seconds: int) -> None: + deadline = time.time() + timeout_seconds + last_error = "" + while time.time() < deadline: + try: + with request.urlopen(url, timeout=5) as response: + if 200 <= response.status < 500: + return + except Exception as exc: # noqa: BLE001 + last_error = str(exc) + time.sleep(interval_seconds) + raise TimeoutError(f"Backend not ready: {url}; last_error={last_error}") + + +def _auth_header(username: str, password: str) -> dict[str, str]: + if not username: + return {} + token = base64.b64encode(f"{username}:{password}".encode("utf-8")).decode("ascii") + return {"Authorization": f"Basic {token}"} + + +def delete_couchdb_database(base_url: str, database: str, username: str = "", password: str = "") -> int: + url = f"{base_url.rstrip('/')}/{database}" + req = request.Request(url, method="DELETE", headers=_auth_header(username, password)) + try: + with request.urlopen(req, timeout=10) as response: + return response.status + except error.HTTPError as exc: + if exc.code == 404: + return 404 + raise + + +def create_couchdb_database(base_url: str, database: str, username: str = "", password: str = "") -> int: + url = f"{base_url.rstrip('/')}/{database}" + req = request.Request(url, method="PUT", headers=_auth_header(username, password)) + with request.urlopen(req, timeout=10) as response: + return response.status + + +def latest_log_file(log_dir: str | Path) -> str | None: + path = Path(log_dir) + if not path.exists(): + return None + files = [item for item in path.iterdir() if item.is_file() and item.suffix == ".log"] + if not files: + return None + files.sort(key=lambda item: item.stat().st_mtime, reverse=True) + return str(files[0]) + + +def tail_text_file(file_path: str | Path, max_chars: int = 4000) -> str: + path = Path(file_path) + if not path.exists() or not path.is_file(): + return "" + content = path.read_text(encoding="utf-8", errors="replace") + if len(content) <= max_chars: + return content + return content[-max_chars:] + + +def sqlite_rows(db_path: str | Path, sql: str, params: tuple[Any, ...] = ()) -> list[dict[str, Any]]: + path = Path(db_path) + if not path.exists(): + return [] + with sqlite3.connect(path) as conn: + conn.row_factory = sqlite3.Row + rows = conn.execute(sql, params).fetchall() + return [{key: row[key] for key in row.keys()} for row in rows] + + +def persistence_summary(db_path: str | Path, node_type: str | None = None) -> dict[str, Any]: + summary: dict[str, Any] = { + "db_path": str(db_path), + "db_exists": Path(db_path).exists(), + "bindings": [], + "node_status": [], + } + if not Path(db_path).exists(): + return summary + + if node_type: + summary["bindings"] = sqlite_rows( + db_path, + "SELECT node_type, local_id, remote_id, last_updated FROM bindings WHERE node_type = ? ORDER BY last_updated DESC LIMIT 20", + (node_type,), + ) + summary["node_status"] = sqlite_rows( + db_path, + "SELECT collection_id, node_type, action, status, binding_status, COUNT(1) AS count FROM nodes WHERE node_type = ? GROUP BY collection_id, node_type, action, status, binding_status ORDER BY collection_id, action, status", + (node_type,), + ) + return summary + + +def read_jsonl_records(file_path: str | Path) -> dict[str, dict[str, Any]]: + records: dict[str, dict[str, Any]] = {} + path = Path(file_path) + if not path.exists(): + return records + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line: + continue + item = json.loads(line) + records[str(item.get("_id") or item.get("id"))] = item + return records + + +def diff_record_fields(before: dict[str, Any], after: dict[str, Any]) -> list[str]: + keys = set(before) | set(after) + ignored = {"_rev", "updated_at", "updated_by", "updated_by_name"} + changed = [key for key in sorted(keys) if key not in ignored and before.get(key) != after.get(key)] + return changed + + +def now_slug() -> str: + return datetime.now().strftime("%Y%m%d-%H%M%S") + + +def enrich_supplier_display_fields(data_dir: str | Path, region_file: str | Path) -> None: + data_dir_path = Path(data_dir) + supplier_file = data_dir_path / "supplier_1.jsonl" + region_path = Path(region_file) + if not supplier_file.exists() or not region_path.exists(): + return + + country_name_map: dict[str, str] = {} + province_name_map: dict[str, str] = {} + city_name_map: dict[str, str] = {} + for line in region_path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line: + continue + item = json.loads(line) + region_name = str(item.get("name") or "") + region_code = str(item.get("code") or "") + region_type = str(item.get("region_type") or "") + if not region_code: + continue + if region_type == "country": + country_name_map[region_code] = region_name + elif region_type == "province": + province_name_map[region_code] = region_name + elif region_type == "city": + city_name_map[region_code] = region_name + + normalized_lines: list[str] = [] + changed = False + for line in supplier_file.read_text(encoding="utf-8").splitlines(): + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + country = item.get("country") + province = item.get("province") + city = item.get("city") + expected_country_name = country_name_map.get(str(country), "") if country else None + expected_province_name = province_name_map.get(str(province), "") if province else None + expected_city_name = city_name_map.get(str(city), "") if city else None + + if item.get("country_name") != expected_country_name: + item["country_name"] = expected_country_name + changed = True + if item.get("province_name") != expected_province_name: + item["province_name"] = expected_province_name + changed = True + if item.get("city_name") != expected_city_name: + item["city_name"] = expected_city_name + changed = True + + normalized_lines.append(json.dumps(item, ensure_ascii=False)) + + if changed: + supplier_file.write_text("\n".join(normalized_lines) + "\n", encoding="utf-8") + + +def normalize_construction_task_plan_nodes(data_dir: str | Path) -> None: + task_file = Path(data_dir) / "construction_task_1.jsonl" + if not task_file.exists(): + return + + normalized_lines: list[str] = [] + changed = False + for line in task_file.read_text(encoding="utf-8").splitlines(): + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + plan_node = item.get("plan_node") + if isinstance(plan_node, list) and len(plan_node) >= 2: + trimmed = list(plan_node) + if trimmed and float(trimmed[0].get("quantity") or 0) == 0: + trimmed = trimmed[1:] + if trimmed and item.get("contract_quantity") is not None: + end_quantity = float(trimmed[-1].get("quantity") or 0) + contract_quantity = float(item.get("contract_quantity") or 0) + if end_quantity == contract_quantity: + trimmed = trimmed[:-1] + if trimmed != plan_node: + item["plan_node"] = trimmed + changed = True + if not trimmed: + for field_name in ["plan_start_date", "plan_complete_date", "contract_quantity"]: + if item.get(field_name) is not None: + item[field_name] = None + changed = True + normalized_lines.append(json.dumps(item, ensure_ascii=False)) + + if changed: + task_file.write_text("\n".join(normalized_lines) + "\n", encoding="utf-8") + + +def normalize_contract_settlement_records(data_dir: str | Path) -> None: + settlement_file = Path(data_dir) / "contract_settlement_1.jsonl" + if not settlement_file.exists(): + return + + excluded_ids = { + "544430cd-1301-43e0-8f7e-a471d9438983", + } + + normalized_lines: list[str] = [] + changed = False + for line in settlement_file.read_text(encoding="utf-8").splitlines(): + raw = line.strip() + if not raw: + continue + item = json.loads(raw) + + if str(item.get("_id") or item.get("id")) in excluded_ids: + changed = True + continue + + if item.get("contract_id") == "1351be9d-3ca3-48f1-be29-fb39b2c3ff15" and item.get("show_name") == "施工总承包合同": + item["show_name"] = "施工总承包合同(不含设计、采购)" + changed = True + + plan_node = item.get("plan_node") + if isinstance(plan_node, list) and plan_node: + normalized_plan_node: list[dict[str, Any]] = [] + plan_changed = False + for node in plan_node: + if isinstance(node, dict) and node.get("is_audit") is False: + normalized_plan_node.append({**node, "is_audit": True}) + plan_changed = True + else: + normalized_plan_node.append(node) + if plan_changed: + item["plan_node"] = normalized_plan_node + changed = True + + normalized_lines.append(json.dumps(item, ensure_ascii=False)) + + if changed: + settlement_file.write_text("\n".join(normalized_lines) + "\n", encoding="utf-8") diff --git a/scripts/build_filtered_datasource_for_projects.py b/scripts/build_filtered_datasource_for_projects.py new file mode 100644 index 0000000..c31d4c0 --- /dev/null +++ b/scripts/build_filtered_datasource_for_projects.py @@ -0,0 +1,232 @@ +from __future__ import annotations + +import argparse +import json +import re +from pathlib import Path +from typing import Dict, Iterable, List, Set, Tuple + +DEFAULT_PROJECT_IDS: Tuple[str, str] = ( + "0f9c3e22-f4bb-4803-825a-4f238eeb06d5", + "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", +) + +CHILD_NODE_TYPES: Tuple[str, ...] = ( + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "lar_change", + "project_detail_data", + "units", +) + +REQUIRED_NODE_TYPES: Tuple[str, ...] = ("project", "company", "supplier", *CHILD_NODE_TYPES) + +FILENAME_PATTERN = re.compile(r"^(?P.+)_\d+\.jsonl$") + +SOURCE_NODE_ALIASES: Dict[str, Tuple[str, ...]] = { + "units": ("units", "generator_unit"), + "project_detail_data": ("project_detail_data", "project_detail"), +} + + +def _index_source_files(source_dir: Path) -> Dict[str, List[Path]]: + index: Dict[str, List[Path]] = {} + for file_path in sorted(source_dir.glob("*.jsonl")): + match = FILENAME_PATTERN.match(file_path.name) + if not match: + continue + node_type = match.group("node_type") + index.setdefault(node_type, []).append(file_path) + return index + + +def _read_jsonl(file_path: Path) -> List[dict]: + rows: List[dict] = [] + with file_path.open("r", encoding="utf-8") as f: + for line_no, line in enumerate(f, start=1): + payload = line.strip() + if not payload: + continue + try: + rows.append(json.loads(payload)) + except json.JSONDecodeError as exc: + raise ValueError(f"Invalid JSON in {file_path} at line {line_no}") from exc + return rows + + +def _write_jsonl(file_path: Path, rows: Iterable[dict]) -> int: + count = 0 + file_path.parent.mkdir(parents=True, exist_ok=True) + with file_path.open("w", encoding="utf-8", newline="\n") as f: + for row in rows: + f.write(json.dumps(row, ensure_ascii=False)) + f.write("\n") + count += 1 + return count + + +def _require_node_types(node_file_index: Dict[str, List[Path]], required: Iterable[str]) -> None: + missing: List[str] = [] + for node in required: + aliases = SOURCE_NODE_ALIASES.get(node, (node,)) + if not any(alias in node_file_index for alias in aliases): + missing.append(node) + if missing: + raise FileNotFoundError( + "Missing required datasource files for node types: " + + ", ".join(sorted(missing)) + + ". Please ensure source datasource is complete." + ) + + +def _filter_rows_by_project(rows: List[dict], project_ids: Set[str]) -> List[dict]: + return [row for row in rows if str(row.get("project_id", "")) in project_ids] + + +def _extract_contract_supplier_ids(contract_rows: List[dict]) -> Set[str]: + supplier_ids: Set[str] = set() + for row in contract_rows: + for field in ("supplier_id", "company_id"): + value = str(row.get(field, "")).strip() + if value: + supplier_ids.add(value) + break + return supplier_ids + + +def _supplier_identity_set(supplier_rows: List[dict]) -> Set[str]: + identities: Set[str] = set() + for row in supplier_rows: + for field in ("_id", "id"): + value = str(row.get(field, "")).strip() + if value: + identities.add(value) + return identities + + +def _load_node_rows(node_file_index: Dict[str, List[Path]], node_type: str) -> List[dict]: + aliases = SOURCE_NODE_ALIASES.get(node_type, (node_type,)) + source_node_type = next((alias for alias in aliases if alias in node_file_index), None) + if source_node_type is None: + raise FileNotFoundError(f"No source files found for node type: {node_type}, aliases={aliases}") + + rows: List[dict] = [] + for file_path in node_file_index[source_node_type]: + rows.extend(_read_jsonl(file_path)) + return rows + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Filter filtered_datasource by project scope and write compact datasource for local testing." + ) + parser.add_argument( + "--source-dir", + default="working_local_datasource/20260227-020003", + help="Source datasource directory that contains *.jsonl files.", + ) + parser.add_argument( + "--output-dir", + default="working_local_datasource/filtered", + help="Output datasource directory (same JSONL format).", + ) + parser.add_argument( + "--project-ids", + nargs="+", + default=list(DEFAULT_PROJECT_IDS), + help="Target project IDs to keep.", + ) + parser.add_argument( + "--clean-output", + action="store_true", + help="Delete existing *.jsonl under output-dir before writing.", + ) + args = parser.parse_args() + + source_dir = Path(args.source_dir).resolve() + output_dir = Path(args.output_dir).resolve() + project_ids = {str(project_id).strip() for project_id in args.project_ids if str(project_id).strip()} + + if not source_dir.exists() or not source_dir.is_dir(): + raise FileNotFoundError(f"Source directory not found: {source_dir}") + if not project_ids: + raise ValueError("project-ids cannot be empty") + + node_file_index = _index_source_files(source_dir) + _require_node_types(node_file_index, REQUIRED_NODE_TYPES) + + if args.clean_output and output_dir.exists(): + for stale in output_dir.glob("*.jsonl"): + stale.unlink() + + project_rows = _load_node_rows(node_file_index, "project") + selected_projects = [row for row in project_rows if str(row.get("_id", "")) in project_ids] + selected_project_ids = {str(row.get("_id", "")) for row in selected_projects if str(row.get("_id", ""))} + + missing_projects = sorted(project_ids - selected_project_ids) + if missing_projects: + raise ValueError(f"Project IDs not found in source project data: {missing_projects}") + + filtered_by_node: Dict[str, List[dict]] = {"project": selected_projects} + + for node_type in CHILD_NODE_TYPES: + rows = _load_node_rows(node_file_index, node_type) + filtered_by_node[node_type] = _filter_rows_by_project(rows, selected_project_ids) + + selected_company_ids = { + str(row.get("company_id", "")) + for row in selected_projects + if str(row.get("company_id", "")) + } + + company_rows = _load_node_rows(node_file_index, "company") + filtered_by_node["company"] = [ + row for row in company_rows if str(row.get("_id", "")) in selected_company_ids + ] + + selected_supplier_ids = _extract_contract_supplier_ids(filtered_by_node["contract"]) + + supplier_rows = _load_node_rows(node_file_index, "supplier") + supplier_identity_set = _supplier_identity_set(supplier_rows) + + missing_supplier_ids = sorted(selected_supplier_ids - supplier_identity_set) + if missing_supplier_ids: + sample = missing_supplier_ids[:10] + raise ValueError( + "Contract supplier references missing in supplier datasource: " + f"missing={len(missing_supplier_ids)}, sample={sample}" + ) + + filtered_by_node["supplier"] = [ + row + for row in supplier_rows + if str(row.get("_id", "")).strip() in selected_supplier_ids + or str(row.get("id", "")).strip() in selected_supplier_ids + ] + + write_order = ["project", *CHILD_NODE_TYPES, "company", "supplier"] + output_counts: Dict[str, int] = {} + + for node_type in write_order: + out_file = output_dir / f"{node_type}_1.jsonl" + output_counts[node_type] = _write_jsonl(out_file, filtered_by_node[node_type]) + + print("[Done] output_dir:", output_dir) + print("[Done] project_ids:", sorted(selected_project_ids)) + for node_type in write_order: + print(f"[Count] {node_type}: {output_counts[node_type]}") + + +if __name__ == "__main__": + main() diff --git a/scripts/legacy/run_full_sync_pipeline_jsonl.py b/scripts/legacy/run_full_sync_pipeline_jsonl.py new file mode 100644 index 0000000..96f69f9 --- /dev/null +++ b/scripts/legacy/run_full_sync_pipeline_jsonl.py @@ -0,0 +1,208 @@ +""" +Run FullSyncPipeline: JSONL -> JSONL (filtered_datasource -> remote_datasource) + +直接运行脚本,不使用 pytest。 +""" + +from __future__ import annotations + +import asyncio +import sys +from pathlib import Path +from typing import List + +# 确保能导入项目模块 +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +# 触发 DomainRegistry 注册 +import sync_system_new.domain # noqa: F401, E402 + +from sync_system_new.common.binding import BindingManager # noqa: E402 +from sync_system_new.common.collection import DataCollection # noqa: E402 +from sync_system_new.common.persistence import PersistenceBackend # noqa: E402 +from sync_system_new.common.registry import DomainRegistry # noqa: E402 +from sync_system_new.datasource.jsonl.datasource import JsonlDataSource # noqa: E402 +from sync_system_new.pipeline import FullSyncPipeline # noqa: E402 +from sync_system_new.sync_system.config import OrphanAction, UpdateDirection # noqa: E402 + + +LOCAL_DIR = PROJECT_ROOT / "filtered_datasource" / "datasource" / "ecm-2025-12-02" +REMOTE_DIR = PROJECT_ROOT / "remote_datasource" / "datasource" +PERSISTENCE_DB = PROJECT_ROOT / "test_results" / "full_sync_pipeline_jsonl_run.db" +WIPE_DB_ON_START = False + +NODE_TYPES: List[str] = [ + "company", + # "supplier", + "user", + "project", + "project_detail_data", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "units", +] + + +class StrategyLogger: + """包装策略,打印执行完成信息。""" + + def __init__(self, inner): + self.inner = inner + self.node_type = inner.node_type + + async def bind(self): + return await self.inner.bind() + + async def create(self): + created = await self.inner.create() + print(f"✅ Strategy create: {self.node_type} (created={len(created)})") + return created + + async def update(self): + updated = await self.inner.update() + print(f"✅ Strategy update: {self.node_type} (updated={len(updated)})") + return updated + + +async def main() -> None: + PERSISTENCE_DB.parent.mkdir(parents=True, exist_ok=True) + if WIPE_DB_ON_START and PERSISTENCE_DB.exists(): + PERSISTENCE_DB.unlink() + + persistence = PersistenceBackend(str(PERSISTENCE_DB)) + await persistence.initialize() + + local_ds = JsonlDataSource(LOCAL_DIR, read_only=True) + remote_ds = JsonlDataSource(REMOTE_DIR, read_only=False) + + for node_type in NODE_TYPES: + handler_class = DomainRegistry.get_jsonl_handler(node_type) + if handler_class is None: + raise RuntimeError(f"Missing JSONL handler for node_type: {node_type}") + local_ds.register_handler(handler_class(local_ds)) + remote_ds.register_handler(handler_class(remote_ds)) + + local_collection = DataCollection("local", persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + strategies = [] + for node_type in NODE_TYPES: + strategy_class = DomainRegistry.get_strategy_class(node_type) + if strategy_class is None: + raise RuntimeError(f"Missing strategy for node_type: {node_type}") + strategy = strategy_class(node_type, local_collection, remote_collection, binding_manager) + # 运行时强制只推不拉(不覆盖原有 depend_fields/auto_bind_fields) + strategy.update_config( + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + if node_type == "contract": + # contract 仅依赖 project_id,避免 company_id 为空导致依赖阻断 + strategy.update_config(depend_fields={"project_id": "project"}) + strategies.append(StrategyLogger(strategy)) + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=strategies, + node_types=NODE_TYPES, + load_order=NODE_TYPES, + sync_order=NODE_TYPES, + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + enable_persistence=True, + fail_fast_on_precheck=False, + ) + + stats = await pipeline.run() + print(f"Pipeline finished. Stats: {stats}") + + binding_counts = {} + for node_type in NODE_TYPES: + records = await binding_manager.get_all_records(node_type) + binding_counts[node_type] = len(records) + + def format_action(summary, key: str) -> str: + action = summary.get(key, {}) + return f"{action.get('total', 0)}({action.get('success', 0)}/{action.get('failed', 0)})" + + def format_total(summary) -> str: + total = summary.get("total", {}) + return f"{total.get('total', 0)}({total.get('success', 0)}/{total.get('failed', 0)})" + + def print_summary(title: str, action_summary: dict) -> None: + print(f"\n=== {title} summary ===") + print("doc_type: bindings | create(s/f) | update(s/f) | delete(s/f) | none | total(s/f)") + + total_bindings = 0 + total_create = {"total": 0, "success": 0, "failed": 0} + total_update = {"total": 0, "success": 0, "failed": 0} + total_delete = {"total": 0, "success": 0, "failed": 0} + total_none = 0 + total_all = {"total": 0, "success": 0, "failed": 0} + + for node_type in NODE_TYPES: + summary = action_summary.get(node_type, {}) + bindings = binding_counts.get(node_type, 0) + create_str = format_action(summary, "create") + update_str = format_action(summary, "update") + delete_str = format_action(summary, "delete") + none_count = summary.get("none", {}).get("total", 0) + total_str = format_total(summary) + + print( + f"{node_type}: bindings={bindings} " + f"create={create_str} update={update_str} delete={delete_str} " + f"none={none_count} total={total_str}" + ) + + total_bindings += bindings + for bucket, key in ( + (total_create, "create"), + (total_update, "update"), + (total_delete, "delete"), + ): + action = summary.get(key, {}) + bucket["total"] += action.get("total", 0) + bucket["success"] += action.get("success", 0) + bucket["failed"] += action.get("failed", 0) + total_none += none_count + total_all["total"] += summary.get("total", {}).get("total", 0) + total_all["success"] += summary.get("total", {}).get("success", 0) + total_all["failed"] += summary.get("total", {}).get("failed", 0) + + print( + "TOTAL: " + f"bindings={total_bindings} " + f"create={total_create['total']}({total_create['success']}/{total_create['failed']}) " + f"update={total_update['total']}({total_update['success']}/{total_update['failed']}) " + f"delete={total_delete['total']}({total_delete['success']}/{total_delete['failed']}) " + f"none={total_none} " + f"total={total_all['total']}({total_all['success']}/{total_all['failed']})" + ) + + print_summary("Local", local_ds.get_action_summary()) + print_summary("Remote", remote_ds.get_action_summary()) + + await persistence.close() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/scripts/legacy/run_full_sync_pipeline_jsonl_sm.py b/scripts/legacy/run_full_sync_pipeline_jsonl_sm.py new file mode 100644 index 0000000..4c74f41 --- /dev/null +++ b/scripts/legacy/run_full_sync_pipeline_jsonl_sm.py @@ -0,0 +1,153 @@ +""" +run_full_sync_pipeline_jsonl_sm.py + +独立执行:基于 sync_state_machine 的 JSONL -> JSONL 全量同步脚本。 +用途:纯本地可复现,不依赖远端 API;用于验证重构后 pipeline 主流程可跑通。 +""" + +from __future__ import annotations + +import asyncio +import os +import sys +from datetime import datetime +from pathlib import Path +from typing import Dict, List + +from pydantic import BaseModel, ConfigDict, Field + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import sync_state_machine.domain # noqa: F401, E402 +from sync_state_machine.pipeline import create_jsonl_to_jsonl_pipeline # noqa: E402 + + +class JsonlSmConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + local_jsonl_dir: str = str(PROJECT_ROOT / "filtered_datasource" / "datasource" / "ecm-2025-12-02") + remote_jsonl_dir: str = str(PROJECT_ROOT / "remote_datasource" / "datasource") + persistence_db: str = str(PROJECT_ROOT / "test_results" / "sync_state_machine" / "full_sync_pipeline_jsonl_sm.db") + wipe_persistence_on_start: bool = False + + target_project_ids: List[str] = Field(default_factory=lambda: ["f3e02e84-e81c-4aa6-88d4-f5aa108c8227"]) + project_auto_bind_fields: List[str] = Field(default_factory=lambda: ["name"]) + project_id_bindings: Dict[str, str] = Field(default_factory=dict) + + node_types: List[str] = Field(default_factory=lambda: [ + "company", + "user", + "project", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "units", + ]) + + +def _load_dotenv() -> Dict[str, str]: + dotenv_path = PROJECT_ROOT / ".env" + if not dotenv_path.exists(): + return {} + + values: Dict[str, str] = {} + for raw_line in dotenv_path.read_text(encoding="utf-8").splitlines(): + line = raw_line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + values[key.strip()] = value.strip().strip('"').strip("'") + return values + + +def build_config() -> JsonlSmConfig: + cfg = JsonlSmConfig() + env = _load_dotenv() + cfg.wipe_persistence_on_start = ( + os.getenv("SPS_JSONL_WIPE_DB", env.get("SPS_JSONL_WIPE_DB", str(cfg.wipe_persistence_on_start))).lower() + in {"1", "true", "yes"} + ) + return cfg + + +def _print_config_snapshot(config: JsonlSmConfig) -> None: + snapshot = { + "local_jsonl_dir": config.local_jsonl_dir, + "remote_jsonl_dir": config.remote_jsonl_dir, + "persistence_db": config.persistence_db, + "wipe_persistence_on_start": config.wipe_persistence_on_start, + "target_project_ids": config.target_project_ids, + "project_auto_bind_fields": config.project_auto_bind_fields, + "project_id_bindings": config.project_id_bindings, + "node_types": config.node_types, + } + print(f"🔧 Resolved Config: {snapshot}") + + +async def main() -> int: + pipeline = None + log_path = None + config = build_config() + + try: + log_dir = PROJECT_ROOT / "test_results" / "sync_state_machine" + log_dir.mkdir(parents=True, exist_ok=True) + log_path = log_dir / f"jsonl_pipeline_sm_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" + + print("\n" + "=" * 80) + print("🚀 Creating sync_state_machine JSONL -> JSONL pipeline") + print(f"📝 Log file: {log_path}") + _print_config_snapshot(config) + print("=" * 80) + + Path(config.persistence_db).parent.mkdir(parents=True, exist_ok=True) + pipeline = await create_jsonl_to_jsonl_pipeline( + local_jsonl_dir=config.local_jsonl_dir, + remote_jsonl_dir=config.remote_jsonl_dir, + persistence_db=config.persistence_db, + node_types=config.node_types, + load_order=config.node_types, + sync_order=config.node_types, + enable_persistence=True, + wipe_persistence_on_start=config.wipe_persistence_on_start, + target_project_ids=config.target_project_ids, + project_id_bindings=config.project_id_bindings, + project_auto_bind_fields=config.project_auto_bind_fields, + enable_project_bind_override=True, + enable_project_filter_override=True, + initialize_logger=True, + logger_file_path=str(log_path), + ) + + stats = await pipeline.run() + print(f"\n✅ Pipeline completed: stats={stats}") + print(f"🗃️ Persistence DB: {config.persistence_db}") + return 0 + + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + import traceback + traceback.print_exc() + return 1 + finally: + if pipeline is not None: + await pipeline.close() + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/scripts/legacy/run_full_sync_pipeline_simple.py b/scripts/legacy/run_full_sync_pipeline_simple.py new file mode 100644 index 0000000..1e5786e --- /dev/null +++ b/scripts/legacy/run_full_sync_pipeline_simple.py @@ -0,0 +1,179 @@ +""" +run_full_sync_pipeline_simple.py + +极简测试脚本:演示使用工厂函数创建 Pipeline +- 只需配置参数 +- 调用工厂函数 +- 执行 pipeline.run() +""" + +import asyncio +import sys +from pathlib import Path + +# 项目路径 +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +# 触发 Domain 注册 +import sync_system_new.domain # noqa: F401, E402 + +from sync_system_new.pipeline import create_jsonl_to_api_pipeline # noqa: E402 + + +# ========== 配置参数 ========== +CONFIG = { + # 路径 + "local_jsonl_dir": str(PROJECT_ROOT / "filtered_datasource" / "datasource" / "ecm-2025-12-02"), + "persistence_db": str(PROJECT_ROOT / "_runtime" / "test_simple.db"), + + # API + "api_base_url": "http://localhost:8000/api/third/v2", + "api_uid": "6b18c681-92d5-4c7f-802c-df413b6504c8", + "api_secret": "1a28Az5dBD1Gc3URpmHwiR0XfzW7UtScQnqJQzgpzdg", + + # 节点类型 + "node_types": [ + "company", + "supplier", + # "user", + "project", + "project_detail_data", + "preparation", + "production", + "lar", + "lar_change", + "units", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + ], + + # 项目过滤和预绑定 + "target_project_ids": ["f3e02e84-e81c-4aa6-88d4-f5aa108c8227"], + "project_id_bindings": { + "f3e02e84-e81c-4aa6-88d4-f5aa108c8227": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", + }, + + # Handler 自定义配置 + "handler_configs": { + # supplier: 从持久化加载,不调用 API(后续运行时启用) + "supplier": {"load_mode": "persisted_only"}, + }, + + # Skip/Force Sync 控制 + # skip_sync_types: 跳过同步(只执行 bind,不执行 create/update) + # 后续运行时可配置: "skip_sync_types": ["supplier"] + "skip_sync_types": ["supplier"], + # 行为 + "wipe_persistence_on_start": False, # 改为 False,否则持久化数据会被清空 + "enable_persistence": True, + + # API 调试 + "api_debug": True, + "poll_max_retries": 1, + "poll_interval": 2.0, +} + + +async def main(): + """主函数 - 返回 True 表示成功,False 表示被中断""" + from datetime import datetime + import sys + from pathlib import Path + + pipeline = None + interrupted = False + log_file = None + original_stdout = None + original_stderr = None + + # 日志设置 + log_dir = Path(PROJECT_ROOT) / "test_results" + log_dir.mkdir(parents=True, exist_ok=True) + log_path = log_dir / f"simple_pipeline_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" + + try: + # 重定向输出到日志文件 + log_file = open(log_path, "w", encoding="utf-8") + + class Tee: + def __init__(self, *streams): + self._streams = streams + def write(self, data): + for stream in self._streams: + stream.write(data) + stream.flush() + return len(data) + def flush(self): + for stream in self._streams: + stream.flush() + + original_stdout = sys.stdout + original_stderr = sys.stderr + sys.stdout = Tee(original_stdout, log_file) + sys.stderr = Tee(original_stderr, log_file) + + print("\n" + "=" * 60) + print("🚀 Creating Pipeline...") + print(f"📝 Log file: {log_path}") + print("=" * 60) + + # 一行创建完整 Pipeline + pipeline = await create_jsonl_to_api_pipeline(**CONFIG) + + print(f"✅ Pipeline created!") + print(f" - Node types: {len(pipeline.node_types)}") + print(f" - Strategies: {len(pipeline.strategies)}") + + print("\n" + "=" * 60) + print("🏃 Running Pipeline...") + print("=" * 60) + + # 执行同步(print_summary 已整合到 stage4_post_check 中) + stats = await pipeline.run() + + print("\n✅ Done!") + + except KeyboardInterrupt: + print("\n\n⚠️ KeyboardInterrupt received, shutting down gracefully...") + interrupted = True + except Exception as e: + print(f"\n\n❌ Error: {type(e).__name__}: {e}") + import traceback + traceback.print_exc() + finally: + if pipeline is not None: + print("🧹 Cleaning up resources...") + await pipeline.close() + print("✅ Resources cleaned up") + + # 恢复原始输出 + if original_stdout is not None: + sys.stdout = original_stdout + if original_stderr is not None: + sys.stderr = original_stderr + if log_file is not None: + log_file.close() + if not interrupted: + print(f"\n📝 Log saved to: {log_path}") + + return not interrupted # 返回 False 表示被中断 + + +if __name__ == "__main__": + try: + success = asyncio.run(main()) + sys.exit(0 if success else 130) # 130 是标准的 Ctrl+C 退出码 + except KeyboardInterrupt: + # asyncio.run() 可能会重新抛出 KeyboardInterrupt + print("\n⚠️ Program interrupted") + sys.exit(130) diff --git a/scripts/legacy/run_full_sync_pipeline_simple_sm.py b/scripts/legacy/run_full_sync_pipeline_simple_sm.py new file mode 100644 index 0000000..a72a490 --- /dev/null +++ b/scripts/legacy/run_full_sync_pipeline_simple_sm.py @@ -0,0 +1,143 @@ +""" +run_full_sync_pipeline_simple_sm.py + +独立执行:基于 sync_state_machine 的 JSONL -> API Pipeline。 +用途:保留线上接口参数,直接执行重构后的推送链路(非 pytest)。 +""" + +from __future__ import annotations + +import asyncio +import os +import sys +from datetime import datetime +from pathlib import Path +from typing import Dict, List + +from pydantic import BaseModel, ConfigDict, Field + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import sync_state_machine.domain # noqa: F401, E402 +from sync_state_machine.pipeline import create_jsonl_to_api_pipeline # noqa: E402 + + +class SimpleSmConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + local_jsonl_dir: str = str(PROJECT_ROOT / "filtered_datasource" / "datasource" / "ecm-2025-12-02") + persistence_db: str = str(PROJECT_ROOT / "test_results" / "sync_state_machine" / "simple_pipeline_sm.db") + api_base_url: str = "http://localhost:8000/api/third/v2" + api_uid: str = "6b18c681-92d5-4c7f-802c-df413b6504c8" + api_secret: str = "1a28Az5dBD1Gc3URpmHwiR0XfzW7UtScQnqJQzgpzdg" + + node_types: List[str] = Field(default_factory=lambda: [ + "project", + "contract", + "contract_settlement", + ]) + target_project_ids: List[str] = Field(default_factory=lambda: ["f3e02e84-e81c-4aa6-88d4-f5aa108c8227"]) + project_id_bindings: Dict[str, str] = Field( + default_factory=lambda: { + "f3e02e84-e81c-4aa6-88d4-f5aa108c8227": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227" + } + ) + + skip_sync_types: List[str] = Field(default_factory=lambda: ["supplier"]) + wipe_persistence_on_start: bool = False + enable_persistence: bool = True + api_debug: bool = True + poll_max_retries: int = 1 + poll_interval: float = 2.0 + + +def _load_dotenv() -> Dict[str, str]: + dotenv_path = PROJECT_ROOT / ".env" + if not dotenv_path.exists(): + return {} + + values: Dict[str, str] = {} + for raw_line in dotenv_path.read_text(encoding="utf-8").splitlines(): + line = raw_line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + values[key.strip()] = value.strip().strip('"').strip("'") + return values + + +def build_config() -> SimpleSmConfig: + cfg = SimpleSmConfig() + env = _load_dotenv() + + cfg.api_base_url = os.getenv("SPS_API_BASE_URL", env.get("SPS_API_BASE_URL", cfg.api_base_url)) + cfg.api_uid = os.getenv("SPS_API_UID", env.get("SPS_API_UID", cfg.api_uid)) + cfg.api_secret = os.getenv("SPS_API_SECRET", env.get("SPS_API_SECRET", cfg.api_secret)) + return cfg + + +def _print_config_snapshot(config: SimpleSmConfig) -> None: + masked_secret = "***" if config.api_secret else "" + snapshot = { + "local_jsonl_dir": config.local_jsonl_dir, + "persistence_db": config.persistence_db, + "api_base_url": config.api_base_url, + "api_uid": config.api_uid, + "api_secret": masked_secret, + "node_types": config.node_types, + "target_project_ids": config.target_project_ids, + "project_id_bindings": config.project_id_bindings, + "skip_sync_types": config.skip_sync_types, + "wipe_persistence_on_start": config.wipe_persistence_on_start, + "enable_persistence": config.enable_persistence, + "api_debug": config.api_debug, + "poll_max_retries": config.poll_max_retries, + "poll_interval": config.poll_interval, + } + print(f"🔧 Resolved Config: {snapshot}") + + +async def main() -> int: + pipeline = None + log_path = None + config = build_config() + + try: + log_dir = PROJECT_ROOT / "test_results" / "sync_state_machine" + log_dir.mkdir(parents=True, exist_ok=True) + log_path = log_dir / f"simple_pipeline_sm_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" + + print("\n" + "=" * 80) + print("🚀 Creating sync_state_machine JSONL -> API pipeline") + print(f"📝 Log file: {log_path}") + _print_config_snapshot(config) + print("=" * 80) + + pipeline = await create_jsonl_to_api_pipeline( + **config.model_dump(), + initialize_logger=True, + logger_file_path=str(log_path), + ) + + stats = await pipeline.run() + print(f"\n✅ Pipeline completed: stats={stats}") + print(f"🗃️ Persistence DB: {config.persistence_db}") + return 0 + + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + import traceback + traceback.print_exc() + return 1 + finally: + if pipeline is not None: + await pipeline.close() + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/scripts/run_auto_test.py b/scripts/run_auto_test.py new file mode 100644 index 0000000..b265951 --- /dev/null +++ b/scripts/run_auto_test.py @@ -0,0 +1,553 @@ +from __future__ import annotations + +import argparse +import importlib.util +import json +import shutil +from pathlib import Path +from typing import Any + +from auto_test_init import clear_environment, initialize_environment +from auto_test_lib import ( + load_yaml_config, + now_slug, + recreate_dir, + tail_text_file, +) + + +def load_domain_module(config: dict[str, Any], domain_name: str): + script_dir = Path(config["domains"]["script_dir"]) + script_path = script_dir / f"{domain_name}_case.py" + module_name = f"auto_test_domain_{domain_name}" + spec = importlib.util.spec_from_file_location(module_name, script_path) + if spec is None or spec.loader is None: + raise ImportError(f"无法加载 domain 脚本: {script_path}") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def run_domain(config: dict[str, Any], domain_name: str, report_root: Path) -> dict[str, Any]: + module = load_domain_module(config, domain_name) + if not hasattr(module, "run_case"): + raise AttributeError(f"domain 脚本缺少 run_case(): {domain_name}") + domain_report = module.run_case(config, report_root) + report_path = report_root / f"{domain_name}.json" + report_path.write_text(json.dumps(domain_report, ensure_ascii=False, indent=2), encoding="utf-8") + return domain_report + + +def archive_run_logs(report_root: Path, init_result: dict[str, Any], domain_reports: list[dict[str, Any]]) -> None: + logs_dir = report_root / "logs" + logs_dir.mkdir(parents=True, exist_ok=True) + + manifest: dict[str, Any] = { + "backend_log": None, + "pipeline_logs": [], + } + + backend_log_file = init_result.get("backend_log_file") + if backend_log_file: + src = Path(backend_log_file) + if src.exists(): + target = logs_dir / "backend.log" + shutil.copy2(src, target) + init_result["archived_backend_log_file"] = str(target) + manifest["backend_log"] = str(target) + + for domain in domain_reports: + for round_report in domain.get("rounds", []): + latest_log_file = round_report.get("latest_log_file") + if not latest_log_file: + continue + src = Path(latest_log_file) + if not src.exists(): + continue + target = logs_dir / f"{domain['domain']}__{round_report['name']}.log" + shutil.copy2(src, target) + round_report["archived_log_file"] = str(target) + manifest["pipeline_logs"].append( + { + "domain": domain["domain"], + "round": round_report["name"], + "source": str(src), + "archived": str(target), + } + ) + + (logs_dir / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8") + + +def build_test_summary(domain_reports: list[dict[str, Any]]) -> dict[str, Any]: + cases: list[dict[str, Any]] = [] + passed_domains = 0 + failed_domains = 0 + + for domain in domain_reports: + domain_passed = bool(domain.get("passed")) + if domain_passed: + passed_domains += 1 + else: + failed_domains += 1 + + for round_report in domain.get("rounds", []): + cases.append( + { + "nodeid": f"{domain['domain']}::{round_report['name']}", + "domain": domain["domain"], + "case": round_report["name"], + "purpose": round_report.get("purpose", ""), + "passed": bool(round_report.get("passed")), + "result": "PASSED" if round_report.get("passed") else "FAILED", + "returncode": round_report.get("returncode"), + "issue_count": len(round_report.get("issues", [])), + "issues": round_report.get("issues", []), + } + ) + + passed_cases = sum(1 for item in cases if item["passed"]) + failed_cases = len(cases) - passed_cases + + return { + "total_domains": len(domain_reports), + "passed_domains": passed_domains, + "failed_domains": failed_domains, + "total_cases": len(cases), + "passed_cases": passed_cases, + "failed_cases": failed_cases, + "cases": cases, + } + + +def build_markdown_report(run_id: str, init_result: dict[str, Any], domain_reports: list[dict[str, Any]]) -> str: + summary = build_test_summary(domain_reports) + if init_result.get("skipped"): + init_lines = ["- 本次跳过初始化,沿用现有测试环境"] + else: + init_lines = [ + f"- 后端进程 PID: {init_result.get('backend_pid')}", + f"- 后端日志: {init_result.get('backend_log_file')}", + f"- 状态库: {init_result.get('persistence_db')}", + f"- 临时数据目录: {init_result.get('temp_data_dir')}", + ] + lines = [ + f"# 自动测试报告 {run_id}", + "", + "## 初始化结果", + "", + *init_lines, + "", + ] + if domain_reports: + lines.extend([ + "## Pytest 风格汇总", + "", + f"collected {summary['total_cases']} cases across {summary['total_domains']} domains", + "", + ]) + for case in summary["cases"]: + lines.append(f"- {case['nodeid']} {case['result']}") + lines.extend([ + "", + f"== {summary['passed_cases']} passed, {summary['failed_cases']} failed, {summary['passed_domains']} passed domains, {summary['failed_domains']} failed domains ==", + "", + ]) + lines.extend([ + "## Domain 汇总", + "", + "| Domain | 说明 | 结果 | 轮次数 | 问题数 |", + "| --- | --- | --- | --- | --- |", + ]) + for domain in domain_reports: + lines.append( + f"| {domain['domain']} | {domain.get('description', '')} | {'通过' if domain.get('passed') else '失败'} | {len(domain.get('rounds', []))} | {len(domain.get('issues', []))} |" + ) + lines.append("") + for domain in domain_reports: + lines.append(f"## Domain: {domain['domain']}") + if domain.get("description"): + lines.append("") + lines.append(domain["description"]) + lines.append("") + lines.append(f"- 结果: {'通过' if domain.get('passed') else '失败'}") + if domain.get("issues"): + lines.append("- 问题:") + for issue in domain["issues"]: + lines.append(f" - {issue}") + lines.append("") + for round_report in domain.get("rounds", []): + lines.extend([ + f"### {round_report['name']}", + f"- 目的: {round_report['purpose']}", + f"- 返回码: {round_report['returncode']}", + f"- 结果: {'通过' if round_report.get('passed') else '失败'}", + f"- 数据目录: {round_report['dataset_dir']}", + f"- 最新日志: {round_report['latest_log_file']}", + ]) + coverage = round_report.get("coverage") or {} + if coverage: + if coverage.get("keys"): + lines.append(f"- 覆盖 key: {', '.join(coverage['keys'])}") + if coverage.get("api"): + lines.append(f"- 覆盖接口: {', '.join(coverage['api'])}") + if coverage.get("notes"): + lines.append(f"- 覆盖说明: {coverage['notes']}") + if round_report.get("archived_log_file"): + lines.append(f"- 归档日志: {round_report['archived_log_file']}") + if round_report.get("issues"): + lines.append("- 本轮问题:") + for issue in round_report["issues"]: + lines.append(f" - {issue}") + dataset_diffs = round_report.get("dataset_diffs") or {} + if dataset_diffs: + lines.append("- 本轮数据变更:") + for node_type, record_map in dataset_diffs.items(): + for record_id, fields in record_map.items(): + lines.append(f" - {node_type}.{record_id}: {', '.join(fields)}") + bindings = round_report.get("required_bindings", {}) + if bindings: + lines.append("- 绑定检查:") + for node_type, items in bindings.items(): + for item in items: + lines.append( + f" - {node_type} {item['local_data_id']}: bound={item['bound']} local_node_id={item['local_node_id']} remote_data_id={item['remote_data_id']}" + ) + verified_bound_fields = round_report.get("verified_bound_fields") or [] + if verified_bound_fields: + lines.append("- 字段校验:") + for item in verified_bound_fields: + status = "matched" if item.get("matched") else "mismatched" + lines.append( + f" - {item['collection_id']}.{item['node_type']} local={item['local_data_id']} target={item['target_data_id']} status={status}" + ) + for field_path, actual_value in (item.get("actual_fields") or {}).items(): + expected_value = (item.get("expected_fields") or {}).get(field_path) + lines.append( + f" - {field_path}: actual={actual_value!r} expected={expected_value!r}" + ) + problem_nodes = round_report.get("problem_nodes", []) + if problem_nodes: + lines.append("- 问题节点:") + for item in problem_nodes: + lines.append( + f" - {item['collection_id']}.{item['node_type']} data_id={item.get('data_id')} action={item.get('action')} status={item.get('status')} binding_status={item.get('binding_status')} error={item.get('error') or ''}" + ) + lines.append("") + return "\n".join(lines) + + +def sanitize_config_for_record(config: dict[str, Any]) -> dict[str, Any]: + payload = json.loads(json.dumps(config, ensure_ascii=False)) + remote = payload.get("remote_datasource", {}) + if remote.get("api_secret"): + remote["api_secret"] = "***" + backend = payload.get("backend", {}) + backend_env = backend.get("env", {}) + for key in ["COUCHDB_PASSWORD"]: + if backend_env.get(key): + backend_env[key] = "***" + couchdb = payload.get("couchdb", {}) + if couchdb.get("password"): + couchdb["password"] = "***" + return payload + + +def collect_failed_node_details(domain_reports: list[dict[str, Any]]) -> list[dict[str, Any]]: + failed_nodes: list[dict[str, Any]] = [] + for domain in domain_reports: + for round_report in domain.get("rounds", []): + for item in round_report.get("problem_nodes", []): + failed_nodes.append( + { + "domain": domain["domain"], + "round": round_report["name"], + "node_type": item.get("node_type"), + "collection_id": item.get("collection_id"), + "local_data_id": item.get("data_id"), + "local_node_id": item.get("node_id"), + "remote_node_id": None, + "remote_data_id": item.get("bind_data_id"), + "issues": round_report.get("issues", []), + "node_status": round_report.get("persistence_summary", {}).get("node_status", []), + "status": item.get("status"), + "binding_status": item.get("binding_status"), + "error": item.get("error"), + "sync_log_tail": item.get("sync_log_tail", ""), + } + ) + for node_type, items in round_report.get("required_bindings", {}).items(): + for item in items: + if item.get("bound"): + continue + failed_nodes.append( + { + "domain": domain["domain"], + "round": round_report["name"], + "node_type": node_type, + "local_data_id": item.get("local_data_id"), + "local_node_id": item.get("local_node_id"), + "remote_node_id": item.get("remote_node_id"), + "remote_data_id": item.get("remote_data_id"), + "issues": round_report.get("issues", []), + "node_status": round_report.get("persistence_summary", {}).get("node_status", []), + "status": None, + "binding_status": None, + "error": None, + "sync_log_tail": "", + } + ) + return failed_nodes + + +def build_detailed_record( + run_id: str, + config: dict[str, Any], + init_result: dict[str, Any], + domain_reports: list[dict[str, Any]], +) -> dict[str, Any]: + backend_log_tail = "" + if init_result.get("backend_log_file"): + backend_log_tail = tail_text_file(init_result["backend_log_file"], 8000) + + rounds: list[dict[str, Any]] = [] + for domain in domain_reports: + for round_report in domain.get("rounds", []): + rounds.append( + { + "domain": domain["domain"], + "round": round_report["name"], + "purpose": round_report.get("purpose"), + "passed": round_report.get("passed"), + "returncode": round_report.get("returncode"), + "dataset_dir": round_report.get("dataset_dir"), + "latest_log_file": round_report.get("latest_log_file"), + "archived_log_file": round_report.get("archived_log_file"), + "issues": round_report.get("issues", []), + "dataset_diff": round_report.get("dataset_diff", {}), + "dataset_diffs": round_report.get("dataset_diffs", {}), + "required_bindings": round_report.get("required_bindings", {}), + "verified_bound_fields": round_report.get("verified_bound_fields", []), + "problem_nodes": round_report.get("problem_nodes", []), + "persistence_summary": round_report.get("persistence_summary", {}), + "stdout_tail": round_report.get("stdout_tail", ""), + "stderr_tail": round_report.get("stderr_tail", ""), + "pipeline_log_tail": tail_text_file(round_report.get("latest_log_file") or "", 8000), + "coverage": round_report.get("coverage", {}), + } + ) + + return { + "run_id": run_id, + "config_snapshot": sanitize_config_for_record(config), + "init": init_result, + "backend_log_tail": backend_log_tail, + "failed_nodes": collect_failed_node_details(domain_reports), + "domains": domain_reports, + "round_details": rounds, + } + + +def build_detailed_markdown(record: dict[str, Any]) -> str: + init_result = record.get("init", {}) + lines = [ + f"# 自动测试详细记录 {record['run_id']}", + "", + "## 环境初始化", + "", + ] + for key in [ + "backend_root_dir", + "backend_ready_url", + "backend_log_file", + "archived_backend_log_file", + "persistence_db", + "temp_data_dir", + "pipeline_log_dir", + "backend_pid", + ]: + if init_result.get(key) is not None: + lines.append(f"- {key}: {init_result.get(key)}") + if init_result.get("backend_start_command"): + lines.append(f"- backend_start_command: {' '.join(init_result['backend_start_command'])}") + if init_result.get("backend_restore_command"): + lines.append(f"- backend_restore_command: {' '.join(init_result['backend_restore_command'])}") + if init_result.get("backend_env"): + lines.append("- backend_env:") + for key, value in init_result["backend_env"].items(): + lines.append(f" - {key}: {value}") + if init_result.get("restore_stdout_tail"): + lines.extend(["", "### restore stdout tail", "", "```text", init_result["restore_stdout_tail"], "```"]) + if init_result.get("restore_stderr_tail"): + lines.extend(["", "### restore stderr tail", "", "```text", init_result["restore_stderr_tail"], "```"]) + + failed_nodes = record.get("failed_nodes", []) + lines.extend(["", "## 失败节点", ""]) + if failed_nodes: + lines.extend([ + "| Domain | Round | Node Type | local_data_id | local_node_id | 问题 |", + "| --- | --- | --- | --- | --- | --- |", + ]) + for item in failed_nodes: + issue_text = ";".join(item.get("issues", [])) + lines.append( + f"| {item['domain']} | {item['round']} | {item.get('collection_id', '')}.{item['node_type']} | {item['local_data_id']} | {item['local_node_id']} | {issue_text or item.get('error', '')} |" + ) + lines.append("") + else: + lines.append("- 无失败节点") + + lines.extend(["", "## Backend 日志尾部", "", "```text", record.get("backend_log_tail", ""), "```", ""]) + + for round_detail in record.get("round_details", []): + lines.extend([ + f"## {round_detail['domain']} / {round_detail['round']}", + "", + f"- purpose: {round_detail.get('purpose')}", + f"- passed: {round_detail.get('passed')}", + f"- returncode: {round_detail.get('returncode')}", + f"- dataset_dir: {round_detail.get('dataset_dir')}", + f"- latest_log_file: {round_detail.get('latest_log_file')}", + ]) + coverage = round_detail.get("coverage") or {} + if coverage.get("keys"): + lines.append(f"- coverage.keys: {', '.join(coverage['keys'])}") + if coverage.get("api"): + lines.append(f"- coverage.api: {', '.join(coverage['api'])}") + if coverage.get("notes"): + lines.append(f"- coverage.notes: {coverage['notes']}") + if round_detail.get("archived_log_file"): + lines.append(f"- archived_log_file: {round_detail.get('archived_log_file')}") + if round_detail.get("issues"): + lines.append("- issues:") + for issue in round_detail["issues"]: + lines.append(f" - {issue}") + if round_detail.get("dataset_diffs"): + lines.append("- dataset_diffs:") + for node_type, record_map in round_detail["dataset_diffs"].items(): + for record_id, fields in record_map.items(): + lines.append(f" - {node_type}.{record_id}: {', '.join(fields)}") + if round_detail.get("verified_bound_fields"): + lines.append("- verified_bound_fields:") + for item in round_detail["verified_bound_fields"]: + lines.append( + f" - {item.get('collection_id')}.{item.get('node_type')} local={item.get('local_data_id')} target={item.get('target_data_id')} matched={item.get('matched')}" + ) + for field_path, actual_value in (item.get("actual_fields") or {}).items(): + expected_value = (item.get("expected_fields") or {}).get(field_path) + lines.append(f" - {field_path}: actual={actual_value!r} expected={expected_value!r}") + if round_detail.get("problem_nodes"): + lines.append("- problem_nodes:") + for item in round_detail["problem_nodes"]: + lines.append( + f" - {item.get('collection_id')}.{item.get('node_type')} data_id={item.get('data_id')} action={item.get('action')} status={item.get('status')} binding_status={item.get('binding_status')} error={item.get('error') or ''}" + ) + if item.get("sync_log_tail"): + lines.append(" sync_log_tail:") + for log_line in str(item["sync_log_tail"]).splitlines(): + lines.append(f" {log_line}") + if round_detail.get("persistence_summary", {}).get("node_status"): + lines.append("- node_status:") + for item in round_detail["persistence_summary"]["node_status"]: + lines.append( + f" - collection={item.get('collection_id')} action={item.get('action')} status={item.get('status')} binding_status={item.get('binding_status')} count={item.get('count')}" + ) + lines.extend([ + "", + "### pipeline log tail", + "", + "```text", + round_detail.get("pipeline_log_tail", ""), + "```", + "", + "### stdout tail", + "", + "```text", + round_detail.get("stdout_tail", ""), + "```", + "", + "### stderr tail", + "", + "```text", + round_detail.get("stderr_tail", ""), + "```", + "", + ]) + return "\n".join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser(description="运行脚本式自动测试") + parser.add_argument( + "--config", + default="tests/fixtures/auto_sync/auto_test_config.yaml", + help="自动测试配置文件路径", + ) + parser.add_argument( + "--domain", + action="append", + default=None, + help="只跑指定 domain,可重复传入", + ) + parser.add_argument( + "--skip-init", + action="store_true", + help="跳过初始化阶段", + ) + parser.add_argument( + "--clear-only", + action="store_true", + help="只清空环境,不执行 domain 用例", + ) + args = parser.parse_args() + + config = load_yaml_config(args.config) + report_root = Path(config["paths"]["report_dir"]) / now_slug() + recreate_dir(report_root) + + init_result = {"skipped": True} + if args.clear_only: + init_result = clear_environment(args.config) + archive_run_logs(report_root, init_result, []) + (report_root / "report.md").write_text(build_markdown_report(report_root.name, init_result, []), encoding="utf-8") + (report_root / "summary.json").write_text( + json.dumps({"init": init_result, "summary": build_test_summary([]), "domains": []}, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + detail_record = build_detailed_record(report_root.name, config, init_result, []) + (report_root / "detail.json").write_text(json.dumps(detail_record, ensure_ascii=False, indent=2), encoding="utf-8") + (report_root / "detail.md").write_text(build_detailed_markdown(detail_record), encoding="utf-8") + print(f"报告已生成: {report_root / 'report.md'}") + return 0 + if not args.skip_init: + init_result = initialize_environment(args.config) + + selected_domains = args.domain or config["domains"].get("enabled", []) + domain_reports = [] + for domain_name in selected_domains: + domain_reports.append(run_domain(config, domain_name, report_root)) + + overall_passed = all(item.get("passed", False) for item in domain_reports) + archive_run_logs(report_root, init_result, domain_reports) + + markdown = build_markdown_report(report_root.name, init_result, domain_reports) + (report_root / "report.md").write_text(markdown, encoding="utf-8") + summary = build_test_summary(domain_reports) + (report_root / "summary.json").write_text( + json.dumps( + {"init": init_result, "summary": summary, "domains": domain_reports, "passed": overall_passed}, + ensure_ascii=False, + indent=2, + ), + encoding="utf-8", + ) + detail_record = build_detailed_record(report_root.name, config, init_result, domain_reports) + (report_root / "detail.json").write_text(json.dumps(detail_record, ensure_ascii=False, indent=2), encoding="utf-8") + (report_root / "detail.md").write_text(build_detailed_markdown(detail_record), encoding="utf-8") + + print(f"报告已生成: {report_root / 'report.md'}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_auto_test_all_domains.py b/scripts/run_auto_test_all_domains.py new file mode 100644 index 0000000..17708a2 --- /dev/null +++ b/scripts/run_auto_test_all_domains.py @@ -0,0 +1,253 @@ +from __future__ import annotations + +import argparse +import json +import re +import subprocess +import sys +from pathlib import Path + +from auto_test_lib import load_yaml_config, now_slug + + +ALL_DOMAINS = [ + "company", + "supplier", + "project", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "lar_change", + "project_detail_data", + "units", +] + + +def _list_report_dirs(report_base: Path) -> set[Path]: + if not report_base.exists(): + return set() + return {path for path in report_base.iterdir() if path.is_dir()} + + +def _extract_report_dir(stdout: str, stderr: str) -> Path | None: + combined = "\n".join(part for part in [stdout, stderr] if part) + match = re.search(r"报告已生成:\s*(.+?/report\.md)", combined) + if not match: + return None + return Path(match.group(1).strip()).parent + + +def _build_test_summary(domain_reports: list[dict]) -> dict: + cases: list[dict] = [] + passed_domains = 0 + failed_domains = 0 + + for domain in domain_reports: + if domain.get("passed"): + passed_domains += 1 + else: + failed_domains += 1 + for round_report in domain.get("rounds", []): + cases.append( + { + "nodeid": f"{domain['domain']}::{round_report['name']}", + "domain": domain["domain"], + "case": round_report["name"], + "purpose": round_report.get("purpose", ""), + "passed": bool(round_report.get("passed")), + "result": "PASSED" if round_report.get("passed") else "FAILED", + "returncode": round_report.get("returncode"), + "issue_count": len(round_report.get("issues", [])), + "issues": round_report.get("issues", []), + } + ) + + passed_cases = sum(1 for case in cases if case["passed"]) + return { + "total_domains": len(domain_reports), + "passed_domains": passed_domains, + "failed_domains": failed_domains, + "total_cases": len(cases), + "passed_cases": passed_cases, + "failed_cases": len(cases) - passed_cases, + "cases": cases, + } + + +def _build_markdown_report(run_id: str, summary: dict, domain_reports: list[dict], run_records: list[dict]) -> str: + lines = [ + f"# 自动测试聚合报告 {run_id}", + "", + "## 运行方式", + "", + "- 本报告由 `scripts/run_auto_test_all_domains.py` 聚合生成", + "- 每个 domain 独立初始化并单独执行,避免跨 domain 状态污染", + "", + "## Pytest 风格汇总", + "", + f"collected {summary['total_cases']} cases across {summary['total_domains']} domains", + "", + ] + for case in summary["cases"]: + lines.append(f"- {case['nodeid']} {case['result']}") + lines.extend( + [ + "", + f"== {summary['passed_cases']} passed, {summary['failed_cases']} failed, {summary['passed_domains']} passed domains, {summary['failed_domains']} failed domains ==", + "", + "## Domain 汇总", + "", + "| Domain | 结果 | 单域报告 |", + "| --- | --- | --- |", + ] + ) + run_record_by_domain = {item["domain"]: item for item in run_records} + for domain in domain_reports: + run_record = run_record_by_domain.get(domain["domain"], {}) + lines.append( + f"| {domain['domain']} | {'通过' if domain.get('passed') else '失败'} | {run_record.get('report_dir', '')} |" + ) + lines.append("") + + for domain in domain_reports: + lines.append(f"## Domain: {domain['domain']}") + if domain.get("description"): + lines.extend(["", domain["description"]]) + lines.append("") + lines.append(f"- 结果: {'通过' if domain.get('passed') else '失败'}") + record = run_record_by_domain.get(domain["domain"], {}) + if record.get("report_dir"): + lines.append(f"- 单域报告目录: {record['report_dir']}") + if record.get("returncode") not in (None, 0): + lines.append(f"- 单域脚本返回码: {record['returncode']}") + if domain.get("issues"): + lines.append("- 问题:") + for issue in domain["issues"]: + lines.append(f" - {issue}") + lines.append("") + + return "\n".join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser(description="一轮执行所有已纳入 auto-test 的 domain") + parser.add_argument( + "--config", + default="tests/fixtures/auto_sync/auto_test_config.yaml", + help="自动测试配置文件路径", + ) + parser.add_argument( + "--skip-init", + action="store_true", + help="透传给 run_auto_test.py", + ) + parser.add_argument( + "--clear-only", + action="store_true", + help="透传给 run_auto_test.py", + ) + args = parser.parse_args() + + runner = Path(__file__).with_name("run_auto_test.py") + config = load_yaml_config(args.config) + report_base = Path(config["paths"]["report_dir"]) + + aggregate_run_id = now_slug() + aggregate_report_dir = report_base / aggregate_run_id + aggregate_report_dir.mkdir(parents=True, exist_ok=True) + + domain_reports: list[dict] = [] + run_records: list[dict] = [] + overall_returncode = 0 + + for domain in ALL_DOMAINS: + command = [sys.executable, str(runner), "--config", args.config, "--domain", domain] + if args.skip_init: + command.append("--skip-init") + if args.clear_only: + command.append("--clear-only") + + before_dirs = _list_report_dirs(report_base) + result = subprocess.run(command, check=False, text=True, capture_output=True) + after_dirs = _list_report_dirs(report_base) + new_dirs = sorted(after_dirs - before_dirs) + + report_dir = _extract_report_dir(result.stdout, result.stderr) + if report_dir is None and new_dirs: + report_dir = new_dirs[-1] + + run_record = { + "domain": domain, + "returncode": result.returncode, + "report_dir": str(report_dir) if report_dir else None, + "stdout_tail": (result.stdout or "")[-4000:], + "stderr_tail": (result.stderr or "")[-4000:], + } + run_records.append(run_record) + + if result.returncode != 0: + overall_returncode = result.returncode + + if report_dir is None: + domain_reports.append( + { + "domain": domain, + "description": "", + "passed": False, + "issues": ["未找到单域报告目录"], + "rounds": [], + } + ) + continue + + domain_report_path = report_dir / f"{domain}.json" + if not domain_report_path.exists(): + domain_reports.append( + { + "domain": domain, + "description": "", + "passed": False, + "issues": [f"缺少单域报告文件: {domain_report_path}"], + "rounds": [], + } + ) + overall_returncode = overall_returncode or 1 + continue + + domain_reports.append(json.loads(domain_report_path.read_text(encoding="utf-8"))) + + summary = _build_test_summary(domain_reports) + detail = { + "mode": "isolated-per-domain", + "aggregate_run_id": aggregate_run_id, + "summary": summary, + "runs": run_records, + "domains": domain_reports, + } + (aggregate_report_dir / "summary.json").write_text( + json.dumps(detail, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + (aggregate_report_dir / "report.md").write_text( + _build_markdown_report(aggregate_run_id, summary, domain_reports, run_records), + encoding="utf-8", + ) + + print(f"聚合报告已生成: {aggregate_report_dir / 'report.md'}") + if summary["failed_domains"]: + return overall_returncode or 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/scripts/run_copy_pipeline_jsonl.py b/scripts/run_copy_pipeline_jsonl.py new file mode 100644 index 0000000..d9d5f45 --- /dev/null +++ b/scripts/run_copy_pipeline_jsonl.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import argparse +import asyncio +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +import sync_state_machine.domain # noqa: F401 +from sync_state_machine.pipeline.copy_data_pipeline import CopyDataPipeline + + +async def _main() -> None: + parser = argparse.ArgumentParser(description="Run standalone JSONL->JSONL copy pipeline in sync_state_machine") + parser.add_argument("--source-dir", required=True, help="Source JSONL directory") + parser.add_argument("--target-dir", required=True, help="Target JSONL directory") + parser.add_argument("--node-types", nargs="*", default=None, help="Optional node type whitelist") + args = parser.parse_args() + + pipeline = CopyDataPipeline( + source_dir=Path(args.source_dir), + target_dir=Path(args.target_dir), + node_types=args.node_types, + ) + stats = await pipeline.run() + print("\n[Standalone Result]", stats) + + +if __name__ == "__main__": + asyncio.run(_main()) diff --git a/scripts/run_full_sync_pipeline_jsonl_sm.py b/scripts/run_full_sync_pipeline_jsonl_sm.py new file mode 100644 index 0000000..4224479 --- /dev/null +++ b/scripts/run_full_sync_pipeline_jsonl_sm.py @@ -0,0 +1,53 @@ +""" +run_full_sync_pipeline_jsonl_sm.py + +独立执行:基于 sync_state_machine 的 JSONL -> JSONL 全量同步脚本。 +""" + +from __future__ import annotations + +import asyncio +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import sync_state_machine.domain # noqa: F401, E402 +from sync_state_machine.pipeline import ( # noqa: E402 + build_config, + run_pipeline_from_config, +) +from sync_state_machine.config import load_named_preset_overrides # noqa: E402 + + +PRESET_NAME = "jsonl_sm" + + +async def main() -> int: + try: + overrides, preset_file, used_default = load_named_preset_overrides(PROJECT_ROOT, PRESET_NAME) + source_label = "default" if used_default else "custom" + print(f"🧩 Loaded preset ({source_label}): {preset_file}") + + config = build_config(project_root=PROJECT_ROOT, overrides=overrides) + await run_pipeline_from_config( + config, + title="sync_state_machine JSONL -> JSONL pipeline", + print_summary=True, + ) + return 0 + + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + import traceback + traceback.print_exc() + return 1 + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/scripts/run_full_sync_pipeline_simple_sm.py b/scripts/run_full_sync_pipeline_simple_sm.py new file mode 100644 index 0000000..b48f6f0 --- /dev/null +++ b/scripts/run_full_sync_pipeline_simple_sm.py @@ -0,0 +1,53 @@ +""" +run_full_sync_pipeline_simple_sm.py + +独立执行:基于 sync_state_machine 的 JSONL -> API Pipeline。 +""" + +from __future__ import annotations + +import asyncio +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +import sync_state_machine.domain # noqa: F401, E402 +from sync_state_machine.pipeline import ( # noqa: E402 + build_config, + run_pipeline_from_config, +) +from sync_state_machine.config import load_named_preset_overrides # noqa: E402 + + +PRESET_NAME = "simple_sm" + + +async def main() -> int: + try: + overrides, preset_file, used_default = load_named_preset_overrides(PROJECT_ROOT, PRESET_NAME) + source_label = "default" if used_default else "custom" + print(f"🧩 Loaded preset ({source_label}): {preset_file}") + + config = build_config(project_root=PROJECT_ROOT, overrides=overrides) + await run_pipeline_from_config( + config, + title="sync_state_machine JSONL -> API pipeline", + print_summary=True, + ) + return 0 + + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + import traceback + traceback.print_exc() + return 1 + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/scripts/run_large_scale_auto_test.py b/scripts/run_large_scale_auto_test.py new file mode 100644 index 0000000..ae49c9c --- /dev/null +++ b/scripts/run_large_scale_auto_test.py @@ -0,0 +1,444 @@ +from __future__ import annotations + +import argparse +import fnmatch +import json +import re +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import yaml + +from auto_test_lib import PROJECT_ROOT, load_yaml_config, now_slug + + +DEFAULT_DOC_PATH = PROJECT_ROOT / "docs/auto_test_spec/large_scale_test_control.md" +RESULT_START_MARKER = "" +RESULT_END_MARKER = "" + + +@dataclass +class ControlDocument: + path: Path + frontmatter: dict[str, Any] + body: str + + +def read_control_document(doc_path: str | Path) -> ControlDocument: + path = Path(doc_path) + if not path.is_absolute(): + path = PROJECT_ROOT / path + text = path.read_text(encoding="utf-8") + match = re.match(r"^---\n(.*?)\n---\n?", text, re.DOTALL) + if not match: + raise ValueError(f"控制文档缺少 YAML frontmatter: {path}") + payload = yaml.safe_load(match.group(1)) or {} + body = text[match.end() :] + return ControlDocument(path=path, frontmatter=payload, body=body) + + +def write_control_document(doc: ControlDocument, generated_section: str) -> None: + body = doc.body + if RESULT_START_MARKER in body and RESULT_END_MARKER in body: + body = re.sub( + rf"{re.escape(RESULT_START_MARKER)}.*?{re.escape(RESULT_END_MARKER)}", + f"{RESULT_START_MARKER}\n\n{generated_section}\n\n{RESULT_END_MARKER}", + body, + flags=re.DOTALL, + ) + else: + body = ( + body.rstrip() + + "\n\n" + + RESULT_START_MARKER + + "\n\n" + + generated_section + + "\n\n" + + RESULT_END_MARKER + + "\n" + ) + + frontmatter_text = yaml.safe_dump(doc.frontmatter, allow_unicode=True, sort_keys=False).strip() + final_text = f"---\n{frontmatter_text}\n---\n{body.lstrip()}" + doc.path.write_text(final_text, encoding="utf-8") + + +def repo_relative(path: str | Path | None) -> str: + if not path: + return "" + resolved = Path(path) + if not resolved.is_absolute(): + return str(resolved) + try: + return str(resolved.relative_to(PROJECT_ROOT)) + except ValueError: + return str(resolved) + + +def list_report_dirs(report_base: Path) -> set[Path]: + if not report_base.exists(): + return set() + return {item for item in report_base.iterdir() if item.is_dir()} + + +def extract_report_dir(stdout: str, stderr: str) -> Path | None: + combined = "\n".join(part for part in [stdout, stderr] if part) + match = re.search(r"(?:聚合)?报告已生成:\s*(.+?/report\.md)", combined) + if not match: + return None + return Path(match.group(1).strip()).parent + + +def build_command(script_dir: Path, config_path: str, round_config: dict[str, Any], control: dict[str, Any]) -> list[str]: + runner = str(round_config.get("runner") or control.get("default_runner") or "aggregate") + init_mode = str(round_config.get("init_mode") or control.get("default_init_mode") or "fresh") + + if runner not in {"aggregate", "domains"}: + raise ValueError(f"不支持的 runner: {runner}") + if init_mode not in {"fresh", "reuse", "clear-only"}: + raise ValueError(f"不支持的 init_mode: {init_mode}") + + if runner == "aggregate": + command = [sys.executable, str(script_dir / "run_auto_test_all_domains.py"), "--config", config_path] + else: + domains = round_config.get("domains") or [] + if not domains: + raise ValueError(f"domains runner 必须显式提供 domains: {round_config.get('id')}") + command = [sys.executable, str(script_dir / "run_auto_test.py"), "--config", config_path] + for domain in domains: + command.extend(["--domain", str(domain)]) + + if init_mode == "reuse": + command.append("--skip-init") + elif init_mode == "clear-only": + command.append("--clear-only") + + return command + + +def case_map(summary_payload: dict[str, Any]) -> dict[str, dict[str, Any]]: + summary = summary_payload.get("summary", {}) + return { + case["nodeid"]: case + for case in summary.get("cases", []) + if isinstance(case, dict) and case.get("nodeid") + } + + +def match_classification(case_id: str, round_config: dict[str, Any], control: dict[str, Any]) -> str: + merged: dict[str, str] = {} + global_rules = control.get("classification", {}) or {} + round_rules = round_config.get("classification", {}) or {} + merged.update({str(key): str(value) for key, value in global_rules.items()}) + merged.update({str(key): str(value) for key, value in round_rules.items()}) + for pattern, category in merged.items(): + if fnmatch.fnmatch(case_id, pattern): + return category + return "unclassified" + + +def find_compare_target(previous_rounds: list[dict[str, Any]], current_cases: dict[str, dict[str, Any]]) -> tuple[dict[str, Any] | None, set[str]]: + current_ids = set(current_cases) + for item in reversed(previous_rounds): + previous_cases = item.get("case_results", {}) + overlap = current_ids & set(previous_cases) + if overlap: + return item, overlap + return None, set() + + +def compare_rounds(previous_round: dict[str, Any] | None, overlap: set[str], current_cases: dict[str, dict[str, Any]]) -> dict[str, Any]: + if previous_round is None or not overlap: + return { + "compare_round_id": None, + "overlap_count": 0, + "fixed": [], + "regressed": [], + "persistent_failed": [], + "stable_passed": [], + } + + previous_cases = previous_round["case_results"] + fixed: list[str] = [] + regressed: list[str] = [] + persistent_failed: list[str] = [] + stable_passed: list[str] = [] + + for case_id in sorted(overlap): + old_passed = bool(previous_cases[case_id].get("passed")) + new_passed = bool(current_cases[case_id].get("passed")) + if not old_passed and new_passed: + fixed.append(case_id) + elif old_passed and not new_passed: + regressed.append(case_id) + elif not old_passed and not new_passed: + persistent_failed.append(case_id) + else: + stable_passed.append(case_id) + + return { + "compare_round_id": previous_round.get("id"), + "overlap_count": len(overlap), + "fixed": fixed, + "regressed": regressed, + "persistent_failed": persistent_failed, + "stable_passed": stable_passed, + } + + +def execute_round( + *, + script_dir: Path, + config_path: str, + report_base: Path, + round_config: dict[str, Any], + control: dict[str, Any], + previous_rounds: list[dict[str, Any]], +) -> dict[str, Any]: + command = build_command(script_dir, config_path, round_config, control) + before_dirs = list_report_dirs(report_base) + result = subprocess.run(command, cwd=str(PROJECT_ROOT), text=True, capture_output=True, check=False) + after_dirs = list_report_dirs(report_base) + report_dir = extract_report_dir(result.stdout or "", result.stderr or "") + if report_dir is None: + new_dirs = sorted(after_dirs - before_dirs) + if new_dirs: + report_dir = new_dirs[-1] + + summary_payload: dict[str, Any] = {} + if report_dir is not None: + summary_path = report_dir / "summary.json" + if summary_path.exists(): + summary_payload = json.loads(summary_path.read_text(encoding="utf-8")) + + current_cases = case_map(summary_payload) + compare_round, overlap = find_compare_target(previous_rounds, current_cases) + comparison = compare_rounds(compare_round, overlap, current_cases) + + failed_case_details = [] + for case_id, item in sorted(current_cases.items()): + if item.get("passed"): + continue + failed_case_details.append( + { + "nodeid": case_id, + "classification": match_classification(case_id, round_config, control), + "issues": item.get("issues", []), + "issue_count": item.get("issue_count", len(item.get("issues", []))), + } + ) + + summary = summary_payload.get("summary", {}) + return { + "id": str(round_config.get("id") or ""), + "title": str(round_config.get("title") or ""), + "objective": str(round_config.get("objective") or ""), + "focus": [str(item) for item in (round_config.get("focus") or [])], + "runner": str(round_config.get("runner") or control.get("default_runner") or "aggregate"), + "init_mode": str(round_config.get("init_mode") or control.get("default_init_mode") or "fresh"), + "domains": [str(item) for item in (round_config.get("domains") or [])], + "next_goal": str(round_config.get("next_goal") or ""), + "returncode": result.returncode, + "command": command, + "report_dir": str(report_dir) if report_dir else None, + "report_md": str(report_dir / "report.md") if report_dir else None, + "summary_json": str(report_dir / "summary.json") if report_dir else None, + "summary": { + "total_domains": int(summary.get("total_domains", 0)), + "passed_domains": int(summary.get("passed_domains", 0)), + "failed_domains": int(summary.get("failed_domains", 0)), + "total_cases": int(summary.get("total_cases", 0)), + "passed_cases": int(summary.get("passed_cases", 0)), + "failed_cases": int(summary.get("failed_cases", 0)), + }, + "has_summary": bool(summary_payload), + "case_results": current_cases, + "failed_cases": failed_case_details, + "comparison": comparison, + "stdout_tail": (result.stdout or "")[-4000:], + "stderr_tail": (result.stderr or "")[-4000:], + } + + +def build_results_markdown(run_id: str, doc_path: Path, results: list[dict[str, Any]]) -> str: + lines = [ + f"## 最近一次执行 {run_id}", + "", + f"- 控制文档: {repo_relative(doc_path)}", + f"- 执行轮次数: {len(results)}", + "- 说明: 默认优先使用 fresh 初始化;若使用 aggregate runner,则每个 domain 仍会独立初始化。", + "", + "### 轮次总览", + "", + "| Round | 标题 | Runner | Init | Cases | Failed | 对比轮次 | 报告 |", + "| --- | --- | --- | --- | --- | --- | --- | --- |", + ] + + for item in results: + summary = item["summary"] + compare_round_id = item["comparison"].get("compare_round_id") or "-" + report_link = repo_relative(item.get("report_md")) or "-" + lines.append( + f"| {item['id']} | {item['title']} | {item['runner']} | {item['init_mode']} | {summary['total_cases']} | {summary['failed_cases']} | {compare_round_id} | {report_link} |" + ) + + for item in results: + summary = item["summary"] + comparison = item["comparison"] + lines.extend( + [ + "", + f"### {item['id']} - {item['title']}", + "", + f"- 目标: {item['objective']}", + f"- 运行方式: {item['runner']}", + f"- 初始化策略: {item['init_mode']}", + f"- 执行命令: {' '.join(item['command'])}", + f"- 单轮结果: {summary['passed_cases']} passed / {summary['failed_cases']} failed / {summary['total_cases']} total cases", + f"- Domain 结果: {summary['passed_domains']} passed / {summary['failed_domains']} failed / {summary['total_domains']} total domains", + f"- 原始报告: {repo_relative(item.get('report_md')) or '-'}", + f"- 原始汇总: {repo_relative(item.get('summary_json')) or '-'}", + ] + ) + if item["focus"]: + lines.append("- 本轮关注点:") + for focus in item["focus"]: + lines.append(f" - {focus}") + + lines.extend( + [ + f"- 对比轮次: {comparison.get('compare_round_id') or '无可比较轮次'}", + f"- 可比较 case 数: {comparison.get('overlap_count', 0)}", + ] + ) + if comparison.get("fixed"): + lines.append("- 本轮改进:") + for case_id in comparison["fixed"]: + lines.append(f" - fixed: {case_id}") + if comparison.get("regressed"): + lines.append("- 本轮回退:") + for case_id in comparison["regressed"]: + lines.append(f" - regressed: {case_id}") + if comparison.get("persistent_failed"): + lines.append("- 本轮遗留:") + for case_id in comparison["persistent_failed"]: + lines.append(f" - persistent_failed: {case_id}") + if not comparison.get("fixed") and not comparison.get("regressed") and not comparison.get("persistent_failed"): + lines.append("- 对比结果: 本轮没有可比改进项,或与此前轮次无重叠 case。") + + if item["failed_cases"]: + lines.append("- 失败归因:") + for failed in item["failed_cases"]: + issue_text = ";".join(str(issue) for issue in failed.get("issues", [])) or "" + lines.append( + f" - {failed['nodeid']} | {failed['classification']} | issues={failed['issue_count']} | {issue_text}" + ) + else: + lines.append("- 失败归因: 本轮无失败 case。") + + if item.get("next_goal"): + lines.append(f"- 下一轮目标: {item['next_goal']}") + if item.get("returncode") not in (0, None): + lines.append(f"- 脚本返回码: {item['returncode']}") + + return "\n".join(lines) + + +def save_archive(output_dir: Path, run_id: str, doc_path: Path, results: list[dict[str, Any]], markdown: str) -> None: + run_dir = output_dir / run_id + run_dir.mkdir(parents=True, exist_ok=True) + payload = { + "run_id": run_id, + "control_doc": repo_relative(doc_path), + "results": results, + } + (run_dir / "summary.json").write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") + (run_dir / "report.md").write_text(markdown, encoding="utf-8") + + +def main() -> int: + parser = argparse.ArgumentParser(description="按控制文档执行大规模自动测试") + parser.add_argument( + "--doc", + default=str(DEFAULT_DOC_PATH), + help="大规模测试控制文档路径", + ) + parser.add_argument( + "--round", + action="append", + default=None, + help="只执行指定 round id,可重复传入", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="只解析文档和打印计划,不实际执行", + ) + args = parser.parse_args() + + control_doc = read_control_document(args.doc) + control = control_doc.frontmatter.get("large_scale_test", {}) or {} + if not control: + raise ValueError("控制文档 frontmatter 缺少 large_scale_test 配置") + + config_path = str(control.get("config_path") or "tests/fixtures/auto_sync/auto_test_config.yaml") + auto_test_config = load_yaml_config(config_path) + report_base = Path(auto_test_config["paths"]["report_dir"]) + output_dir = Path(control.get("output_dir") or "test_results/auto_test/large_scale") + if not output_dir.is_absolute(): + output_dir = PROJECT_ROOT / output_dir + output_dir.mkdir(parents=True, exist_ok=True) + + configured_rounds = control.get("rounds") or [] + selected_round_ids = set(args.round or []) + rounds: list[dict[str, Any]] = [] + for item in configured_rounds: + if not isinstance(item, dict): + continue + if not item.get("enabled", True): + continue + if selected_round_ids and str(item.get("id")) not in selected_round_ids: + continue + rounds.append(item) + + if not rounds: + raise ValueError("没有可执行的 round;请检查 enabled 或 --round 参数") + + if args.dry_run: + for item in rounds: + print(f"{item.get('id')}: {item.get('title')}") + return 0 + + run_id = now_slug() + script_dir = PROJECT_ROOT / "scripts" + results: list[dict[str, Any]] = [] + + for round_config in rounds: + results.append( + execute_round( + script_dir=script_dir, + config_path=config_path, + report_base=report_base, + round_config=round_config, + control=control, + previous_rounds=results, + ) + ) + + markdown = build_results_markdown(run_id, control_doc.path, results) + save_archive(output_dir, run_id, control_doc.path, results, markdown) + write_control_document(control_doc, markdown) + + fail_on_failed_cases = bool(control.get("fail_on_failed_cases", False)) + if fail_on_failed_cases and any(item["summary"].get("failed_cases", 0) > 0 for item in results): + return 1 + if any(item.get("returncode") not in (0, None) and not item.get("has_summary") for item in results): + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/sync_state_machine/__init__.py b/sync_state_machine/__init__.py new file mode 100644 index 0000000..34f57f0 --- /dev/null +++ b/sync_state_machine/__init__.py @@ -0,0 +1,57 @@ +"""Public package entrypoint for the ECM sync engine.""" + +from __future__ import annotations + +from importlib.metadata import PackageNotFoundError, version +from pathlib import Path +import sys + +_PROJECT_ROOT = Path(__file__).resolve().parents[1] +if str(_PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(_PROJECT_ROOT)) + +from . import domain as _domain +from .common.registry import DomainRegistry +from .config import ( + ApiDataSourceConfig, + JsonlDataSourceConfig, + PipelineRunConfig, + build_config, + build_default_config, + load_named_preset_overrides, + load_overrides_from_file, +) +from .datasource import ApiClient, ApiDataSource, BaseApiHandler, BaseJsonlHandler, JsonlDataSource +from .pipeline import FullSyncPipeline, create_pipeline_from_config, run_pipeline_from_config + +try: + __version__ = version("ecm-sync-system") +except PackageNotFoundError: + __version__ = "0.1.0" + + +def ensure_domain_registry_loaded() -> None: + """Ensure built-in domain registrations are imported.""" + _domain # keep module import for side effects + + +__all__ = [ + "__version__", + "ensure_domain_registry_loaded", + "DomainRegistry", + "PipelineRunConfig", + "ApiDataSourceConfig", + "JsonlDataSourceConfig", + "build_config", + "build_default_config", + "load_overrides_from_file", + "load_named_preset_overrides", + "ApiClient", + "ApiDataSource", + "JsonlDataSource", + "BaseApiHandler", + "BaseJsonlHandler", + "FullSyncPipeline", + "create_pipeline_from_config", + "run_pipeline_from_config", +] diff --git a/sync_state_machine/cli.py b/sync_state_machine/cli.py new file mode 100644 index 0000000..3a20303 --- /dev/null +++ b/sync_state_machine/cli.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import argparse +import asyncio +import logging +from pathlib import Path + +from .config import build_config, load_overrides_from_file +from .pipeline import run_pipeline_from_config + + +def package_project_root() -> Path: + return Path(__file__).resolve().parents[1] + + +def resolve_config_path(raw_path: str, *, project_root: Path) -> Path: + path = Path(raw_path) + if not path.is_absolute(): + path = project_root / path + return path.resolve() + + +async def _main() -> int: + project_root = package_project_root() + + parser = argparse.ArgumentParser(description="Run sync pipeline from config override file") + parser.add_argument( + "--config_path", + required=True, + help="Path to a JSON/YAML run profile. Relative paths are resolved from the repository root.", + ) + args = parser.parse_args() + + cfg_path = resolve_config_path(args.config_path, project_root=project_root) + if not cfg_path.exists() or not cfg_path.is_file(): + raise FileNotFoundError(f"Config file not found: {cfg_path}") + + overrides = load_overrides_from_file(cfg_path, project_root) + config = build_config(project_root=project_root, overrides=overrides) + + mode = f"{config.local_datasource.type}->{config.remote_datasource.type}" + print(f"🧩 Loaded config file: {cfg_path}") + await run_pipeline_from_config( + config, + title=f"sync_state_machine pipeline ({mode})", + print_summary=True, + ) + return 0 + + +def main() -> int: + try: + return asyncio.run(_main()) + except KeyboardInterrupt: + print("\n⚠️ Interrupted by user") + return 130 + except Exception as exc: + print(f"\n❌ Pipeline failed: {type(exc).__name__}: {exc}") + return 1 + finally: + logging.shutdown() + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/sync_state_machine/common/__init__.py b/sync_state_machine/common/__init__.py new file mode 100644 index 0000000..61cabc9 --- /dev/null +++ b/sync_state_machine/common/__init__.py @@ -0,0 +1,15 @@ +from .types import SyncAction, SyncStatus, BindingStatus +from .sync_node import SyncNode +from .persistence import PersistenceBackend +from .collection import DataCollection +from .binding import BindingManager + +__all__ = [ + "SyncAction", + "SyncStatus", + "BindingStatus", + "SyncNode", + "PersistenceBackend", + "DataCollection", + "BindingManager", +] diff --git a/sync_state_machine/common/binding.py b/sync_state_machine/common/binding.py new file mode 100644 index 0000000..d8bc65d --- /dev/null +++ b/sync_state_machine/common/binding.py @@ -0,0 +1,161 @@ +import json +import logging +from typing import Optional, Dict, Any, List +from .persistence import PersistenceBackend +from .types import BindingStatus, BindingRecord + +logger = logging.getLogger(__name__) + + +class BindingManager: + """ + BindingManager 负责维护不同 DataCollection 间节点的绑定关系。 + 所有查询均在内存中进行,持久化仅作为备份。 + """ + def __init__(self, persistence: PersistenceBackend, auto_persist: bool = True): + self.persistence = persistence + self.auto_persist = auto_persist + # { node_type: { local_id: remote_id } } + self._bindings: Dict[str, Dict[str, Optional[str]]] = {} + self._deleted: Dict[str, set[str]] = {} + + def _get_type_bindings(self, node_type: str) -> Dict[str, Optional[str]]: + if node_type not in self._bindings: + self._bindings[node_type] = {} + return self._bindings[node_type] + + def _get_deleted(self, node_type: str) -> set[str]: + if node_type not in self._deleted: + self._deleted[node_type] = set() + return self._deleted[node_type] + + async def bind(self, node_type: str, local_id: str, remote_id: Optional[str], manual: bool = False): + """ + 建立本地节点与远程节点间的映射(带中文日志) + + Args: + node_type: 节点类型 + local_id: 本地节点 ID + remote_id: 远程节点 ID + manual: 是否为手工绑定(用于日志区分) + """ + bindings = self._get_type_bindings(node_type) + bindings[local_id] = remote_id + self._get_deleted(node_type).discard(local_id) + + # 记录日志:手工绑定保留 info,自动绑定降为 debug 避免日志过量 + op_type = "手工" if manual else "自动" + log_line = ( + f"[{op_type}绑定] 节点类型={node_type}, " + f"本地节点={local_id} <-> 远程节点={remote_id}" + ) + if manual: + logger.info(log_line) + else: + logger.debug(log_line) + + if self.auto_persist: + await self.persistence.save_binding(node_type, local_id, {"remote_id": remote_id}) + + async def unbind(self, node_type: str, local_id: str, manual: bool = False): + """ + 解除映射关系并物理删除(带中文日志) + + Args: + node_type: 节点类型 + local_id: 本地节点 ID + manual: 是否为手工解绑(用于日志区分) + """ + bindings = self._get_type_bindings(node_type) + remote_id = bindings.get(local_id) + + if local_id in bindings: + del bindings[local_id] + + # 记录日志(中文,区分手工/自动) + op_type = "手工" if manual else "自动" + logger.info( + f"[{op_type}解绑] 节点类型={node_type}, " + f"本地节点={local_id} (原远程节点={remote_id})" + ) + + if self.auto_persist: + await self.persistence.delete_binding(node_type, local_id) + else: + self._get_deleted(node_type).add(local_id) + + async def get_remote_id(self, node_type: str, local_id: str) -> Optional[str]: + """查询本地节点对应的远程 ID""" + bindings = self._get_type_bindings(node_type) + return bindings.get(local_id) + + async def get_local_id(self, node_type: str, remote_id: str) -> Optional[str]: + """查询远程节点对应的本地 ID (内存遍历)""" + bindings = self._get_type_bindings(node_type) + for lid, rid in bindings.items(): + if rid == remote_id: + return lid + return None + + async def get_record(self, node_type: str, local_id: str) -> Optional[BindingRecord]: + """获取结构化绑定记录""" + remote_id = self._get_type_bindings(node_type).get(local_id) + if remote_id is None: + return None + return BindingRecord( + local_id=local_id, + remote_id=remote_id + ) + + async def get_all_records(self, node_type: str) -> List[BindingRecord]: + """获取指定类型的所有完整绑定记录 (结构化对象)""" + bindings = self._get_type_bindings(node_type) + return [BindingRecord(local_id=lid, remote_id=rid) for lid, rid in bindings.items()] + + async def get_all_bindings(self, node_type: str) -> List[tuple[str, Optional[str]]]: + """获取指定类型的所有 ID 映射关系 (local_id, remote_id)""" + bindings = self._get_type_bindings(node_type) + return [(lid, rid) for lid, rid in bindings.items()] + + async def load_from_persistence(self, node_type: str): + """从持久化层加载特定类型的绑定关系到内存""" + raw_bindings = await self.persistence.load_bindings(node_type) + bindings = self._get_type_bindings(node_type) + self._get_deleted(node_type).clear() + for rb in raw_bindings: + payload = rb.get("payload") or {} + bindings[rb["local_id"]] = payload.get("remote_id") + + async def persist(self) -> None: + """将所有绑定关系写回持久化层""" + if not self._bindings and not self._deleted: + logger.info("🔍 [BindingManager.persist] 跳过:无绑定变更") + return + + type_count = 0 + saved_total = 0 + deleted_total = 0 + touched_types: List[str] = [] + + for node_type, bindings in self._bindings.items(): + deleted = list(self._get_deleted(node_type)) + binding_count = len(bindings) + deleted_count = len(deleted) + + type_count += 1 + saved_total += binding_count + deleted_total += deleted_count + if binding_count > 0 or deleted_count > 0: + touched_types.append(node_type) + + if deleted: + await self.persistence.delete_bindings_bulk(node_type, deleted) + self._get_deleted(node_type).clear() + + if bindings: + await self.persistence.save_bindings_bulk(node_type, bindings) + + touched_text = ",".join(touched_types) if touched_types else "none" + logger.info( + f"🔍 [BindingManager.persist] 完成: types={type_count}, saved={saved_total}, deleted={deleted_total}, touched=[{touched_text}]" + ) diff --git a/sync_state_machine/common/collection.py b/sync_state_machine/common/collection.py new file mode 100644 index 0000000..70649ca --- /dev/null +++ b/sync_state_machine/common/collection.py @@ -0,0 +1,540 @@ +import uuid +from enum import Enum +from typing import Dict, List, Optional, Any, Set, Callable, Literal +from .sync_node import SyncNode +from .types import SyncStatus +from .persistence import PersistenceBackend + + +class DataCollection: + """ + DataCollection 管理一组同步节点的内存集合。 + 支持快速遍历、CRUD 以及依赖检查。 + + 唯一性保证: + - node_id: 全局唯一,由 Collection.generate_node_id() 生成 + - data_id: 业务主键,允许空字符串但不允许重复(非空时) + + node_id 生成策略: + - 由 Collection.generate_node_id() 统一生成 + - Collection.add() 会检查 node_id 唯一性,重复时抛出异常 + """ + def __init__( + self, + collection_id: str, + persistence: Optional[PersistenceBackend] = None, + auto_persist: bool = False, + sm_runtime: Optional[Any] = None, + ): + self.collection_id = collection_id + self.persistence = persistence + self.auto_persist = auto_persist + self._sm_runtime = sm_runtime + self._nodes: Dict[str, SyncNode] = {} # 内存缓存 + # data_id 全局唯一(按 collection 维度),用于 O(1) 反查 node_id + self._data_id_to_node_id: Dict[str, str] = {} + # auto_persist=False 时,delete() 不会立即落库;这里记录删除集合,persist() 时统一写回 + self._deleted_node_ids: set[str] = set() + + @staticmethod + def is_bootstrap_blocked(node: SyncNode) -> bool: + """是否为加载异常隔离节点(不参与后续自动流程)。""" + context = node.context + if not isinstance(context, dict): + return False + return bool(context.get("bootstrap_blocked")) + + def set_state_machine_runtime(self, runtime: Any) -> None: + """设置 Collection 默认状态机 runtime。""" + self._sm_runtime = runtime + + async def add(self, node: SyncNode): + # 检查 node_id 唯一性 + if node.node_id in self._nodes: + raise ValueError( + f"Duplicate node_id detected: {node.node_id} already exists in collection" + ) + + # 检查 data_id 唯一性(允许空字符串) + if node.data_id and node.data_id != "": + existing_node_id = self._data_id_to_node_id.get(node.data_id) + if existing_node_id is not None: + raise ValueError( + f"Duplicate data_id detected: {node.data_id} already bound to node_id={existing_node_id}" + ) + self._data_id_to_node_id[node.data_id] = node.node_id + + self._nodes[node.node_id] = node + self._deleted_node_ids.discard(node.node_id) + if self.persistence and self.auto_persist: + await self.persistence.save_node(self.collection_id, node) + + async def update(self, node: SyncNode): + old_node = self._nodes.get(node.node_id) + if old_node and old_node.data_id and old_node.data_id != "" and old_node.data_id != node.data_id: + # node_id 不变但 data_id 变更,清理旧索引 + self._data_id_to_node_id.pop(old_node.data_id, None) + + if node.data_id and node.data_id != "": + existing_node_id = self._data_id_to_node_id.get(node.data_id) + if existing_node_id is not None and existing_node_id != node.node_id: + raise ValueError( + f"Duplicate data_id detected: {node.data_id} already bound to node_id={existing_node_id}" + ) + self._data_id_to_node_id[node.data_id] = node.node_id + self._nodes[node.node_id] = node + self._deleted_node_ids.discard(node.node_id) + if self.persistence and self.auto_persist: + await self.persistence.save_node(self.collection_id, node) + + async def delete(self, node_id: str): + old_node = self._nodes.get(node_id) + if old_node and old_node.data_id and old_node.data_id != "": + self._data_id_to_node_id.pop(old_node.data_id, None) + + if node_id in self._nodes: + del self._nodes[node_id] + if self.persistence: + if self.auto_persist: + await self.persistence.delete_node(self.collection_id, node_id) + else: + self._deleted_node_ids.add(node_id) + + def get(self, node_id: str) -> Optional[SyncNode]: + return self._nodes.get(node_id) + + def get_by_node_id(self, node_id: str) -> Optional[SyncNode]: + """别名方法,与 get() 功能相同""" + return self.get(node_id) + + def generate_node_id(self) -> str: + """生成唯一的 node_id""" + return str(uuid.uuid4()) + + def get_node_id_by_data_id(self, data_id: str) -> Optional[str]: + """按 data_id 反查 node_id(O(1))。""" + return self._data_id_to_node_id.get(data_id) + + def get_by_data_id_any(self, data_id: str) -> Optional[SyncNode]: + """按 data_id 查找节点(不要求 node_type)(O(1))。""" + node_id = self._data_id_to_node_id.get(data_id) + if not node_id: + return None + return self._nodes.get(node_id) + + def get_by_data_id(self, node_type: str, data_id: str) -> Optional[SyncNode]: + """按 node_type 和 data_id 查找节点""" + node = self.get_by_data_id_any(data_id) + if not node: + return None + return node if node.node_type == node_type else None + + def filter( + self, + node_type: Optional[str] = None, + filter: Optional[Dict[str, Any]] = None, + node_filter: Optional[ + Dict[ + Literal[ + "node_id", + "data_id", + "depend_ids", + "origin_data", + "action", + "status", + "binding_status", + "error", + "context", + "sync_log", + "node_type", + ], + Any, + ] + | Callable[[SyncNode], bool] + ] = None + ) -> List[SyncNode]: + """ + 获取节点列表。 + - node_type: 按 node_type 过滤。 + - filter: 按 node.data 中的属性过滤 (业务数据)。 + - node_filter: 按 SyncNode 顶级属性过滤 + - 如果是字典:按属性匹配 (如 {"status": SyncStatus.PENDING}) + - 如果是函数:自定义过滤函数 (如 lambda n: n.status == SyncStatus.PENDING) + """ + results = self._nodes.values() + + # 1. 按 node_type 过滤 + if node_type: + results = [n for n in results if n.node_type == node_type] + else: + results = list(results) + + # 2. 按 node_filter 过滤 (顶级属性) + if node_filter: + if callable(node_filter): + # 函数过滤器 + results = [n for n in results if node_filter(n)] + else: + filtered = [] + for node in results: + match = True + for k, v in node_filter.items(): + if k == "node_id": + actual = node.node_id + elif k == "data_id": + actual = node.data_id + elif k == "depend_ids": + actual = node.depend_ids + elif k == "origin_data": + actual = node.origin_data + elif k == "action": + actual = node.action + elif k == "status": + actual = node.status + elif k == "binding_status": + actual = node.binding_status + elif k == "error": + actual = node.error + elif k == "context": + actual = node.context + elif k == "sync_log": + actual = node.sync_log + elif k == "node_type": + actual = node.node_type + else: + match = False + break + if actual != v: + match = False + break + if match: + filtered.append(node) + results = filtered + + # 3. 按 filter 过滤 (data 内部) + if filter: + filtered = [] + for node in results: + node_data = node.get_data() + if not node_data: + match = False + else: + match = True + for k, v in filter.items(): + actual_val = node_data.get(k) + if actual_val != v: + match = False + break + if match: + filtered.append(node) + results = filtered + + return results + + @staticmethod + def _expected_matches_actual(expected: Any, actual: Any) -> bool: + if isinstance(expected, list): + return any(DataCollection._expected_matches_actual(item, actual) for item in expected) + + if isinstance(expected, str): + actual_candidates = set() + if isinstance(actual, Enum): + actual_candidates.update({str(actual.name), str(actual.value)}) + else: + actual_candidates.add(str(actual)) + expected_lower = expected.lower() + return any(str(candidate).lower() == expected_lower for candidate in actual_candidates) + + return expected == actual + + @classmethod + def _node_matches_state_id( + cls, + runtime, + *, + node: SyncNode, + state_id: str, + action_hint: Optional[str] = None, + match_fields: Optional[Set[str]] = None, + ) -> bool: + states = runtime._config.raw.get("states") + pseudo_states = runtime._config.raw.get("pseudo_states") + if not isinstance(states, dict): + raise RuntimeError("invalid state-machine config: missing states") + if pseudo_states is not None and not isinstance(pseudo_states, dict): + raise RuntimeError("invalid state-machine config: pseudo_states must be mapping") + + state_def = states.get(state_id) + if state_def is None and isinstance(pseudo_states, dict): + state_def = pseudo_states.get(state_id) + if not isinstance(state_def, dict): + return False + + snapshot = { + "binding_status": node.binding_status, + "action": action_hint if action_hint is not None else node.action, + "status": node.status, + "data_id_exist": bool(node.data_id), + } + selected_fields = match_fields or set(snapshot.keys()) + + for field, actual in snapshot.items(): + if field not in selected_fields: + continue + if field not in state_def: + continue + expected = state_def[field] + if not cls._expected_matches_actual(expected, actual): + return False + return True + + def filter_by_state_ids( + self, + runtime: Optional[Any] = None, + *, + state_ids: List[str], + node_type: Optional[str] = None, + include_bootstrap_blocked: bool = False, + action_hint: Optional[str] = None, + match_fields: Optional[Set[str]] = None, + ) -> List[SyncNode]: + """ + 按状态机状态名(Sxx)筛选节点。 + + 说明: + - 状态定义来源于 `runtime` 关联的 YAML 配置; + - 默认排除 `bootstrap_blocked` 隔离节点; + - `action_hint` 可用于匹配类似 E40 场景的动作分支。 + """ + runtime_obj = runtime or self._sm_runtime + if runtime_obj is None: + raise RuntimeError("state-machine runtime is not set for collection") + + candidates = self.filter(node_type=node_type) + matched: List[SyncNode] = [] + for node in candidates: + if not include_bootstrap_blocked and self.is_bootstrap_blocked(node): + continue + if any( + self._node_matches_state_id( + runtime_obj, + node=node, + state_id=state_id, + action_hint=action_hint, + match_fields=match_fields, + ) + for state_id in state_ids + ): + matched.append(node) + return matched + + def check_depends(self, node_ids: List[str]) -> bool: + """ + 检查指定的 node_id 列表是否存在,且状态是否不是 FAILED。 + + Args: + node_ids: 依赖的 node_id 列表 + + Returns: + bool: 所有依赖均满足则返回 True + """ + for nid in node_ids: + node = self.get(nid) + if not node: + return False + if node.status == SyncStatus.FAILED: + return False + return True + + async def load_from_persistence(self): + """ + 从后端加载数据到内存 + + 使用 DomainRegistry 恢复正确的 SyncNode 类型。 + 如果 node_type 未注册,会抛出 ValueError。 + + **加载阶段**: + - 原样恢复持久化状态(binding_status/action/status/error) + - 清空 sync_log(避免跨轮次累积日志) + - data/origin_data 保留(由 DataSource 覆盖) + + **初始化归并(E01)**: + - 由 Pipeline 在加载后调用 run_reset() 触发 E01 + - CREATE 僵尸节点进入 S15 并删除 + - 其余节点进入 S00(UNCHECKED/NONE/PENDING) + """ + if not self.persistence: + return + + self._nodes = {} + self._data_id_to_node_id = {} + self._deleted_node_ids.clear() + + node_dicts = await self.persistence.load_nodes(self.collection_id) + + from .types import SyncAction, SyncStatus, BindingStatus + from .registry import DomainRegistry + + for node_dict in node_dicts: + node_type = node_dict["node_type"] + + # 从注册中心获取正确的 SyncNode 类(未注册会抛出 ValueError) + node_class = DomainRegistry.get_node_class(node_type) + assert issubclass(node_class, SyncNode) + + # 严格恢复 action/status/binding_status;非法持久化值进入隔离态(S17 语义) + parse_errors: list[str] = [] + + # 原样恢复 action 字段(可能是字符串或枚举) + raw_action = node_dict.get("action", SyncAction.NONE) + if isinstance(raw_action, str): + try: + action_value = SyncAction(raw_action) + except ValueError: + parse_errors.append(f"invalid action={raw_action}") + action_value = SyncAction.NONE + elif isinstance(raw_action, SyncAction): + action_value = raw_action + else: + if raw_action is None: + action_value = SyncAction.NONE + else: + parse_errors.append(f"invalid action type={type(raw_action).__name__}") + action_value = SyncAction.NONE + + # 原样恢复 status 字段(可能是字符串或枚举) + raw_status = node_dict.get("status", SyncStatus.PENDING) + if isinstance(raw_status, str): + try: + status_value = SyncStatus(raw_status) + except ValueError: + parse_errors.append(f"invalid status={raw_status}") + status_value = SyncStatus.FAILED + elif isinstance(raw_status, SyncStatus): + status_value = raw_status + else: + if raw_status is None: + status_value = SyncStatus.PENDING + else: + parse_errors.append(f"invalid status type={type(raw_status).__name__}") + status_value = SyncStatus.FAILED + + # 原样恢复 binding_status 字段(可能是字符串或枚举) + raw_binding_status = node_dict.get("binding_status", BindingStatus.UNCHECKED) + if isinstance(raw_binding_status, str): + try: + binding_status_value = BindingStatus(raw_binding_status) + except ValueError: + parse_errors.append(f"invalid binding_status={raw_binding_status}") + binding_status_value = BindingStatus.ABNORMAL + elif isinstance(raw_binding_status, BindingStatus): + binding_status_value = raw_binding_status + else: + if raw_binding_status is None: + binding_status_value = BindingStatus.UNCHECKED + else: + parse_errors.append( + f"invalid binding_status type={type(raw_binding_status).__name__}" + ) + binding_status_value = BindingStatus.ABNORMAL + + raw_context = node_dict.get("context", {}) + context_value = raw_context if isinstance(raw_context, dict) else {} + error_value = node_dict.get("error") + + if parse_errors: + context_value = dict(context_value) + context_value["bootstrap_blocked"] = True + context_value["bootstrap_block_reason"] = "invalid_persisted_enum" + context_value["bootstrap_block_errors"] = parse_errors + binding_status_value = BindingStatus.ABNORMAL + action_value = SyncAction.NONE + status_value = SyncStatus.FAILED + details = "; ".join(parse_errors) + error_value = f"LOAD_INVALID_ENUM: {details}" + + # 使用正确的类型创建节点(保留持久化状态,后续由 E01 统一归并) + try: + node = node_class( + node_id=node_dict["node_id"], + data_id=node_dict.get("data_id", ""), + depend_ids=node_dict.get("depend_ids", []), + data=node_dict.get("data"), # 保留,由 DataSource 覆盖 + origin_data=node_dict.get("origin_data"), # 保留,由 DataSource 覆盖 + action=action_value, + status=status_value, + binding_status=binding_status_value, + error=error_value, + sync_log=None, # 初始化加载时清空上一轮流转日志 + context=context_value, + ) + node.context["_loaded_from_persistence"] = True + except Exception: + import logging + logger = logging.getLogger(__name__) + logger.error( + f"Load failed for node_type={node_type}, node_id={node_dict.get('node_id')}", + exc_info=True + ) + logger.error(f"Offending data: {node_dict.get('data')}") + raise + + self._nodes[node.node_id] = node + + if node.data_id and node.data_id != "": + existing_node_id = self._data_id_to_node_id.get(node.data_id) + if existing_node_id is not None and existing_node_id != node.node_id: + raise ValueError( + f"Duplicate data_id detected while loading: {node.data_id} already bound to node_id={existing_node_id}" + ) + self._data_id_to_node_id[node.data_id] = node.node_id + + node_types = {node.node_type for node in self._nodes.values()} + for node_type in node_types: + override_map = await self.persistence.load_bind_data_id_overrides(node_type) + for node in self.filter(node_type=node_type): + bind_data_id = override_map.get(node.node_id) + if bind_data_id: + node.context["bind_data_id"] = bind_data_id + else: + node.context.pop("bind_data_id", None) + + async def persist(self) -> None: + """将当前 collection 全量持久化到后端""" + if not self.persistence: + return + + # 先落库删除(用于 auto_persist=False 的场景) + if self._deleted_node_ids: + await self.persistence.delete_nodes_bulk(self.collection_id, list(self._deleted_node_ids)) + self._deleted_node_ids.clear() + + if not self._nodes: + return + + await self.persistence.save_nodes_bulk(self.collection_id, list(self._nodes.values())) + + async def filter_by_project_ids(self, target_project_ids: List[str]) -> int: + """按目标项目集合过滤当前 collection,返回删除数量。""" + target_set = set(target_project_ids or []) + if not target_set: + return 0 + + nodes = self.filter() + deleted_count = 0 + for node in nodes: + should_delete = False + if node.node_type == "project": + if node.data_id not in target_set: + should_delete = True + else: + data = node.get_data() or {} + project_id = data.get("project_id") + if project_id and project_id not in target_set: + should_delete = True + + if should_delete: + await self.delete(node.node_id) + deleted_count += 1 + + return deleted_count diff --git a/sync_state_machine/common/persistence.py b/sync_state_machine/common/persistence.py new file mode 100644 index 0000000..1b3b9f2 --- /dev/null +++ b/sync_state_machine/common/persistence.py @@ -0,0 +1,411 @@ +import aiosqlite +import json +import os +import sqlite3 +from typing import Optional, Dict, List, Any, TYPE_CHECKING + +if TYPE_CHECKING: + from .sync_node import SyncNode + +class PersistenceBackend: + """ + Persistence 负责同步系统运行时数据的持久化存储(aiosqlite 实现)。 + 主要作为 DataCollection 和 BindingManager 的后端存储。 + """ + def __init__(self, db_path: str = ":memory:", backend: str = "sqlite"): + self.db_path = db_path + self.backend = backend + self.conn: Optional[aiosqlite.Connection] = None + + @staticmethod + def _is_read_only_sql(sql: str) -> bool: + stmt = (sql or "").strip().lower() + return stmt.startswith("select") or stmt.startswith("pragma") or stmt.startswith("with") + + @classmethod + def query_records( + cls, + *, + backend: str, + db_path: str, + sql: str, + limit: int = 200, + ) -> tuple[List[str], List[Dict[str, Any]]]: + if backend != "sqlite": + raise NotImplementedError(f"records query backend not supported yet: {backend}") + if not cls._is_read_only_sql(sql): + raise ValueError("Only read-only SQL is allowed") + + path = db_path + if not os.path.exists(path): + raise FileNotFoundError(f"DB not found: {path}") + + with sqlite3.connect(path) as conn: + conn.row_factory = sqlite3.Row + cursor = conn.execute(sql) + rows = cursor.fetchmany(max(1, min(limit, 2000))) + columns = [item[0] for item in (cursor.description or [])] + data = [{k: row[k] for k in columns} for row in rows] + return columns, data + + @classmethod + def records_summary( + cls, + *, + backend: str, + db_path: str, + ) -> Dict[str, Any]: + summary: Dict[str, Any] = { + "backend": backend, + "db_path": db_path, + "db_exists": os.path.exists(db_path), + "tables": [], + "sample_bindings": [], + } + if not os.path.exists(db_path): + return summary + if backend != "sqlite": + summary["error"] = f"records summary backend not supported yet: {backend}" + return summary + + with sqlite3.connect(db_path) as conn: + conn.row_factory = sqlite3.Row + tables = conn.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name" + ).fetchall() + table_names = [str(r["name"]) for r in tables] + + for name in table_names: + count = conn.execute(f"SELECT COUNT(1) AS c FROM {name}").fetchone()["c"] + summary["tables"].append({"name": name, "count": int(count)}) + + if "bindings" in table_names: + sample = conn.execute( + "SELECT node_type, local_id, remote_id FROM bindings ORDER BY last_updated DESC LIMIT 50" + ).fetchall() + summary["sample_bindings"] = [ + { + "node_type": row["node_type"], + "local_id": row["local_id"], + "remote_id": row["remote_id"], + } + for row in sample + ] + return summary + + async def initialize(self): + """异步初始化数据库连接和表结构""" + if self.backend != "sqlite": + raise NotImplementedError(f"Persistence backend not supported yet: {self.backend}") + + # 确保目录存在 + if self.db_path != ":memory:": + dir_path = os.path.dirname(self.db_path) + if dir_path: + os.makedirs(dir_path, exist_ok=True) + + self.conn = await aiosqlite.connect(self.db_path) + self.conn.row_factory = aiosqlite.Row + await self._init_db() + + async def _init_db(self): + # 1. 节点表: 仅用于持久化存储 DataCollection 中的 SyncNode + # 注意: depend_ids不持久化,每次从data实时计算 + await self.conn.execute(""" + CREATE TABLE IF NOT EXISTS nodes ( + collection_id TEXT NOT NULL, + node_id TEXT NOT NULL, + node_type TEXT NOT NULL, + data_id TEXT, + bind_data_id TEXT, + data TEXT, + origin_data TEXT, + action TEXT, + status TEXT, + binding_status TEXT, + error TEXT, + sync_log TEXT, + context TEXT, + PRIMARY KEY (collection_id, node_id) + ) + """) + await self._ensure_nodes_schema() + + # 2. 绑定表: 存储本地到远程的映射关系 + # 只保留 local_id / remote_id 两字段(remote_id 可空) + await self._ensure_bindings_schema() + await self.conn.commit() + + async def _ensure_nodes_schema(self) -> None: + cursor = await self.conn.execute("PRAGMA table_info(nodes)") + rows = await cursor.fetchall() + columns = [r[1] for r in rows] if rows else [] + if "bind_data_id" not in columns: + await self.conn.execute("ALTER TABLE nodes ADD COLUMN bind_data_id TEXT") + + async def _ensure_bindings_schema(self) -> None: + """确保 bindings 表为 (node_type, local_id, remote_id) 结构。 + + 若检测到旧表含 payload 列,则进行迁移。 + """ + cursor = await self.conn.execute("PRAGMA table_info(bindings)") + rows = await cursor.fetchall() + columns = [r[1] for r in rows] if rows else [] + + if not columns: + await self.conn.execute(""" + CREATE TABLE IF NOT EXISTS bindings ( + node_type TEXT NOT NULL, + local_id TEXT NOT NULL, + remote_id TEXT, + last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (node_type, local_id) + ) + """) + return + + if "payload" in columns and "remote_id" not in columns: + # 迁移旧结构 payload -> remote_id + await self.conn.execute(""" + CREATE TABLE IF NOT EXISTS bindings_new ( + node_type TEXT NOT NULL, + local_id TEXT NOT NULL, + remote_id TEXT, + last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (node_type, local_id) + ) + """) + + async with self.conn.execute("SELECT node_type, local_id, payload FROM bindings") as cur: + old_rows = await cur.fetchall() + for row in old_rows: + try: + payload_dict = json.loads(row[2]) if row[2] else {} + except json.JSONDecodeError: + payload_dict = {} + remote_id = payload_dict.get("remote_id") + await self.conn.execute( + "INSERT OR REPLACE INTO bindings_new (node_type, local_id, remote_id) VALUES (?, ?, ?)", + (row[0], row[1], remote_id), + ) + + await self.conn.execute("DROP TABLE bindings") + await self.conn.execute("ALTER TABLE bindings_new RENAME TO bindings") + + # --- DataCollection 支持 --- + + async def save_node(self, collection_id: str, node: "SyncNode"): + """保存或更新单个节点(depend_ids不持久化,运行时从data实时计算)""" + bind_data_id = None + if isinstance(node.context, dict): + value = node.context.get("bind_data_id") + if value is not None and value != "": + bind_data_id = str(value) + await self.conn.execute(""" + INSERT OR REPLACE INTO nodes ( + collection_id, node_id, node_type, data_id, bind_data_id, + data, origin_data, action, status, binding_status, error, sync_log, context + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, ( + collection_id, + node.node_id, + node.node_type, + node.data_id, + bind_data_id, + json.dumps(node.data) if node.data else None, + json.dumps(node.origin_data) if node.origin_data else None, + node.action.value, + node.status.value, + node.binding_status.value, + node.error, + node.sync_log, + json.dumps(node.context) if node.context else None + )) + await self.conn.commit() + + async def save_nodes_bulk(self, collection_id: str, nodes: List["SyncNode"]): + """批量保存或更新节点 (单次提交,depend_ids不持久化)""" + if not nodes: + return + rows = [] + for node in nodes: + bind_data_id = None + if isinstance(node.context, dict): + value = node.context.get("bind_data_id") + if value is not None and value != "": + bind_data_id = str(value) + rows.append(( + collection_id, + node.node_id, + node.node_type, + node.data_id, + bind_data_id, + json.dumps(node.data) if node.data else None, + json.dumps(node.origin_data) if node.origin_data else None, + node.action.value, + node.status.value, + node.binding_status.value, + node.error, + node.sync_log, + json.dumps(node.context) if node.context else None + )) + + await self.conn.executemany(""" + INSERT OR REPLACE INTO nodes ( + collection_id, node_id, node_type, data_id, bind_data_id, + data, origin_data, action, status, binding_status, error, sync_log, context + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, rows) + await self.conn.commit() + + async def delete_node(self, collection_id: str, node_id: str): + """删除单个节点""" + await self.conn.execute("DELETE FROM nodes WHERE collection_id = ? AND node_id = ?", (collection_id, node_id)) + await self.conn.commit() + + async def delete_nodes_bulk(self, collection_id: str, node_ids: List[str]): + """批量删除节点 (单次提交)""" + if not node_ids: + return + rows = [(collection_id, node_id) for node_id in node_ids] + await self.conn.executemany( + "DELETE FROM nodes WHERE collection_id = ? AND node_id = ?", + rows, + ) + await self.conn.commit() + + async def load_nodes(self, collection_id: str) -> List[Dict[str, Any]]: + """从特定 collection 中加载所有节点(depend_ids初始化为空,稍后从data实时计算)""" + async with self.conn.execute("SELECT * FROM nodes WHERE collection_id = ?", (collection_id,)) as cursor: + rows = await cursor.fetchall() + results = [] + for row in rows: + results.append({ + "node_id": row["node_id"], + "node_type": row["node_type"], + "data_id": row["data_id"], + "bind_data_id": row["bind_data_id"], + "depend_ids": [], # 不从数据库加载,运行时从data实时计算 + "data": json.loads(row["data"]) if row["data"] else None, + "origin_data": json.loads(row["origin_data"]) if row["origin_data"] else None, + "action": row["action"], + "status": row["status"], + "binding_status": row["binding_status"], + "error": row["error"], + "sync_log": row["sync_log"], + "context": json.loads(row["context"]) if row["context"] else {} + }) + if results[-1]["bind_data_id"] and isinstance(results[-1]["context"], dict): + results[-1]["context"]["bind_data_id"] = results[-1]["bind_data_id"] + return results + + # --- BindingManager 支持 --- + + async def save_binding(self, node_type: str, local_id: str, payload_dict: Dict[str, Any]): + """保存或更新绑定关系及其元数据""" + remote_id = payload_dict.get("remote_id") if payload_dict else None + await self.conn.execute(""" + INSERT OR REPLACE INTO bindings (node_type, local_id, remote_id) + VALUES (?, ?, ?) + """, (node_type, local_id, remote_id)) + await self.conn.commit() + + async def save_bindings_bulk(self, node_type: str, bindings: Dict[str, Optional[str]]): + """批量保存或更新绑定关系 (单次提交)""" + if not bindings: + return + rows = [] + for local_id, remote_id in bindings.items(): + rows.append((node_type, local_id, remote_id)) + await self.conn.executemany( + "INSERT OR REPLACE INTO bindings (node_type, local_id, remote_id) VALUES (?, ?, ?)", + rows, + ) + await self.conn.commit() + + async def delete_binding(self, node_type: str, local_id: str): + """删除绑定关系""" + await self.conn.execute( + "DELETE FROM bindings WHERE node_type = ? AND local_id = ?", + (node_type, local_id) + ) + await self.conn.commit() + + async def delete_bindings_bulk(self, node_type: str, local_ids: List[str]): + """批量删除绑定关系 (单次提交)""" + if not local_ids: + return + rows = [(node_type, local_id) for local_id in local_ids] + await self.conn.executemany( + "DELETE FROM bindings WHERE node_type = ? AND local_id = ?", + rows, + ) + await self.conn.commit() + + async def load_bindings(self, node_type: str) -> List[Dict[str, Any]]: + """回写该类型下的所有绑定关系到内存""" + async with self.conn.execute( + "SELECT local_id, remote_id FROM bindings WHERE node_type = ?", + (node_type,) + ) as cursor: + rows = await cursor.fetchall() + return [ + {"local_id": r["local_id"], "payload": {"remote_id": r["remote_id"]}} + for r in rows + ] + + async def load_bind_data_id_overrides(self, node_type: str) -> Dict[str, Optional[str]]: + """基于 bindings 表计算 node_id -> bind_data_id 覆盖映射。 + + 规则: + - local 节点的 bind_data_id 取其绑定 remote 节点的 data_id + - remote 节点的 bind_data_id 取其绑定 local 节点的 data_id + """ + sql = """ + SELECT b.local_id AS src_node_id, rn.data_id AS bind_data_id + FROM bindings b + LEFT JOIN nodes rn + ON rn.node_id = b.remote_id + AND rn.node_type = b.node_type + WHERE b.node_type = ? + + UNION ALL + + SELECT b.remote_id AS src_node_id, ln.data_id AS bind_data_id + FROM bindings b + LEFT JOIN nodes ln + ON ln.node_id = b.local_id + AND ln.node_type = b.node_type + WHERE b.node_type = ? + AND b.remote_id IS NOT NULL + """ + async with self.conn.execute(sql, (node_type, node_type)) as cursor: + rows = await cursor.fetchall() + result: Dict[str, Optional[str]] = {} + for row in rows: + src_node_id = row["src_node_id"] + if not src_node_id: + continue + result[str(src_node_id)] = row["bind_data_id"] + return result + + async def dump_to_runtime(self, filename: str): + """将当前状态转储到 _runtime 文件夹 (使用 VACUUM INTO)""" + runtime_path = os.path.join("_runtime", filename) + if os.path.exists(runtime_path): + os.remove(runtime_path) + + # VACUUM INTO 是备份 SQLite 的推荐方式 (SQLite 3.27+) + await self.conn.execute("VACUUM INTO ?", (runtime_path,)) + + async def close(self): + """关闭数据库连接(包含异常处理)""" + if self.conn: + try: + await self.conn.close() + except Exception as e: + print(f"⚠️ Error closing persistence: {e}") + finally: + self.conn = None diff --git a/sync_state_machine/common/registry.py b/sync_state_machine/common/registry.py new file mode 100644 index 0000000..da594e6 --- /dev/null +++ b/sync_state_machine/common/registry.py @@ -0,0 +1,267 @@ +""" +Domain 注册中心 + +提供统一的 domain 组件注册和查询接口。 +各模块(Collection/DataSource/Strategy)按需获取。 + +使用方式: +1. 在 domain/__init__.py 中注册所有组件 +2. 各模块按需查询 + +示例: + # 注册 + from ..common.registry import DomainRegistry + from .contract import ContractSyncNode, ContractJsonlHandler + + DomainRegistry.register( + node_type="contract", + schema=ContractResponse, + node_class=ContractSyncNode, + jsonl_handler_class=ContractJsonlHandler + ) + + # Collection 查询 SyncNode 类 + node_class = DomainRegistry.get_node_class("contract") + + # DataSource 查询 Handler + handler_class = DomainRegistry.get_jsonl_handler("contract") +""" +from typing import Dict, Type, Optional, Any +from dataclasses import dataclass, field +from pydantic import BaseModel + + +@dataclass +class DomainRegistration: + """ + 单个 domain 的注册信息 + + 包含: + - node_class: SyncNode 子类(用于 Collection 恢复) + - strategy_class: Strategy 子类(用于 SyncSystem 初始化) + - handlers: 各种 Handler(用于 DataSource 初始化) + """ + node_type: str + schema: Type[BaseModel] + node_class: Type[Any] # Type[SyncNode[T]],避免循环导入 + strategy_class: Optional[Type[Any]] = None # 可选,部分 domain 可能只读 + jsonl_handler_class: Optional[Type[Any]] = None + api_handler_class: Optional[Type[Any]] = None + db_handler_class: Optional[Type[Any]] = None + metadata: Dict[str, Any] = field(default_factory=dict) # 额外元数据 + + +class DomainRegistry: + """ + Domain 注册中心 + + 职责分离: + - Collection: 只关心 SyncNode 类(恢复类型) + - DataSource: 只关心 Handler 类(执行层) + - Strategy: 只关心 Strategy 类(业务逻辑) + + 每个 domain 只注册一次,各模块按需获取。 + """ + + _registry: Dict[str, DomainRegistration] = {} + + @classmethod + def register( + cls, + node_type: str, + schema: Type[BaseModel], + node_class: Type[Any], + strategy_class: Optional[Type[Any]] = None, + jsonl_handler_class: Optional[Type[Any]] = None, + api_handler_class: Optional[Type[Any]] = None, + db_handler_class: Optional[Type[Any]] = None, + **metadata + ) -> None: + """ + 注册一个 domain + + Args: + node_type: 节点类型(如 "contract") + schema: Pydantic Schema 类 + node_class: SyncNode 子类 + strategy_class: Strategy 子类(可选) + jsonl_handler_class: JSONL Handler 类(可选) + api_handler_class: API Handler 类(可选) + db_handler_class: DB Handler 类(可选) + **metadata: 额外的元数据 + + Raises: + ValueError: 如果 node_type 已注册 + """ + if node_type in cls._registry: + raise ValueError(f"Domain '{node_type}' already registered") + + cls._registry[node_type] = DomainRegistration( + node_type=node_type, + schema=schema, + node_class=node_class, + strategy_class=strategy_class, + jsonl_handler_class=jsonl_handler_class, + api_handler_class=api_handler_class, + db_handler_class=db_handler_class, + metadata=metadata + ) + + @classmethod + def get_node_class(cls, node_type: str) -> Type[Any]: + """ + 获取 SyncNode 类(用于 Collection 恢复) + + Args: + node_type: 节点类型 + + Returns: + SyncNode 子类 + + Raises: + ValueError: 如果 node_type 未注册 + """ + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'. Available: {list(cls._registry.keys())}") + return reg.node_class + + @classmethod + def get_strategy_class(cls, node_type: str) -> Optional[Type[Any]]: + """ + 获取 Strategy 类(用于 SyncSystem) + + Args: + node_type: 节点类型 + + Returns: + Strategy 类,如果未注册则返回 None + """ + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg.strategy_class + + @classmethod + def get_jsonl_handler(cls, node_type: str) -> Optional[Type[Any]]: + """ + 获取 JSONL Handler 类(用于 DataSource) + + Args: + node_type: 节点类型 + + Returns: + Handler 类,如果未注册则返回 None + """ + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg.jsonl_handler_class + + @classmethod + def get_api_handler(cls, node_type: str) -> Optional[Type[Any]]: + """获取 API Handler 类""" + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg.api_handler_class + + @classmethod + def get_db_handler(cls, node_type: str) -> Optional[Type[Any]]: + """获取 DB Handler 类""" + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg.db_handler_class + + @classmethod + def get_schema(cls, node_type: str) -> Type[BaseModel]: + """获取 Schema 类""" + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg.schema + + @classmethod + def get_registration(cls, node_type: str) -> DomainRegistration: + """获取完整的注册信息""" + reg = cls._registry.get(node_type) + if not reg: + raise ValueError(f"Unknown node_type: '{node_type}'") + return reg + + @classmethod + def is_registered(cls, node_type: str) -> bool: + """检查 node_type 是否已注册""" + return node_type in cls._registry + + @classmethod + def list_registered(cls) -> list[str]: + """列出所有已注册的 node_type""" + return list(cls._registry.keys()) + + @classmethod + def get_registered_types(cls) -> list[str]: + """列出所有已注册的 node_type(list_registered 的别名)""" + return cls.list_registered() + + @classmethod + def clear(cls) -> None: + """清空注册表(仅用于测试)""" + cls._registry.clear() + + @classmethod + def print_registry(cls) -> None: + """打印所有注册的 domain 信息(用于调试)""" + if not cls._registry: + print("⚠️ DomainRegistry is empty - no domains registered") + return + + print(f"\n{'='*80}") + print(f"📋 DomainRegistry - {len(cls._registry)} domain(s) registered") + print(f"{'='*80}\n") + + for node_type, reg in sorted(cls._registry.items()): + print(f"🔹 {node_type}") + print(f" Schema: {reg.schema.__name__}") + print(f" Node Class: {reg.node_class.__name__}") + print(f" Strategy Class: {reg.strategy_class.__name__ if reg.strategy_class else '❌ None'}") + print(f" JSONL Handler: {reg.jsonl_handler_class.__name__ if reg.jsonl_handler_class else '❌ None'}") + print(f" API Handler: {reg.api_handler_class.__name__ if reg.api_handler_class else '❌ None'}") + print(f" DB Handler: {reg.db_handler_class.__name__ if reg.db_handler_class else '❌ None'}") + if reg.metadata: + print(f" Metadata: {reg.metadata}") + print() + + print(f"{'='*80}\n") + + @classmethod + def get_summary(cls) -> Dict[str, Dict[str, bool]]: + """ + 获取注册摘要(用于自动化检查) + + Returns: + 字典,key 为 node_type,value 为各组件的注册状态 + + Example: + { + "contract": { + "has_node": True, + "has_strategy": True, + "has_jsonl_handler": True, + "has_api_handler": True, + "has_db_handler": False + }, + ... + } + """ + summary = {} + for node_type, reg in cls._registry.items(): + summary[node_type] = { + "has_node": reg.node_class is not None, + "has_strategy": reg.strategy_class is not None, + "has_jsonl_handler": reg.jsonl_handler_class is not None, + "has_api_handler": reg.api_handler_class is not None, + "has_db_handler": reg.db_handler_class is not None, + } + return summary diff --git a/sync_state_machine/common/sync_node.py b/sync_state_machine/common/sync_node.py new file mode 100644 index 0000000..1533eb5 --- /dev/null +++ b/sync_state_machine/common/sync_node.py @@ -0,0 +1,435 @@ +""" +SyncNode - 核心状态机容器 + +将data存储为Dict,但支持schema验证和Pydantic模型转换。 +提供统一的数据访问接口:get_data() / put_data() +""" + +import copy +from contextlib import contextmanager +from typing import TypeVar, Generic, Optional, Any, Dict, List, Type +from pydantic import BaseModel, ValidationError + +from .types import SyncAction, SyncStatus, BindingStatus + +T = TypeVar("T", bound=BaseModel) + + +class SyncNode(Generic[T]): + """ + 核心状态机容器 + + 数据存储策略: + - origin_data/data 内部存储为 Dict + - 通过 get_data() 获取数据副本(深拷贝) + - 通过 set_data() 设置数据(自动验证+深拷贝) + - 通过 to_model() 转换为 Pydantic 模型实例 + + 基类 SyncNode 不应直接实例化,应通过子类使用。 + 子类应设置类变量 node_type 和 schema: + ```python + class ContractSyncNode(SyncNode[ContractResponse]): + node_type = "contract" + schema = ContractResponse + ``` + """ + + # 类变量:子类必须设置 + node_type: str = None # type: ignore + schema: Type[T] = None # type: ignore + _CORE_FIELDS = {"binding_status", "action", "status", "data_id"} + + def __setattr__(self, name: str, value: Any) -> None: + if ( + name in self._CORE_FIELDS + and self.__dict__.get("_core_guard_enabled", False) + and self.__dict__.get("_core_write_depth", 0) <= 0 + ): + raise RuntimeError( + f"Core field '{name}' can only be modified via event apply path for node={self.__dict__.get('node_id', '')}" + ) + object.__setattr__(self, name, value) + + @contextmanager + def allow_core_state_write(self, source: str = "unknown"): + depth = self.__dict__.get("_core_write_depth", 0) + prev_source = self.__dict__.get("_core_write_source", "") + object.__setattr__(self, "_core_write_depth", depth + 1) + object.__setattr__(self, "_core_write_source", source) + try: + yield + finally: + object.__setattr__(self, "_core_write_depth", depth) + object.__setattr__(self, "_core_write_source", prev_source) + + def __init__( + self, + node_id: str, + data_id: str = "", + depend_ids: Optional[List[str]] = None, + data: Optional[Dict[str, Any]] = None, + origin_data: Optional[Dict[str, Any]] = None, + action: SyncAction = SyncAction.NONE, + status: SyncStatus = SyncStatus.PENDING, + binding_status: BindingStatus = BindingStatus.UNCHECKED, + error: Optional[str] = None, + context: Optional[Dict[str, Any]] = None, + sync_log: Optional[str] = None + ): + object.__setattr__(self, "_core_guard_enabled", False) + object.__setattr__(self, "_core_write_depth", 0) + + # 检查类变量是否设置 + if self.node_type is None: + raise ValueError( + f"{self.__class__.__name__} must define class variable 'node_type'. " + f"Example: node_type = 'contract'" + ) + if self.schema is None: + raise ValueError( + f"{self.__class__.__name__} must define class variable 'schema'. " + f"Example: schema = YourSchema" + ) + + self.node_id = node_id + self.data_id = data_id + self.depend_ids = depend_ids if depend_ids is not None else [] + + if origin_data is not None: + self.origin_data = copy.deepcopy(origin_data) + else: + self.origin_data = None + self.action = action + self.status = status + self.binding_status = binding_status + self.error = error + self.sync_log = sync_log # Debug/info级别的日志信息 + + # Context 字典:存储额外的上下文信息(如 project_id, contract_id 等) + self.context: Dict[str, Any] = context if context is not None else {} + + # 在初始化时验证并设置 data + if data is not None: + self._validate_and_set_data(data) + if self.origin_data is None: + self.origin_data = copy.deepcopy(self.data) + else: + self.data = None + + object.__setattr__(self, "_core_guard_enabled", True) + + def _validate_and_set_data(self, data: Dict[str, Any]) -> None: + """验证并设置数据(内部方法)""" + if not isinstance(data, dict): + self.data = None + raise ValueError(f"Data validation failed for {self.node_type}: data must be a dict") + + try: + # 基础兼容性:将 _id 转换为 id + data_to_validate = data.copy() + if "id" not in data_to_validate and "_id" in data_to_validate: + data_to_validate["id"] = data_to_validate["_id"] + + model = self.schema.model_validate(data_to_validate) + # 使用 model_dump() 获得完整校验后的数据,去掉 schema 之外的字段 + self.data = model.model_dump() + except Exception as e: + # 如果出错就存 None, 然后 error 里加个错 + self.data = None + self.error = f"Validation failed: {str(e)}" + # 不要轻易降级错误。如果校验失败,应抛出 ValueError 供上层处理 + raise ValueError(f"Data validation failed for {self.node_type}: {e}") + + # ===== 数据访问方法 ===== + + def get_data(self, exclude_unset: bool = False) -> Optional[Dict[str, Any]]: + """ + 获取数据的副本。 + + Args: + exclude_unset: 是否排除未设置(默认值)的字段。 + + Returns: + 数据字典的副本,如果为None则返回None + """ + if self.data is None: + return None + + if not exclude_unset: + return copy.deepcopy(self.data) + + try: + model = self.schema.model_validate(self.data) + return model.model_dump(exclude_unset=True) + except Exception: + return copy.deepcopy(self.data) + + def set_data(self, data: Optional[Dict[str, Any]], validate: bool = True) -> None: + """ + 设置数据(自动深拷贝)。 + + Args: + data: 要设置的数据字典 + validate: 是否进行schema验证(默认True) + + Raises: + ValueError: 如果数据验证失败 + """ + if data is None: + self.data = None + return + + if validate: + self._validate_and_set_data(data) + else: + self.data = copy.deepcopy(data) + + def get_origin_data(self) -> Optional[Dict[str, Any]]: + """ + 获取原始数据的深拷贝副本。 + + Returns: + 原始数据字典的副本,如果为None则返回None + """ + if self.origin_data is None: + return None + return copy.deepcopy(self.origin_data) + + def set_origin_data(self, data: Optional[Dict[str, Any]]) -> None: + """ + 设置原始数据(自动深拷贝)。 + + Args: + data: 要设置的原始数据字典 + """ + if data is None: + self.origin_data = None + return + + if self.schema is None: + raise ValueError(f"Cannot set origin_data without schema for {self.node_type}") + + try: + model = self.schema.model_validate(copy.deepcopy(data)) + # 使用 exclude_unset=True 确保 origin_data 也只记录实际提供/返回的字段 + self.origin_data = model.model_dump(exclude_unset=True) + except AttributeError as e: + raise ValueError( + f"Origin data validation failed for {self.node_type}: model_dump not available" + ) from e + except (ValidationError, TypeError, ValueError) as e: + raise ValueError(f"Origin data validation failed for {self.node_type}: {e}") from e + + # ===== Schema 相关方法 ===== + + def get_schema(self) -> Optional[Type[T]]: + """ + 获取数据的 Schema 类型。 + + Returns: + Pydantic Model 类型,如果未设置则返回 None + """ + return self.schema + + def set_schema(self, schema: Type[T]) -> None: + """ + 设置数据的 Schema 类型。 + + Args: + schema: Pydantic Model 类型 + """ + self.schema = schema + + def validate(self) -> bool: + """ + 验证当前数据是否符合 schema。 + + Returns: + True 如果验证通过或无 schema,False 如果验证失败 + """ + if self.schema is None or self.data is None: + return True + + try: + self.schema.model_validate(self.data) + return True + except ValidationError: + return False + + def to_model(self) -> Optional[T]: + """ + 将数据转换为 Pydantic 模型实例。 + + Returns: + 模型实例,如果无数据或无schema则返回None + + Raises: + ValidationError: 如果数据验证失败 + """ + if self.schema is None or self.data is None: + return None + + return self.schema.model_validate(self.data) + + def from_model(self, model: T) -> None: + """ + 从 Pydantic 模型实例设置数据。 + + Args: + model: Pydantic 模型实例 + """ + try: + self.data = model.model_dump() + except AttributeError as e: + raise ValueError( + f"Cannot convert model to dict: model_dump not available ({type(model)})" + ) from e + + # 自动设置schema + if self.schema is None: + self.schema = type(model) + + # ===== 辅助方法 ===== + + def get_field(self, field_name: str, default: Any = None) -> Any: + """ + 从data中获取指定字段的值。 + + Args: + field_name: 字段名 + default: 默认值 + + Returns: + 字段值,如果不存在则返回default + """ + if self.data is None: + return default + return self.data.get(field_name, default) + + def set_field(self, field_name: str, value: Any) -> None: + """ + 设置data中的指定字段。 + + Args: + field_name: 字段名 + value: 字段值 + """ + if self.data is None: + self.data = {} + self.data[field_name] = value + + def has_field(self, field_name: str) -> bool: + """ + 检查data中是否存在指定字段。 + + Args: + field_name: 字段名 + + Returns: + True 如果字段存在 + """ + if self.data is None: + return False + return field_name in self.data + + # ===== 状态管理方法(带日志记录) ===== + + def append_log(self, message: str) -> None: + """追加日志到 sync_log(中文)""" + import time + from datetime import datetime + timestamp = datetime.fromtimestamp(time.time()).strftime("%H:%M:%S") + log_entry = f"[{timestamp}] {message}" + + if self.sync_log: + self.sync_log += "\n" + log_entry + else: + self.sync_log = log_entry + + def set_status(self, new_status: SyncStatus, reason: str = "") -> None: + """ + 设置status并更新时间戳和日志(如果状态改变) + + Args: + new_status: 新的执行状态 + reason: 状态变化原因(中文) + """ + if self.status != new_status: + old_status = self.status + self.status = new_status + reason_text = f" - {reason}" if reason else "" + + # DEBUG 日志 + import logging + logger = logging.getLogger(__name__) + logger.debug( + f"[{self.node_type}] 节点 {self.node_id}: " + f"执行状态 {old_status.value} → {new_status.value}{reason_text}" + ) + + def set_data_id(self, new_data_id: str, reason: str = "") -> None: + """ + 设置 data_id(仅允许在 event apply 路径内调用) + """ + if self.data_id != new_data_id: + old_data_id = self.data_id + self.data_id = new_data_id + + reason_text = f" - {reason}" if reason else "" + self.append_log(f"数据ID: {old_data_id or ''} → {new_data_id or ''}{reason_text}") + + import logging + logger = logging.getLogger(__name__) + logger.debug( + f"[{self.node_type}] 节点 {self.node_id}: " + f"data_id {old_data_id or ''} → {new_data_id or ''}{reason_text}" + ) + + def set_binding_status(self, new_status: BindingStatus, reason: str = "") -> None: + """ + 设置binding_status并更新时间戳和日志(如果状态改变) + + Args: + new_status: 新的绑定状态 + reason: 状态变化原因(中文) + """ + if self.binding_status != new_status: + if self.__dict__.get("_core_guard_enabled", False): + write_source = self.__dict__.get("_core_write_source", "") + if write_source != "state_machine": + raise RuntimeError( + f"binding_status update must go through state machine for node={self.node_id}, source={write_source or ''}" + ) + old_status = self.binding_status + self.binding_status = new_status + + reason_text = reason or "" + + # DEBUG 日志 + import logging + logger = logging.getLogger(__name__) + logger.debug( + f"[{self.node_type}] 节点 {self.node_id}: " + f"绑定状态 {old_status.value} → {new_status.value} - {reason_text}" + ) + + def set_action(self, new_action: SyncAction, reason: str = "") -> None: + """ + 设置action并更新时间戳和日志(如果动作改变) + + Args: + new_action: 新的同步动作 + reason: 动作变化原因(中文) + """ + if self.action != new_action: + old_action = self.action + self.action = new_action + reason_text = f" - {reason}" if reason else "" + + # DEBUG 日志 + import logging + logger = logging.getLogger(__name__) + logger.debug( + f"[{self.node_type}] 节点 {self.node_id}: " + f"同步动作 {old_action.value} → {new_action.value}{reason_text}" + ) diff --git a/sync_state_machine/common/type_safety.py b/sync_state_machine/common/type_safety.py new file mode 100644 index 0000000..3b361e3 --- /dev/null +++ b/sync_state_machine/common/type_safety.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from typing import Any, Mapping, TypeGuard + +from pydantic import BaseModel + + +def is_pydantic_model_class(value: Any) -> TypeGuard[type[BaseModel]]: + return isinstance(value, type) and issubclass(value, BaseModel) + + +def get_pydantic_model_fields(value: Any) -> Mapping[str, Any]: + if is_pydantic_model_class(value): + return value.model_fields + return {} \ No newline at end of file diff --git a/sync_state_machine/common/types.py b/sync_state_machine/common/types.py new file mode 100644 index 0000000..5d1eaf2 --- /dev/null +++ b/sync_state_machine/common/types.py @@ -0,0 +1,48 @@ +""" +Common type definitions for the sync system. + +This module contains only enum definitions. SyncNode is defined in sync_node.py. +""" + +from enum import Enum +from pydantic import BaseModel +from typing import Optional + + +class SyncAction(str, Enum): + """同步动作枚举""" + NONE = "NONE" # 保持现状 (SKIP) + CREATE = "CREATE" # 创建新对象 + UPDATE = "UPDATE" # 更新现有对象 + DELETE = "DELETE" # 删除对象 + + +class SyncStatus(str, Enum): + """同步执行状态枚举""" + PENDING = "PENDING" + IN_PROGRESS = "IN_PROGRESS" + SUCCESS = "SUCCESS" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + PRECONDITION_FAILED = "PRECONDITION_FAILED" + + +class BindingStatus(str, Enum): + """绑定状态枚举""" + UNCHECKED = "unchecked" # 初始瞬态 (Init) + + # --- 终态 (Final States) --- + NORMAL = "normal" # 稳态: 绑定存在,数据健康 + MISSING = "missing" # 孤儿: 未找到绑定对象 + + # --- 阻断态 (Blocking States) --- + ABNORMAL = "abnormal" # 只有ID没有数据 (Corrupted) + WARNING = "warning" # 匹配成功但数据不可用 (Data Invalid) 或 对方损坏 + DEPENDENCY_ERROR = "dep_err" # 依赖项缺失、父级ID解析失败或异常 + PEER_CREATING = "peer_creating" # 对侧创建中,本侧等待提交 + + +class BindingRecord(BaseModel): + """持久化绑定记录的结构化对象 (纯 ID 映射)""" + local_id: str + remote_id: Optional[str] = None diff --git a/sync_state_machine/config/__init__.py b/sync_state_machine/config/__init__.py new file mode 100644 index 0000000..7d157f6 --- /dev/null +++ b/sync_state_machine/config/__init__.py @@ -0,0 +1,51 @@ +from .datasource_config import ApiDataSourceConfig, JsonlDataSourceConfig, DataSourceConfig +from .persist_config import PersistConfig +from .logging_config import LoggingConfig, resolve_log_file_path +from .run_presets import ( + list_preset_names, + get_preset_file_candidates, + resolve_preset_file, + load_overrides_from_file, + load_named_preset_overrides, +) +from .strategy_config import ( + OrphanAction, + UpdateDirection, + StrategyConfig, + StrategyRuntimeConfig, + ConfigPresets, +) +from .pipeline_config import PipelineRunConfig, DEFAULT_NODE_TYPES +from .builder import ( + build_default_config, + build_config, + apply_config_overrides, + apply_env_overrides, + config_snapshot, +) + +__all__ = [ + "ApiDataSourceConfig", + "JsonlDataSourceConfig", + "PipelineRunConfig", + "DataSourceConfig", + "PersistConfig", + "LoggingConfig", + "resolve_log_file_path", + "list_preset_names", + "get_preset_file_candidates", + "resolve_preset_file", + "load_overrides_from_file", + "load_named_preset_overrides", + "OrphanAction", + "UpdateDirection", + "StrategyConfig", + "StrategyRuntimeConfig", + "ConfigPresets", + "DEFAULT_NODE_TYPES", + "build_default_config", + "build_config", + "apply_config_overrides", + "apply_env_overrides", + "config_snapshot", +] diff --git a/sync_state_machine/config/builder.py b/sync_state_machine/config/builder.py new file mode 100644 index 0000000..62a2210 --- /dev/null +++ b/sync_state_machine/config/builder.py @@ -0,0 +1,189 @@ +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any, Dict, Mapping, Optional, Union + +from pydantic import BaseModel + +from ..common.registry import DomainRegistry +from .datasource_config import DataSourceConfig +from .pipeline_config import PipelineRunConfig +from .strategy_config import ConfigPresets, StrategyRuntimeConfig + + +def _deep_merge(base: Mapping[str, Any], override: Mapping[str, Any]) -> Dict[str, Any]: + merged: Dict[str, Any] = dict(base) + for key, value in override.items(): + if isinstance(value, dict) and isinstance(merged.get(key), dict): + if key in {"local_datasource", "remote_datasource"}: + current_type = merged[key].get("type") + next_type = value.get("type", current_type) + if current_type != next_type: + merged[key] = dict(value) + continue + merged[key] = _deep_merge(merged[key], value) + else: + merged[key] = value + return merged + + +def _default_strategy_map(node_types: list[str]) -> Dict[str, StrategyRuntimeConfig]: + strategy_map: Dict[str, StrategyRuntimeConfig] = {} + for node_type in node_types: + strategy_class = DomainRegistry.get_strategy_class(node_type) + if strategy_class is None: + continue + strategy_map[node_type] = StrategyRuntimeConfig( + node_type=node_type, + config=strategy_class.default_config.model_copy(deep=True), + ) + return strategy_map + + +def _apply_strategy_overrides( + node_types: list[str], + strategy_overrides: Any, +) -> list[StrategyRuntimeConfig]: + strategy_map = _default_strategy_map(node_types) + + if isinstance(strategy_overrides, list): + for item in strategy_overrides: + runtime_cfg = StrategyRuntimeConfig.model_validate(item) + strategy_map[runtime_cfg.node_type] = runtime_cfg + return [strategy_map[n] for n in node_types if n in strategy_map] + + if not isinstance(strategy_overrides, dict): + return [strategy_map[n] for n in node_types if n in strategy_map] + + for node_type, raw_override in strategy_overrides.items(): + if node_type not in strategy_map: + strategy_map[node_type] = StrategyRuntimeConfig(node_type=node_type) + + runtime_cfg = strategy_map[node_type] + override = dict(raw_override or {}) + + preset = override.pop("preset", None) + if preset: + runtime_cfg.config = ConfigPresets.get_preset(str(preset)) + + override.pop("skip_sync", None) + override.pop("force_sync", None) + override.pop("load_mode", None) + + if "config" in override and isinstance(override["config"], dict): + runtime_cfg.config = runtime_cfg.config.model_validate( + _deep_merge(runtime_cfg.config.model_dump(), override.pop("config")) + ) + + if override: + runtime_cfg.config = runtime_cfg.config.model_validate( + _deep_merge(runtime_cfg.config.model_dump(), override) + ) + + return [strategy_map[n] for n in node_types if n in strategy_map] + + +def config_snapshot(config: PipelineRunConfig) -> Dict[str, Any]: + snap = config.model_dump(mode="json") + for key in ("local_datasource", "remote_datasource"): + ds = snap.get(key) or {} + if ds.get("api_secret"): + ds["api_secret"] = "***" + return snap + + +def build_default_config(project_root: Path) -> PipelineRunConfig: + defaults = { + "local_datasource": { + "type": "jsonl", + "jsonl_dir": str(project_root / "filtered_datasource" / "datasource" / "ecm-2025-12-02"), + "read_only": False, + "handler_configs": {}, + }, + "remote_datasource": { + "type": "jsonl", + "jsonl_dir": str(project_root / "remote_datasource" / "datasource"), + "read_only": False, + "handler_configs": {}, + }, + "target_project_ids": [], + "persist": { + "db_path": str(project_root / "test_results" / "sync_state_machine" / "pipeline_default.db"), + "enable": True, + "wipe_on_start": False, + }, + "logging": { + "initialize": True, + "file_path": None, + "level": 20, + "suppress_node_logs": True, + }, + } + + config = PipelineRunConfig.model_validate(defaults) + config.strategies = _apply_strategy_overrides(config.node_types, {}) + return config + + +def apply_config_overrides(config: PipelineRunConfig, overrides: Dict[str, Any]) -> PipelineRunConfig: + merged = _deep_merge(config.model_dump(), overrides) + raw_strategies = merged.pop("strategies", None) + legacy_strategy_overrides = merged.pop("strategy_overrides", None) + + resolved = PipelineRunConfig.model_validate(merged) + + if raw_strategies is not None: + resolved.strategies = _apply_strategy_overrides(resolved.node_types, raw_strategies) + else: + resolved.strategies = _apply_strategy_overrides(resolved.node_types, legacy_strategy_overrides or {}) + + return resolved + + +def apply_env_overrides( + config: PipelineRunConfig, + project_root: Path, + *, + dotenv_file: Optional[Union[str, Path]] = None, +) -> PipelineRunConfig: + raise NotImplementedError( + "Environment-based overrides are removed. Use JSON config files via overrides_file instead." + ) + + +def build_config( + *, + project_root: Path, + local_datasource: Optional[Union[DataSourceConfig, Dict[str, Any]]] = None, + remote_datasource: Optional[Union[DataSourceConfig, Dict[str, Any]]] = None, + overrides: Optional[Dict[str, Any]] = None, + overrides_file: Optional[Union[str, Path]] = None, + dotenv_file: Optional[Union[str, Path]] = None, +) -> PipelineRunConfig: + if dotenv_file is not None: + raise ValueError("dotenv_file is no longer supported; use overrides_file JSON instead") + + config = build_default_config(project_root) + + if local_datasource is not None: + local_payload = ( + local_datasource.model_dump() if isinstance(local_datasource, BaseModel) else dict(local_datasource) + ) + config = apply_config_overrides(config, {"local_datasource": local_payload}) + + if remote_datasource is not None: + remote_payload = ( + remote_datasource.model_dump() if isinstance(remote_datasource, BaseModel) else dict(remote_datasource) + ) + config = apply_config_overrides(config, {"remote_datasource": remote_payload}) + + if overrides_file: + override_path = Path(overrides_file) + file_data = json.loads(override_path.read_text(encoding="utf-8")) + config = apply_config_overrides(config, file_data) + + if overrides: + config = apply_config_overrides(config, overrides) + + return config diff --git a/sync_state_machine/config/datasource_config.py b/sync_state_machine/config/datasource_config.py new file mode 100644 index 0000000..4c94dcc --- /dev/null +++ b/sync_state_machine/config/datasource_config.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from typing import Annotated, Any, Dict, List, Literal, Union + +from pydantic import BaseModel, ConfigDict, Field + + +class JsonlDataSourceConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + type: Literal["jsonl"] = "jsonl" + jsonl_dir: str + read_only: bool = False + target_project_ids: List[str] = Field(default_factory=list) + handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict) + + +class ApiDataSourceConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + type: Literal["api"] = "api" + api_base_url: str = "" + api_uid: str = "" + api_secret: str = "" + api_debug: bool = False + poll_max_retries: int = 10 + poll_interval: float = 0.5 + api_rate_limit_max_requests: int = 10 + api_rate_limit_window_seconds: float = 10.0 + target_project_ids: List[str] = Field(min_length=1) + handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict) + + +DataSourceConfig = Annotated[Union[JsonlDataSourceConfig, ApiDataSourceConfig], Field(discriminator="type")] diff --git a/sync_state_machine/config/logging_config.py b/sync_state_machine/config/logging_config.py new file mode 100644 index 0000000..a78c592 --- /dev/null +++ b/sync_state_machine/config/logging_config.py @@ -0,0 +1,30 @@ +from datetime import datetime +from pathlib import Path +from typing import Optional + +from pydantic import BaseModel, ConfigDict + + +class LoggingConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + initialize: bool = True + file_path: Optional[str] = None + file_dir: Optional[str] = None + file_name_pattern: Optional[str] = None + level: int = 20 + suppress_node_logs: bool = True + + +def resolve_log_file_path(cfg: LoggingConfig) -> Optional[str]: + if cfg.file_path: + return cfg.file_path + if not cfg.file_dir: + return None + + pattern = cfg.file_name_pattern or "pipeline_{timestamp}.log" + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = pattern.replace("{timestamp}", ts) + log_dir = Path(cfg.file_dir) + log_dir.mkdir(parents=True, exist_ok=True) + return str(log_dir / filename) diff --git a/sync_state_machine/config/node_state_machine.yaml b/sync_state_machine/config/node_state_machine.yaml new file mode 100644 index 0000000..716f77c --- /dev/null +++ b/sync_state_machine/config/node_state_machine.yaml @@ -0,0 +1,600 @@ +meta: + name: node_state_machine + version: 0.1 + language: zh-CN + desc: "节点状态机配置(用于驱动/校验未来的状态机组件)" + + # 命名约定(配置内唯一真名;图上不再有 display/别名): + # - Sxx: State / PseudoState(节点) + # - Exx: Event(事件) + # - 事件分支由渲染器在边上追加 a/b/c...(对应 outcomes 顺序) + id_convention: + state_prefix: "S" + event_prefix: "E" + +# Variables are computed by the caller and passed into the state machine. +# Rule: the YAML never directly mutates "peer" nodes. Cross-node changes must be +# represented as separate invocations with different inputs. +context: + is_create_zombie: { type: bool, desc: "初始化时判定为 CREATE 僵尸:action=CREATE 且 (status=FAILED 或 data_id 为空)" } + + has_binding_record: { type: bool, desc: "binding_manager 里存在绑定记录 (remote_id/local_id 非空)" } + core_binding_result: { type: enum, values: [NORMAL, WARNING, ABNORMAL], desc: "SyncDecisionEngine.determine_core_status() 给本节点的结果(仅在 has_binding_record=true 时有效)" } + peer_core_binding_result: { type: enum, values: [NORMAL, WARNING, ABNORMAL], desc: "SyncDecisionEngine.determine_core_status() 给对方节点的结果(用于静态约束 core matrix 对称性)" } + + data_present: { type: bool, desc: "node.get_data() 非空" } + has_depend_fields: { type: bool, desc: "config.depend_fields 非空" } + dep_satisfied: { type: bool, desc: "依赖满足:空依赖值跳过;非空依赖值必须能在 collection 中按 data_id 找到且节点状态可用" } + + auto_bind_enabled: { type: bool, desc: "config.auto_bind && auto_bind_fields 非空" } + auto_bind_outcome: + type: enum + values: [ONE_TO_ONE, AMBIGUOUS, ZERO, KEY_MISSING, KEY_ID_RESOLVE_FAIL, DATA_MISSING] + desc: "自动绑定结果(由业务代码完成全集搜索+去噪后 1:1 判定)" + + create_enabled: { type: bool, desc: "create() 是否对当前方向启用 (local_orphan_action/remote_orphan_action)" } + create_id_resolve_ok: { type: bool, desc: "IDResolver.resolve_and_validate() 是否成功" } + spawn_success: { type: bool, desc: "创建副作用(spawn + bind)是否成功" } + + update_enabled: { type: bool, desc: "update() 是否启用 (update_direction != NONE)" } + target_has_data_id: { type: bool, desc: "UPDATE 目标节点 data_id 非空" } + update_id_resolve_ok: { type: bool, desc: "UPDATE 前 IDResolver.resolve_and_validate() 是否成功" } + has_diff: { type: bool, desc: "needs_update_check 判定有差异" } + + handler_result: + type: enum + values: [SUCCESS, FAILED, SKIPPED, IN_PROGRESS] + desc: "TaskResult.status" + poll_timeout: { type: bool, desc: "异步轮询超过 max_retries" } + execute_action: + type: enum + values: [CREATE, UPDATE, DELETE, NONE] + desc: "E40 执行时的动作类型(用于区分 SKIPPED 的落点)" + +# State IDs are for visualization and static validation. +# NOTE: 本状态机按“加载时清空执行状态,再开始本轮”建模: +# - 加载/初始化后,稳态节点的 status 统一回到 PENDING +# - 上一轮遗留的 FAILED/SUCCESS 等不作为本轮的入口状态 +states: + # --- Stable entry to bind (after init reset + zombie cleanup) --- + S00: + binding_status: UNCHECKED + action: NONE + status: PENDING + data_id_exist: true + desc: | + 进入 bind 前的唯一起点 + binding_status: UNCHECKED + action: NONE + status: PENDING + data_id_exist: true + + # --- Bind results --- + S01: + binding_status: NORMAL + action: NONE + status: PENDING + data_id_exist: true + desc: | + 绑定正常(待后续 update 检查) + binding_status: NORMAL + action: NONE + status: PENDING + data_id_exist: true + + S02: + binding_status: MISSING + action: NONE + status: PENDING + data_id_exist: true + desc: | + 孤儿节点(可能进入 create / auto_bind / delete) + binding_status: MISSING + action: NONE + status: PENDING + data_id_exist: true + + S03: + binding_status: ABNORMAL + action: NONE + status: PENDING + data_id_exist: true + desc: | + 数据损坏/缺失(阻断态,需人工) + binding_status: ABNORMAL + action: NONE + status: PENDING + data_id_exist: true + S04: + binding_status: WARNING + action: NONE + status: PENDING + data_id_exist: true + desc: | + 不可自动处理(阻断态,需人工) + binding_status: WARNING + action: NONE + status: PENDING + data_id_exist: true + S05: + binding_status: DEPENDENCY_ERROR + action: NONE + status: PENDING + data_id_exist: true + desc: | + 依赖项不满足/ID解析失败(阻断态) + binding_status: DEPENDENCY_ERROR + action: NONE + status: PENDING + data_id_exist: true + + # --- Create & Update prepared actions (target-side nodes) --- + S06: + binding_status: NORMAL + action: CREATE + status: PENDING + data_id_exist: false + shape: pseudo + desc: | + 待执行 CREATE(执行入口) + binding_status: NORMAL + action: CREATE + status: PENDING + data_id_exist: false + S07: + binding_status: NORMAL + action: UPDATE + status: PENDING + data_id_exist: true + desc: | + 准备更新 + binding_status: NORMAL + action: UPDATE + status: PENDING + data_id_exist: true + + S08: + binding_status: NORMAL + action: UPDATE + status: PRECONDITION_FAILED + data_id_exist: [false, true] + desc: | + 更新前置失败(缺 data_id / 依赖ID未解析等) + binding_status: NORMAL + action: UPDATE + status: PRECONDITION_FAILED + data_id_exist: false | true + + S09: + binding_status: NORMAL + action: DELETE + status: PENDING + data_id_exist: true + desc: | + 待执行 DELETE(执行入口) + binding_status: NORMAL + action: DELETE + status: PENDING + data_id_exist: true + + # --- Sync results --- + S10C: + binding_status: NORMAL + action: CREATE + status: IN_PROGRESS + data_id_exist: false + desc: | + CREATE 异步执行中 + binding_status: NORMAL + action: CREATE + status: IN_PROGRESS + data_id_exist: false + S10U: + binding_status: NORMAL + action: UPDATE + status: IN_PROGRESS + data_id_exist: true + desc: | + UPDATE 异步执行中 + binding_status: NORMAL + action: UPDATE + status: IN_PROGRESS + data_id_exist: true + S10D: + binding_status: NORMAL + action: DELETE + status: IN_PROGRESS + data_id_exist: true + desc: | + DELETE 异步执行中 + binding_status: NORMAL + action: DELETE + status: IN_PROGRESS + data_id_exist: true + S11C: + binding_status: NORMAL + action: CREATE + status: SUCCESS + data_id_exist: true + desc: | + CREATE 执行成功 + binding_status: NORMAL + action: CREATE + status: SUCCESS + data_id_exist: true + S11U: + binding_status: NORMAL + action: UPDATE + status: SUCCESS + data_id_exist: true + desc: | + UPDATE 执行成功 + binding_status: NORMAL + action: UPDATE + status: SUCCESS + data_id_exist: true + S11D: + binding_status: NORMAL + action: DELETE + status: SUCCESS + data_id_exist: true + desc: | + DELETE 执行成功(随后删除节点) + binding_status: NORMAL + action: DELETE + status: SUCCESS + data_id_exist: true + S12C: + binding_status: NORMAL + action: CREATE + status: FAILED + data_id_exist: [false, true] + desc: | + CREATE 执行失败 + binding_status: NORMAL + action: CREATE + status: FAILED + data_id_exist: false | true + S12U: + binding_status: NORMAL + action: UPDATE + status: FAILED + data_id_exist: [false, true] + desc: | + UPDATE 执行失败 + binding_status: NORMAL + action: UPDATE + status: FAILED + data_id_exist: false | true + S12D: + binding_status: NORMAL + action: DELETE + status: FAILED + data_id_exist: [false, true] + desc: | + DELETE 执行失败 + binding_status: NORMAL + action: DELETE + status: FAILED + data_id_exist: false | true + + S13: + binding_status: PEER_CREATING + action: NONE + status: PENDING + data_id_exist: true + desc: | + 对侧创建进行中(本侧等待提交) + binding_status: PEER_CREATING + action: NONE + status: PENDING + data_id_exist: true + + # Handler 在 update 路径中可能把 action 降级为 NONE 并返回 SKIPPED。 + # NOTE: 这会产生 (NORMAL, NONE, SKIPPED),并且该节点会被统计到 none 列。 + S14: + binding_status: NORMAL + action: NONE + status: SKIPPED + data_id_exist: true + desc: | + 更新被跳过(执行时降级为 NONE) + binding_status: NORMAL + action: NONE + status: SKIPPED + data_id_exist: true + +pseudo_states: + S15: + desc: "节点被清理删除(zombie cleanup)" + S16: + desc: "持久化加载输入态:本轮 E01 的输入节点集合(可包含上轮遗留与已稳定节点)" + S17: + desc: "加载异常隔离态:持久化枚举非法,保留错误供人工处理,不进入自动流程" + +stages: + bootstrap: + desc: "启动/初始化(仅针对持久化加载出的节点):僵尸清理与归并到 S00" + entry_states: [S16] + exit_states: [S00, S15] + + bind: + desc: "绑定判定:core matrix +(可选)依赖检查 +(可选)自动绑定;stage 仅约束边界,不要求内部顺序" + entry_states: [S00] + exit_states: [S01, S02, S03, S04, S05, S13] + + create_prepare: + desc: "Create: 从 MISSING 源节点发起创建请求并在副作用提交后归并" + entry_states: [S02, S13] + exit_states: [S01, S02, S04, S05, S09, S13] + + update_prepare: + desc: "Update: 检测差异并在目标节点上设置 UPDATE/PRECONDITION_FAILED" + entry_states: [S01] + exit_states: [S01, S07, S08] + + post_create_ready: + desc: "创建成功后归并:CREATE 成功节点回到 NORMAL/NONE/PENDING,作为 update 起点" + entry_states: [S11C] + exit_states: [S01] + + sync_execute: + desc: "Sync: DataSource 调用 handler,根据 TaskResult 更新 status;部分 handler 可能降级 action" + entry_states: [S06, S07, S09, S10C, S10U, S10D] + exit_states: [S10C, S10U, S10D, S11C, S11U, S11D, S12C, S12U, S12D, S14] + +transitions: + E01: + stage: bootstrap + desc: "初始化:删CREATE僵尸;其余重置后进入起点" + from: [S16] + outcomes: + - when: { is_create_zombie: true } + to: S15 + - when: { is_create_zombie: false } + to: S00 + + # --- Bind phase1 core --- + E10: + stage: bind + desc: "核心绑定判定:有绑定按core结果分流;无绑定→MISSING" + from: [S00] + outcomes: + - when: { has_binding_record: true, core_binding_result: NORMAL, peer_core_binding_result: NORMAL } + to: S01 + emit: + note: "绑定关系一致,进入正常态" + - when: { has_binding_record: true, core_binding_result: WARNING, peer_core_binding_result: ABNORMAL } + to: S04 + emit: + note: "对端异常,本端标记WARNING" + - when: { has_binding_record: true, core_binding_result: ABNORMAL, peer_core_binding_result: WARNING } + to: S03 + emit: + note: "本端异常,进入ABNORMAL" + - when: { has_binding_record: true, core_binding_result: ABNORMAL, peer_core_binding_result: ABNORMAL } + to: S03 + emit: + note: "双方异常,进入ABNORMAL" + - when: { has_binding_record: false } + to: S02 + emit: + note: "无绑定记录,标记为MISSING" + + # --- Bind phase2 dependency --- + E15: + stage: bind + desc: "依赖检查:失败→阻断;缺少依赖配置→WARNING;通过→不变(不在图上画自环)" + from: [S02] + outcomes: + - when: { has_depend_fields: false, data_present: true } + to: S04 + emit: + note: "缺少依赖字段配置,无法自动处理" + - when: { data_present: false } + to: S03 + emit: + note: "节点数据为空或不存在" + - when: { data_present: true, has_depend_fields: true, dep_satisfied: false } + to: S05 + emit: + note: "依赖项不满足" + + # --- Bind phase3 auto bind --- + E16: + stage: bind + desc: "自动绑定:1:1→NORMAL;歧义/缺字段/数据为空→阻断;N:0 且允许创建→S13 等待创建提交" + from: [S02] + outcomes: + - when: { auto_bind_enabled: false } + to: S04 + emit: + note: "自动绑定未启用" + - when: { auto_bind_enabled: true, auto_bind_outcome: DATA_MISSING } + to: S04 + emit: + note: "节点数据为空,无法自动绑定" + - when: { auto_bind_enabled: true, auto_bind_outcome: ONE_TO_ONE } + to: S01 + emit: + note: "自动绑定成功(1:1)" + - when: { auto_bind_enabled: true, auto_bind_outcome: AMBIGUOUS } + to: S04 + emit: + note: "存在多个候选节点,无法自动绑定" + - when: { auto_bind_enabled: true, auto_bind_outcome: KEY_MISSING } + to: S04 + emit: + note: "缺少业务键字段,无法自动绑定" + - when: { auto_bind_enabled: true, auto_bind_outcome: KEY_ID_RESOLVE_FAIL } + to: S05 + emit: + note: "业务键中的ID字段解析失败" + - when: { auto_bind_enabled: true, auto_bind_outcome: ZERO, create_enabled: true } + to: S13 + emit: + spawn_request: true + spawn_target_node_state: S06 + note: "自动绑定识别为需创建,进入创建提交中间态" + - when: { auto_bind_enabled: true, auto_bind_outcome: ZERO, create_enabled: false } + to: S04 + emit: + note: "未匹配到候选节点且不允许创建" + + # --- Create prepare --- + E20: + stage: create_prepare + desc: "创建准备阶段2:spawn 成功则提交到 NORMAL;失败保持等待态(不迁移)" + from: [S13] + outcomes: + - when: { spawn_success: true } + to: S01 + emit: + note: "创建副作用提交成功" + + E21: + stage: create_prepare + desc: "创建依赖解析失败→DEPENDENCY_ERROR" + from: [S02] + outcomes: + - when: { create_enabled: true, data_present: true, create_id_resolve_ok: false } + to: S05 + emit: + note: "创建前依赖ID解析失败" + + E22: + stage: create_prepare + desc: "孤儿自删准备:从 MISSING 进入 DELETE 执行入口" + from: [S02] + outcomes: + - when: {} + to: S09 + emit: + note: "孤儿节点按策略进入自删" + + # --- Update prepare (target-side) --- + E30: + stage: update_prepare + desc: "更新准备:缺data_id/依赖未解析→PRECONDITION_FAILED;有差异→UPDATE" + from: [S01] + outcomes: + - when: { update_enabled: true, target_has_data_id: false } + to: S08 + emit: + note: "目标节点缺少data_id" + - when: { update_enabled: true, target_has_data_id: true, update_id_resolve_ok: false } + to: S08 + emit: + note: "更新前依赖ID未解析" + - when: { update_enabled: true, target_has_data_id: true, update_id_resolve_ok: true, has_diff: true } + to: S07 + emit: + note: "检测到数据差异,准备更新" + + # --- Post-create normalization --- + E41: + stage: post_create_ready + desc: "创建成功后归并到 update 起点" + from: [S11C] + outcomes: + - when: { execute_action: CREATE } + to: S01 + emit: + note: "创建成功后转入更新起点" + + # --- Sync execute (split by action) --- + E40C_START: + stage: sync_execute + desc: "CREATE 执行入口:进入异步执行中" + from: [S06] + outcomes: + - when: { handler_result: IN_PROGRESS } + to: S10C + emit: + note: "CREATE 进入异步执行中" + + E40C: + stage: sync_execute + desc: "CREATE 执行结果回写:进行中/成功/失败" + from: [S10C] + outcomes: + - when: { handler_result: SUCCESS } + to: S11C + emit: + note: "CREATE 执行成功" + - when: { handler_result: FAILED } + to: S12C + emit: + note: "CREATE 执行失败" + + E40U_START: + stage: sync_execute + desc: "UPDATE 执行入口:进入异步执行中" + from: [S07] + outcomes: + - when: { handler_result: IN_PROGRESS } + to: S10U + emit: + note: "UPDATE 进入异步执行中" + + E40U: + stage: sync_execute + desc: "UPDATE 执行结果回写:进行中/成功/失败/跳过" + from: [S10U] + outcomes: + - when: { handler_result: SUCCESS } + to: S11U + emit: + note: "UPDATE 执行成功" + - when: { handler_result: FAILED } + to: S12U + emit: + note: "UPDATE 执行失败" + - when: { handler_result: SKIPPED } + to: S14 + emit: + note: "更新降级并跳过" + + E40D_START: + stage: sync_execute + desc: "DELETE 执行入口:进入异步执行中" + from: [S09] + outcomes: + - when: { handler_result: IN_PROGRESS } + to: S10D + emit: + note: "DELETE 进入异步执行中" + + E40D: + stage: sync_execute + desc: "DELETE 执行结果回写:进行中/成功/失败" + from: [S10D] + outcomes: + - when: { handler_result: SUCCESS } + to: S11D + emit: + note: "DELETE 执行成功" + delete_node: true + - when: { handler_result: FAILED } + to: S12D + emit: + note: "DELETE 执行失败" + +invariants: + INV-1_UNCHECKED_ACTION_NONE: + desc: "UNCHECKED 不允许有动作" + when: { binding_status: UNCHECKED } + require: { action: NONE } + + INV-2_BLOCKING_NO_ACTION: + desc: "阻断态不允许执行动作" + when_any: + - { binding_status: ABNORMAL } + - { binding_status: WARNING } + - { binding_status: DEPENDENCY_ERROR } + require: { action: NONE } + + INV-3_PRECOND_IMPLIES_UPDATE: + desc: "PRECONDITION_FAILED 必须伴随 action=UPDATE" + when: { status: PRECONDITION_FAILED } + require: { action: UPDATE } diff --git a/sync_state_machine/config/persist_config.py b/sync_state_machine/config/persist_config.py new file mode 100644 index 0000000..ef374ec --- /dev/null +++ b/sync_state_machine/config/persist_config.py @@ -0,0 +1,13 @@ +from typing import Any, Dict, Literal + +from pydantic import BaseModel, ConfigDict, Field + + +class PersistConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + backend: Literal["sqlite", "sqlalchemy", "custom"] = "sqlite" + db_path: str + backend_options: Dict[str, Any] = Field(default_factory=dict) + enable: bool = True + wipe_on_start: bool = False diff --git a/sync_state_machine/config/pipeline_config.py b/sync_state_machine/config/pipeline_config.py new file mode 100644 index 0000000..9542ab7 --- /dev/null +++ b/sync_state_machine/config/pipeline_config.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from typing import List + +from pydantic import BaseModel, ConfigDict, Field + +from .datasource_config import DataSourceConfig +from .logging_config import LoggingConfig +from .persist_config import PersistConfig +from .strategy_config import StrategyRuntimeConfig + + +DEFAULT_NODE_TYPES: List[str] = [ + "company", + "supplier", + "user", + "project", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "lar_change", + "project_detail_data", + "units", +] + + +class PipelineRunConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + node_types: List[str] = Field(default_factory=lambda: list(DEFAULT_NODE_TYPES)) + target_project_ids: List[str] = Field(default_factory=list) + + local_datasource: DataSourceConfig + remote_datasource: DataSourceConfig + + strategies: List[StrategyRuntimeConfig] = Field(default_factory=list) + persist: PersistConfig + logging: LoggingConfig = Field(default_factory=LoggingConfig) diff --git a/sync_state_machine/config/run_presets.py b/sync_state_machine/config/run_presets.py new file mode 100644 index 0000000..264a007 --- /dev/null +++ b/sync_state_machine/config/run_presets.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any, Dict, List, Tuple + +PRESET_FILES: Dict[str, str] = { + "jsonl_sm": "jsonl_to_jsonl", + "simple_sm": "jsonl_to_api", +} + + +def _run_profiles_dir() -> Path: + return Path(__file__).resolve().parents[2] / "run_profiles" + + +def _preset_templates_dir() -> Path: + return _run_profiles_dir() / "preset" + + +def _replace_placeholders(value: Any, project_root: Path) -> Any: + if isinstance(value, str): + return value.replace("${PROJECT_ROOT}", str(project_root)) + if isinstance(value, dict): + return {k: _replace_placeholders(v, project_root) for k, v in value.items()} + if isinstance(value, list): + return [_replace_placeholders(v, project_root) for v in value] + return value + + +def list_preset_names() -> List[str]: + return sorted(PRESET_FILES.keys()) + + +def get_preset_file_candidates(preset_name: str) -> List[Path]: + if preset_name not in PRESET_FILES: + raise ValueError(f"Unknown preset: {preset_name}. Available: {list_preset_names()}") + + base = PRESET_FILES[preset_name] + run_profiles_root = _run_profiles_dir() + preset_templates_root = _preset_templates_dir() + return [ + run_profiles_root / f"{base}.local.yaml", + run_profiles_root / f"{base}.local.yml", + run_profiles_root / f"{base}.local.json", + preset_templates_root / f"{base}.default.yaml", + preset_templates_root / f"{base}.default.yml", + preset_templates_root / f"{base}.default.json", + ] + + +def resolve_preset_file(preset_name: str) -> Tuple[Path, bool]: + candidates = get_preset_file_candidates(preset_name) + for idx, path in enumerate(candidates): + if path.exists() and path.is_file(): + return path, idx > 0 + raise FileNotFoundError( + f"No preset file found for {preset_name}. Tried: {[str(p) for p in candidates]}" + ) + + +def load_overrides_from_file(file_path: Path, project_root: Path) -> Dict[str, Any]: + suffix = file_path.suffix.lower() + text = file_path.read_text(encoding="utf-8") + + if suffix in {".yaml", ".yml"}: + try: + import yaml # type: ignore + except Exception as exc: + raise RuntimeError( + "YAML config requires PyYAML. Install with: pip install pyyaml" + ) from exc + payload = yaml.safe_load(text) + else: + payload = json.loads(text) + + resolved = _replace_placeholders(payload, project_root) + if not isinstance(resolved, dict): + raise ValueError(f"Preset file must contain object mapping: {file_path}") + return resolved + + +def load_named_preset_overrides(project_root: Path, preset_name: str) -> Tuple[Dict[str, Any], Path, bool]: + file_path, used_default = resolve_preset_file(preset_name) + overrides = load_overrides_from_file(file_path, project_root) + return overrides, file_path, used_default diff --git a/sync_state_machine/config/runtime_config.py b/sync_state_machine/config/runtime_config.py new file mode 100644 index 0000000..63797c4 --- /dev/null +++ b/sync_state_machine/config/runtime_config.py @@ -0,0 +1,43 @@ +"""Compatibility layer for legacy imports. + +Prefer importing from `sync_state_machine.config` directly. +""" + +from .datasource_config import ApiDataSourceConfig, JsonlDataSourceConfig, DataSourceConfig +from .persist_config import PersistConfig +from .logging_config import LoggingConfig +from .strategy_config import ( + OrphanAction, + UpdateDirection, + StrategyConfig, + StrategyRuntimeConfig, + ConfigPresets, +) +from .pipeline_config import PipelineRunConfig, DEFAULT_NODE_TYPES +from .builder import ( + build_default_config, + build_config, + apply_config_overrides, + apply_env_overrides, + config_snapshot, +) + +__all__ = [ + "ApiDataSourceConfig", + "JsonlDataSourceConfig", + "DataSourceConfig", + "PersistConfig", + "LoggingConfig", + "OrphanAction", + "UpdateDirection", + "StrategyConfig", + "StrategyRuntimeConfig", + "ConfigPresets", + "PipelineRunConfig", + "DEFAULT_NODE_TYPES", + "build_default_config", + "build_config", + "apply_config_overrides", + "apply_env_overrides", + "config_snapshot", +] diff --git a/sync_state_machine/config/strategy_config.py b/sync_state_machine/config/strategy_config.py new file mode 100644 index 0000000..0d7de0a --- /dev/null +++ b/sync_state_machine/config/strategy_config.py @@ -0,0 +1,113 @@ +from __future__ import annotations + +from enum import Enum +from typing import Dict, List, Optional + +from pydantic import BaseModel, ConfigDict, Field + + +class OrphanAction(str, Enum): + CREATE_REMOTE = "create_remote" + CREATE_LOCAL = "create_local" + DELETE_LOCAL = "delete_local" + DELETE_REMOTE = "delete_remote" + NONE = "none" + + +class UpdateDirection(str, Enum): + PUSH = "push" + PULL = "pull" + BIDIRECTIONAL = "bidirectional" + NONE = "none" + + +class PreBindDataIdPair(BaseModel): + model_config = ConfigDict(validate_assignment=True, extra="forbid") + + local_data_id: str + remote_data_id: str + + +class StrategyConfig(BaseModel): + model_config = ConfigDict(validate_assignment=True, extra="forbid") + + auto_bind: bool = True + auto_bind_fields: List[str] = Field(default_factory=list) + pre_bind_data_id: List[PreBindDataIdPair] = Field(default_factory=list) + depend_fields: Dict[str, str] = Field(default_factory=dict) + + local_orphan_action: OrphanAction = OrphanAction.NONE + remote_orphan_action: OrphanAction = OrphanAction.NONE + update_direction: UpdateDirection = UpdateDirection.PUSH + + # 字段级同步方向覆盖。 + # field_direction_key: 节点 data 中用作查表键的字段名,如 "key"。 + # field_direction_overrides: 字段值 → UpdateDirection 的映射。 + # 未命中映射的节点沿用 update_direction 作为默认方向。 + field_direction_key: Optional[str] = None + field_direction_overrides: Dict[str, UpdateDirection] = Field(default_factory=dict) + + # post-check 一致性比较时,忽略列表型字段内各元素的特定子键。 + # 格式: {字段名: [子键, ...]},如 {"plan_node": ["is_audit"]}。 + # 用于排除后端硬写死、永远与本地不一致的字段,避免误报。 + post_check_ignore_list_item_fields: Dict[str, List[str]] = Field(default_factory=dict) + + +class StrategyRuntimeConfig(BaseModel): + """Pipeline 层策略运行配置(按 node_type)。""" + + model_config = ConfigDict(validate_assignment=True, extra="forbid") + + node_type: str + config: StrategyConfig = Field(default_factory=StrategyConfig) + + +class ConfigPresets: + @staticmethod + def first_sync() -> StrategyConfig: + return StrategyConfig( + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.CREATE_LOCAL, + update_direction=UpdateDirection.PUSH, + ) + + @staticmethod + def daily_sync() -> StrategyConfig: + return ConfigPresets.push_only() + + @staticmethod + def repair_sync() -> StrategyConfig: + return StrategyConfig( + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.NONE, + ) + + @staticmethod + def pull_only() -> StrategyConfig: + return StrategyConfig( + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.CREATE_LOCAL, + update_direction=UpdateDirection.PULL, + ) + + @staticmethod + def push_only() -> StrategyConfig: + return StrategyConfig( + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + @staticmethod + def get_preset(name: str) -> StrategyConfig: + presets = { + "first_sync": ConfigPresets.first_sync, + "daily_sync": ConfigPresets.daily_sync, + "repair_sync": ConfigPresets.repair_sync, + "pull_only": ConfigPresets.pull_only, + "push_only": ConfigPresets.push_only, + } + if name not in presets: + raise ValueError(f"Unknown preset: {name}. Available: {list(presets.keys())}") + return presets[name]() diff --git a/sync_state_machine/datasource/README.md b/sync_state_machine/datasource/README.md new file mode 100644 index 0000000..3c44b47 --- /dev/null +++ b/sync_state_machine/datasource/README.md @@ -0,0 +1,252 @@ +# DataSource Layer Implementation + +## Overview + +This document describes the new datasource layer for `sync_system_new`, which is completely decoupled from the sync strategy and state machine logic. + +## Architecture + +The datasource layer follows a pure execution model: + +1. **Load**: Reads data from backend and creates `SyncNode` instances +2. **Save**: Executes actions (CREATE/UPDATE/DELETE) based on `node.action` +3. **Update Status**: Sets `node.status` to SUCCESS or FAILED after execution + +### Key Principles + +- **No Strategy Logic**: Datasource doesn't make decisions about what to sync +- **State-Driven**: Only reads `node.action` and `node.status` to determine behavior +- **No ID Resolution**: IDs are already resolved by the strategy layer +- **Backend Agnostic**: Abstract base class supports multiple backends + +## Components + +### 1. Base Protocol (`base.py`) + +#### `DataSourceProtocol` + +Protocol defining the interface for all datasource implementations: + +```python +async def load_nodes( + node_type: str, + collection: DataCollection, + **filters: Any +) -> None: + """Load data from backend and create SyncNodes""" + +async def save_nodes( + node_type: str, + collection: DataCollection +) -> None: + """Execute pending actions for nodes""" +``` + +#### `BaseDataSource` + +Abstract base class providing common functionality: + +- `load_nodes`: Creates SyncNodes from raw data +- `save_nodes`: Executes actions and updates status +- `_handle_create/update/delete`: Action-specific handlers + +Subclasses implement: +- `_load_raw_data`: Load from backend +- `_create_item`: Execute CREATE +- `_update_item`: Execute UPDATE +- `_delete_item`: Execute DELETE +- `_generate_id`: Generate new IDs + +### 2. JSONL Implementation (`jsonl_datasource.py`) + +#### `JsonlDataSource` + +JSONL-based datasource for local testing: + +**Features:** +- Loads `.jsonl` files into memory +- Generates UUIDs for new items +- Supports filtering during load +- Supports read-only mode +- Persists changes back to files + +**File Structure:** +``` +data/ + ├── contract_1.jsonl + ├── project_1.jsonl + └── ... +``` + +**Usage:** +```python +datasource = JsonlDataSource(Path("data/")) + +# Load nodes +await datasource.load_nodes("contract", collection, project_id="P1") + +# Execute actions +await datasource.save_nodes("contract", collection) + +# Persist to disk +await datasource.save_all() +``` + +### 3. Domain Handlers + +Domain-specific handlers provide business logic (optional): + +**Example: `domain/contract/jsonl_handler.py`** + +```python +class ContractJsonlHandler: + @staticmethod + def validate_create(data: Any) -> None: + """Validate before create""" + + @staticmethod + def transform_for_create(data: Any) -> Dict[str, Any]: + """Transform data before create""" +``` + +## Node Lifecycle + +### Loading Phase + +1. Datasource reads raw data from backend +2. Creates `SyncNode` for each item: + - `node_id`: Unique session ID (e.g., "contract_C1") + - `data_id`: Backend ID (e.g., "C1") + - `origin_data`: Raw data from backend + - `data`: Copy of origin_data (may be modified by strategy) + - `action`: NONE (initial) + - `status`: PENDING (initial) + +### Execution Phase + +For each node with `status == PENDING` and `action != NONE`: + +1. **CREATE**: + - Generate new ID via `_generate_id` + - Call `_create_item` with new ID and data + - Set `node.data_id` to new ID + - Set `node.status` to SUCCESS + +2. **UPDATE**: + - Call `_update_item` with existing `data_id` and data + - Set `node.status` to SUCCESS + +3. **DELETE**: + - Call `_delete_item` with `data_id` + - Set `node.status` to SUCCESS + +4. **Error Handling**: + - On exception: Set `node.status` to FAILED + - Set `node.error` to exception message + +## Integration with Sync System + +The datasource is used by the pipeline layer: + +```python +# 1. Load data +local_ds = JsonlDataSource(Path("local_data/")) +remote_ds = JsonlDataSource(Path("remote_data/")) + +local_collection = DataCollection("local") +remote_collection = DataCollection("remote") + +await local_ds.load_nodes("contract", local_collection) +await remote_ds.load_nodes("contract", remote_collection) + +# 2. Strategy layer determines actions +strategy = ContractSyncStrategy(...) +await strategy.bind(...) # Sets node.action + +# 3. Execute actions +await remote_ds.save_nodes("contract", remote_collection) +await remote_ds.save_all() +``` + +## Testing + +Comprehensive test suite in `tests/test_datasource.py`: + +- Basic loading and node creation +- Filtering during load +- CREATE/UPDATE/DELETE actions +- Error handling and status updates +- Read-only mode +- Multiple node types + +Run tests: +```bash +python -m pytest sync_system_new/tests/test_datasource.py -v +``` + +## Future Extensions + +### API DataSource + +For production use, implement `ApiDataSource`: + +```python +class ApiDataSource(BaseDataSource): + async def _load_raw_data(self, node_type: str, **filters): + # Call REST API + + async def _create_item(self, node_type: str, item_id: str, data): + # POST request + + async def _generate_id(self, node_type: str, data): + # Return None - server generates ID +``` + +### Database DataSource + +For SQL databases: + +```python +class DatabaseDataSource(BaseDataSource): + async def _load_raw_data(self, node_type: str, **filters): + # SELECT query + + async def _create_item(self, node_type: str, item_id: str, data): + # INSERT query +``` + +## Comparison with Legacy System + +### Legacy System (`sync_system/datasource/`) + +- Tightly coupled with RepositoryProtocol +- Mixed concerns (data access + business logic) +- Schema validation in datasource layer +- Different interface for each entity type + +### New System (`sync_system_new/datasource/`) + +- Decoupled from strategy and state machine +- Pure data access (business logic in domain handlers) +- Generic interface for all entity types +- Direct integration with SyncNode and DataCollection + +## Key Differences + +| Aspect | Legacy | New | +|--------|--------|-----| +| Coupling | Tight with sync policies | Decoupled from sync logic | +| Interface | Repository per entity | Generic load/save | +| ID Handling | Mixed responsibilities | IDs already resolved | +| State Management | Mixed with data access | SyncNode-based | +| Testing | Complex setup | Simple, focused tests | + +## Conclusion + +The new datasource layer provides: + +1. **Clear Separation**: Data access is isolated from sync logic +2. **Flexibility**: Easy to add new backend types +3. **Testability**: Simple, focused tests +4. **Type Safety**: Full integration with Pydantic models +5. **Maintainability**: Single responsibility per component diff --git a/sync_state_machine/datasource/__init__.py b/sync_state_machine/datasource/__init__.py new file mode 100644 index 0000000..9432b6e --- /dev/null +++ b/sync_state_machine/datasource/__init__.py @@ -0,0 +1,41 @@ +""" +DataSource Layer for sync_state_machine + +DataSource 只负责底层 I/O,不关心节点类型。 +Handler 负责类型转换和业务逻辑。 +""" + +from .datasource import BaseDataSource +from .handler import ( + NodeHandler, + BaseNodeHandler, + NodeHandlerRegistry, + ValidationResult +) +from .task_result import TaskResult, TaskStatus + +# API DataSource +from .api import ApiClient, ApiDataSource, BaseApiHandler + +# JSONL DataSource +from .jsonl import JsonlDataSource, BaseJsonlHandler + +__all__ = [ + # 基础类 + "BaseDataSource", + "NodeHandler", + "BaseNodeHandler", + "NodeHandlerRegistry", + "TaskResult", + "TaskStatus", + "ValidationResult", + + # API DataSource + "ApiClient", + "ApiDataSource", + "BaseApiHandler", + + # JSONL DataSource + "JsonlDataSource", + "BaseJsonlHandler", +] diff --git a/sync_state_machine/datasource/api/__init__.py b/sync_state_machine/datasource/api/__init__.py new file mode 100644 index 0000000..0d4f037 --- /dev/null +++ b/sync_state_machine/datasource/api/__init__.py @@ -0,0 +1,15 @@ +""" +API DataSource 模块 + +提供基于 HTTP API 的数据源实现。 +""" + +from .client import ApiClient +from .datasource import ApiDataSource +from .handler import BaseApiHandler + +__all__ = [ + "ApiClient", + "ApiDataSource", + "BaseApiHandler", +] diff --git a/sync_state_machine/datasource/api/client.py b/sync_state_machine/datasource/api/client.py new file mode 100644 index 0000000..0425c0e --- /dev/null +++ b/sync_state_machine/datasource/api/client.py @@ -0,0 +1,627 @@ +""" +ApiClient - HTTP 通信层 + +职责: +- 封装所有 HTTP 通信逻辑 +- 管理 httpx.AsyncClient,维护连接池和 session +- 生成请求签名(timestamp, nonce, sign) +- 统一请求入口,自动注入 uid +- 批量 Push Log 查询 +""" + +import hashlib +import hmac +import time +import uuid +import json as json_lib +import logging +import asyncio +from typing import Dict, List, Any, Optional +from collections import defaultdict, deque +from pathlib import Path +from datetime import datetime +import httpx + +from schemas.common.push_system import PushIdsSchema + + +def _build_default_push_steps() -> List[Dict[str, str]]: + """构造最小审批步骤字段,满足第三方 v2 push schema。""" + return [] + + +class ApiClient: + """API HTTP 客户端""" + _TRACE_TEXT_MAX_LEN = 1000 + + def __init__( + self, + base_url: str, + uid: str, + secret: str, + debug: bool = False, + log_file: Optional[Path] = None, + rate_limit_max_requests: int = 30, + rate_limit_window_seconds: float = 10.0, + ): + """ + 初始化 API 客户端 + + Args: + base_url: API 基础 URL(如 https://api.example.com) + uid: 用户标识 + secret: 签名密钥 + debug: 是否启用调试模式(打印请求详情) + log_file: 日志文件路径(可选) + rate_limit_max_requests: 限流窗口内最大请求数(<=0 表示禁用) + rate_limit_window_seconds: 限流窗口秒数(<=0 表示禁用) + """ + self._base_url = base_url.rstrip('/') + self._uid = uid + self._secret = secret + self._client: Optional[httpx.AsyncClient] = None + self._debug = debug + self._log_file = log_file + self._trace_seq = 0 + self._trace_by_push_id: Dict[str, deque[Dict[str, Any]]] = defaultdict(deque) + self._trace_by_biz_id: Dict[str, deque[Dict[str, Any]]] = defaultdict(deque) + self._trace_by_op: Dict[str, deque[Dict[str, Any]]] = defaultdict(deque) + self._load_trace_by_item: Dict[tuple[str, str], deque[Dict[str, Any]]] = defaultdict(deque) + self._logger = logging.getLogger(__name__) + self._rate_limit_max_requests = int(rate_limit_max_requests) + self._rate_limit_window_seconds = float(rate_limit_window_seconds) + self._rate_limit_lock = asyncio.Lock() + self._rate_limit_timestamps: deque[float] = deque() + + def _is_rate_limit_enabled(self) -> bool: + return self._rate_limit_max_requests > 0 and self._rate_limit_window_seconds > 0 + + async def _acquire_rate_limit_slot(self) -> None: + if not self._is_rate_limit_enabled(): + return + + while True: + wait_seconds = 0.0 + async with self._rate_limit_lock: + now = time.monotonic() + window_start = now - self._rate_limit_window_seconds + while self._rate_limit_timestamps and self._rate_limit_timestamps[0] <= window_start: + self._rate_limit_timestamps.popleft() + + if len(self._rate_limit_timestamps) < self._rate_limit_max_requests: + self._rate_limit_timestamps.append(now) + return + + oldest = self._rate_limit_timestamps[0] + wait_seconds = max(0.001, self._rate_limit_window_seconds - (now - oldest)) + + await asyncio.sleep(wait_seconds) + + async def initialize(self): + """初始化 HTTP 客户端""" + if self._client is None: + # trust_env=False 阻止从环境变量读取代理设置(避免 localhost 走代理导致超时) + self._client = httpx.AsyncClient(timeout=300.0, trust_env=False) + + async def close(self): + """关闭 HTTP 客户端""" + if self._client: + await self._client.aclose() + self._client = None + + def _log(self, message: str, level: str = "DEBUG"): + """ + 统一日志输出 + + Args: + message: 日志消息 + level: 日志级别(INFO/ERROR) + """ + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + log_line = f"[{timestamp}] [{level}] {message}" + + level_num = logging.getLevelNamesMapping().get(level.upper(), logging.DEBUG) + self._logger.log(level_num, log_line) + + # 文件输出 + if self._log_file: + self._log_file.parent.mkdir(parents=True, exist_ok=True) + with open(self._log_file, 'a', encoding='utf-8') as f: + f.write(log_line + '\n') + + def _get_client(self) -> httpx.AsyncClient: + """获取 HTTP 客户端实例""" + if self._client is None: + raise RuntimeError("ApiClient not initialized. Call 'await client.initialize()' first.") + return self._client + + def _derive_op_kind(self, method: str, endpoint: str) -> str: + endpoint_norm = endpoint.lower().strip() + if endpoint_norm == "/push/result": + return "poll" + method_upper = method.upper() + if method_upper == "GET": + if endpoint_norm.endswith("/list"): + return "load" + return "get" + if endpoint_norm.endswith("/create"): + return "create" + if endpoint_norm.endswith("/delete"): + return "delete" + if endpoint_norm.endswith("/update") or endpoint_norm.endswith("/plan"): + return "update" + if method_upper == "POST": + return "create" + if method_upper == "PUT": + return "update" + if method_upper == "DELETE": + return "delete" + return method.lower() + + def _derive_node_type_from_list_endpoint(self, endpoint: str) -> Optional[str]: + endpoint_norm = endpoint.strip("/") + if not endpoint_norm.endswith("/list"): + return None + prefix = endpoint_norm[:-5] + if not prefix: + return None + return prefix.replace("/", "_") + + def _record_trace( + self, + *, + method: str, + endpoint: str, + url: str, + request_params: Optional[Dict[str, Any]], + request_payload: Optional[Dict[str, Any]], + response: Optional[Dict[str, Any]], + elapsed_ms: int, + ) -> None: + self._trace_seq += 1 + op_kind = self._derive_op_kind(method, endpoint) + payload = request_payload or {} + response_view = self._build_trace_response_view(op_kind=op_kind, response=response) + params_text = self._to_trace_text(request_params or {}, max_len=self._TRACE_TEXT_MAX_LEN) + payload_text = self._to_trace_text(payload, max_len=self._TRACE_TEXT_MAX_LEN) + response_text = self._to_trace_text(response_view, max_len=self._TRACE_TEXT_MAX_LEN) + + trace = { + "trace_id": self._trace_seq, + "op": op_kind, + "method": method.upper(), + "endpoint": endpoint, + "url": url, + "params": request_params or {}, + "payload": payload, + "response": response_view, + "params_text": params_text, + "payload_text": payload_text, + "response_text": response_text, + "elapsed_ms": elapsed_ms, + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + } + + push_id = payload.get("push_id") + biz_id = payload.get("biz_id") + if isinstance(push_id, str) and push_id: + self._trace_by_push_id[push_id].append(trace) + if isinstance(biz_id, str) and biz_id: + self._trace_by_biz_id[biz_id].append(trace) + self._trace_by_op[op_kind].append(trace) + + if op_kind == "load": + node_type = self._derive_node_type_from_list_endpoint(endpoint) + data = (response or {}).get("data") if isinstance(response, dict) else None + if isinstance(data, list): + items = data + elif isinstance(data, dict): + items = data.get("list", []) + else: + items = [] + if node_type and isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + item_id = item.get("id") or item.get("_id") + if not item_id: + continue + self._load_trace_by_item[(node_type, str(item_id))].append(trace) + + def _to_trace_text(self, value: Any, *, max_len: int) -> str: + try: + text = json_lib.dumps(value, ensure_ascii=False, separators=(",", ":")) + except Exception: + text = str(value) + if len(text) > max_len: + return f"{text[:max_len]}...(已截断)" + return text + + def _build_trace_response_view(self, *, op_kind: str, response: Optional[Dict[str, Any]]) -> Any: + return response or {} + + def consume_traces_by_push_id(self, push_id: str) -> List[Dict[str, Any]]: + if not push_id: + return [] + bucket = self._trace_by_push_id.get(push_id) + if not bucket: + return [] + traces = list(bucket) + bucket.clear() + return traces + + def consume_latest_trace_by_biz_id(self, biz_id: str, op_kind: Optional[str] = None) -> Optional[Dict[str, Any]]: + if not biz_id: + return None + bucket = self._trace_by_biz_id.get(biz_id) + if not bucket: + return None + if op_kind is None: + return bucket.pop() if bucket else None + for index in range(len(bucket) - 1, -1, -1): + trace = bucket[index] + if trace.get("op") == op_kind: + del bucket[index] + return trace + return None + + def peek_latest_trace_by_biz_id(self, biz_id: str, op_kind: Optional[str] = None) -> Optional[Dict[str, Any]]: + if not biz_id: + return None + bucket = self._trace_by_biz_id.get(biz_id) + if not bucket: + return None + if op_kind is None: + return bucket[-1] if bucket else None + for index in range(len(bucket) - 1, -1, -1): + trace = bucket[index] + if trace.get("op") == op_kind: + return trace + return None + + def consume_latest_trace_by_op(self, op_kind: str) -> Optional[Dict[str, Any]]: + bucket = self._trace_by_op.get(op_kind) + if not bucket: + return None + return bucket.pop() if bucket else None + + def peek_latest_trace_by_op(self, op_kind: str) -> Optional[Dict[str, Any]]: + bucket = self._trace_by_op.get(op_kind) + if not bucket: + return None + return bucket[-1] if bucket else None + + def consume_load_traces(self, node_type: str, data_id: str) -> List[Dict[str, Any]]: + key = (node_type, data_id) + bucket = self._load_trace_by_item.get(key) + if not bucket: + return [] + traces = list(bucket) + bucket.clear() + return traces + + def _generate_signature(self, params: Dict[str, Any]) -> Dict[str, str]: + """ + 生成签名参数(兼容旧版签名算法) + + Args: + params: 请求参数 + + Returns: + 包含 timestamp, nonce, sign 的字典 + """ + timestamp = int(time.time() * 1000) # 毫秒时间戳 + nonce = uuid.uuid4().hex[:16] # 16位随机字符串 + + # 构建签名参数 + sign_params = params.copy() + sign_params['timestamp'] = timestamp + sign_params['nonce'] = nonce + + # 按key排序 + sorted_items = sorted(sign_params.items()) + + # 构建签名字符串 + items = [] + for k, v in sorted_items: + if v is None: + v_str = "null" + elif isinstance(v, bool): + v_str = "true" if v else "false" + elif isinstance(v, str): + v_str = v + elif isinstance(v, (int, float)): + v_str = str(v) + elif isinstance(v, (list, dict)): + v_str = json_lib.dumps(v, sort_keys=True, separators=(",", ":"), ensure_ascii=False) + else: + v_str = str(v) + items.append(f"{k}={v_str}") + + sign_str = "&".join(items) + + # 使用 HMAC-SHA256 生成签名 + sign = hmac.new(self._secret.encode("utf-8"), sign_str.encode("utf-8"), hashlib.sha256).hexdigest() + + return { + 'timestamp': str(timestamp), + 'nonce': nonce, + 'sign': sign + } + + async def request( + self, + method: str, + endpoint: str, + params: Optional[Dict[str, Any]] = None, + data: Optional[Dict[str, Any]] = None, + json_data: Optional[Dict[str, Any]] = None, + json: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + """ + 统一请求入口,自动签名 + + Args: + method: HTTP 方法(GET/POST/PUT/DELETE) + endpoint: API 端点(如 /api/v2/project) + params: URL 查询参数 + data: 请求体数据(form data) + json_data: JSON 请求体数据 + json: JSON 请求体数据(兼容参数) + + Returns: + 响应 JSON 数据 + + Raises: + httpx.HTTPStatusError: HTTP 错误 + """ + # 兼容json参数 + if json is not None and json_data is None: + json_data = json + + client = self._get_client() + url = f"{self._base_url}{endpoint}" + await self._acquire_rate_limit_slot() + + # 记录请求信息 + self._log(f"\n{'='*60}", level="DEBUG") + self._log(f"REQUEST: {method} {endpoint}", level="DEBUG") + self._log(f"Full URL: {url}", level="DEBUG") + if params: + self._log(f"Params: {json_lib.dumps(params, ensure_ascii=False, indent=2)}", level="DEBUG") + if data: + self._log(f"Data: {json_lib.dumps(data, ensure_ascii=False, indent=2)}", level="DEBUG") + if json_data: + self._log(f"JSON: {json_lib.dumps(json_data, ensure_ascii=False, indent=2)}", level="DEBUG") + + # 准备签名参数 + if method.upper() == 'GET': + # GET 请求:uid 放在 params 中 + if params is None: + params = {} + params['uid'] = self._uid + + # 转换所有参数值为字符串(除了 list/dict) + params = {k: str(v) if not isinstance(v, (list, dict)) else v for k, v in params.items()} + + sign_params = params.copy() + # 生成签名并附加到 params + signature = self._generate_signature(sign_params) + params.update(signature) + else: + # POST/PUT/DELETE:uid 和签名放在 body 中(符合 v2 schema) + if data is None: + data = {} + if 'steps' not in data: + data['steps'] = _build_default_push_steps() + data['uid'] = self._uid + sign_params = data.copy() + if params: + sign_params.update(params) + signature = self._generate_signature(sign_params) + data.update(signature) + + # 发送请求并增强异常处理 + start_time = time.time() + try: + response = await client.request( + method=method, + url=url, + params=params, + json=data if method.upper() in ['POST', 'PUT'] else None + ) + + # 记录响应时间 + elapsed = time.time() - start_time + self._log(f"Response Time: {elapsed:.3f}s", level="DEBUG") + + # 检查 HTTP 状态 + response.raise_for_status() + + # 记录响应 + result = response.json() + self._log(f"Status Code: {response.status_code}", level="DEBUG") + self._log(f"Response: {json_lib.dumps(result, ensure_ascii=False, indent=2)}", level="DEBUG") + self._log(f"{'='*60}\n", level="DEBUG") + + self._record_trace( + method=method, + endpoint=endpoint, + url=url, + request_params=params, + request_payload=data if method.upper() in ['POST', 'PUT', 'DELETE'] else None, + response=result, + elapsed_ms=int(elapsed * 1000), + ) + + return result + + except Exception as e: + import traceback + + # 记录错误 + elapsed = time.time() - start_time + error_msg = "\n========== [ApiClient HTTP Error] ==========\n" + error_msg += f"Request: {method} {url}\n" + error_msg += f"Params: {params}\n" + if method.upper() in ['POST', 'PUT']: + error_msg += f"JSON: {data}\n" + error_msg += f"Exception: {type(e).__name__}: {e}\n" + error_msg += f"Elapsed: {elapsed:.3f}s\n" + + response_obj = e.response if isinstance(e, httpx.HTTPStatusError) else None + if response_obj is not None: + error_msg += f"Status Code: {response_obj.status_code}\n" + error_msg += f"Response Headers: {response_obj.headers}\n" + try: + error_msg += f"Response Text: {response_obj.text}\n" + except Exception: + pass + + error_msg += traceback.format_exc() + error_msg += "============================================\n" + + # 记录到日志文件 + self._log(error_msg, level="ERROR") + + raise + + async def get(self, endpoint: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: + """ + GET 请求 + + Args: + endpoint: API 端点 + params: URL 查询参数 + + Returns: + 响应 JSON 数据 + """ + return await self.request('GET', endpoint, params=params) + + async def post(self, endpoint: str, data: Dict[str, Any]) -> Dict[str, Any]: + """ + POST 请求,data 中已包含 push_id/biz_id(由 Handler 生成) + + Args: + endpoint: API 端点 + data: 请求体数据(包含业务数据和 push_id/biz_id) + + Returns: + 响应 JSON 数据 + """ + return await self.request('POST', endpoint, data=data) + + async def put(self, endpoint: str, data: Dict[str, Any]) -> Dict[str, Any]: + """ + PUT 请求,data 中已包含 push_id/biz_id + + Args: + endpoint: API 端点 + data: 请求体数据 + + Returns: + 响应 JSON 数据 + """ + return await self.request('PUT', endpoint, data=data) + + async def delete(self, endpoint: str, data: Dict[str, Any]) -> Dict[str, Any]: + """ + DELETE 请求,data 中已包含 push_id/biz_id + + Args: + endpoint: API 端点 + data: 请求体数据 + + Returns: + 响应 JSON 数据 + """ + return await self.request('DELETE', endpoint, data=data) + + async def get_push_logs(self, push_ids: List[str]) -> Dict[str, Dict[str, Any]]: + """ + 批量查询 Push Log + + 注意:单个查询也传单元素列表 + 当前实现:用 for 循环模拟,后续等后端实现批量接口 + + Args: + push_ids: Push ID 列表 + + Returns: + {push_id: push_log_data} 的映射 + """ + result: Dict[str, Dict[str, Any]] = {} + + if not push_ids: + return result + + try: + payload = PushIdsSchema(push_ids=','.join(push_ids)).model_dump(exclude_none=True) + response = await self.request( + method='POST', + endpoint='/push/result', + data=payload + ) + except httpx.HTTPStatusError as e: + return {push_id: {'error': str(e)} for push_id in push_ids} + + data_list: List[Dict[str, Any]] = [] + if isinstance(response, dict): + raw_data = response.get('data') + if isinstance(raw_data, list): + data_list = [item for item in raw_data if isinstance(item, dict)] + elif isinstance(raw_data, dict): + data_list = [raw_data] + elif 'push_id' in response and 'status' in response: + data_list = [response] + + for item in data_list: + push_id = item.get('push_id') + if not push_id: + continue + + poll_trace = { + "trace_id": f"poll-{push_id}-{int(time.time() * 1000)}", + "op": "poll", + "method": "POST", + "endpoint": "/push/result", + "url": f"{self._base_url}/push/result", + "params": {}, + "payload": {"push_ids": push_id}, + "response": item, + "elapsed_ms": 0, + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + } + self._trace_by_push_id[push_id].append(poll_trace) + + status = (item.get('status') or '').lower() + error_msg = item.get('error') or '' + result_data = item.get('result') or {} + + if status == 'success': + # result_data 的结构是 {"code": 200, "message": "OK", "data": {"biz_id": "..."}} + # 需要提取 result_data["data"] 作为最终的 data + inner_data = result_data.get('data', {}) if isinstance(result_data, dict) else {} + result[push_id] = { + 'code': 200, + 'status': 'success', + 'data': inner_data + } + elif status in {'failed', 'not_find'}: + result[push_id] = { + 'code': 500, + 'status': 'failed', + 'message': error_msg or status or 'Unknown error', + 'error': error_msg or status or 'Unknown error' + } + else: + result[push_id] = { + 'status': status or 'processing' + } + + for push_id in push_ids: + if push_id not in result: + result[push_id] = {'status': 'processing'} + + return result diff --git a/sync_state_machine/datasource/api/datasource.py b/sync_state_machine/datasource/api/datasource.py new file mode 100644 index 0000000..3a43dee --- /dev/null +++ b/sync_state_machine/datasource/api/datasource.py @@ -0,0 +1,264 @@ +""" +ApiDataSource - API 数据源协调层 + +职责: +- 持有 ApiClient 实例,提供给 Handler 使用 +- 实现 DataSource 接口(load_all, sync_all) +- 协调多个 Handler 的执行顺序 +- 统一异常处理和日志记录 +""" + +import json +from typing import Optional +from pathlib import Path +from ..datasource import BaseDataSource +from ..handler import NodeHandler, ensure_handler_compat +from ..task_result import TaskResult +from .client import ApiClient + + +class ApiDataSource(BaseDataSource): + """基于 API 的数据源实现""" + _TRACE_MAX_PARAMS_LEN = 1000 + _TRACE_MAX_RESPONSE_LEN = 1000 + + def __init__( + self, + base_url: str, + uid: str, + secret: str, + poll_mode: str = "async", + debug: bool = False, + log_file: Optional[Path] = None, + poll_max_retries: int = 1, + poll_interval: float = 0.5, + rate_limit_max_requests: int = 30, + rate_limit_window_seconds: float = 10.0, + ): + """ + 初始化 API 数据源 + + Args: + base_url: API 基础 URL + uid: 用户标识 + secret: 签名密钥 + debug: 是否启用调试模式 + log_file: 日志文件路径(可选) + """ + super().__init__(poll_max_retries=poll_max_retries, poll_interval=poll_interval) + self.client = ApiClient( + base_url, + uid, + secret, + debug=debug, + log_file=log_file, + rate_limit_max_requests=rate_limit_max_requests, + rate_limit_window_seconds=rate_limit_window_seconds, + ) + self.poll_mode = poll_mode + + async def initialize(self): + """初始化数据源(初始化 HTTP 客户端)""" + await self.client.initialize() + + async def close(self): + """关闭数据源(关闭 HTTP 客户端)""" + await self.client.close() + + def register_handler(self, handler: NodeHandler) -> None: + """ + 注册业务 Handler + + Args: + handler: API Handler 实例 + """ + compatible_handler = ensure_handler_compat(handler) + compatible_handler.set_api_client(self.client) + compatible_handler.set_poll_mode(self.poll_mode) + + # 调用基类注册方法 + super().register_handler(compatible_handler) + + # 如果 collection 已设置,确保新 handler 拿到引用 + if self._collection is not None: + compatible_handler.set_collection(self._collection) # type: ignore[arg-type] + + @staticmethod + def _fmt_trace_value(value, max_len: int = 600) -> str: + try: + text = json.dumps(value, ensure_ascii=False, separators=(",", ":")) + except Exception: + text = str(value) + if len(text) > max_len: + return text[:max_len] + "..." + return text + + def _append_trace_log(self, node, trace: dict, *, stage: str) -> None: + method = str(trace.get("method", "")).upper() + endpoint = str(trace.get("endpoint", "")) + url = str(trace.get("url", "")) + params = trace.get("params_text") + if not isinstance(params, str): + params = self._fmt_trace_value(trace.get("params", {}), max_len=self._TRACE_MAX_PARAMS_LEN) + + payload = trace.get("payload_text") + if not isinstance(payload, str): + payload = self._fmt_trace_value(trace.get("payload", {}), max_len=self._TRACE_MAX_PARAMS_LEN) + + response = trace.get("response_text") + if not isinstance(response, str): + response = self._fmt_trace_value(trace.get("response", {}), max_len=self._TRACE_MAX_RESPONSE_LEN) + elapsed_ms = trace.get("elapsed_ms", 0) + + node.append_log(f"API链路[{stage}] {method} {endpoint}") + node.append_log(f" url={url}") + if params not in {"{}", "null"}: + node.append_log(f" params={params}") + if payload not in {"{}", "null"}: + node.append_log(f" payload={payload}") + node.append_log(f" response={response}") + node.append_log(f" elapsed_ms={elapsed_ms}") + + def _consume_and_append_push_traces(self, node, push_id: str, *, stage: str) -> int: + if not push_id: + return 0 + traces = self.client.consume_traces_by_push_id(push_id) + for trace in traces: + self._append_trace_log(node, trace, stage=stage) + return len(traces) + + @staticmethod + def _extract_push_id_from_trace(trace: dict | None) -> Optional[str]: + if trace is None: + return None + payload = trace.get("payload") + if not isinstance(payload, dict): + return None + push_id = payload.get("push_id") + return push_id if isinstance(push_id, str) and push_id else None + + def _resolve_push_id_for_success(self, node, result: TaskResult) -> Optional[str]: + if result.task_id: + return result.task_id + + if result.push_id: + return result.push_id + + action_name = node.action.value.lower() + biz_id = node.data_id or "" + + if biz_id: + by_biz_and_op = self.client.peek_latest_trace_by_biz_id(biz_id, op_kind=action_name) + if by_biz_and_op is not None: + push_id = self._extract_push_id_from_trace(by_biz_and_op) + if push_id: + self.client.consume_latest_trace_by_biz_id(biz_id, op_kind=action_name) + return push_id + + by_biz_any = self.client.peek_latest_trace_by_biz_id(biz_id) + if by_biz_any is not None: + push_id = self._extract_push_id_from_trace(by_biz_any) + if push_id: + self.client.consume_latest_trace_by_biz_id(biz_id) + return push_id + + return None + + def _append_missing_push_id_debug_trace(self, node) -> None: + action_name = node.action.value.lower() + biz_id = node.data_id or "" + + if biz_id: + trace = self.client.peek_latest_trace_by_biz_id(biz_id, op_kind=action_name) + if trace is None: + trace = self.client.peek_latest_trace_by_biz_id(biz_id) + if trace is not None: + self._append_trace_log(node, trace, stage="submit-missing-push-id") + return + + node.append_log( + f"API链路[submit-missing-push-id] 未找到匹配 biz_id 的请求记录,action={node.action.value}, data_id={node.data_id or ''}" + ) + return + + node.append_log( + f"API链路[submit-missing-push-id] 未找到可用请求记录(已禁用按操作类型兜底),action={node.action.value}, data_id={node.data_id or ''}" + ) + + return None + + def _on_node_loaded(self, handler: NodeHandler, node) -> None: + data_id = node.data_id or "" + if not data_id: + return + traces = self.client.consume_load_traces(node.node_type, data_id) + for trace in traces: + self._append_trace_log(node, trace, stage="load") + + async def _intercept_success_result(self, handler: NodeHandler, node, result: TaskResult, async_tasks: dict) -> bool: + if node.action.value not in {"CREATE", "UPDATE", "DELETE"}: + return False + + push_id = self._resolve_push_id_for_success(node, result) + if not push_id: + self._append_missing_push_id_debug_trace(node) + raise RuntimeError( + f"[{node.node_type}] unified polling requires push_id for {node.action.value}, " + f"but none resolved for node={node.node_id}, data_id={node.data_id}" + ) + + synthetic = TaskResult.in_progress(node_id=node.node_id, task_id=push_id) + appended = self._consume_and_append_push_traces(node, push_id, stage="submit") + if appended == 0: + node.append_log(f"API链路[submit] 未捕获请求记录,push_id={push_id}") + await self._handle_in_progress_result(node, synthetic, async_tasks) + return True + + def _on_in_progress_result(self, handler: NodeHandler, node, result: TaskResult) -> None: + if result.task_id: + appended = self._consume_and_append_push_traces(node, result.task_id, stage="submit") + if appended == 0: + node.append_log(f"API链路[submit] 未捕获请求记录,push_id={result.task_id}") + + def _on_poll_result(self, handler: NodeHandler, node, task_id: str, result: TaskResult) -> None: + appended = self._consume_and_append_push_traces(node, task_id, stage="poll") + if appended == 0: + node.append_log(f"API链路[poll] 未捕获请求记录,push_id={task_id}") + + def _on_failed_result(self, handler: NodeHandler, node, result: TaskResult) -> None: + if node.action.value not in {"CREATE", "UPDATE", "DELETE"}: + return + + if result.push_id: + traces = self.client.consume_traces_by_push_id(result.push_id) + if traces: + for trace in traces: + self._append_trace_log(node, trace, stage="submit-failed") + return + node.append_log(f"API链路[submit-failed] 未捕获请求记录,push_id={result.push_id}") + + action_name = node.action.value.lower() + biz_id = node.data_id or "" + + trace = None + if biz_id: + trace = self.client.consume_latest_trace_by_biz_id(biz_id, op_kind=action_name) + if trace is None: + trace = self.client.consume_latest_trace_by_biz_id(biz_id) + + if trace is not None: + self._append_trace_log(node, trace, stage="submit-failed") + return + + if biz_id: + node.append_log( + f"API链路[submit-failed] 未找到匹配 biz_id 的请求记录,action={node.action.value}, data_id={biz_id}" + ) + return + + node.append_log( + f"API链路[submit-failed] 未找到可用请求记录(已禁用按操作类型兜底),action={node.action.value}, data_id=" + ) + + # load_all 和 sync_all 继承自 BaseDataSource + # BaseDataSource 会按顺序调用 Handler 的方法 diff --git a/sync_state_machine/datasource/api/errors.py b/sync_state_machine/datasource/api/errors.py new file mode 100644 index 0000000..f13c1bb --- /dev/null +++ b/sync_state_machine/datasource/api/errors.py @@ -0,0 +1,25 @@ +""" +API Handler 通用错误常量 +""" + +# API Client 相关错误 +ERROR_API_CLIENT_NOT_INITIALIZED = "api_client not initialized" +ERROR_API_CLIENT_NOT_INJECTED = "api_client not injected" + +# Collection 相关错误 +ERROR_COLLECTION_NOT_SET = "collection not set" + +# 数据验证错误 +ERROR_NODE_DATA_NONE = "Node data is None or validation failed" +ERROR_VALIDATION_FAILED = "Validation failed" + +# 业务数据错误 +ERROR_PROJECT_ID_NOT_FOUND = "project_id not found" +ERROR_CONTRACT_ID_NOT_FOUND = "contract_id not found" +ERROR_ID_NOT_FOUND = "id not found" + +# 操作不支持错误 +ERROR_OPERATION_NOT_SUPPORTED = "Operation not supported" +ERROR_CREATE_NOT_SUPPORTED = "Create operation not supported" +ERROR_UPDATE_NOT_SUPPORTED = "Update operation not supported" +ERROR_DELETE_NOT_SUPPORTED = "Delete operation not supported" diff --git a/sync_state_machine/datasource/api/handler.py b/sync_state_machine/datasource/api/handler.py new file mode 100644 index 0000000..99a7763 --- /dev/null +++ b/sync_state_machine/datasource/api/handler.py @@ -0,0 +1,538 @@ +""" +BaseApiHandler - API Handler 基类 + +职责: +- 实现 Handler 接口(load, create, update, delete, poll) +- 使用 self.api_client 发送 HTTP 请求 +- 生成 push_id 和 biz_id(业务标识) +- 从 collection 获取依赖节点数据 +- 管理节点的 context(存储 project_id, contract_id 等) +- 实现 poll 方法,调用 api_client.get_push_logs 批量查询 +- 提取 created_id(因为不同业务的 id 字段名和位置可能不同) +- 返回 TaskResult(SUCCESS/FAILED/IN_PROGRESS) +""" + +import uuid +import asyncio +from abc import abstractmethod +from typing import ClassVar, Dict, List, Any, Optional, TYPE_CHECKING, TypeVar +from pydantic import BaseModel + +from ...common.type_safety import get_pydantic_model_fields +from ..handler import NodeHandler +from ..task_result import TaskResult +from ..handler import ValidationResult # Import ValidationResult + +if TYPE_CHECKING: + from ...common.sync_node import SyncNode + from ...common.collection import DataCollection + from .client import ApiClient + +T = TypeVar("T", bound=BaseModel) + + +class BaseApiHandler(NodeHandler[T]): + """API Handler 基类""" + + # 子类需要设置这些属性 + _node_type: str + _node_class: type['SyncNode'] + _schema: Any + + def __init__(self): + # 子类应该在调用 super().__init__() 之前或之后设置 _node_type, _node_class, _schema + self.api_client: 'ApiClient' = None # type: ignore # 由 DataSource 注入 + self.poll_mode: str = "async" # async | sync + self._collection: 'DataCollection' = None # type: ignore # 由 DataSource 注入 + # 子类在 __init__ 中设置此列表以声明 create/update 中涉及的 Pydantic schema 类; + # post-check 将只比较这些 schema 覆盖的字段,过滤后端只读的派生字段。 + self.update_schemas: List[type] = [] + + def get_update_fields(self, *, exclude: frozenset = frozenset({'id'})) -> List[str]: + """从 update_schemas 中提取所有可写字段名,排除标识键(默认排除 id)。""" + fields: set = set() + for schema in self.update_schemas: + for field_name in get_pydantic_model_fields(schema): + if field_name not in exclude: + fields.add(field_name) + return sorted(fields) + + def set_api_client(self, client: 'ApiClient') -> None: + self.api_client = client + + def set_collection(self, collection: 'DataCollection') -> None: + """设置 Collection(由 DataSource 调用)""" + self._collection = collection + + @property + def node_type(self) -> str: + """返回节点类型""" + return self._node_type + + @property + def node_class(self) -> type['SyncNode']: + """返回节点类""" + return self._node_class + + @property + def schema(self) -> Any: + """返回 schema(子类可重写)""" + return self._schema + + def _generate_push_id(self) -> str: + """ + 生成 push_id(推送唯一标识) + + Returns: + UUID 格式的 push_id + """ + return str(uuid.uuid4()) + + def _generate_biz_id(self, node: 'SyncNode') -> str: + """ + 生成 biz_id(业务标识) + + 子类可重写此方法实现自定义业务 ID 生成逻辑。 + 默认使用 node_id 作为 biz_id。 + + Args: + node: 同步节点 + + Returns: + 业务标识符 + """ + return node.node_id + + def _create_basic_node(self, data: Dict[str, Any], depend_ids: Optional[List[str]] = None) -> "SyncNode": + """创建或复用基础节点(默认使用 data['id'] 或 data['_id'])""" + data_id = str(data.get("id") or data.get("_id") or "") + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() before creating nodes.") + + if data_id: + existing_node = self._collection.get_by_data_id(self.node_type, data_id) + if existing_node is not None: + existing_node.depend_ids = list(depend_ids or []) + existing_node.set_data(data.copy()) + existing_node.set_origin_data(data.copy()) + return existing_node + + node_id = self._collection.generate_node_id() + node = self.node_class( + node_id=node_id, + data_id=data_id, + data=data.copy(), + depend_ids=depend_ids or [], + origin_data=data.copy(), + ) + return node + + def _create_node(self, data: Dict[str, Any]) -> "SyncNode": + """默认节点创建(子类可覆盖并补充 context)""" + return self._create_basic_node(data) + + def extract_id(self, data: Dict[str, Any]) -> str: + """从原始数据提取 ID(默认优先 id,其次 _id)""" + return str(data.get("id") or data.get("_id") or "") + + def extract_created_id(self, push_log: Dict[str, Any]) -> Optional[str]: + """ + 从 push_log 提取 created_id + + 子类可重写此方法以适配不同的响应结构。 + 默认从 push_log['data']['biz_id'] 提取。 + + Args: + push_log: Push Log 响应数据 + + Returns: + 创建的对象 ID,未找到返回 None + """ + try: + data = push_log.get('data', {}) + if isinstance(data, dict): + return data.get('biz_id') + return None + except (KeyError, AttributeError): + return None + + def set_poll_mode(self, mode: str) -> None: + """设置轮询模式(sync/async)""" + if mode not in {"sync", "async"}: + raise ValueError(f"Unsupported poll mode: {mode}") + self.poll_mode = mode + + def _extract_created_id_from_response(self, response: Dict[str, Any]) -> Optional[str]: + """从同步创建响应提取创建的 ID(默认 data.biz_id)""" + data = response.get("data") if isinstance(response, dict) else None + if isinstance(data, dict): + return data.get("biz_id") + return None + + def _build_create_task_result( + self, + node_id: str, + response: Optional[Dict[str, Any]] = None, + task_id: Optional[str] = None, + fallback_data_id: Optional[str] = None, + ) -> TaskResult: + """根据轮询模式构建 create 的 TaskResult""" + if self.poll_mode == "sync": + created_id = None + if response is not None: + created_id = self._extract_created_id_from_response(response) + if not created_id: + created_id = fallback_data_id + return TaskResult.success(node_id=node_id, data_id=created_id) + + if not task_id: + return TaskResult.failed(node_id=node_id, error="Missing task_id for async create") + return TaskResult.in_progress(node_id=node_id, task_id=task_id) + + # ========== 通用辅助方法 ========== + + def _validate_schema(self, data: Dict[str, Any], schema: Any) -> Optional[str]: + """ + 验证数据是否符合 schema + + Args: + data: 待验证数据 + schema: Pydantic schema + + Returns: + 错误信息,无错误返回 None + """ + try: + schema.model_validate(data) + return None + except Exception as e: + return str(e) + + def _get_schema_diff( + self, + schema, + data: Dict[str, Any], + origin_data: Dict[str, Any], + node_id: Optional[str] = None + ) -> Dict[str, Any] | None: + """ + 获取数据在指定 schema 下的差异字段 + + Args: + schema: Pydantic schema 类 + data: 新数据 + origin_data: 原始数据 + node_id: 节点ID(用于日志) + + Returns: + Dict[str, Any] | None: 有差异返回差异字段字典,无差异或字段不全返回 None + """ + from pydantic import ValidationError + + try: + new_model = schema.model_validate(data) + origin_model = schema.model_validate(origin_data) + + new_dict = new_model.model_dump(exclude_unset=True) + origin_dict = origin_model.model_dump(exclude_unset=True) + + if new_dict == origin_dict: + return None + + # 返回有差异的字段 + diff_fields = {k: v for k, v in new_dict.items() if origin_dict.get(k) != v} + + if diff_fields: + # 打印差异详情 + node_info = f"[{node_id}]" if node_id else "" + print(f" [DIFF] {self.node_type}{node_info} schema={schema.__name__}") + for k, v in diff_fields.items(): + orig_v = origin_dict.get(k) + print(f" • {k}: {orig_v!r} → {v!r}") + + return diff_fields if diff_fields else None + + except ValidationError: + # schema 字段不全,视为无差异 + return None + + def _filter_update_data( + self, + new_data: Dict[str, Any], + original_data: Dict[str, Any], + schema: Optional[Any] = None + ) -> Dict[str, Any]: + """ + 过滤出需要更新的字段 + + 规则: + 1. 提取 schema 定义的所有字段(包括必填) + 2. 检查是否有任何字段发生变化 + 3. 如果有变化,返回所有 schema 字段;否则返回空 + + Args: + new_data: 新数据 + original_data: 原始数据 + schema: 更新 schema(可选) + + Returns: + 包含 schema 所有字段的数据(如果有变化),否则返回空字典 + """ + schema_fields = get_pydantic_model_fields(schema) + if not schema_fields: + # 无 schema,按原逻辑处理 + update_data = {} + for key, new_value in new_data.items(): + if new_value == "" or new_value is None: + continue + original_value = original_data.get(key) + if new_value != original_value: + update_data[key] = new_value + return update_data + + # 1. 提取 schema 定义的所有字段 + schema_fields = set(schema_fields.keys()) + schema_data = {} + has_change = False + + for key in schema_fields: + new_value = new_data.get(key) + + # 排除空值 + if new_value == "" or new_value is None: + continue + + schema_data[key] = new_value + + # 检查是否变化 + original_value = original_data.get(key) + if new_value != original_value: + # 记录具体差异以便排查 + # print(f" [DEBUG] Field '{key}' changed: '{original_value}' -> '{new_value}'") + has_change = True + + # 2. 只有存在变化时才返回数据 + return schema_data if has_change else {} + + def _schema_changed_fields( + self, + schema: Any, + new_data: Dict[str, Any], + origin_data: Dict[str, Any], + ) -> List[str]: + schema_fields = get_pydantic_model_fields(schema) + if not schema_fields: + return [] + changed: List[str] = [] + for field_name in schema_fields.keys(): + if new_data.get(field_name) != origin_data.get(field_name): + changed.append(field_name) + return changed + + def _build_update_schema_status( + self, + *, + schema_name: str, + schema: Any, + new_data: Dict[str, Any], + origin_data: Dict[str, Any], + will_update: bool, + update_error: Optional[str] = None, + ) -> str: + new_error = self._validate_schema(new_data, schema) + origin_error = self._validate_schema(origin_data, schema) + changed_fields = self._schema_changed_fields(schema, new_data, origin_data) + + if new_error: + compact = new_error.replace("\n", " ").strip() + if len(compact) > 220: + compact = compact[:220] + "..." + return f"{schema_name}: NEW_INVALID({compact})" + + if not changed_fields: + return f"{schema_name}: CONSISTENT" + + changed_text = ",".join(changed_fields) + if update_error: + compact = update_error.replace("\n", " ").strip() + if len(compact) > 220: + compact = compact[:220] + "..." + return f"{schema_name}: DIFF[{changed_text}] -> UPDATE_FAILED({compact})" + + if will_update: + if origin_error: + compact = origin_error.replace("\n", " ").strip() + if len(compact) > 160: + compact = compact[:160] + "..." + return f"{schema_name}: DIFF[{changed_text}] -> UPDATE_TRIGGERED (origin_invalid={compact})" + return f"{schema_name}: DIFF[{changed_text}] -> UPDATE_TRIGGERED" + + if origin_error: + compact = origin_error.replace("\n", " ").strip() + if len(compact) > 160: + compact = compact[:160] + "..." + return f"{schema_name}: DIFF[{changed_text}] -> NOT_TRIGGERED (origin_invalid={compact})" + return f"{schema_name}: DIFF[{changed_text}] -> NOT_TRIGGERED" + + async def _execute_with_retry( + self, + operation, + max_retries: int = 3, + retry_delay: float = 1.0 + ) -> Any: + """ + 通用重试逻辑 + + 子类可重写此方法实现自定义重试策略。 + 默认策略:网络错误/5xx 重试,4xx 不重试。 + + Args: + operation: 异步操作(协程函数) + max_retries: 最大重试次数 + retry_delay: 重试延迟(秒) + + Returns: + 操作执行结果 + + Raises: + 最后一次重试的异常 + """ + import httpx + + last_error = None + for attempt in range(max_retries): + try: + return await operation() + except httpx.HTTPStatusError as e: + # 4xx 客户端错误不重试 + if 400 <= e.response.status_code < 500: + raise + last_error = e + if attempt < max_retries - 1: + await asyncio.sleep(retry_delay * (attempt + 1)) + except (httpx.NetworkError, httpx.TimeoutException) as e: + # 网络错误重试 + last_error = e + if attempt < max_retries - 1: + await asyncio.sleep(retry_delay * (attempt + 1)) + + # 重试次数用尽 + if last_error: + raise last_error + else: + raise RuntimeError("Retry failed with unknown error") + + # ========== 批量接口(子类必须实现) ========== + + @abstractmethod + async def create_all(self, nodes: List['SyncNode']) -> List[TaskResult]: + """ + 批量创建节点 + + Args: + nodes: 需要创建的节点列表(DataSource 已筛选为 CREATE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + pass + + @abstractmethod + async def update_all(self, nodes: List['SyncNode']) -> List[TaskResult]: + """ + 批量更新节点 + + Args: + nodes: 需要更新的节点列表(DataSource 已筛选为 UPDATE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + pass + + @abstractmethod + async def delete_all(self, nodes: List['SyncNode']) -> List[TaskResult]: + """ + 批量删除节点 + + Args: + nodes: 需要删除的节点列表(DataSource 已筛选为 DELETE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + pass + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """ + 批量轮询异步任务状态 + + Args: + task_ids: 任务 ID 列表(push_id 列表) + + Returns: + {task_id: TaskResult} 映射 + """ + if not task_ids: + return {} + if not self.api_client: + raise RuntimeError("api_client not injected") + + # 批量查询 push_logs + try: + push_logs = await self.api_client.get_push_logs(task_ids) + except Exception as e: + # 查询失败,所有任务标记为失败 + return { + task_id: TaskResult.failed(error=f"Poll failed: {str(e)}") + for task_id in task_ids + } + + results = {} + for task_id in task_ids: + push_log = push_logs.get(task_id, {}) + + if 'error' in push_log: + results[task_id] = TaskResult.failed(error=push_log['error']) + elif push_log.get('code') == 200: # 通过code==200判断成功 + created_id = self.extract_created_id(push_log) + results[task_id] = TaskResult.success(data_id=created_id) + elif push_log.get('code') and push_log.get('code') != 200: # code存在但不是200表示失败 + results[task_id] = TaskResult.failed(error=push_log.get('message', 'Unknown error')) + else: + # 仍在进行中 + results[task_id] = TaskResult.in_progress(task_id=task_id) + + return results + + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + """ + 数据质量检查(使用 schema 验证) + + Args: + data: 原始数据 + + Returns: + ValidationResult(是否有效 + 错误列表) + """ + error = self._validate_schema(data, self.schema) + if error: + return ValidationResult(is_valid=False, errors=[error]) + return ValidationResult(is_valid=True) + + # ========== 抽象方法:子类必须实现 ========== + + @abstractmethod + async def load(self) -> List['SyncNode']: + """ + 从 API 加载数据并创建节点 + + Handler 负责: + 1. 加载原始数据(可使用 self._collection 查询依赖) + 2. 创建 SyncNode(调用 self.create_node) + 3. 设置 context(如 project_id, contract_id 等) + + Returns: + SyncNode 列表 + """ + pass diff --git a/sync_state_machine/datasource/datasource.py b/sync_state_machine/datasource/datasource.py new file mode 100644 index 0000000..05d5052 --- /dev/null +++ b/sync_state_machine/datasource/datasource.py @@ -0,0 +1,962 @@ +""" +DataSource V2 - 状态管理 + Handler 编排层 + +DataSource 职责: +1. 注册和管理 Handler +2. 按依赖顺序加载数据 +3. 执行同步(调用 Handler) +4. 管理节点状态流转(PENDING → IN_PROGRESS → SUCCESS/FAILED) +5. 处理异步任务轮询 +6. 统一异常处理 + +DataSource 不负责: +- ❌ 后端 API 调用(由 Handler 负责) +- ❌ ID 映射(由 Strategy 负责) +- ❌ 业务逻辑(由 Strategy 负责) +""" +from __future__ import annotations + +import asyncio +import logging +from typing import Any, List, Dict, Optional, TYPE_CHECKING +from abc import ABC +from pathlib import Path + +if TYPE_CHECKING: + from ..common.collection import DataCollection + from .handler import NodeHandler + from ..common.sync_node import SyncNode + from ..common.types import SyncAction + from .task_result import TaskStatus + +from ..common.types import SyncStatus +from ..common.type_safety import get_pydantic_model_fields +from .handler import ensure_handler_compat +from .task_result import TaskResult +from ..engine import ( + StateMachineConfig, + StateMachineRuntime, + e40_sync_execute, +) + + +logger = logging.getLogger(__name__) + + +class BaseDataSource(ABC): + """ + 数据源基类 V2(状态管理 + 编排层) + + 核心流程: + 1. 注册 Handler:每个节点类型对应一个 Handler + 2. 加载数据:按依赖顺序调用 Handler.load() + 3. 执行同步:根据 node.action 调用 Handler 的 create/update/delete + 4. 状态管理:根据 TaskResult 更新 node.status + 5. 异步轮询:处理 IN_PROGRESS 节点 + + 示例: + # 1. 初始化 DataSource + datasource = MyDataSource() + + # 2. 注册 Handler + datasource.register_handler(project_handler) + datasource.register_handler(contract_handler) + + # 3. 设置 Collection + datasource.set_collection(collection) + + # 4. 加载数据(按顺序) + await datasource.load_all(order=["project", "contract"]) + + # 5. 执行同步(按顺序) + await datasource.sync_all(order=["project", "contract"]) + """ + + def __init__(self, poll_max_retries: int = 1, poll_interval: float = 0.5): + self._handlers: Dict[str, "NodeHandler"] = {} + self._collection: Optional["DataCollection"] = None + self._target_project_ids: List[str] = [] + + # 按节点类型统计信息 + # {"company": {"loaded": 10, "synced": 10, "success": 10, "failed": 0}, ...} + self._stats: Dict[str, Dict[str, int]] = {} + # 记录本次 sync 的动作统计(CREATE/UPDATE/DELETE/NONE) + self._action_summary: Dict[str, Dict[str, Dict[str, int]]] = {} + # 记录本次 sync 中的节点动作(用于异步完成后的统计) + self._action_by_node_id: Dict[str, "SyncAction"] = {} + self._poll_max_retries = max(1, poll_max_retries) + self._poll_interval = max(0, poll_interval) + self._sm_runtime: Optional[StateMachineRuntime] = None + + def _ensure_sm_runtime(self) -> StateMachineRuntime: + if self._sm_runtime is None: + cfg_path = Path(__file__).resolve().parents[1] / "config" / "node_state_machine.yaml" + self._sm_runtime = StateMachineRuntime(StateMachineConfig.load(cfg_path)) + return self._sm_runtime + + def set_state_machine_runtime(self, runtime: StateMachineRuntime) -> None: + """注入统一状态机 runtime(通常由 pipeline 负责)。""" + self._sm_runtime = runtime + + def _apply_sync_execute_state( + self, + node: "SyncNode", + *, + handler_status: "TaskStatus", + poll_timeout: bool = False, + detail: str = "", + action_override: Optional["SyncAction"] = None, + result_data_id: Optional[str] = None, + ) -> bool: + action_for_event = action_override or node.action + decision = e40_sync_execute( + self._ensure_sm_runtime(), + node=node, + handler_result=handler_status.name, + action=action_for_event.value, + poll_timeout=poll_timeout, + result_data_id=result_data_id, + ) + if decision is None: + if detail: + node.append_log( + f"执行状态未变更: action={action_for_event.value}, result={handler_status.name}, detail={detail}" + ) + return False + if detail: + node.append_log( + f"执行状态写回: action={action_for_event.value}, result={handler_status.name}, detail={detail}" + ) + return True + + def _compose_node_error(self, node: "SyncNode", *, source: str, detail: str) -> str: + return ( + f"{source} | node={node.node_id} | type={node.node_type} | " + f"action={node.action.value} | status={node.status.value} | detail={detail}" + ) + + def _on_node_loaded(self, handler: "NodeHandler", node: "SyncNode") -> None: + """Datasource-specific hook when a loaded node is upserted into collection.""" + return + + async def _intercept_success_result( + self, + handler: "NodeHandler", + node: "SyncNode", + result: "TaskResult", + async_tasks: Dict[str, str], + ) -> bool: + """Datasource-specific hook to intercept SUCCESS result handling. + + Return True if handled/consumed by subclass and no further default SUCCESS flow is needed. + """ + return False + + def _on_in_progress_result(self, handler: "NodeHandler", node: "SyncNode", result: "TaskResult") -> None: + """Datasource-specific hook after an IN_PROGRESS task is queued.""" + return + + def _on_poll_result(self, handler: "NodeHandler", node: "SyncNode", task_id: str, result: "TaskResult") -> None: + """Datasource-specific hook after polling result is applied to node.""" + return + + def _on_failed_result(self, handler: "NodeHandler", node: "SyncNode", result: "TaskResult") -> None: + """Datasource-specific hook after a FAILED result is applied to node.""" + return + + async def _handle_success_result(self, node: "SyncNode", result: "TaskResult") -> None: + previous_data_id = node.data_id + ok = self._apply_sync_execute_state( + node, + handler_status=result.status, + detail="远程操作成功完成", + result_data_id=result.data_id, + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] SUCCESS result cannot map to state machine: node={node.node_id}") + self._record_action_result(node, result.status) + await self._apply_success_result(node, result.data_id, previous_data_id=previous_data_id) + node.error = None + + async def _handle_failed_result(self, node: "SyncNode", result: "TaskResult") -> None: + detail = result.error or "Unknown error" + ok = self._apply_sync_execute_state( + node, + handler_status=result.status, + detail=f"远程操作失败: {detail}", + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] FAILED result cannot map to state machine: node={node.node_id}") + self._record_action_result(node, result.status) + node.error = self._compose_node_error(node, source="handler_failed", detail=detail) + + async def _handle_skipped_result(self, node: "SyncNode", result: "TaskResult") -> None: + from .task_result import TaskStatus as _TaskStatus + + original_action = self._action_by_node_id.get(node.node_id) + if original_action is None or original_action.value != "UPDATE": + raise RuntimeError( + f"[{node.node_type}] SKIPPED is only allowed for UPDATE action: node={node.node_id}, action={original_action.value if original_action is not None else None}" + ) + + ok = self._apply_sync_execute_state( + node, + handler_status=_TaskStatus.SKIPPED, + detail="远程操作被跳过", + action_override=original_action, + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] SKIPPED result cannot map to state machine: node={node.node_id}") + + self._record_action_result(node, _TaskStatus.SKIPPED) + if result.sync_log: + node.append_log(f"同步跳过: {result.sync_log}") + node.error = None + + async def _handle_in_progress_result( + self, + node: "SyncNode", + result: "TaskResult", + async_tasks: Dict[str, str], + ) -> None: + if not result.task_id: + node.error = self._compose_node_error( + node, + source="handler_in_progress_invalid", + detail="missing task_id", + ) + node.append_log("异步任务返回无 task_id,已忽略") + return + + if not result.node_id: + node.error = self._compose_node_error( + node, + source="handler_in_progress_invalid", + detail="missing node_id", + ) + node.append_log("异步任务返回无 node_id,已忽略") + return + + async_tasks[result.node_id] = result.task_id + ok = self._apply_sync_execute_state( + node, + handler_status=result.status, + detail=f"异步任务进行中: {result.task_id}", + ) + if not ok: + node.append_log(f"异步任务进行中(无状态变更): {result.task_id}") + + def set_polling_config(self, max_retries: int, interval: float = 0.5) -> None: + """设置异步轮询参数(默认仅轮询一次)""" + self._poll_max_retries = max(1, max_retries) + self._poll_interval = max(0, interval) + + def reset_stats(self) -> None: + """重置统计信息""" + self._stats = {} + self._action_summary = {} + self._action_by_node_id = {} + + def get_stats(self) -> Dict[str, Dict[str, int]]: + """ + 获取按节点类型的统计信息 + + Returns: + dict: {"company": {"loaded": 10, "synced": 10, "success": 10, "failed": 0}, ...} + """ + return self._stats.copy() + + def get_action_summary(self) -> Dict[str, Dict[str, Dict[str, int]]]: + """ + 获取本次 sync 的动作统计(按节点类型)。 + + Returns: + dict: { + "company": { + "create": {"total": 10, "success": 8, "failed": 2}, + "update": {"total": 2, "success": 2, "failed": 0}, + "delete": {"total": 0, "success": 0, "failed": 0}, + "none": {"total": 5, "success": 0, "failed": 0}, + "total": {"total": 17, "success": 10, "failed": 2}, + }, + ... + } + """ + return {k: {kk: vv.copy() for kk, vv in v.items()} for k, v in self._action_summary.items()} + + def _init_node_stats(self, node_type: str) -> None: + """初始化节点类型的统计信息""" + if node_type not in self._stats: + self._stats[node_type] = { + "loaded": 0, + "synced": 0, + "success": 0, + "failed": 0, + } + if node_type not in self._action_summary: + self._action_summary[node_type] = { + "create": {"total": 0, "success": 0, "failed": 0, "skipped": 0}, + "update": {"total": 0, "success": 0, "failed": 0, "skipped": 0}, + "delete": {"total": 0, "success": 0, "failed": 0, "skipped": 0}, + "none": {"total": 0, "success": 0, "failed": 0, "skipped": 0}, + "total": {"total": 0, "success": 0, "failed": 0, "skipped": 0}, + } + + def _set_action_totals(self, node_type: str, create: int, update: int, delete: int, none: int) -> None: + summary = self._action_summary[node_type] + summary["create"]["total"] = create + summary["update"]["total"] = update + summary["delete"]["total"] = delete + summary["none"]["total"] = none + summary["total"]["total"] = create + update + delete + none + + def _record_action_result(self, node: "SyncNode", result_status: "TaskStatus") -> None: + from ..common.types import SyncAction + from .task_result import TaskStatus as _TaskStatus + + # 情况 A: 原始动作就是 NONE + # 情况 B: Handler 运行时发现没差异,把 action 降级为了 NONE + action = node.action + + # 获取最初锁定的动作(用于修正统计列) + original_action = self._action_by_node_id.pop(node.node_id, SyncAction.NONE) + + summary = self._action_summary.get(node.node_type) + if summary is None: + return + + # 如果当前 action 是 NONE,说明这次“同步”被取消了 + if action == SyncAction.NONE: + # 如果原始动作不是 NONE,说明发生了降级动作,我们需要把 total 从对应列挪到 none 列 + if original_action != SyncAction.NONE: + orig_key = original_action.value.lower() + if orig_key in summary and summary[orig_key]["total"] > 0: + summary[orig_key]["total"] -= 1 + summary["none"]["total"] += 1 + return + + # 正常记录成功/失败/跳过 + key = action.value.lower() + if result_status == _TaskStatus.SUCCESS: + summary[key]["success"] += 1 + summary["total"]["success"] += 1 + elif result_status == _TaskStatus.FAILED: + summary[key]["failed"] += 1 + summary["total"]["failed"] += 1 + elif result_status == _TaskStatus.SKIPPED: + summary[key]["skipped"] += 1 + summary["total"]["skipped"] += 1 + + def set_collection(self, collection: "DataCollection") -> None: + """ + 设置 Collection(在 load_all/sync_all 前调用) + + Args: + collection: 数据集合 + """ + self._collection = collection + collection.set_state_machine_runtime(self._ensure_sm_runtime()) + # 同时设置到所有已注册的 handler + for handler in self._handlers.values(): + handler.set_collection(collection) + + # ========== Handler 管理 ========== + + def register_handler(self, handler: "NodeHandler") -> None: + """ + 注册 Handler + + Args: + handler: 节点处理器实例 + + 示例: + datasource.register_handler(ContractNodeHandler(api_client)) + """ + compatible_handler = ensure_handler_compat(handler) + self._handlers[compatible_handler.node_type] = compatible_handler + self._apply_target_project_ids_to_handler(compatible_handler) + + def set_target_project_ids(self, target_project_ids: Optional[List[str]]) -> None: + """设置项目过滤列表,并在注册阶段下发给所有 handler。""" + normalized = [str(pid) for pid in (target_project_ids or []) if str(pid)] + self._target_project_ids = normalized + for handler in self._handlers.values(): + self._apply_target_project_ids_to_handler(handler) + + def _apply_target_project_ids_to_handler(self, handler: "NodeHandler") -> None: + handler.set_target_project_ids(self._target_project_ids) + + def get_handler(self, node_type: str) -> "NodeHandler": + """获取 Handler""" + if node_type not in self._handlers: + raise KeyError(f"Handler for '{node_type}' not registered") + return self._handlers[node_type] + + async def _upsert_loaded_nodes( + self, + handler: "NodeHandler", + node_type: str, + nodes: List["SyncNode"] + ) -> None: + """将加载的节点写入 Collection(按 data_id 优先命中已有节点)""" + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() first.") + + for node in nodes: + existing_node = None + if node.data_id: + existing_node = self._collection.get_by_data_id(node_type, node.data_id) + load_source = f"{self.__class__.__name__}.load" + + if existing_node is not None: + data_payload = node.get_data() + existing_node.depend_ids = list(node.depend_ids or []) + if node.context: + existing_node.context.update(node.context) + existing_node.set_data(data_payload) + existing_node.set_origin_data(data_payload) + if existing_node.context.pop("_loaded_from_persistence", False): + existing_node.append_log(f"加载来源: persistence -> {load_source} 覆盖刷新") + else: + existing_node.append_log(f"加载来源: {load_source} 覆盖刷新") + + await self._collection.update(existing_node) + self._on_node_loaded(handler, existing_node) + else: + node.append_log(f"加载来源: {load_source} 新增节点") + await self._collection.add(node) + self._on_node_loaded(handler, node) + + # ========== 数据加载 ========== + + async def load_all( + self, + order: Optional[List[str]] = None, + data_type: Optional[str] = None + ) -> None: + """ + 按依赖顺序加载所有数据 + + 注意:调用前需先 set_collection() + + Args: + order: 节点类型顺序(如 ["project", "contract", "construction"]) + data_type: 仅加载单一类型(与 order 互斥) + + 工作流程: + 1. 按顺序遍历每个节点类型 + 2. 调用 Handler.load(collection) + 3. Handler 可以从 collection 查询依赖节点(如 Contract 查询 Project) + 4. 使用 Handler.create_node() 创建 SyncNode + 5. 添加到 Collection + + 示例: + datasource.set_collection(collection) + await datasource.load_all(order=["project", "contract"]) + """ + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() first.") + + if data_type is not None: + order_to_load = [data_type] + elif order is not None: + order_to_load = order + else: + order_to_load = list(self._handlers.keys()) + + for node_type in order_to_load: + handler = self.get_handler(node_type) + + # 初始化统计 + self._init_node_stats(node_type) + + try: + # Handler 加载数据并创建节点 + nodes = await handler.load() + + print(f"Loaded nodes for {node_type}: {len(nodes)}") + + # 将节点写入 Collection:优先按 data_id 命中已有节点并更新 + await self._upsert_loaded_nodes(handler, node_type, nodes) + + # 统计加载的节点数 + self._stats[node_type]["loaded"] += len(nodes) + except Exception as exc: + print(f"❌ [{node_type}] 加载失败: {exc}") + continue + + # ========== 同步执行 ========== + + async def sync_all( + self, + order: Optional[List[str]] = None, + data_type: Optional[str] = None, + poll_async_tasks: bool = True + ) -> Dict[str, Dict[str, str]]: + """ + 按依赖顺序执行同步 + + 注意:调用前需先 set_collection() + + Args: + order: 节点类型顺序 + data_type: 仅同步单一类型(与 order 互斥) + + 工作流程: + 1. 按顺序遍历每个节点类型 + 2. 筛选需要同步的节点(status=PENDING, action!=NONE) + 3. 调用 Handler 的 create/update/delete + 4. 根据 TaskResult 更新节点状态 + 5. 处理异步任务轮询 + + 状态流转: + - PENDING + action=CREATE/UPDATE/DELETE → IN_PROGRESS → SUCCESS/FAILED + - PENDING + action=NONE → 保持 PENDING + - DEPENDENCY_ERROR / ABNORMAL / WARNING → SKIPPED + + 示例: + datasource.set_collection(collection) + await datasource.sync_all(order=["project", "contract"]) + """ + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() first.") + + if data_type is not None: + order_to_sync = [data_type] + elif order is not None: + order_to_sync = order + else: + order_to_sync = list(self._handlers.keys()) + + async_tasks_by_type: Dict[str, Dict[str, str]] = {} + + for node_type in order_to_sync: + handler = self.get_handler(node_type) + + # 批量同步该类型的所有节点 + async_tasks = await self._sync_nodes(handler, poll_async_tasks=poll_async_tasks) + if async_tasks: + async_tasks_by_type[node_type] = async_tasks + + return async_tasks_by_type + + async def _sync_nodes( + self, + handler: "NodeHandler", + poll_async_tasks: bool = True + ) -> Dict[str, str]: + """ + 同步一批节点(批量接口) + + Args: + handler: 节点处理器 + + 流程: + 1. DataSource 筛选需要处理的节点 + 2. 调用 handler.create_all(nodes) + 3. 调用 handler.update_all(nodes) + 4. 调用 handler.delete_all(nodes) + 5. 根据 List[TaskResult] 更新节点状态 + 6. 收集并轮询异步任务 + """ + from ..common.types import SyncAction, SyncStatus + from .task_result import TaskStatus as _TaskStatus + + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() first.") + collection = self._collection + + # 初始化统计 + self._init_node_stats(handler.node_type) + + async_tasks: Dict[str, str] = {} # {node_id: task_id} + + # DataSource 负责筛选需要创建的节点(排除已失败的节点) + create_nodes = [ + n + for n in collection.filter_by_state_ids( + node_type=handler.node_type, + state_ids=["S06"], + ) + if n.action == SyncAction.CREATE + ] + + # DataSource 负责筛选需要更新的节点(排除已失败的节点) + update_nodes = [ + n + for n in collection.filter_by_state_ids( + node_type=handler.node_type, + state_ids=["S07"], + ) + if n.action == SyncAction.UPDATE + ] + + # DataSource 负责筛选需要删除的节点(排除已失败的节点) + delete_nodes = [ + n + for n in collection.filter_by_state_ids( + node_type=handler.node_type, + state_ids=["S09"], + ) + if n.action == SyncAction.DELETE + ] + + if delete_nodes: + raise NotImplementedError( + f"[{handler.node_type}] delete path is not implemented yet, " + f"but found {len(delete_nodes)} node(s) in S09/DELETE." + ) + + # 记录本次 sync 的动作统计(在 action 被重置前) + for node in create_nodes: + self._action_by_node_id[node.node_id] = SyncAction.CREATE + for node in update_nodes: + self._action_by_node_id[node.node_id] = SyncAction.UPDATE + for node in delete_nodes: + self._action_by_node_id[node.node_id] = SyncAction.DELETE + + none_count = len( + self._collection.filter( + node_type=handler.node_type, + node_filter={"action": SyncAction.NONE} + ) + ) + self._set_action_totals( + handler.node_type, + create=len(create_nodes), + update=len(update_nodes), + delete=len(delete_nodes), + none=none_count, + ) + + # 批量创建(传入节点列表) + if create_nodes: + logger.info(f"[{handler.node_type}] create提交开始: nodes={len(create_nodes)}") + try: + create_results = await handler.create_all(create_nodes) + create_success = 0 + create_in_progress = 0 + create_failed = 0 + create_skipped = 0 + for result in create_results: + if result.status == _TaskStatus.SUCCESS: + create_success += 1 + elif result.status == _TaskStatus.IN_PROGRESS: + create_in_progress += 1 + elif result.status == _TaskStatus.FAILED: + create_failed += 1 + elif result.status == _TaskStatus.SKIPPED: + create_skipped += 1 + await self._handle_task_result(handler, result, async_tasks) + logger.info( + f"[{handler.node_type}] create提交完成: success={create_success}, " + f"in_progress={create_in_progress}, failed={create_failed}, skipped={create_skipped}" + ) + except Exception as e: + print(f"❌ [{handler.node_type}] create_all 异常: {e}") + for node in create_nodes: + ok = self._apply_sync_execute_state( + node, + handler_status=_TaskStatus.FAILED, + detail=str(e), + ) + if not ok: + raise RuntimeError(f"[{handler.node_type}] create_all exception cannot map to state machine") + + # 批量更新(传入节点列表) + if update_nodes: + try: + update_results = await handler.update_all(update_nodes) + for result in update_results: + await self._handle_task_result(handler, result, async_tasks) + except Exception as e: + print(f"❌ [{handler.node_type}] update_all 异常: {e}") + for node in update_nodes: + ok = self._apply_sync_execute_state( + node, + handler_status=_TaskStatus.FAILED, + detail=str(e), + ) + if not ok: + raise RuntimeError(f"[{handler.node_type}] update_all exception cannot map to state machine") + + # 批量删除(delete stage 当前未实现,检测到 S09 会在上方直接 fail-fast) + + # 轮询异步任务 + if async_tasks and poll_async_tasks: + logger.info( + f"[{handler.node_type}] create已提交,push_id检查即将开始: pending={len(async_tasks)}, " + f"first_wait={self._poll_interval:.3f}s" + ) + await self._poll_async_tasks(handler, async_tasks) + + # 统计同步结果 + all_nodes = self._collection.filter(node_type=handler.node_type) + synced_count = len([n for n in all_nodes if n.action != SyncAction.NONE]) + success_count = len([n for n in all_nodes if n.status == SyncStatus.SUCCESS]) + failed_count = len([n for n in all_nodes if n.status == SyncStatus.FAILED]) + + self._stats[handler.node_type]["synced"] = synced_count + self._stats[handler.node_type]["success"] = success_count + self._stats[handler.node_type]["failed"] = failed_count + + return async_tasks + + async def poll_async_tasks(self, async_tasks_by_type: Dict[str, Dict[str, str]]) -> None: + """由 Pipeline 调度的异步任务轮询""" + for node_type, async_tasks in async_tasks_by_type.items(): + if not async_tasks: + continue + handler = self.get_handler(node_type) + await self._poll_async_tasks(handler, async_tasks) + + async def _handle_task_result( + self, + handler: "NodeHandler", + result: "TaskResult", + async_tasks: Dict[str, str] + ) -> None: + """ + 处理 Handler 返回的 TaskResult + + Args: + collection: Collection 上下文 + result: Handler 返回的结果(包含 node_id) + async_tasks: 异步任务字典 + """ + from .task_result import TaskStatus as _TaskStatus + + if not result.node_id: + # 没有 node_id,无法定位节点 + return + + if self._collection is None: + # Collection 未设置,无法处理结果 + return + + # 从 self._collection 中查找节点 + node = self._collection.get(result.node_id) + if not node: + return + + if result.status == _TaskStatus.SUCCESS: + if await self._intercept_success_result(handler, node, result, async_tasks): + return + + if result.status == _TaskStatus.SUCCESS: + await self._handle_success_result(node, result) + return + + if result.status == _TaskStatus.FAILED: + self._on_failed_result(handler, node, result) + await self._handle_failed_result(node, result) + return + + if result.status == _TaskStatus.SKIPPED: + await self._handle_skipped_result(node, result) + return + + if result.status == _TaskStatus.IN_PROGRESS: + self._on_in_progress_result(handler, node, result) + await self._handle_in_progress_result(node, result, async_tasks) + return + + def _write_back_data_id_to_data(self, node, data_id: str) -> None: + data = node.get_data() + if data is None: + return + + schema = node.get_schema() + candidate_keys = ["id", "_id"] + model_fields = get_pydantic_model_fields(schema) + + for key in candidate_keys: + if key in data: + data[key] = data_id + node.set_data(data) + return + if key in model_fields: + data[key] = data_id + node.set_data(data) + return + + async def _apply_success_result(self, node, data_id: Optional[str], previous_data_id: str) -> None: + from ..common.types import SyncAction + + if data_id and node.action == SyncAction.CREATE: + if node.data_id != data_id: + raise RuntimeError( + f"[{node.node_type}] data_id must be updated in event apply path: expected={data_id}, actual={node.data_id}" + ) + self._write_back_data_id_to_data(node, data_id) + + if self._collection is not None and data_id != previous_data_id: + await self._collection.update(node) + + if node.action == SyncAction.UPDATE: + current_data = node.get_data() + if current_data is not None: + node.set_origin_data(current_data) + + if node.action == SyncAction.DELETE: + if self._collection is None: + return + await self._collection.delete(node.node_id) + return + + # 成功后 action 是否重置由上层策略决定 + + async def _poll_async_tasks( + self, + handler: "NodeHandler", + async_tasks: Dict[str, str] + ) -> None: + """ + 轮询异步任务直到全部完成 + + Args: + handler: 节点处理器 + collection: Collection 上下文 + async_tasks: {node_id: task_id} 映射 + + 流程: + 1. 批量调用 Handler.poll_tasks() + 2. 更新节点状态 + 3. 如果还有未完成任务,等待后重试 + """ + from .task_result import TaskStatus as _TaskStatus + + max_retries = self._poll_max_retries + retry_count = 0 + poll_interval = self._poll_interval # 轮询间隔(秒) + + if self._collection is None: + # Collection 未设置,无法轮询任务 + return + + if async_tasks and poll_interval > 0: + logger.info( + f"[{handler.node_type}] push_id首次检查前等待 {poll_interval:.3f}s, pending={len(async_tasks)}" + ) + await asyncio.sleep(poll_interval) + + while async_tasks and retry_count < max_retries: + logger.info( + f"[{handler.node_type}] push_id检查 {retry_count + 1}/{max_retries}, pending={len(async_tasks)}" + ) + # 批量查询 + task_ids = list(async_tasks.values()) + results = await handler.poll_tasks(task_ids) + + # 处理结果 + completed_nodes = [] + for node_id, task_id in list(async_tasks.items()): + if task_id not in results: + continue + + result = results[task_id] + node = self._collection.get(node_id) + if not node: + completed_nodes.append(node_id) + continue + + if result.status == _TaskStatus.SUCCESS: + self._on_poll_result(handler, node, task_id, result) + previous_data_id = node.data_id + ok = self._apply_sync_execute_state( + node, + handler_status=result.status, + detail=f"异步任务成功完成: {task_id}", + result_data_id=result.data_id, + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] async SUCCESS cannot map to state machine: node={node.node_id}") + self._record_action_result(node, result.status) + await self._apply_success_result(node, result.data_id, previous_data_id=previous_data_id) + node.error = None + logger.info( + f"[{handler.node_type}] polling成功: node={node.node_id}, push_id={task_id}, data_id={result.data_id or node.data_id}" + ) + completed_nodes.append(node_id) + + elif result.status == _TaskStatus.FAILED: + self._on_poll_result(handler, node, task_id, result) + ok = self._apply_sync_execute_state( + node, + handler_status=result.status, + detail=f"异步任务失败: {result.error}", + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] async FAILED cannot map to state machine: node={node.node_id}") + self._record_action_result(node, result.status) + node.error = result.error + completed_nodes.append(node_id) + + # IN_PROGRESS 继续等待 + + # 移除已完成的任务 + for node_id in completed_nodes: + async_tasks.pop(node_id, None) + + # 还有未完成任务,等待后重试 + if async_tasks: + retry_count += 1 + + # 超时未完成的任务标记为失败 + if async_tasks: + for node_id in async_tasks: + node = self._collection.get(node_id) + if node: + timeout_msg = f"异步任务超时 (等待 {max_retries * poll_interval} 秒后仍未完成)" + ok = self._apply_sync_execute_state( + node, + handler_status=_TaskStatus.FAILED, + poll_timeout=True, + detail=timeout_msg, + ) + if not ok: + raise RuntimeError(f"[{node.node_type}] poll timeout cannot map to state machine: node={node.node_id}") + node.error = f"Async task timeout after {max_retries * poll_interval} seconds" + self._record_action_result(node, _TaskStatus.FAILED) + + # ========== 统计信息 ========== + + def get_sync_summary(self, collection: "DataCollection") -> Dict[str, Any]: + """ + 获取同步统计信息 + + Returns: + { + "total": 总节点数, + "success": 成功数, + "failed": 失败数, + "in_progress": 进行中, + "skipped": 跳过数, + "by_type": {...} # 按类型统计 + } + """ + nodes = list(collection._nodes.values()) + + summary = { + "total": len(nodes), + "success": sum(1 for n in nodes if n.status == SyncStatus.SUCCESS), + "failed": sum(1 for n in nodes if n.status == SyncStatus.FAILED), + "in_progress": sum(1 for n in nodes if n.status == SyncStatus.IN_PROGRESS), + "skipped": sum(1 for n in nodes if n.status == SyncStatus.SKIPPED), + "by_type": {} + } + + # 按类型统计 + for node_type in self._handlers.keys(): + type_nodes = collection.filter(node_type=node_type) + summary["by_type"][node_type] = { + "total": len(type_nodes), + "success": sum(1 for n in type_nodes if n.status == SyncStatus.SUCCESS), + "failed": sum(1 for n in type_nodes if n.status == SyncStatus.FAILED), + } + + return summary + + async def close(self) -> None: + """关闭数据源资源(子类可覆盖以实现特定的清理逻辑)""" + pass # 基类默认空实现 diff --git a/sync_state_machine/datasource/handler.py b/sync_state_machine/datasource/handler.py new file mode 100644 index 0000000..8db0f98 --- /dev/null +++ b/sync_state_machine/datasource/handler.py @@ -0,0 +1,579 @@ +""" +节点处理器 V2 (Node Handler - Pure Execution Layer) + +Handler 职责: +1. 执行后端 API 调用(load/create/update/delete) +2. 返回执行结果(TaskResult) +3. 提供异步任务轮询(poll) +4. 提供数据质量检查(validate) + +Handler 不负责: +- ❌ 状态管理(由 DataSource 负责) +- ❌ ID 映射(由 Strategy 负责,已保存在 node.data) +- ❌ 依赖关系(由 Strategy 负责) +""" +from __future__ import annotations + +from typing import ( + TypeVar, Generic, Type, Protocol, Dict, List, Any, Optional, + runtime_checkable, TYPE_CHECKING +) +from abc import ABC, abstractmethod +from pydantic import BaseModel + +from .task_result import TaskResult + +if TYPE_CHECKING: + from ..common.sync_node import SyncNode + from ..common.collection import DataCollection + from .api.client import ApiClient + +T = TypeVar("T", bound=BaseModel) + + +class ValidationResult: + """数据质量检查结果""" + def __init__(self, is_valid: bool, errors: Optional[List[str]] = None): + self.is_valid = is_valid + self.errors = errors or [] + + +@runtime_checkable +class NodeHandler(Protocol[T]): + """ + 节点处理器协议(纯执行层) + + Handler 只负责调用后端 API,不管理状态。 + """ + + @property + def node_type(self) -> str: + """节点类型(如 'contract')""" + ... + + @property + def node_class(self) -> Type["SyncNode[T]"]: + """SyncNode 类型""" + ... + + @property + def schema(self) -> Type[T]: + """Schema 类型""" + ... + + def set_collection(self, collection: "DataCollection") -> None: + """ + 设置 Collection 引用 + + Args: + collection: 数据集合 + """ + ... + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + """注入项目过滤列表。默认可忽略。""" + ... + + def set_api_client(self, client: "ApiClient") -> None: + """注入 API 客户端。默认可忽略。""" + ... + + def set_poll_mode(self, mode: str) -> None: + """设置轮询模式。默认可忽略。""" + ... + + def get_update_fields(self, *, exclude: frozenset[str] = frozenset({"id"})) -> List[str]: + """返回 post-check 可比较字段列表。默认空。""" + ... + + async def load(self) -> List['SyncNode']: + """ + 从后端加载全部数据并创建节点 + + 注意:调用前需先 set_collection() + + Returns: + SyncNode 列表 + + 示例: + # Project Handler(无依赖) + async def load(self): + response = await self.api.get_projects() + nodes = [] + for data in response["data"]: + node = self.create_node(data) + node.context["project_id"] = data["id"] + nodes.append(node) + return nodes + + # Contract Handler(依赖 Project) + async def load(self): + # 使用 self._collection 查询依赖 + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + nodes = [] + for project_id in project_ids: + response = await self.api.get_contracts(project_id=project_id) + for data in response["data"]: + node = self.create_node(data) + node.context["project_id"] = project_id + node.context["contract_id"] = data["id"] + nodes.append(node) + return nodes + """ + ... + + async def create_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """ + 批量创建节点 + + Args: + nodes: 需要创建的节点列表(DataSource 已筛选为 CREATE + PENDING) + + Returns: + List[TaskResult]: + 每个 TaskResult 必须包含 node_id,用于定位节点: + - TaskResult(status=SUCCESS, node_id="xxx", data_id="yyy") + - TaskResult(status=FAILED, node_id="xxx", error="...") + - TaskResult(status=IN_PROGRESS, node_id="xxx", task_id="...") + + 示例: + # JSONL Handler + async def create_all(self, nodes): + results = [] + for node in nodes: + try: + new_id = str(uuid4()) + data = node.get_data() + # ... 存储逻辑 ... + results.append(TaskResult.success( + node_id=node.node_id, + data_id=new_id + )) + except Exception as e: + results.append(TaskResult.failed( + node_id=node.node_id, + error=str(e) + )) + return results + + # API Handler - 查询依赖 + async def create_all(self, nodes): + results = [] + for node in nodes: + # 查询依赖数据(如合同创建时查项目) + project_id = node.context.get("project_id") + projects = self._collection.filter( + node_type="project", + node_filter={"data_id": project_id} + ) + + if not projects: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Project {project_id} not found" + )) + continue + + # 构造请求数据 + data = node.get_data() + if not data: + results.append(TaskResult.failed( + node_id=node.node_id, + error="node data is None" + )) + continue + + contract_data = { + "project_id": projects[0].data_id, + **data + } + + # 调用 API + response = await self.api.create_contract(contract_data) + results.append(TaskResult.success( + node_id=node.node_id, + data_id=response["id"] + )) + + return results + """ + ... + + async def update_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """ + 批量更新节点 + + Args: + nodes: 需要更新的节点列表(DataSource 已筛选为 UPDATE + PENDING) + + Returns: + List[TaskResult](同 create_all) + """ + ... + + async def delete_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """ + 批量删除节点 + + Args: + nodes: 需要删除的节点列表(DataSource 已筛选为 DELETE + PENDING) + + Args: + collection: Collection 上下文 + + Returns: + List[TaskResult](同 create_all) + """ + ... + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """ + 批量轮询异步任务状态 + + Args: + task_ids: 任务 ID 列表 + + Returns: + {task_id: TaskResult} 字典 + - SUCCESS: 任务完成,返回 data_id + - FAILED: 任务失败,返回 error + - IN_PROGRESS: 仍在进行中 + + 示例: + async def poll_tasks(self, task_ids): + response = await self.api.batch_query_tasks(task_ids) + results = {} + for task in response["tasks"]: + if task["status"] == "completed": + results[task["id"]] = TaskResult.success( + data_id=task["result"]["contract_id"] + ) + elif task["status"] == "failed": + results[task["id"]] = TaskResult.failed( + error=task["error"] + ) + else: # running + results[task["id"]] = TaskResult.in_progress( + task_id=task["id"] + ) + return results + """ + ... + + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + """ + 数据质量检查 + + Args: + data: 原始数据 + + Returns: + ValidationResult(是否有效 + 错误列表) + + 示例: + async def validate(self, data): + errors = [] + if not data.get("code"): + errors.append("合同编码为空") + if not data.get("project_id"): + errors.append("项目 ID 为空") + + return ValidationResult( + is_valid=len(errors) == 0, + errors=errors + ) + """ + ... + + def extract_id(self, data: Dict[str, Any]) -> str: + """ + 从原始数据提取 ID + + Args: + data: 原始数据 + + Returns: + 业务主键 + """ + ... + + def _create_node(self, data: Dict[str, Any]) -> "SyncNode[T]": + """ + 从原始数据创建 SyncNode + + Args: + data: 原始数据 + + Returns: + 类型化的 SyncNode + """ + ... + + +class BaseNodeHandler(ABC, Generic[T]): + """ + 节点处理器基类 + + 子类需实现: + - load() + - create() + - update() + - delete()(可选) + - poll_tasks()(如果支持异步) + - validate()(可选) + - extract_id() + """ + + def __init__( + self, + node_type: str, + node_class: Type["SyncNode[T]"], + schema: Type[T] + ): + self._node_type = node_type + self._node_class = node_class + self._schema = schema + self._collection: Optional["DataCollection"] = None + + def set_collection(self, collection: "DataCollection") -> None: + """ + 设置 Collection 引用 + + Args: + collection: 数据集合 + """ + self._collection = collection + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + """默认忽略项目过滤能力。""" + return + + def set_api_client(self, client: "ApiClient") -> None: + """默认忽略 API 客户端注入。""" + return + + def set_poll_mode(self, mode: str) -> None: + """默认忽略轮询模式。""" + return + + def get_update_fields(self, *, exclude: frozenset[str] = frozenset({"id"})) -> List[str]: + """默认无 post-check 字段白名单。""" + return [] + + @property + def node_type(self) -> str: + return self._node_type + + @property + def node_class(self) -> Type["SyncNode[T]"]: + return self._node_class + + @property + def schema(self) -> Type[T]: + return self._schema + + # ========== 必须实现 ========== + + @abstractmethod + async def load(self) -> List['SyncNode']: + """ + 从数据源加载数据并创建节点 + + Handler 负责: + 1. 加载原始数据 + 2. 创建 SyncNode(调用 create_node) + 3. 设置 context(如 project_id, contract_id 等) + + Returns: + SyncNode 列表 + """ + pass + + @abstractmethod + async def create_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """批量创建节点""" + pass + + @abstractmethod + async def update_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """批量更新节点""" + pass + + @abstractmethod + def extract_id(self, data: Dict[str, Any]) -> str: + """提取 ID""" + pass + + # ========== 可选实现 ========== + + async def delete_all( + self, + nodes: List["SyncNode"] + ) -> List[TaskResult]: + """批量删除节点(默认不支持)""" + return [ + TaskResult.failed(node_id=node.node_id, error="Delete operation not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务(默认不支持)""" + return { + task_id: TaskResult.failed(error="Async tasks not supported") + for task_id in task_ids + } + + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + """数据质量检查(默认不检查)""" + return ValidationResult(is_valid=True) + + def create_node(self, data: Dict[str, Any]) -> "SyncNode[T]": + """创建或复用 SyncNode(默认实现)""" + data_id = self.extract_id(data) + if self._collection is None: + raise RuntimeError("Collection not set. Call set_collection() before create_node().") + + if data_id: + existing_node = self._collection.get_by_data_id(self.node_type, data_id) + if existing_node is not None: + existing_node.set_data(data.copy()) + existing_node.set_origin_data(data.copy()) + return existing_node + + node_id = self._collection.generate_node_id() + + return self.node_class( + node_id=node_id, + data_id=data_id, + data=data.copy() + ) + + def _create_node(self, data: Dict[str, Any]) -> "SyncNode[T]": + """兼容 NodeHandler 协议的默认实现""" + return self.create_node(data) + + +class CompatibleNodeHandler(Generic[T]): + """兼容旧式 Handler,实现扩展后的可选接口并委托给原对象。""" + + def __init__(self, handler: NodeHandler[T]): + self._handler = handler + + @property + def node_type(self) -> str: + return self._handler.node_type + + @property + def node_class(self) -> Type["SyncNode[T]"]: + return self._handler.node_class + + @property + def schema(self) -> Type[T]: + return self._handler.schema + + def set_collection(self, collection: "DataCollection") -> None: + self._handler.set_collection(collection) + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + method = getattr(self._handler, "set_target_project_ids", None) + if callable(method): + method(target_project_ids) + + def set_api_client(self, client: "ApiClient") -> None: + method = getattr(self._handler, "set_api_client", None) + if callable(method): + method(client) + + def set_poll_mode(self, mode: str) -> None: + method = getattr(self._handler, "set_poll_mode", None) + if callable(method): + method(mode) + + def get_update_fields(self, *, exclude: frozenset[str] = frozenset({"id"})) -> List[str]: + method = getattr(self._handler, "get_update_fields", None) + if callable(method): + return method(exclude=exclude) + return [] + + async def load(self) -> List["SyncNode"]: + return await self._handler.load() + + async def create_all(self, nodes: List["SyncNode"]) -> List[TaskResult]: + return await self._handler.create_all(nodes) + + async def update_all(self, nodes: List["SyncNode"]) -> List[TaskResult]: + return await self._handler.update_all(nodes) + + async def delete_all(self, nodes: List["SyncNode"]) -> List[TaskResult]: + return await self._handler.delete_all(nodes) + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + return await self._handler.poll_tasks(task_ids) + + async def validate(self, data: Dict[str, Any]) -> ValidationResult: + return await self._handler.validate(data) + + def extract_id(self, data: Dict[str, Any]) -> str: + return self._handler.extract_id(data) + + def _create_node(self, data: Dict[str, Any]) -> "SyncNode[T]": + return self._handler._create_node(data) + + def __getattr__(self, item: str) -> Any: + return getattr(self._handler, item) + + +def ensure_handler_compat(handler: NodeHandler[T]) -> NodeHandler[T]: + if isinstance(handler, BaseNodeHandler) or isinstance(handler, CompatibleNodeHandler): + return handler + return CompatibleNodeHandler(handler) + + +class NodeHandlerRegistry: + """节点处理器注册表""" + + _handlers: Dict[str, NodeHandler] = {} + + @classmethod + def register(cls, node_type: str, handler: NodeHandler) -> None: + """注册 handler""" + cls._handlers[node_type] = handler + + @classmethod + def get(cls, node_type: str) -> NodeHandler: + """获取 handler""" + if node_type not in cls._handlers: + raise KeyError(f"Handler for '{node_type}' not registered") + return cls._handlers[node_type] + + @classmethod + def has(cls, node_type: str) -> bool: + """检查是否已注册""" + return node_type in cls._handlers + + @classmethod + def clear(cls) -> None: + """清空注册表""" + cls._handlers.clear() + + @classmethod + def list_handlers(cls) -> List[str]: + """列出所有已注册的 node_type""" + return list(cls._handlers.keys()) diff --git a/sync_state_machine/datasource/jsonl/__init__.py b/sync_state_machine/datasource/jsonl/__init__.py new file mode 100644 index 0000000..0e1a078 --- /dev/null +++ b/sync_state_machine/datasource/jsonl/__init__.py @@ -0,0 +1,13 @@ +""" +JSONL DataSource 模块 + +提供基于 JSONL 文件的数据源实现,用于测试和本地开发。 +""" + +from .datasource import JsonlDataSource +from .handler import BaseJsonlHandler + +__all__ = [ + "JsonlDataSource", + "BaseJsonlHandler", +] diff --git a/sync_state_machine/datasource/jsonl/datasource.py b/sync_state_machine/datasource/jsonl/datasource.py new file mode 100644 index 0000000..6e3fc8f --- /dev/null +++ b/sync_state_machine/datasource/jsonl/datasource.py @@ -0,0 +1,67 @@ +""" +JsonlDataSource - JSONL 文件数据源 + +职责: +- 提供 JSONL 文件目录管理 +- 实现 DataSource 接口(load_all, sync_all) +- 管理内存缓存和文件写入 +- 统一异常处理和状态管理 +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Dict, Any, Set + +from ..datasource import BaseDataSource + + + + +class JsonlDataSource(BaseDataSource): + """ + JSONL 文件数据源 + + 提供文件路径和基础功能,具体的文件查找和读取由各个 Handler 负责。 + + Args: + dir_path: JSONL 文件目录 + read_only: 是否只读模式 + + 示例: + datasource = JsonlDataSource(Path("filtered_datasource/datasource/ecm-2025-12-02")) + datasource.register_handler(ContractJsonlHandler(datasource)) + + collection = DataCollection() + datasource.set_collection(collection) + await datasource.load_all(order=["project", "contract"]) + await datasource.sync_all(order=["project", "contract"]) + """ + + def __init__(self, dir_path: Path, read_only: bool = False): + super().__init__() + self.dir_path = Path(dir_path) + self.read_only = read_only + + # 用于 create/update/delete 的内存缓存 + self._data: Dict[str, Dict[str, Dict[str, Any]]] = {} # {node_type: {id: data}} + self._dirty_types: Set[str] = set() + + def _on_node_loaded(self, handler, node) -> None: + node.append_log( + f"JSONL链路[load] dir={self.dir_path.as_posix()} node_type={node.node_type} data_id={node.data_id or ''}" + ) + + def _on_in_progress_result(self, handler, node, result) -> None: + node.append_log( + f"JSONL链路[submit] action={node.action.value} data_id={node.data_id or ''}" + ) + + def _on_poll_result(self, handler, node, task_id: str, result) -> None: + node.append_log( + f"JSONL链路[poll] task_id={task_id} status={result.status.value}" + ) + + # load_all 和 sync_all 继承自 BaseDataSource + # 保存逻辑在 BaseJsonlHandler 中实现 + diff --git a/sync_state_machine/datasource/jsonl/handler.py b/sync_state_machine/datasource/jsonl/handler.py new file mode 100644 index 0000000..96dc51c --- /dev/null +++ b/sync_state_machine/datasource/jsonl/handler.py @@ -0,0 +1,350 @@ +""" +BaseJsonlHandler - JSONL Handler 基类 + +职责: +- 查找和读取 JSONL 文件 +- 实现批量 Handler 接口(load, create_all, update_all, delete_all) +- 使用 datasource 的内存缓存 +- 返回 List[TaskResult](统一状态管理) +- 捕获所有异常并转换为 TaskResult.failed() +""" + +from __future__ import annotations + +import json +import re +from typing import Dict, List, Any, TYPE_CHECKING, Optional, Set +from uuid import uuid4 + +from ..handler import BaseNodeHandler +from ..task_result import TaskResult + +if TYPE_CHECKING: + from ...common.sync_node import SyncNode + from .datasource import JsonlDataSource + + +class BaseJsonlHandler(BaseNodeHandler): + """ + JSONL Handler 基类 + + 负责查找和读取对应的 JSONL 文件。 + + 示例: + class ContractJsonlHandler(BaseJsonlHandler): + def __init__(self, datasource: JsonlDataSource): + super().__init__( + datasource=datasource, + node_type="contract", + node_class=ContractSyncNode, + schema=ContractResponse + ) + """ + + def __init__( + self, + datasource: JsonlDataSource, + node_type: str, + node_class: type, + schema: type + ): + super().__init__(node_type, node_class, schema) + self.datasource = datasource + self._target_project_ids: Optional[Set[str]] = None + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + """注入项目过滤列表,供 load 阶段预过滤使用。""" + if target_project_ids: + self._target_project_ids = {str(pid) for pid in target_project_ids if str(pid)} + else: + self._target_project_ids = None + + def _should_skip_item_by_project_filter(self, item: Dict[str, Any], item_id: str) -> bool: + if not self._target_project_ids: + return False + if self.node_type == "project": + return item_id not in self._target_project_ids + + project_id = item.get("project_id") + if project_id: + return str(project_id) not in self._target_project_ids + return False + + async def load(self) -> List['SyncNode']: + """ + 查找并加载对应的 JSONL 文件并创建节点 + + 文件命名规则:{node_type}_N.jsonl (N 为数字) + 例如:contract_1.jsonl, contract_2.jsonl + + 注意:load 操作的异常由 DataSource 的 load_all 捕获处理 + """ + nodes = [] + + if not self.datasource.dir_path.exists(): + return nodes + + # 查找所有匹配的文件:{node_type}_N.jsonl + pattern = re.compile(rf"^{re.escape(self.node_type)}_\d+\.jsonl$") + + for file_path in self.datasource.dir_path.iterdir(): + if not pattern.match(file_path.name): + continue + + # 读取文件 + with open(file_path, "r", encoding="utf-8") as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + if not line: + continue + + try: + item = json.loads(line) + item_id = self.extract_id(item) + + if self._should_skip_item_by_project_filter(item, item_id): + continue + + # 创建节点 + node = self.create_node(item) + nodes.append(node) + + # 同时加载到缓存 + if item_id: + bucket = self.datasource._data.setdefault(self.node_type, {}) + bucket[item_id] = item + + except json.JSONDecodeError as e: + print(f"Warning: Invalid JSON in {file_path.name}:{line_num}: {e}") + # 继续处理下一行 + + return nodes + + def extract_id(self, data: Dict[str, Any]) -> str: + """ + 提取数据 ID + + 默认实现:优先使用 'id',其次 '_id' + 子类可重写此方法。 + + Args: + data: 数据字典 + + Returns: + 数据 ID + """ + return str(data.get("id") or data.get("_id") or "") + + async def create_all( + self, + nodes: List['SyncNode'] + ) -> List[TaskResult]: + """ + 批量创建节点 + + Args: + nodes: 需要创建的节点列表(DataSource 已筛选为 CREATE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + results = [] + + for node in nodes: + try: + # 生成新 ID(如果没有) + if not node.data_id: + new_id = str(uuid4()) + else: + new_id = node.data_id + + # 获取数据字典 + # 使用 exclude_unset=False 以确保测试中的完整性校验(如 amount 字段)能通过 + # 因为 JSONL 存储通常需要完整记录 + data_dict = node.get_data(exclude_unset=False) + if data_dict is None: + results.append(TaskResult.failed( + node_id=node.node_id, + error="Cannot get data from node" + )) + continue + + # 设置 ID 和 type + data_dict["id"] = new_id + data_dict["_id"] = new_id + if "type" not in data_dict: + data_dict["type"] = self.node_type + + # 存储到缓存 + bucket = self.datasource._data.setdefault(self.node_type, {}) + bucket[new_id] = data_dict + self.datasource._dirty_types.add(self.node_type) + + results.append(TaskResult.success( + node_id=node.node_id, + data_id=new_id + )) + + except Exception as e: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Create failed: {str(e)}" + )) + + # 自动保存到文件 + await self._save_to_file() + + return results + + async def update_all( + self, + nodes: List['SyncNode'] + ) -> List[TaskResult]: + """ + 批量更新节点 + + Args: + nodes: 需要更新的节点列表(DataSource 已筛选为 UPDATE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + results = [] + + for node in nodes: + try: + if not node.data_id: + results.append(TaskResult.failed( + node_id=node.node_id, + error="Cannot update node without data_id" + )) + continue + + # 获取数据字典 + # JSONL 更新通常也是完整记录替换,所以使用 exclude_unset=False + data_dict = node.get_data(exclude_unset=False) + if data_dict is None: + results.append(TaskResult.failed( + node_id=node.node_id, + error="Cannot get data from node" + )) + continue + + # 检查是否存在 + bucket = self.datasource._data.get(self.node_type, {}) + existing = bucket.get(node.data_id) + if existing is None: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Item {node.data_id} not found" + )) + continue + + # 合并更新 + existing.update(data_dict) + existing["id"] = node.data_id + existing["_id"] = node.data_id + if "type" not in existing: + existing["type"] = self.node_type + + # 更新缓存 + bucket[node.data_id] = existing + self.datasource._dirty_types.add(self.node_type) + + results.append(TaskResult.success( + node_id=node.node_id, + data_id=node.data_id + )) + + except Exception as e: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Update failed: {str(e)}" + )) + + # 自动保存到文件 + await self._save_to_file() + + return results + + async def _save_to_file(self) -> None: + """ + 将缓存数据写回 JSONL 文件 + + 在批量操作(create_all/update_all/delete_all)后自动调用。 + """ + if self.datasource.read_only: + return + + if self.node_type not in self.datasource._dirty_types: + return + + items = self.datasource._data.get(self.node_type, {}) + if not items: + # 如果缓存为空,可能是删除了所有数据,仍需写入空文件 + pass + + try: + # 写入到 {node_type}_1.jsonl + file_path = self.datasource.dir_path / f"{self.node_type}_1.jsonl" + file_path.parent.mkdir(parents=True, exist_ok=True) + + with open(file_path, "w", encoding="utf-8") as f: + for item in items.values(): + f.write(json.dumps(item, ensure_ascii=False) + "\n") + + # 清除该类型的 dirty 标记 + self.datasource._dirty_types.discard(self.node_type) + + except Exception as e: + print(f"Error saving {self.node_type}: {str(e)}") + # 不抛出异常,继续执行 + + async def delete_all( + self, + nodes: List['SyncNode'] + ) -> List[TaskResult]: + """ + 批量删除节点 + + Args: + nodes: 需要删除的节点列表(DataSource 已筛选为 DELETE + PENDING) + + Returns: + List[TaskResult],每个结果关联 node_id + """ + results = [] + + for node in nodes: + try: + if not node.data_id: + results.append(TaskResult.failed( + node_id=node.node_id, + error="Cannot delete node without data_id" + )) + continue + + # 删除缓存 + bucket = self.datasource._data.get(self.node_type, {}) + if node.data_id in bucket: + del bucket[node.data_id] + self.datasource._dirty_types.add(self.node_type) + results.append(TaskResult.success( + node_id=node.node_id + )) + else: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Item {node.data_id} not found" + )) + + except Exception as e: + results.append(TaskResult.failed( + node_id=node.node_id, + error=f"Delete failed: {str(e)}" + )) + + # 自动保存到文件 + await self._save_to_file() + + return results diff --git a/sync_state_machine/datasource/task_result.py b/sync_state_machine/datasource/task_result.py new file mode 100644 index 0000000..f4b9ea8 --- /dev/null +++ b/sync_state_machine/datasource/task_result.py @@ -0,0 +1,122 @@ +""" +TaskResult - Handler 执行结果 + +统一的任务执行结果,用于所有 DataSource 的 Handler。 +""" + +from enum import Enum +from typing import Dict, Any, Optional + + +class TaskStatus(Enum): + """任务执行状态""" + SUCCESS = "success" # 同步完成,立即成功 + FAILED = "failed" # 同步失败 + IN_PROGRESS = "in_progress" # 异步任务进行中 + SKIPPED = "skipped" # 跳过(无实际更新或不符合更新条件) + + +class TaskResult: + """ + Handler 执行结果 + + 用于封装 create/update/delete 操作的返回值。 + 适用于所有 DataSource(API、JSONL 等)。 + 支持批量操作时通过 node_id 定位结果。 + """ + def __init__( + self, + status: TaskStatus, + node_id: Optional[str] = None, + data_id: Optional[str] = None, + task_id: Optional[str] = None, + push_id: Optional[str] = None, + error: Optional[str] = None, + sync_log: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None + ): + """ + Args: + status: 任务状态(SUCCESS/FAILED/IN_PROGRESS) + node_id: 关联的节点 ID(批量操作时用于定位节点) + data_id: 成功时返回的业务 ID(CREATE 操作必需) + task_id: 异步任务 ID(status=IN_PROGRESS 时必需) + push_id: 推送请求 ID(用于统一 push/poll 跟踪) + error: 失败原因(status=FAILED 时必需) + sync_log: Debug/Info级别日志(SKIPPED时使用) + metadata: 其他元数据 + """ + normalized_metadata = dict(metadata or {}) + if push_id is None: + raw_push_id = normalized_metadata.get("push_id") + if isinstance(raw_push_id, str) and raw_push_id: + push_id = raw_push_id + elif push_id: + normalized_metadata.setdefault("push_id", push_id) + + self.status = status + self.node_id = node_id + self.data_id = data_id + self.task_id = task_id + self.push_id = push_id + self.error = error + self.sync_log = sync_log + self.metadata = normalized_metadata + + @classmethod + def success( + cls, + node_id: Optional[str] = None, + data_id: Optional[str] = None, + push_id: Optional[str] = None, + **metadata, + ) -> "TaskResult": + """创建成功结果""" + return cls(TaskStatus.SUCCESS, node_id=node_id, data_id=data_id, push_id=push_id, metadata=metadata) + + @classmethod + def failed( + cls, + node_id: Optional[str] = None, + error: str = "", + push_id: Optional[str] = None, + **metadata, + ) -> "TaskResult": + """创建失败结果""" + return cls(TaskStatus.FAILED, node_id=node_id, error=error, push_id=push_id, metadata=metadata) + + @classmethod + def skipped( + cls, + node_id: Optional[str] = None, + reason: str = "", + push_id: Optional[str] = None, + **metadata, + ) -> "TaskResult": + """创建跳过结果(无实际更新等)""" + return cls(TaskStatus.SKIPPED, node_id=node_id, sync_log=reason, push_id=push_id, metadata=metadata) + + @classmethod + def in_progress( + cls, + node_id: Optional[str] = None, + task_id: str = "", + push_id: Optional[str] = None, + **metadata, + ) -> "TaskResult": + """创建进行中结果""" + return cls(TaskStatus.IN_PROGRESS, node_id=node_id, task_id=task_id, push_id=push_id, metadata=metadata) + + def __repr__(self) -> str: + parts = [f"status={self.status.value}"] + if self.node_id: + parts.append(f"node_id={self.node_id}") + if self.data_id: + parts.append(f"data_id={self.data_id}") + if self.task_id: + parts.append(f"task_id={self.task_id}") + if self.push_id: + parts.append(f"push_id={self.push_id}") + if self.error: + parts.append(f"error={self.error!r}") + return f"TaskResult({', '.join(parts)})" diff --git a/sync_state_machine/domain/__init__.py b/sync_state_machine/domain/__init__.py new file mode 100644 index 0000000..1e480c3 --- /dev/null +++ b/sync_state_machine/domain/__init__.py @@ -0,0 +1,32 @@ +""" +Domain 模块 + +导入所有 domain 的 register 模块,触发 DomainRegistry 注册。 +""" + +# 导入所有 domain register,触发注册 +from .company import register as _company_register +from .user import register as _user_register +from .supplier import register as _supplier_register +from .project import register as _project_register +from .project_detail import register as _project_detail_register +from .contract import register as _contract_register +from .construction import register as _construction_register +from .construction_task_detail import register as _construction_task_detail_register +from .material import register as _material_register +from .material_detail import register as _material_detail_register +from .contract_settlement import register as _contract_settlement_register +from .contract_settlement_detail import register as _contract_settlement_detail_register +from .personnel import register as _personnel_register +from .personnel_detail import register as _personnel_detail_register +from .preparation import register as _preparation_register +from .production import register as _production_register +from .lar import register as _lar_register +from .lar_change import register as _lar_change_register +from .units import register as _units_register +from .contract_change import register as _contract_change_register +from .attachment import register as _attachment_register + +# 所有组件通过 DomainRegistry 访问,不再单独导出 +__all__ = [] + diff --git a/sync_state_machine/domain/attachment/__init__.py b/sync_state_machine/domain/attachment/__init__.py new file mode 100644 index 0000000..f348aa1 --- /dev/null +++ b/sync_state_machine/domain/attachment/__init__.py @@ -0,0 +1,8 @@ +""" +Attachment Domain +""" +from .sync_node import AttachmentSyncNode +from .sync_strategy import AttachmentSyncStrategy +from .jsonl_handler import AttachmentJsonlHandler + +__all__ = ["AttachmentSyncNode", "AttachmentSyncStrategy", "AttachmentJsonlHandler"] diff --git a/sync_state_machine/domain/attachment/api_handler.py b/sync_state_machine/domain/attachment/api_handler.py new file mode 100644 index 0000000..8a63b25 --- /dev/null +++ b/sync_state_machine/domain/attachment/api_handler.py @@ -0,0 +1,102 @@ +""" +Attachment API Handler + +职责: +- 加载附件列表(依赖 Project) +- 附件创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from .sync_node import AttachmentSyncNode, AttachmentSchema + + +class AttachmentApiHandler(BaseApiHandler): + """附件 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "attachment" + self._node_class = AttachmentSyncNode + self._schema = AttachmentSchema + + async def load(self) -> List[SyncNode]: + """加载附件列表(依赖 Project)""" + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + return [] + + all_attachments = [] + for project_id in project_ids: + try: + attachments = await api_get_attachment_list(self.api_client, project_id) + all_attachments.extend(attachments) + except Exception as e: + print(f"❌ Failed to load attachments for project {project_id}: {e}") + + return all_attachments + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建附件(已禁用)""" + return [ + TaskResult.failed(node_id=node.node_id, error="Attachment push disabled") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新附件(已禁用)""" + return [ + TaskResult.failed(node_id=node.node_id, error="Attachment push disabled") + for node in nodes + ] + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除附件(已禁用)""" + return [ + TaskResult.failed(node_id=node.node_id, error="Attachment push disabled") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_attachment_list(client, project_id: str) -> List[Dict[str, Any]]: + response = await client.request( + method="GET", + endpoint="/attachment/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("list", []) + + +async def api_create_attachment(client, data: Dict[str, Any], push_id: str, biz_id: str) -> Dict[str, Any]: + request_data = {"push_id": push_id, "biz_id": biz_id, **data} + response = await client.request(method="POST", endpoint="/attachment/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_delete_attachment(client, attachment_id: str, push_id: str, biz_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": biz_id, "id": attachment_id} + response = await client.request(method="DELETE", endpoint="/attachment/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/attachment/jsonl_handler.py b/sync_state_machine/domain/attachment/jsonl_handler.py new file mode 100644 index 0000000..c0f011d --- /dev/null +++ b/sync_state_machine/domain/attachment/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Attachment JSONL Handler +""" +from typing import Dict, Any +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import AttachmentSyncNode + + +class AttachmentJsonlHandler(BaseJsonlHandler): + """附件 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "attachment", AttachmentSyncNode, Dict[str, Any]) diff --git a/sync_state_machine/domain/attachment/register.py b/sync_state_machine/domain/attachment/register.py new file mode 100644 index 0000000..1cff46c --- /dev/null +++ b/sync_state_machine/domain/attachment/register.py @@ -0,0 +1,16 @@ +"""Attachment domain registration""" +from ...common.registry import DomainRegistry +from .sync_node import AttachmentSyncNode, AttachmentSchema +from .sync_strategy import AttachmentSyncStrategy +from .jsonl_handler import AttachmentJsonlHandler +from .api_handler import AttachmentApiHandler + +# 注册 attachment domain +DomainRegistry.register( + node_type="attachment", + schema=AttachmentSchema, + node_class=AttachmentSyncNode, + strategy_class=AttachmentSyncStrategy, + jsonl_handler_class=AttachmentJsonlHandler, + api_handler_class=AttachmentApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/attachment/sync_node.py b/sync_state_machine/domain/attachment/sync_node.py new file mode 100644 index 0000000..514c298 --- /dev/null +++ b/sync_state_machine/domain/attachment/sync_node.py @@ -0,0 +1,17 @@ +""" +Attachment Domain +""" +from typing import Dict, Any +from pydantic import BaseModel, ConfigDict +from ...common import SyncNode + + +class AttachmentSchema(BaseModel): + """允许任意附件字段的 schema""" + model_config = ConfigDict(extra="allow") + + +class AttachmentSyncNode(SyncNode[Dict[str, Any]]): + """附件同步节点""" + node_type = "attachment" + schema = AttachmentSchema diff --git a/sync_state_machine/domain/attachment/sync_strategy.py b/sync_state_machine/domain/attachment/sync_strategy.py new file mode 100644 index 0000000..69c576b --- /dev/null +++ b/sync_state_machine/domain/attachment/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from .sync_node import AttachmentSchema + + +class AttachmentSyncStrategy(DefaultSyncStrategy[AttachmentSchema]): + """ + Attachment 同步策略(仅作为依赖,不执行同步动作)。 + """ + + schema = AttachmentSchema + + default_config = StrategyConfig( + auto_bind=False, + auto_bind_fields=[], + depend_fields={}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/company/__init__.py b/sync_state_machine/domain/company/__init__.py new file mode 100644 index 0000000..993532c --- /dev/null +++ b/sync_state_machine/domain/company/__init__.py @@ -0,0 +1,6 @@ +"""Company domain""" +from .sync_node import CompanySyncNode +from .sync_strategy import CompanySyncStrategy +from .jsonl_handler import CompanyJsonlHandler + +__all__ = ["CompanySyncNode", "CompanySyncStrategy", "CompanyJsonlHandler"] diff --git a/sync_state_machine/domain/company/api_handler.py b/sync_state_machine/domain/company/api_handler.py new file mode 100644 index 0000000..af8272f --- /dev/null +++ b/sync_state_machine/domain/company/api_handler.py @@ -0,0 +1,131 @@ +""" +Company API Handler (只读) + +职责: +- 加载公司列表 +- 不支持创建/更新/删除 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from .sync_node import CompanySyncNode +from schemas.company.company import CompanyResponse + + +class CompanyApiHandler(BaseApiHandler): + """公司 API Handler (只读)""" + + def __init__(self): + super().__init__() + self._node_type = "company" + self._node_class = CompanySyncNode + self._schema = CompanyResponse + + async def load(self) -> List[SyncNode]: + """加载公司列表(支持分页)""" + try: + nodes = [] + page = 1 + page_size = 1000 + + while True: + # 获取一页数据 + companies, total = await api_get_company_list( + self.api_client, + page=page, + page_size=page_size + ) + + # 没有数据了,退出循环 + if not companies: + break + + # 转换为节点 + for company_model in companies: + company_data = company_model.model_dump() + nodes.append(self._create_node(company_data)) + + # 检查是否还有下一页 + if page * page_size >= total: + break + + page += 1 + + return nodes + except Exception as e: + print(f"❌ Failed to load companies: {e}") + import traceback + traceback.print_exc() + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="Company creation not supported") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持更新""" + return [ + TaskResult.failed(node_id=node.node_id, error="Company update not supported") + for node in nodes + ] + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Company deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + return self._create_basic_node(data, depend_ids=[]) + + +# ========== 静态 API 函数 ========== + +async def api_get_company_list(client, page: int = 1, page_size: int = 100) -> tuple[List[CompanyResponse], int]: + """ + 获取公司列表 GET /company/list + + Args: + client: API客户端 + page: 页码,从1开始 + page_size: 每页大小 + + Returns: + tuple[List[CompanyResponse], int]: (验证过的公司列表, 总数) + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/company/list", + params={"page": page, "page_size": page_size} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + # V2 API 返回格式: {code: 200, data: {list: [...], total: 123, ...}} + data = response.get("data", {}) + items = data.get("list", []) + total = data.get("total", 0) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = CompanyResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid company item: {e}") + continue + + return validated_items, total diff --git a/sync_state_machine/domain/company/jsonl_handler.py b/sync_state_machine/domain/company/jsonl_handler.py new file mode 100644 index 0000000..f2d5f3c --- /dev/null +++ b/sync_state_machine/domain/company/jsonl_handler.py @@ -0,0 +1,11 @@ +"""Company Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import CompanySyncNode +from schemas.company.company import CompanyResponse + + +class CompanyJsonlHandler(BaseJsonlHandler): + """公司 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "company", CompanySyncNode, CompanyResponse) + diff --git a/sync_state_machine/domain/company/register.py b/sync_state_machine/domain/company/register.py new file mode 100644 index 0000000..7714768 --- /dev/null +++ b/sync_state_machine/domain/company/register.py @@ -0,0 +1,17 @@ +"""Company domain registration""" +from ...common.registry import DomainRegistry +from schemas.company.company import CompanyResponse +from .sync_node import CompanySyncNode +from .sync_strategy import CompanySyncStrategy +from .jsonl_handler import CompanyJsonlHandler +from .api_handler import CompanyApiHandler + +# 注册 company domain +DomainRegistry.register( + node_type="company", + schema=CompanyResponse, + node_class=CompanySyncNode, + strategy_class=CompanySyncStrategy, + jsonl_handler_class=CompanyJsonlHandler, + api_handler_class=CompanyApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/company/sync_node.py b/sync_state_machine/domain/company/sync_node.py new file mode 100644 index 0000000..345a7ef --- /dev/null +++ b/sync_state_machine/domain/company/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.company.company import CompanyResponse + + +class CompanySyncNode(SyncNode[CompanyResponse]): + """公司同步节点""" + node_type = "company" + schema = CompanyResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/company/sync_strategy.py b/sync_state_machine/domain/company/sync_strategy.py new file mode 100644 index 0000000..32049e0 --- /dev/null +++ b/sync_state_machine/domain/company/sync_strategy.py @@ -0,0 +1,29 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.company.company import CompanyResponse + + +class CompanySyncStrategy(DefaultSyncStrategy[CompanyResponse]): + """ + Company 同步策略 + + 业务规则: + 1. 使用 (code) 作为业务唯一键 + 2. 支持自动绑定 + 3. 默认配置为日常推送模式(本地创建推送到远程,不拉取远程孤儿) + + schema 已在类定义中设置,禁止在初始化时传入其他 schema。 + """ + + # 类变量:schema 固定为 ContractResponse + schema = CompanyResponse + + # 类变量:默认配置 + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["credit_code"], + depend_fields={}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.CREATE_LOCAL, + update_direction=UpdateDirection.PULL, + ) diff --git a/sync_state_machine/domain/construction/__init__.py b/sync_state_machine/domain/construction/__init__.py new file mode 100644 index 0000000..1168e33 --- /dev/null +++ b/sync_state_machine/domain/construction/__init__.py @@ -0,0 +1,6 @@ +"""Construction domain""" +from .sync_node import ConstructionTaskSyncNode +from .sync_strategy import ConstructionTaskSyncStrategy +from .jsonl_handler import ConstructionTaskJsonlHandler + +__all__ = ["ConstructionTaskSyncNode", "ConstructionTaskSyncStrategy", "ConstructionTaskJsonlHandler"] diff --git a/sync_state_machine/domain/construction/api_handler.py b/sync_state_machine/domain/construction/api_handler.py new file mode 100644 index 0000000..3ffbd40 --- /dev/null +++ b/sync_state_machine/domain/construction/api_handler.py @@ -0,0 +1,321 @@ +""" +Construction Task API Handler (V2) + +职责: +- 加载施工任务列表(依赖 Project) +- 施工任务创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ( + ERROR_NODE_DATA_NONE, + ERROR_VALIDATION_FAILED, + ERROR_PROJECT_ID_NOT_FOUND +) +from .sync_node import ConstructionTaskSyncNode +from schemas.construction.construction import ( + ConstructionResponse, + ConstructionCreate, + ConstructionUpdate, + ConstructionPlanUpdate +) + + +class ConstructionTaskApiHandler(BaseApiHandler): + """施工任务 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "construction_task" + self._node_class = ConstructionTaskSyncNode + self._schema = ConstructionResponse + self.update_schemas = [ConstructionCreate, ConstructionUpdate, ConstructionPlanUpdate] + + async def load(self) -> List[SyncNode]: + """加载施工任务列表(依赖 Project)""" + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + return [] + + all_tasks = [] + for project_id in project_ids: + try: + tasks = await api_get_construction_task_list(self.api_client, project_id) + for task in tasks: + # 已验证的 Pydantic model,转换为 dict + task_data = task.model_dump() + all_tasks.append(self._create_node(task_data)) + except Exception as e: + print(f"❌ Failed to load construction tasks for project {project_id}: {e}") + + return all_tasks + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建施工任务""" + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + project_id = node.context.get("project_id") or data.get("project_id") + if not project_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_PROJECT_ID_NOT_FOUND)) + continue + + push_id = self._generate_push_id() + + try: + # 验证并转换为 Pydantic model + from pydantic import ValidationError + create_data = {"project_id": project_id, **data} + try: + create_model = ConstructionCreate.model_validate(create_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + response = await api_create_construction_task(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新施工任务 + + 支持两种更新类型: + 1. ConstructionUpdate - 基础信息更新 (PUT /construction/update) + 业务逻辑:如果show_name字段不同,那么仅当type == 'QT'时才更新 + 2. ConstructionPlanUpdate - 计划信息更新 (PUT /construction/plan) + + 更新逻辑: + - 对每种 schema,将原始数据和新数据都转换为 schema 格式 + - dump 成字典后比较 + - 如果有差异且满足业务条件,调用对应 API + """ + results = [] + + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error="node data is None")) + continue + + origin_data = node.get_origin_data() or {} + biz_id = node.data_id or data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + node_updated = False + error = None + schema_status_lines: List[str] = [] + + # 1. 基础信息更新 (ConstructionUpdate) + # 业务逻辑:如果 show_name 字段不同,那么仅当 type == 'QT' 时才更新 + base_new_schema_error = self._validate_schema(data, ConstructionUpdate) + base_changed_fields = self._schema_changed_fields(ConstructionUpdate, data, origin_data) + base_update_called = False + base_update_error: str | None = None + if base_new_schema_error: + base_update_error = base_new_schema_error + elif base_changed_fields: + should_update = True + + if "show_name" in base_changed_fields: + task_type = data.get("task_type") or data.get("type") + if task_type != "QT": + should_update = False + + if should_update: + try: + update_model = ConstructionUpdate.model_validate(data) + push_id = self._generate_push_id() + await api_update_construction_task(self.api_client, update_model, push_id, biz_id) + node_updated = True + base_update_called = True + except Exception as e: + error = str(e) + base_update_error = str(e) + else: + base_update_error = "show_name changed but task_type != QT" + + schema_status_lines.append( + self._build_update_schema_status( + schema_name="ConstructionUpdate", + schema=ConstructionUpdate, + new_data=data, + origin_data=origin_data, + will_update=base_update_called, + update_error=base_update_error, + ) + ) + + # 2. 计划信息更新 (ConstructionPlanUpdate) + plan_new_schema_error = self._validate_schema(data, ConstructionPlanUpdate) + plan_changed_fields = self._schema_changed_fields(ConstructionPlanUpdate, data, origin_data) + plan_update_called = False + plan_update_error: str | None = None + if not error: + if plan_new_schema_error: + plan_update_error = plan_new_schema_error + elif plan_changed_fields: + try: + plan_model = ConstructionPlanUpdate.model_validate(data) + plan_dict = plan_model.model_dump(exclude_unset=True) + push_id = self._generate_push_id() + await api_update_construction_task_plan(self.api_client, plan_dict, push_id, biz_id) + node_updated = True + plan_update_called = True + except Exception as e: + error = str(e) + plan_update_error = str(e) + + schema_status_lines.append( + self._build_update_schema_status( + schema_name="ConstructionPlanUpdate", + schema=ConstructionPlanUpdate, + new_data=data, + origin_data=origin_data, + will_update=plan_update_called, + update_error=plan_update_error, + ) + ) + + for line in schema_status_lines: + node.append_log(f"UPDATE_SCHEMA: {line}") + + # 汇总结果 + if error: + results.append(TaskResult.failed(node_id=node.node_id, error=error)) + elif node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + else: + # 没有任何字段需要更新 + results.append(TaskResult.skipped( + node_id=node.node_id, + reason="No updatable fields changed | " + "; ".join(schema_status_lines) + )) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除施工任务""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_construction_task(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + node.context["task_id"] = node.data_id + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_construction_task_list(client, project_id: str) -> List[ConstructionResponse]: + response = await client.request( + method="GET", + endpoint="/construction/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + # 验证每个返回项 + from pydantic import ValidationError + validated_items = [] + for item in items: + try: + validated_item = ConstructionResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid item: {e}") + continue + + return validated_items + + +async def api_create_construction_task(client, data: ConstructionCreate, push_id: str) -> Dict[str, Any]: + request_data = {"push_id": push_id, "data": data.model_dump()} + response = await client.request(method="POST", endpoint="/construction/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_construction_task(client, data: ConstructionUpdate, push_id: str, biz_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/construction/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_get_construction_task(client, task_id: str) -> Dict[str, Any]: + """GET /construction - 获取单个施工任务""" + response = await client.request( + method="GET", + endpoint="/construction", + params={"task_id": task_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("data", {}) + + +async def api_update_construction_task_plan(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /construction/plan - 更新施工计划""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/construction/plan", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_construction_task(client, task_id: str, push_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": task_id} + response = await client.request(method="DELETE", endpoint="/construction/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/construction/jsonl_handler.py b/sync_state_machine/domain/construction/jsonl_handler.py new file mode 100644 index 0000000..c9c0da6 --- /dev/null +++ b/sync_state_machine/domain/construction/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Construction Task Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ConstructionTaskSyncNode +from schemas.construction.construction import ConstructionResponse + + +class ConstructionTaskJsonlHandler(BaseJsonlHandler): + """施工任务 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "construction_task", ConstructionTaskSyncNode, ConstructionResponse) diff --git a/sync_state_machine/domain/construction/register.py b/sync_state_machine/domain/construction/register.py new file mode 100644 index 0000000..5908fa3 --- /dev/null +++ b/sync_state_machine/domain/construction/register.py @@ -0,0 +1,17 @@ +"""Construction task domain registration""" +from ...common.registry import DomainRegistry +from schemas.construction.construction import ConstructionResponse +from .sync_node import ConstructionTaskSyncNode +from .sync_strategy import ConstructionTaskSyncStrategy +from .jsonl_handler import ConstructionTaskJsonlHandler +from .api_handler import ConstructionTaskApiHandler + +# 注册 construction_task domain +DomainRegistry.register( + node_type="construction_task", + schema=ConstructionResponse, + node_class=ConstructionTaskSyncNode, + strategy_class=ConstructionTaskSyncStrategy, + jsonl_handler_class=ConstructionTaskJsonlHandler, + api_handler_class=ConstructionTaskApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/construction/sync_node.py b/sync_state_machine/domain/construction/sync_node.py new file mode 100644 index 0000000..24e517b --- /dev/null +++ b/sync_state_machine/domain/construction/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.construction.construction import ConstructionResponse + + +class ConstructionTaskSyncNode(SyncNode[ConstructionResponse]): + """施工任务同步节点""" + node_type = "construction_task" + schema = ConstructionResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/construction/sync_strategy.py b/sync_state_machine/domain/construction/sync_strategy.py new file mode 100644 index 0000000..6c25cee --- /dev/null +++ b/sync_state_machine/domain/construction/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.construction.construction import ConstructionResponse + + +class ConstructionTaskSyncStrategy(DefaultSyncStrategy[ConstructionResponse]): + """ + Construction Task 同步策略(合同子业务)。 + """ + + schema = ConstructionResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["contract_id", "task_type"], + depend_fields={"contract_id": "contract", "project_id": "project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) diff --git a/sync_state_machine/domain/construction_task_detail/__init__.py b/sync_state_machine/domain/construction_task_detail/__init__.py new file mode 100644 index 0000000..28e9b44 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/__init__.py @@ -0,0 +1,8 @@ +""" +Construction Task Detail Domain +""" +from .sync_node import ConstructionTaskDetailSyncNode +from .sync_strategy import ConstructionTaskDetailSyncStrategy +from .jsonl_handler import ConstructionTaskDetailJsonlHandler + +__all__ = ["ConstructionTaskDetailSyncNode", "ConstructionTaskDetailSyncStrategy", "ConstructionTaskDetailJsonlHandler"] diff --git a/sync_state_machine/domain/construction_task_detail/api_handler.py b/sync_state_machine/domain/construction_task_detail/api_handler.py new file mode 100644 index 0000000..73b1832 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/api_handler.py @@ -0,0 +1,283 @@ +""" +Construction Task Detail API Handler (V2) + +职责: +- 加载施工明细列表(依赖 ConstructionTask) +- 施工明细创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_VALIDATION_FAILED, ERROR_ID_NOT_FOUND +from .sync_node import ConstructionTaskDetailSyncNode +from schemas.construction.construction_detail import ( + ConstructionDetailResponse, + ConstructionDetailCreate, + ConstructionDetailUpdate +) + + +class ConstructionTaskDetailApiHandler(BaseApiHandler): + """施工明细 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "construction_task_detail" + self._node_class = ConstructionTaskDetailSyncNode + self._schema = ConstructionDetailResponse + self.update_schemas = [ConstructionDetailCreate, ConstructionDetailUpdate] + + async def load(self) -> List[SyncNode]: + """加载施工明细列表(依赖 ConstructionTask)""" + tasks = self._collection.filter(node_type="construction_task") + task_ids = [t.data_id for t in tasks if t.data_id] + + if not task_ids: + return [] + + all_details = [] + for task_id in task_ids: + try: + details = await api_get_construction_task_detail_list(self.api_client, task_id) + for detail_model in details: + # 已验证的 Pydantic model,转换为 dict + detail_data = detail_model.model_dump() + all_details.append(self._create_node(detail_data)) + except Exception as e: + print(f"❌ Failed to load construction details for task {task_id}: {e}") + + return all_details + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建施工明细""" + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 从data的parent_id获取task_id + task_id = data.get("parent_id") + if not task_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_ID_NOT_FOUND)) + continue + + # 验证并转换为 Pydantic model + try: + create_data = {"task_id": task_id, **data} + create_model = ConstructionDetailCreate.model_validate(create_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + try: + response = await api_create_construction_task_detail(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新施工明细 + + 按 task_id 分组,每组使用同一个 push_id 批量提交 + """ + from pydantic import ValidationError + from collections import defaultdict + + results = [] + + # 按 task_id 分组 + groups: Dict[str, List[tuple[SyncNode, Dict[str, Any]]]] = defaultdict(list) + + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + + # 使用 _get_schema_diff 检查差异并打印日志 + diff_fields = self._get_schema_diff(ConstructionDetailUpdate, data, origin_data, node.node_id) + if not diff_fields: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 获取 task_id(parent_id) + task_id = data.get("parent_id") or node.context.get("task_id") + if not task_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing task_id (parent_id)")) + continue + + # 需要完整的 schema 数据(包括必填字段) + update_data = self._filter_update_data(data, origin_data, ConstructionDetailUpdate) + + # 验证并转换为 Pydantic model + try: + update_model = ConstructionDetailUpdate.model_validate(update_data) + groups[task_id].append((node, update_model)) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + + # 逐组批量更新 + for task_id, group_items in groups.items(): + push_id = self._generate_push_id() + + # 准备批量数据 + detail_list = [model.model_dump(mode='json', exclude_unset=True) for node, model in group_items] + + # 使用 parent_id(task_id)作为 biz_id + biz_id = task_id + + try: + # 批量调用 API + await api_update_construction_task_detail( + self.api_client, + {"detail_list": detail_list}, + push_id, + biz_id, + ) + # 整组成功 + for node, _ in group_items: + if self.poll_mode == "sync": + results.append(TaskResult.success(node_id=node.node_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + # 整组失败 + error_msg = str(e) + for node, _ in group_items: + results.append(TaskResult.failed(node_id=node.node_id, error=error_msg)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除施工明细""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_construction_task_detail(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("task_id"): + node.context["task_id"] = data["task_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_construction_task_detail_list(client, task_id: str) -> List[ConstructionDetailResponse]: + """ + 获取施工明细列表 GET /construction_task_detail/list + + Args: + client: API 客户端 + task_id: 施工任务ID + + Returns: + List[ConstructionDetailResponse]: 验证过的明细列表 + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/construction/detail/list", + params={"task_id": task_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = ConstructionDetailResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid detail item: {e}") + continue + + return validated_items + + +async def api_create_construction_task_detail(client, data: ConstructionDetailCreate, push_id: str) -> Dict[str, Any]: + """ + 创建施工明细 POST /construction/detail/create + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "data": data.model_dump(mode='json')} + response = await client.request(method="POST", endpoint="/construction/detail/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_construction_task_detail(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """ + 更新施工明细 PUT /construction/detail/update + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/construction/detail/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_construction_task_detail(client, detail_id: str, push_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": detail_id} + response = await client.request(method="DELETE", endpoint="/construction/detail/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/construction_task_detail/jsonl_handler.py b/sync_state_machine/domain/construction_task_detail/jsonl_handler.py new file mode 100644 index 0000000..4506164 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Construction Task Detail JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ConstructionTaskDetailSyncNode +from schemas.construction.construction_detail import ConstructionDetailResponse + + +class ConstructionTaskDetailJsonlHandler(BaseJsonlHandler): + """施工任务明细 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "construction_task_detail", ConstructionTaskDetailSyncNode, ConstructionDetailResponse) diff --git a/sync_state_machine/domain/construction_task_detail/register.py b/sync_state_machine/domain/construction_task_detail/register.py new file mode 100644 index 0000000..ff09c80 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/register.py @@ -0,0 +1,17 @@ +"""Construction task detail domain registration""" +from ...common.registry import DomainRegistry +from schemas.construction.construction_detail import ConstructionDetailResponse +from .sync_node import ConstructionTaskDetailSyncNode +from .sync_strategy import ConstructionTaskDetailSyncStrategy +from .jsonl_handler import ConstructionTaskDetailJsonlHandler +from .api_handler import ConstructionTaskDetailApiHandler + +# 注册 construction_task_detail domain +DomainRegistry.register( + node_type="construction_task_detail", + schema=ConstructionDetailResponse, + node_class=ConstructionTaskDetailSyncNode, + strategy_class=ConstructionTaskDetailSyncStrategy, + jsonl_handler_class=ConstructionTaskDetailJsonlHandler, + api_handler_class=ConstructionTaskDetailApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/construction_task_detail/sync_node.py b/sync_state_machine/domain/construction_task_detail/sync_node.py new file mode 100644 index 0000000..0a1d808 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/sync_node.py @@ -0,0 +1,11 @@ +""" +Construction Task Detail Domain +""" +from ...common import SyncNode +from schemas.construction.construction_detail import ConstructionDetailResponse + + +class ConstructionTaskDetailSyncNode(SyncNode[ConstructionDetailResponse]): + """施工任务明细同步节点""" + node_type = "construction_task_detail" + schema = ConstructionDetailResponse diff --git a/sync_state_machine/domain/construction_task_detail/sync_strategy.py b/sync_state_machine/domain/construction_task_detail/sync_strategy.py new file mode 100644 index 0000000..2fc6917 --- /dev/null +++ b/sync_state_machine/domain/construction_task_detail/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.construction.construction_detail import ConstructionDetailResponse + + +class ConstructionTaskDetailSyncStrategy(DefaultSyncStrategy[ConstructionDetailResponse]): + """ + Construction Task Detail 同步策略(合同子业务明细)。 + """ + + schema = ConstructionDetailResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["parent_id", "date"], + depend_fields={"parent_id": "construction_task"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/contract/__init__.py b/sync_state_machine/domain/contract/__init__.py new file mode 100644 index 0000000..6c5301b --- /dev/null +++ b/sync_state_machine/domain/contract/__init__.py @@ -0,0 +1,7 @@ +"""Contract domain""" +from .sync_node import ContractSyncNode +from .sync_strategy import ContractSyncStrategy +from .jsonl_handler import ContractJsonlHandler + +__all__ = ["ContractSyncNode", "ContractSyncStrategy", "ContractJsonlHandler"] + diff --git a/sync_state_machine/domain/contract/api_handler.py b/sync_state_machine/domain/contract/api_handler.py new file mode 100644 index 0000000..7410965 --- /dev/null +++ b/sync_state_machine/domain/contract/api_handler.py @@ -0,0 +1,329 @@ +""" +Contract API Handler + +职责: +- 加载合同列表(依赖 Project) +- 合同创建(POST /contract/create,异步) +- 合同更新(PUT /contract/update,同步) +- 合同删除(DELETE /contract/delete,同步) +""" + +from typing import List, Dict, Any, Optional + +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.client import ApiClient +from .sync_node import ContractSyncNode +from schemas.contract.contract import ContractResponse, ContractCreate, ContractUpdate + + +# ========== 静态 API 函数 ========== + +async def api_get_contract_list(client: ApiClient, project_id: str) -> List[ContractResponse]: + """GET /contract/list - 获取项目合同列表""" + response = await client.request( + method="GET", + endpoint="/contract/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"Failed to get contract list: {response.get('message', 'Unknown error')}") + + # V2 API 返回格式:{code: 200, data: [...]} + items = response.get("data", []) + + return [ContractResponse.model_validate(item) for item in items] + + +async def api_get_contract(client: ApiClient, contract_id: str) -> ContractResponse: + """GET /contract - 获取合同详情""" + response = await client.request( + method="GET", + endpoint="/contract", + params={"contract_id": contract_id} + ) + if response.get("code") != 200: + raise Exception(f"Failed to get contract: {response.get('message', 'Unknown error')}") + return ContractResponse.model_validate(response["data"]) + + +async def api_create_contract(client: ApiClient, data: Dict[str, Any], push_id: str) -> Dict[str, Any]: + """POST /contract/create - 创建合同(异步)""" + validated_data = ContractCreate.model_validate(data) + request_data = {"push_id": push_id, "data": validated_data.model_dump(exclude_none=True)} + response = await client.request("POST", "/contract/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"Failed to create contract: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_contract(client: ApiClient, data_id: str, data: Dict[str, Any], push_id: str) -> Dict[str, Any]: + """PUT /contract/update - 更新合同(同步)""" + validated_data = ContractUpdate.model_validate(data) + request_data = {"push_id": push_id, "biz_id": data_id, "data": validated_data.model_dump(exclude_none=True)} + response = await client.request("PUT", "/contract/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"Failed to update contract: {response.get('message', 'Unknown error')}") + return response + + +async def api_delete_contract(client: ApiClient, data_id: str, push_id: str) -> Dict[str, Any]: + """DELETE /contract/delete - 删除合同(同步)""" + request_data = {"push_id": push_id, "biz_id": data_id} + response = await client.request("DELETE", "/contract/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"Failed to delete contract: {response.get('message', 'Unknown error')}") + return response + + +# ========== Handler ========== + +class ContractApiHandler(BaseApiHandler): + """合同 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "contract" + self._node_class = ContractSyncNode + self._schema = ContractResponse + self.update_schemas = [ContractCreate, ContractUpdate] + + # ========== Handler 接口实现 ========== + + async def load(self) -> List[SyncNode]: + """ + 加载合同列表 + + 依赖 Project:从 collection 获取项目列表,然后加载这些项目的合同 + + Returns: + 合同数据列表 + """ + try: + # 从 collection 获取项目列表 + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + print("⚠️ No projects found, skipping contract load") + return [] + + # 为每个项目加载合同 + all_nodes = [] + for project_id in project_ids: + try: + contracts = await api_get_contract_list(self.api_client, project_id) + + # 已验证的 Pydantic model,转换为 dict 并创建 node + for contract in contracts: + contract_data = contract.model_dump() + all_nodes.append(self._create_node(contract_data)) + + except Exception as e: + print(f"❌ Failed to load contracts for project {project_id}: {e}") + continue + + return all_nodes + + except Exception as e: + print(f"❌ Failed to load contracts: {e}") + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建合同""" + results = [] + for node in nodes: + result = await self._create_single(node) + results.append(result) + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新合同""" + results = [] + for node in nodes: + result = await self._update_single(node) + results.append(result) + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除合同""" + results = [] + for node in nodes: + result = await self._delete_single(node) + results.append(result) + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + async def _create_single(self, node: SyncNode) -> TaskResult: + """ + 创建合同(异步) + + Args: + node: 同步节点 + + Returns: + TaskResult (IN_PROGRESS with push_id) + """ + push_id: str | None = None + try: + # 获取数据 + data = node.get_data() + if not data: + return TaskResult.failed(node_id=node.node_id, error="Node data is None or validation failed") + + # 从 context 获取 project_id + project_id = node.context.get("project_id") + if not project_id: + project_id = data.get("project_id") + + if not project_id: + return TaskResult.failed( + node_id=node.node_id, + error="project_id not found in context or data" + ) + + # 构建请求数据(确保包含 project_id) + request_data = { + "project_id": project_id, + **data + } + + # 调用 API(直接调用顶层函数) + push_id = self._generate_push_id() + response = await api_create_contract(self.api_client, request_data, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + return TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + return TaskResult.success(node_id=node.node_id, data_id=created_id) + else: + return TaskResult.in_progress(node_id=node.node_id, task_id=push_id) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Create failed: {str(e)}", + push_id=push_id, + ) + + async def _update_single(self, node: SyncNode) -> TaskResult: + """ + 更新合同(同步) + + 自动选择需要更新的字段(基于 update_schema) + + Args: + node: 同步节点 + + Returns: + TaskResult (SUCCESS or FAILED) + """ + try: + data = node.get_data() + if not data: + return TaskResult.failed(node_id=node.node_id, error="Missing data for update") + + # 过滤出需要更新的字段(排除空值、未变化的字段) + origin_data = node.get_origin_data() or {} + update_data = self._filter_update_data( + new_data=data, + original_data=origin_data, + schema=ContractUpdate, + ) + + # 如果没有需要更新的字段,降级 action 并返回跳过 + if not update_data: + return TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed") + + # Schema 验证 + error = self._validate_schema(update_data, ContractUpdate) + if error: + return TaskResult.failed( + node_id=node.node_id, + error=f"Schema validation failed: {error}" + ) + + # 生成 push_id 和 biz_id + push_id = self._generate_push_id() + biz_id = node.data_id or update_data.get("id") + if not biz_id: + return TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update") + + # 调用 API + response = await api_update_contract(self.api_client, biz_id, update_data, push_id) + + # 检查响应状态(更新接口是同步的) + if response.get("code") == 200: + return TaskResult.success(node_id=node.node_id) + else: + return TaskResult.failed( + node_id=node.node_id, + error=f"API returned error: {response.get('message', 'Unknown error')}" + ) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Update failed: {str(e)}" + ) + + async def _delete_single(self, node: SyncNode) -> TaskResult: + """ + 删除合同(同步) + + Args: + node: 同步节点 + + Returns: + TaskResult (SUCCESS or FAILED) + """ + if not self.api_client: + return TaskResult.failed( + node_id=node.node_id, + error="api_client not initialized" + ) + + try: + # 生成 push_id 和 biz_id + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + return TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete") + + # 调用 API + response = await api_delete_contract(self.api_client, biz_id, push_id) + + # 检查响应状态 + if response.get("code") == 200: + return TaskResult.success(node_id=node.node_id) + else: + return TaskResult.failed( + node_id=node.node_id, + error=f"API returned error: {response.get('message', 'Unknown error')}" + ) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Delete failed: {str(e)}" + ) + + # ========== 辅助方法 ========== + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + """创建合同同步节点(设置 project_id 到 context)""" + node = self._create_basic_node(data, depend_ids=[]) + + # 设置 project_id 到 context(供子节点使用) + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + + return node + diff --git a/sync_state_machine/domain/contract/jsonl_handler.py b/sync_state_machine/domain/contract/jsonl_handler.py new file mode 100644 index 0000000..8235f32 --- /dev/null +++ b/sync_state_machine/domain/contract/jsonl_handler.py @@ -0,0 +1,14 @@ +""" +Contract JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ContractSyncNode +from schemas.contract.contract import ContractResponse + + +class ContractJsonlHandler(BaseJsonlHandler): + """合同 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "contract", ContractSyncNode, ContractResponse) + + diff --git a/sync_state_machine/domain/contract/register.py b/sync_state_machine/domain/contract/register.py new file mode 100644 index 0000000..565e34e --- /dev/null +++ b/sync_state_machine/domain/contract/register.py @@ -0,0 +1,17 @@ +"""Contract domain registration""" +from ...common.registry import DomainRegistry +from schemas.contract.contract import ContractResponse +from .sync_node import ContractSyncNode +from .sync_strategy import ContractSyncStrategy +from .jsonl_handler import ContractJsonlHandler +from .api_handler import ContractApiHandler + +# 注册 contract domain +DomainRegistry.register( + node_type="contract", + schema=ContractResponse, + node_class=ContractSyncNode, + strategy_class=ContractSyncStrategy, + jsonl_handler_class=ContractJsonlHandler, + api_handler_class=ContractApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/contract/sync_node.py b/sync_state_machine/domain/contract/sync_node.py new file mode 100644 index 0000000..95803e7 --- /dev/null +++ b/sync_state_machine/domain/contract/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.contract.contract import ContractResponse + + +class ContractSyncNode(SyncNode[ContractResponse]): + """合同同步节点""" + node_type = "contract" + schema = ContractResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/contract/sync_strategy.py b/sync_state_machine/domain/contract/sync_strategy.py new file mode 100644 index 0000000..3f33c97 --- /dev/null +++ b/sync_state_machine/domain/contract/sync_strategy.py @@ -0,0 +1,30 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.contract.contract import ContractResponse + + +class ContractSyncStrategy(DefaultSyncStrategy[ContractResponse]): + """ + Contract 同步策略 + + 业务规则: + 1. 使用 (project_id, code) 作为业务唯一键 + 2. 依赖于 project 和 company + 3. 支持自动绑定 + 4. 默认配置为日常推送模式(本地创建推送到远程,不拉取远程孤儿) + + schema 已在类定义中设置,禁止在初始化时传入其他 schema。 + """ + + # 类变量:schema 固定为 ContractResponse + schema = ContractResponse + + # 类变量:默认配置 + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id","company_id", "code"], + depend_fields={"project_id": "project", "company_id": "supplier"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) diff --git a/sync_state_machine/domain/contract_change/__init__.py b/sync_state_machine/domain/contract_change/__init__.py new file mode 100644 index 0000000..1cb1ed5 --- /dev/null +++ b/sync_state_machine/domain/contract_change/__init__.py @@ -0,0 +1,13 @@ +"""Contract Change (合同变更) Domain Module""" + +from .sync_node import ContractChangeSyncNode +from .sync_strategy import ContractChangeSyncStrategy +from .api_handler import ContractChangeApiHandler +from .jsonl_handler import ContractChangeJsonlHandler + +__all__ = [ + "ContractChangeSyncNode", + "ContractChangeSyncStrategy", + "ContractChangeApiHandler", + "ContractChangeJsonlHandler", +] diff --git a/sync_state_machine/domain/contract_change/api_handler.py b/sync_state_machine/domain/contract_change/api_handler.py new file mode 100644 index 0000000..3a9e888 --- /dev/null +++ b/sync_state_machine/domain/contract_change/api_handler.py @@ -0,0 +1,171 @@ +""" +Contract Change (合同变更) API Handler + +职责: +- 创建和更新合同变更记录(依赖 Project 和 Contract) + +实现的接口: +POST: +- /contract_change/create - 创建合同变更 +PUT: +- /contract_change/update - 更新合同变更 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_VALIDATION_FAILED +from .sync_node import ContractChangeSyncNode +from schemas.project_extensions.contract_change import ContractChangeResponse, PostContractChange, CreateContractChange + + +class ContractChangeApiHandler(BaseApiHandler): + """合同变更 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "contract_change" + self._node_class = ContractChangeSyncNode + # TODO: ContractChangeResponse schema in schemas/project_extensions/contract_change.py is missing 'project_id' + self._schema = ContractChangeResponse + + async def load(self) -> List[SyncNode]: + """加载合同变更数据""" + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建合同变更""" + from pydantic import ValidationError + + results = [] + for node in nodes: + node_data = node.get_data() + if node_data is None: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 验证并转换为 Pydantic model + try: + create_model = CreateContractChange.model_validate(node_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + try: + response = await api_create_contract_change(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新合同变更""" + from pydantic import ValidationError + + results = [] + for node in nodes: + node_data = node.get_data() + if node_data is None: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + + origin_data = node.get_origin_data() or {} + update_data = self._filter_update_data(node_data, origin_data, PostContractChange) + if not update_data: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 验证并转换为 Pydantic model + try: + update_model = PostContractChange.model_validate(update_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + biz_id = node.data_id or update_model.id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + try: + await api_update_contract_change(self.api_client, update_model, push_id, biz_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Contract change deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + if data.get("contract_id"): + node.context["contract_id"] = data["contract_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_create_contract_change(client, data: CreateContractChange, push_id: str) -> Dict[str, Any]: + """ + POST /contract_change/create - 创建合同变更 + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "data": data.model_dump()} + response = await client.request(method="POST", endpoint="/contract_change/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_contract_change(client, data: PostContractChange, push_id: str, biz_id: str) -> None: + """ + PUT /contract_change/update - 更新合同变更 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/contract_change/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/contract_change/jsonl_handler.py b/sync_state_machine/domain/contract_change/jsonl_handler.py new file mode 100644 index 0000000..94184b1 --- /dev/null +++ b/sync_state_machine/domain/contract_change/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Contract Change Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ContractChangeSyncNode +from schemas.project_extensions.contract_change import ContractChangeResponse + + +class ContractChangeJsonlHandler(BaseJsonlHandler): + """合同变更 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "contract_change", ContractChangeSyncNode, ContractChangeResponse) diff --git a/sync_state_machine/domain/contract_change/register.py b/sync_state_machine/domain/contract_change/register.py new file mode 100644 index 0000000..9e07cf2 --- /dev/null +++ b/sync_state_machine/domain/contract_change/register.py @@ -0,0 +1,17 @@ +"""Contract change domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.contract_change import ContractChangeResponse +from .sync_node import ContractChangeSyncNode +from .sync_strategy import ContractChangeSyncStrategy +from .api_handler import ContractChangeApiHandler +from .jsonl_handler import ContractChangeJsonlHandler + +# 注册 contract_change domain +DomainRegistry.register( + node_type="contract_change", + schema=ContractChangeResponse, + node_class=ContractChangeSyncNode, + strategy_class=ContractChangeSyncStrategy, + jsonl_handler_class=ContractChangeJsonlHandler, + api_handler_class=ContractChangeApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/contract_change/sync_node.py b/sync_state_machine/domain/contract_change/sync_node.py new file mode 100644 index 0000000..11a25a5 --- /dev/null +++ b/sync_state_machine/domain/contract_change/sync_node.py @@ -0,0 +1,10 @@ +"""Contract Change SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.project_extensions.contract_change import ContractChangeResponse + + +class ContractChangeSyncNode(SyncNode[ContractChangeResponse]): + """合同变更同步节点""" + node_type = "contract_change" + schema = ContractChangeResponse diff --git a/sync_state_machine/domain/contract_change/sync_strategy.py b/sync_state_machine/domain/contract_change/sync_strategy.py new file mode 100644 index 0000000..896dd3e --- /dev/null +++ b/sync_state_machine/domain/contract_change/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project_extensions.contract_change import ContractChangeResponse + + +class ContractChangeSyncStrategy(DefaultSyncStrategy[ContractChangeResponse]): + """ + Contract Change 同步策略。 + """ + + schema = ContractChangeResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["contract_id", "change_time", "title"], + depend_fields={"project_id": "project", "contract_id": "contract"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/contract_settlement/__init__.py b/sync_state_machine/domain/contract_settlement/__init__.py new file mode 100644 index 0000000..68c5074 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/__init__.py @@ -0,0 +1,6 @@ +"""Contract settlement domain""" +from .sync_node import ContractSettlementSyncNode +from .sync_strategy import ContractSettlementSyncStrategy +from .jsonl_handler import ContractSettlementJsonlHandler + +__all__ = ["ContractSettlementSyncNode", "ContractSettlementSyncStrategy", "ContractSettlementJsonlHandler"] diff --git a/sync_state_machine/domain/contract_settlement/api_handler.py b/sync_state_machine/domain/contract_settlement/api_handler.py new file mode 100644 index 0000000..0791e04 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/api_handler.py @@ -0,0 +1,313 @@ +""" +Contract Settlement API Handler + +职责: +- 加载合同结算列表(依赖 Project) +- 合同结算创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ( + ERROR_NODE_DATA_NONE, + ERROR_VALIDATION_FAILED, + ERROR_PROJECT_ID_NOT_FOUND +) +from .sync_node import ContractSettlementSyncNode +from schemas.contract_settlement.contract_settlement import ( + ContractSettlementResponse, + ContractSettlementCreate, + ContractSettlementUpdate, + ContractSettlementPlanUpdate, +) + + +class ContractSettlementApiHandler(BaseApiHandler): + """合同结算 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "contract_settlement" + self._node_class = ContractSettlementSyncNode + self._schema = ContractSettlementResponse + self.update_schemas = [ContractSettlementCreate, ContractSettlementUpdate, ContractSettlementPlanUpdate] + + async def load(self) -> List[SyncNode]: + """加载合同结算列表(依赖 Project)""" + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + return [] + + all_settlements = [] + for project_id in project_ids: + try: + settlements = await api_get_contract_settlement_list(self.api_client, project_id) + for settlement_model in settlements: + # 已经过验证的 Pydantic model,转换为 dict + settlement_data = settlement_model.model_dump() + all_settlements.append(self._create_node(settlement_data)) + except Exception as e: + print(f"❌ Failed to load settlements for project {project_id}: {e}") + + return all_settlements + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建合同结算""" + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + project_id = node.context.get("project_id") or data.get("project_id") + if not project_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_PROJECT_ID_NOT_FOUND)) + continue + + # 验证并转换为 Pydantic model + try: + create_data = {"project_id": project_id, **data} + create_model = ContractSettlementCreate.model_validate(create_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + try: + response = await api_create_contract_settlement(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新合同结算 + + 支持两种更新类型: + 1. ContractSettlementUpdate - 基础信息更新 + 2. ContractSettlementPlanUpdate - 计划信息更新 + + 更新逻辑: + - 对每种 schema,检查是否有差异 + - 如果有差异,调用对应 API + """ + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + biz_id = node.data_id or data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + node_updated = False + error = None + + # 1. 基础信息更新 (ContractSettlementUpdate) + base_diff = self._get_schema_diff(ContractSettlementUpdate, data, origin_data, node.node_id) + if base_diff: + try: + update_model = ContractSettlementUpdate.model_validate(data) + push_id = self._generate_push_id() + await api_update_contract_settlement(self.api_client, update_model, push_id, biz_id) + node_updated = True + except ValidationError as e: + error = f"Validation failed: {e}" + except Exception as e: + error = f"API error: {e}" + + # 2. 计划信息更新 (ContractSettlementPlanUpdate) + plan_diff = self._get_schema_diff(ContractSettlementPlanUpdate, data, origin_data, node.node_id) + if not error and plan_diff: + try: + plan_model = ContractSettlementPlanUpdate.model_validate(data) + push_id = self._generate_push_id() + # 使用计划更新专用 API + await api_update_settlement_plan(self.api_client, plan_model.model_dump(exclude_unset=True), push_id, biz_id) + node_updated = True + except ValidationError as e: + error = f"Validation failed: {e}" + except Exception as e: + error = f"API error: {e}" + + # 汇总结果 + if error: + results.append(TaskResult.failed(node_id=node.node_id, error=error)) + elif node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + else: + # 没有任何字段需要更新 + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除合同结算""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_contract_settlement(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + node.context["settlement_id"] = node.data_id + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_settlement(client, settlement_id: str) -> Dict[str, Any]: + """获取单个合同结算数据 GET /contract_settlement""" + response = await client.request( + method="GET", + endpoint="/contract_settlement", + params={"settlement_id": settlement_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("data", {}) + + +async def api_get_contract_settlement_list(client, project_id: str) -> List[ContractSettlementResponse]: + """ + 获取合同结算列表 GET /contract_settlement/list + + Args: + client: API 客户端 + project_id: 项目ID + + Returns: + List[ContractSettlementResponse]: 验证过的结算列表 + + Raises: + Exception: API 返回错误或数据验证失败 + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/contract_settlement/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = ContractSettlementResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid settlement item: {e}") + continue + + return validated_items + + +async def api_create_contract_settlement(client, data: ContractSettlementCreate, push_id: str) -> Dict[str, Any]: + """ + 创建合同结算 POST /contract_settlement/create + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + + Returns: + str: push_id + + Raises: + Exception: API 返回错误 + """ + request_data = {"push_id": push_id, "data": data.model_dump()} + response = await client.request(method="POST", endpoint="/contract_settlement/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_contract_settlement(client, data: ContractSettlementUpdate, push_id: str, biz_id: str) -> None: + """ + 更新合同结算 PUT /contract_settlement/update + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + + Raises: + Exception: API 返回错误 + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/contract_settlement/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_contract_settlement(client, settlement_id: str, push_id: str) -> None: + """删除合同结算 DELETE /contract_settlement/delete""" + request_data = {"push_id": push_id, "biz_id": settlement_id} + response = await client.request(method="DELETE", endpoint="/contract_settlement/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_settlement_plan(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """更新合同结算计划 PUT /contract_settlement/plan""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/contract_settlement/plan", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/contract_settlement/jsonl_handler.py b/sync_state_machine/domain/contract_settlement/jsonl_handler.py new file mode 100644 index 0000000..28b64f8 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Contract Settlement Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ContractSettlementSyncNode +from schemas.contract_settlement.contract_settlement import ContractSettlementResponse + + +class ContractSettlementJsonlHandler(BaseJsonlHandler): + """合同结算 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "contract_settlement", ContractSettlementSyncNode, ContractSettlementResponse) diff --git a/sync_state_machine/domain/contract_settlement/register.py b/sync_state_machine/domain/contract_settlement/register.py new file mode 100644 index 0000000..d4afa59 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/register.py @@ -0,0 +1,17 @@ +"""Contract settlement domain registration""" +from ...common.registry import DomainRegistry +from schemas.contract_settlement.contract_settlement import ContractSettlementResponse +from .sync_node import ContractSettlementSyncNode +from .sync_strategy import ContractSettlementSyncStrategy +from .jsonl_handler import ContractSettlementJsonlHandler +from .api_handler import ContractSettlementApiHandler + +# 注册 contract_settlement domain +DomainRegistry.register( + node_type="contract_settlement", + schema=ContractSettlementResponse, + node_class=ContractSettlementSyncNode, + strategy_class=ContractSettlementSyncStrategy, + jsonl_handler_class=ContractSettlementJsonlHandler, + api_handler_class=ContractSettlementApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/contract_settlement/sync_node.py b/sync_state_machine/domain/contract_settlement/sync_node.py new file mode 100644 index 0000000..512d432 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.contract_settlement.contract_settlement import ContractSettlementResponse + + +class ContractSettlementSyncNode(SyncNode[ContractSettlementResponse]): + """合同结算同步节点""" + node_type = "contract_settlement" + schema = ContractSettlementResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/contract_settlement/sync_strategy.py b/sync_state_machine/domain/contract_settlement/sync_strategy.py new file mode 100644 index 0000000..009387b --- /dev/null +++ b/sync_state_machine/domain/contract_settlement/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.contract_settlement.contract_settlement import ContractSettlementResponse + + +class ContractSettlementSyncStrategy(DefaultSyncStrategy[ContractSettlementResponse]): + """ + Contract Settlement 同步策略(合同子业务)。 + """ + + schema = ContractSettlementResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["contract_id"], + depend_fields={"contract_id": "contract", "project_id": "project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/contract_settlement_detail/__init__.py b/sync_state_machine/domain/contract_settlement_detail/__init__.py new file mode 100644 index 0000000..8a12786 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/__init__.py @@ -0,0 +1,8 @@ +""" +Contract Settlement Detail Domain +""" +from .sync_node import ContractSettlementDetailSyncNode +from .sync_strategy import ContractSettlementDetailSyncStrategy +from .jsonl_handler import ContractSettlementDetailJsonlHandler + +__all__ = ["ContractSettlementDetailSyncNode", "ContractSettlementDetailSyncStrategy", "ContractSettlementDetailJsonlHandler"] diff --git a/sync_state_machine/domain/contract_settlement_detail/api_handler.py b/sync_state_machine/domain/contract_settlement_detail/api_handler.py new file mode 100644 index 0000000..ff7808b --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/api_handler.py @@ -0,0 +1,288 @@ +""" +Contract Settlement Detail API Handler + +职责: +- 加载合同结算明细列表(依赖 ContractSettlement) +- 合同结算明细创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_VALIDATION_FAILED, ERROR_ID_NOT_FOUND +from .sync_node import ContractSettlementDetailSyncNode +from schemas.contract_settlement.contract_settlement_detail import ( + ContractSettlementDetailResponse, + ContractSettlementDetailCreate, + ContractSettlementDetailUpdate +) + + +class ContractSettlementDetailApiHandler(BaseApiHandler): + """合同结算明细 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "contract_settlement_detail" + self._node_class = ContractSettlementDetailSyncNode + self._schema = ContractSettlementDetailResponse + self.update_schemas = [ContractSettlementDetailCreate, ContractSettlementDetailUpdate] + + async def load(self) -> List[SyncNode]: + """加载合同结算明细列表(依赖 ContractSettlement)""" + settlements = self._collection.filter(node_type="contract_settlement") + settlement_ids = [s.data_id for s in settlements if s.data_id] + + if not settlement_ids: + return [] + + all_details = [] + for settlement_id in settlement_ids: + try: + details = await api_get_contract_settlement_detail_list(self.api_client, settlement_id) + for detail_model in details: + detail_data = detail_model.model_dump() + all_details.append(self._create_node(detail_data)) + except Exception as e: + print(f"❌ Failed to load settlement details for {settlement_id}: {e}") + + return all_details + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建合同结算明细""" + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 从data的parent_id获取settlement_id + settlement_id = data.get("parent_id") + if not settlement_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_ID_NOT_FOUND)) + continue + + try: + create_data = {"settlement_id": settlement_id, **data} + create_model = ContractSettlementDetailCreate.model_validate(create_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + try: + response = await api_create_contract_settlement_detail(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新合同结算明细 + + 按 settlement_id 分组,每组使用同一个 push_id 批量提交 + """ + from pydantic import ValidationError + from collections import defaultdict + + results = [] + + # 按 settlement_id 分组 + groups: Dict[str, List[tuple[SyncNode, Dict[str, Any]]]] = defaultdict(list) + + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + + # 使用 _get_schema_diff 检查差异并打印日志 + diff_fields = self._get_schema_diff(ContractSettlementDetailUpdate, data, origin_data, node.node_id) + if not diff_fields: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 获取 settlement_id(parent_id) + settlement_id = data.get("parent_id") or node.context.get("settlement_id") + if not settlement_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing settlement_id (parent_id)")) + continue + + # 需要完整的 schema 数据(包括必填字段) + update_data = self._filter_update_data(data, origin_data, ContractSettlementDetailUpdate) + + try: + update_model = ContractSettlementDetailUpdate.model_validate(update_data) + groups[settlement_id].append((node, update_model)) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + + # 逐组批量更新 + for settlement_id, group_items in groups.items(): + push_id = self._generate_push_id() + + # 准备批量数据 + detail_list = [model.model_dump(mode='json', exclude_unset=True) for node, model in group_items] + + # 使用第一个节点的 biz_id(对于批量更新,通常使用 parent_id) + biz_id = settlement_id + + try: + # 批量调用 API + await api_update_contract_settlement_detail( + self.api_client, + {"detail_list": detail_list}, + push_id, + biz_id, + ) + # 整组成功 + for node, _ in group_items: + results.append(TaskResult.success(node_id=node.node_id, push_id=push_id)) + except Exception as e: + # 整组失败 + error_msg = str(e) + for node, _ in group_items: + results.append(TaskResult.failed(node_id=node.node_id, error=error_msg)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除合同结算明细""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_contract_settlement_detail(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("settlement_id"): + node.context["settlement_id"] = data["settlement_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_contract_settlement_detail_list(client, settlement_id: str) -> List[ContractSettlementDetailResponse]: + """ + 获取合同结算明细列表 + + Args: + client: API 客户端 + settlement_id: 结算ID + + Returns: + List[ContractSettlementDetailResponse]: 验证过的明细列表 + + Raises: + Exception: API 返回错误或数据验证失败 + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/contract_settlement/detail/list", + params={"settlement_id": settlement_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + validated_items = [] + for item in items: + try: + validated_item = ContractSettlementDetailResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid detail item: {e}") + continue + + return validated_items + + +async def api_create_contract_settlement_detail(client, data: ContractSettlementDetailCreate, push_id: str) -> Dict[str, Any]: + """ + 创建合同结算明细 + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + + Returns: + str: push_id + + Raises: + Exception: API 返回错误 + """ + request_data = {"push_id": push_id, "data": data.model_dump(mode='json')} + response = await client.request(method="POST", endpoint="/contract_settlement/detail/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_contract_settlement_detail(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """ + 更新合同结算明细 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + + Raises: + Exception: API 返回错误 + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/contract_settlement/detail/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_contract_settlement_detail(client, detail_id: str, push_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": detail_id} + response = await client.request(method="DELETE", endpoint="/contract_settlement/detail/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/contract_settlement_detail/jsonl_handler.py b/sync_state_machine/domain/contract_settlement_detail/jsonl_handler.py new file mode 100644 index 0000000..81e3bcd --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Contract Settlement Detail JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ContractSettlementDetailSyncNode +from schemas.contract_settlement.contract_settlement_detail import ContractSettlementDetailResponse + + +class ContractSettlementDetailJsonlHandler(BaseJsonlHandler): + """合同结算明细 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "contract_settlement_detail", ContractSettlementDetailSyncNode, ContractSettlementDetailResponse) diff --git a/sync_state_machine/domain/contract_settlement_detail/register.py b/sync_state_machine/domain/contract_settlement_detail/register.py new file mode 100644 index 0000000..a3442e0 --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/register.py @@ -0,0 +1,17 @@ +"""Contract settlement detail domain registration""" +from ...common.registry import DomainRegistry +from schemas.contract_settlement.contract_settlement_detail import ContractSettlementDetailResponse +from .sync_node import ContractSettlementDetailSyncNode +from .sync_strategy import ContractSettlementDetailSyncStrategy +from .jsonl_handler import ContractSettlementDetailJsonlHandler +from .api_handler import ContractSettlementDetailApiHandler + +# 注册 contract_settlement_detail domain +DomainRegistry.register( + node_type="contract_settlement_detail", + schema=ContractSettlementDetailResponse, + node_class=ContractSettlementDetailSyncNode, + strategy_class=ContractSettlementDetailSyncStrategy, + jsonl_handler_class=ContractSettlementDetailJsonlHandler, + api_handler_class=ContractSettlementDetailApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/contract_settlement_detail/sync_node.py b/sync_state_machine/domain/contract_settlement_detail/sync_node.py new file mode 100644 index 0000000..24774fc --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/sync_node.py @@ -0,0 +1,11 @@ +""" +Contract Settlement Detail Domain +""" +from ...common import SyncNode +from schemas.contract_settlement.contract_settlement_detail import ContractSettlementDetailResponse + + +class ContractSettlementDetailSyncNode(SyncNode[ContractSettlementDetailResponse]): + """合同结算明细同步节点""" + node_type = "contract_settlement_detail" + schema = ContractSettlementDetailResponse diff --git a/sync_state_machine/domain/contract_settlement_detail/sync_strategy.py b/sync_state_machine/domain/contract_settlement_detail/sync_strategy.py new file mode 100644 index 0000000..9d4929e --- /dev/null +++ b/sync_state_machine/domain/contract_settlement_detail/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.contract_settlement.contract_settlement_detail import ContractSettlementDetailResponse + + +class ContractSettlementDetailSyncStrategy(DefaultSyncStrategy[ContractSettlementDetailResponse]): + """ + Contract Settlement Detail 同步策略(合同子业务明细)。 + """ + + schema = ContractSettlementDetailResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["parent_id", "date"], + depend_fields={"parent_id": "contract_settlement"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/lar/__init__.py b/sync_state_machine/domain/lar/__init__.py new file mode 100644 index 0000000..fc5c341 --- /dev/null +++ b/sync_state_machine/domain/lar/__init__.py @@ -0,0 +1,6 @@ +"""LAR domain""" +from .sync_node import LarSyncNode +from .sync_strategy import LarSyncStrategy +from .jsonl_handler import LarJsonlHandler + +__all__ = ["LarSyncNode", "LarSyncStrategy", "LarJsonlHandler"] diff --git a/sync_state_machine/domain/lar/api_handler.py b/sync_state_machine/domain/lar/api_handler.py new file mode 100644 index 0000000..532a796 --- /dev/null +++ b/sync_state_machine/domain/lar/api_handler.py @@ -0,0 +1,218 @@ +""" +LAR (移民征地) API Handler + +职责: +- 更新移民征地数据(依赖 Project) +- 支持主数据、搬迁信息、投资信息三种更新 +- 不支持创建和删除(数据随项目自动生成) + +实现的接口: +PUT: +- /lar/main - 更新主数据 +- /lar/resettlement - 更新搬迁信息 +- /lar/investment - 更新投资信息 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_VALIDATION_FAILED +from .sync_node import LarSyncNode +from schemas.project_extensions.lar import ( + LarDetailSchema, + LarMainInfoUpdateSchema, + LarResettlementSchema, + LarInvestmentSchema +) + + +class LarApiHandler(BaseApiHandler): + """移民征地 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "lar" + self._node_class = LarSyncNode + self._schema = LarDetailSchema + + async def load(self) -> List[SyncNode]: + """ + 加载移民征地数据(从 project all_info 中提取) + + 注意:LAR 是可选的,只有特定项目类型(水电、抽蓄)才有 + """ + from ..project.api_handler import ProjectApiHandler + + # 获取已加载的项目 + projects = self._collection.filter(node_type="project") + if not projects: + print("⚠️ No projects found, skipping LAR load") + return [] + + nodes = [] + for project in projects: + project_id = project.data_id + + try: + # 从 project context 或缓存获取 all_info + all_info = project.context.get("all_info") + if not all_info: + all_info = await ProjectApiHandler.get_all_info( + self.api_client, + project_id + ) + + # 提取 lar(注意:lar 是单个对象,不是列表) + lar_data = all_info.get("lar") + if lar_data: + try: + validated = self._schema.model_validate(lar_data) + node = self._create_node(validated.model_dump()) + node.context["project_id"] = project_id + nodes.append(node) + print(f" Project {project_id}: 1 LAR") + except Exception as e: + print(f"⚠️ Skipping invalid LAR for project {project_id}: {e}") + continue + + except Exception as e: + print(f"❌ Failed to load LAR for project {project_id}: {e}") + continue + + return nodes + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建(LAR随项目自动生成)""" + return [ + TaskResult.failed(node_id=node.node_id, error="LAR creation not supported (auto-generated with project)") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新移民征地数据""" + from pydantic import ValidationError + + results = [] + + # 定义三种更新类型 + update_configs = [ + (LarMainInfoUpdateSchema, api_update_lar_main), + (LarResettlementSchema, api_update_lar_resettlement), + (LarInvestmentSchema, api_update_lar_investment), + ] + + for node in nodes: + node_data = node.get_data() + if not node_data: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + + origin_data = node.get_origin_data() or {} + node_updated = False + + for schema, api_func in update_configs: + # 获取过滤后的更新数据 + update_data = self._filter_update_data(node_data, origin_data, schema) + if update_data: + # 验证并转换为 Pydantic model + try: + update_model = schema.model_validate(update_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + break + + push_id = self._generate_push_id() + update_model_data = update_model.model_dump() + biz_id = node.data_id or update_model_data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + break + + try: + await api_func(self.api_client, update_model, push_id, biz_id) + node_updated = True + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + break + + if node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + elif not any(r.node_id == node.node_id for r in results): + # 如果没有任何更新且没有报错,视为跳过(归一化后无差异) + reason = f"No physical diff found across all 3 LAR sub-schemas for {node.data_id} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] [lar] {reason}") + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除(LAR随项目存在)""" + return [ + TaskResult.failed(node_id=node.node_id, error="LAR deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + node.context["lar_id"] = node.data_id + + return node + + +# ========== 静态 API 函数 ========== + +async def api_update_lar_main(client, data: LarMainInfoUpdateSchema, push_id: str, biz_id: str) -> None: + """ + PUT /lar/main - 更新主数据 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/lar/main", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_lar_resettlement(client, data: LarResettlementSchema, push_id: str, biz_id: str) -> None: + """ + PUT /lar/resettlement - 更新搬迁信息 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/lar/resettlement", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_lar_investment(client, data: LarInvestmentSchema, push_id: str, biz_id: str) -> None: + """ + PUT /lar/investment - 更新投资信息 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/lar/investment", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/lar/jsonl_handler.py b/sync_state_machine/domain/lar/jsonl_handler.py new file mode 100644 index 0000000..52f0682 --- /dev/null +++ b/sync_state_machine/domain/lar/jsonl_handler.py @@ -0,0 +1,10 @@ +"""LAR Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import LarSyncNode +from schemas.project_extensions.lar import LarDetailSchema + + +class LarJsonlHandler(BaseJsonlHandler): + """移民征地 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "lar", LarSyncNode, LarDetailSchema) diff --git a/sync_state_machine/domain/lar/register.py b/sync_state_machine/domain/lar/register.py new file mode 100644 index 0000000..40d7c19 --- /dev/null +++ b/sync_state_machine/domain/lar/register.py @@ -0,0 +1,17 @@ +"""LAR domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.lar import LarDetailSchema +from .sync_node import LarSyncNode +from .sync_strategy import LarSyncStrategy +from .jsonl_handler import LarJsonlHandler +from .api_handler import LarApiHandler + +# 注册 lar domain +DomainRegistry.register( + node_type="lar", + schema=LarDetailSchema, + node_class=LarSyncNode, + strategy_class=LarSyncStrategy, + jsonl_handler_class=LarJsonlHandler, + api_handler_class=LarApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/lar/sync_node.py b/sync_state_machine/domain/lar/sync_node.py new file mode 100644 index 0000000..65b1341 --- /dev/null +++ b/sync_state_machine/domain/lar/sync_node.py @@ -0,0 +1,14 @@ +"""LAR SyncNode""" + +from typing import Dict, Any +from ...common.sync_node import SyncNode +from schemas.project_extensions.lar import LarDetailSchema + + +class LarSyncNode(SyncNode[LarDetailSchema]): + """移民征地同步节点""" + node_type = "lar" + schema = LarDetailSchema + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/lar/sync_strategy.py b/sync_state_machine/domain/lar/sync_strategy.py new file mode 100644 index 0000000..2a77572 --- /dev/null +++ b/sync_state_machine/domain/lar/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project_extensions.lar import LarDetailSchema + + +class LarSyncStrategy(DefaultSyncStrategy[LarDetailSchema]): + """ + LAR 同步策略(项目扩展)。 + """ + + schema = LarDetailSchema + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/lar_change/__init__.py b/sync_state_machine/domain/lar_change/__init__.py new file mode 100644 index 0000000..48908d6 --- /dev/null +++ b/sync_state_machine/domain/lar_change/__init__.py @@ -0,0 +1,8 @@ +"""LAR Change (移民变更) Domain Module""" + +from .sync_node import LarChangeSyncNode +from .sync_strategy import LarChangeSyncStrategy +from .api_handler import LarChangeApiHandler +from .jsonl_handler import LarChangeJsonlHandler + +__all__ = ["LarChangeSyncNode", "LarChangeSyncStrategy", "LarChangeApiHandler", "LarChangeJsonlHandler"] diff --git a/sync_state_machine/domain/lar_change/api_handler.py b/sync_state_machine/domain/lar_change/api_handler.py new file mode 100644 index 0000000..6f9ed13 --- /dev/null +++ b/sync_state_machine/domain/lar_change/api_handler.py @@ -0,0 +1,180 @@ +""" +LAR Change (移民变更) API Handler + +职责: +- 创建和更新移民变更记录(依赖 Project) + +实现的接口: +POST: +- /lar/change - 创建移民变更 +PUT: +- /lar/change - 更新移民变更 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_VALIDATION_FAILED +from .sync_node import LarChangeSyncNode +from schemas.project_extensions.lar import ( + LarChangeDetailSchema, + LarChangeCreateSchema, + LarChangeUpdateSchema +) + + +class LarChangeApiHandler(BaseApiHandler): + """移民变更 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "lar_change" + self._node_class = LarChangeSyncNode + self._schema = LarChangeDetailSchema + + async def load(self) -> List[SyncNode]: + """ + 加载移民变更数据(依赖 Project) + """ + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + return [] + + # 移民变更通常需要单独查询,这里暂时返回空 + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建移民变更""" + from pydantic import ValidationError + + results = [] + for node in nodes: + node_data = node.get_data() + if node_data is None: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 验证并转换为 Pydantic model + try: + create_model = LarChangeCreateSchema.model_validate(node_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + try: + response = await api_create_lar_change(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新移民变更""" + from pydantic import ValidationError + + results = [] + for node in nodes: + node_data = node.get_data() + if node_data is None: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + origin_data = node.get_origin_data() or {} + update_data = self._filter_update_data(node_data, origin_data, LarChangeUpdateSchema) + if not update_data: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 验证并转换为 Pydantic model + try: + update_model = LarChangeUpdateSchema.model_validate(update_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + biz_id = node.data_id or update_model.id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + try: + await api_update_lar_change(self.api_client, update_model, push_id, biz_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="LAR change deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_create_lar_change(client, data: LarChangeCreateSchema, push_id: str) -> Dict[str, Any]: + """ + POST /lar/change - 创建移民变更 + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "data": data.model_dump()} + response = await client.request(method="POST", endpoint="/lar/change", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_lar_change(client, data: LarChangeUpdateSchema, push_id: str, biz_id: str) -> None: + """ + PUT /lar/change - 更新移民变更 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/lar/change", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/lar_change/jsonl_handler.py b/sync_state_machine/domain/lar_change/jsonl_handler.py new file mode 100644 index 0000000..b9aaf9b --- /dev/null +++ b/sync_state_machine/domain/lar_change/jsonl_handler.py @@ -0,0 +1,12 @@ +"""LAR Change JSONL Data Handler""" +from ...datasource.jsonl.handler import BaseJsonlHandler +from ...datasource.jsonl.datasource import JsonlDataSource +from .sync_node import LarChangeSyncNode +from schemas.project_extensions.lar import LarChangeDetailSchema + + +class LarChangeJsonlHandler(BaseJsonlHandler): + """LAR Change (移民变更) JSONL 数据处理器""" + + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "lar_change", LarChangeSyncNode, LarChangeDetailSchema) diff --git a/sync_state_machine/domain/lar_change/register.py b/sync_state_machine/domain/lar_change/register.py new file mode 100644 index 0000000..68e5403 --- /dev/null +++ b/sync_state_machine/domain/lar_change/register.py @@ -0,0 +1,17 @@ +"""LAR change domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.lar import LarChangeDetailSchema +from .sync_node import LarChangeSyncNode +from .sync_strategy import LarChangeSyncStrategy +from .api_handler import LarChangeApiHandler +from .jsonl_handler import LarChangeJsonlHandler + +# 注册 lar_change domain +DomainRegistry.register( + node_type="lar_change", + schema=LarChangeDetailSchema, + node_class=LarChangeSyncNode, + strategy_class=LarChangeSyncStrategy, + api_handler_class=LarChangeApiHandler, + jsonl_handler_class=LarChangeJsonlHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/lar_change/sync_node.py b/sync_state_machine/domain/lar_change/sync_node.py new file mode 100644 index 0000000..cc00b7d --- /dev/null +++ b/sync_state_machine/domain/lar_change/sync_node.py @@ -0,0 +1,10 @@ +"""LAR Change SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.project_extensions.lar import LarChangeDetailSchema + + +class LarChangeSyncNode(SyncNode[LarChangeDetailSchema]): + """移民变更同步节点""" + node_type = "lar_change" + schema = LarChangeDetailSchema diff --git a/sync_state_machine/domain/lar_change/sync_strategy.py b/sync_state_machine/domain/lar_change/sync_strategy.py new file mode 100644 index 0000000..a3f6a92 --- /dev/null +++ b/sync_state_machine/domain/lar_change/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project_extensions.lar import LarChangeDetailSchema + + +class LarChangeSyncStrategy(DefaultSyncStrategy[LarChangeDetailSchema]): + """ + LAR Change 同步策略。 + """ + + schema = LarChangeDetailSchema + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "change_time", "title"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/material/__init__.py b/sync_state_machine/domain/material/__init__.py new file mode 100644 index 0000000..5e9538a --- /dev/null +++ b/sync_state_machine/domain/material/__init__.py @@ -0,0 +1,6 @@ +"""Material domain""" +from .sync_node import MaterialSyncNode +from .sync_strategy import MaterialSyncStrategy +from .jsonl_handler import MaterialJsonlHandler + +__all__ = ["MaterialSyncNode", "MaterialSyncStrategy", "MaterialJsonlHandler"] diff --git a/sync_state_machine/domain/material/api_handler.py b/sync_state_machine/domain/material/api_handler.py new file mode 100644 index 0000000..c956c8d --- /dev/null +++ b/sync_state_machine/domain/material/api_handler.py @@ -0,0 +1,355 @@ +""" +Material API Handler (V2) + +职责: +- 加载物资列表(依赖 Project) +- 物资创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ( + ERROR_NODE_DATA_NONE, + ERROR_VALIDATION_FAILED, + ERROR_PROJECT_ID_NOT_FOUND +) +from .sync_node import MaterialSyncNode +from schemas.material.material import MaterialResponse, MaterialCreate, MaterialUpdate, MaterialPlanUpdate + + +class MaterialApiHandler(BaseApiHandler): + """物资 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "material" + self._node_class = MaterialSyncNode + self._schema = MaterialResponse + self.update_schemas = [MaterialCreate, MaterialUpdate, MaterialPlanUpdate] + + async def load(self) -> List[SyncNode]: + """ + 加载物资列表 + + 依赖 Project + 使用 GET /material/list?project_id={id} 接口 + """ + try: + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + print("⚠️ No projects found, skipping material load") + return [] + + all_materials = [] + for project_id in project_ids: + try: + materials = await api_get_material_list(self.api_client, project_id) + + for material in materials: + # 已验证的 Pydantic model,转换为 dict + material_data = material.model_dump() + all_materials.append(self._create_node(material_data)) + + except Exception as e: + print(f"❌ Failed to load materials for project {project_id}: {e}") + continue + + return all_materials + + except Exception as e: + print(f"❌ Failed to load materials: {e}") + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建物资""" + results = [] + for node in nodes: + result = await self._create_single(node) + results.append(result) + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新物资 + + 支持两种更新类型: + 1. MaterialUpdate - 基础信息更新 + 2. MaterialPlanUpdate - 计划信息更新 + + 更新逻辑: + - 对每种 schema,检查是否有差异 + - 如果有差异,调用对应 API + """ + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + biz_id = node.data_id or data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + node_updated = False + error = None + + # 1. 基础信息更新 (MaterialUpdate) + base_diff = self._get_schema_diff(MaterialUpdate, data, origin_data, node.node_id) + if base_diff: + try: + update_model = MaterialUpdate.model_validate(data) + push_id = self._generate_push_id() + await api_update_material(self.api_client, update_model, push_id, biz_id) + node_updated = True + except ValidationError as e: + error = f"{ERROR_VALIDATION_FAILED}: {e}" + + # 2. 计划信息更新 (MaterialPlanUpdate) + plan_diff = self._get_schema_diff(MaterialPlanUpdate, data, origin_data, node.node_id) + if not error and plan_diff: + try: + plan_model = MaterialPlanUpdate.model_validate(data) + push_id = self._generate_push_id() + # 需要调用对应的计划更新 API + await api_update_material_plan( + self.api_client, + plan_model.model_dump(exclude_unset=True), + push_id, + biz_id + ) + node_updated = True + except ValidationError as e: + error = f"{ERROR_VALIDATION_FAILED}: {e}" + + # 汇总结果 + if error: + results.append(TaskResult.failed(node_id=node.node_id, error=error)) + elif node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + else: + # 没有任何字段需要更新 + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除物资""" + results = [] + for node in nodes: + result = await self._delete_single(node) + results.append(result) + return results + + async def _create_single(self, node: SyncNode) -> TaskResult: + """创建物资""" + try: + data = node.get_data() + if not data: + return TaskResult.failed( + node_id=node.node_id, + error=ERROR_NODE_DATA_NONE + ) + + push_id = self._generate_push_id() + + project_id = node.context.get("project_id") + if not project_id: + project_id = data.get("project_id") + + if not project_id: + return TaskResult.failed( + node_id=node.node_id, + error=ERROR_PROJECT_ID_NOT_FOUND + ) + + # 验证并转换为 Pydantic model + from pydantic import ValidationError + create_data = {"project_id": project_id, **data} + try: + create_model = MaterialCreate.model_validate(create_data) + except ValidationError as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"{ERROR_VALIDATION_FAILED}: {e}" + ) + + response = await api_create_material(self.api_client, create_model, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + return TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + return TaskResult.success(node_id=node.node_id, data_id=created_id) + else: + return TaskResult.in_progress(node_id=node.node_id, task_id=push_id) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Create failed: {str(e)}" + ) + + async def _update_single(self, node: SyncNode) -> TaskResult: + """更新物资""" + if not self.api_client: + return TaskResult.failed( + node_id=node.node_id, + error="api_client not initialized" + ) + + try: + data = node.get_data() + if not data: + return TaskResult.failed( + node_id=node.node_id, + error="Node data is None or validation failed" + ) + + push_id = self._generate_push_id() + biz_id = node.data_id or data.get("id") + if not biz_id: + return TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update") + + # 验证并转换为 Pydantic model + from pydantic import ValidationError + try: + update_model = MaterialUpdate.model_validate(data) + except ValidationError as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"{ERROR_VALIDATION_FAILED}: {e}" + ) + + await api_update_material(self.api_client, update_model, push_id, biz_id) + return TaskResult.success(node_id=node.node_id) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Update failed: {str(e)}" + ) + + async def _delete_single(self, node: SyncNode) -> TaskResult: + """删除物资""" + try: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + return TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete") + + request_data = { + "push_id": push_id, + "biz_id": biz_id, + } + + response = await self.api_client.request( + method="DELETE", + endpoint="/material/delete", + data=request_data + ) + + if response.get("code") == 200: + return TaskResult.success(node_id=node.node_id) + else: + return TaskResult.failed( + node_id=node.node_id, + error=f"API returned error: {response.get('message', 'Unknown error')}" + ) + + except Exception as e: + return TaskResult.failed( + node_id=node.node_id, + error=f"Delete failed: {str(e)}" + ) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + """ + 创建物资同步节点 + + 设置 project_id 和 material_id 到 context + """ + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + node.context["material_id"] = node.data_id + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_material(client, material_id: str) -> Dict[str, Any]: + """获取单个物资数据 GET /material""" + response = await client.request( + method="GET", + endpoint="/material", + params={"material_id": material_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("data", {}) + + +# ========== 静态 API 函数 ========== + +async def api_get_material_list(client, project_id: str) -> List[MaterialResponse]: + """GET /material/list - 获取物资列表""" + response = await client.request( + method="GET", + endpoint="/material/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + # 验证每个返回项 + from pydantic import ValidationError + validated_items = [] + for item in items: + try: + validated_item = MaterialResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid material item: {e}") + continue + + return validated_items + + +async def api_create_material(client, data: MaterialCreate, push_id: str) -> Dict[str, Any]: + """创建物资 POST /material/create""" + request_data = {"push_id": push_id, "data": data.model_dump()} + response = await client.request(method="POST", endpoint="/material/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_material(client, data: MaterialUpdate, push_id: str, biz_id: str) -> None: + """更新物资 PUT /material/update""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/material/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_material_plan(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """更新物资计划 PUT /material/plan""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/material/plan", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/material/jsonl_handler.py b/sync_state_machine/domain/material/jsonl_handler.py new file mode 100644 index 0000000..f7f4889 --- /dev/null +++ b/sync_state_machine/domain/material/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Material Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import MaterialSyncNode +from schemas.material.material import MaterialResponse + + +class MaterialJsonlHandler(BaseJsonlHandler): + """物资 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "material", MaterialSyncNode, MaterialResponse) diff --git a/sync_state_machine/domain/material/register.py b/sync_state_machine/domain/material/register.py new file mode 100644 index 0000000..17b61a5 --- /dev/null +++ b/sync_state_machine/domain/material/register.py @@ -0,0 +1,17 @@ +"""Material domain registration""" +from ...common.registry import DomainRegistry +from schemas.material.material import MaterialResponse +from .sync_node import MaterialSyncNode +from .sync_strategy import MaterialSyncStrategy +from .jsonl_handler import MaterialJsonlHandler +from .api_handler import MaterialApiHandler + +# 注册 material domain +DomainRegistry.register( + node_type="material", + schema=MaterialResponse, + node_class=MaterialSyncNode, + strategy_class=MaterialSyncStrategy, + jsonl_handler_class=MaterialJsonlHandler, + api_handler_class=MaterialApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/material/sync_node.py b/sync_state_machine/domain/material/sync_node.py new file mode 100644 index 0000000..39408c9 --- /dev/null +++ b/sync_state_machine/domain/material/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.material.material import MaterialResponse + + +class MaterialSyncNode(SyncNode[MaterialResponse]): + """物资同步节点""" + node_type = "material" + schema = MaterialResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/material/sync_strategy.py b/sync_state_machine/domain/material/sync_strategy.py new file mode 100644 index 0000000..43b6ad9 --- /dev/null +++ b/sync_state_machine/domain/material/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.material.material import MaterialResponse + + +class MaterialSyncStrategy(DefaultSyncStrategy[MaterialResponse]): + """ + Material 同步策略(合同子业务)。 + """ + + schema = MaterialResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["contract_id", "material_type"], + depend_fields={"contract_id": "contract", "project_id": "project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/material_detail/__init__.py b/sync_state_machine/domain/material_detail/__init__.py new file mode 100644 index 0000000..7192ccc --- /dev/null +++ b/sync_state_machine/domain/material_detail/__init__.py @@ -0,0 +1,8 @@ +""" +Material Detail Domain +""" +from .sync_node import MaterialDetailSyncNode +from .sync_strategy import MaterialDetailSyncStrategy +from .jsonl_handler import MaterialDetailJsonlHandler + +__all__ = ["MaterialDetailSyncNode", "MaterialDetailSyncStrategy", "MaterialDetailJsonlHandler"] diff --git a/sync_state_machine/domain/material_detail/api_handler.py b/sync_state_machine/domain/material_detail/api_handler.py new file mode 100644 index 0000000..32e904a --- /dev/null +++ b/sync_state_machine/domain/material_detail/api_handler.py @@ -0,0 +1,331 @@ +""" +Material Detail API Handler + +职责: +- 加载物资明细列表(依赖 Material) +- 物资明细创建/更新/删除 + +实现的接口: +GET: +- /material_detail/list - 获取物资明细列表 + +POST: +- /material_detail/create - 创建物资明细 + +PUT: +- /material_detail/update - 更新物资明细 + +DELETE: +- /material_detail/delete - 删除物资明细 +""" + +from typing import List, Dict, Any +from pydantic import ValidationError + +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_VALIDATION_FAILED, ERROR_ID_NOT_FOUND +from .sync_node import MaterialDetailSyncNode +from schemas.material.material_detail import ( + MaterialDetailResponse, + MaterialDetailCreate, + MaterialDetailUpdate +) + + +class MaterialDetailApiHandler(BaseApiHandler): + """物资明细 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "material_detail" + self._node_class = MaterialDetailSyncNode + self._schema = MaterialDetailResponse + self.update_schemas = [MaterialDetailCreate, MaterialDetailUpdate] + + async def load(self) -> List[SyncNode]: + """加载物资明细列表(依赖 Material)""" + try: + materials = self._collection.filter(node_type="material") + material_ids = [m.data_id for m in materials if m.data_id] + + if not material_ids: + return [] + + all_nodes = [] + for material_id in material_ids: + try: + details = await api_get_material_detail_list(self.api_client, material_id) + for detail_model in details: + # 已验证的 Pydantic model,转换为 dict + detail_data = detail_model.model_dump() + node = self._create_node(detail_data) + all_nodes.append(node) + + except Exception as e: + print(f"❌ Failed to load material details for {material_id}: {e}") + + return all_nodes + except Exception as e: + print(f"❌ Failed to load material details: {e}") + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建物资明细""" + results = [] + for node in nodes: + try: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 从data的parent_id获取material_id + material_id = data.get("parent_id") + + if not material_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_ID_NOT_FOUND)) + continue + + # 验证并转换为 Pydantic model + try: + create_data = {"material_id": material_id, **data} + create_model = MaterialDetailCreate.model_validate(create_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + + response = await api_create_material_detail( + self.api_client, + create_model, + push_id, + ) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Create failed: {str(e)}")) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新物资明细 + + 按 material_id 分组,每组使用同一个 push_id 批量提交 + """ + from collections import defaultdict + + results = [] + + # 按 material_id 分组 + groups: Dict[str, List[tuple[SyncNode, Dict[str, Any]]]] = defaultdict(list) + + for node in nodes: + try: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + + # 使用 _get_schema_diff 检查差异并打印日志 + diff_fields = self._get_schema_diff(MaterialDetailUpdate, data, origin_data, node.node_id) + if not diff_fields: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 获取 material_id(parent_id) + material_id = data.get("parent_id") or node.context.get("material_id") + if not material_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing material_id (parent_id)")) + continue + + # 需要完整的 schema 数据(包括必填字段) + update_data = self._filter_update_data(data, origin_data, MaterialDetailUpdate) + + # 验证并转换为 Pydantic model + try: + update_model = MaterialDetailUpdate.model_validate(update_data) + groups[material_id].append((node, update_model)) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Update failed: {str(e)}")) + + # 逐组批量更新 + for material_id, group_items in groups.items(): + push_id = self._generate_push_id() + + # 准备批量数据 + detail_list = [model.model_dump(mode='json', exclude_unset=True) for node, model in group_items] + + # 使用 parent_id(material_id)作为 biz_id + biz_id = material_id + + try: + # 批量调用 API + await api_update_material_detail( + self.api_client, + {"detail_list": detail_list}, + push_id, + biz_id + ) + # 整组成功 + for node, _ in group_items: + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + # 整组失败 + error_msg = str(e) + for node, _ in group_items: + results.append(TaskResult.failed(node_id=node.node_id, error=error_msg)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除物资明细""" + results = [] + for node in nodes: + try: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + await api_delete_material_detail( + self.api_client, + push_id, + biz_id + ) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Delete failed: {str(e)}")) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + """创建物资明细节点,设置 material_id 到 context""" + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("material_id"): + node.context["material_id"] = data["material_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_material_detail_list(client, material_id: str) -> List[MaterialDetailResponse]: + """ + 获取物资明细列表 GET /material_detail/list + + Args: + client: API 客户端 + material_id: 物资ID + + Returns: + List[MaterialDetailResponse]: 验证过的明细列表 + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/material/detail/list", + params={"material_id": material_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = MaterialDetailResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid material detail item: {e}") + continue + + return validated_items + + +async def api_create_material_detail(client, data: MaterialDetailCreate, push_id: str) -> Dict[str, Any]: + """ + 创建物资明细 POST /material_detail/create + + Args: + client: API 客户端 + data: 创建数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "data": data.model_dump(mode='json')} + response = await client.request( + method="POST", + endpoint="/material/detail/create", + data=request_data + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_material_detail(client, data: Dict[str, Any], push_id: str, biz_id: str): + """ + 更新物资明细 PUT /material_detail/update + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = { + "push_id": push_id, + "biz_id": biz_id, + "data": data + } + response = await client.request( + method="PUT", + endpoint="/material/detail/update", + data=request_data + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_material_detail(client, push_id: str, biz_id: str): + """删除物资明细""" + request_data = { + "push_id": push_id, + "biz_id": biz_id + } + response = await client.request( + method="DELETE", + endpoint="/material/detail/delete", + data=request_data + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/material_detail/jsonl_handler.py b/sync_state_machine/domain/material_detail/jsonl_handler.py new file mode 100644 index 0000000..2d64979 --- /dev/null +++ b/sync_state_machine/domain/material_detail/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Material Detail JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import MaterialDetailSyncNode +from schemas.material.material_detail import MaterialDetailResponse + + +class MaterialDetailJsonlHandler(BaseJsonlHandler): + """物资明细 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "material_detail", MaterialDetailSyncNode, MaterialDetailResponse) diff --git a/sync_state_machine/domain/material_detail/register.py b/sync_state_machine/domain/material_detail/register.py new file mode 100644 index 0000000..deb401f --- /dev/null +++ b/sync_state_machine/domain/material_detail/register.py @@ -0,0 +1,17 @@ +"""Material detail domain registration""" +from ...common.registry import DomainRegistry +from schemas.material.material_detail import MaterialDetailResponse +from .sync_node import MaterialDetailSyncNode +from .sync_strategy import MaterialDetailSyncStrategy +from .jsonl_handler import MaterialDetailJsonlHandler +from .api_handler import MaterialDetailApiHandler + +# 注册 material_detail domain +DomainRegistry.register( + node_type="material_detail", + schema=MaterialDetailResponse, + node_class=MaterialDetailSyncNode, + strategy_class=MaterialDetailSyncStrategy, + jsonl_handler_class=MaterialDetailJsonlHandler, + api_handler_class=MaterialDetailApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/material_detail/sync_node.py b/sync_state_machine/domain/material_detail/sync_node.py new file mode 100644 index 0000000..8f8ac80 --- /dev/null +++ b/sync_state_machine/domain/material_detail/sync_node.py @@ -0,0 +1,11 @@ +""" +Material Detail Domain +""" +from ...common import SyncNode +from schemas.material.material_detail import MaterialDetailResponse + + +class MaterialDetailSyncNode(SyncNode[MaterialDetailResponse]): + """物资明细同步节点""" + node_type = "material_detail" + schema = MaterialDetailResponse diff --git a/sync_state_machine/domain/material_detail/sync_strategy.py b/sync_state_machine/domain/material_detail/sync_strategy.py new file mode 100644 index 0000000..6f924ff --- /dev/null +++ b/sync_state_machine/domain/material_detail/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.material.material_detail import MaterialDetailResponse + + +class MaterialDetailSyncStrategy(DefaultSyncStrategy[MaterialDetailResponse]): + """ + Material Detail 同步策略(合同子业务明细)。 + """ + + schema = MaterialDetailResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["parent_id", "date"], + depend_fields={"parent_id": "material"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/personnel/__init__.py b/sync_state_machine/domain/personnel/__init__.py new file mode 100644 index 0000000..263c0a5 --- /dev/null +++ b/sync_state_machine/domain/personnel/__init__.py @@ -0,0 +1,6 @@ +"""Personnel domain""" +from .sync_node import PersonnelSyncNode +from .sync_strategy import PersonnelSyncStrategy +from .jsonl_handler import PersonnelJsonlHandler + +__all__ = ["PersonnelSyncNode", "PersonnelSyncStrategy", "PersonnelJsonlHandler"] diff --git a/sync_state_machine/domain/personnel/api_handler.py b/sync_state_machine/domain/personnel/api_handler.py new file mode 100644 index 0000000..c464dab --- /dev/null +++ b/sync_state_machine/domain/personnel/api_handler.py @@ -0,0 +1,260 @@ +""" +Personnel API Handler + +职责: +- 加载人员列表(依赖 Project) +- 人员创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_PROJECT_ID_NOT_FOUND +from .sync_node import PersonnelSyncNode +from schemas.power.power import PowerResponse, PowerCreate, PowerUpdate, PowerPlanUpdate + + +class PersonnelApiHandler(BaseApiHandler): + """人员 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "personnel" + self._node_class = PersonnelSyncNode + self._schema = PowerResponse + self.update_schemas = [PowerCreate, PowerUpdate, PowerPlanUpdate] + + async def load(self) -> List[SyncNode]: + """加载人员列表(依赖 Project)""" + projects = self._collection.filter(node_type="project") + project_ids = [p.data_id for p in projects if p.data_id] + + if not project_ids: + return [] + + all_personnel = [] + for project_id in project_ids: + try: + personnel_list = await api_get_personnel_list(self.api_client, project_id) + for personnel in personnel_list: + all_personnel.append(self._create_node(personnel)) + except Exception as e: + print(f"❌ Failed to load personnel for project {project_id}: {e}") + + return all_personnel + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建人员""" + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + project_id = node.context.get("project_id") or data.get("project_id") + if not project_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_PROJECT_ID_NOT_FOUND)) + continue + + push_id = self._generate_push_id() + + try: + request_data = {"project_id": project_id, **data} + PowerCreate.model_validate(request_data) + response = await api_create_personnel(self.api_client, request_data, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新人员 + + 支持两种更新类型: + 1. PowerUpdate - 基础信息更新 + 2. PowerPlanUpdate - 计划信息更新 + + 更新逻辑: + - 对每种 schema,检查是否有差异 + - 如果有差异,调用对应 API + """ + from pydantic import ValidationError + + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + biz_id = node.data_id or data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + node_updated = False + error = None + + # 1. 基础信息更新 (PowerUpdate) + base_diff = self._get_schema_diff(PowerUpdate, data, origin_data, node.node_id) + if base_diff: + try: + update_model = PowerUpdate.model_validate(data) + push_id = self._generate_push_id() + await api_update_personnel(self.api_client, update_model.model_dump(), push_id, biz_id) + node_updated = True + except ValidationError as e: + error = f"Validation failed: {e}" + + # 2. 计划信息更新 (PowerPlanUpdate) + plan_fields = [ + "plan_start_date", + "plan_start_quantity", + "plan_exit_date", + "plan_node", + ] + plan_diff = { + key: data.get(key) + for key in plan_fields + if data.get(key) != origin_data.get(key) + } + if not error and plan_diff: + try: + plan_model = PowerPlanUpdate.model_validate(data) + push_id = self._generate_push_id() + await api_update_personnel_plan( + self.api_client, + plan_model.model_dump(), + push_id, + biz_id, + ) + node_updated = True + except ValidationError as e: + error = f"Validation failed: {e}" + + # 汇总结果 + if error: + results.append(TaskResult.failed(node_id=node.node_id, error=error)) + elif node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + else: + # 没有任何字段需要更新 + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除人员""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_personnel(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + node.context["personnel_id"] = node.data_id + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_personnel(client, personnel_id: str) -> Dict[str, Any]: + """获取单个力能数据 GET /personnel""" + response = await client.request( + method="GET", + endpoint="/personnel", + params={"personnel_id": personnel_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("data", {}) + + +async def api_create_personnel(client, data: Dict[str, Any], push_id: str) -> Dict[str, Any]: + """创建力能 POST /personnel/create""" + request_data = {"push_id": push_id, "data": data} + response = await client.request(method="POST", endpoint="/personnel/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_personnel(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """更新力能 PUT /personnel/update""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/personnel/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +# ========== 静态 API 函数 ========== + +async def api_get_personnel_list(client, project_id: str) -> List[Dict[str, Any]]: + """GET /personnel/list - 获取人员列表""" + response = await client.request( + method="GET", + endpoint="/personnel/list", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + items = response.get("data", []) + validated_items: List[Dict[str, Any]] = [] + for item in items: + validated = PowerResponse.model_validate(item) + validated_items.append(validated.model_dump()) + return validated_items + + +async def api_delete_personnel(client, personnel_id: str, push_id: str) -> None: + """删除力能 DELETE /personnel/delete""" + request_data = {"push_id": push_id, "biz_id": personnel_id} + response = await client.request(method="DELETE", endpoint="/personnel/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_personnel_plan(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """更新力能计划 PUT /personnel/plan""" + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/personnel/plan", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/personnel/jsonl_handler.py b/sync_state_machine/domain/personnel/jsonl_handler.py new file mode 100644 index 0000000..0ec04ca --- /dev/null +++ b/sync_state_machine/domain/personnel/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Personnel Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import PersonnelSyncNode +from schemas.power.power import PowerResponse + + +class PersonnelJsonlHandler(BaseJsonlHandler): + """人员 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "personnel", PersonnelSyncNode, PowerResponse) diff --git a/sync_state_machine/domain/personnel/register.py b/sync_state_machine/domain/personnel/register.py new file mode 100644 index 0000000..8bad915 --- /dev/null +++ b/sync_state_machine/domain/personnel/register.py @@ -0,0 +1,17 @@ +"""Personnel domain registration""" +from ...common.registry import DomainRegistry +from schemas.power.power import PowerResponse +from .sync_node import PersonnelSyncNode +from .sync_strategy import PersonnelSyncStrategy +from .jsonl_handler import PersonnelJsonlHandler +from .api_handler import PersonnelApiHandler + +# 注册 personnel domain +DomainRegistry.register( + node_type="personnel", + schema=PowerResponse, + node_class=PersonnelSyncNode, + strategy_class=PersonnelSyncStrategy, + jsonl_handler_class=PersonnelJsonlHandler, + api_handler_class=PersonnelApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/personnel/sync_node.py b/sync_state_machine/domain/personnel/sync_node.py new file mode 100644 index 0000000..81670f5 --- /dev/null +++ b/sync_state_machine/domain/personnel/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.power.power import PowerResponse + + +class PersonnelSyncNode(SyncNode[PowerResponse]): + """人员同步节点""" + node_type = "personnel" + schema = PowerResponse + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/personnel/sync_strategy.py b/sync_state_machine/domain/personnel/sync_strategy.py new file mode 100644 index 0000000..bddbf7b --- /dev/null +++ b/sync_state_machine/domain/personnel/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.power.power import PowerResponse + + +class PersonnelSyncStrategy(DefaultSyncStrategy[PowerResponse]): + """ + Personnel 同步策略(合同子业务)。 + """ + + schema = PowerResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "code"], + depend_fields={"project_id": "project", "contract_id": "contract"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/personnel_detail/__init__.py b/sync_state_machine/domain/personnel_detail/__init__.py new file mode 100644 index 0000000..65479a0 --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/__init__.py @@ -0,0 +1,8 @@ +""" +Personnel Detail Domain +""" +from .sync_node import PersonnelDetailSyncNode +from .sync_strategy import PersonnelDetailSyncStrategy +from .jsonl_handler import PersonnelDetailJsonlHandler + +__all__ = ["PersonnelDetailSyncNode", "PersonnelDetailSyncStrategy", "PersonnelDetailJsonlHandler"] diff --git a/sync_state_machine/domain/personnel_detail/api_handler.py b/sync_state_machine/domain/personnel_detail/api_handler.py new file mode 100644 index 0000000..1d7ac47 --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/api_handler.py @@ -0,0 +1,224 @@ +""" +Personnel Detail API Handler + +职责: +- 加载人员明细列表(依赖 Personnel) +- 人员明细创建/更新/删除(批量接口) +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_NODE_DATA_NONE, ERROR_ID_NOT_FOUND +from .sync_node import PersonnelDetailSyncNode +from schemas.power.power_detail import PowerDetail, PowerDetailCreate, PowerDetailUpdate + + +class PersonnelDetailApiHandler(BaseApiHandler): + """人员明细 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "personnel_detail" + self._node_class = PersonnelDetailSyncNode + self._schema = PowerDetail + self.update_schemas = [PowerDetailCreate, PowerDetailUpdate] + + async def load(self) -> List[SyncNode]: + """加载人员明细列表(依赖 Personnel)""" + personnel_list = self._collection.filter(node_type="personnel") + personnel_ids = [p.data_id for p in personnel_list if p.data_id] + + if not personnel_ids: + return [] + + all_details = [] + for personnel_id in personnel_ids: + try: + details = await api_get_personnel_detail_list(self.api_client, personnel_id) + for detail in details: + validated = PowerDetail.model_validate(detail) + all_details.append(self._create_node(validated.model_dump())) + except Exception as e: + print(f"❌ Failed to load personnel details for {personnel_id}: {e}") + + return all_details + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量创建人员明细""" + results = [] + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + # 从data的parent_id获取personnel_id + personnel_id = data.get("parent_id") + if not personnel_id: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_ID_NOT_FOUND)) + continue + + push_id = self._generate_push_id() + + try: + request_data = {"personnel_id": personnel_id, **data} + PowerDetailCreate.model_validate(request_data) + response = await api_create_personnel_detail(self.api_client, request_data, push_id) + if self.poll_mode == "sync": + created_id = self._extract_created_id_from_response(response) + if not created_id: + results.append( + TaskResult.failed( + node_id=node.node_id, + error="Missing created_id in create response" + ) + ) + continue + results.append(TaskResult.success(node_id=node.node_id, data_id=created_id)) + else: + results.append(TaskResult.in_progress(node_id=node.node_id, task_id=push_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新人员明细 + + 按 personnel_id 分组,每组使用同一个 push_id 批量提交 + """ + from pydantic import ValidationError + from collections import defaultdict + + results = [] + + # 按 personnel_id 分组 + groups: Dict[str, List[tuple[SyncNode, Dict[str, Any]]]] = defaultdict(list) + + for node in nodes: + data = node.get_data() + if not data: + results.append(TaskResult.failed(node_id=node.node_id, error=ERROR_NODE_DATA_NONE)) + continue + + origin_data = node.get_origin_data() or {} + + # 使用 _get_schema_diff 检查差异并打印日志 + diff_fields = self._get_schema_diff(PowerDetailUpdate, data, origin_data, node.node_id) + if not diff_fields: + from ...common.types import SyncAction + results.append(TaskResult.skipped(node_id=node.node_id, reason="No updatable fields changed")) + continue + + # 获取 personnel_id(parent_id) + personnel_id = data.get("parent_id") or node.context.get("personnel_id") + if not personnel_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing personnel_id (parent_id)")) + continue + + # 需要完整的 schema 数据(包括必填字段) + update_data = self._filter_update_data(data, origin_data, PowerDetailUpdate) + + # 验证并转换为 Pydantic model + try: + update_model = PowerDetailUpdate.model_validate(update_data) + groups[personnel_id].append((node, update_model)) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Validation failed: {e}")) + + # 逐组批量更新 + for personnel_id, group_items in groups.items(): + push_id = self._generate_push_id() + + # 准备批量数据 + detail_list = [model.model_dump(exclude_unset=True) for node, model in group_items] + + # 使用 parent_id(personnel_id)作为 biz_id + biz_id = personnel_id + + try: + # 批量调用 API + await api_update_personnel_detail( + self.api_client, + {"detail_list": detail_list}, + push_id, + biz_id, + ) + # 整组成功 + for node, _ in group_items: + results.append(TaskResult.success(node_id=node.node_id, push_id=push_id)) + except Exception as e: + # 整组失败 + error_msg = str(e) + for node, _ in group_items: + results.append(TaskResult.failed(node_id=node.node_id, error=error_msg)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量删除人员明细""" + results = [] + for node in nodes: + push_id = self._generate_push_id() + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for delete")) + continue + + try: + await api_delete_personnel_detail(self.api_client, biz_id, push_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("personnel_id"): + node.context["personnel_id"] = data["personnel_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_get_personnel_detail_list(client, personnel_id: str) -> List[Dict[str, Any]]: + response = await client.request( + method="GET", + endpoint="/personnel/detail/list", + params={"personnel_id": personnel_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response.get("data", []) + + +async def api_create_personnel_detail(client, data: Dict[str, Any], push_id: str) -> Dict[str, Any]: + request_data = {"push_id": push_id, "data": data} + response = await client.request(method="POST", endpoint="/personnel/detail/create", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + return response + + +async def api_update_personnel_detail(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/personnel/detail/update", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_delete_personnel_detail(client, detail_id: str, push_id: str) -> None: + request_data = {"push_id": push_id, "biz_id": detail_id} + response = await client.request(method="DELETE", endpoint="/personnel/detail/delete", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/personnel_detail/jsonl_handler.py b/sync_state_machine/domain/personnel_detail/jsonl_handler.py new file mode 100644 index 0000000..1368a09 --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Personnel Detail JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import PersonnelDetailSyncNode +from schemas.power.power_detail import PowerDetail + + +class PersonnelDetailJsonlHandler(BaseJsonlHandler): + """人员明细 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "personnel_detail", PersonnelDetailSyncNode, PowerDetail) diff --git a/sync_state_machine/domain/personnel_detail/register.py b/sync_state_machine/domain/personnel_detail/register.py new file mode 100644 index 0000000..a6534e6 --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/register.py @@ -0,0 +1,17 @@ +"""Personnel detail domain registration""" +from ...common.registry import DomainRegistry +from schemas.power.power_detail import PowerDetail +from .sync_node import PersonnelDetailSyncNode +from .sync_strategy import PersonnelDetailSyncStrategy +from .jsonl_handler import PersonnelDetailJsonlHandler +from .api_handler import PersonnelDetailApiHandler + +# 注册 personnel_detail domain +DomainRegistry.register( + node_type="personnel_detail", + schema=PowerDetail, + node_class=PersonnelDetailSyncNode, + strategy_class=PersonnelDetailSyncStrategy, + jsonl_handler_class=PersonnelDetailJsonlHandler, + api_handler_class=PersonnelDetailApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/personnel_detail/sync_node.py b/sync_state_machine/domain/personnel_detail/sync_node.py new file mode 100644 index 0000000..b15927d --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/sync_node.py @@ -0,0 +1,11 @@ +""" +Personnel Detail Domain +""" +from ...common import SyncNode +from schemas.power.power_detail import PowerDetail + + +class PersonnelDetailSyncNode(SyncNode[PowerDetail]): + """人员明细同步节点""" + node_type = "personnel_detail" + schema = PowerDetail diff --git a/sync_state_machine/domain/personnel_detail/sync_strategy.py b/sync_state_machine/domain/personnel_detail/sync_strategy.py new file mode 100644 index 0000000..2f14949 --- /dev/null +++ b/sync_state_machine/domain/personnel_detail/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.power.power_detail import PowerDetail + + +class PersonnelDetailSyncStrategy(DefaultSyncStrategy[PowerDetail]): + """ + Personnel Detail 同步策略(合同子业务明细)。 + """ + + schema = PowerDetail + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["parent_id", "date"], + depend_fields={"parent_id": "personnel"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/preparation/__init__.py b/sync_state_machine/domain/preparation/__init__.py new file mode 100644 index 0000000..3c03594 --- /dev/null +++ b/sync_state_machine/domain/preparation/__init__.py @@ -0,0 +1,6 @@ +"""Preparation domain""" +from .sync_node import PreparationSyncNode +from .sync_strategy import PreparationSyncStrategy +from .jsonl_handler import PreparationJsonlHandler + +__all__ = ["PreparationSyncNode", "PreparationSyncStrategy", "PreparationJsonlHandler"] diff --git a/sync_state_machine/domain/preparation/api_handler.py b/sync_state_machine/domain/preparation/api_handler.py new file mode 100644 index 0000000..f1c712e --- /dev/null +++ b/sync_state_machine/domain/preparation/api_handler.py @@ -0,0 +1,153 @@ +""" +Preparation (里程碑) API Handler + +职责: +- 更新项目里程碑数据 +- 不支持创建和删除(里程碑随项目自动生成) + +实现的接口: +PUT: +- /preparation - 更新里程碑数据 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_VALIDATION_FAILED +from .sync_node import PreparationSyncNode +from schemas.project_extensions.preparation import PreparationDetail, PostPreparation + + +class PreparationApiHandler(BaseApiHandler): + """里程碑 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "preparation" + self._node_class = PreparationSyncNode + self._schema = PreparationDetail + self._filter_project_id = None + self.update_schemas = [PostPreparation] + + def set_filter_project_id(self, project_id: str | List[str]): + """设置要加载的项目ID过滤列表""" + self._filter_project_id = project_id + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + """设置目标项目ID列表""" + self.set_filter_project_id(target_project_ids) + + async def load(self) -> List[SyncNode]: + """从 API 加载里程碑数据(需要项目上下文)""" + from ..project.api_handler import ProjectApiHandler + + # 获取要加载的项目列表 + projects = self._collection.filter(node_type="project") + if not projects: + print(" No projects found, skipping preparation load") + return [] + + nodes = [] + for project in projects: + project_id = project.data_id + + try: + # 从 project context 或缓存获取 all_info + all_info = project.context.get("all_info") + if not all_info: + all_info = await ProjectApiHandler.get_all_info( + self.api_client, + project_id + ) + + # 提取 preparation_list + preparation_list = all_info.get("preparation_list", []) + print(f" Project {project_id}: {len(preparation_list)} preparations") + + for prep_data in preparation_list: + # 验证数据 + try: + validated = self._schema.model_validate(prep_data) + node = self._create_node(validated.model_dump()) + nodes.append(node) + except Exception as e: + print(f" Skipping invalid preparation: {e}") + continue + + except Exception as e: + print(f" Failed to load preparations for project {project_id}: {e}") + continue + + return nodes + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建(里程碑随项目自动生成)""" + return [ + TaskResult.failed(node_id=node.node_id, error="Preparation creation not supported (auto-generated with project)") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新里程碑数据""" + from pydantic import ValidationError + + results = [] + + for node in nodes: + node_data = node.get_data() + if node_data is None: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + + origin_data = node.get_origin_data() or {} + update_data = self._filter_update_data(node_data, origin_data, PostPreparation) + if not update_data: + reason = f"No physical diff found for preparation {node.data_id} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] [preparation] {reason}") + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + continue + + # 验证并转换为 Pydantic model + try: + update_model = PostPreparation.model_validate(update_data) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + biz_id = node.data_id or update_model.id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + try: + await api_update_preparation(self.api_client, update_model, push_id, biz_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Preparation deletion not supported") + for node in nodes + ] + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + return self._create_basic_node(data, depend_ids=[]) + + +# ========== 静态 API 函数 ========== + +async def api_update_preparation(client, data: PostPreparation, push_id: str, biz_id: str) -> None: + """ + PUT /preparation_nodes - 更新里程碑数据 + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/preparation_nodes", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/preparation/jsonl_handler.py b/sync_state_machine/domain/preparation/jsonl_handler.py new file mode 100644 index 0000000..5ee7df4 --- /dev/null +++ b/sync_state_machine/domain/preparation/jsonl_handler.py @@ -0,0 +1,11 @@ +"""Preparation Domain - JSONL Handler""" +from ...datasource.jsonl.handler import BaseJsonlHandler +from ...datasource.jsonl.datasource import JsonlDataSource +from .sync_node import PreparationSyncNode +from schemas.project_extensions.preparation import PreparationDetail + + +class PreparationJsonlHandler(BaseJsonlHandler): + """里程碑 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "preparation", PreparationSyncNode, PreparationDetail) diff --git a/sync_state_machine/domain/preparation/register.py b/sync_state_machine/domain/preparation/register.py new file mode 100644 index 0000000..8e7df6b --- /dev/null +++ b/sync_state_machine/domain/preparation/register.py @@ -0,0 +1,23 @@ +"""Preparation domain registration""" +from ...common.registry import DomainRegistry +from .sync_node import PreparationSyncNode, PreparationDetail +from .sync_strategy import PreparationSyncStrategy +from .jsonl_handler import PreparationJsonlHandler +from .api_handler import PreparationApiHandler +from ...sync_system.config import StrategyConfig, OrphanAction + +# 注册 preparation domain +DomainRegistry.register( + node_type="preparation", + schema=PreparationDetail, + node_class=PreparationSyncNode, + strategy_class=PreparationSyncStrategy, + jsonl_handler_class=PreparationJsonlHandler, + api_handler_class=PreparationApiHandler, + config=StrategyConfig( + auto_bind_fields=["project_id", "code"], + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + depend_fields={"project_id": "project"} + ) +) diff --git a/sync_state_machine/domain/preparation/sync_node.py b/sync_state_machine/domain/preparation/sync_node.py new file mode 100644 index 0000000..2900f91 --- /dev/null +++ b/sync_state_machine/domain/preparation/sync_node.py @@ -0,0 +1,14 @@ +"""Preparation SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.project_extensions.preparation import PreparationDetail +from pydantic import Field +from typing import Optional + +class PreparationSyncNode(SyncNode[PreparationDetail]): + """里程碑同步节点""" + node_type = "preparation" + schema = PreparationDetail + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/preparation/sync_strategy.py b/sync_state_machine/domain/preparation/sync_strategy.py new file mode 100644 index 0000000..ced16f7 --- /dev/null +++ b/sync_state_machine/domain/preparation/sync_strategy.py @@ -0,0 +1,38 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from ...sync_system.strategy_ops.compare_ops import normalized_data_for_compare, collect_payload_diffs +from schemas.project_extensions.preparation import PreparationDetail, PostPreparation + + +class PreparationSyncStrategy(DefaultSyncStrategy[PreparationDetail]): + """ + Preparation 同步策略(项目扩展)。 + """ + + schema = PreparationDetail + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "code"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + def _needs_update(self, source_node, target_node, resolved_data=None, data_id_map=None) -> bool: + if resolved_data is None: + raise ValueError(f"[{self.node_type}] resolved_data is required for differential sync.") + + target_data = target_node.get_data() + if target_data is None: + return False + + update_fields = set(PostPreparation.model_fields.keys()) + source_payload = {key: value for key, value in resolved_data.items() if key in update_fields} + target_payload = {key: value for key, value in target_data.items() if key in update_fields} + + normalized_source = normalized_data_for_compare(source_payload, data_id_map or {}) + normalized_target = normalized_data_for_compare(target_payload, data_id_map or {}) + diff_map = collect_payload_diffs(normalized_source, normalized_target, max_items=8) + return bool(diff_map) \ No newline at end of file diff --git a/sync_state_machine/domain/production/__init__.py b/sync_state_machine/domain/production/__init__.py new file mode 100644 index 0000000..db91eda --- /dev/null +++ b/sync_state_machine/domain/production/__init__.py @@ -0,0 +1,6 @@ +"""Production domain""" +from .sync_node import ProductionSyncNode +from .sync_strategy import ProductionSyncStrategy +from .jsonl_handler import ProductionJsonlHandler + +__all__ = ["ProductionSyncNode", "ProductionSyncStrategy", "ProductionJsonlHandler"] diff --git a/sync_state_machine/domain/production/api_handler.py b/sync_state_machine/domain/production/api_handler.py new file mode 100644 index 0000000..4c7ca54 --- /dev/null +++ b/sync_state_machine/domain/production/api_handler.py @@ -0,0 +1,166 @@ +""" +Production (投产节点) API Handler + +职责: +- 更新项目投产节点数据 +- 不支持创建和删除(投产节点随项目自动生成) + +实现的接口: +PUT: +- /production - 更新投产节点数据 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_VALIDATION_FAILED +from .sync_node import ProductionSyncNode +from schemas.project_extensions.production import ProductionDetail, PostProduction + + +class ProductionApiHandler(BaseApiHandler): + """投产节点 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "production" + self._node_class = ProductionSyncNode + self._schema = ProductionDetail + self.update_schemas = [PostProduction] + + async def load(self) -> List[SyncNode]: + """加载投产节点数据(从 project all_info 中提取)""" + from ..project.api_handler import ProjectApiHandler + + # 获取已加载的项目 + projects = self._collection.filter(node_type="project") + if not projects: + print("⚠️ No projects found, skipping production load") + return [] + + nodes = [] + for project in projects: + project_id = project.data_id + + try: + # 从 project context 或缓存获取 all_info + all_info = project.context.get("all_info") + if not all_info: + all_info = await ProjectApiHandler.get_all_info( + self.api_client, + project_id + ) + + # 提取 production_list + production_list = all_info.get("production_list", []) + print(f" Project {project_id}: {len(production_list)} productions") + + for prod_data in production_list: + # 验证数据 + try: + validated = self._schema.model_validate(prod_data) + node = self._create_node(validated.model_dump()) + node.context["project_id"] = project_id + nodes.append(node) + except Exception as e: + print(f"⚠️ Skipping invalid production: {e}") + continue + + except Exception as e: + print(f"❌ Failed to load productions for project {project_id}: {e}") + continue + + return nodes + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="Production creation not supported (auto-generated with project)") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新投产节点数据""" + from pydantic import ValidationError + + results = [] + + for node in nodes: + # 获取节点数据 (仅限 schema 内字段) + node_data = node.get_data() + if not node_data: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + + # 获取来自 API load 的原始数据进行对比 + origin_data = node.get_origin_data() or {} + + # 获取过滤后的更新数据 + update_data = self._filter_update_data(node_data, origin_data, PostProduction) + + if not update_data: + reason = f"No physical diff found for production {node.data_id} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] [production] {reason}") + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + continue + + # 验证并转换为 Pydantic model + try: + update_model = PostProduction.model_validate(update_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + update_model_data = update_model.model_dump() + biz_id = node.data_id or update_model_data.get("id") + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + try: + await api_update_production(self.api_client, update_model, push_id, biz_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Production deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_update_production(client, data: PostProduction, push_id: str, biz_id: str) -> None: + """ + PUT /production - 更新投产节点数据 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/production_nodes", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/production/jsonl_handler.py b/sync_state_machine/domain/production/jsonl_handler.py new file mode 100644 index 0000000..b7a3ba9 --- /dev/null +++ b/sync_state_machine/domain/production/jsonl_handler.py @@ -0,0 +1,10 @@ +"""Production Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ProductionSyncNode +from schemas.project_extensions.production import ProductionDetail + + +class ProductionJsonlHandler(BaseJsonlHandler): + """投产节点 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "production", ProductionSyncNode, ProductionDetail) diff --git a/sync_state_machine/domain/production/register.py b/sync_state_machine/domain/production/register.py new file mode 100644 index 0000000..e577d75 --- /dev/null +++ b/sync_state_machine/domain/production/register.py @@ -0,0 +1,17 @@ +"""Production domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.production import ProductionDetail +from .sync_node import ProductionSyncNode +from .sync_strategy import ProductionSyncStrategy +from .jsonl_handler import ProductionJsonlHandler +from .api_handler import ProductionApiHandler + +# 注册 production domain +DomainRegistry.register( + node_type="production", + schema=ProductionDetail, + node_class=ProductionSyncNode, + strategy_class=ProductionSyncStrategy, + jsonl_handler_class=ProductionJsonlHandler, + api_handler_class=ProductionApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/production/sync_node.py b/sync_state_machine/domain/production/sync_node.py new file mode 100644 index 0000000..b161384 --- /dev/null +++ b/sync_state_machine/domain/production/sync_node.py @@ -0,0 +1,13 @@ +"""Production SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.project_extensions.production import ProductionDetail + + +class ProductionSyncNode(SyncNode[ProductionDetail]): + """投产节点同步节点""" + node_type = "production" + schema = ProductionDetail + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/production/sync_strategy.py b/sync_state_machine/domain/production/sync_strategy.py new file mode 100644 index 0000000..66eeb11 --- /dev/null +++ b/sync_state_machine/domain/production/sync_strategy.py @@ -0,0 +1,38 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from ...sync_system.strategy_ops.compare_ops import normalized_data_for_compare, collect_payload_diffs +from schemas.project_extensions.production import ProductionDetail, PostProduction + + +class ProductionSyncStrategy(DefaultSyncStrategy[ProductionDetail]): + """ + Production 同步策略(项目扩展)。 + """ + + schema = ProductionDetail + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "code"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + def _needs_update(self, source_node, target_node, resolved_data=None, data_id_map=None) -> bool: + if resolved_data is None: + raise ValueError(f"[{self.node_type}] resolved_data is required for differential sync.") + + target_data = target_node.get_data() + if target_data is None: + return False + + update_fields = set(PostProduction.model_fields.keys()) + source_payload = {key: value for key, value in resolved_data.items() if key in update_fields} + target_payload = {key: value for key, value in target_data.items() if key in update_fields} + + normalized_source = normalized_data_for_compare(source_payload, data_id_map or {}) + normalized_target = normalized_data_for_compare(target_payload, data_id_map or {}) + diff_map = collect_payload_diffs(normalized_source, normalized_target, max_items=8) + return bool(diff_map) \ No newline at end of file diff --git a/sync_state_machine/domain/project/__init__.py b/sync_state_machine/domain/project/__init__.py new file mode 100644 index 0000000..cdda6c1 --- /dev/null +++ b/sync_state_machine/domain/project/__init__.py @@ -0,0 +1,6 @@ +"""Project domain""" +from .sync_node import ProjectSyncNode +from .sync_strategy import ProjectSyncStrategy +from .jsonl_handler import ProjectJsonlHandler + +__all__ = ["ProjectSyncNode", "ProjectSyncStrategy", "ProjectJsonlHandler"] diff --git a/sync_state_machine/domain/project/api_handler.py b/sync_state_machine/domain/project/api_handler.py new file mode 100644 index 0000000..76acbd5 --- /dev/null +++ b/sync_state_machine/domain/project/api_handler.py @@ -0,0 +1,395 @@ +""" +Project API Handler + +实现的接口: +GET: +- /project/list - 获取项目列表 +- /project - 获取项目详情 +- /project/all_info - 获取项目完整信息 + +PUT (6个更新接口): +- /project - 更新项目基本信息 +- /project/key_constraints - 关键节点 +- /project/complete_investment - 完成投资 +- /project/investment_decision - 投资决策 +- /project/dynamic_investment - 动态投资 +- /project/settlement_investment - 结算投资 + +不支持: CREATE, DELETE +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from .sync_node import ProjectSyncNode +from schemas.project.project_base import ( + ProjectResponseBase, + ProjectBaseInfoUpdate, + ProjectKeyConstraints, + ProjectCompleteInvestment, + ProjectInvestmentDecision, + ProjectDynamicInvestment, + ProjectSettlementInvestment +) +from schemas.project.project import ProjectInfoResponse + + +class ProjectApiHandler(BaseApiHandler): + """项目 API Handler""" + + # 类级别缓存:存储 all_info 数据 + _all_info_cache: Dict[str, Dict[str, Any]] = {} + + def __init__(self, filter_project_id: str | List[str] | None = None): + """ + 初始化 Project Handler + + Args: + filter_project_id: 指定只加载的项目ID列表(可选,用于多项目测试) + """ + super().__init__() + self._node_type = "project" + self._node_class = ProjectSyncNode + self._schema = ProjectResponseBase + if filter_project_id is None: + self._filter_project_id = None + elif isinstance(filter_project_id, str): + self._filter_project_id = [filter_project_id] + else: + self._filter_project_id = filter_project_id # 保存过滤条件 + + def set_target_project_ids(self, target_project_ids: List[str]) -> None: + self._filter_project_id = list(target_project_ids) if target_project_ids else None + + @classmethod + async def get_all_info(cls, client, project_id: str) -> Dict[str, Any]: + """获取项目完整信息(带缓存) + + Args: + client: API client + project_id: 项目ID + + Returns: + 项目完整信息字典 + """ + if project_id in cls._all_info_cache: + return cls._all_info_cache[project_id] + + all_info = await api_get_project_all_info(client, project_id) + cls._all_info_cache[project_id] = all_info + return all_info + + @classmethod + def clear_cache(cls): + """清空缓存(每次同步开始前调用)""" + cls._all_info_cache.clear() + + async def load(self) -> List[SyncNode]: + """加载项目列表并预加载 all_info(支持分页) + + Args: + project_id: 可选,指定项目ID列表则只加载这些项目(优先级高于构造函数的filter_project_id) + """ + try: + # 清空旧缓存 + self.clear_cache() + + nodes = [] + + # 确定要加载的项目ID列表:参数 > 构造函数配置 + target_project_ids = self._filter_project_id or [] + if isinstance(target_project_ids, str): + target_project_ids = [target_project_ids] + + if target_project_ids: + # 只加载指定项目列表 + projects : List[ProjectResponseBase]= [] + for project_id in target_project_ids: + project_response = await api_get_project(self.api_client, project_id) + projects.append(project_response) + else: + # 加载所有项目(分页) + projects : List[ProjectResponseBase]= [] + page = 1 + page_size = 100 + + while True: + # 获取一页数据 + page_projects, total = await api_get_project_list( + self.api_client, + page=page, + page_size=page_size + ) + + # 没有数据了,退出循环 + if not page_projects: + break + + projects.extend(page_projects) + + # 检查是否还有下一页 + if page * page_size >= total: + break + + page += 1 + + # 处理所有项目 + for project_data in projects: + node = self._create_node(project_data.model_dump()) + # 设置 context + node.context["project_id"] = project_data.id + + # 预加载并缓存 all_info,同时存储到 node.context + all_info = await self.get_all_info(self.api_client, project_data.id) + node.context["all_info"] = all_info + + nodes.append(node) + return nodes + except Exception as e: + # 打印详细错误信息并重新抛出,让上层处理 + print(f"\n{'='*70}") + print("❌ 项目加载失败") + print(f"{'='*70}") + print(f"错误类型: {type(e).__name__}") + print(f"错误信息: {str(e)}") + + print(f"{'='*70}") + import traceback + traceback.print_exc() + print(f"{'='*70}\n") + + # 重新抛出异常,让DataSource能正确处理 + raise + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="Project creation not supported") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """ + 批量更新项目(支持多种更新类型) + + 支持 6 种更新 schema: + 1. ProjectBaseInfoUpdate - 基础信息 + 2. ProjectKeyConstraints - 关键约束 + 3. ProjectCompleteInvestment - 竣工投资 + 4. ProjectInvestmentDecision - 投资决策 + 5. ProjectDynamicInvestment - 动态投资 + 6. ProjectSettlementInvestment - 结算投资 + """ + results = [] + + # 定义所有更新 schema 和对应的 API 函数 + update_configs = [ + (ProjectBaseInfoUpdate, api_update_project_base_info), + (ProjectKeyConstraints, api_update_project_key_constraints), + (ProjectCompleteInvestment, api_update_project_complete_investment), + (ProjectInvestmentDecision, api_update_project_investment_decision), + (ProjectDynamicInvestment, api_update_project_dynamic_investment), + (ProjectSettlementInvestment, api_update_project_settlement_investment), + ] + + for node in nodes: + data = node.get_data() + if not data: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update project: {error_msg}")) + continue + + original_data = node.get_origin_data() or {} + biz_id = node.data_id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + node_updated = False + error = None + + # 遍历所有更新 schema,检查差异并更新 + for schema, api_func in update_configs: + update_data = self._get_schema_diff(schema, data, original_data, node.node_id) + if not update_data: + continue + + # 执行更新(差异已由 _get_schema_diff 打印) + try: + push_id = self._generate_push_id() + # project 需要使用 _filter_update_data 返回的完整 schema 数据 + full_update_data = self._filter_update_data(data, original_data, schema) + await api_func(self.api_client, full_update_data, push_id, biz_id) + node_updated = True + except Exception as e: + error = str(e) + break + + # 汇总结果 + if error: + results.append(TaskResult.failed(node_id=node.node_id, error=error)) + elif node_updated: + results.append(TaskResult.success(node_id=node.node_id)) + else: + # 没有任何字段需要更新 + reason = f"No physical diff found across all 6 sub-schemas for project {biz_id} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] {reason}") + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Project deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + # 设置 context + node.context["project_id"] = node.data_id + + return node + + +# ========== 静态 API 函数(可抽成 SDK) ========== + +async def api_get_project_list(client, page: int = 1, page_size: int = 100) -> tuple[List[ProjectResponseBase], int]: + """GET /project/list - 获取项目列表 + + Args: + client: API客户端 + page: 页码,从1开始 + page_size: 每页大小 + + Returns: + tuple[List[ProjectResponseBase], int]: (验证过的项目列表, 总数) + """ + response = await client.request( + method="GET", + endpoint="/project/list", + params={"page": page, "page_size": page_size} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + data = response.get("data", {}) + list_data = data.get("list", []) + total = data.get("total", 0) + + # 验证每个返回项 + validated_items = [] + for item in list_data: + validated_item = ProjectResponseBase.model_validate(item) + validated_items.append(validated_item) + + return validated_items, total + + +async def api_get_project(client, project_id: str) -> ProjectResponseBase: + """GET /project - 获取项目详情""" + response = await client.request( + method="GET", + endpoint="/project", + params={"project_id": project_id} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + return ProjectResponseBase.model_validate(response.get("data")) + + +async def api_get_project_all_info(client, project_id: str) -> Dict[str, Any]: + """GET /project/all_info - 获取项目完整信息(校验为 ProjectInfoResponse)""" + response = await client.request( + method="GET", + endpoint="/project/all_info", + params={"project_id": project_id} + ) + + # 检查响应状态 + code = response.get('code') + if code != 200: + error_msg = response.get('message', 'Unknown error') + + # 422 验证错误时打印详细信息 + if code == 422: + print(f"\n{'='*70}") + print("❌ API 422 验证错误") + print(f"{'='*70}") + print("接口: GET /project/all_info") + print(f"项目ID: {project_id}") + print(f"错误信息: {error_msg}") + print("完整响应:") + import json + print(json.dumps(response, indent=2, ensure_ascii=False)) + print(f"{'='*70}\n") + + raise Exception(f"API error {code}: {error_msg}") + + data = response.get('data', {}) + validated = ProjectInfoResponse.model_validate(data) + return validated.model_dump() + + +async def api_update_project_base_info(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project - 更新项目基本信息""" + ProjectBaseInfoUpdate.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_key_constraints(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/key_constraints - 更新关键节点""" + ProjectKeyConstraints.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/key_constraints", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_complete_investment(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/complete_investment - 更新完成投资""" + ProjectCompleteInvestment.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/complete_investment", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_investment_decision(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/investment_decision - 更新投资决策""" + ProjectInvestmentDecision.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/investment_decision", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_dynamic_investment(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/dynamic_investment - 更新动态投资""" + ProjectDynamicInvestment.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/dynamic_investment", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + + + +async def api_update_project_settlement_investment(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/settlement_investment - 更新结算投资""" + ProjectSettlementInvestment.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/settlement_investment", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/project/jsonl_handler.py b/sync_state_machine/domain/project/jsonl_handler.py new file mode 100644 index 0000000..89d44ed --- /dev/null +++ b/sync_state_machine/domain/project/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Project JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ProjectSyncNode +from schemas.project.project_base import ProjectResponseBase + + +class ProjectJsonlHandler(BaseJsonlHandler): + """项目 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "project", ProjectSyncNode, ProjectResponseBase) diff --git a/sync_state_machine/domain/project/register.py b/sync_state_machine/domain/project/register.py new file mode 100644 index 0000000..50d8771 --- /dev/null +++ b/sync_state_machine/domain/project/register.py @@ -0,0 +1,17 @@ +"""Project domain registration""" +from ...common.registry import DomainRegistry +from schemas.project.project_base import ProjectResponseBase +from .sync_node import ProjectSyncNode +from .sync_strategy import ProjectSyncStrategy +from .jsonl_handler import ProjectJsonlHandler +from .api_handler import ProjectApiHandler + +# 注册 project domain +DomainRegistry.register( + node_type="project", + schema=ProjectResponseBase, + node_class=ProjectSyncNode, + strategy_class=ProjectSyncStrategy, + jsonl_handler_class=ProjectJsonlHandler, + api_handler_class=ProjectApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/project/sync_node.py b/sync_state_machine/domain/project/sync_node.py new file mode 100644 index 0000000..3cf7b18 --- /dev/null +++ b/sync_state_machine/domain/project/sync_node.py @@ -0,0 +1,11 @@ +from ...common.sync_node import SyncNode +from schemas.project.project_base import ProjectResponseBase + + +class ProjectSyncNode(SyncNode[ProjectResponseBase]): + """项目同步节点""" + node_type = "project" + schema = ProjectResponseBase + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/project/sync_strategy.py b/sync_state_machine/domain/project/sync_strategy.py new file mode 100644 index 0000000..731592b --- /dev/null +++ b/sync_state_machine/domain/project/sync_strategy.py @@ -0,0 +1,29 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project.project_base import ProjectResponseBase + + +class ProjectSyncStrategy(DefaultSyncStrategy[ProjectResponseBase]): + """ + Project 同步策略 + + 业务规则: + 1. 手动绑定(根节点) + 2. 允许拉取更新(不自动创建) + 3. 依赖公司(company) + + schema 已在类定义中设置,禁止在初始化时传入其他 schema。 + """ + + # 类变量:schema 固定为 ProjectResponseBase + schema = ProjectResponseBase + + # 类变量:默认配置 + default_config = StrategyConfig( + auto_bind=False, + auto_bind_fields=[], + depend_fields={"company_id": "company"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/project_detail/__init__.py b/sync_state_machine/domain/project_detail/__init__.py new file mode 100644 index 0000000..6a60356 --- /dev/null +++ b/sync_state_machine/domain/project_detail/__init__.py @@ -0,0 +1,6 @@ +"""ProjectDetail domain""" +from .sync_node import ProjectDetailSyncNode +from .sync_strategy import ProjectDetailSyncStrategy +from .jsonl_handler import ProjectDetailJsonlHandler + +__all__ = ["ProjectDetailSyncNode", "ProjectDetailSyncStrategy", "ProjectDetailJsonlHandler"] diff --git a/sync_state_machine/domain/project_detail/api_handler.py b/sync_state_machine/domain/project_detail/api_handler.py new file mode 100644 index 0000000..a7b41cd --- /dev/null +++ b/sync_state_machine/domain/project_detail/api_handler.py @@ -0,0 +1,535 @@ +""" +Project Detail API Handler + +职责: +- 加载项目容量信息(project_detail) +- 更新项目容量信息(对应项目详情更新接口) + +实现的接口: +PUT: +- /project/plan_construction - 更新计划施工 +- /project/actual_construction - 更新实际施工 +- /project/ensure_capacity - 更新确保产能 +- /project/climb_capacity - 更新登高产能 +- /project/challenge_capacity - 更新揭榜产能 +- /project/production_capacity - 更新投产数据 + +不支持: CREATE, DELETE +""" + +from typing import List, Dict, Any, Optional, Tuple, Set +from pydantic import ValidationError + +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_VALIDATION_FAILED +from .sync_node import ProjectDetailSyncNode +from schemas.project_extensions.project_detail import ProjectDetailProject, ProjectDetailKey +from schemas.project.project_base import ( + ProjectPlanConstruction, + ProjectActualConstruction, + ProjectEnsureCapacity, + ProjectClimbCapacity, + ProjectChallengeCapacity, + ProjectProductionCapacity, +) + + +_PRODUCTION_PROJECT_FIELDS = [ + "plan_production_date", + "plan_full_production_date", + "ic_plan_first_production_date", + "ic_plan_full_production_date", + "actual_production_date", + "actual_full_production_date", +] + + +class ProjectDetailApiHandler(BaseApiHandler): + """项目容量信息 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "project_detail_data" + self._node_class = ProjectDetailSyncNode + self._schema = ProjectDetailProject + self._pending_push_context: Dict[str, Dict[str, str]] = {} + + async def load(self) -> List[SyncNode]: + """加载项目容量信息(从 project all_info 中提取)""" + from ..project.api_handler import ProjectApiHandler + + projects = self._collection.filter(node_type="project") + if not projects: + print("⚠️ No projects found, skipping project_detail load") + return [] + + nodes: List[SyncNode] = [] + for project in projects: + project_id = project.data_id + + try: + all_info = project.context.get("all_info") + if not all_info: + all_info = await ProjectApiHandler.get_all_info(self.api_client, project_id) + + project_detail_list = all_info.get("project_detail", []) + + print(f" Project {project_id}: {len(project_detail_list)} project_detail records") + + for detail_data in project_detail_list: + try: + candidate_data = dict(detail_data) if isinstance(detail_data, dict) else detail_data + if isinstance(candidate_data, dict) and not candidate_data.get("project_id"): + candidate_data["project_id"] = project_id + + validated = self._schema.model_validate(candidate_data) + detail_dict = validated.model_dump() + + node = self._create_node(detail_dict) + node.context["project_id"] = project_id + nodes.append(node) + except Exception as e: + print(f"⚠️ Skipping invalid project_detail: {e}") + continue + + except Exception as e: + print(f"❌ Failed to load project_detail for project {project_id}: {e}") + continue + + return nodes + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """创建语义通过 project 详情更新接口实现(服务端隐式创建)。""" + return await self._upsert_all(nodes, force_execute=True) + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新项目容量信息""" + return await self._upsert_all(nodes, force_execute=False) + + async def _upsert_all(self, nodes: List[SyncNode], *, force_execute: bool) -> List[TaskResult]: + """批量 upsert:对 project_detail_data 统一走 project update 类接口。""" + results: List[TaskResult] = [] + seen_project_key: Set[Tuple[str, str]] = set() + + for node in nodes: + node_data = node.get_data() + if node_data is None: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot upsert: {error_msg}")) + continue + + origin_data = node.get_origin_data() or {} + key = self._normalize_key(node_data.get("key")) + project_id = node_data.get("project_id") or origin_data.get("project_id") + + if not project_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing project_id for upsert")) + continue + if not key: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing key for upsert")) + continue + + pair = (str(project_id), str(key)) + if pair in seen_project_key: + results.append( + TaskResult.failed( + node_id=node.node_id, + error=f"Duplicate project_detail_data in one batch: project_id={project_id}, key={key}", + ) + ) + continue + seen_project_key.add(pair) + + project_data: Dict[str, Any] = {} + project_origin_data: Dict[str, Any] = {} + project_node = self._collection.get_by_data_id("project", project_id) + if project_node: + project_data = project_node.get_data() or {} + project_origin_data = project_node.get_origin_data() or {} + if key == "production": + if project_data: + self._merge_production_fields(node_data, project_data) + if project_origin_data: + self._merge_production_fields(origin_data, project_origin_data) + + config = self._get_update_config(key) + if not config: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Unsupported project_detail key: {key}")) + continue + + schema, api_func = config + + new_payload = self._build_update_payload(key, node_data) + origin_payload = self._build_update_payload(key, origin_data) + + if new_payload is None: + results.append(TaskResult.failed(node_id=node.node_id, error=f"Unable to build payload for key={key}")) + continue + if origin_payload is None: + origin_payload = {} + + if not force_execute and not self._payload_changed(schema, new_payload, origin_payload): + reason = f"No physical diff found for project_detail {key} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] {reason}") + # 记录为跳过 + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + continue + + try: + schema.model_validate(new_payload) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + biz_id = project_id + self._pending_push_context[push_id] = { + "project_id": str(project_id), + "key": str(key), + } + + try: + await api_func(self.api_client, new_payload, push_id, biz_id) + results.append( + TaskResult.in_progress( + node_id=node.node_id, + task_id=push_id, + push_id=push_id, + project_id=str(project_id), + key=str(key), + ) + ) + except Exception as e: + self._pending_push_context.pop(push_id, None) + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Project detail deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + polled = await super().poll_tasks(task_ids) + results: Dict[str, TaskResult] = {} + success_context_by_task: Dict[str, Dict[str, str]] = {} + project_order: List[str] = [] + task_ids_by_project: Dict[str, List[str]] = {} + + for task_id in task_ids: + result = polled.get(task_id) + if result is None: + continue + + if result.status == result.status.IN_PROGRESS: + results[task_id] = result + continue + + context = self._pending_push_context.get(task_id) + if context is None: + results[task_id] = result + continue + + if result.status == result.status.FAILED: + self._pending_push_context.pop(task_id, None) + results[task_id] = result + continue + + project_id = context["project_id"] + + if result.data_id and result.data_id != project_id: + self._pending_push_context.pop(task_id, None) + results[task_id] = result + continue + + success_context_by_task[task_id] = context + if project_id not in task_ids_by_project: + project_order.append(project_id) + task_ids_by_project[project_id] = [] + task_ids_by_project[project_id].append(task_id) + + for project_id in project_order: + task_ids_for_project = task_ids_by_project.get(project_id, []) + try: + all_info = await self._get_project_all_info(project_id, force_refresh=True) + except Exception as exc: + for task_id in task_ids_for_project: + self._pending_push_context.pop(task_id, None) + results[task_id] = TaskResult.failed(error=f"Poll resolve data_id failed: {exc}", push_id=task_id) + continue + + for task_id in task_ids_for_project: + context = success_context_by_task[task_id] + key = context["key"] + + try: + resolved_data_id = self._resolve_data_id_from_all_info(all_info, project_id=project_id, key=key) + except Exception as exc: + self._pending_push_context.pop(task_id, None) + results[task_id] = TaskResult.failed(error=f"Poll resolve data_id failed: {exc}", push_id=task_id) + continue + + if not resolved_data_id: + self._pending_push_context.pop(task_id, None) + results[task_id] = TaskResult.failed( + error=( + "Poll resolve data_id failed: " + f"project_detail not found in all_info for project_id={project_id}, key={key}" + ), + push_id=task_id, + ) + continue + + self._pending_push_context.pop(task_id, None) + results[task_id] = TaskResult.success(data_id=resolved_data_id, push_id=task_id) + + return results + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + project_id_raw = data.get("project_id") + key_raw = self._normalize_key(data.get("key")) + project_id = str(project_id_raw) if project_id_raw else "" + key = str(key_raw) if key_raw else "" + loaded_data_id = str(data.get("id") or data.get("_id") or "") + + existing_by_pair = self._find_existing_by_project_key(project_id=project_id, key=key) + if existing_by_pair is not None: + if loaded_data_id and existing_by_pair.data_id != loaded_data_id: + with existing_by_pair.allow_core_state_write("project_detail_pair_rebind"): + existing_by_pair.data_id = loaded_data_id + existing_by_pair.set_data(data) + existing_by_pair.set_origin_data(data) + if project_id: + existing_by_pair.context["project_id"] = project_id + return existing_by_pair + + node = self._create_basic_node(data, depend_ids=[]) + if project_id: + node.context["project_id"] = project_id + return node + + def _find_existing_by_project_key(self, *, project_id: str, key: str) -> Optional[SyncNode]: + if not project_id or not key or self._collection is None: + return None + + candidates = self._collection.filter( + node_type=self.node_type, + node_filter=lambda n: ( + ((n.get_data() or {}).get("project_id") == project_id) + and (self._normalize_key((n.get_data() or {}).get("key")) == key) + ), + ) + if not candidates: + return None + if len(candidates) > 1: + raise RuntimeError( + f"Duplicate project_detail_data detected: project_id={project_id}, key={key}, count={len(candidates)}" + ) + return candidates[0] + + async def _get_project_all_info(self, project_id: str, *, force_refresh: bool = False) -> Dict[str, Any]: + from ..project.api_handler import ProjectApiHandler + + project_node = self._collection.get_by_data_id("project", project_id) + if project_node is not None and not force_refresh: + all_info = project_node.context.get("all_info") + if isinstance(all_info, dict): + return all_info + + all_info = await ProjectApiHandler.get_all_info(self.api_client, project_id) + if project_node is not None: + project_node.context["all_info"] = all_info + return all_info + + def _resolve_data_id_from_all_info(self, all_info: Dict[str, Any], *, project_id: str, key: str) -> Optional[str]: + details = all_info.get("project_detail", []) + if not isinstance(details, list): + return None + + matched: List[str] = [] + for item in details: + if not isinstance(item, dict): + continue + item_key = self._normalize_key(item.get("key")) + if item_key != key: + continue + item_id = item.get("id") or item.get("_id") + if not item_id: + raise ValueError(f"project_detail item missing id for project_id={project_id}, key={key}") + matched.append(str(item_id)) + + if len(matched) > 1: + raise ValueError(f"project_detail duplicated for project_id={project_id}, key={key}") + if len(matched) == 1: + return matched[0] + return None + + async def _resolve_data_id_from_project_all_info(self, project_id: str, key: str) -> Optional[str]: + all_info = await self._get_project_all_info(project_id) + return self._resolve_data_id_from_all_info(all_info, project_id=project_id, key=key) + + def _normalize_key(self, key: Any) -> Optional[str]: + if isinstance(key, ProjectDetailKey): + return key.value + if isinstance(key, str): + return key + return None + + def _get_update_config(self, key: Optional[str]) -> Optional[Tuple[type, Any]]: + if not key: + return None + return { + "plan_construction": (ProjectPlanConstruction, api_update_project_plan_construction), + "actual_construction": (ProjectActualConstruction, api_update_project_actual_construction), + "ensure_production": (ProjectEnsureCapacity, api_update_project_ensure_capacity), + "climb_production": (ProjectClimbCapacity, api_update_project_climb_capacity), + "challenge_production": (ProjectChallengeCapacity, api_update_project_challenge_capacity), + "production": (ProjectProductionCapacity, api_update_project_production_capacity), + }.get(key) + + def _build_update_payload(self, key: Optional[str], data: Dict[str, Any]) -> Optional[Dict[str, Any]]: + if not key: + return None + + value_list = data.get("value") or [] + if key == "plan_construction": + return { + "plan_construction_list": self._build_capacity_list(value_list, require_date=True) + } + if key == "actual_construction": + return { + "actual_construction_list": self._build_capacity_list(value_list, require_date=True) + } + if key == "ensure_production": + return { + "ensure_production_capacity_list": self._build_capacity_list(value_list, require_year=True) + } + if key == "climb_production": + return { + "climb_production_capacity_list": self._build_capacity_list(value_list, require_year=True) + } + if key == "challenge_production": + return { + "challenge_production_capacity_list": self._build_capacity_list(value_list, require_year=True) + } + if key == "production": + payload: Dict[str, Any] = { + "actual_production_list": self._build_capacity_list(value_list, require_date=True) + } + payload.update(self._extract_production_fields(data)) + return payload + + return None + + def _build_capacity_list( + self, + value_list: List[Dict[str, Any]], + require_year: bool = False, + require_date: bool = False, + ) -> List[Dict[str, Any]]: + items: List[Dict[str, Any]] = [] + for item in value_list: + if not isinstance(item, dict): + continue + + year = item.get("year") + date = item.get("date") + capacity = item.get("capacity") + + if require_year and (year is None or year == ""): + continue + if require_date and (date is None or date == ""): + continue + + payload_item: Dict[str, Any] = {"capacity": capacity} + if require_year: + payload_item["year"] = year + if require_date: + payload_item["date"] = date + + items.append(payload_item) + + return items + + def _payload_changed(self, schema: type, new_payload: Dict[str, Any], origin_payload: Dict[str, Any]) -> bool: + try: + new_dump = schema.model_validate(new_payload).model_dump() + except ValidationError: + return True + + try: + origin_dump = schema.model_validate(origin_payload).model_dump() + except ValidationError: + return True + + return new_dump != origin_dump + + def _extract_production_fields(self, data: Dict[str, Any]) -> Dict[str, Any]: + return {k: data.get(k) for k in _PRODUCTION_PROJECT_FIELDS if k in data} + + def _merge_production_fields(self, target: Dict[str, Any], project_data: Dict[str, Any]) -> None: + for field in _PRODUCTION_PROJECT_FIELDS: + if (field not in target or target.get(field) in (None, "")) and field in project_data: + target[field] = project_data.get(field) + + +# ========== 静态 API 函数(可抽成 SDK) ========== + +async def api_update_project_plan_construction(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/plan_construction - 更新计划施工""" + ProjectPlanConstruction.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/plan_construction", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_actual_construction(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/actual_construction - 更新实际施工""" + ProjectActualConstruction.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/actual_construction", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_ensure_capacity(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/ensure_capacity - 更新确保产能""" + ProjectEnsureCapacity.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/ensure_capacity", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_climb_capacity(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/climb_capacity - 更新登高产能""" + ProjectClimbCapacity.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/climb_capacity", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_challenge_capacity(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/challenge_capacity - 更新揭榜产能""" + ProjectChallengeCapacity.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/challenge_capacity", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + +async def api_update_project_production_capacity(client, data: Dict[str, Any], push_id: str, biz_id: str) -> None: + """PUT /project/production_capacity - 更新投产数据""" + ProjectProductionCapacity.model_validate(data) + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data} + response = await client.request(method="PUT", endpoint="/project/production_capacity", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/project_detail/jsonl_handler.py b/sync_state_machine/domain/project_detail/jsonl_handler.py new file mode 100644 index 0000000..81c1559 --- /dev/null +++ b/sync_state_machine/domain/project_detail/jsonl_handler.py @@ -0,0 +1,10 @@ +"""ProjectDetail Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import ProjectDetailSyncNode +from schemas.project_extensions.project_detail import ProjectDetailProject + + +class ProjectDetailJsonlHandler(BaseJsonlHandler): + """项目容量信息 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "project_detail_data", ProjectDetailSyncNode, ProjectDetailProject) diff --git a/sync_state_machine/domain/project_detail/register.py b/sync_state_machine/domain/project_detail/register.py new file mode 100644 index 0000000..2e82889 --- /dev/null +++ b/sync_state_machine/domain/project_detail/register.py @@ -0,0 +1,17 @@ +"""ProjectDetail domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.project_detail import ProjectDetailProject +from .sync_node import ProjectDetailSyncNode +from .sync_strategy import ProjectDetailSyncStrategy +from .jsonl_handler import ProjectDetailJsonlHandler +from .api_handler import ProjectDetailApiHandler + +# 注册 project_detail_data domain +DomainRegistry.register( + node_type="project_detail_data", + schema=ProjectDetailProject, + node_class=ProjectDetailSyncNode, + strategy_class=ProjectDetailSyncStrategy, + jsonl_handler_class=ProjectDetailJsonlHandler, + api_handler_class=ProjectDetailApiHandler, +) diff --git a/sync_state_machine/domain/project_detail/sync_node.py b/sync_state_machine/domain/project_detail/sync_node.py new file mode 100644 index 0000000..a890a2f --- /dev/null +++ b/sync_state_machine/domain/project_detail/sync_node.py @@ -0,0 +1,41 @@ +"""Project Detail SyncNode""" + +from typing import Any, Dict, Optional + +from ...common.sync_node import SyncNode +from schemas.project_extensions.project_detail import ProjectDetailProject + + +_PRODUCTION_PROJECT_FIELDS = [ + "plan_production_date", + "plan_full_production_date", + "ic_plan_first_production_date", + "ic_plan_full_production_date", + "actual_production_date", + "actual_full_production_date", +] + + +class ProjectDetailSyncNode(SyncNode[ProjectDetailProject]): + """项目容量信息同步节点""" + node_type = "project_detail_data" + schema = ProjectDetailProject + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + @staticmethod + def _merge_production_extra_fields(target: Optional[Dict[str, Any]], source: Optional[Dict[str, Any]]) -> None: + if not target or not source or source.get("key") != "production": + return + for field in _PRODUCTION_PROJECT_FIELDS: + if field in source: + target[field] = source.get(field) + + def _validate_and_set_data(self, data: Dict[str, Any]) -> None: + super()._validate_and_set_data(data) + self._merge_production_extra_fields(self.data, data) + + def set_origin_data(self, data: Optional[Dict[str, Any]]) -> None: + super().set_origin_data(data) + self._merge_production_extra_fields(self.origin_data, data) diff --git a/sync_state_machine/domain/project_detail/sync_strategy.py b/sync_state_machine/domain/project_detail/sync_strategy.py new file mode 100644 index 0000000..de16a3e --- /dev/null +++ b/sync_state_machine/domain/project_detail/sync_strategy.py @@ -0,0 +1,30 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project_extensions.project_detail import ProjectDetailProject + + +class ProjectDetailSyncStrategy(DefaultSyncStrategy[ProjectDetailProject]): + """ + ProjectDetail 同步策略(项目容量信息)。 + + 默认行为: + - plan_construction / actual_construction / production → push(本地 → 远程) + - ensure_production / climb_production / challenge_production → pull(远程 → 本地) + """ + + schema = ProjectDetailProject + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "key"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + field_direction_key="key", + field_direction_overrides={ + "ensure_production": UpdateDirection.PULL, + "climb_production": UpdateDirection.PULL, + "challenge_production": UpdateDirection.PULL, + }, + ) diff --git a/sync_state_machine/domain/registry.py b/sync_state_machine/domain/registry.py new file mode 100644 index 0000000..dcd8229 --- /dev/null +++ b/sync_state_machine/domain/registry.py @@ -0,0 +1,113 @@ +""" +Domain Handler Registry - 集中管理所有领域的 API 和 JSONL Handlers + +使用方式: + from sync_state_machine.domain.registry import API_HANDLERS, JSONL_HANDLERS + + # 注册所有 API handlers + for handler_class in API_HANDLERS: + api_ds.register_handler(handler_class()) + + # 注册所有 JSONL handlers + for handler_class in JSONL_HANDLERS: + jsonl_ds.register_handler(handler_class(jsonl_ds)) +""" + +# ============================================ +# API Handlers +# ============================================ +from .company.api_handler import CompanyApiHandler +from .supplier.api_handler import SupplierApiHandler +from .user.api_handler import UserApiHandler +from .project.api_handler import ProjectApiHandler +from .contract.api_handler import ContractApiHandler +from .contract_change.api_handler import ContractChangeApiHandler +from .construction.api_handler import ConstructionTaskApiHandler +from .construction_task_detail.api_handler import ConstructionTaskDetailApiHandler +from .material.api_handler import MaterialApiHandler +from .material_detail.api_handler import MaterialDetailApiHandler +from .contract_settlement.api_handler import ContractSettlementApiHandler +from .contract_settlement_detail.api_handler import ContractSettlementDetailApiHandler +from .personnel.api_handler import PersonnelApiHandler +from .personnel_detail.api_handler import PersonnelDetailApiHandler +from .preparation.api_handler import PreparationApiHandler +from .production.api_handler import ProductionApiHandler +from .lar.api_handler import LarApiHandler +from .lar_change.api_handler import LarChangeApiHandler +from .units.api_handler import UnitsApiHandler +from .project_detail.api_handler import ProjectDetailApiHandler + +# ============================================ +# JSONL Handlers +# ============================================ +from .company.jsonl_handler import CompanyJsonlHandler +from .supplier.jsonl_handler import SupplierJsonlHandler +from .user.jsonl_handler import UserJsonlHandler +from .project.jsonl_handler import ProjectJsonlHandler +from .contract.jsonl_handler import ContractJsonlHandler +from .contract_change.jsonl_handler import ContractChangeJsonlHandler +from .construction.jsonl_handler import ConstructionTaskJsonlHandler +from .construction_task_detail.jsonl_handler import ConstructionTaskDetailJsonlHandler +from .material.jsonl_handler import MaterialJsonlHandler +from .material_detail.jsonl_handler import MaterialDetailJsonlHandler +from .contract_settlement.jsonl_handler import ContractSettlementJsonlHandler +from .contract_settlement_detail.jsonl_handler import ContractSettlementDetailJsonlHandler +from .personnel.jsonl_handler import PersonnelJsonlHandler +from .personnel_detail.jsonl_handler import PersonnelDetailJsonlHandler +from .preparation.jsonl_handler import PreparationJsonlHandler +from .production.jsonl_handler import ProductionJsonlHandler +from .lar.jsonl_handler import LarJsonlHandler +from .lar_change.jsonl_handler import LarChangeJsonlHandler +from .units.jsonl_handler import UnitsJsonlHandler +from .project_detail.jsonl_handler import ProjectDetailJsonlHandler + +# ============================================ +# 导出列表 +# ============================================ +API_HANDLERS = [ + CompanyApiHandler, + SupplierApiHandler, + UserApiHandler, + ProjectApiHandler, + ContractApiHandler, + ContractChangeApiHandler, + ConstructionTaskApiHandler, + ConstructionTaskDetailApiHandler, + MaterialApiHandler, + MaterialDetailApiHandler, + ContractSettlementApiHandler, + ContractSettlementDetailApiHandler, + PersonnelApiHandler, + PersonnelDetailApiHandler, + PreparationApiHandler, + ProductionApiHandler, + LarApiHandler, + LarChangeApiHandler, + UnitsApiHandler, + ProjectDetailApiHandler, +] + +JSONL_HANDLERS = [ + CompanyJsonlHandler, + SupplierJsonlHandler, + UserJsonlHandler, + ProjectJsonlHandler, + ContractJsonlHandler, + ContractChangeJsonlHandler, + ConstructionTaskJsonlHandler, + ConstructionTaskDetailJsonlHandler, + MaterialJsonlHandler, + MaterialDetailJsonlHandler, + ContractSettlementJsonlHandler, + ContractSettlementDetailJsonlHandler, + PersonnelJsonlHandler, + PersonnelDetailJsonlHandler, + PreparationJsonlHandler, + ProductionJsonlHandler, + LarJsonlHandler, + LarChangeJsonlHandler, + UnitsJsonlHandler, + ProjectDetailJsonlHandler, +] + +__all__ = ["API_HANDLERS", "JSONL_HANDLERS"] diff --git a/sync_state_machine/domain/supplier/__init__.py b/sync_state_machine/domain/supplier/__init__.py new file mode 100644 index 0000000..55e33c5 --- /dev/null +++ b/sync_state_machine/domain/supplier/__init__.py @@ -0,0 +1,9 @@ +""" +Supplier Domain +""" +from .sync_node import SupplierSyncNode +from .jsonl_handler import SupplierJsonlHandler +from schemas.supplier.supplier import SupplierDetailResponse +from .sync_strategy import SupplierSyncStrategy + +__all__ = ["SupplierSyncNode", "SupplierSyncStrategy", "SupplierJsonlHandler"] diff --git a/sync_state_machine/domain/supplier/api_handler.py b/sync_state_machine/domain/supplier/api_handler.py new file mode 100644 index 0000000..cc6a7cf --- /dev/null +++ b/sync_state_machine/domain/supplier/api_handler.py @@ -0,0 +1,145 @@ +""" +Supplier API Handler (只读) + +职责: +- 加载供应商列表 +- 不支持创建/更新/删除 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from .sync_node import SupplierSyncNode +from schemas.supplier.supplier import SupplierDetailResponse + + +class SupplierApiHandler(BaseApiHandler): + """供应商 API Handler (只读)""" + + def __init__(self, load_mode: str = "api", max_total: int | None = None): + super().__init__() + self._node_type = "supplier" + self._node_class = SupplierSyncNode + self._schema = SupplierDetailResponse + self._load_mode = load_mode + self._max_total = max_total + + async def load(self) -> List[SyncNode]: + """加载供应商列表(支持分页)""" + try: + if self._load_mode == "persisted_only": + existing_count = 0 + if self._collection is not None: + existing_count = len(self._collection.filter(node_type=self.node_type)) + print(f"ℹ️ Supplier load skipped (persisted_only). Existing={existing_count}") + return [] + + nodes = [] + page = 1 + page_size = 10000 + + while True: + # 获取一页数据 + suppliers, total = await api_get_supplier_list( + self.api_client, + page=page, + page_size=page_size + ) + + # 没有数据了,退出循环 + if not suppliers: + break + + # 转换为节点 + for supplier_model in suppliers: + supplier_data = supplier_model.model_dump() + nodes.append(self._create_node(supplier_data)) + + if self._max_total is not None and len(nodes) >= self._max_total: + return nodes + + # 检查是否还有下一页 + if total > 0 and page * page_size >= total: + break + + # 如果没有total字段,且items数量小于page_size,说明是最后一页 + if total == 0 and len(suppliers) < page_size: + break + + page += 1 + + return nodes + except Exception as e: + print(f"❌ Failed to load suppliers: {e}") + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="Supplier creation not supported") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持更新""" + return [ + TaskResult.failed(node_id=node.node_id, error="Supplier update not supported") + for node in nodes + ] + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Supplier deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + return self._create_basic_node(data, depend_ids=[]) + + +# ========== 静态 API 函数 ========== + +async def api_get_supplier_list(client, page: int = 1, page_size: int = 100) -> tuple[List[SupplierDetailResponse], int]: + """ + 获取供应商列表 GET /supplier/list + + Args: + client: API客户端 + page: 页码,从1开始 + page_size: 每页大小 + + Returns: + tuple[List[SupplierDetailResponse], int]: (验证过的供应商列表, 总数) + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/supplier/list", + params={"page": page, "page_size": page_size} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + # 注意:supplier返回格式可能是 {code: 200, list: [...]} 或 {code: 200, data: {list: [...]}} + data = response.get("data", {}) + items = data.get("list", []) if data else response.get("list", []) + total = data.get("total", 0) if data else response.get("total", 0) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = SupplierDetailResponse.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid supplier item: {e}") + continue + + return validated_items, total diff --git a/sync_state_machine/domain/supplier/jsonl_handler.py b/sync_state_machine/domain/supplier/jsonl_handler.py new file mode 100644 index 0000000..bcda6d1 --- /dev/null +++ b/sync_state_machine/domain/supplier/jsonl_handler.py @@ -0,0 +1,12 @@ +""" +Supplier JSONL Handler +""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import SupplierSyncNode +from schemas.supplier.supplier import SupplierDetailResponse + + +class SupplierJsonlHandler(BaseJsonlHandler): + """供应商 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "supplier", SupplierSyncNode, SupplierDetailResponse) diff --git a/sync_state_machine/domain/supplier/register.py b/sync_state_machine/domain/supplier/register.py new file mode 100644 index 0000000..bfe7dbb --- /dev/null +++ b/sync_state_machine/domain/supplier/register.py @@ -0,0 +1,17 @@ +"""Supplier domain registration""" +from ...common.registry import DomainRegistry +from schemas.supplier.supplier import SupplierDetailResponse +from .sync_node import SupplierSyncNode +from .sync_strategy import SupplierSyncStrategy +from .jsonl_handler import SupplierJsonlHandler +from .api_handler import SupplierApiHandler + +# 注册 supplier domain +DomainRegistry.register( + node_type="supplier", + schema=SupplierDetailResponse, + node_class=SupplierSyncNode, + strategy_class=SupplierSyncStrategy, + jsonl_handler_class=SupplierJsonlHandler, + api_handler_class=SupplierApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/supplier/sync_node.py b/sync_state_machine/domain/supplier/sync_node.py new file mode 100644 index 0000000..bfbd435 --- /dev/null +++ b/sync_state_machine/domain/supplier/sync_node.py @@ -0,0 +1,11 @@ +""" +Supplier Domain +""" +from ...common import SyncNode +from schemas.supplier.supplier import SupplierDetailResponse + + +class SupplierSyncNode(SyncNode[SupplierDetailResponse]): + """供应商同步节点""" + node_type = "supplier" + schema = SupplierDetailResponse diff --git a/sync_state_machine/domain/supplier/sync_strategy.py b/sync_state_machine/domain/supplier/sync_strategy.py new file mode 100644 index 0000000..c04df98 --- /dev/null +++ b/sync_state_machine/domain/supplier/sync_strategy.py @@ -0,0 +1,55 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.supplier.supplier import SupplierDetailResponse + + +class SupplierSyncStrategy(DefaultSyncStrategy[SupplierDetailResponse]): + """ + Supplier 同步策略(基础数据,仅拉取)。 + + 注意:Supplier 数据量大(约 60000 条),同步耗时较长。 + 建议通过 datasource.handler_configs 控制 handler 参数,例如: + - remote_datasource.handler_configs.supplier.load_mode = "persisted_only" + API handler 跳过远端拉取,仅使用持久化数据。 + """ + + schema = SupplierDetailResponse + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["credit_code"], + depend_fields={}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.CREATE_LOCAL, + update_direction=UpdateDirection.PULL, + ) + + def _needs_update( + self, + source_node, + target_node, + resolved_data=None, + ) -> bool: + """Supplier 更新忽略 id 字段差异。""" + if resolved_data is None: + raise ValueError(f"[{self.node_type}] resolved_data is required for differential sync.") + + source_data = resolved_data + target_data = target_node.get_data() + if source_data is None or target_data is None: + return False + + is_different = False + diffs = [] + for k, v1 in source_data.items(): + if k == "id": + continue + v2 = target_data.get(k) + if v1 != v2: + is_different = True + diffs.append(f"{k}: {v1} != {v2}") + + if is_different and diffs: + print(f" [DEBUG] [{self.node_type}] Node diff detected: {', '.join(diffs[:5])}") + + return is_different diff --git a/sync_state_machine/domain/units/__init__.py b/sync_state_machine/domain/units/__init__.py new file mode 100644 index 0000000..b8ee1d2 --- /dev/null +++ b/sync_state_machine/domain/units/__init__.py @@ -0,0 +1,6 @@ +"""Units domain""" +from .sync_node import UnitsSyncNode +from .sync_strategy import UnitsSyncStrategy +from .jsonl_handler import UnitsJsonlHandler + +__all__ = ["UnitsSyncNode", "UnitsSyncStrategy", "UnitsJsonlHandler"] diff --git a/sync_state_machine/domain/units/api_handler.py b/sync_state_machine/domain/units/api_handler.py new file mode 100644 index 0000000..9e81b0d --- /dev/null +++ b/sync_state_machine/domain/units/api_handler.py @@ -0,0 +1,159 @@ +""" +Units (机组) API Handler + +职责: +- 更新项目机组数据 +- 不支持创建和删除(机组随项目自动生成) + +实现的接口: +PUT: +- /units - 更新机组数据 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from ...datasource.api.errors import ERROR_VALIDATION_FAILED +from .sync_node import UnitsSyncNode +from schemas.project_extensions.generator_unit import GeneratorUnitProject, PostGeneratorUnits + + +class UnitsApiHandler(BaseApiHandler): + """机组 API Handler""" + + def __init__(self): + super().__init__() + self._node_type = "units" + self._node_class = UnitsSyncNode + self._schema = GeneratorUnitProject + + async def load(self) -> List[SyncNode]: + """加载机组数据(从 project all_info 中提取)""" + from ..project.api_handler import ProjectApiHandler + + # 获取已加载的项目 + projects = self._collection.filter(node_type="project") + if not projects: + print("⚠️ No projects found, skipping units load") + return [] + + nodes = [] + for project in projects: + project_id = project.data_id + + try: + # 从 project context 或缓存获取 all_info + all_info = project.context.get("all_info") + if not all_info: + all_info = await ProjectApiHandler.get_all_info( + self.api_client, + project_id + ) + + # 提取 generator_units + units_list = all_info.get("generator_units", []) + print(f" Project {project_id}: {len(units_list)} units") + + for unit_data in units_list: + # 验证数据 + try: + validated = self._schema.model_validate(unit_data) + node = self._create_node(validated.model_dump()) + node.context["project_id"] = project_id + nodes.append(node) + except Exception as e: + print(f"⚠️ Skipping invalid unit: {e}") + continue + + except Exception as e: + print(f"❌ Failed to load units for project {project_id}: {e}") + continue + + return nodes + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="Units creation not supported (auto-generated with project)") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """批量更新机组数据""" + from pydantic import ValidationError + + results = [] + + for node in nodes: + node_data = node.get_data() + if node_data is None: + error_msg = node.error or "Node data is missing or invalid" + results.append(TaskResult.failed(node_id=node.node_id, error=f"Cannot update: {error_msg}")) + continue + + origin_data = node.get_origin_data() or {} + update_data = self._filter_update_data(node_data, origin_data, PostGeneratorUnits) + if not update_data: + reason = f"No physical diff found for units {node.data_id} despite strategy update request (Normalization Discrepancy)." + print(f" [WARNING] [units] {reason}") + results.append(TaskResult.skipped(node_id=node.node_id, reason=reason)) + continue + + # 验证并转换为 Pydantic model + try: + update_model = PostGeneratorUnits.model_validate(update_data) + except ValidationError as e: + results.append(TaskResult.failed(node_id=node.node_id, error=f"{ERROR_VALIDATION_FAILED}: {e}")) + continue + + push_id = self._generate_push_id() + biz_id = node.data_id or update_model.id + if not biz_id: + results.append(TaskResult.failed(node_id=node.node_id, error="Missing biz_id for update")) + continue + + try: + await api_update_units(self.api_client, update_model, push_id, biz_id) + results.append(TaskResult.success(node_id=node.node_id)) + except Exception as e: + results.append(TaskResult.failed(node_id=node.node_id, error=str(e))) + + return results + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="Units deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + node = self._create_basic_node(data, depend_ids=[]) + + if data.get("project_id"): + node.context["project_id"] = data["project_id"] + + return node + + +# ========== 静态 API 函数 ========== + +async def api_update_units(client, data: PostGeneratorUnits, push_id: str, biz_id: str) -> None: + """ + PUT /units - 更新机组数据 + + Args: + client: API 客户端 + data: 更新数据(Pydantic model) + push_id: 推送ID + biz_id: 业务ID + """ + request_data = {"push_id": push_id, "biz_id": biz_id, "data": data.model_dump(exclude_unset=True)} + response = await client.request(method="PUT", endpoint="/units", data=request_data) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") diff --git a/sync_state_machine/domain/units/jsonl_handler.py b/sync_state_machine/domain/units/jsonl_handler.py new file mode 100644 index 0000000..8ae40fc --- /dev/null +++ b/sync_state_machine/domain/units/jsonl_handler.py @@ -0,0 +1,60 @@ +"""Units Domain - JSONL Handler""" +import json +import re +from typing import List + +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import UnitsSyncNode, SyncNode +from schemas.project_extensions.generator_unit import GeneratorUnitProject + + +class UnitsJsonlHandler(BaseJsonlHandler): + """机组 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "units", UnitsSyncNode, GeneratorUnitProject) + + async def load(self) -> List['SyncNode']: + """加载机组数据(支持 generator_unit_N.jsonl 与 units_N.jsonl)""" + nodes: List[SyncNode] = [] + seen_ids: set[str] = set() + + if not self.datasource.dir_path.exists(): + return nodes + + # 查找所有匹配的文件:generator_unit_N.jsonl 或 units_N.jsonl + patterns = ( + re.compile(r"^generator_unit_\d+\.jsonl$"), + re.compile(r"^units_\d+\.jsonl$"), + ) + + for file_path in self.datasource.dir_path.iterdir(): + if not any(pattern.match(file_path.name) for pattern in patterns): + continue + + # 读取文件 + with open(file_path, "r", encoding="utf-8") as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + if not line: + continue + + try: + item = json.loads(line) + item_id = self.extract_id(item) + if item_id and item_id in seen_ids: + continue + + # 创建节点 + node = self.create_node(item) + nodes.append(node) + + # 同时加载到缓存 + if item_id: + seen_ids.add(item_id) + bucket = self.datasource._data.setdefault(self.node_type, {}) + bucket[item_id] = item + + except json.JSONDecodeError as e: + print(f"Warning: Invalid JSON in {file_path.name}:{line_num}: {e}") + + return nodes diff --git a/sync_state_machine/domain/units/register.py b/sync_state_machine/domain/units/register.py new file mode 100644 index 0000000..8da7c82 --- /dev/null +++ b/sync_state_machine/domain/units/register.py @@ -0,0 +1,17 @@ +"""Units domain registration""" +from ...common.registry import DomainRegistry +from schemas.project_extensions.generator_unit import GeneratorUnitProject +from .sync_node import UnitsSyncNode +from .sync_strategy import UnitsSyncStrategy +from .jsonl_handler import UnitsJsonlHandler +from .api_handler import UnitsApiHandler + +# 注册 units domain +DomainRegistry.register( + node_type="units", + schema=GeneratorUnitProject, + node_class=UnitsSyncNode, + strategy_class=UnitsSyncStrategy, + jsonl_handler_class=UnitsJsonlHandler, + api_handler_class=UnitsApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/units/sync_node.py b/sync_state_machine/domain/units/sync_node.py new file mode 100644 index 0000000..b889b5e --- /dev/null +++ b/sync_state_machine/domain/units/sync_node.py @@ -0,0 +1,13 @@ +"""Units SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.project_extensions.generator_unit import GeneratorUnitProject + + +class UnitsSyncNode(SyncNode[GeneratorUnitProject]): + """机组同步节点""" + node_type = "units" + schema = GeneratorUnitProject + + def __init__(self, **kwargs): + super().__init__(**kwargs) diff --git a/sync_state_machine/domain/units/sync_strategy.py b/sync_state_machine/domain/units/sync_strategy.py new file mode 100644 index 0000000..a1081d6 --- /dev/null +++ b/sync_state_machine/domain/units/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.project_extensions.generator_unit import GeneratorUnitProject + + +class UnitsSyncStrategy(DefaultSyncStrategy[GeneratorUnitProject]): + """ + Units 同步策略(项目扩展)。 + """ + + schema = GeneratorUnitProject + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["project_id", "serial_number"], + depend_fields={"project_id": "project"}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) \ No newline at end of file diff --git a/sync_state_machine/domain/user/__init__.py b/sync_state_machine/domain/user/__init__.py new file mode 100644 index 0000000..ebc3d38 --- /dev/null +++ b/sync_state_machine/domain/user/__init__.py @@ -0,0 +1,6 @@ +"""User domain""" +from .sync_node import UserSyncNode +from .sync_strategy import UserSyncStrategy +from .jsonl_handler import UserJsonlHandler + +__all__ = ["UserSyncNode", "UserSyncStrategy", "UserJsonlHandler"] diff --git a/sync_state_machine/domain/user/api_handler.py b/sync_state_machine/domain/user/api_handler.py new file mode 100644 index 0000000..7355117 --- /dev/null +++ b/sync_state_machine/domain/user/api_handler.py @@ -0,0 +1,132 @@ +""" +User API Handler (只读) + +职责: +- 加载用户列表 +- 不支持创建/更新/删除 + +实现的接口: +GET: +- /user/list - 获取用户列表 +""" + +from typing import List, Dict, Any +from ...datasource.api.handler import BaseApiHandler +from ...datasource.task_result import TaskResult +from ...common.sync_node import SyncNode +from .sync_node import UserSyncNode +from schemas.user.user import UserListDetailItem + + +class UserApiHandler(BaseApiHandler): + """用户 API Handler (只读)""" + + def __init__(self): + super().__init__() + self._node_type = "user" + self._node_class = UserSyncNode + self._schema = UserListDetailItem + + async def load(self) -> List[SyncNode]: + """加载用户列表(支持分页)""" + try: + nodes = [] + page = 1 + page_size = 100 + + while True: + # 获取一页数据 + users, total = await api_get_user_list( + self.api_client, + page=page, + page_size=page_size + ) + + # 没有数据了,退出循环 + if not users: + break + + # 转换为节点 + for user_model in users: + user_data = user_model.model_dump() + nodes.append(self._create_node(user_data)) + + # 检查是否还有下一页 + if page * page_size >= total: + break + + page += 1 + + return nodes + except Exception as e: + print(f"❌ Failed to load users: {e}") + return [] + + async def create_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持创建""" + return [ + TaskResult.failed(node_id=node.node_id, error="User creation not supported") + for node in nodes + ] + + async def update_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持更新""" + return [ + TaskResult.failed(node_id=node.node_id, error="User update not supported") + for node in nodes + ] + + async def delete_all(self, nodes: List[SyncNode]) -> List[TaskResult]: + """不支持删除""" + return [ + TaskResult.failed(node_id=node.node_id, error="User deletion not supported") + for node in nodes + ] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + """轮询异步任务状态(占位)""" + return await super().poll_tasks(task_ids) + + def _create_node(self, data: Dict[str, Any]) -> SyncNode: + return self._create_basic_node(data, depend_ids=[]) + + +# ========== 静态 API 函数 ========== + +async def api_get_user_list(client, page: int = 1, page_size: int = 100) -> tuple[List[UserListDetailItem], int]: + """ + GET /user/list - 获取用户列表 + + Args: + client: API客户端 + page: 页码,从1开始 + page_size: 每页大小 + + Returns: + tuple[List[UserListDetailItem], int]: (验证过的用户列表, 总数) + """ + from pydantic import ValidationError + + response = await client.request( + method="GET", + endpoint="/user/list", + params={"page": page, "page_size": page_size} + ) + if response.get("code") != 200: + raise Exception(f"API error: {response.get('message', 'Unknown error')}") + + data = response.get("data", {}) + items = data.get("list", []) + total = data.get("total", 0) + + # 验证每个返回项 + validated_items = [] + for item in items: + try: + validated_item = UserListDetailItem.model_validate(item) + validated_items.append(validated_item) + except ValidationError as e: + print(f"⚠️ Skipping invalid user item: {e}") + continue + + return validated_items, total diff --git a/sync_state_machine/domain/user/jsonl_handler.py b/sync_state_machine/domain/user/jsonl_handler.py new file mode 100644 index 0000000..09ad944 --- /dev/null +++ b/sync_state_machine/domain/user/jsonl_handler.py @@ -0,0 +1,10 @@ +"""User Domain - JSONL Handler""" +from ...datasource import BaseJsonlHandler, JsonlDataSource +from .sync_node import UserSyncNode +from schemas.user.user import UserListDetailItem + + +class UserJsonlHandler(BaseJsonlHandler): + """用户 JSONL Handler""" + def __init__(self, datasource: JsonlDataSource): + super().__init__(datasource, "user", UserSyncNode, UserListDetailItem) diff --git a/sync_state_machine/domain/user/register.py b/sync_state_machine/domain/user/register.py new file mode 100644 index 0000000..e686e3d --- /dev/null +++ b/sync_state_machine/domain/user/register.py @@ -0,0 +1,17 @@ +"""User domain registration""" +from ...common.registry import DomainRegistry +from schemas.user.user import UserListDetailItem +from .sync_node import UserSyncNode +from .sync_strategy import UserSyncStrategy +from .jsonl_handler import UserJsonlHandler +from .api_handler import UserApiHandler + +# 注册 user domain +DomainRegistry.register( + node_type="user", + schema=UserListDetailItem, + node_class=UserSyncNode, + strategy_class=UserSyncStrategy, + jsonl_handler_class=UserJsonlHandler, + api_handler_class=UserApiHandler, +) \ No newline at end of file diff --git a/sync_state_machine/domain/user/sync_node.py b/sync_state_machine/domain/user/sync_node.py new file mode 100644 index 0000000..3952ac1 --- /dev/null +++ b/sync_state_machine/domain/user/sync_node.py @@ -0,0 +1,14 @@ +"""User SyncNode""" + +from ...common.sync_node import SyncNode +from schemas.user.user import UserListDetailItem + + +class UserSyncNode(SyncNode[UserListDetailItem]): + """用户同步节点""" + node_type = "user" + schema = UserListDetailItem + + def __init__(self, **kwargs): + super().__init__(**kwargs) + diff --git a/sync_state_machine/domain/user/sync_strategy.py b/sync_state_machine/domain/user/sync_strategy.py new file mode 100644 index 0000000..c298e0c --- /dev/null +++ b/sync_state_machine/domain/user/sync_strategy.py @@ -0,0 +1,20 @@ +from ...sync_system.strategy import DefaultSyncStrategy +from ...sync_system.config import StrategyConfig, OrphanAction, UpdateDirection +from schemas.user.user import UserListDetailItem + + +class UserSyncStrategy(DefaultSyncStrategy[UserListDetailItem]): + """ + User 同步策略(基础数据,仅拉取)。 + """ + + schema = UserListDetailItem + + default_config = StrategyConfig( + auto_bind=True, + auto_bind_fields=["username"], + depend_fields={}, + local_orphan_action=OrphanAction.NONE, + remote_orphan_action=OrphanAction.CREATE_LOCAL, + update_direction=UpdateDirection.PULL, + ) \ No newline at end of file diff --git a/sync_state_machine/engine/__init__.py b/sync_state_machine/engine/__init__.py new file mode 100644 index 0000000..88fa94a --- /dev/null +++ b/sync_state_machine/engine/__init__.py @@ -0,0 +1,36 @@ +from .dispatcher import Decision, StateMachineRuntime +from .events import ( + e01_bootstrap, + e10_bind_core, + decision_note, + e20_create_prepare, + e21_create_prepare, + e22_delete_prepare, + e30_update_prepare, + e41_post_create_ready, + e15_bind_dependency, + e16_bind_auto, + e40_sync_execute, +) +from .model import Outcome, StateMachineConfig, Transition +from .state_apply import apply_state_to_node + +__all__ = [ + "Decision", + "Outcome", + "StateMachineConfig", + "StateMachineRuntime", + "Transition", + "apply_state_to_node", + "e01_bootstrap", + "e10_bind_core", + "decision_note", + "e20_create_prepare", + "e21_create_prepare", + "e22_delete_prepare", + "e30_update_prepare", + "e41_post_create_ready", + "e15_bind_dependency", + "e16_bind_auto", + "e40_sync_execute", +] diff --git a/sync_state_machine/engine/dispatcher.py b/sync_state_machine/engine/dispatcher.py new file mode 100644 index 0000000..6a567b9 --- /dev/null +++ b/sync_state_machine/engine/dispatcher.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Mapping, Optional + +from .evaluator import guard_matches +from .invariants import InvariantViolation +from .model import StateMachineConfig + + +@dataclass(frozen=True) +class Decision: + event_id: str + from_state: str + outcome_index: int + to_state: Optional[str] + emit: Optional[Mapping[str, Any]] + + +class StateMachineRuntime: + def __init__(self, config: StateMachineConfig): + self._config = config + + def dispatch( + self, + *, + current_state: str, + event_id: str, + context: Mapping[str, Any], + ) -> Optional[Decision]: + transition = self._config.transitions.get(event_id) + if transition is None: + raise KeyError(f"Unknown event: {event_id}") + + if transition.from_states and current_state not in transition.from_states and "*" not in transition.from_states: + return None + + for index, outcome in enumerate(transition.outcomes): + if guard_matches(outcome.when, context): + return Decision( + event_id=event_id, + from_state=current_state, + outcome_index=index, + to_state=outcome.to, + emit=outcome.emit, + ) + + return None + + def check_invariants(self, snapshot: Mapping[str, Any]) -> list[InvariantViolation]: + def _match_all(cond: Mapping[str, Any]) -> bool: + for key, value in cond.items(): + if snapshot.get(key) != value: + return False + return True + + violations: list[InvariantViolation] = [] + for invariant_id, idef in self._config.invariants.items(): + if not isinstance(idef, dict): + continue + + should_check = False + when = idef.get("when") + when_any = idef.get("when_any") + if isinstance(when, dict): + should_check = _match_all(when) + elif isinstance(when_any, list): + for cond in when_any: + if isinstance(cond, dict) and _match_all(cond): + should_check = True + break + + if not should_check: + continue + + require = idef.get("require") + if not isinstance(require, dict): + continue + + for rk, rv in require.items(): + if snapshot.get(rk) != rv: + violations.append( + InvariantViolation( + invariant_id=str(invariant_id), + message=f"require {rk}={rv}, got {snapshot.get(rk)}", + ) + ) + return violations diff --git a/sync_state_machine/engine/evaluator.py b/sync_state_machine/engine/evaluator.py new file mode 100644 index 0000000..3925791 --- /dev/null +++ b/sync_state_machine/engine/evaluator.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from typing import Any, Mapping + + +def guard_matches(guard: Mapping[str, Any], context: Mapping[str, Any]) -> bool: + for key, expected in guard.items(): + if context.get(key) != expected: + return False + return True diff --git a/sync_state_machine/engine/events.py b/sync_state_machine/engine/events.py new file mode 100644 index 0000000..9c1283c --- /dev/null +++ b/sync_state_machine/engine/events.py @@ -0,0 +1,675 @@ +from __future__ import annotations + +from enum import Enum +from typing import Any, Mapping, Optional, Sequence, TYPE_CHECKING, Set + +from .dispatcher import Decision, StateMachineRuntime +from .semantics import classify_core_pair +from .state_apply import apply_state_to_node + +if TYPE_CHECKING: + from ..common.sync_node import SyncNode + + +class CoreBindingResult(str, Enum): + NORMAL = "NORMAL" + WARNING = "WARNING" + ABNORMAL = "ABNORMAL" + + +class AutoBindOutcome(str, Enum): + ONE_TO_ONE = "ONE_TO_ONE" + AMBIGUOUS = "AMBIGUOUS" + ZERO = "ZERO" + KEY_MISSING = "KEY_MISSING" + KEY_ID_RESOLVE_FAIL = "KEY_ID_RESOLVE_FAIL" + DATA_MISSING = "DATA_MISSING" + + +class ExecuteAction(str, Enum): + CREATE = "CREATE" + UPDATE = "UPDATE" + DELETE = "DELETE" + + +class HandlerResult(str, Enum): + SUCCESS = "SUCCESS" + FAILED = "FAILED" + SKIPPED = "SKIPPED" + IN_PROGRESS = "IN_PROGRESS" + + +def _as_upper_text(value: Any, *, field_name: str) -> str: + if isinstance(value, Enum): + raw = value.value + else: + raw = value + if not isinstance(raw, str): + raise RuntimeError(f"{field_name} must be str/Enum, got {type(raw).__name__}") + return raw.upper() + + +def decision_note(decision: Decision) -> str: + if not decision.emit: + return "" + note = decision.emit.get("note") + return note if isinstance(note, str) else "" + + +def _apply_decision( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + decision: Decision, + fields: Optional[Set[str]] = None, + reason_override: Optional[str] = None, +) -> str: + reason = reason_override if reason_override is not None else decision_note(decision) + if decision.to_state: + reason_text = reason or "" + node.append_log( + f"状态机流转: {decision.from_state} --{decision.event_id}[{decision.outcome_index}]--> {decision.to_state} | reason={reason_text}" + ) + apply_state_to_node(runtime, node, state_id=decision.to_state, reason=reason, fields=fields) + + if decision.to_state: + snapshot = { + "binding_status": node.binding_status.value, + "action": node.action.value, + "status": node.status.value, + "data_id_exist": bool(node.data_id), + } + violations = runtime.check_invariants(snapshot) + if violations: + details = "; ".join(f"{v.invariant_id}: {v.message}" for v in violations) + raise RuntimeError(f"Invariant violation after {decision.event_id}->{decision.to_state}: {details}") + + return reason + + +def _format_dependency_reason( + *, + base_reason: str, + dep_errors: Optional[list[str]] = None, + semantic_errors: Optional[list[str]] = None, +) -> str: + details: list[str] = [] + for dep_err in dep_errors or []: + parts = dep_err.split("|") + tag = parts[0] if parts else "unknown" + if tag == "not_found" and len(parts) >= 4: + details.append(f"{parts[1]}:{parts[2]} data_id={parts[3]} -> not_found") + elif tag == "bad_status" and len(parts) >= 3: + details.append(f"{parts[1]} status={parts[2]} -> not_normal") + elif tag == "no_data_id" and len(parts) >= 3: + details.append(f"{parts[1]} {parts[2]} -> no_data_id") + else: + details.append(dep_err) + + if semantic_errors: + details.extend([e for e in semantic_errors if e]) + + if not details: + return base_reason + return f"{base_reason} | depends=[{'; '.join(details)}]" + + +def _expected_matches_actual(expected: Any, actual: Any) -> bool: + if isinstance(expected, list): + return any(_expected_matches_actual(x, actual) for x in expected) + + if isinstance(expected, str): + actual_candidates = set() + if isinstance(actual, Enum): + actual_candidates.update({str(actual.name), str(actual.value)}) + else: + actual_candidates.add(str(actual)) + expected_lower = expected.lower() + return any(str(c).lower() == expected_lower for c in actual_candidates) + + return expected == actual + + +def _state_matches_node( + runtime: StateMachineRuntime, + node: "SyncNode", + state_id: str, + *, + action_hint: Optional[str] = None, + match_fields: Optional[Set[str]] = None, +) -> bool: + states = runtime._config.raw.get("states") + pseudo_states = runtime._config.raw.get("pseudo_states") + if not isinstance(states, dict): + raise RuntimeError("invalid state-machine config: missing states") + if pseudo_states is not None and not isinstance(pseudo_states, dict): + raise RuntimeError("invalid state-machine config: pseudo_states must be mapping") + state_def = states.get(state_id) + if state_def is None and isinstance(pseudo_states, dict): + state_def = pseudo_states.get(state_id) + if not isinstance(state_def, dict): + return False + + snapshot = { + "binding_status": node.binding_status, + "action": action_hint if action_hint is not None else node.action, + "status": node.status, + "data_id_exist": bool(node.data_id), + } + + selected_fields = match_fields or set(snapshot.keys()) + + for k, actual in snapshot.items(): + if k not in selected_fields: + continue + if k not in state_def: + continue + expected = state_def[k] + if not _expected_matches_actual(expected, actual): + return False + return True + + +def _resolve_current_state( + runtime: StateMachineRuntime, + node: "SyncNode", + *, + candidate_states: Sequence[str], + action_hint: Optional[str] = None, + match_fields: Optional[Set[str]] = None, +) -> str: + matches = [ + s + for s in candidate_states + if _state_matches_node(runtime, node, s, action_hint=action_hint, match_fields=match_fields) + ] + if len(matches) == 1: + return matches[0] + if not matches: + raise RuntimeError( + f"cannot resolve current state for node={node.node_id}, candidates={list(candidate_states)}" + ) + raise RuntimeError( + f"ambiguous current state for node={node.node_id}, candidates={list(candidate_states)}, matches={matches}" + ) + + +def _config_from_states(runtime: StateMachineRuntime, event_id: str) -> list[str]: + transition = runtime._config.transitions.get(event_id) + if transition is None: + raise RuntimeError(f"unknown event: {event_id}") + from_states = [s for s in transition.from_states if s != "*"] + if not from_states: + raise RuntimeError(f"event {event_id} has no concrete from states") + return from_states + + +def _assert_expected_from_states( + *, + event_id: str, + config_from_states: Sequence[str], + expected_from_states: Optional[Sequence[str]], +) -> None: + if expected_from_states is None: + return + config_set = set(config_from_states) + expected_set = set(expected_from_states) + if config_set != expected_set: + raise RuntimeError( + f"event {event_id} from-states mismatch with config: " + f"config={sorted(config_set)}, expected={sorted(expected_set)}" + ) + + +def _dispatch_on_resolved_state( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + current_state: str, + event_id: str, + context: Mapping[str, Any], +) -> Decision: + decision = runtime.dispatch(current_state=current_state, event_id=event_id, context=context) + if decision is None: + raise RuntimeError( + f"state-machine miss: node={node.node_id}, state={current_state}, event={event_id}, context={dict(context)}" + ) + return decision + + +def _dispatch_required( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + event_id: str, + context: Mapping[str, Any], + action_hint: Optional[str] = None, + match_fields: Optional[Set[str]] = None, + expected_from_states: Optional[Sequence[str]] = None, +) -> Decision: + from_states = _config_from_states(runtime, event_id) + _assert_expected_from_states( + event_id=event_id, + config_from_states=from_states, + expected_from_states=expected_from_states, + ) + + current_state = _resolve_current_state( + runtime, + node, + candidate_states=from_states, + action_hint=action_hint, + match_fields=match_fields, + ) + + return _dispatch_on_resolved_state( + runtime, + node=node, + current_state=current_state, + event_id=event_id, + context=context, + ) + + +def e01_bootstrap( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + is_create_zombie: bool, +) -> Decision: + context = {"is_create_zombie": is_create_zombie} + decision = _dispatch_required( + runtime, + node=node, + event_id="E01", + context=context, + expected_from_states=["S16"], + ) + if decision.to_state == "S00": + _apply_decision(runtime, node=node, decision=decision, fields={"binding_status", "action", "status"}) + node.error = None + return decision + if decision.to_state == "S15": + reason_text = decision_note(decision) or "" + node.append_log( + f"状态机流转: {decision.from_state} --{decision.event_id}[{decision.outcome_index}]--> {decision.to_state} | reason={reason_text}" + ) + return decision + raise RuntimeError(f"unexpected bootstrap state: {decision.to_state}") + + +def e10_bind_core( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + has_binding_record: bool, + core_binding_result: Optional[str] = None, + peer_core_binding_result: Optional[str] = None, + local_data: Optional[Any] = None, + peer_data: Optional[Any] = None, + local_valid: bool = True, + peer_valid: bool = True, +) -> Decision: + if has_binding_record and (core_binding_result is None or peer_core_binding_result is None): + local_result, peer_result = classify_core_pair( + has_binding_record=has_binding_record, + local_data=local_data, + peer_data=peer_data, + local_valid=local_valid, + peer_valid=peer_valid, + ) + core_binding_result = local_result.value + peer_core_binding_result = peer_result.value + + normalized_core = _as_upper_text(core_binding_result, field_name="core_binding_result") if core_binding_result is not None else None + normalized_peer_core = ( + _as_upper_text(peer_core_binding_result, field_name="peer_core_binding_result") + if peer_core_binding_result is not None + else None + ) + + context: dict[str, Any] = { + "has_binding_record": has_binding_record, + } + if normalized_core is not None: + context["core_binding_result"] = normalized_core + if normalized_peer_core is not None: + context["peer_core_binding_result"] = normalized_peer_core + decision = _dispatch_required( + runtime, + node=node, + event_id="E10", + context=context, + expected_from_states=["S00"], + ) + _apply_decision(runtime, node=node, decision=decision, fields={"binding_status"}) + return decision + + +def e20_create_prepare( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + spawn_success: bool, +) -> Decision: + if not spawn_success: + node.append_log("状态机流转: S13 --E20[-1]--> | reason=创建副作用未完成") + return Decision( + event_id="E20", + from_state="S13", + outcome_index=-1, + to_state=None, + emit={"note": "创建副作用未完成"}, + ) + + context = { + "spawn_success": spawn_success, + } + decision = _dispatch_required( + runtime, + node=node, + event_id="E20", + context=context, + expected_from_states=["S13"], + ) + _apply_decision(runtime, node=node, decision=decision, fields={"binding_status", "action", "status"}) + return decision + + +def e21_create_prepare( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + create_enabled: bool, + data_present: bool, + create_id_resolve_ok: bool, +) -> Decision: + context = { + "create_enabled": create_enabled, + "data_present": data_present, + "create_id_resolve_ok": create_id_resolve_ok, + } + decision = _dispatch_required( + runtime, + node=node, + event_id="E21", + context=context, + expected_from_states=["S02"], + ) + _apply_decision(runtime, node=node, decision=decision, fields={"binding_status"}) + return decision + + +def e22_delete_prepare( + runtime: StateMachineRuntime, + *, + node: "SyncNode", +) -> Decision: + decision = _dispatch_required( + runtime, + node=node, + event_id="E22", + context={}, + expected_from_states=["S02"], + ) + _apply_decision(runtime, node=node, decision=decision, fields={"binding_status", "action", "status"}) + return decision + + +def e30_update_prepare( + runtime: StateMachineRuntime, + *, + source_node: "SyncNode", + target_node: "SyncNode", + update_enabled: bool, + target_has_data_id: bool, + update_id_resolve_ok: bool, + has_diff: bool, + id_resolve_detail: Optional[str] = None, +) -> Decision: + context = { + "update_enabled": update_enabled, + "target_has_data_id": target_has_data_id, + "update_id_resolve_ok": update_id_resolve_ok, + "has_diff": has_diff, + } + decision = _dispatch_required( + runtime, + node=source_node, + event_id="E30", + context=context, + expected_from_states=["S01"], + ) + if decision.to_state not in {"S07", "S08"}: + raise RuntimeError(f"unexpected update-prepare state: {decision.to_state}") + reason_override: Optional[str] = None + if decision.to_state == "S08": + base_reason = decision_note(decision) + details: list[str] = [] + if not target_has_data_id: + details.append(f"target_data_id_missing=true") + details.append(f"target_node_id={target_node.node_id}") + if target_has_data_id and not update_id_resolve_ok: + if id_resolve_detail: + details.append(f"update_id_resolve_fail=true") + details.append(f"update_id_resolve_detail={id_resolve_detail}") + else: + details.append("update_id_resolve_fail=true") + if details: + reason_override = f"{base_reason} | {'; '.join(details)}" + target_node.error = reason_override + + _apply_decision( + runtime, + node=target_node, + decision=decision, + fields={"action", "status"}, + reason_override=reason_override, + ) + return decision + + +def e41_post_create_ready( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + execute_action: str = "CREATE", +) -> Decision: + execute_action_norm = _as_upper_text(execute_action, field_name="execute_action") + context = { + "execute_action": execute_action_norm, + } + decision = _dispatch_required( + runtime, + node=node, + event_id="E41", + context=context, + expected_from_states=["S11C"], + ) + _apply_decision(runtime, node=node, decision=decision, fields={"action", "status"}) + return decision + + +def e15_bind_dependency( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + data_present: bool, + has_depend_fields: bool = True, + dep_satisfied: bool = True, + dep_errors: Optional[list[str]] = None, + semantic_errors: Optional[list[str]] = None, +) -> Decision: + if data_present and dep_satisfied: + node.append_log("状态机流转: S02 --E15[-1]--> | reason=依赖满足") + return Decision( + event_id="E15", + from_state="S02", + outcome_index=-1, + to_state=None, + emit={"note": "依赖满足"}, + ) + + context = { + "data_present": data_present, + "has_depend_fields": has_depend_fields, + "dep_satisfied": dep_satisfied, + } + decision = _dispatch_required( + runtime, + node=node, + event_id="E15", + context=context, + expected_from_states=["S02"], + ) + reason = decision_note(decision) + if decision.to_state in {"S03", "S04", "S05"}: + reason = _format_dependency_reason( + base_reason=reason, + dep_errors=dep_errors, + semantic_errors=semantic_errors, + ) + node.error = reason + + _apply_decision( + runtime, + node=node, + decision=decision, + fields={"binding_status"}, + reason_override=reason, + ) + return decision + + +def e16_bind_auto( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + auto_bind_enabled: bool, + auto_bind_outcome: Optional[str] = None, + create_enabled: Optional[bool] = None, + id_resolve_detail: Optional[str] = None, +) -> Decision: + auto_bind_outcome_norm = ( + _as_upper_text(auto_bind_outcome, field_name="auto_bind_outcome") + if auto_bind_outcome is not None + else None + ) + + context: dict[str, Any] = {"auto_bind_enabled": auto_bind_enabled} + if auto_bind_outcome_norm is not None: + context["auto_bind_outcome"] = auto_bind_outcome_norm + if create_enabled is not None: + context["create_enabled"] = create_enabled + decision = _dispatch_required( + runtime, + node=node, + event_id="E16", + context=context, + expected_from_states=["S02"], + ) + reason_override: Optional[str] = None + if auto_bind_outcome_norm == "KEY_ID_RESOLVE_FAIL" and id_resolve_detail: + base_reason = decision_note(decision) + reason_override = f"{base_reason} | key_id_resolve_fail=true; key_id_resolve_detail={id_resolve_detail}" + node.error = reason_override + + _apply_decision( + runtime, + node=node, + decision=decision, + fields={"binding_status", "action", "status"}, + reason_override=reason_override, + ) + return decision + + +def e40_sync_execute( + runtime: StateMachineRuntime, + *, + node: "SyncNode", + handler_result: str, + action: str, + poll_timeout: bool, + result_data_id: Optional[str] = None, +) -> Optional[Decision]: + action_norm = _as_upper_text(action, field_name="action") + if action_norm == "CREATE": + start_event_id = "E40C_START" + start_states = ["S06"] + result_event_id = "E40C" + result_states = ["S10C"] + elif action_norm == "UPDATE": + start_event_id = "E40U_START" + start_states = ["S07"] + result_event_id = "E40U" + result_states = ["S10U"] + elif action_norm == "DELETE": + start_event_id = "E40D_START" + start_states = ["S09"] + result_event_id = "E40D" + result_states = ["S10D"] + else: + return None + + normalized_result = "FAILED" if poll_timeout else _as_upper_text(handler_result, field_name="handler_result") + if normalized_result == "SKIPPED" and action_norm != "UPDATE": + return None + + start_context = { + "poll_timeout": poll_timeout, + "handler_result": "IN_PROGRESS", + "execute_action": action_norm, + } + result_context = { + "poll_timeout": poll_timeout, + "handler_result": normalized_result, + "execute_action": action_norm, + } + + decision: Optional[Decision] = None + in_entry_state = any(_state_matches_node(runtime, node, s) for s in start_states) + if in_entry_state: + start_decision = _dispatch_required( + runtime, + node=node, + event_id=start_event_id, + context=start_context, + expected_from_states=start_states, + ) + _apply_decision(runtime, node=node, decision=start_decision, fields={"action", "status"}) + if normalized_result == "IN_PROGRESS": + return start_decision + + if normalized_result == "IN_PROGRESS": + return None + + if normalized_result not in {"SUCCESS", "FAILED", "SKIPPED"}: + return None + + decision = _dispatch_required( + runtime, + node=node, + event_id=result_event_id, + context=result_context, + action_hint="UPDATE" if action_norm == "UPDATE" else None, + expected_from_states=result_states, + ) + + if decision is None: + return None + + apply_fields: Set[str] = {"action", "status"} + apply_data_id: Optional[str] = None + apply_data_id_field = False + if decision.to_state == "S11C": + if action_norm == "CREATE" and not result_data_id: + raise RuntimeError("E40 SUCCESS for CREATE requires non-empty result_data_id") + if result_data_id: + apply_data_id = result_data_id + apply_data_id_field = True + + _apply_decision(runtime, node=node, decision=decision, fields=apply_fields) + if apply_data_id_field: + apply_state_to_node(runtime, node, state_id=decision.to_state, reason=decision_note(decision), fields={"data_id"}, data_id=apply_data_id) + return decision diff --git a/sync_state_machine/engine/invariants.py b/sync_state_machine/engine/invariants.py new file mode 100644 index 0000000..e38f0d2 --- /dev/null +++ b/sync_state_machine/engine/invariants.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + + +@dataclass(frozen=True) +class InvariantViolation: + invariant_id: str + message: str diff --git a/sync_state_machine/engine/model.py b/sync_state_machine/engine/model.py new file mode 100644 index 0000000..df1850a --- /dev/null +++ b/sync_state_machine/engine/model.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, List, Mapping, Optional + +import yaml + + +@dataclass(frozen=True) +class Outcome: + when: Mapping[str, Any] + to: Optional[str] = None + emit: Optional[Mapping[str, Any]] = None + + +@dataclass(frozen=True) +class Transition: + event_id: str + stage: str + desc: str + from_states: List[str] + outcomes: List[Outcome] + + +@dataclass(frozen=True) +class StateMachineConfig: + path: Path + raw: Mapping[str, Any] + transitions: Mapping[str, Transition] + invariants: Mapping[str, Mapping[str, Any]] + + @staticmethod + def load(path: Path) -> "StateMachineConfig": + with path.open("r", encoding="utf-8") as f: + raw = yaml.safe_load(f) + + if not isinstance(raw, dict): + raise TypeError(f"Invalid state machine yaml: {path}") + + transitions_raw = raw.get("transitions") + if not isinstance(transitions_raw, dict): + raise TypeError("'transitions' must be a mapping") + + parsed: Dict[str, Transition] = {} + for event_id, tdef in transitions_raw.items(): + if not isinstance(tdef, dict): + continue + outcomes: List[Outcome] = [] + for o in tdef.get("outcomes", []): + if not isinstance(o, dict): + continue + when = o.get("when", {}) + if not isinstance(when, dict): + continue + outcomes.append( + Outcome( + when=when, + to=o.get("to") if isinstance(o.get("to"), str) else None, + emit=o.get("emit") if isinstance(o.get("emit"), dict) else None, + ) + ) + parsed[str(event_id)] = Transition( + event_id=str(event_id), + stage=str(tdef.get("stage", "")), + desc=str(tdef.get("desc", "")), + from_states=[s for s in tdef.get("from", []) if isinstance(s, str)], + outcomes=outcomes, + ) + + invariants = raw.get("invariants") if isinstance(raw.get("invariants"), dict) else {} + return StateMachineConfig(path=path, raw=raw, transitions=parsed, invariants=invariants) diff --git a/sync_state_machine/engine/semantics.py b/sync_state_machine/engine/semantics.py new file mode 100644 index 0000000..ff92fca --- /dev/null +++ b/sync_state_machine/engine/semantics.py @@ -0,0 +1,121 @@ +from __future__ import annotations + +from enum import Enum +from typing import TYPE_CHECKING, Any, List, Optional, Tuple + +from ..common.types import BindingStatus + +if TYPE_CHECKING: + from ..common.sync_node import SyncNode + + +class CoreBindingResult(str, Enum): + NORMAL = "NORMAL" + WARNING = "WARNING" + ABNORMAL = "ABNORMAL" + + +def classify_core_pair( + *, + has_binding_record: bool, + local_data: Optional[Any], + peer_data: Optional[Any], + local_valid: bool = True, + peer_valid: bool = True, +) -> Tuple[CoreBindingResult, CoreBindingResult]: + if not has_binding_record: + raise ValueError("classify_core_pair requires has_binding_record=True") + + local_exists = local_data is not None + peer_exists = peer_data is not None + + if local_exists and local_valid and peer_exists and peer_valid: + return CoreBindingResult.NORMAL, CoreBindingResult.NORMAL + if local_exists and local_valid and (not peer_exists or not peer_valid): + return CoreBindingResult.WARNING, CoreBindingResult.ABNORMAL + if (not local_exists or not local_valid) and peer_exists and peer_valid: + return CoreBindingResult.ABNORMAL, CoreBindingResult.WARNING + return CoreBindingResult.ABNORMAL, CoreBindingResult.ABNORMAL + + +def check_dependency_satisfied( + dependency_nodes: List[Optional["SyncNode"]], + field_values: Optional[List[str]] = None, + *, + allow_empty_dependency_ref: bool = True, + allow_missing_dep_data_id: bool = True, +) -> bool: + """ + 判断依赖是否满足(供 strategy 组装 E15 上下文)。 + + 该函数本质是“业务语义判断”,状态机只消费最终上下文: + - dep_satisfied (bool) + - dep_errors (结构化错误列表) + + 关键语义: + 1) 空依赖引用可放行(allow_empty_dependency_ref=True) + - 例如 contract_id="",表示该字段本轮不参与依赖约束。 + 2) 依赖节点 data_id 为空可放行(allow_missing_dep_data_id=True) + - 这不是严格意义上的“无错误”,而是当前业务策略下的“可继续”。 + - 原因:刚创建/回填中的依赖节点可能暂时无 data_id,但业务仍希望继续同步。 + - 未来可通过 strategy 配置将其切换为严格阻断。 + """ + if not dependency_nodes: + return True + + values = field_values or [] + for i, dep_node in enumerate(dependency_nodes): + dep_value = values[i] if i < len(values) else "" + dep_value_str = "" if dep_value is None else str(dep_value) + + if dep_node is None: + if allow_empty_dependency_ref and dep_value_str == "": + continue + return False + if dep_node.binding_status != BindingStatus.NORMAL: + return False + if not dep_node.data_id and not allow_missing_dep_data_id: + return False + return True + + +def collect_dependency_errors( + dependency_nodes: List[Optional["SyncNode"]], + field_names: List[str], + field_types: List[str], + field_values: List[str], + *, + allow_empty_dependency_ref: bool = True, + allow_missing_dep_data_id: bool = True, +) -> List[str]: + """ + 收集依赖错误(结构化错误码),由 strategy 传给状态机上下文。 + + 设计原则: + - 该函数负责“业务层事实归纳”,不是状态迁移本身。 + - 状态机只关心:是否满足(dep_satisfied) 与错误列表(dep_errors)。 + + 关于“依赖项缺乏数据不一定是错”: + - 某些业务场景里,父节点可能刚创建或尚未回填 data_id; + 但子节点仍需要进入同步队列,等待后续补齐。 + - 因此默认 allow_missing_dep_data_id=True:不产出 no_data_id 错误。 + - 后续可由 strategy 配置切换为严格模式(False),届时 no_data_id 将参与阻断。 + """ + errors: List[str] = [] + for i, dep_node in enumerate(dependency_nodes): + field_name = field_names[i] + field_value = field_values[i] if i < len(field_values) else "" + field_value_str = "" if field_value is None else str(field_value) + + if dep_node is None: + if allow_empty_dependency_ref and field_value_str == "": + continue + errors.append(f"not_found|{field_name}|{field_types[i]}|{field_values[i]}") + continue + if dep_node.binding_status != BindingStatus.NORMAL: + errors.append(f"bad_status|{field_name}|{dep_node.binding_status.value}") + continue + if not dep_node.data_id and not allow_missing_dep_data_id: + status_info = f"status={dep_node.status.value}" if dep_node.status else "status=未知" + errors.append(f"no_data_id|{field_name}|{status_info}") + return errors diff --git a/sync_state_machine/engine/state_apply.py b/sync_state_machine/engine/state_apply.py new file mode 100644 index 0000000..4ba7d4c --- /dev/null +++ b/sync_state_machine/engine/state_apply.py @@ -0,0 +1,118 @@ +from __future__ import annotations + +from enum import Enum +from typing import Any, Optional, Set, Type, TypeVar, cast + +from ..common.sync_node import SyncNode +from ..common.types import BindingStatus, SyncAction, SyncStatus +from .dispatcher import StateMachineRuntime + +E = TypeVar("E", bound=Enum) + + +def _state_def(runtime: StateMachineRuntime, state_id: str) -> dict[str, Any]: + states = runtime._config.raw.get("states") + if not isinstance(states, dict): + raise RuntimeError("invalid state-machine config: missing states") + state_def = states.get(state_id) + if not isinstance(state_def, dict): + raise RuntimeError(f"unknown state in config: {state_id}") + return state_def + + +def _to_enum(enum_cls: Type[E], raw_value: Any, field_name: str, state_id: str) -> E: + if not isinstance(raw_value, str): + raise RuntimeError( + f"invalid {field_name} for {state_id}: expected str/list[str], got {type(raw_value).__name__}" + ) + try: + return cast(E, enum_cls(raw_value)) + except Exception: + raw_lower = str(raw_value).lower() + for member in enum_cls: + if str(member.value).lower() == raw_lower or str(member.name).lower() == raw_lower: + return cast(E, member) + raise RuntimeError(f"invalid {field_name} value for {state_id}: {raw_value}") + + +def _resolve_enum_value( + *, + state_id: str, + field_name: str, + raw_value: Any, + enum_cls: Type[E], + current_value: E, +) -> E: + if isinstance(raw_value, str): + return _to_enum(enum_cls, raw_value, field_name, state_id) + + if isinstance(raw_value, list): + candidates = [_to_enum(enum_cls, v, field_name, state_id) for v in raw_value] + if not candidates: + raise RuntimeError(f"empty {field_name} candidates for {state_id}") + if current_value in candidates: + return current_value + if len(candidates) == 1: + return candidates[0] + raise RuntimeError( + f"ambiguous {field_name} for {state_id}: candidates={[c.value for c in candidates]}, " + f"current={current_value.value}" + ) + + raise RuntimeError( + f"invalid {field_name} for {state_id}: expected str/list[str], got {type(raw_value).__name__}" + ) + + +def apply_state_to_node( + runtime: StateMachineRuntime, + node: SyncNode, + *, + state_id: Optional[str], + reason: str = "", + fields: Optional[Set[str]] = None, + data_id: Optional[str] = None, +) -> bool: + if not state_id: + return False + + state_def = _state_def(runtime, state_id) + selected_fields = fields or {"binding_status", "action", "status"} + + with node.allow_core_state_write(source="state_machine"): + if "binding_status" in selected_fields and "binding_status" in state_def: + target_binding = _resolve_enum_value( + state_id=state_id, + field_name="binding_status", + raw_value=state_def["binding_status"], + enum_cls=BindingStatus, + current_value=node.binding_status, + ) + node.set_binding_status(target_binding, reason) + + if "action" in selected_fields and "action" in state_def: + target_action = _resolve_enum_value( + state_id=state_id, + field_name="action", + raw_value=state_def["action"], + enum_cls=SyncAction, + current_value=node.action, + ) + node.set_action(target_action, reason) + + if "status" in selected_fields and "status" in state_def: + target_status = _resolve_enum_value( + state_id=state_id, + field_name="status", + raw_value=state_def["status"], + enum_cls=SyncStatus, + current_value=node.status, + ) + node.set_status(target_status, reason) + + if "data_id" in selected_fields: + if data_id is None: + raise RuntimeError(f"state {state_id} requested data_id update but no data_id provided") + node.set_data_id(data_id, reason) + + return True diff --git a/sync_state_machine/pipeline/__init__.py b/sync_state_machine/pipeline/__init__.py new file mode 100644 index 0000000..f761cad --- /dev/null +++ b/sync_state_machine/pipeline/__init__.py @@ -0,0 +1,47 @@ +""" +Pipeline Layer - Pipeline orchestration and workflow management +""" + +from .copy_data_pipeline import CopyDataPipeline +from .full_sync_pipeline import FullSyncPipeline +from ..config import ( + PipelineRunConfig, + ApiDataSourceConfig, + JsonlDataSourceConfig, + DataSourceConfig, + PersistConfig, + LoggingConfig, + build_default_config, + build_config, + apply_config_overrides, + apply_env_overrides, + config_snapshot, +) +from .factory import ( + create_jsonl_to_api_pipeline, + create_api_to_jsonl_pipeline, + create_jsonl_to_jsonl_pipeline, + create_pipeline_from_config, + run_pipeline_from_config, +) + +__all__ = [ + "CopyDataPipeline", + "FullSyncPipeline", + "create_jsonl_to_api_pipeline", + "create_jsonl_to_jsonl_pipeline", + "create_api_to_jsonl_pipeline", + "create_pipeline_from_config", + "run_pipeline_from_config", + "PipelineRunConfig", + "ApiDataSourceConfig", + "JsonlDataSourceConfig", + "DataSourceConfig", + "PersistConfig", + "LoggingConfig", + "build_default_config", + "build_config", + "apply_config_overrides", + "apply_env_overrides", + "config_snapshot", +] diff --git a/sync_state_machine/pipeline/copy_data_pipeline.py b/sync_state_machine/pipeline/copy_data_pipeline.py new file mode 100644 index 0000000..2864f3b --- /dev/null +++ b/sync_state_machine/pipeline/copy_data_pipeline.py @@ -0,0 +1,247 @@ +""" +Copy Data Pipeline - Simple data copying without strategy execution +""" + +from pathlib import Path +from typing import List, Any, Optional + +from ..common.collection import DataCollection +from ..common.types import SyncAction, SyncStatus +from ..common.registry import DomainRegistry +from ..datasource import JsonlDataSource +from ..engine import StateMachineConfig, StateMachineRuntime, apply_state_to_node + + +class CopyDataPipeline: + """ + 通用数据复制 Pipeline,支持任意数据源之间的复制。 + + 流程: + 1. 从 source_datasource 加载所有数据到 source_collection + 2. 将每个节点复制到 target_collection,设置 action=CREATE + 3. 使用 target_datasource 保存所有节点 + + 用途: + - 数据迁移 (JSONL → JSONL) + - API 数据下载 (API → JSONL) + - 测试数据准备 + - 初始化同步 + + 支持两种初始化方式: + 1. 传入数据源实例 (推荐): source_datasource + target_datasource + 2. 传入目录路径 (兼容): source_dir + target_dir (自动创建 JsonlDataSource) + """ + + def __init__( + self, + source_datasource: Any = None, + target_datasource: Any = None, + source_dir: Optional[Path | str] = None, + target_dir: Optional[Path | str] = None, + node_types: List[str] | None = None, + load_order: List[str] | None = None, + save_order: List[str] | None = None, + ): + """ + 初始化 CopyDataPipeline + + Args: + source_datasource: 源数据源实例 (ApiDataSource, JsonlDataSource 等) + target_datasource: 目标数据源实例 + source_dir: 源数据目录 (兼容模式,会创建 JsonlDataSource) + target_dir: 目标数据目录 (兼容模式,会创建 JsonlDataSource) + node_types: 要复制的节点类型列表,None 表示复制所有注册的类型 + load_order: 数据加载顺序,None 表示使用 node_types 顺序 + save_order: 数据保存顺序,None 表示使用 node_types 顺序 + """ + self._supported_types: Optional[List[str]] = None + + # 数据源处理 - 优先使用实例,其次使用目录 + if source_datasource is not None: + self.source_datasource = source_datasource + self._owns_source = False + elif source_dir is not None: + from ..domain.registry import JSONL_HANDLERS + self.source_datasource = JsonlDataSource(dir_path=Path(source_dir), read_only=True) + # 自动注册所有 JSONL handlers,并收集支持的类型 + supported_types = [] + for handler_class in JSONL_HANDLERS: + handler = handler_class(self.source_datasource) + self.source_datasource.register_handler(handler) + supported_types.append(handler.node_type) + self._owns_source = True + self._supported_types = supported_types + else: + raise ValueError("Must provide either source_datasource or source_dir") + + if target_datasource is not None: + self.target_datasource = target_datasource + self._owns_target = False + elif target_dir is not None: + from ..domain.registry import JSONL_HANDLERS + self.target_datasource = JsonlDataSource(dir_path=Path(target_dir), read_only=False) + # 自动注册所有 JSONL handlers + for handler_class in JSONL_HANDLERS: + self.target_datasource.register_handler(handler_class(self.target_datasource)) + self._owns_target = True + else: + raise ValueError("Must provide either target_datasource or target_dir") + + # 当使用 source_dir 创建时,如果 node_types 未指定,只使用支持的类型 + if node_types is None and self._supported_types is not None: + self.node_types = self._supported_types + else: + self.node_types = node_types or DomainRegistry.get_registered_types() + self.load_order = load_order or self.node_types + self.save_order = save_order or self.node_types + cfg_path = Path(__file__).resolve().parents[1] / "config" / "node_state_machine.yaml" + self._sm_runtime = StateMachineRuntime(StateMachineConfig.load(cfg_path)) + + # 统计信息 + self.stats = { + "loaded": 0, + "copied": 0, + "saved": 0, + "failed": 0, + } + + async def run(self): + """ + 执行完整的复制流程 + + Returns: + dict: 统计信息 {"loaded": int, "copied": int, "saved": int, "failed": int} + """ + print(f"[CopyDataPipeline] Starting...") + print(f" Source: {self.source_datasource.__class__.__name__}") + print(f" Target: {self.target_datasource.__class__.__name__}") + print(f" Node types: {self.node_types}") + + # Stage 1: 加载源数据 + print("\n[Stage 1] Loading source data...") + source_collection = DataCollection(collection_id="source") + await self._load_source_data(source_collection) + + # Stage 2: 复制节点 + print("\n[Stage 2] Copying nodes...") + target_collection = DataCollection(collection_id="target") + await self._copy_nodes(source_collection, target_collection) + + # Stage 3: 保存到目标 + print("\n[Stage 3] Saving to target...") + await self._save_target_data(target_collection) + + # 打印统计信息 + self._print_summary() + + return self.stats + + async def _load_source_data(self, collection: DataCollection): + """从源数据源加载所有节点""" + # 如果是 JsonlDataSource 且没有注册 handlers,自动注册 + if isinstance(self.source_datasource, JsonlDataSource) and not self.source_datasource._handlers: + self._auto_register_jsonl_handlers(self.source_datasource) + + self.source_datasource.set_collection(collection) + await self.source_datasource.load_all(order=self.load_order) + + # 统计加载的节点数 + for node_type in self.node_types: + count = len(collection.filter(node_type=node_type)) + if count > 0: + print(f" [LOAD] {node_type}: {count} nodes") + self.stats["loaded"] += count + + async def _copy_nodes( + self, + source_collection: DataCollection, + target_collection: DataCollection + ): + """ + 复制所有节点到目标 collection,设置 action=CREATE, status=PENDING + + 注意: + - 保持相同的 node_id(用于追踪) + - data_id 设为空字符串(待创建) + - 复制 data 和 depend_ids + """ + for node in source_collection.filter(): # filter() 不带参数返回所有节点 + # 获取节点类 + node_class = DomainRegistry.get_node_class(node.node_type) + + # 创建新节点 + new_node = node_class( + node_id=node.node_id, # 保持相同的 node_id + data_id="", # CREATE 节点的 data_id 初始为空 + data=node.data, # 复制数据 + depend_ids=node.depend_ids.copy() if node.depend_ids else [], + ) + + apply_state_to_node( + self._sm_runtime, + new_node, + state_id="S06", + reason="copy pipeline init", + fields={"binding_status", "action", "status"}, + ) + apply_state_to_node( + self._sm_runtime, + new_node, + state_id="S06", + reason="copy pipeline init", + fields={"data_id"}, + data_id="", + ) + + await target_collection.add(new_node) + self.stats["copied"] += 1 + + print(f" Copied {self.stats['copied']} nodes") + + async def _save_target_data(self, collection: DataCollection): + """保存所有节点到目标数据源""" + # 如果是 JsonlDataSource 且没有注册 handlers,自动注册 + if isinstance(self.target_datasource, JsonlDataSource) and not self.target_datasource._handlers: + self._auto_register_jsonl_handlers(self.target_datasource) + + self.target_datasource.set_collection(collection) + await self.target_datasource.sync_all(order=self.save_order) + + # 统计保存结果 + for node_type in self.node_types: + nodes = collection.filter(node_type=node_type) + success_count = sum(1 for n in nodes if n.status == SyncStatus.SUCCESS) + failed_count = sum(1 for n in nodes if n.status == SyncStatus.FAILED) + + if success_count > 0 or failed_count > 0: + print(f" [SAVE] {node_type}: {success_count} success, {failed_count} failed") + + self.stats["saved"] += success_count + self.stats["failed"] += failed_count + + def _auto_register_jsonl_handlers(self, datasource: JsonlDataSource): + """自动为 JsonlDataSource 注册需要的 handlers(兼容模式)""" + for node_type in self.node_types: + if not DomainRegistry.is_registered(node_type): + continue + + handler_class = DomainRegistry.get_jsonl_handler(node_type) + if handler_class: + handler = handler_class(datasource) + datasource.register_handler(handler) + + def _print_summary(self): + """打印执行摘要""" + print("\n" + "=" * 60) + print("[CopyDataPipeline] Execution Summary") + print("=" * 60) + print(f" Loaded: {self.stats['loaded']} nodes") + print(f" Copied: {self.stats['copied']} nodes") + print(f" Saved: {self.stats['saved']} nodes") + print(f" Failed: {self.stats['failed']} nodes") + print("=" * 60) + + if self.stats["failed"] > 0: + print(f"\n⚠️ {self.stats['failed']} nodes failed to save") + else: + print("\n✅ All nodes saved successfully") diff --git a/sync_state_machine/pipeline/factory.py b/sync_state_machine/pipeline/factory.py new file mode 100644 index 0000000..12082ff --- /dev/null +++ b/sync_state_machine/pipeline/factory.py @@ -0,0 +1,578 @@ +""" +Pipeline Factory - 工厂函数,负责初始化所有组件并创建 Pipeline + +用户只需提供配置参数,工厂函数负责: +1. 初始化 Persistence +2. 初始化 DataSource(并注册 Handler) +3. 初始化 Collection 和 BindingManager +4. 初始化 Strategy(并注入依赖) +5. 创建 Pipeline(注入所有组件) +6. 返回完全就绪的 Pipeline +""" + +from __future__ import annotations + +import asyncio +import json +import logging +from pathlib import Path +from typing import Any, Dict, List, Optional + +from ..common.binding import BindingManager +from ..common.collection import DataCollection +from ..common.persistence import PersistenceBackend +from ..common.registry import DomainRegistry +from ..datasource.api.datasource import ApiDataSource +from ..datasource.jsonl.datasource import JsonlDataSource +from ..config import ( + PipelineRunConfig, + DataSourceConfig, + ApiDataSourceConfig, + JsonlDataSourceConfig, + PersistConfig, + LoggingConfig, + StrategyRuntimeConfig, + apply_config_overrides, + OrphanAction, + UpdateDirection, + resolve_log_file_path, + config_snapshot, +) +from ..sync_system.strategy import BaseSyncStrategy +from .run_logger import init_pipeline_logger +from .full_sync_pipeline import FullSyncPipeline + + +logger = logging.getLogger(__name__) + + +def _project_root() -> Path: + return Path(__file__).resolve().parents[2] + + +def _prepare_remote_jsonl_dir(remote_dir: Path, *, project_root: Optional[Path] = None) -> Path: + project_root_path = (project_root or _project_root()).resolve() + resolved_remote_dir = remote_dir.resolve(strict=False) + + if resolved_remote_dir.exists(): + if not resolved_remote_dir.is_dir(): + raise FileNotFoundError( + f"remote_datasource.jsonl_dir exists but is not a directory: {resolved_remote_dir}" + ) + return resolved_remote_dir + + try: + resolved_remote_dir.relative_to(project_root_path) + except ValueError as exc: + raise FileNotFoundError( + "remote_datasource.jsonl_dir does not exist and auto-create is only allowed " + f"under project root: {resolved_remote_dir} (project_root={project_root_path})" + ) from exc + + resolved_remote_dir.mkdir(parents=True, exist_ok=True) + logger.info("Created missing remote JSONL directory: %s", resolved_remote_dir) + return resolved_remote_dir + + +def _ensure_pipeline_logger( + *, + initialize_logger: bool, + logger_file_path: Optional[str], + logger_level: int, + suppress_node_logs: bool, +) -> None: + if not initialize_logger: + return + + app_logger = logging.getLogger("sync_state_machine") + if app_logger.handlers: + return + + init_pipeline_logger( + log_file_path=logger_file_path, + level=logger_level, + mirror_console=True, + replace_handlers=False, + suppress_node_logs=suppress_node_logs, + ) + + +def _api_handler_kwargs( + node_type: str, + ds_config: DataSourceConfig, + target_project_ids: List[str], +) -> Dict[str, Any]: + kwargs = dict(ds_config.handler_configs.get(node_type, {})) + + if node_type == "project" and target_project_ids: + kwargs.setdefault("filter_project_id", target_project_ids) + return kwargs + + +def _resolve_datasource_target_project_ids(config: PipelineRunConfig) -> tuple[List[str], List[str]]: + fallback = [str(pid) for pid in config.target_project_ids if str(pid)] + + local_cfg_ids = [str(pid) for pid in config.local_datasource.target_project_ids if str(pid)] + remote_cfg_ids = [str(pid) for pid in config.remote_datasource.target_project_ids if str(pid)] + + local_target_ids = local_cfg_ids if local_cfg_ids else fallback + remote_target_ids = remote_cfg_ids if remote_cfg_ids else fallback + return local_target_ids, remote_target_ids + + +async def _create_datasources(config: PipelineRunConfig): + local_cfg = config.local_datasource + remote_cfg = config.remote_datasource + + if isinstance(local_cfg, JsonlDataSourceConfig): + local_dir = Path(local_cfg.jsonl_dir) + if not local_dir.exists() or not local_dir.is_dir(): + raise FileNotFoundError( + f"local_datasource.jsonl_dir does not exist or is not a directory: {local_dir}" + ) + local_ds = JsonlDataSource(local_dir, read_only=local_cfg.read_only) + else: + local_ds = ApiDataSource( + base_url=local_cfg.api_base_url, + uid=local_cfg.api_uid, + secret=local_cfg.api_secret, + debug=local_cfg.api_debug, + poll_max_retries=local_cfg.poll_max_retries, + poll_interval=local_cfg.poll_interval, + rate_limit_max_requests=local_cfg.api_rate_limit_max_requests, + rate_limit_window_seconds=local_cfg.api_rate_limit_window_seconds, + ) + await local_ds.initialize() + + if isinstance(remote_cfg, JsonlDataSourceConfig): + remote_dir = Path(remote_cfg.jsonl_dir) + remote_dir = _prepare_remote_jsonl_dir(remote_dir) + remote_ds = JsonlDataSource(remote_dir, read_only=remote_cfg.read_only) + else: + remote_ds = ApiDataSource( + base_url=remote_cfg.api_base_url, + uid=remote_cfg.api_uid, + secret=remote_cfg.api_secret, + debug=remote_cfg.api_debug, + poll_max_retries=remote_cfg.poll_max_retries, + poll_interval=remote_cfg.poll_interval, + rate_limit_max_requests=remote_cfg.api_rate_limit_max_requests, + rate_limit_window_seconds=remote_cfg.api_rate_limit_window_seconds, + ) + await remote_ds.initialize() + + return local_ds, remote_ds + + +def _register_handlers( + config: PipelineRunConfig, + local_ds, + remote_ds, + all_types: List[str], +) -> None: + for node_type in all_types: + if isinstance(config.local_datasource, JsonlDataSourceConfig): + jsonl_handler_class = DomainRegistry.get_jsonl_handler(node_type) + if jsonl_handler_class is None: + raise RuntimeError(f"Missing JSONL handler for node_type: {node_type}") + local_ds.register_handler(jsonl_handler_class(local_ds)) + else: + api_handler_class = DomainRegistry.get_api_handler(node_type) + if api_handler_class is None: + raise RuntimeError(f"Missing API handler for node_type: {node_type}") + local_ds.register_handler( + api_handler_class( + **_api_handler_kwargs( + node_type, + config.local_datasource, + config.target_project_ids, + ) + ) + ) + + if isinstance(config.remote_datasource, JsonlDataSourceConfig): + jsonl_handler_class = DomainRegistry.get_jsonl_handler(node_type) + if jsonl_handler_class is None: + raise RuntimeError(f"Missing JSONL handler for node_type: {node_type}") + remote_ds.register_handler(jsonl_handler_class(remote_ds)) + else: + api_handler_class = DomainRegistry.get_api_handler(node_type) + if api_handler_class is None: + raise RuntimeError(f"Missing API handler for node_type: {node_type}") + remote_ds.register_handler( + api_handler_class( + **_api_handler_kwargs( + node_type, + config.remote_datasource, + config.target_project_ids, + ) + ) + ) + + +def _resolve_strategy_map(config: PipelineRunConfig, node_types: List[str]) -> Dict[str, StrategyRuntimeConfig]: + if config.strategies: + return {item.node_type: item for item in config.strategies} + + resolved: Dict[str, StrategyRuntimeConfig] = {} + for node_type in node_types: + strategy_class = DomainRegistry.get_strategy_class(node_type) + if strategy_class is None: + continue + resolved[node_type] = StrategyRuntimeConfig( + node_type=node_type, + config=strategy_class.default_config.model_copy(deep=True), + ) + return resolved + + +def _build_strategies( + config: PipelineRunConfig, + node_types: List[str], + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager, + strategy_map: Dict[str, StrategyRuntimeConfig], +) -> List[BaseSyncStrategy[Any]]: + strategies: List[BaseSyncStrategy[Any]] = [] + both_jsonl = isinstance(config.local_datasource, JsonlDataSourceConfig) and isinstance(config.remote_datasource, JsonlDataSourceConfig) + + for node_type in node_types: + strategy_class = DomainRegistry.get_strategy_class(node_type) + if strategy_class is None: + raise RuntimeError(f"Missing strategy for node_type: {node_type}") + strategy = strategy_class(node_type, local_collection, remote_collection, binding_manager) + + if both_jsonl: + strategy.update_config( + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + if node_type == "contract": + strategy.update_config(depend_fields={"project_id": "project"}) + + runtime_cfg = strategy_map.get(node_type) + if runtime_cfg is not None: + strategy.set_config(runtime_cfg.config.model_copy(deep=True)) + + strategies.append(strategy) + return strategies + + +async def create_pipeline_from_config(config: PipelineRunConfig) -> FullSyncPipeline: + if config.logging.initialize and not config.logging.file_path: + config.logging.file_path = resolve_log_file_path(config.logging) + + _ensure_pipeline_logger( + initialize_logger=config.logging.initialize, + logger_file_path=config.logging.file_path, + logger_level=config.logging.level, + suppress_node_logs=config.logging.suppress_node_logs, + ) + + all_types = list(config.node_types) + strategy_map = _resolve_strategy_map(config, all_types) + local_target_project_ids, remote_target_project_ids = _resolve_datasource_target_project_ids(config) + + if config.persist.backend != "sqlite": + raise NotImplementedError(f"Persistence backend not supported yet: {config.persist.backend}") + + db_path = Path(config.persist.db_path) + if config.persist.wipe_on_start and db_path.exists(): + db_path.unlink() + + persistence: Optional[PersistenceBackend] = None + local_ds = None + remote_ds = None + try: + persistence = PersistenceBackend(str(config.persist.db_path), backend=config.persist.backend) + await persistence.initialize() + + local_ds, remote_ds = await _create_datasources(config) + local_cfg_with_target = config.local_datasource.model_copy( + update={"target_project_ids": list(local_target_project_ids)}, + deep=True, + ) + remote_cfg_with_target = config.remote_datasource.model_copy( + update={"target_project_ids": list(remote_target_project_ids)}, + deep=True, + ) + handler_target_config = config.model_copy( + update={ + "local_datasource": local_cfg_with_target, + "remote_datasource": remote_cfg_with_target, + }, + deep=True, + ) + + _register_handlers(handler_target_config, local_ds, remote_ds, all_types) + local_ds.set_target_project_ids(local_target_project_ids) + remote_ds.set_target_project_ids(remote_target_project_ids) + + local_collection = DataCollection("local", persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + strategies = _build_strategies( + config, + all_types, + local_collection, + remote_collection, + binding_manager, + strategy_map, + ) + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=strategies, + node_types=all_types, + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + enable_persistence=config.persist.enable, + target_project_ids=config.target_project_ids, + local_target_project_ids=local_target_project_ids, + remote_target_project_ids=remote_target_project_ids, + ) + + return pipeline + except Exception: + async def _safe_close(name: str, resource: ApiDataSource | JsonlDataSource | PersistenceBackend | None) -> None: + if resource is None: + return + try: + await asyncio.wait_for(resource.close(), timeout=3.0) + except Exception as close_exc: + logger.warning("Failed to close %s during create cleanup: %s", name, close_exc) + + await _safe_close("remote_datasource", remote_ds) + await _safe_close("local_datasource", local_ds) + await _safe_close("persistence", persistence) + raise + + +async def run_pipeline_from_config( + config: PipelineRunConfig, + *, + title: str = "sync_state_machine pipeline", + print_summary: bool = True, +) -> Dict[str, Any]: + if config.logging.initialize and not config.logging.file_path: + config.logging.file_path = resolve_log_file_path(config.logging) + + _ensure_pipeline_logger( + initialize_logger=config.logging.initialize, + logger_file_path=config.logging.file_path, + logger_level=config.logging.level, + suppress_node_logs=config.logging.suppress_node_logs, + ) + + resolved_cfg = config_snapshot(config) + resolved_cfg_text = json.dumps(resolved_cfg, ensure_ascii=False, indent=2) + logger.info( + "Resolved Config Summary: node_types=%d local=%s remote=%s", + len(config.node_types), + config.local_datasource.type, + config.remote_datasource.type, + ) + if config.logging.file_path: + try: + with open(config.logging.file_path, "a", encoding="utf-8") as fp: + fp.write("Resolved Config:\n") + fp.write(resolved_cfg_text) + fp.write("\n") + except Exception as exc: + logger.warning("Failed to write resolved config into log file: %s", exc) + + pipeline: Optional[FullSyncPipeline] = None + try: + if print_summary: + print("\n" + "=" * 80) + print(f"🚀 Creating {title}") + print(f"📝 Log file: {config.logging.file_path or '-'}") + print( + f"🔧 Resolved Config Summary: node_types={len(config.node_types)} " + f"local={config.local_datasource.type} " + f"remote={config.remote_datasource.type}" + ) + print(f"🔧 Resolved Config:\n{resolved_cfg_text}") + print("=" * 80) + + pipeline = await create_pipeline_from_config(config) + stats = await pipeline.run() + + if print_summary: + print(f"\n✅ Pipeline completed: stats={stats}") + print(f"🗃️ Persistence DB: {config.persist.db_path}") + + return stats + finally: + if pipeline is not None: + await pipeline.close() + + +async def create_jsonl_to_api_pipeline( + *, + # 路径配置 + local_jsonl_dir: str, + persistence_db: str, + # API 配置 + api_base_url: str, + api_uid: str, + api_secret: str, + # 节点类型 + node_types: List[str], + # 项目过滤 + target_project_ids: Optional[List[str]] = None, + strategy_overrides: Optional[Dict[str, Dict[str, Any]]] = None, + # Pipeline 行为 + enable_persistence: bool = True, + wipe_persistence_on_start: bool = False, + # API 配置 + api_debug: bool = False, + poll_max_retries: int = 10, + poll_interval: float = 0.5, + api_rate_limit_max_requests: int = 30, + api_rate_limit_window_seconds: float = 10.0, + # Handler 自定义配置(可选,作用于 API 端) + handler_configs: Optional[Dict[str, Dict[str, Any]]] = None, + # Logger 配置 + initialize_logger: bool = True, + logger_file_path: Optional[str] = None, + logger_level: int = logging.INFO, +) -> FullSyncPipeline: + cfg = PipelineRunConfig( + node_types=node_types, + target_project_ids=target_project_ids or [], + local_datasource=JsonlDataSourceConfig(type="jsonl", jsonl_dir=local_jsonl_dir, read_only=False), + remote_datasource=ApiDataSourceConfig( + type="api", + api_base_url=api_base_url, + api_uid=api_uid, + api_secret=api_secret, + api_debug=api_debug, + poll_max_retries=poll_max_retries, + poll_interval=poll_interval, + api_rate_limit_max_requests=api_rate_limit_max_requests, + api_rate_limit_window_seconds=api_rate_limit_window_seconds, + target_project_ids=target_project_ids or [], + handler_configs=handler_configs or {}, + ), + strategies=[], + persist=PersistConfig( + db_path=persistence_db, + enable=enable_persistence, + wipe_on_start=wipe_persistence_on_start, + ), + logging=LoggingConfig( + initialize=initialize_logger, + file_path=logger_file_path, + level=logger_level, + ), + ) + if strategy_overrides: + cfg = apply_config_overrides(cfg, {"strategies": strategy_overrides}) + return await create_pipeline_from_config(cfg) + + +async def create_api_to_jsonl_pipeline( + *, + # API 配置(本地) + api_base_url: str, + api_uid: str, + api_secret: str, + # 路径配置 + remote_jsonl_dir: str, + persistence_db: str, + # 节点类型 + node_types: List[str], + # 项目过滤 + target_project_ids: Optional[List[str]] = None, + strategy_overrides: Optional[Dict[str, Dict[str, Any]]] = None, + # Pipeline 行为 + enable_persistence: bool = True, + wipe_persistence_on_start: bool = False, + # API 配置 + api_debug: bool = False, + poll_max_retries: int = 10, + poll_interval: float = 0.5, + api_rate_limit_max_requests: int = 30, + api_rate_limit_window_seconds: float = 10.0, + # Handler 自定义配置(可选,作用于 API 端) + handler_configs: Optional[Dict[str, Dict[str, Any]]] = None, + # Logger 配置 + initialize_logger: bool = True, + logger_file_path: Optional[str] = None, + logger_level: int = logging.INFO, +) -> FullSyncPipeline: + cfg = PipelineRunConfig( + node_types=node_types, + target_project_ids=target_project_ids or [], + local_datasource=ApiDataSourceConfig( + type="api", + api_base_url=api_base_url, + api_uid=api_uid, + api_secret=api_secret, + api_debug=api_debug, + poll_max_retries=poll_max_retries, + poll_interval=poll_interval, + api_rate_limit_max_requests=api_rate_limit_max_requests, + api_rate_limit_window_seconds=api_rate_limit_window_seconds, + target_project_ids=target_project_ids or [], + handler_configs=handler_configs or {}, + ), + remote_datasource=JsonlDataSourceConfig(type="jsonl", jsonl_dir=remote_jsonl_dir, read_only=False), + strategies=[], + persist=PersistConfig( + db_path=persistence_db, + enable=enable_persistence, + wipe_on_start=wipe_persistence_on_start, + ), + logging=LoggingConfig( + initialize=initialize_logger, + file_path=logger_file_path, + level=logger_level, + ), + ) + if strategy_overrides: + cfg = apply_config_overrides(cfg, {"strategies": strategy_overrides}) + return await create_pipeline_from_config(cfg) + + +async def create_jsonl_to_jsonl_pipeline( + *, + local_jsonl_dir: str, + remote_jsonl_dir: str, + persistence_db: str, + node_types: List[str], + target_project_ids: Optional[List[str]] = None, + enable_persistence: bool = True, + wipe_persistence_on_start: bool = False, + strategy_overrides: Optional[Dict[str, Dict[str, Any]]] = None, + initialize_logger: bool = True, + logger_file_path: Optional[str] = None, + logger_level: int = logging.INFO, +) -> FullSyncPipeline: + cfg = PipelineRunConfig( + node_types=node_types, + target_project_ids=target_project_ids or [], + local_datasource=JsonlDataSourceConfig(type="jsonl", jsonl_dir=local_jsonl_dir, read_only=False), + remote_datasource=JsonlDataSourceConfig(type="jsonl", jsonl_dir=remote_jsonl_dir, read_only=False), + strategies=[], + persist=PersistConfig( + db_path=persistence_db, + enable=enable_persistence, + wipe_on_start=wipe_persistence_on_start, + ), + logging=LoggingConfig( + initialize=initialize_logger, + file_path=logger_file_path, + level=logger_level, + ), + ) + if strategy_overrides: + cfg = apply_config_overrides(cfg, {"strategies": strategy_overrides}) + return await create_pipeline_from_config(cfg) diff --git a/sync_state_machine/pipeline/full_sync_pipeline.py b/sync_state_machine/pipeline/full_sync_pipeline.py new file mode 100644 index 0000000..81f1050 --- /dev/null +++ b/sync_state_machine/pipeline/full_sync_pipeline.py @@ -0,0 +1,488 @@ +""" +Full Sync Pipeline - Implements document-specified end-to-end workflow. +""" + +from __future__ import annotations + +import asyncio +import logging +from typing import Any, Dict, List, Optional, TYPE_CHECKING +from pathlib import Path + +if TYPE_CHECKING: + from ..datasource.datasource import BaseDataSource + +from ..common.collection import DataCollection +from ..common.binding import BindingManager +from ..common.persistence import PersistenceBackend +from ..sync_system.strategy import BaseSyncStrategy +from ..sync_system.config import OrphanAction, UpdateDirection +from ..engine import StateMachineConfig, StateMachineRuntime +from ..engine import e41_post_create_ready +from ..sync_system.strategy_ops import finalize_peer_creating_sources +from ..sync_system.strategy_ops.post_check_ops import evaluate_consistency_for_node_type +from .summary_report import print_pipeline_summary + + +logger = logging.getLogger(__name__) + + +class FullSyncPipeline: + """ + Full pipeline phases: + 1) bootstrap + 2) bind + 3) create + 4) update + 5) post-check + 6) persistence + """ + + def __init__( + self, + local_datasource: "BaseDataSource", + remote_datasource: "BaseDataSource", + strategies: List[BaseSyncStrategy], + persistence: PersistenceBackend, + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager, + node_types: Optional[List[str]] = None, + load_order: Optional[List[str]] = None, + sync_order: Optional[List[str]] = None, + enable_persistence: bool = True, + # 项目过滤 + target_project_ids: Optional[List[str]] = None, + local_target_project_ids: Optional[List[str]] = None, + remote_target_project_ids: Optional[List[str]] = None, + ): + # 验证必需参数(由工厂函数创建) + if strategies is None: + raise ValueError("strategies is required (use factory function to create pipeline)") + if local_collection is None or remote_collection is None or binding_manager is None: + raise ValueError("collections and binding_manager are required (use factory function to create pipeline)") + + self.local_datasource = local_datasource + self.remote_datasource = remote_datasource + self.strategies = strategies + self.node_types = node_types or [s.node_type for s in self.strategies] + self.load_order = load_order or self.node_types + self.sync_order = sync_order or self.node_types + self.persistence = persistence + self.enable_persistence = enable_persistence + self.target_project_ids = target_project_ids or [] + self.local_target_project_ids = ( + list(local_target_project_ids) + if local_target_project_ids is not None + else list(self.target_project_ids) + ) + self.remote_target_project_ids = ( + list(remote_target_project_ids) + if remote_target_project_ids is not None + else list(self.target_project_ids) + ) + + self.local_collection = local_collection + self.remote_collection = remote_collection + self.binding_manager = binding_manager + + # 统一状态机 runtime 注入(唯一入口) + runtime = self._resolve_pipeline_runtime() + self.sm_runtime = runtime + self.local_collection.set_state_machine_runtime(runtime) + self.remote_collection.set_state_machine_runtime(runtime) + self.local_datasource.set_state_machine_runtime(runtime) + self.remote_datasource.set_state_machine_runtime(runtime) + for strategy in self.strategies: + strategy.sm_runtime = runtime + + self.stats: Dict[str, Any] = { + "loaded": 0, + "synced": 0, + "failed": 0, + "post_check_passed": True, + } + self._consistency_by_type: Dict[str, Dict[str, Any]] = {} + self._logger = logger + self._closed = False + + def _resolve_pipeline_runtime(self) -> StateMachineRuntime: + if self.strategies: + runtime = self.strategies[0].sm_runtime + if runtime is not None: + return runtime + + cfg_path = Path(__file__).resolve().parents[1] / "config" / "node_state_machine.yaml" + return StateMachineRuntime(StateMachineConfig.load(cfg_path)) + + async def run(self) -> Dict[str, Any]: + try: + await self.phase_bootstrap() + self._logger.info("✅ Phase bootstrap completed") + + await self.phase_sync_by_node_type() + self._logger.info("✅ Phase sync-by-node-type completed") + + post_ok = await self.phase_post_check() + self.stats["post_check_passed"] = post_ok + self._logger.info("✅ Phase post-check completed") + + await self.phase_persistence() + self._logger.info("✅ Phase persistence completed") + return self.stats + finally: + await self.close() + + async def phase_sync_by_node_type(self) -> None: + strategy_map = {s.node_type: s for s in self.strategies} + for node_type in self.sync_order: + strategy = strategy_map.get(node_type) + if strategy is None: + continue + try: + section_width = 96 + self._logger.info("\n" + "-" * section_width) + self._logger.info(f"🧩 Strategy start: {node_type}") + self._logger.info("-" * section_width) + + await strategy.bind() + self._logger.info(f"✅ Strategy bind: {node_type}") + + if strategy.skip_sync: + self._logger.info(f"⏭️ Skipping create/update for {node_type} (skip_sync=True)") + continue + + created = await strategy.create() + self._logger.info(f"✅ Strategy create: {node_type} (created={len(created)})") + create_written = await self.commit_creates(node_type) + await self.normalize_create_success_to_update_entry(node_type) + if create_written: + await self._reload_node_type(node_type, reason="create wrote data") + + updated = await strategy.update() + self._logger.info(f"✅ Strategy update: {node_type} (updated={len(updated)})") + update_written = await self.commit_updates(node_type) + if update_written: + await self._reload_node_type(node_type, reason="update wrote data") + + self._logger.info(f"✅ Strategy done: {node_type}") + except Exception as exc: + self.stats["failed"] += 1 + self._logger.error(f"❌ Strategy failed but pipeline continues: {node_type} | {type(exc).__name__}: {exc}") + continue + + @staticmethod + def _is_noop_strategy(strategy: BaseSyncStrategy[Any]) -> bool: + cfg = strategy.config + return ( + cfg.local_orphan_action == OrphanAction.NONE + and cfg.remote_orphan_action == OrphanAction.NONE + and cfg.update_direction == UpdateDirection.NONE + ) + + async def phase_bootstrap(self) -> None: + await self._load_persistence_state() + self._logger.info("✅ Bootstrap: persistence loaded") + + await self._load_from_datasource() + self._logger.info("✅ Bootstrap: datasource fetched") + + if self.local_target_project_ids or self.remote_target_project_ids: + local_deleted = await self.local_collection.filter_by_project_ids(self.local_target_project_ids) + remote_deleted = await self.remote_collection.filter_by_project_ids(self.remote_target_project_ids) + if local_deleted > 0 or remote_deleted > 0: + self._logger.info(f"🔍 Project filtering: deleted {local_deleted} local, {remote_deleted} remote nodes") + + async def phase_bind(self) -> None: + strategy_map = {s.node_type: s for s in self.strategies} + for node_type in self.sync_order: + strategy = strategy_map.get(node_type) + if strategy is None: + continue + try: + await strategy.bind() + except Exception as exc: + self.stats["failed"] += 1 + self._logger.error(f"❌ Strategy bind failed but pipeline continues: {node_type} | {type(exc).__name__}: {exc}") + continue + + async def phase_create(self) -> None: + strategy_map = {s.node_type: s for s in self.strategies} + for node_type in self.sync_order: + strategy = strategy_map.get(node_type) + if strategy is None: + continue + if strategy.skip_sync: + self._logger.info(f"⏭️ Skipping create for {node_type} (skip_sync=True)") + continue + try: + created = await strategy.create() + self._logger.info(f"✅ Strategy create: {node_type} (created={len(created)})") + create_written = await self.commit_creates(node_type) + await self.normalize_create_success_to_update_entry(node_type) + if create_written: + await self._reload_node_type(node_type, reason="create wrote data") + except Exception as exc: + self.stats["failed"] += 1 + self._logger.error(f"❌ Strategy create failed but pipeline continues: {node_type} | {type(exc).__name__}: {exc}") + continue + + async def phase_update(self) -> None: + strategy_map = {s.node_type: s for s in self.strategies} + for node_type in self.sync_order: + strategy = strategy_map.get(node_type) + if strategy is None: + continue + if strategy.skip_sync: + self._logger.info(f"⏭️ Skipping update for {node_type} (skip_sync=True)") + continue + try: + updated = await strategy.update() + self._logger.info(f"✅ Strategy update: {node_type} (updated={len(updated)})") + update_written = await self.commit_updates(node_type) + if update_written: + await self._reload_node_type(node_type, reason="update wrote data") + await self._evaluate_consistency_for_node_type(node_type) + except Exception as exc: + self.stats["failed"] += 1 + self._logger.error(f"❌ Strategy update failed but pipeline continues: {node_type} | {type(exc).__name__}: {exc}") + continue + + async def close(self) -> None: + """关闭所有资源(DataSource、Persistence)""" + if self._closed: + return # 已经关闭过,避免重复关闭 + self._closed = True + + async def _safe_close(name: str, close_coro, timeout: float = 3.0) -> None: + try: + await asyncio.wait_for(close_coro, timeout=timeout) + except asyncio.TimeoutError: + self._logger.warning("⚠️ close timeout: %s (>%ss)", name, timeout) + except Exception as exc: + self._logger.warning("⚠️ close failed: %s (%s)", name, exc) + + await _safe_close("remote_datasource", self.remote_datasource.close()) + await _safe_close("local_datasource", self.local_datasource.close()) + await _safe_close("persistence", self.persistence.close()) + + async def _load_persistence_state(self) -> None: + """加载持久化数据并清理僵尸节点""" + if not self.enable_persistence: + return + + # 加载持久化数据 + await self.local_collection.load_from_persistence() + await self.remote_collection.load_from_persistence() + for node_type in self.node_types: + await self.binding_manager.load_from_persistence(node_type) + self._logger.info("🔄 Persistence loaded (state preserved; pending E01 normalization)") + + # 加载后 reset 清理:清理 CREATE 失败的僵尸绑定 + if not self.strategies: + raise RuntimeError("no strategies configured: cannot run bootstrap event E01") + total_cleaned = await BaseSyncStrategy.run_reset( + node_types=self.node_types, + local_collection=self.local_collection, + remote_collection=self.remote_collection, + binding_manager=self.binding_manager, + runtime=self.sm_runtime, + ) + if total_cleaned > 0: + self._logger.info(f"🧹 Reset cleanup: {total_cleaned} CREATE-failed zombies cleaned") + self._logger.info("🔄 Post-load reset cleanup completed") + + async def _load_from_datasource(self) -> None: + """从数据源加载数据""" + self.local_datasource.set_collection(self.local_collection) + await self.local_datasource.load_all(order=self.load_order) + + self.remote_datasource.set_collection(self.remote_collection) + await self.remote_datasource.load_all(order=self.load_order) + + for node_type in self.node_types: + self.stats["loaded"] += len(self.local_collection.filter(node_type=node_type)) + self.stats["loaded"] += len(self.remote_collection.filter(node_type=node_type)) + def _get_action_success_count(self, datasource: "BaseDataSource", node_type: str, action_key: str) -> int: + summary = datasource.get_action_summary().get(node_type, {}) + action_summary = summary.get(action_key, {}) if isinstance(summary, dict) else {} + return int(action_summary.get("success", 0)) if isinstance(action_summary, dict) else 0 + + async def _reload_node_type(self, node_type: str, *, reason: str) -> None: + self._logger.info(f"🔄 Reload after write: node_type={node_type}, reason={reason}") + await self.local_datasource.load_all(order=[node_type]) + await self.remote_datasource.load_all(order=[node_type]) + + async def _evaluate_consistency_for_node_type(self, node_type: str) -> Dict[str, Any]: + strategy = next((item for item in self.strategies if item.node_type == node_type), None) + depend_fields = dict(strategy.config.depend_fields) if strategy and strategy.config.depend_fields else {} + compare_to_remote = True + if strategy and strategy.config.update_direction == UpdateDirection.PULL: + compare_to_remote = False + ignore_list_item_fields = dict(strategy.config.post_check_ignore_list_item_fields) if strategy else {} + + # 从远端 handler 的 update_schemas 提取只读字段过滤白名单 + post_check_fields: List[str] | None = None + try: + remote_handler = self.remote_datasource.get_handler(node_type) + fields = remote_handler.get_update_fields() + if fields: + post_check_fields = fields + except Exception: + pass + + result = await evaluate_consistency_for_node_type( + node_type=node_type, + local_collection=self.local_collection, + remote_collection=self.remote_collection, + binding_manager=self.binding_manager, + logger=self._logger, + depend_fields=depend_fields, + compare_to_remote=compare_to_remote, + ignore_list_item_fields=ignore_list_item_fields, + post_check_fields=post_check_fields, + ) + self._consistency_by_type[node_type] = result + return result + + async def commit_creates(self, node_type: str) -> bool: + """提交 CREATE 操作(包含异步轮询)""" + # 执行同步(sync_all 内部会根据 action 筛选节点) + await self.local_datasource.sync_all( + order=[node_type], + poll_async_tasks=True + ) + + await self.remote_datasource.sync_all( + order=[node_type], + poll_async_tasks=True + ) + + await self._finalize_peer_creating_sources(node_type) + + # 更新统计 + local_nodes = self.local_collection.filter(node_type=node_type) + remote_nodes = self.remote_collection.filter(node_type=node_type) + self.stats["synced"] += len([n for n in local_nodes if n.action.value == "CREATE"]) + self.stats["synced"] += len([n for n in remote_nodes if n.action.value == "CREATE"]) + self.stats["failed"] += len([n for n in local_nodes if n.status.value == "FAILED"]) + self.stats["failed"] += len([n for n in remote_nodes if n.status.value == "FAILED"]) + + local_success = self._get_action_success_count(self.local_datasource, node_type, "create") + remote_success = self._get_action_success_count(self.remote_datasource, node_type, "create") + wrote = (local_success + remote_success) > 0 + return wrote + + async def _finalize_peer_creating_sources(self, node_type: str) -> None: + finalized_success, finalized_failed = await finalize_peer_creating_sources( + node_type=node_type, + local_collection=self.local_collection, + remote_collection=self.remote_collection, + binding_manager=self.binding_manager, + runtime=self.sm_runtime, + ) + + if finalized_success or finalized_failed: + self._logger.info( + f"🔁 Peer-creating finalize: node_type={node_type}, success={finalized_success}, failed={finalized_failed}" + ) + + async def normalize_create_success_to_update_entry(self, node_type: str) -> None: + """将 CREATE 成功节点从 S11C 归并到 S01,作为 update 起点。""" + normalized = 0 + for collection in (self.local_collection, self.remote_collection): + candidates = collection.filter_by_state_ids( + node_type=node_type, + state_ids=["S11C"], + ) + for node in candidates: + if node.action.value != "CREATE": + continue + decision = e41_post_create_ready(self.sm_runtime, node=node, execute_action="CREATE") + if decision.to_state != "S01": + raise RuntimeError( + f"[{node_type}] E41 expected S01, got {decision.to_state} for node={node.node_id}" + ) + normalized += 1 + + if normalized > 0: + self._logger.info(f"🔁 Post-create normalization: {normalized} nodes moved S11C->S01 for {node_type}") + + async def commit_updates(self, node_type: str) -> bool: + """提交 UPDATE 操作(包含异步轮询)""" + # 执行同步(sync_all 内部会根据 action 筛选节点) + await self.local_datasource.sync_all( + order=[node_type], + poll_async_tasks=True + ) + + await self.remote_datasource.sync_all( + order=[node_type], + poll_async_tasks=True + ) + + # 更新统计 + local_nodes = self.local_collection.filter(node_type=node_type) + remote_nodes = self.remote_collection.filter(node_type=node_type) + self.stats["synced"] += len([n for n in local_nodes if n.action.value == "UPDATE"]) + self.stats["synced"] += len([n for n in remote_nodes if n.action.value == "UPDATE"]) + self.stats["failed"] += len([n for n in local_nodes if n.status.value == "FAILED"]) + self.stats["failed"] += len([n for n in remote_nodes if n.status.value == "FAILED"]) + + local_success = self._get_action_success_count(self.local_datasource, node_type, "update") + remote_success = self._get_action_success_count(self.remote_datasource, node_type, "update") + wrote = (local_success + remote_success) > 0 + return wrote + + async def phase_post_check(self) -> bool: + """同步结果报告。 + + 所有类型均已同步完毕后,统一做一次全量 reload(触发后端派生字段计算), + 再对所有类型做一致性评估,确保 post-check 结果反映最终状态。 + """ + self._logger.info("🔄 Post-check: reloading all node types for final consistency evaluation...") + for node_type in self.node_types: + await self._reload_node_type(node_type, reason="post-check final reload") + for node_type in self.node_types: + await self._evaluate_consistency_for_node_type(node_type) + + self.stats["consistency"] = { + node_type: { + "ok": item.get("ok", True), + "checked_pairs": item.get("checked_pairs", 0), + "mismatch_count": item.get("mismatch_count", 0), + } + for node_type, item in self._consistency_by_type.items() + } + await self.print_summary() + return True # 总是返回 True,不阻断流程 + + async def phase_persistence(self) -> None: + """持久化所有数据。""" + if not self.enable_persistence: + self._logger.info("⏭️ Persistence disabled, skipping...") + return + + self._logger.info("🔍 Persisting local collection...") + await self.local_collection.persist() + self._logger.info("🔍 Persisting remote collection...") + await self.remote_collection.persist() + self._logger.info("🔍 Persisting binding manager...") + await self.binding_manager.persist() + self._logger.info("✅ All data persisted successfully") + + # ========== Summary & Reporting ========== + + async def print_summary(self) -> None: + """打印同步结果摘要""" + await print_pipeline_summary( + logger=self._logger, + node_types=self.node_types, + binding_manager=self.binding_manager, + local_datasource=self.local_datasource, + remote_datasource=self.remote_datasource, + local_collection=self.local_collection, + remote_collection=self.remote_collection, + consistency_by_type=self._consistency_by_type, + stats=self.stats, + ) diff --git a/sync_state_machine/pipeline/run_logger.py b/sync_state_machine/pipeline/run_logger.py new file mode 100644 index 0000000..c867b57 --- /dev/null +++ b/sync_state_machine/pipeline/run_logger.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import logging +from pathlib import Path +from typing import Optional + + +class _NodeLogFilter(logging.Filter): + def filter(self, record: logging.LogRecord) -> bool: + message = record.getMessage() + if "node=" in message: + return False + if "节点 " in message and "状态" in message: + return False + return True + + +def init_pipeline_logger( + *, + log_file_path: Optional[str] = None, + level: int = logging.INFO, + mirror_console: bool = True, + replace_handlers: bool = True, + suppress_node_logs: bool = True, +) -> logging.Logger: + logger = logging.getLogger("sync_state_machine") + logger.setLevel(level) + logger.propagate = False + + if replace_handlers: + clear_pipeline_logger_handlers(logger) + + formatter = logging.Formatter("%(message)s") + node_filter = _NodeLogFilter() if suppress_node_logs else None + + if mirror_console: + console_handler = logging.StreamHandler() + console_handler.setLevel(level) + console_handler.setFormatter(formatter) + if node_filter is not None: + console_handler.addFilter(node_filter) + logger.addHandler(console_handler) + + if log_file_path: + path = Path(log_file_path) + path.parent.mkdir(parents=True, exist_ok=True) + file_handler = logging.FileHandler(path, mode="w", encoding="utf-8") + file_handler.setLevel(level) + file_handler.setFormatter(formatter) + if node_filter is not None: + file_handler.addFilter(node_filter) + logger.addHandler(file_handler) + + return logger + + +def clear_pipeline_logger_handlers(logger: Optional[logging.Logger] = None) -> None: + target = logger or logging.getLogger("sync_state_machine") + handlers = list(target.handlers) + for handler in handlers: + target.removeHandler(handler) + try: + handler.close() + except Exception: + pass diff --git a/sync_state_machine/pipeline/summary_report.py b/sync_state_machine/pipeline/summary_report.py new file mode 100644 index 0000000..6488e49 --- /dev/null +++ b/sync_state_machine/pipeline/summary_report.py @@ -0,0 +1,150 @@ +from __future__ import annotations + + +async def print_pipeline_summary(*, logger, node_types, binding_manager, local_datasource, remote_datasource, local_collection, remote_collection, consistency_by_type, stats) -> None: + binding_counts = {} + for node_type in node_types: + records = await binding_manager.get_all_records(node_type) + binding_counts[node_type] = len(records) + + def format_action_sft(summary: dict, key: str) -> str: + action = summary.get(key, {}) + success = int(action.get("success", 0)) + failed = int(action.get("failed", 0)) + int(action.get("skipped", 0)) + total = int(action.get("total", 0)) + return f"{success}/{failed}/{total}" + + def format_consistency_sft(node_type: str) -> str: + consistency = consistency_by_type.get(node_type, {}) + checked = int(consistency.get("checked_pairs", 0)) + mismatch = int(consistency.get("mismatch_count", 0)) + matched = max(0, checked - mismatch) + return f"{matched}/{mismatch}/{checked}" + + def _clip(text: str, width: int) -> str: + if len(text) <= width: + return text + if width <= 1: + return text[:width] + return text[: width - 1] + "…" + + def print_collection_summary(title: str, datasource, collection) -> None: + action_summary = datasource.get_action_summary() + line_width = 133 + + node_type_w = 28 + bound_w = 16 + action_w = 16 + consistency_w = 18 + + logger.info(f"\n{'='*line_width}") + logger.info(f"📊 {title} Summary") + logger.info(f"{'='*line_width}") + logger.info("说明: Create/Update/Delete = 成功/失败/总数 (失败=FAILED+SKIPPED)") + logger.info("说明: Consistent = 一致对数/不一致对数/已检查绑定对数") + logger.info( + f"{'Node Type':<{node_type_w}} {'Bound/Rec/Load':<{bound_w}} {'Create(S/F/T)':<{action_w}} {'Update(S/F/T)':<{action_w}} {'Delete(S/F/T)':<{action_w}} {'Consistent(S/F/T)':<{consistency_w}}" + ) + logger.info(f"{'-'*line_width}") + + total_bound_normal = 0 + total_bindings = 0 + total_loaded = 0 + total_create = {"total": 0, "success": 0, "failed_effective": 0} + total_update = {"total": 0, "success": 0, "failed_effective": 0} + total_delete = {"total": 0, "success": 0, "failed_effective": 0} + total_consistency = {"checked": 0, "mismatch": 0} + + for node_type in node_types: + summary = action_summary.get(node_type, {}) + bindings = binding_counts.get(node_type, 0) + nodes = collection.filter(node_type=node_type) + loaded_count = len(nodes) + bound_normal_count = len([n for n in nodes if n.binding_status.value == "normal"]) + + create_str = format_action_sft(summary, "create") + update_str = format_action_sft(summary, "update") + delete_str = format_action_sft(summary, "delete") + consistency_str = format_consistency_sft(node_type) + + bound_str = f"{bound_normal_count}/{bindings}/{loaded_count}" + logger.info( + f"{_clip(node_type, node_type_w):<{node_type_w}} " + f"{_clip(bound_str, bound_w):<{bound_w}} " + f"{_clip(create_str, action_w):<{action_w}} " + f"{_clip(update_str, action_w):<{action_w}} " + f"{_clip(delete_str, action_w):<{action_w}} " + f"{_clip(consistency_str, consistency_w):<{consistency_w}}" + ) + + total_bound_normal += bound_normal_count + total_bindings += bindings + total_loaded += loaded_count + for bucket, key in ( + (total_create, "create"), + (total_update, "update"), + (total_delete, "delete"), + ): + action = summary.get(key, {}) + bucket["total"] += action.get("total", 0) + bucket["success"] += action.get("success", 0) + bucket["failed_effective"] += action.get("failed", 0) + action.get("skipped", 0) + + consistency = consistency_by_type.get(node_type, {}) + total_consistency["checked"] += int(consistency.get("checked_pairs", 0)) + total_consistency["mismatch"] += int(consistency.get("mismatch_count", 0)) + + logger.info(f"{'-'*line_width}") + total_consistent = max(0, total_consistency["checked"] - total_consistency["mismatch"]) + total_create_sft = f"{total_create['success']}/{total_create['failed_effective']}/{total_create['total']}" + total_update_sft = f"{total_update['success']}/{total_update['failed_effective']}/{total_update['total']}" + total_delete_sft = f"{total_delete['success']}/{total_delete['failed_effective']}/{total_delete['total']}" + total_consistency_sft = f"{total_consistent}/{total_consistency['mismatch']}/{total_consistency['checked']}" + total_bound_str = f"{total_bound_normal}/{total_bindings}/{total_loaded}" + logger.info( + f"{'TOTAL':<{node_type_w}} " + f"{_clip(total_bound_str, bound_w):<{bound_w}} " + f"{_clip(total_create_sft, action_w):<{action_w}} " + f"{_clip(total_update_sft, action_w):<{action_w}} " + f"{_clip(total_delete_sft, action_w):<{action_w}} " + f"{_clip(total_consistency_sft, consistency_w):<{consistency_w}}" + ) + + print_collection_summary("Local", local_datasource, local_collection) + print_collection_summary("Remote", remote_datasource, remote_collection) + + loaded = int(stats.get("loaded", 0)) + synced = int(stats.get("synced", 0)) + failed = int(stats.get("failed", 0)) + post_check_passed = bool(stats.get("post_check_passed", True)) + + mismatch_node_types = [ + node_type + for node_type, item in consistency_by_type.items() + if int(item.get("mismatch_count", 0)) > 0 + ] + + logger.info("\n" + "=" * 96) + logger.info( + f"📈 Pipeline Stats: loaded={loaded}, synced={synced}, failed={failed}, post_check_passed={post_check_passed}, mismatch_types={len(mismatch_node_types)}" + ) + if mismatch_node_types: + logger.info(f"🔎 Mismatch Node Types: {', '.join(mismatch_node_types)}") + logger.info("=" * 96) + + sample_per_type = 3 + has_mismatch_samples = any(int(item.get("mismatch_count", 0)) > 0 for item in consistency_by_type.values()) + if has_mismatch_samples: + logger.info("\n" + "=" * 96) + logger.info("🧪 Inconsistency Samples (per type)") + logger.info("=" * 96) + for node_type in node_types: + item = consistency_by_type.get(node_type, {}) + mismatch_count = int(item.get("mismatch_count", 0)) + if mismatch_count <= 0: + continue + checked_pairs = int(item.get("checked_pairs", 0)) + samples = item.get("samples", []) or [] + logger.info(f"- {node_type}: mismatches={mismatch_count}, checked_pairs={checked_pairs}") + for sample in samples[:sample_per_type]: + logger.info(f" • {sample}") diff --git a/sync_state_machine/sync_system/__init__.py b/sync_state_machine/sync_system/__init__.py new file mode 100644 index 0000000..9f175c9 --- /dev/null +++ b/sync_state_machine/sync_system/__init__.py @@ -0,0 +1,4 @@ +from .strategy import BaseSyncStrategy +from .registry import StrategyRegistry + +__all__ = ["BaseSyncStrategy", "StrategyRegistry"] diff --git a/sync_state_machine/sync_system/config.py b/sync_state_machine/sync_system/config.py new file mode 100644 index 0000000..e851541 --- /dev/null +++ b/sync_state_machine/sync_system/config.py @@ -0,0 +1,20 @@ +"""Compatibility facade for strategy config. + +Strategy configuration types live in `sync_state_machine.config.strategy_config`. +""" + +from ..config.strategy_config import ( + OrphanAction, + UpdateDirection, + StrategyConfig, + StrategyRuntimeConfig, + ConfigPresets, +) + +__all__ = [ + "OrphanAction", + "UpdateDirection", + "StrategyConfig", + "StrategyRuntimeConfig", + "ConfigPresets", +] diff --git a/sync_state_machine/sync_system/error_formatter.py b/sync_state_machine/sync_system/error_formatter.py new file mode 100644 index 0000000..746284d --- /dev/null +++ b/sync_state_machine/sync_system/error_formatter.py @@ -0,0 +1,168 @@ +""" +错误信息格式化工具(中文) + +提供统一的错误信息格式化函数,确保错误信息的一致性和可读性。 +所有错误信息使用中文。 +""" + +from typing import List + + +def format_dependency_error( + collection_name: str, + node_id: str, + data_id: str, + errors: List[str] +) -> str: + """ + 格式化依赖错误信息(中文) + + Args: + collection_name: "local" 或 "remote" + node_id: 节点 ID + data_id: 数据 ID + errors: 依赖错误列表,如 ["未找到: project_id(project)=P1", "contract_id: 状态=失败"] + + Returns: + 格式化的中文错误信息 + + 示例: + "依赖错误 (本地节点 node_id=xxx, data_id=yyy): 未找到: project_id(project)=P1; contract_id: 状态=失败" + """ + collection_cn = "本地" if collection_name == "local" else "远程" + error_str = "; ".join(errors) + return f"依赖错误 ({collection_cn}节点 node_id={node_id}, data_id={data_id}): {error_str}" + + +def format_not_found_error(field_name: str, node_type: str, value: str) -> str: + """ + 格式化"未找到依赖项"错误(中文) + + Args: + field_name: 字段名,如 "project_id" + node_type: 节点类型,如 "project" + value: 字段值,如 "P1" + + Returns: + 格式化的错误信息,如 "未找到: project_id(project)=P1" + """ + return f"未找到: {field_name}({node_type})={value}" + + +def format_status_error(field_name: str, status: str) -> str: + """ + 格式化"依赖节点状态错误"(中文) + + Args: + field_name: 字段名,如 "project_id" + status: 状态值,如 "FAILED" + + Returns: + 格式化的错误信息,如 "project_id: 状态=失败" + """ + # 状态名称映射 + status_name_map = { + "FAILED": "失败", + "MISSING": "缺失", + "ABNORMAL": "异常", + "WARNING": "警告", + "DEPENDENCY_ERROR": "依赖错误", + "NORMAL": "正常", + "UNCHECKED": "未检查", + } + status_cn = status_name_map.get(status, status) + return f"{field_name}: 状态={status_cn}" + + +def format_data_validation_error(node_type: str, error: str) -> str: + """ + 格式化数据校验错误(中文) + + Args: + node_type: 节点类型 + error: 错误详情 + + Returns: + 格式化的错误信息 + """ + return f"数据校验失败 ({node_type}): {error}" + + +def format_missing_field_error(missing_fields: List[str]) -> str: + """ + 格式化缺失字段错误(中文) + + Args: + missing_fields: 缺失的字段列表 + + Returns: + 格式化的错误信息 + """ + fields_str = ", ".join(missing_fields) + return f"缺少必需字段: {fields_str}" + + +def format_auto_bind_skip_reason( + collection_name: str, + node_id: str, + data_id: str, + reason: str +) -> str: + """ + 格式化自动绑定跳过原因(中文) + + Args: + collection_name: "local" 或 "remote" + node_id: 节点 ID + data_id: 数据 ID + reason: 跳过原因 + + Returns: + 格式化的原因说明 + """ + collection_cn = "本地" if collection_name == "local" else "远程" + return f"自动绑定跳过 ({collection_cn}节点 node_id={node_id}, data_id={data_id}): {reason}" + + +def format_create_failed_error( + collection_name: str, + node_id: str, + data_id: str, + error: str +) -> str: + """ + 格式化创建失败错误(中文) + + Args: + collection_name: "local" 或 "remote" + node_id: 节点 ID + data_id: 数据 ID + error: 错误详情 + + Returns: + 格式化的错误信息 + """ + collection_cn = "本地" if collection_name == "local" else "远程" + return f"创建失败 (从{collection_cn}节点 node_id={node_id}, data_id={data_id}): {error}" + + +def format_update_failed_error( + collection_name: str, + node_id: str, + data_id: str, + error: str +) -> str: + """ + 格式化更新失败错误(中文) + + Args: + collection_name: "local" 或 "remote" + node_id: 节点 ID + data_id: 数据 ID + error: 错误详情 + + Returns: + 格式化的错误信息 + """ + collection_cn = "本地" if collection_name == "local" else "远程" + return f"更新失败 (从{collection_cn}节点 node_id={node_id}, data_id={data_id}): {error}" diff --git a/sync_state_machine/sync_system/registry.py b/sync_state_machine/sync_system/registry.py new file mode 100644 index 0000000..d237658 --- /dev/null +++ b/sync_state_machine/sync_system/registry.py @@ -0,0 +1,29 @@ +""" +策略注册器模块 + +提供策略注册和查找功能。 +""" +from typing import Dict, Optional, TYPE_CHECKING + +if TYPE_CHECKING: + from .strategy import BaseSyncStrategy + + +class StrategyRegistry: + """策略注册器""" + _strategies: Dict[str, "BaseSyncStrategy"] = {} + + @classmethod + def register(cls, node_type: str, strategy: "BaseSyncStrategy"): + """注册策略""" + cls._strategies[node_type] = strategy + + @classmethod + def get_strategy(cls, node_type: str) -> Optional["BaseSyncStrategy"]: + """获取策略""" + return cls._strategies.get(node_type) + + @classmethod + def clear(cls): + """清空所有注册的策略(用于测试)""" + cls._strategies.clear() diff --git a/sync_state_machine/sync_system/resolve_ids.py b/sync_state_machine/sync_system/resolve_ids.py new file mode 100644 index 0000000..6ca837d --- /dev/null +++ b/sync_state_machine/sync_system/resolve_ids.py @@ -0,0 +1,358 @@ +""" +ID 解析模块:处理本地 data_id 到远程 data_id 的转换 +""" +from typing import TYPE_CHECKING, Optional, List, Dict, Any, cast +from ..common.collection import DataCollection +from ..common.binding import BindingManager + +if TYPE_CHECKING: + from ..common.sync_node import SyncNode + + +class IDResolver: + """ + ID 解析器:将本地业务 ID 转换为远程业务 ID + + 用于自动绑定场景,解决跨系统的 ID 引用问题。 + 例如:本地 Contract 的 project_id="P1" 需要转换为远程的 project_id="RP_99" + """ + + def __init__( + self, + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager + ): + self.local_collection = local_collection + self.remote_collection = remote_collection + self.binding_manager = binding_manager + + async def resolve_id( + self, + source_data_id: str, + node_type_hint: Optional[str] = None, + to_remote: bool = True + ) -> Optional[str]: + """ + 将源系统的 data_id 转换为目标系统的 data_id。 + + Args: + source_data_id: 源系统的业务 ID + node_type_hint: 节点类型提示 + to_remote: True 表示从本地转换到远程,False 表示从远程转换到本地 + + Returns: + 目标系统的业务 ID,如果转换失败则返回 None + """ + if to_remote: + # 1. 查找源节点(本地) + src_node = self._find_node_by_data_id( + self.local_collection, + source_data_id, + node_type_hint + ) + if not src_node: + return None + + # 2. 查找目标 node_id (远程) + target_node_id = await self.binding_manager.get_remote_id( + src_node.node_type, + src_node.node_id + ) + if not target_node_id: + return None + + # 3. 查找远程节点并提取 data_id + target_node = self.remote_collection.get(target_node_id) + if not target_node: + return None + return target_node.data_id + else: + # 1. 查找源节点(远程) + src_node = self._find_node_by_data_id( + self.remote_collection, + source_data_id, + node_type_hint + ) + if not src_node: + return None + + # 2. 查找目标 node_id (本地) + target_node_id = await self.binding_manager.get_local_id( + src_node.node_type, + src_node.node_id + ) + if not target_node_id: + return None + + # 3. 查找本地节点并提取 data_id + target_node = self.local_collection.get(target_node_id) + if not target_node: + return None + return target_node.data_id + + async def resolve_ids( + self, + local_data_ids: List[str], + node_type_hints: Optional[List[Optional[str]]] = None + ) -> List[Optional[str]]: + """ + 批量转换本地 data_id 列表为远程 data_id 列表。 + + Args: + local_data_ids: 本地业务 ID 列表 + node_type_hints: 节点类型提示列表(可选) + + Returns: + 远程业务 ID 列表,保持顺序,转换失败的位置为 None + """ + if node_type_hints is None: + node_type_hints = cast(List[Optional[str]], [None] * len(local_data_ids)) + + results: List[Optional[str]] = [] + for local_id, hint in zip(local_data_ids, node_type_hints): + remote_id = await self.resolve_id(local_id, hint) + results.append(remote_id) + + return results + + def _find_node_by_data_id( + self, + collection: DataCollection, + data_id: str, + node_type_hint: Optional[str] = None + ): + """ + 在 collection 中查找指定 data_id 的节点。 + + 如果提供了 node_type_hint,则只在该类型中查找。 + 否则通过 collection 内部的 data_id 索引进行 O(1) 查找。 + + Args: + collection: 数据集合 + data_id: 业务数据 ID + node_type_hint: 节点类型提示 + + Returns: + 找到的节点,或 None + """ + if node_type_hint: + # 有类型提示,直接使用高效查找 + return collection.get_by_data_id(node_type_hint, data_id) + + return collection.get_by_data_id_any(data_id) + + async def resolve_business_key_ids( + self, + business_key_fields: List[str], + local_data: Dict[str, Any], + node_type_hints: Optional[Dict[str, str]] = None + ) -> Dict[str, Optional[str]]: + """ + 解析业务键中的所有 ID 字段,转换为远程 ID。 + + 识别规则: + - 字段名以 "_id" 结尾 + - 字段名为 "id" + + Args: + business_key_fields: 业务键字段列表 + local_data: 本地数据对象 + node_type_hints: ID 字段到 node_type 的映射(可选) + + Returns: + 字段名到远程 ID 的映射,转换失败的为 None + """ + if node_type_hints is None: + node_type_hints = {} + + resolved = {} + + for field_name in business_key_fields: + # 判断是否是 ID 字段 + is_id_field = field_name.endswith("_id") or field_name == "id" + + if not is_id_field: + # 非 ID 字段,不需要转换 + resolved[field_name] = local_data.get(field_name) + continue + + # ID 字段,需要转换 + local_id = local_data.get(field_name) + + if local_id is None: + resolved[field_name] = None + continue + + # 转换为远程 ID + hint = node_type_hints.get(field_name) + remote_id = await self.resolve_id(local_id, hint) + resolved[field_name] = remote_id + + return resolved + + async def replace_ids_in_data( + self, + node: "SyncNode", + depend_field_names: set[str], + node_type: str, + id_field_hints: Dict[str, str], + to_remote: bool = True + ) -> None: + """ + 替换节点data中的所有ID字段(源系统ID -> 目标系统ID)。 + + Args: + node: 待处理的节点 + depend_field_names: 依赖字段名集合 + node_type: 节点类型(用于日志) + id_field_hints: ID字段到node_type的提示映射 + to_remote: 转换方向 + """ + import logging + logger = logging.getLogger(__name__) + + data_dict = node.get_data() + if not data_dict: + return + + # 遍历所有字段 + for field_name, value in list(data_dict.items()): + # 判断是否是ID字段 + is_id_field = field_name.endswith("_id") or field_name == "id" + is_primary_id_field = field_name in ("id", "_id") + + if not is_id_field: + continue + + if value is None: + continue + if value == "": + continue + + # 判断是否是依赖字段 + is_depend_field = field_name in depend_field_names + + # 获取node_type提示 + hint = id_field_hints.get(field_name) + + # 如果是主 ID 字段且没有提示,则使用当前节点类型作为提示 + if is_primary_id_field and not hint: + hint = node_type + + # 解析ID + target_id = await self.resolve_id(str(value), hint, to_remote=to_remote) + + if target_id is None: + # to_remote=True表示从local到remote,所以node是local节点 + # to_remote=False表示从remote到local,所以node是remote节点 + collection_name = "local" if to_remote else "remote" + node_data_id = node.data_id or "N/A" + direction = "remote" if to_remote else "local" + + if is_depend_field: + logger.warning( + f"[{node_type}] {collection_name.capitalize()} node {node.node_id} " + f"(data_id={node_data_id}): Dependency field '{field_name}' " + f"with value '{value}' failed to resolve to {direction} ID" + ) + else: + if not is_primary_id_field: + logger.warning( + f"[{node_type}] {collection_name.capitalize()} node {node.node_id} " + f"(data_id={node_data_id}): Non-dependency ID field '{field_name}' " + f"with value '{value}' failed to resolve to {direction} ID, setting to empty" + ) + data_dict[field_name] = "" + else: + # 成功解析,更新字段值 + data_dict[field_name] = target_id + + # 将修改后的数据写回节点 + node.set_data(data_dict) + + async def resolve_and_validate( + self, + data: Dict[str, Any], + node_type: str, + depend_fields: Dict[str, str], + to_remote: bool, + ) -> tuple[Optional[Dict[str, Any]], Optional[str]]: + """ + ID 替换 + 严格验证(一站式方法) + + 用途:CREATE/UPDATE 时将源端的依赖 ID 转换为目标端 ID,并验证转换结果 + + 流程: + 1. 无依赖字段 → 直接返回原数据 + 2. 创建临时节点 → 调用 replace_ids_in_data 执行 ID 替换 + 3. 严格验证:检查所有依赖字段是否成功转换 + + 验证逻辑(与 bind 阶段依赖检查的区别): + - bind 阶段:检查同端依赖(本地 material 的 contract_id 在本地是否存在) + - create 阶段:检查能否转换为目标端 ID(本地 contract_id 能否找到远程 ID) + + 触发场景示例: + 本地 material: {"contract_id": "local_c123"} + bind 检查:✅ 本地 contract(data_id=local_c123) 存在 + create 转换:❌ 远程 contract 还没创建,找不到远程 ID + 结果:虽然本地依赖满足,但无法推送到远程 + + Args: + data: 源数据字典 + node_type: 节点类型 + depend_fields: 依赖字段映射 {field_name: dep_node_type} + to_remote: True=本地→远程, False=远程→本地 + + Returns: + (resolved_data, None): 成功 + (None, error_msg): 失败 + """ + from ..common.registry import DomainRegistry + + # 无依赖字段,直接返回原数据 + if not depend_fields: + return data, None + + depend_field_names = set(depend_fields.keys()) + # id_field_hints 与 depend_fields 相同(field_name -> node_type) + id_field_hints = dict(depend_fields) + + # 创建临时节点用于 ID 替换 + temp_node_class = DomainRegistry.get_node_class(node_type) + temp_node = temp_node_class( + node_id="temp", + data_id="", + data=data + ) + + # 执行 ID 替换 + await self.replace_ids_in_data( + temp_node, + depend_field_names, + node_type, + id_field_hints, + to_remote=to_remote + ) + + resolved_data = temp_node.get_data() + if not resolved_data: + return None, "ID 解析失败(数据为空)" + + # 严格验证:检查所有依赖字段是否成功转换 + failed_fields = [] + for field_name, dep_type in depend_fields.items(): + original_value = data.get(field_name) + resolved_value = resolved_data.get(field_name) + + # 原本有值(源端 ID),但解析后为空(找不到目标端 ID) + # 说明依赖节点虽然在源端存在,但在目标端还没就绪 + if original_value and not resolved_value: + failed_fields.append(f"{field_name}({dep_type})={original_value}") + + if failed_fields: + direction = "远程" if to_remote else "本地" + error_msg = f"依赖字段无法解析到{direction} ID: {', '.join(failed_fields)}" + return None, error_msg + + return resolved_data, None diff --git a/sync_state_machine/sync_system/strategy.py b/sync_state_machine/sync_system/strategy.py new file mode 100644 index 0000000..662b204 --- /dev/null +++ b/sync_state_machine/sync_system/strategy.py @@ -0,0 +1,291 @@ +from typing import TypeVar, Generic, Type, Dict, List, Optional, Any +from pydantic import BaseModel +import logging +from pathlib import Path + +from ..common.collection import DataCollection +from ..common.binding import BindingManager +from ..common.sync_node import SyncNode +from .config import StrategyConfig, OrphanAction, UpdateDirection, ConfigPresets +from .strategy_ops import ( + get_phase1_reset_defaults, + run_bind, + run_create, + run_delete, + run_phase2_cleanup, + run_update, +) +from ..engine import ( + StateMachineConfig, + StateMachineRuntime, +) + +T = TypeVar("T", bound=BaseModel) +logger = logging.getLogger(__name__) + +class BaseSyncStrategy(Generic[T]): + """ + 同步策略基类。 + 纯逻辑层,不负责 IO 执行。 + + 子类可以通过覆盖 default_config 来设置默认配置: + ```python + class ProjectStrategy(DefaultSyncStrategy): + default_config = StrategyConfig( + auto_bind_fields=["name", "code"], + local_orphan_action=OrphanAction.CREATE_REMOTE + ) + schema = ProjectResponse + ``` + + 跳过同步控制: + skip_sync: bool - 如果为 True,则跳过该类型的 bind/create/update/sync 阶段 + 数据仍会被加载,但不会执行任何同步操作 + 适用于只需要加载数据供其他类型引用的场景(如 supplier) + """ + # 类变量:默认配置(子类可覆盖) + default_config: StrategyConfig = StrategyConfig() + # 类变量:schema 类型(子类必须设置) + schema: Type[T] = None # type: ignore + # 类变量:是否默认跳过同步(子类可覆盖) + default_skip_sync: bool = False + + def __init__( + self, + node_type: str, + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager, + ): + if self.schema is None: + raise ValueError(f"{self.__class__.__name__} must define schema as a class variable") + + self.node_type = node_type + self.local_collection = local_collection + self.remote_collection = remote_collection + self.binding_manager = binding_manager + # 复制类级别的默认配置到实例 + self.config = self.default_config.model_copy(deep=True) + # 是否跳过同步(可运行时修改) + self.skip_sync = self.default_skip_sync + # 统一由 Pipeline 注入 runtime;未注入时在执行阶段显式报错 + self.sm_runtime: Optional[StateMachineRuntime] = None + + # 配置逻辑校验 + self._validate_config() + + def ensure_runtime(self) -> StateMachineRuntime: + runtime = self.sm_runtime + if runtime is None: + cfg_path = Path(__file__).resolve().parents[1] / "config" / "node_state_machine.yaml" + runtime = StateMachineRuntime(StateMachineConfig.load(cfg_path)) + self.sm_runtime = runtime + self.local_collection.set_state_machine_runtime(runtime) + self.remote_collection.set_state_machine_runtime(runtime) + return runtime + + def _validate_config(self) -> None: + """ + 校验配置的逻辑一致性。 + + 规则: + - PUSH 模式:local_orphan_action 应为 CREATE_REMOTE,remote_orphan_action 应为 NONE + - PULL 模式:local_orphan_action 应为 NONE,remote_orphan_action 应为 CREATE_LOCAL + - NONE 模式:两者都应为 NONE + """ + direction = self.config.update_direction + local_action = self.config.local_orphan_action + remote_action = self.config.remote_orphan_action + + # PUSH 模式检查 + if direction == UpdateDirection.PUSH: + if local_action == OrphanAction.CREATE_LOCAL: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=PUSH but local_orphan_action=CREATE_LOCAL (本地创建)。" + f"应使用 CREATE_REMOTE (推送到远程)" + ) + if remote_action == OrphanAction.CREATE_LOCAL: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=PUSH but remote_orphan_action=CREATE_LOCAL (本地创建)。" + f"PUSH 模式应设为 NONE 或 DELETE_REMOTE" + ) + + # PULL 模式检查 + elif direction == UpdateDirection.PULL: + if local_action == OrphanAction.CREATE_REMOTE: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=PULL but local_orphan_action=CREATE_REMOTE (推送到远程)。" + f"PULL 模式应设为 NONE 或 DELETE_LOCAL" + ) + if remote_action in {OrphanAction.CREATE_REMOTE, OrphanAction.DELETE_LOCAL}: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=PULL but remote_orphan_action={remote_action}。" + f"PULL 模式建议使用 CREATE_LOCAL 或 NONE" + ) + + # NONE 模式检查 + elif direction == UpdateDirection.NONE: + if local_action != OrphanAction.NONE: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=NONE but local_orphan_action={local_action}。" + f"应设为 NONE" + ) + if remote_action != OrphanAction.NONE: + logger.warning( + f"[{self.node_type}] Config inconsistency: " + f"update_direction=NONE but remote_orphan_action={remote_action}。" + f"应设为 NONE" + ) + + def set_config(self, config: StrategyConfig): + """完全替换配置对象""" + self.config = config + self._validate_config() + + def update_config(self, **kwargs): + """ + 临时修改部分配置项。 + + Example: + strategy.update_config( + local_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PULL + ) + """ + valid_fields = type(self.config).model_fields + for key, value in kwargs.items(): + if key in valid_fields: + setattr(self.config, key, value) + else: + logger.warning(f"[{self.node_type}] Unknown config key: {key}") + # 更新配置后也要校验 + self._validate_config() + + def apply_preset(self, preset_name: str): + """ + 应用配置预设。 + + Args: + preset_name: 预设名称,可选:first_sync, daily_sync, repair_sync, pull_only, push_only + + Example: + strategy.apply_preset("first_sync") + """ + preset_config = ConfigPresets.get_preset(preset_name) + self.config = preset_config + self._validate_config() + logger.info(f"[{self.node_type}] Applied preset: {preset_name}") + + async def bind(self, **kwargs): + """进行绑定逻辑判定,设置 node.binding_status 和 node.action""" + raise NotImplementedError + + async def create(self) -> List[SyncNode]: + """准备 CREATE 操作""" + raise NotImplementedError + + async def update(self) -> List[SyncNode]: + """准备 UPDATE 操作""" + raise NotImplementedError + + def _needs_update( + self, + source_node: SyncNode, + target_node: SyncNode, + resolved_data: Optional[Dict[str, Any]] = None, + data_id_map: Optional[Dict[str, str]] = None, + ) -> bool: + from .strategy_ops.update_ops import default_needs_update + + return default_needs_update(self, source_node, target_node, resolved_data, data_id_map) + + @classmethod + def get_phase1_reset_defaults(cls) -> Dict[str, Any]: + return get_phase1_reset_defaults() + + @classmethod + async def run_reset( + cls, + *, + node_types: List[str], + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager, + runtime: StateMachineRuntime, + ) -> int: + """ + 执行加载后的重置清理(僵尸 CREATE 节点清理)。 + + 说明: + - `DataCollection.load_from_persistence()` 仅恢复持久化状态; + - 这里触发 E01:create_zombie -> S15(删除),其余 -> S00。 + """ + return await run_phase2_cleanup( + node_types=node_types, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + runtime=runtime, + ) + + @classmethod + async def run_phase2_reset( + cls, + *, + node_types: List[str], + local_collection: DataCollection, + remote_collection: DataCollection, + binding_manager: BindingManager, + runtime: StateMachineRuntime, + ) -> int: + """兼容旧命名,等价于 `run_reset`。""" + return await cls.run_reset( + node_types=node_types, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + runtime=runtime, + ) + + +class DefaultSyncStrategy(BaseSyncStrategy[T]): + """ + 基于 STATE_DEFINITIONS.md 实现的标准化同步策略。 + 采用四阶段管线:核心状态 -> 依赖检查 -> 自动匹配 -> 动作映射。 + """ + + async def bind(self, **kwargs): + self.ensure_runtime() + await run_bind(self, **kwargs) + + + + def _get_id_field_hints(self) -> Dict[str, str]: + """ + 获取 ID 字段的 node_type 提示。 + + 默认实现:从 depend_fields 中提取。 + 子类可以重写此方法提供更精确的映射。 + + Returns: + 字段名到 node_type 的映射,例如 {"project_id": "project"} + """ + return dict(self.config.depend_fields) if self.config.depend_fields else {} + async def create(self) -> List[SyncNode]: + self.ensure_runtime() + return await run_create(self) + + async def update(self) -> List[SyncNode]: + self.ensure_runtime() + return await run_update(self) + + async def delete(self) -> List[SyncNode]: + self.ensure_runtime() + return await run_delete(self) + + diff --git a/sync_state_machine/sync_system/strategy_ops/__init__.py b/sync_state_machine/sync_system/strategy_ops/__init__.py new file mode 100644 index 0000000..beaa181 --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/__init__.py @@ -0,0 +1,31 @@ +from .create_ops import add_create_action, run_create, finalize_peer_creating_sources +from .update_ops import add_update_action, run_update +from .delete_ops import run_delete +from .bind_ops import ( + run_bind, + phase_core_state, + phase_dependency_check, + check_dependencies_for_nodes, + phase_auto_binding, + check_dependency_satisfied, + collect_dependency_errors, +) +from .reset_ops import get_phase1_reset_defaults, run_phase2_cleanup + +__all__ = [ + "add_create_action", + "run_create", + "finalize_peer_creating_sources", + "add_update_action", + "run_update", + "run_delete", + "run_bind", + "phase_core_state", + "phase_dependency_check", + "check_dependencies_for_nodes", + "phase_auto_binding", + "check_dependency_satisfied", + "collect_dependency_errors", + "get_phase1_reset_defaults", + "run_phase2_cleanup", +] diff --git a/sync_state_machine/sync_system/strategy_ops/bind_ops.py b/sync_state_machine/sync_system/strategy_ops/bind_ops.py new file mode 100644 index 0000000..f096464 --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/bind_ops.py @@ -0,0 +1,560 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple + +from ...common.types import BindingStatus +from ...sync_system.config import OrphanAction +from ...sync_system.resolve_ids import IDResolver +from ...sync_system.utils import extract_biz_key_dict, dict_to_biz_key_tuple, resolve_id_fields_in_key_dict +from ...engine import e10_bind_core, decision_note, e15_bind_dependency, e16_bind_auto + +if TYPE_CHECKING: + from ...common.collection import DataCollection + from ...common.sync_node import SyncNode + +logger = logging.getLogger(__name__) + + +async def run_bind(strategy, **kwargs): + logger.info(f"[{strategy.node_type}] Starting Binding Pipeline...") + + local_nodes: List["SyncNode"] = strategy.local_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S00"], + ) + remote_nodes: List["SyncNode"] = strategy.remote_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S00"], + ) + + await phase_core_state(strategy, local_nodes, remote_nodes) + await phase_dependency_check(strategy, local_nodes, remote_nodes) + await phase_auto_binding(strategy, local_nodes, remote_nodes) + await refresh_bind_data_id(strategy) + + logger.info(f"[{strategy.node_type}] Binding Pipeline Completed.") + + +async def refresh_bind_data_id(strategy) -> None: + binding_pairs = await strategy.binding_manager.get_all_bindings(strategy.node_type) + local_to_remote = {local_id: remote_id for local_id, remote_id in binding_pairs if local_id} + remote_to_local = {remote_id: local_id for local_id, remote_id in binding_pairs if local_id and remote_id} + + for local_node in strategy.local_collection.filter(node_type=strategy.node_type): + remote_node_id = local_to_remote.get(local_node.node_id) + remote_node = strategy.remote_collection.get_by_node_id(remote_node_id) if remote_node_id else None + if remote_node and remote_node.data_id: + local_node.context["bind_data_id"] = remote_node.data_id + else: + local_node.context.pop("bind_data_id", None) + + for remote_node in strategy.remote_collection.filter(node_type=strategy.node_type): + local_node_id = remote_to_local.get(remote_node.node_id) + local_node = strategy.local_collection.get_by_node_id(local_node_id) if local_node_id else None + if local_node and local_node.data_id: + remote_node.context["bind_data_id"] = local_node.data_id + else: + remote_node.context.pop("bind_data_id", None) + + +async def phase_core_state(strategy, local_nodes: List["SyncNode"], remote_nodes: List["SyncNode"]): + remote_map = {n.node_id: n for n in remote_nodes} + processed_local_ids: Set[str] = set() + processed_remote_ids: Set[str] = set() + + for node in local_nodes: + remote_id = await strategy.binding_manager.get_remote_id(strategy.node_type, node.node_id) + + if remote_id: + remote_node = remote_map.get(remote_id) + + local_data = node.get_data() + remote_data = remote_node.get_data() if remote_node else None + local_valid = local_data is not None + peer_valid = remote_data is not None + local_decision = e10_bind_core( + strategy.ensure_runtime(), + node=node, + has_binding_record=True, + local_data=local_data, + peer_data=remote_data, + local_valid=local_valid, + peer_valid=peer_valid, + ) + local_reason = decision_note(local_decision) + if local_decision.to_state in {"S03", "S04"}: + logger.debug(f"[{strategy.node_type}] 核心绑定阻断: node={node.node_id}, reason={local_reason}") + else: + logger.debug(f"[{strategy.node_type}] 核心绑定完成: node={node.node_id}, reason={local_reason}") + processed_local_ids.add(node.node_id) + + if remote_node: + peer_decision = e10_bind_core( + strategy.ensure_runtime(), + node=remote_node, + has_binding_record=True, + local_data=remote_data, + peer_data=local_data, + local_valid=peer_valid, + peer_valid=local_valid, + ) + peer_reason = decision_note(peer_decision) + if peer_decision.to_state in {"S03", "S04"}: + logger.debug( + f"[{strategy.node_type}] 核心绑定阻断: node={remote_node.node_id}, reason={peer_reason}" + ) + else: + logger.debug(f"[{strategy.node_type}] 核心绑定完成: node={remote_node.node_id}, reason={peer_reason}") + processed_remote_ids.add(remote_node.node_id) + + for node in local_nodes: + if node.node_id not in processed_local_ids: + decision = e10_bind_core( + strategy.ensure_runtime(), + node=node, + has_binding_record=False, + ) + reason = decision_note(decision) + logger.debug(f"[{strategy.node_type}] 核心绑定完成: node={node.node_id}, reason={reason}") + + for r_node in remote_nodes: + if r_node.node_id not in processed_remote_ids: + decision = e10_bind_core( + strategy.ensure_runtime(), + node=r_node, + has_binding_record=False, + ) + reason = decision_note(decision) + logger.debug(f"[{strategy.node_type}] 核心绑定完成: node={r_node.node_id}, reason={reason}") + + +def check_dependency_satisfied( + dependency_nodes: List[Optional["SyncNode"]], + field_values: Optional[List[str]] = None, + *, + allow_empty_dependency_ref: bool = True, + allow_missing_dep_data_id: bool = True, +) -> bool: + if not dependency_nodes: + return True + + values = field_values or [] + for index, dep_node in enumerate(dependency_nodes): + dep_value = values[index] if index < len(values) else "" + dep_value_str = "" if dep_value is None else str(dep_value) + + if dep_node is None: + if allow_empty_dependency_ref and dep_value_str == "": + continue + return False + if dep_node.binding_status != BindingStatus.NORMAL: + return False + if not dep_node.data_id and not allow_missing_dep_data_id: + return False + return True + + +def collect_dependency_errors( + dependency_nodes: List[Optional["SyncNode"]], + field_names: List[str], + field_types: List[str], + field_values: List[str], + *, + allow_empty_dependency_ref: bool = True, + allow_missing_dep_data_id: bool = True, +) -> List[str]: + errors: List[str] = [] + for index, dep_node in enumerate(dependency_nodes): + field_name = field_names[index] + field_type = field_types[index] if index < len(field_types) else "unknown" + field_value = field_values[index] if index < len(field_values) else "" + field_value_str = "" if field_value is None else str(field_value) + + if dep_node is None: + if allow_empty_dependency_ref and field_value_str == "": + continue + errors.append(f"not_found|{field_name}|{field_type}|{field_value_str}") + continue + + if dep_node.binding_status != BindingStatus.NORMAL: + errors.append(f"bad_status|{field_name}|{dep_node.binding_status.value}") + continue + + if not dep_node.data_id and not allow_missing_dep_data_id: + status_info = f"status={dep_node.status.value}" if dep_node.status else "status=未知" + errors.append(f"no_data_id|{field_name}|{status_info}") + + return errors + + +async def phase_dependency_check(strategy, local_nodes: List["SyncNode"], remote_nodes: List["SyncNode"]): + await check_dependencies_for_nodes(strategy, local_nodes, strategy.local_collection) + await check_dependencies_for_nodes(strategy, remote_nodes, strategy.remote_collection) + + +async def check_dependencies_for_nodes(strategy, nodes: List["SyncNode"], collection: "DataCollection"): + for node in nodes: + if node.binding_status != BindingStatus.MISSING: + continue + + has_depend_fields = bool(strategy.config.depend_fields) + node_data = node.get_data() + data_present = bool(node_data) + + depend_ids = [] + depend_nodes = [] + depend_field_names: List[str] = [] + depend_field_types: List[str] = [] + depend_field_values: List[str] = [] + semantic_errors: List[str] = [] + + if has_depend_fields and data_present: + for field_name, dep_node_type in strategy.config.depend_fields.items(): + dep_data_id = node_data.get(field_name) + if not dep_data_id: + continue + + dep_node = collection.get_by_data_id(dep_node_type, dep_data_id) + if dep_node is None: + maybe_node_id_ref = collection.get_by_node_id(str(dep_data_id)) + if maybe_node_id_ref is not None and maybe_node_id_ref.node_type == dep_node_type: + semantic_errors.append(f"依赖字段 {field_name} 使用了 node_id={dep_data_id},期望 data_id 引用") + + depend_nodes.append(dep_node) + depend_field_names.append(field_name) + depend_field_types.append(dep_node_type) + depend_field_values.append(str(dep_data_id)) + + if dep_node: + depend_ids.append(dep_node.node_id) + + node.depend_ids = depend_ids + + allow_empty_dependency_ref = True + allow_missing_dep_data_id = True + + dep_satisfied = ( + check_dependency_satisfied( + depend_nodes, + depend_field_values, + allow_empty_dependency_ref=allow_empty_dependency_ref, + allow_missing_dep_data_id=allow_missing_dep_data_id, + ) + if has_depend_fields and data_present + else True + ) + dependency_errors = ( + collect_dependency_errors( + depend_nodes, + depend_field_names, + depend_field_types, + depend_field_values, + allow_empty_dependency_ref=allow_empty_dependency_ref, + allow_missing_dep_data_id=allow_missing_dep_data_id, + ) + if has_depend_fields and data_present + else [] + ) + + decision = e15_bind_dependency( + strategy.ensure_runtime(), + node=node, + data_present=data_present, + has_depend_fields=has_depend_fields, + dep_satisfied=dep_satisfied, + dep_errors=dependency_errors, + semantic_errors=semantic_errors, + ) + reason = decision_note(decision) + if decision.to_state in {"S03", "S04", "S05"}: + detail_reason = node.error or reason + logger.debug(f"[{strategy.node_type}] 依赖检查阻断: node={node.node_id}, reason={detail_reason}") + + +async def phase_auto_binding(strategy, local_nodes: List["SyncNode"], remote_nodes: List["SyncNode"]): + pending_auto_bind_updates: List[Dict[str, Any]] = [] + prebound_node_ids: Set[str] = set() + + local_s02_ids = { + n.node_id + for n in strategy.local_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S02"], + ) + } + remote_s02_ids = { + n.node_id + for n in strategy.remote_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S02"], + ) + } + + local_create_enabled = strategy.config.local_orphan_action == OrphanAction.CREATE_REMOTE + remote_create_enabled = strategy.config.remote_orphan_action == OrphanAction.CREATE_LOCAL + + for prebind_pair in strategy.config.pre_bind_data_id: + local_node = strategy.local_collection.get_by_data_id(strategy.node_type, prebind_pair.local_data_id) + remote_node = strategy.remote_collection.get_by_data_id(strategy.node_type, prebind_pair.remote_data_id) + + if local_node is None or remote_node is None: + continue + if local_node.node_id not in local_s02_ids or remote_node.node_id not in remote_s02_ids: + continue + if local_node.binding_status != BindingStatus.MISSING or remote_node.binding_status != BindingStatus.MISSING: + continue + + existing_remote = await strategy.binding_manager.get_remote_id(strategy.node_type, local_node.node_id) + existing_local = await strategy.binding_manager.get_local_id(strategy.node_type, remote_node.node_id) + if existing_remote or existing_local: + continue + + pending_auto_bind_updates.append( + { + "node": local_node, + "outcome": "ONE_TO_ONE", + "create_enabled": None, + "bind_remote_node_id": remote_node.node_id, + } + ) + pending_auto_bind_updates.append( + { + "node": remote_node, + "outcome": "ONE_TO_ONE", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + prebound_node_ids.add(local_node.node_id) + prebound_node_ids.add(remote_node.node_id) + + if not strategy.config.auto_bind or not strategy.config.auto_bind_fields: + for node in local_nodes: + if node.node_id in prebound_node_ids: + continue + if node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append({"node": node, "outcome": None, "create_enabled": None}) + for node in remote_nodes: + if node.node_id in prebound_node_ids: + continue + if node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append({"node": node, "outcome": None, "create_enabled": None}) + else: + id_resolver = IDResolver(strategy.local_collection, strategy.remote_collection, strategy.binding_manager) + + local_key_map: Dict[Tuple, List["SyncNode"]] = {} + remote_key_map: Dict[Tuple, List["SyncNode"]] = {} + + for node in local_nodes: + if node.node_id in prebound_node_ids: + continue + if node.node_id not in local_s02_ids: + continue + node_data = node.get_data() + if not node_data: + if node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": node, + "outcome": "DATA_MISSING", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + continue + + missing_fields = [fn for fn in strategy.config.auto_bind_fields if fn not in node_data] + if missing_fields: + if node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + {"node": node, "outcome": "KEY_MISSING", "create_enabled": None, "bind_remote_node_id": None} + ) + continue + + key_dict = extract_biz_key_dict(node_data, strategy.config.auto_bind_fields) + if not key_dict: + continue + + resolved_key_dict, resolve_error = await resolve_id_fields_in_key_dict( + key_dict, + id_resolver, + strategy._get_id_field_hints(), + ) + if not resolved_key_dict: + if node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": node, + "outcome": "KEY_ID_RESOLVE_FAIL", + "create_enabled": None, + "bind_remote_node_id": None, + "detail": resolve_error, + } + ) + continue + + key = dict_to_biz_key_tuple(resolved_key_dict, strategy.config.auto_bind_fields) + local_key_map.setdefault(key, []).append(node) + + for r_node in remote_nodes: + if r_node.node_id in prebound_node_ids: + continue + if r_node.node_id not in remote_s02_ids: + continue + r_node_data = r_node.get_data() + if not r_node_data: + if r_node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": r_node, + "outcome": "DATA_MISSING", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + continue + + missing_fields = [fn for fn in strategy.config.auto_bind_fields if fn not in r_node_data] + if missing_fields: + if r_node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": r_node, + "outcome": "KEY_MISSING", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + continue + + key_dict = extract_biz_key_dict(r_node_data, strategy.config.auto_bind_fields) + if key_dict: + key = dict_to_biz_key_tuple(key_dict, strategy.config.auto_bind_fields) + remote_key_map.setdefault(key, []).append(r_node) + + all_keys = set(local_key_map.keys()) | set(remote_key_map.keys()) + + for biz_key in all_keys: + local_candidates = local_key_map.get(biz_key, []) + remote_candidates = remote_key_map.get(biz_key, []) + + excluded_local = set() + excluded_remote = set() + + for l_node in local_candidates: + if l_node.binding_status != BindingStatus.NORMAL: + continue + + remote_id = await strategy.binding_manager.get_remote_id(strategy.node_type, l_node.node_id) + if not remote_id: + continue + + for r_node in remote_candidates: + if r_node.node_id == remote_id and r_node.binding_status == BindingStatus.NORMAL: + excluded_local.add(l_node.node_id) + excluded_remote.add(r_node.node_id) + break + + l_remain = [n for n in local_candidates if n.node_id not in excluded_local] + r_remain = [n for n in remote_candidates if n.node_id not in excluded_remote] + + if len(l_remain) == 1 and len(r_remain) == 1: + l_node = l_remain[0] + r_node = r_remain[0] + + if l_node.binding_status == BindingStatus.MISSING and r_node.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": l_node, + "outcome": "ONE_TO_ONE", + "create_enabled": None, + "bind_remote_node_id": r_node.node_id, + } + ) + pending_auto_bind_updates.append( + { + "node": r_node, + "outcome": "ONE_TO_ONE", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + else: + if len(l_remain) >= 1 and len(r_remain) == 0: + for n in l_remain: + if n.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": n, + "outcome": "ZERO", + "create_enabled": local_create_enabled, + "bind_remote_node_id": None, + } + ) + + if len(r_remain) >= 1 and len(l_remain) == 0: + for n in r_remain: + if n.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": n, + "outcome": "ZERO", + "create_enabled": remote_create_enabled, + "bind_remote_node_id": None, + } + ) + + if (len(l_remain) > 1 and len(r_remain) >= 1) or (len(l_remain) == 1 and len(r_remain) > 1): + for n in l_remain: + if n.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": n, + "outcome": "AMBIGUOUS", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + + if (len(r_remain) > 1 and len(l_remain) >= 1) or (len(r_remain) == 1 and len(l_remain) > 1): + for n in r_remain: + if n.binding_status == BindingStatus.MISSING: + pending_auto_bind_updates.append( + { + "node": n, + "outcome": "AMBIGUOUS", + "create_enabled": None, + "bind_remote_node_id": None, + } + ) + + for item in pending_auto_bind_updates: + node = item["node"] + auto_bind_outcome = item["outcome"] + create_enabled = item["create_enabled"] + bind_remote_node_id = item.get("bind_remote_node_id") + detail = item.get("detail") + auto_bind_enabled = auto_bind_outcome is not None + decision = e16_bind_auto( + strategy.ensure_runtime(), + node=node, + auto_bind_enabled=auto_bind_enabled, + auto_bind_outcome=auto_bind_outcome, + create_enabled=create_enabled, + id_resolve_detail=detail, + ) + reason = decision_note(decision) + if decision.to_state == "S01" and auto_bind_outcome == "ONE_TO_ONE": + if bind_remote_node_id: + await strategy.binding_manager.bind( + strategy.node_type, + node.node_id, + bind_remote_node_id, + ) + logger.debug(f"[{strategy.node_type}] 自动绑定成功: node={node.node_id}") + if decision.to_state in {"S04", "S05"}: + if detail: + reason = f"{reason} | detail={detail}" + node.error = reason + logger.debug(f"[{strategy.node_type}] 自动绑定阻断: node={node.node_id}, reason={reason}") diff --git a/sync_state_machine/sync_system/strategy_ops/compare_ops.py b/sync_state_machine/sync_system/strategy_ops/compare_ops.py new file mode 100644 index 0000000..dfdbe9e --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/compare_ops.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +import copy +import inspect +from typing import Any, Dict, Optional + + +async def build_data_id_normalization_map( + *, + node_type: str, + local_collection, + remote_collection, + binding_manager, +) -> Dict[str, str]: + mapping: Dict[str, str] = {} + records_or_awaitable = binding_manager.get_all_records(node_type) + records = await records_or_awaitable if inspect.isawaitable(records_or_awaitable) else records_or_awaitable + for record in records: + if not record.local_id or not record.remote_id: + continue + local_node = local_collection.get_by_node_id(record.local_id) + remote_node = remote_collection.get_by_node_id(record.remote_id) + if local_node is None or remote_node is None: + continue + local_data_id = local_node.data_id + remote_data_id = remote_node.data_id + if not local_data_id: + continue + mapping[local_data_id] = local_data_id + if remote_data_id: + mapping[remote_data_id] = local_data_id + return mapping + + +def is_id_like_field(field_name: Optional[str]) -> bool: + if not field_name: + return False + lowered = field_name.lower() + return lowered.endswith("_id") or lowered.endswith("_ids") + + +def normalize_compare_value(field_name: Optional[str], value: Any, data_id_map: Dict[str, str]) -> Any: + if isinstance(value, dict): + return { + key: normalize_compare_value(key, nested, data_id_map) + for key, nested in value.items() + } + if isinstance(value, list): + return [normalize_compare_value(field_name, item, data_id_map) for item in value] + + if value == "": + value = None + + if is_id_like_field(field_name) and isinstance(value, str): + return data_id_map.get(value, value) + return value + + +def normalized_data_for_compare( + data: Optional[Dict[str, Any]], + data_id_map: Optional[Dict[str, str]] = None, +) -> Dict[str, Any]: + payload = copy.deepcopy(data or {}) + payload.pop("id", None) + payload.pop("_id", None) + mapping = data_id_map or {} + return { + key: normalize_compare_value(key, value, mapping) + for key, value in payload.items() + } + + +def collect_payload_diffs( + source_payload: Dict[str, Any], + target_payload: Dict[str, Any], + *, + max_items: int = 6, +) -> Dict[str, Dict[str, Any]]: + out: Dict[str, Dict[str, Any]] = {} + keys = list(dict.fromkeys(list(source_payload.keys()) + list(target_payload.keys()))) + for key in keys: + source_value = source_payload.get(key) + target_value = target_payload.get(key) + if source_value == target_value: + continue + out[key] = {"source": source_value, "target": target_value} + if len(out) >= max_items: + break + return out diff --git a/sync_state_machine/sync_system/strategy_ops/create_ops.py b/sync_state_machine/sync_system/strategy_ops/create_ops.py new file mode 100644 index 0000000..24368a8 --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/create_ops.py @@ -0,0 +1,204 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, List + +from ...common.registry import DomainRegistry +from ...common.types import BindingStatus, SyncAction +from ...sync_system.config import OrphanAction +from ...sync_system.resolve_ids import IDResolver +from ...engine import ( + decision_note, + e20_create_prepare, +) + +if TYPE_CHECKING: + from ...common.binding import BindingManager + from ...common.collection import DataCollection + from ...common.sync_node import SyncNode + from ...engine import StateMachineRuntime + +logger = logging.getLogger(__name__) + + +async def add_create_action( + strategy, + *, + from_collection: "DataCollection", + to_collection: "DataCollection", + source_is_local: bool, +) -> List["SyncNode"]: + nodes_to_create = from_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S13"], + ) + + if not nodes_to_create: + return [] + + id_resolver = IDResolver(strategy.local_collection, strategy.remote_collection, strategy.binding_manager) + created_nodes = [] + + for src_node in nodes_to_create: + src_data = src_node.get_data() + if not src_data: + logger.debug( + f"[{strategy.node_type}] {'本地' if source_is_local else '远程'}节点 {src_node.node_id} " + "状态为 MISSING 但数据为空,跳过创建" + ) + continue + + resolved_data, _ = await id_resolver.resolve_and_validate( + data=src_data, + node_type=strategy.node_type, + depend_fields=dict(strategy.config.depend_fields) if strategy.config.depend_fields else {}, + to_remote=source_is_local, + ) + if resolved_data is None: + commit = e20_create_prepare( + strategy.ensure_runtime(), + node=src_node, + spawn_success=False, + ) + if commit.to_state is not None: + raise RuntimeError(f"[{strategy.node_type}] E20 fail expected no-transition, got: {commit.to_state}") + src_node.error = "spawn_failed: 创建前依赖ID解析失败" + logger.debug(f"[{strategy.node_type}] 创建副作用失败: node={src_node.node_id}, error=创建前依赖ID解析失败") + continue + + node_class = DomainRegistry.get_node_class(strategy.node_type) + new_node = None + try: + new_node = node_class( + node_id=to_collection.generate_node_id(), + data_id="", + data=resolved_data, + depend_ids=list(src_node.depend_ids or []), + binding_status=BindingStatus.NORMAL, + action=SyncAction.CREATE, + ) + await to_collection.add(new_node) + + if source_is_local: + local_id, remote_id = src_node.node_id, new_node.node_id + else: + local_id, remote_id = new_node.node_id, src_node.node_id + + await strategy.binding_manager.bind(strategy.node_type, local_id, remote_id) + created_nodes.append(new_node) + new_node.append_log(f"准备创建: 源节点 {src_node.node_id} 复制数据") + logger.debug(f"[{strategy.node_type}] 创建准备完成: source={src_node.node_id}, target={new_node.node_id}") + except Exception as exc: + if new_node is not None: + try: + await to_collection.delete(new_node.node_id) + except Exception: + pass + + commit = e20_create_prepare( + strategy.ensure_runtime(), + node=src_node, + spawn_success=False, + ) + if commit.to_state is not None: + raise RuntimeError(f"[{strategy.node_type}] E20 fail expected no-transition, got: {commit.to_state}") + + src_node.error = f"spawn_failed: {exc}" + logger.debug(f"[{strategy.node_type}] 创建副作用失败: node={src_node.node_id}, error={exc}") + continue + + return created_nodes + + +async def run_create(strategy) -> List["SyncNode"]: + created_nodes: List["SyncNode"] = [] + + if strategy.config.local_orphan_action == OrphanAction.CREATE_REMOTE: + local_nodes = await add_create_action( + strategy, + from_collection=strategy.local_collection, + to_collection=strategy.remote_collection, + source_is_local=True, + ) + created_nodes.extend(local_nodes) + logger.info(f"[{strategy.node_type}] Created {len(local_nodes)} nodes in remote collection (Push)") + elif strategy.config.local_orphan_action == OrphanAction.DELETE_LOCAL: + raise NotImplementedError( + f"[{strategy.node_type}] local_orphan_action=DELETE_LOCAL is not supported in run_create; " + "use delete stage (delete_ops) explicitly." + ) + + if strategy.config.remote_orphan_action == OrphanAction.CREATE_LOCAL: + remote_nodes = await add_create_action( + strategy, + from_collection=strategy.remote_collection, + to_collection=strategy.local_collection, + source_is_local=False, + ) + created_nodes.extend(remote_nodes) + logger.info(f"[{strategy.node_type}] Created {len(remote_nodes)} nodes in local collection (Pull)") + elif strategy.config.remote_orphan_action == OrphanAction.DELETE_REMOTE: + raise NotImplementedError( + f"[{strategy.node_type}] remote_orphan_action=DELETE_REMOTE is not supported in run_create; " + "use delete stage (delete_ops) explicitly." + ) + + return created_nodes + + +async def finalize_peer_creating_sources( + *, + node_type: str, + local_collection: "DataCollection", + remote_collection: "DataCollection", + binding_manager: "BindingManager", + runtime: "StateMachineRuntime", +) -> tuple[int, int]: + finalized_success = 0 + finalized_failed = 0 + + async def _handle_target_node(*, target_node: "SyncNode", target_is_remote: bool) -> None: + nonlocal finalized_success, finalized_failed + + if target_is_remote: + local_id = await binding_manager.get_local_id(node_type, target_node.node_id) + if not local_id: + return + source_node = local_collection.get(local_id) + else: + remote_id = await binding_manager.get_remote_id(node_type, target_node.node_id) + if not remote_id: + return + source_node = remote_collection.get(remote_id) + + if source_node is None: + return + if source_node.binding_status != BindingStatus.PEER_CREATING: + return + + if target_node.status.value == "SUCCESS": + commit = e20_create_prepare(runtime, node=source_node, spawn_success=True) + if commit.to_state != "S01": + raise RuntimeError( + f"[{node_type}] E20 success expected S01, got {commit.to_state} for source={source_node.node_id}" + ) + source_node.error = None + finalized_success += 1 + return + + if target_node.status.value == "FAILED": + source_node.error = ( + f"peer_create_failed: peer_node={target_node.node_id}, detail={target_node.error or 'unknown'}" + ) + source_node.append_log( + f"对侧创建失败,保持 PEER_CREATING: peer={target_node.node_id}, detail={target_node.error or 'unknown'}" + ) + finalized_failed += 1 + + for target_node in remote_collection.filter_by_state_ids(node_type=node_type, state_ids=["S11C", "S12C"]): + await _handle_target_node(target_node=target_node, target_is_remote=True) + + for target_node in local_collection.filter_by_state_ids(node_type=node_type, state_ids=["S11C", "S12C"]): + await _handle_target_node(target_node=target_node, target_is_remote=False) + + return finalized_success, finalized_failed diff --git a/sync_state_machine/sync_system/strategy_ops/delete_ops.py b/sync_state_machine/sync_system/strategy_ops/delete_ops.py new file mode 100644 index 0000000..f489cab --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/delete_ops.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, List + +if TYPE_CHECKING: + from ...common.sync_node import SyncNode + + +async def run_delete(strategy) -> List["SyncNode"]: + raise NotImplementedError(f"[{strategy.node_type}] delete path is not implemented yet") diff --git a/sync_state_machine/sync_system/strategy_ops/post_check_ops.py b/sync_state_machine/sync_system/strategy_ops/post_check_ops.py new file mode 100644 index 0000000..1353c06 --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/post_check_ops.py @@ -0,0 +1,159 @@ +from __future__ import annotations + +from typing import Any, Dict, List + +from ...sync_system.resolve_ids import IDResolver +from .compare_ops import ( + build_data_id_normalization_map, + normalized_data_for_compare, + collect_payload_diffs, +) + + +def _strip_list_item_fields(payload: Dict, ignore_map: Dict[str, List[str]]) -> Dict: + """从 payload 中列表型字段的每个元素里,剔除指定子键。 + + 例如 ignore_map={"plan_node": ["is_audit"]} 会把 payload["plan_node"][*]["is_audit"] 全部去掉。 + payload 本身不会被修改(浅拷贝)。 + """ + if not ignore_map: + return payload + result = dict(payload) + for field_name, sub_keys in ignore_map.items(): + if field_name not in result: + continue + items = result[field_name] + if not isinstance(items, list): + continue + stripped = [] + for item in items: + if isinstance(item, dict): + item = {k: v for k, v in item.items() if k not in sub_keys} + stripped.append(item) + result[field_name] = stripped + return result + + +def _compact_repr(value: Any, *, max_len: int = 80) -> str: + text = repr(value) + if len(text) <= max_len: + return text + return text[: max_len - 3] + "..." + + +def _append_post_check_error(node, message: str) -> None: + if not message: + return + if node.error: + if message not in node.error: + node.error = f"{node.error} | {message}" + return + node.error = message + + +async def evaluate_consistency_for_node_type( + *, + node_type: str, + local_collection, + remote_collection, + binding_manager, + logger, + depend_fields: Dict[str, str] | None = None, + compare_to_remote: bool = True, + ignore_list_item_fields: Dict[str, List[str]] | None = None, + post_check_fields: List[str] | None = None, +) -> Dict[str, Any]: + records = await binding_manager.get_all_records(node_type) + mismatches: List[str] = [] + checked_pairs = 0 + depend_fields = dict(depend_fields or {}) + id_resolver = IDResolver(local_collection, remote_collection, binding_manager) + data_id_map = await build_data_id_normalization_map( + node_type=node_type, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + ) + + for record in records: + local_id = record.local_id + remote_id = record.remote_id + if not local_id or not remote_id: + continue + + local_node = local_collection.get_by_node_id(local_id) + remote_node = remote_collection.get_by_node_id(remote_id) + checked_pairs += 1 + + if local_node is None or remote_node is None: + mismatches.append( + f"pair_missing(local_node={bool(local_node)}, remote_node={bool(remote_node)}, local_id={local_id}, remote_id={remote_id})" + ) + continue + + local_data = local_node.get_data() or {} + remote_data = remote_node.get_data() or {} + + # 与 create/update 保持同一依赖ID解析函数:IDResolver.resolve_and_validate。 + # compare_to_remote=True -> local(data) 先转 remote 口径后比较 + # compare_to_remote=False -> remote(data) 先转 local 口径后比较 + if depend_fields: + if compare_to_remote: + resolved_local, _ = await id_resolver.resolve_and_validate( + data=local_data, + node_type=node_type, + depend_fields=depend_fields, + to_remote=True, + ) + if resolved_local is not None: + local_data = resolved_local + else: + resolved_remote, _ = await id_resolver.resolve_and_validate( + data=remote_data, + node_type=node_type, + depend_fields=depend_fields, + to_remote=False, + ) + if resolved_remote is not None: + remote_data = resolved_remote + + local_payload = normalized_data_for_compare(local_data, data_id_map) + remote_payload = normalized_data_for_compare(remote_data, data_id_map) + if post_check_fields: + local_payload = {k: v for k, v in local_payload.items() if k in post_check_fields} + remote_payload = {k: v for k, v in remote_payload.items() if k in post_check_fields} + if ignore_list_item_fields: + local_payload = _strip_list_item_fields(local_payload, ignore_list_item_fields) + remote_payload = _strip_list_item_fields(remote_payload, ignore_list_item_fields) + if local_payload != remote_payload: + diff_map = collect_payload_diffs(local_payload, remote_payload) + diff_parts = [] + for field_name, values in diff_map.items(): + local_text = _compact_repr(values.get("source")) + remote_text = _compact_repr(values.get("target")) + diff_parts.append(f"{field_name}{{local:{local_text},remote:{remote_text}}}") + detail = "; ".join(diff_parts) if diff_parts else "payload differs" + + mismatch_text = f"pair_diff(local_id={local_id}, remote_id={remote_id}, {detail})" + mismatches.append(mismatch_text) + _append_post_check_error(local_node, f"post_check diff: {detail}") + _append_post_check_error(remote_node, f"post_check diff: {detail}") + + result = { + "ok": len(mismatches) == 0, + "checked_pairs": checked_pairs, + "mismatch_count": len(mismatches), + "samples": mismatches[:10], + } + + if result["ok"]: + logger.info(f"✅ Consistency check passed: node_type={node_type}, checked_pairs={checked_pairs}") + else: + logger.error( + f"❌ Consistency check failed: node_type={node_type}, checked_pairs={checked_pairs}, mismatches={len(mismatches)}" + ) + logger.error(" ↳ consistent语义: 比较绑定对(local_node.data vs remote_node.data),非 original_data") + for item in result["samples"]: + logger.error(f" - {item}") + + return result diff --git a/sync_state_machine/sync_system/strategy_ops/reset_ops.py b/sync_state_machine/sync_system/strategy_ops/reset_ops.py new file mode 100644 index 0000000..5762f59 --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/reset_ops.py @@ -0,0 +1,131 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any, Dict, List, Optional + +from ...common.types import BindingStatus, SyncAction, SyncStatus +from ...engine import e01_bootstrap + +if TYPE_CHECKING: + from ...common.binding import BindingManager + from ...common.collection import DataCollection + from ...engine.dispatcher import StateMachineRuntime + +logger = logging.getLogger(__name__) + + +def get_phase1_reset_defaults() -> Dict[str, Any]: + return { + "binding_status": BindingStatus.UNCHECKED, + "error": None, + } + + +async def _resolve_local_id_for_unbind( + *, + node_type: str, + any_side_node_id: str, + binding_manager: "BindingManager", +) -> Optional[str]: + remote_id = await binding_manager.get_remote_id(node_type, any_side_node_id) + if remote_id: + return any_side_node_id + local_id = await binding_manager.get_local_id(node_type, any_side_node_id) + if local_id: + return local_id + return None + + +def _is_create_zombie(node) -> bool: + if node.action != SyncAction.CREATE: + return False + if node.status == SyncStatus.FAILED: + return True + return not bool(node.data_id) + + +async def _cleanup_one_side( + *, + node_type: str, + collection: "DataCollection", + label: str, + cleaned_ids: List[str], + binding_manager: "BindingManager", + runtime: "StateMachineRuntime", +) -> None: + nodes = collection.filter(node_type=node_type) + for node in nodes: + if collection.is_bootstrap_blocked(node): + logger.debug( + f"[{node_type}] Skip bootstrap-blocked node during E01 cleanup: node_id={node.node_id}, error={node.error}" + ) + continue + + decision = e01_bootstrap(runtime, node=node, is_create_zombie=_is_create_zombie(node)) + if decision.to_state != "S15": + continue + + local_id_for_unbind = await _resolve_local_id_for_unbind( + node_type=node_type, + any_side_node_id=node.node_id, + binding_manager=binding_manager, + ) + + if local_id_for_unbind: + try: + await binding_manager.unbind(node_type, local_id_for_unbind) + bind_note = f"unbound(local_id={local_id_for_unbind})" + except Exception as exc: + bind_note = f"unbind_failed(local_id={local_id_for_unbind}, err={exc})" + else: + bind_note = "no_binding" + + reason = "status=FAILED" if node.status == SyncStatus.FAILED else "data_id empty" + logger.info( + f"[{node_type}] Cleaning up CREATE zombie ({label}): " + f"node_id={node.node_id}, reason={reason}, {bind_note}" + ) + + await collection.delete(node.node_id) + cleaned_ids.append(node.node_id) + + +async def run_phase2_cleanup( + *, + node_types: List[str], + local_collection: "DataCollection", + remote_collection: "DataCollection", + binding_manager: "BindingManager", + runtime: "StateMachineRuntime", +) -> int: + total_cleaned = 0 + + for node_type in node_types: + cleaned_local: List[str] = [] + cleaned_remote: List[str] = [] + await _cleanup_one_side( + node_type=node_type, + collection=local_collection, + label="local", + cleaned_ids=cleaned_local, + binding_manager=binding_manager, + runtime=runtime, + ) + await _cleanup_one_side( + node_type=node_type, + collection=remote_collection, + label="remote", + cleaned_ids=cleaned_remote, + binding_manager=binding_manager, + runtime=runtime, + ) + + cleaned_count = len(cleaned_local) + len(cleaned_remote) + total_cleaned += cleaned_count + if cleaned_count > 0: + logger.warning( + f"[{node_type}] Cleaned up CREATE-failed zombies: " + f"local_deleted={len(cleaned_local)}, remote_deleted={len(cleaned_remote)}" + ) + + return total_cleaned diff --git a/sync_state_machine/sync_system/strategy_ops/update_ops.py b/sync_state_machine/sync_system/strategy_ops/update_ops.py new file mode 100644 index 0000000..a2b156c --- /dev/null +++ b/sync_state_machine/sync_system/strategy_ops/update_ops.py @@ -0,0 +1,302 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Callable, List, Optional + +from ...common.types import SyncAction +from ...sync_system.config import UpdateDirection +from ...sync_system.resolve_ids import IDResolver +from ...engine import decision_note, e30_update_prepare +from .compare_ops import ( + build_data_id_normalization_map, + normalized_data_for_compare, + collect_payload_diffs, +) + +if TYPE_CHECKING: + from ...common.collection import DataCollection + from ...common.sync_node import SyncNode + +logger = logging.getLogger(__name__) + + +def _safe_repr(value, *, max_len: int = 120) -> str: + text = repr(value) + if len(text) <= max_len: + return text + return text[: max_len - 3] + "..." + + +def _collect_diff_descriptions(source_data, target_data, *, max_items: int = 8) -> List[str]: + if source_data is None or target_data is None: + return [] + + descriptions: List[str] = [] + for key, source_value in source_data.items(): + if key in {"id", "_id"}: + continue + target_value = target_data.get(key) + if source_value == target_value: + continue + descriptions.append(f"{key}: {_safe_repr(target_value)} -> {_safe_repr(source_value)}") + if len(descriptions) >= max_items: + break + + return descriptions + + +def default_needs_update( + strategy, + source_node, + target_node, + resolved_data=None, + data_id_map=None, +) -> bool: + if resolved_data is None: + raise ValueError(f"[{strategy.node_type}] resolved_data is required for differential sync.") + + source_data = resolved_data + target_data = target_node.get_data() + if source_data is None or target_data is None: + return False + + normalized_source = normalized_data_for_compare(source_data, data_id_map) + normalized_target = normalized_data_for_compare(target_data, data_id_map) + diff_map = collect_payload_diffs(normalized_source, normalized_target, max_items=8) + is_different = bool(diff_map) + + if is_different and diff_map: + previews = [f"{key}: {values.get('source')} != {values.get('target')}" for key, values in list(diff_map.items())[:5]] + logger.debug(f"[{strategy.node_type}] Node diff detected: {', '.join(previews)}") + + return is_different + + +def resolve_needs_update_check(strategy) -> Callable: + return strategy._needs_update + + +def _collect_diff_descriptions(source_data, target_data, *, data_id_map, max_items: int = 8) -> List[str]: + if source_data is None or target_data is None: + return [] + + normalized_source = normalized_data_for_compare(source_data, data_id_map) + normalized_target = normalized_data_for_compare(target_data, data_id_map) + diff_map = collect_payload_diffs(normalized_source, normalized_target, max_items=max_items) + + descriptions: List[str] = [] + for key, values in diff_map.items(): + target_value = values.get("target") + source_value = values.get("source") + descriptions.append(f"{key}: {_safe_repr(target_value)} -> {_safe_repr(source_value)}") + return descriptions + + +async def add_update_action( + strategy, + *, + from_collection: "DataCollection", + to_collection: "DataCollection", + needs_update_check, + source_is_local: bool, + data_id_map: Optional[dict] = None, + node_filter: Optional[Callable[["SyncNode"], bool]] = None, +) -> List["SyncNode"]: + nodes_to_update = from_collection.filter_by_state_ids( + node_type=strategy.node_type, + state_ids=["S01"], + ) + if not nodes_to_update: + return [] + + if node_filter is not None: + nodes_to_update = [n for n in nodes_to_update if node_filter(n)] + if not nodes_to_update: + return [] + + id_resolver = IDResolver(strategy.local_collection, strategy.remote_collection, strategy.binding_manager) + updated_nodes: List["SyncNode"] = [] + total_nodes = len(nodes_to_update) + + for idx, src_node in enumerate(nodes_to_update, start=1): + if idx % 100 == 0 or idx == total_nodes: + logger.debug(f"[{strategy.node_type}] 更新检查 {idx}/{total_nodes}") + + src_data = src_node.get_data() + if not src_data: + continue + + if source_is_local: + target_node_id = await strategy.binding_manager.get_remote_id(strategy.node_type, src_node.node_id) + else: + target_node_id = await strategy.binding_manager.get_local_id(strategy.node_type, src_node.node_id) + if not target_node_id: + continue + + target_node = to_collection.get_by_node_id(target_node_id) + if not target_node or target_node.action == SyncAction.CREATE: + continue + + target_has_data_id = bool(target_node.data_id) + data = None + resolve_error = None + if target_has_data_id: + data, resolve_error = await id_resolver.resolve_and_validate( + data=src_data, + node_type=strategy.node_type, + depend_fields=dict(strategy.config.depend_fields) if strategy.config.depend_fields else {}, + to_remote=source_is_local, + ) + + update_id_resolve_ok = data is not None + has_diff = False + diff_descriptions: List[str] = [] + if update_id_resolve_ok: + try: + should_update = needs_update_check(src_node, target_node, resolved_data=data, data_id_map=data_id_map) + except TypeError: + try: + should_update = needs_update_check(src_node, target_node) + except TypeError: + should_update = needs_update_check(src_node) + has_diff = bool(should_update) + if has_diff: + diff_descriptions = _collect_diff_descriptions(data, target_node.get_data(), data_id_map=data_id_map or {}) + + if target_has_data_id and update_id_resolve_ok and not has_diff: + continue + + decision = e30_update_prepare( + strategy.ensure_runtime(), + source_node=src_node, + target_node=target_node, + update_enabled=True, + target_has_data_id=target_has_data_id, + update_id_resolve_ok=update_id_resolve_ok, + has_diff=has_diff, + id_resolve_detail=resolve_error, + ) + reason = decision_note(decision) + if decision.to_state == "S08": + target_node.error = reason + logger.debug(f"[{strategy.node_type}] 更新准备阻断: target={target_node.node_id}, reason={reason}") + continue + if decision.to_state != "S07": + raise RuntimeError(f"[{strategy.node_type}] unexpected update_prepare state: {decision.to_state}") + if data is None: + raise RuntimeError(f"[{strategy.node_type}] E30(S07) requires resolved update data") + + target_node.set_data(data) + target_node.error = None + diff_text = "; ".join(diff_descriptions) if diff_descriptions else "(未生成差异明细)" + target_node.append_log(f"检测到差异: 从节点 {src_node.node_id} 更新数据 | fields={diff_text}") + logger.info(f"[{strategy.node_type}] 更新差异字段: target={target_node.node_id}, {diff_text}") + logger.debug(f"[{strategy.node_type}] 更新准备完成: target={target_node.node_id}, reason={reason}") + updated_nodes.append(target_node) + + return updated_nodes + + +async def run_update(strategy) -> List["SyncNode"]: + updated_nodes: List["SyncNode"] = [] + needs_update_check = resolve_needs_update_check(strategy) + data_id_map = await build_data_id_normalization_map( + node_type=strategy.node_type, + local_collection=strategy.local_collection, + remote_collection=strategy.remote_collection, + binding_manager=strategy.binding_manager, + ) + + field_key = strategy.config.field_direction_key + overrides: dict = strategy.config.field_direction_overrides + + if field_key and overrides: + # 按方向归组:对每种出现的方向各调一次 add_update_action,传入过滤器。 + # 覆盖表中未命中的节点沿用 update_direction 作为默认方向。 + default_direction = strategy.config.update_direction + active_directions = set(overrides.values()) | {default_direction} + + for direction in (UpdateDirection.PUSH, UpdateDirection.PULL): + if direction not in active_directions: + continue + + captured_direction = direction # 避免闭包捕获循环变量 + captured_overrides = overrides + captured_default = default_direction + captured_field_key = field_key + + def make_filter(d=captured_direction, fk=captured_field_key, ov=captured_overrides, dflt=captured_default): + def _filter(node: "SyncNode") -> bool: + node_data = node.get_data() or {} + key_val = node_data.get(fk) + effective = ov.get(key_val, dflt) + return effective == d + return _filter + + node_filter = make_filter() + + if direction == UpdateDirection.PUSH: + nodes = await add_update_action( + strategy, + from_collection=strategy.local_collection, + to_collection=strategy.remote_collection, + needs_update_check=needs_update_check, + source_is_local=True, + data_id_map=data_id_map, + node_filter=node_filter, + ) + updated_nodes.extend(nodes) + logger.info( + f"[{strategy.node_type}] Updated {len(nodes)} nodes in remote collection" + f" (Push, field_direction_key={field_key})" + ) + + elif direction == UpdateDirection.PULL: + nodes = await add_update_action( + strategy, + from_collection=strategy.remote_collection, + to_collection=strategy.local_collection, + needs_update_check=needs_update_check, + source_is_local=False, + data_id_map=data_id_map, + node_filter=node_filter, + ) + updated_nodes.extend(nodes) + logger.info( + f"[{strategy.node_type}] Updated {len(nodes)} nodes in local collection" + f" (Pull, field_direction_key={field_key})" + ) + + return updated_nodes + + # ── 无字段级覆盖:原有逻辑不变 ── + if strategy.config.update_direction == UpdateDirection.PUSH: + nodes = await add_update_action( + strategy, + from_collection=strategy.local_collection, + to_collection=strategy.remote_collection, + needs_update_check=needs_update_check, + source_is_local=True, + data_id_map=data_id_map, + ) + updated_nodes.extend(nodes) + logger.info(f"[{strategy.node_type}] Updated {len(nodes)} nodes in remote collection (Push)") + + elif strategy.config.update_direction == UpdateDirection.PULL: + nodes = await add_update_action( + strategy, + from_collection=strategy.remote_collection, + to_collection=strategy.local_collection, + needs_update_check=needs_update_check, + source_is_local=False, + data_id_map=data_id_map, + ) + updated_nodes.extend(nodes) + logger.info(f"[{strategy.node_type}] Updated {len(nodes)} nodes in local collection (Pull)") + + elif strategy.config.update_direction == UpdateDirection.BIDIRECTIONAL: + raise NotImplementedError( + f"[{strategy.node_type}] update_direction=BIDIRECTIONAL requires custom implementation" + ) + + return updated_nodes diff --git a/sync_state_machine/sync_system/utils.py b/sync_state_machine/sync_system/utils.py new file mode 100644 index 0000000..2ac4088 --- /dev/null +++ b/sync_state_machine/sync_system/utils.py @@ -0,0 +1,128 @@ +""" +同步系统工具函数模块 + +提供业务键提取等通用功能。 +""" +from typing import List, Tuple, Optional, Any, Dict +import logging + +logger = logging.getLogger(__name__) + + +def is_id_field(field_name: str) -> bool: + """ + 判断字段是否为ID字段。 + + ID字段的判断规则: + - 以 _id 结尾(如 project_id, company_id) + - 字段名为 id + + Args: + field_name: 字段名 + + Returns: + 如果是ID字段返回True + """ + return field_name.endswith("_id") or field_name == "id" + + +def extract_biz_key_dict( + data: Any, + field_names: List[str] +) -> Optional[Dict[str, str]]: + """ + 从数据对象提取业务键字段,返回字典格式。 + + Args: + data: 数据对象(dict或pydantic model) + field_names: 业务键字段名列表 + + Returns: + 业务键字段字典,如果任何必需字段缺失则返回None + """ + if not field_names or not data: + return None + + # 转换为字典 + if isinstance(data, dict): + d = data + else: + d = data.model_dump() + + key_dict = {} + for field_name in field_names: + # 区分:字段不存在 vs 字段存在但值为None + if field_name not in d: + return None # 字段不存在,视为缺失 + value = d.get(field_name) + # 值为None时保留为空字符串,允许作为有效业务键值 + key_dict[field_name] = str(value) if value is not None else "" + + return key_dict if key_dict else None + + +def dict_to_biz_key_tuple( + key_dict: Dict[str, str], + field_names: List[str] +) -> Tuple: + """ + 将业务键字典转换为tuple(按field_names顺序)。 + + Args: + key_dict: 业务键字段字典 + field_names: 字段名顺序 + + Returns: + 业务键tuple + """ + return tuple(key_dict[fn] for fn in field_names) + + +async def resolve_id_fields_in_key_dict( + key_dict: Dict[str, str], + id_resolver, + node_type_hints: Dict[str, str] +) -> tuple[Optional[Dict[str, str]], Optional[str]]: + """ + 解析业务键字典中的ID字段,将本地ID转换为远程ID。 + + 只处理ID字段(以_id结尾或为id),其他字段保持不变。 + + 特殊处理: + - 如果 ID 字段值为空字符串 "",直接保留(空值也是有效的业务键值) + - 只有非空 ID 才需要解析 + + Args: + key_dict: 业务键字典 + id_resolver: ID解析器实例 + node_type_hints: 字段名到node_type的映射 + + Returns: + (resolved_dict, error_msg): 成功时返回 (解析后的字典, None),失败时返回 (None, 错误描述) + """ + resolved_dict = {} + + for field_name, value in key_dict.items(): + if is_id_field(field_name): + # 这是ID字段 + if value == "" or value is None: + # 空值直接保留,不尝试解析 + # 空值也是有效的业务键值,只要两边一致就能匹配 + resolved_dict[field_name] = value or "" + else: + # 非空ID需要解析 + node_type = node_type_hints.get(field_name) + remote_id = await id_resolver.resolve_id( + value, node_type_hint=node_type + ) + if remote_id is None: + # ID解析失败,返回详细错误信息 + node_type_info = f"({node_type})" if node_type else "(未知类型)" + error_msg = f"字段 {field_name}{node_type_info} 的 ID '{value}' 解析失败(依赖节点未绑定)" + return None, error_msg + resolved_dict[field_name] = remote_id + else: + # 非ID字段,直接使用原值 + resolved_dict[field_name] = value + + return resolved_dict, None diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..53479dd --- /dev/null +++ b/tests/README.md @@ -0,0 +1,29 @@ +# 测试说明 + +## 目录结构 +- `tests/unit/`:状态机运行时、策略辅助、工具链严格性、模块导入面等快速单元测试。 +- `tests/integration/`:copy pipeline、多节点 full pipeline、UI API 烟测、状态事件覆盖等集成测试。 +- `tests/fixtures/`、`tests/mocks/`:可复用测试夹具与 Mock 数据源。 + +## 运行方式 +- 全量:`pytest -q` +- 单元:`pytest tests/unit -q` +- 集成:`pytest tests/integration -q` +- 工具链专项:`pytest tests/integration/test_toolchain_config_and_graph.py -q` +- UI 专项:`pytest tests/integration/test_ui_api_smoke.py -q` + +## 设计原则 +- 不绕过 schema/状态机校验;配置错误必须显式失败。 +- 单元测试聚焦纯逻辑,集成测试覆盖流水线与边界行为。 +- 所有测试均从仓库根路径解析配置,避免目录迁移导致路径脆弱。 +- 保留高价值回归测试,移除仅重复路径或无断言价值的历史脚本型测试(脚本保留在 `scripts/`,不纳入 pytest)。 + +## 质量目标 +- 覆盖 `sync_state_machine` 主模块导入面,尽早发现模块级破坏。 +- 覆盖状态机配置校验与渲染工具链。 +- 覆盖 UI 基础 API 健康检查。 +- 覆盖核心业务链路(bind/create/update 与 full pipeline)。 + +## 大规模自动回归 +- 按轮迭代的大规模自动测试方法见 [docs/auto_test_spec/agent_auto_test_method.md](docs/auto_test_spec/agent_auto_test_method.md)。 +- 执行时优先采用“单 domain 复现 -> 修复/分类 -> 全量聚合回归 -> 记录总计变化”的节奏,避免一次携带过多上下文。 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..cb3cf4e --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests package for sync_state_machine.""" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..2659de5 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) diff --git a/tests/fixtures/auto_sync/auto_test_config.yaml b/tests/fixtures/auto_sync/auto_test_config.yaml new file mode 100644 index 0000000..4dd70af --- /dev/null +++ b/tests/fixtures/auto_sync/auto_test_config.yaml @@ -0,0 +1,69 @@ +project_root: ${PROJECT_ROOT} +backend: + root_dir: /Users/zyl/my_projects/GroupSideProjectManagementSystem + env: + COUCHDB_DBNAME: test_push_auto + COUCHDB_USER: admin + COUCHDB_PASSWORD: password123 + COUCHDB_URL: http://127.0.0.1 + COUCHDB_PORT: "5984" + start_command: + - /Users/zyl/my_projects/GroupSideProjectManagementSystem/.venv/bin/python + - run.py + restore_command: + - /Users/zyl/my_projects/GroupSideProjectManagementSystem/.venv/bin/python + - run.py + - restore-database + - -d + - test_push_auto + - -s + - ${PROJECT_ROOT}/working_local_datasource/filtered + ready_url: http://localhost:8000/docs + ready_timeout_seconds: 120 + ready_interval_seconds: 2 + log_file: ${PROJECT_ROOT}/test_results/auto_test/backend/backend.log + pid_file: ${PROJECT_ROOT}/test_results/auto_test/backend/backend.pid +couchdb: + enabled: true + base_url: http://localhost:5984 + database: test_push_auto + username: admin + password: password123 + recreate_after_delete: false +paths: + temp_data_dir: ${PROJECT_ROOT}/working_local_datasource/tmp_auto_test/current + persistence_db: ${PROJECT_ROOT}/test_results/sync_state_machine/auto_test_pipeline.db + pipeline_log_dir: ${PROJECT_ROOT}/test_results/auto_test/pipeline_logs + report_dir: ${PROJECT_ROOT}/test_results/auto_test/reports + common_dataset_dir: ${PROJECT_ROOT}/tests/fixtures/auto_sync/datasource/common_baseline +pipeline: + project_root: ${PROJECT_ROOT} + run_profile: ${PROJECT_ROOT}/run_profiles/jsonl_to_api.test.yaml + command: + - /Users/zyl/my_projects/ecm_sync_system/.venv/bin/python + - run.py + - --config_path + - run_profiles/jsonl_to_api.test.yaml +domains: + enabled: + - company + - supplier + - project + - contract + - contract_change + - construction_task + - construction_task_detail + - material + - material_detail + - contract_settlement + - contract_settlement_detail + - personnel + - personnel_detail + - project_detail_data + - preparation + - production + - lar + - lar_change + - units + script_dir: ${PROJECT_ROOT}/scripts/auto_test_domains + diff --git a/tests/fixtures/auto_sync/datasource/common_baseline/company_1.jsonl b/tests/fixtures/auto_sync/datasource/common_baseline/company_1.jsonl new file mode 100644 index 0000000..bac2890 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/common_baseline/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": null} diff --git a/tests/fixtures/auto_sync/datasource/common_baseline/supplier_1.jsonl b/tests/fixtures/auto_sync/datasource/common_baseline/supplier_1.jsonl new file mode 100644 index 0000000..aa50648 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/common_baseline/supplier_1.jsonl @@ -0,0 +1,28 @@ +{"_id": "0798431d-115a-4b1c-b95a-78470160fa9e", "_rev": "3-18cce2b2f9854c79aeb4329c31e6028c", "type": "supplier", "name": "沈阳中变电气有限责任公司", "short_name": "沈阳中变电气有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91210100564677033W", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "210000", "210100"]} +{"_id": "1098875c-e949-47b1-9f40-237eb507f890", "_rev": "3-0ef325ac17b9232224f5c9f924e2cf6f", "type": "supplier", "name": "中国水利水电第九工程局有限公司", "short_name": "中国水利水电第九工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91520000214428387H", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "1115a7f3-b2c1-4bfb-8c89-605250c402dd", "_rev": "3-6e0a5e272f35cd473d6cd82a1ad6cfa3", "type": "supplier", "name": "中国安能集团第三工程局有限公司", "short_name": "中国安能集团第三工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915101006331302278", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "_rev": "3-2857c4610fd9e9a9b8313dee83454969", "type": "supplier", "name": "中国葛洲坝集团三峡建设工程有限公司", "short_name": "中国葛洲坝集团三峡建设工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "420000", "city": "420500", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91420000615573462P", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "420000", "420500"]} +{"_id": "4be9e1da-9ebf-4a2a-b6bd-14a41ac31858", "_rev": "5-b54a288a89b9e55cee26d42b08bb69a0", "type": "supplier", "name": "中国水利水电第七工程局有限公司", "short_name": "中国水利水电第七工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000201827469M", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "357c7eaf-5a33-4999-be94-79c42bfbd955", "_rev": "3-35879fa40a8fbe379f03c7a4fa8696ad", "type": "supplier", "name": "广州擎天实业有限公司", "short_name": "广州擎天实业有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "440300", "city": "440100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91440101231240749H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "440000", "440100"]} +{"_id": "2ca09c22-68b4-4e43-b9fa-619dcda5f325", "_rev": "3-ac12e05cedcda85821240a9066aa91ef", "type": "supplier", "name": "江苏苏博特新材料股份有限公司", "short_name": "江苏苏博特新材料股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91320000768299302G", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "31b6b6d7-989b-4abe-a7e1-6d518f3a4020", "_rev": "3-bedf089583a4645867c7036dba8e7a9e", "type": "supplier", "name": "中国水利水电第十工程局有限公司", "short_name": "中国水利水电第十工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9151018120276341XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "34db820f-860c-4c6e-9326-5c7cb385bf50", "_rev": "3-e475374124da6df3a40f38043efb7237", "type": "supplier", "name": "特变电工中发上海高压开关有限公司", "short_name": "特变电工中发上海高压开关有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "310000", "city": "310000", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9131012078784664XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "310000", "310000"]} +{"_id": "4b069ce4-3687-4263-a1f2-4735c22c3f8e", "_rev": "3-9cccdfa9f992ae4f0ec07068c479487c", "type": "supplier", "name": "四川二滩国际工程咨询有限责任公司", "short_name": "四川二滩国际工程咨询有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510115201873799G", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "2e465bd8-b240-4046-bf00-187d22823f7b", "_rev": "3-2629f9e1646b7e398fd8bb41a7fc47a2", "type": "supplier", "name": "哈尔滨电机厂有限责任公司", "short_name": "哈尔滨电机厂有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "230000", "city": "230100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "912301991270479655", "created_at": "2025-09-26 17:00:05", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "230000", "230100"]} +{"_id": "3ab47229-6da8-4efb-aa44-b96866a2ce13", "_rev": "3-998c447f59be1475e690d1416384fb64", "type": "supplier", "name": "四川蜀府贸易有限公司", "short_name": "四川蜀府贸易有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100005632853965", "created_at": "2025-09-26 17:00:10", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "48a5f1a7-5d5e-41cf-8676-042f1d5316f1", "_rev": "2-d43e58afff0c5317401a22d075866c56", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:32:41", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "czyy", "company_type": "other", "name": "常州液压成套设备厂有限公司", "short_name": "常州液压", "parent_id": null, "path": [], "path_name": [], "province": "320000", "city": "320400", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91320412250851852D", "country": "100000", "region_path": ["100000", "320000", "320400"]} +{"_id": "67fa779d-2ce9-468f-b94f-a3d29f1f22c9", "_rev": "3-2c6e66d316216cfc460662bf4a40e612", "type": "supplier", "name": "杭州华新机电工程有限公司", "short_name": "杭州华新机电工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "330000", "city": "330100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913301087227885306", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "330000", "330100"]} +{"_id": "594a09af-8944-476d-b098-7aebe96ad4e8", "_rev": "3-fc6edc3d3384c95def0be02ee734a5b2", "type": "supplier", "name": "云南水电十四局东华建筑工程有限公司", "short_name": "云南水电十四局东华建筑工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530000713408946K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "6db1ed5b-f52a-4142-867c-d8b2731ead71", "_rev": "3-f769878777781eb98071dddc7c7c4968", "type": "supplier", "name": "中国水利水电第十四工程局有限公司", "short_name": "中国水利水电第十四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530100216579074C", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "538e01cd-85cb-42b3-b313-16977f7a5224", "_rev": "3-d9acfbf91ba6d83dc33c94b84127f2e3", "type": "supplier", "name": "中国水利水电第五工程局有限公司", "short_name": "中国水利水电第五工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000205804264E", "created_at": "2025-09-26 17:00:12", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "97be34dc-0a17-4ce5-baea-0f3ceee61103", "_rev": "4-4fbf33c81fff4a4a93ba8da7f99b786d", "type": "supplier", "name": "国电南京自动化股份有限公司", "short_name": "国电南京自动化股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913201007162522468", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "77316fb4-6167-432b-94e5-89c3d8a6b900", "_rev": "3-2112fbd151033d97a2c90123a02c70a3", "type": "supplier", "name": "中国水利水电夹江水工机械有限公司", "short_name": "中国水利水电夹江水工机械有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511126207500117U", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "936c6316-8d87-4681-a3b5-b90ed4804a06", "_rev": "3-a9a9b85f9cdd45dc3646e66c9a1a41aa", "type": "supplier", "name": "中国电建集团成都勘测设计研究院有限公司", "short_name": "中国电建集团成都勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100004507513971", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "98892419-6a71-4d7e-a0ac-ad5a0a15f1d6", "_rev": "3-f5bb2f9abe284037054df3b323f2482f", "type": "supplier", "name": "中国电建集团贵阳勘测设计研究院有限公司", "short_name": "中国电建集团贵阳勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9152000070966703X2", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "9c80aace-ba73-4550-8fef-3080b51027d9", "_rev": "3-0dddd7f05fccce78e17fdf4ae9975f0a", "type": "supplier", "name": "中国水利水电第四工程局有限公司", "short_name": "中国水利水电第四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "630000", "city": "630100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9163000022658124XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "630000", "630100"]} +{"_id": "930dfaf9-708e-4ec0-95f4-521b10bf1c00", "_rev": "2-5c464399a48505836497072601a60159", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:33:18", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "hnwz", "company_type": "other", "name": "某公司海南物资有限公司", "short_name": "海南物资", "parent_id": null, "path": [], "path_name": [], "province": "460000", "city": "460100", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91469007MA5TW", "country": "100000", "region_path": ["100000", "460000", "460100"]} +{"_id": "ab5ab605-f27a-461b-9a88-73d1eafde5ed", "_rev": "3-a463c974fbcb84a524d1ee6ed72e64ec", "type": "supplier", "name": "东方电气集团东方电机有限公司", "short_name": "东方电气集团东方电机有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510600", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510600671415848H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "510600"]} +{"_id": "b4656ed6-5329-4673-93c8-d11e15d6ece5", "_rev": "3-0a11b989849efb63378b8a8fddb989e4", "type": "supplier", "name": "中国水利水电建设工程咨询西北有限公司", "short_name": "中国水利水电建设工程咨询西北有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610000220530812K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "e0ceec90-0ad7-417f-a669-fd4f5db07eff", "_rev": "4-71df8660a58c5628bb55f2d39a9264fb", "type": "supplier", "name": "西安西电变压器有限责任公司", "short_name": "西安西电变压器有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610104220601553B", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "cd9e9224-a08f-4bed-81a6-b289b74506e8", "_rev": "3-572570411c03424fb3370e74b2f7f496", "type": "supplier", "name": "乐山一拉得电网自动化有限公司", "short_name": "乐山一拉得电网自动化有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511100MA6281NC0N", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "_rev": "3-269fcaf6630593cb44ee3e6a1ffd4ef9", "type": "supplier", "name": "中国水利水电第六工程局有限公司", "short_name": "中国水利水电第六工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9121011211756300XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "210000", "210100"]} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/company_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/construction_task_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/construction_task_1.jsonl new file mode 100644 index 0000000..1803504 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/construction_task_1.jsonl @@ -0,0 +1 @@ +{"_id": "0200848d-d9e7-4372-a6f6-f768bac13955", "_rev": "1-fff3d992410dcecb499f14c0053ae256", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "主变压器安装(台)", "construction_section": "JD", "status": null, "task_type": "zbazt", "plan_start_date": null, "plan_complete_date": null, "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 0.0, "plan_node": [], "statistic_date": null, "sort": 0, "is_crucial": false, "delay_days": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..6d90324 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/contract_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "_rev": "1-045893b99fe3893ae31279cd337c26a8", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/project_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_1_create/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/company_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/construction_task_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/construction_task_1.jsonl new file mode 100644 index 0000000..00ee4b9 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/construction_task_1.jsonl @@ -0,0 +1 @@ +{"_id": "0200848d-d9e7-4372-a6f6-f768bac13955", "_rev": "2-auto-test-round2", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "主变压器安装(台)", "construction_section": "JD", "status": null, "task_type": "zbazt", "plan_start_date": "2026-01-01", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 10.0, "plan_node": [{"date": "2026-03-01", "quantity": 3.0, "is_audit": false}, {"date": "2026-08-01", "quantity": 7.0, "is_audit": false}], "statistic_date": null, "sort": 0, "is_crucial": true, "delay_days": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..6d90324 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/contract_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "_rev": "1-045893b99fe3893ae31279cd337c26a8", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "施工总承包合同(不含设计、采购)", "short_name": "", "code": "CG", "contract_type": "service", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task/round_2_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_1.jsonl new file mode 100644 index 0000000..00ee4b9 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_1.jsonl @@ -0,0 +1 @@ +{"_id": "0200848d-d9e7-4372-a6f6-f768bac13955", "_rev": "2-auto-test-round2", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "主变压器安装(台)", "construction_section": "JD", "status": null, "task_type": "zbazt", "plan_start_date": "2026-01-01", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 10.0, "plan_node": [{"date": "2026-03-01", "quantity": 3.0, "is_audit": false}, {"date": "2026-08-01", "quantity": 7.0, "is_audit": false}], "statistic_date": null, "sort": 0, "is_crucial": true, "delay_days": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_detail_1.jsonl new file mode 100644 index 0000000..075cd47 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/construction_task_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "db98ec2d-1c6b-45f4-a176-7b560a8a89fe", "_rev": "2-c3fce218d5460d66a7c8335435342af2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:21:22", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 11:44:50", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 11:44:50", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 297330.0, "date": "2025-11-08", "status": null, "change_count": 0, "remark": null, "is_complete": null} +{"_id": "678ef40c-affa-4576-a7e2-f440d835f8a8", "_rev": "2-eefd975eeb318f72bc92c608f496ada9", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:26:04", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 20:54:33", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-12-18 20:54:33", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 372522.0, "date": "2025-12-18", "status": null, "change_count": 0, "remark": null, "is_complete": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..ce6eba1 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01"} +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_settlement_1.jsonl new file mode 100644 index 0000000..717f5e4 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_1_create/contract_settlement_1.jsonl @@ -0,0 +1 @@ +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_1.jsonl new file mode 100644 index 0000000..00ee4b9 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_1.jsonl @@ -0,0 +1 @@ +{"_id": "0200848d-d9e7-4372-a6f6-f768bac13955", "_rev": "2-auto-test-round2", "field_metadata": {"plan_node": {"edit_after_approve": true}, "is_crucial": {"edit_after_approve": true}}, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": null, "show_name": "主变压器安装(台)", "construction_section": "JD", "status": null, "task_type": "zbazt", "plan_start_date": "2026-01-01", "plan_complete_date": "2026-12-31", "actual_complete_date": null, "complete_quantity": 0.0, "complete_rate": 0.0, "contract_quantity": 10.0, "plan_node": [{"date": "2026-03-01", "quantity": 3.0, "is_audit": false}, {"date": "2026-08-01", "quantity": 7.0, "is_audit": false}], "statistic_date": null, "sort": 0, "is_crucial": true, "delay_days": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_detail_1.jsonl new file mode 100644 index 0000000..dde63c7 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/construction_task_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "db98ec2d-1c6b-45f4-a176-7b560a8a89fe", "_rev": "3-auto-test-round2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-11-13 20:21:22", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 11:44:50", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 297531.0, "date": "2025-11-08", "status": null, "change_count": 1, "remark": "auto-test batch update item 1", "is_complete": null} +{"_id": "678ef40c-affa-4576-a7e2-f440d835f8a8", "_rev": "3-auto-test-round2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "pending_confirm", "approval_comment": null, "approval_time": "2025-12-18 21:26:04", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-12-18 20:54:33", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "construction_task_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "cbb9c312-c8af-437a-a7a2-7f856c77f758", "rate": null, "quantity": 372845.0, "date": "2025-12-18", "status": null, "change_count": 1, "remark": "auto-test batch update item 2", "is_complete": null} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..ce6eba1 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01"} +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_settlement_1.jsonl new file mode 100644 index 0000000..717f5e4 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/construction_task_detail/round_2_update/contract_settlement_1.jsonl @@ -0,0 +1 @@ +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_1_create/company_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_1_create/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_1_create/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..2f2ec00 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_1_create/contract_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "_rev": "1-b4b8fcf8f642923ee4dff56c79185a12", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "低压厂用电配电系统采购合同", "short_name": "", "code": "DP", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_1_create/project_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_1_create/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_1_create/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_1_create/supplier_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_1_create/supplier_1.jsonl new file mode 100644 index 0000000..aa50648 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_1_create/supplier_1.jsonl @@ -0,0 +1,28 @@ +{"_id": "0798431d-115a-4b1c-b95a-78470160fa9e", "_rev": "3-18cce2b2f9854c79aeb4329c31e6028c", "type": "supplier", "name": "沈阳中变电气有限责任公司", "short_name": "沈阳中变电气有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91210100564677033W", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "210000", "210100"]} +{"_id": "1098875c-e949-47b1-9f40-237eb507f890", "_rev": "3-0ef325ac17b9232224f5c9f924e2cf6f", "type": "supplier", "name": "中国水利水电第九工程局有限公司", "short_name": "中国水利水电第九工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91520000214428387H", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "1115a7f3-b2c1-4bfb-8c89-605250c402dd", "_rev": "3-6e0a5e272f35cd473d6cd82a1ad6cfa3", "type": "supplier", "name": "中国安能集团第三工程局有限公司", "short_name": "中国安能集团第三工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915101006331302278", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "1ff5b102-2f9e-496c-8591-1a8e32407c7f", "_rev": "3-2857c4610fd9e9a9b8313dee83454969", "type": "supplier", "name": "中国葛洲坝集团三峡建设工程有限公司", "short_name": "中国葛洲坝集团三峡建设工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "420000", "city": "420500", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91420000615573462P", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "420000", "420500"]} +{"_id": "4be9e1da-9ebf-4a2a-b6bd-14a41ac31858", "_rev": "5-b54a288a89b9e55cee26d42b08bb69a0", "type": "supplier", "name": "中国水利水电第七工程局有限公司", "short_name": "中国水利水电第七工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000201827469M", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "357c7eaf-5a33-4999-be94-79c42bfbd955", "_rev": "3-35879fa40a8fbe379f03c7a4fa8696ad", "type": "supplier", "name": "广州擎天实业有限公司", "short_name": "广州擎天实业有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "440300", "city": "440100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91440101231240749H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "440000", "440100"]} +{"_id": "2ca09c22-68b4-4e43-b9fa-619dcda5f325", "_rev": "3-ac12e05cedcda85821240a9066aa91ef", "type": "supplier", "name": "江苏苏博特新材料股份有限公司", "short_name": "江苏苏博特新材料股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91320000768299302G", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "31b6b6d7-989b-4abe-a7e1-6d518f3a4020", "_rev": "3-bedf089583a4645867c7036dba8e7a9e", "type": "supplier", "name": "中国水利水电第十工程局有限公司", "short_name": "中国水利水电第十工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9151018120276341XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "34db820f-860c-4c6e-9326-5c7cb385bf50", "_rev": "3-e475374124da6df3a40f38043efb7237", "type": "supplier", "name": "特变电工中发上海高压开关有限公司", "short_name": "特变电工中发上海高压开关有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "310000", "city": "310000", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9131012078784664XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "310000", "310000"]} +{"_id": "4b069ce4-3687-4263-a1f2-4735c22c3f8e", "_rev": "3-9cccdfa9f992ae4f0ec07068c479487c", "type": "supplier", "name": "四川二滩国际工程咨询有限责任公司", "short_name": "四川二滩国际工程咨询有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510115201873799G", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "2e465bd8-b240-4046-bf00-187d22823f7b", "_rev": "3-2629f9e1646b7e398fd8bb41a7fc47a2", "type": "supplier", "name": "哈尔滨电机厂有限责任公司", "short_name": "哈尔滨电机厂有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "230000", "city": "230100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "912301991270479655", "created_at": "2025-09-26 17:00:05", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "230000", "230100"]} +{"_id": "3ab47229-6da8-4efb-aa44-b96866a2ce13", "_rev": "3-998c447f59be1475e690d1416384fb64", "type": "supplier", "name": "四川蜀府贸易有限公司", "short_name": "四川蜀府贸易有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100005632853965", "created_at": "2025-09-26 17:00:10", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "48a5f1a7-5d5e-41cf-8676-042f1d5316f1", "_rev": "2-d43e58afff0c5317401a22d075866c56", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:32:41", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "czyy", "company_type": "other", "name": "常州液压成套设备厂有限公司", "short_name": "常州液压", "parent_id": null, "path": [], "path_name": [], "province": "320000", "city": "320400", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91320412250851852D", "country": "100000", "region_path": ["100000", "320000", "320400"]} +{"_id": "67fa779d-2ce9-468f-b94f-a3d29f1f22c9", "_rev": "3-2c6e66d316216cfc460662bf4a40e612", "type": "supplier", "name": "杭州华新机电工程有限公司", "short_name": "杭州华新机电工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "330000", "city": "330100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913301087227885306", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "330000", "330100"]} +{"_id": "594a09af-8944-476d-b098-7aebe96ad4e8", "_rev": "3-fc6edc3d3384c95def0be02ee734a5b2", "type": "supplier", "name": "云南水电十四局东华建筑工程有限公司", "short_name": "云南水电十四局东华建筑工程有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530000713408946K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "6db1ed5b-f52a-4142-867c-d8b2731ead71", "_rev": "3-f769878777781eb98071dddc7c7c4968", "type": "supplier", "name": "中国水利水电第十四工程局有限公司", "short_name": "中国水利水电第十四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "530000", "city": "530100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91530100216579074C", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "530000", "530100"]} +{"_id": "538e01cd-85cb-42b3-b313-16977f7a5224", "_rev": "3-d9acfbf91ba6d83dc33c94b84127f2e3", "type": "supplier", "name": "中国水利水电第五工程局有限公司", "short_name": "中国水利水电第五工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510000205804264E", "created_at": "2025-09-26 17:00:12", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "97be34dc-0a17-4ce5-baea-0f3ceee61103", "_rev": "4-4fbf33c81fff4a4a93ba8da7f99b786d", "type": "supplier", "name": "国电南京自动化股份有限公司", "short_name": "国电南京自动化股份有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "320000", "city": "320100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "913201007162522468", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "320000", "320100"]} +{"_id": "77316fb4-6167-432b-94e5-89c3d8a6b900", "_rev": "3-2112fbd151033d97a2c90123a02c70a3", "type": "supplier", "name": "中国水利水电夹江水工机械有限公司", "short_name": "中国水利水电夹江水工机械有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511126207500117U", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "936c6316-8d87-4681-a3b5-b90ed4804a06", "_rev": "3-a9a9b85f9cdd45dc3646e66c9a1a41aa", "type": "supplier", "name": "中国电建集团成都勘测设计研究院有限公司", "short_name": "中国电建集团成都勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "915100004507513971", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "510000", "510100"]} +{"_id": "98892419-6a71-4d7e-a0ac-ad5a0a15f1d6", "_rev": "3-f5bb2f9abe284037054df3b323f2482f", "type": "supplier", "name": "中国电建集团贵阳勘测设计研究院有限公司", "short_name": "中国电建集团贵阳勘测设计研究院有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "520000", "city": "520100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9152000070966703X2", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "520000", "520100"]} +{"_id": "9c80aace-ba73-4550-8fef-3080b51027d9", "_rev": "3-0dddd7f05fccce78e17fdf4ae9975f0a", "type": "supplier", "name": "中国水利水电第四工程局有限公司", "short_name": "中国水利水电第四工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "630000", "city": "630100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9163000022658124XK", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:53", "country": "100000", "region_path": ["100000", "630000", "630100"]} +{"_id": "930dfaf9-708e-4ec0-95f4-521b10bf1c00", "_rev": "2-5c464399a48505836497072601a60159", "field_metadata": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-27 11:33:18", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-12-25 08:59:53", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "supplier", "code": "hnwz", "company_type": "other", "name": "某公司海南物资有限公司", "short_name": "海南物资", "parent_id": null, "path": [], "path_name": [], "province": "460000", "city": "460100", "sort": 0, "status": "active", "company_nature": ["supplier"], "credit_code": "91469007MA5TW", "country": "100000", "region_path": ["100000", "460000", "460100"]} +{"_id": "ab5ab605-f27a-461b-9a88-73d1eafde5ed", "_rev": "3-a463c974fbcb84a524d1ee6ed72e64ec", "type": "supplier", "name": "东方电气集团东方电机有限公司", "short_name": "东方电气集团东方电机有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "510600", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91510600671415848H", "created_at": "2025-09-25 20:10:42", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "510600"]} +{"_id": "b4656ed6-5329-4673-93c8-d11e15d6ece5", "_rev": "3-0a11b989849efb63378b8a8fddb989e4", "type": "supplier", "name": "中国水利水电建设工程咨询西北有限公司", "short_name": "中国水利水电建设工程咨询西北有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610000220530812K", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "e0ceec90-0ad7-417f-a669-fd4f5db07eff", "_rev": "4-71df8660a58c5628bb55f2d39a9264fb", "type": "supplier", "name": "西安西电变压器有限责任公司", "short_name": "西安西电变压器有限责任公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "610000", "city": "610100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91610104220601553B", "created_at": "2025-09-25 20:09:02", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "610000", "610100"]} +{"_id": "cd9e9224-a08f-4bed-81a6-b289b74506e8", "_rev": "3-572570411c03424fb3370e74b2f7f496", "type": "supplier", "name": "乐山一拉得电网自动化有限公司", "short_name": "乐山一拉得电网自动化有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "510000", "city": "511100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "91511100MA6281NC0N", "created_at": "2025-09-25 20:10:43", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "510000", "511100"]} +{"_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "_rev": "3-269fcaf6630593cb44ee3e6a1ffd4ef9", "type": "supplier", "name": "中国水利水电第六工程局有限公司", "short_name": "中国水利水电第六工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9121011211756300XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "210000", "210100"]} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_2_update/company_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_2_update/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_2_update/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..2bbf4bb --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_2_update/contract_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "_rev": "2-auto-test-round2", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "低压厂用电配电系统采购合同", "short_name": "", "code": "DP", "contract_type": "product", "currency": "CNY", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_company": "", "company_id": "", "sign_date": "2024-03-01", "plan_end_date": "", "total_price": 123.45} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/contract/round_2_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/contract/round_2_update/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract/round_2_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/contract_change/round_1_create/contract_change_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_change/round_1_create/contract_change_1.jsonl new file mode 100644 index 0000000..65847c7 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_change/round_1_create/contract_change_1.jsonl @@ -0,0 +1 @@ +{"_id": "d8f0a39c-0b4f-4f3e-9d91-8f6e7a11c001", "type": "contract_change", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "f3b9c510-568f-4bed-98a4-a602142e1957", "title": "自动化合同变更回归-创建", "reason": "用于验证 contract_change create_remote 路径", "before_amount": 9886.622299, "after_amount": 9890.122299, "change_time": "2025-11-14", "attachment_ids": ["8e72f2aa198341bf98e1441087f5246d"]} diff --git a/tests/fixtures/auto_sync/datasource/contract_change/round_2_update/contract_change_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_change/round_2_update/contract_change_1.jsonl new file mode 100644 index 0000000..67d20e0 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_change/round_2_update/contract_change_1.jsonl @@ -0,0 +1 @@ +{"_id": "d8f0a39c-0b4f-4f3e-9d91-8f6e7a11c001", "type": "contract_change", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "f3b9c510-568f-4bed-98a4-a602142e1957", "title": "自动化合同变更回归-更新", "reason": "用于验证 contract_change update 路径", "before_amount": 9886.622299, "after_amount": 9895.422299, "change_time": "2025-11-14", "attachment_ids": ["8e72f2aa198341bf98e1441087f5246d", "dc6ce1933e204cd3b1e97f1eed0cfa71"]} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/company_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..6b201b7 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_1.jsonl @@ -0,0 +1,4 @@ +{"_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "_rev": "3-232f2c450e1c7c6cd78fbbe3c98db741", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "total_price": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "company_id": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "其他种类施工合同", "short_name": "", "code": "OSC", "contract_type": "service", "currency": "CNY", "manager_name": "翟万全", "manager_phone": "13778606062", "sign_company": "中国水利水电第六工程局有限公司", "company_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "sign_date": "2024-04-25", "plan_end_date": "", "total_price": 237461.901806} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_settlement_1.jsonl new file mode 100644 index 0000000..4511cff --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/project_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/supplier_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/supplier_1.jsonl new file mode 100644 index 0000000..4904dbb --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_1_create/supplier_1.jsonl @@ -0,0 +1 @@ +{"_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "_rev": "3-269fcaf6630593cb44ee3e6a1ffd4ef9", "type": "supplier", "name": "中国水利水电第六工程局有限公司", "short_name": "中国水利水电第六工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9121011211756300XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "210000", "210100"]} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/company_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/company_1.jsonl new file mode 100644 index 0000000..d83a11b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/company_1.jsonl @@ -0,0 +1 @@ +{"_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "_rev": "2-e265a6cb3674c71d6957883177b270cb", "type": "company", "name": "金上公司", "short_name": "金上公司", "code": "028B", "company_type": "region", "parent_id": "5da30aa7-b560-416e-9223-284290692351", "path": ["5da30aa7-b560-416e-9223-284290692351", "a1d69bf1-b95e-4832-9258-5bc35c629e9a"], "path_name": ["集团公司", "金上公司"], "province": "510000", "city": "510100", "status": "active", "sort": 27, "created_by": "system", "created_by_name": "system", "created_at": "2025-05-30 09:00:09", "updated_by": "system", "updated_by_name": "system", "updated_at": "2025-09-25 20:08:42", "company_nature": ["owner"], "id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "credit_code": null, "city_name": "成都市", "province_name": "四川省", "parent_name": "集团公司"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..0fac4b6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_1.jsonl @@ -0,0 +1,4 @@ +{"_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "_rev": "6-auto-test-round2", "field_metadata": {"sign_company": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_name": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "manager_phone": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "sign_date": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "total_price": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}, "company_id": {"approval_status": "approved", "approval_flow_id": "a396f802-5c4a-4f9b-939b-57823a3de707"}}, "approval_user": null, "approval_status": "approved", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "其他种类施工合同", "short_name": "", "code": "OSC", "contract_type": "service", "currency": "CNY", "manager_name": "翟万全", "manager_phone": "13778606062", "sign_company": "中国水利水电第六工程局有限公司", "company_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "sign_date": "2024-05-01", "plan_end_date": "", "total_price": 240000.0} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_settlement_1.jsonl new file mode 100644 index 0000000..141e715 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "6-auto-test-round2", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2032-12-31", "plan_start_date": "2024-05-01", "plan_node": [{"date": "2024-05-01", "quantity": 0.0, "is_audit": false}, {"date": "2027-06-30", "quantity": 120000.0, "is_audit": false}, {"date": "2032-12-31", "quantity": 240000.0, "is_audit": false}], "status": 1, "contract_price": 240000.0, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/supplier_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/supplier_1.jsonl new file mode 100644 index 0000000..4904dbb --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement/round_2_update/supplier_1.jsonl @@ -0,0 +1 @@ +{"_id": "e88c8c18-bc49-4bab-acc5-6fb78f4c7f8f", "_rev": "3-269fcaf6630593cb44ee3e6a1ffd4ef9", "type": "supplier", "name": "中国水利水电第六工程局有限公司", "short_name": "中国水利水电第六工程局有限公司", "code": "010A", "company_type": "other", "parent_id": "", "path": [], "path_name": [], "province": "210000", "city": "210100", "status": "active", "sort": 2, "created_by": "system", "created_by_name": "system", "updated_by": "system", "updated_by_name": "system", "company_nature": ["construction", "design", "supervisory", "supplier", "goverment"], "credit_code": "9121011211756300XA", "created_at": "2025-09-25 20:10:47", "updated_at": "2025-12-25 08:59:54", "country": "100000", "region_path": ["100000", "210000", "210100"]} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_1_create/contract_settlement_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_1_create/contract_settlement_detail_1.jsonl new file mode 100644 index 0000000..30c9aac --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_1_create/contract_settlement_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "6ad2b1d0-1f86-46bb-9183-17d6c9882d31", "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "date": "2025-10-19", "quantity": 20000.0, "remark": "首轮明细1", "is_complete": false, "write_off_rate": null, "change_count": 0} +{"_id": "ddf5dfd7-c244-46a3-992a-fce9c4a42072", "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "date": "2025-10-20", "quantity": 26000.5, "remark": "首轮明细2", "is_complete": false, "write_off_rate": null, "change_count": 0} diff --git a/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_2_update/contract_settlement_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_2_update/contract_settlement_detail_1.jsonl new file mode 100644 index 0000000..38e53de --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/contract_settlement_detail/round_2_update/contract_settlement_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "6ad2b1d0-1f86-46bb-9183-17d6c9882d31", "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "date": "2025-10-19", "quantity": 21000.0, "remark": "自动化更新-明细1", "is_complete": false, "write_off_rate": null, "change_count": 1} +{"_id": "ddf5dfd7-c244-46a3-992a-fce9c4a42072", "type": "contract_settlement_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "date": "2025-10-20", "quantity": 27500.75, "remark": "自动化更新-明细2", "is_complete": false, "write_off_rate": null, "change_count": 1} diff --git a/tests/fixtures/auto_sync/datasource/lar/round_1_create/lar_1.jsonl b/tests/fixtures/auto_sync/datasource/lar/round_1_create/lar_1.jsonl new file mode 100644 index 0000000..d4f480e --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/lar/round_1_create/lar_1.jsonl @@ -0,0 +1 @@ +{"_id": "718a9883-8479-4963-a58c-234d1984b117", "type": "lar", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "plan_resettlement_pop": 83, "completed_resettlement_pop": 83, "plan_investment_amt": 29698.24, "completed_investment_amt": 24230.31, "plan_urban_comp": 0.0, "actual_urban_comp": 0.0, "plan_rural_comp": 16689.73, "actual_rural_comp": 16644.28, "plan_spec_project_reconstr": 2726.2, "actual_spec_project_reconstr": 2726.2, "plan_reservoir_bottom_cleanup": 72.03, "actual_reservoir_bottom_cleanup": 72.03} diff --git a/tests/fixtures/auto_sync/datasource/lar/round_2_update/lar_1.jsonl b/tests/fixtures/auto_sync/datasource/lar/round_2_update/lar_1.jsonl new file mode 100644 index 0000000..a850f42 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/lar/round_2_update/lar_1.jsonl @@ -0,0 +1 @@ +{"_id": "718a9883-8479-4963-a58c-234d1984b117", "type": "lar", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "plan_resettlement_pop": 83, "completed_resettlement_pop": 84, "plan_investment_amt": 29698.24, "completed_investment_amt": 24231.31, "plan_urban_comp": 0.0, "actual_urban_comp": 0.0, "plan_rural_comp": 16689.73, "actual_rural_comp": 16645.28, "plan_spec_project_reconstr": 2726.2, "actual_spec_project_reconstr": 2726.2, "plan_reservoir_bottom_cleanup": 72.03, "actual_reservoir_bottom_cleanup": 72.03} diff --git a/tests/fixtures/auto_sync/datasource/lar_change/round_1_create/lar_change_1.jsonl b/tests/fixtures/auto_sync/datasource/lar_change/round_1_create/lar_change_1.jsonl new file mode 100644 index 0000000..deff5a3 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/lar_change/round_1_create/lar_change_1.jsonl @@ -0,0 +1 @@ +{"_id": "a78be5df-c3a0-4bd7-8f31-9bdc2f22c001", "type": "lar_change", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "title": "自动化移民变更回归-创建", "reason": "用于验证 lar_change create_remote 路径", "before_amount": 0.0, "after_amount": 1.5, "change_time": "2025-11-12", "attachment_ids": ["3f5f674fd36c413aa121403d2199f02a"]} diff --git a/tests/fixtures/auto_sync/datasource/lar_change/round_2_update/lar_change_1.jsonl b/tests/fixtures/auto_sync/datasource/lar_change/round_2_update/lar_change_1.jsonl new file mode 100644 index 0000000..c1ca022 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/lar_change/round_2_update/lar_change_1.jsonl @@ -0,0 +1 @@ +{"_id": "a78be5df-c3a0-4bd7-8f31-9bdc2f22c001", "type": "lar_change", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "title": "自动化移民变更回归-更新", "reason": "用于验证 lar_change update 路径", "before_amount": 0.0, "after_amount": 2.5, "change_time": "2025-11-12", "attachment_ids": ["3f5f674fd36c413aa121403d2199f02a", "fb6e840376594c13a527ab10a0580e29"]} diff --git a/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..4c56dc8 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_1.jsonl @@ -0,0 +1,5 @@ +{"_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "_rev": "1-3ed037a217dbaddd7ed772fc2b633f82", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "钢筋采购合同", "short_name": "", "code": "GJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} + +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_settlement_1.jsonl new file mode 100644 index 0000000..4511cff --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_1_create/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/material/round_1_create/material_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_1_create/material_1.jsonl new file mode 100644 index 0000000..2fbe5b8 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_1_create/material_1.jsonl @@ -0,0 +1 @@ +{"_id": "236c2610-f210-450a-846b-2241b2fd07f4", "_rev": "113-d3eab909b8403977755357eca7dd1313", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "show_name": "钢筋采购合同(吨)", "material_type": "GJ", "contract_quantity": 51161.0, "plan_start_quantity": 0.0, "complete_quantity": 12446.639, "complete_rate": 24.33, "plan_start_date": "2024-07-11", "plan_complete_date": "2026-12-31", "actual_start_date": "2025-11-08", "actual_complete_date": null, "plan_node": [{"date": "2024-07-11", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1209.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 5011.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 9032.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 12483.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 14967.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 18642.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 21432.0, "is_audit": false}, {"date": "2025-11-10", "quantity": 24301.0, "is_audit": false}, {"date": "2026-12-31", "quantity": 51161.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 201, "statistic_date": "2025-11-08"} diff --git a/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..4c56dc8 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_1.jsonl @@ -0,0 +1,5 @@ +{"_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "_rev": "1-3ed037a217dbaddd7ed772fc2b633f82", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "name": "钢筋采购合同", "short_name": "", "code": "GJ", "contract_type": "product", "currency": "CNY", "manager_name": "", "manager_phone": "", "sign_company": "", "company_id": "", "sign_date": "", "plan_end_date": "", "total_price": 0.0} + +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_settlement_1.jsonl new file mode 100644 index 0000000..4511cff --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_2_update/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/material/round_2_update/material_1.jsonl b/tests/fixtures/auto_sync/datasource/material/round_2_update/material_1.jsonl new file mode 100644 index 0000000..f9b7327 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material/round_2_update/material_1.jsonl @@ -0,0 +1 @@ +{"_id": "236c2610-f210-450a-846b-2241b2fd07f4", "_rev": "114-auto-test-round2", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "b9dad54b-68d4-4a58-b099-8f27dd5217d5"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "8cb77da2-1460-42b0-9ca4-7aa5afa58b99", "show_name": "钢筋采购合同(吨)", "material_type": "GJ", "contract_quantity": 52000.0, "plan_start_quantity": 0.0, "complete_quantity": 12446.639, "complete_rate": 24.33, "plan_start_date": "2024-07-11", "plan_complete_date": "2027-01-31", "actual_start_date": "2025-11-08", "actual_complete_date": null, "plan_node": [{"date": "2024-07-11", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1209.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 5011.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 9032.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 12483.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 14967.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 18642.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 21432.0, "is_audit": false}, {"date": "2025-11-10", "quantity": 24301.0, "is_audit": false}, {"date": "2027-01-31", "quantity": 52000.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 201, "statistic_date": "2025-11-08"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_1.jsonl new file mode 100644 index 0000000..db82612 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_settlement_1.jsonl new file mode 100644 index 0000000..4511cff --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_1.jsonl new file mode 100644 index 0000000..44ee639 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_1.jsonl @@ -0,0 +1 @@ +{"_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "_rev": "113-45c79b92146db5920bef980c9770cd4c", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2026-02-27 00:00:15", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "07d0c522-598c-4a19-a35d-b18bbd152ce1", "show_name": "粉煤灰采购合同(吨)", "material_type": "FM", "contract_quantity": 60000.0, "plan_start_quantity": 0.0, "complete_quantity": 6742.84, "complete_rate": 11.24, "plan_start_date": "2024-12-01", "plan_complete_date": "2027-05-31", "actual_start_date": "2025-11-03", "actual_complete_date": null, "plan_node": [{"date": "2024-12-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1060.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 2807.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 5654.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 8337.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 10498.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 11838.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 13052.0, "is_audit": false}, {"date": "2027-05-31", "quantity": 60000.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 232, "statistic_date": "2025-11-03"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_detail_1.jsonl new file mode 100644 index 0000000..95f5c1a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_1_create/material_detail_1.jsonl @@ -0,0 +1 @@ +{"_id": "e996f4ef-3cff-476c-9b1b-a3d940ac24d6", "_rev": "1-74b772edd1aa6609404d1234178f99d5", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 10:24:28", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2025-11-09 10:24:28", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "date": "2025-11-03", "rate": null, "quantity": 6742.84, "status": null, "remark": null, "is_complete": null, "change_count": 0} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_1.jsonl new file mode 100644 index 0000000..db82612 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "92e3de18-354c-4acf-9cb5-58ee55708fbd", "manager_name": "自动化回归", "manager_phone": "13800000000", "sign_date": "2024-03-01", "total_price": 123.45} + +{"_id": "1351be9d-3ca3-48f1-be29-fb39b2c3ff15", "name": "施工总承包合同(不含设计、采购)"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_settlement_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_settlement_1.jsonl new file mode 100644 index 0000000..4511cff --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/contract_settlement_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "c4ded355-fb10-46e8-b829-442bf42c16f1", "_rev": "5-14aa25675e6c9d9686ae0a134e6d48cd", "field_metadata": {"plan_node": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9", "edit_after_approve": true}, "contract_price": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_start_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}, "plan_complete_date": {"approval_status": "rejected", "approval_flow_id": "26f8888e-ee51-4060-9fa4-c47d8a9ff8b9"}}, "approval_user": null, "approval_status": "rejected", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "contract_settlement", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "eba6d9e0-fad4-456d-a325-38f5bd064b33", "contract_type": null, "show_name": "其他种类施工合同", "complete_price": 14576.616806, "actual_complete_date": null, "actual_start_date": "2025-10-18", "plan_complete_date": "2031-09-30", "plan_start_date": "2024-04-25", "plan_node": [{"date": "2024-04-25", "quantity": 0.0, "is_audit": false}, {"date": "2031-09-30", "quantity": 237461.901806, "is_audit": false}], "status": 1, "contract_price": 237461.901806, "sort": 0, "delay_days": 0, "statistic_date": "2025-10-18"} +{"_id": "26157d07-d02b-40aa-8afe-47204b4bc3e3", "plan_start_date": "2024-03-01"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_1.jsonl new file mode 100644 index 0000000..82e6d19 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_1.jsonl @@ -0,0 +1 @@ +{"_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "_rev": "114-auto-test-round2", "field_metadata": {"plan_node": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845", "edit_after_approve": true}, "plan_start_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "plan_complete_date": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}, "contract_quantity": {"approval_status": "under_review", "approval_flow_id": "494863df-24fd-4c9a-b034-71bb98ca3845"}}, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "07d0c522-598c-4a19-a35d-b18bbd152ce1", "show_name": "粉煤灰采购合同(吨)", "material_type": "FM", "contract_quantity": 60000.0, "plan_start_quantity": 0.0, "complete_quantity": 7000.0, "complete_rate": 11.67, "plan_start_date": "2024-12-01", "plan_complete_date": "2027-05-31", "actual_start_date": "2025-11-03", "actual_complete_date": null, "plan_node": [{"date": "2024-12-01", "quantity": 0.0, "is_audit": false}, {"date": "2025-04-10", "quantity": 1060.0, "is_audit": false}, {"date": "2025-05-10", "quantity": 2807.0, "is_audit": false}, {"date": "2025-06-10", "quantity": 5654.0, "is_audit": false}, {"date": "2025-07-10", "quantity": 8337.0, "is_audit": false}, {"date": "2025-08-10", "quantity": 10498.0, "is_audit": false}, {"date": "2025-09-10", "quantity": 11838.0, "is_audit": false}, {"date": "2025-10-10", "quantity": 13052.0, "is_audit": false}, {"date": "2027-05-31", "quantity": 60000.0, "is_audit": false}], "status": -1, "sort": 0, "delay_days": 232, "statistic_date": "2025-11-03"} diff --git a/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_detail_1.jsonl new file mode 100644 index 0000000..847fb5b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/material_detail/round_2_update/material_detail_1.jsonl @@ -0,0 +1 @@ +{"_id": "e996f4ef-3cff-476c-9b1b-a3d940ac24d6", "_rev": "2-auto-test-round2", "field_metadata": null, "confirmation_user": null, "confirmation_time": null, "confirmation_comment": null, "approval_user": null, "approval_status": "under_review", "approval_comment": null, "approval_time": null, "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-09 10:24:28", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "material_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "506a1188-0c20-44fc-8dba-1a36a074bfea", "date": "2025-11-03", "rate": null, "quantity": 7000.0, "status": null, "remark": "自动化更新", "is_complete": null, "change_count": 1} diff --git a/tests/fixtures/auto_sync/datasource/personnel/round_1_create/personnel_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel/round_1_create/personnel_1.jsonl new file mode 100644 index 0000000..0a36ee1 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel/round_1_create/personnel_1.jsonl @@ -0,0 +1 @@ +{"_id": "2006708a-dae4-4874-9207-22889cf2c886", "type": "personnel", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "code": "personnel", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "b16ab690-a318-4927-a165-0f2b92759922", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": null, "actual_exit_date": null, "plan_node": [], "plan_start_date": null, "plan_start_quantity": 0, "actual_start_date": null, "actual_start_quantity": null} diff --git a/tests/fixtures/auto_sync/datasource/personnel/round_2_update/personnel_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel/round_2_update/personnel_1.jsonl new file mode 100644 index 0000000..c27c960 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel/round_2_update/personnel_1.jsonl @@ -0,0 +1 @@ +{"_id": "2006708a-dae4-4874-9207-22889cf2c886", "type": "personnel", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "code": "personnel", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "97de1925-849d-4470-8d4d-673790a1b0d4", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": "2026-12-31", "actual_exit_date": null, "plan_node": [{"date": "2024-06-01", "quantity": 12.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 20.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 28.0, "is_audit": false}], "plan_start_date": "2024-05-01", "plan_start_quantity": 12, "actual_start_date": null, "actual_start_quantity": null} diff --git a/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/ecm_sync_system.code-workspace b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/ecm_sync_system.code-workspace new file mode 100644 index 0000000..fd7924f --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/ecm_sync_system.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "../../../../../.." + }, + { + "path": "../../../../../../../GroupSideProjectManagementSystem" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_1.jsonl new file mode 100644 index 0000000..c27c960 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_1.jsonl @@ -0,0 +1 @@ +{"_id": "2006708a-dae4-4874-9207-22889cf2c886", "type": "personnel", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "code": "personnel", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "97de1925-849d-4470-8d4d-673790a1b0d4", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": "2026-12-31", "actual_exit_date": null, "plan_node": [{"date": "2024-06-01", "quantity": 12.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 20.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 28.0, "is_audit": false}], "plan_start_date": "2024-05-01", "plan_start_quantity": 12, "actual_start_date": null, "actual_start_quantity": null} diff --git a/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_detail_1.jsonl new file mode 100644 index 0000000..10dbf36 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel_detail/round_1_create/personnel_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "1cda9548-ff40-431d-a012-fdb4dc8ce7f1", "type": "personnel_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "2006708a-dae4-4874-9207-22889cf2c886", "date": "2024-06-15", "quantity": 12, "remark": "首轮明细1", "is_complete": false, "change_count": 0} +{"_id": "b21b0365-6134-409a-9fa1-d0f6c1d22944", "type": "personnel_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "2006708a-dae4-4874-9207-22889cf2c886", "date": "2024-08-01", "quantity": 18, "remark": "首轮明细2", "is_complete": false, "change_count": 0} diff --git a/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_1.jsonl new file mode 100644 index 0000000..c27c960 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_1.jsonl @@ -0,0 +1 @@ +{"_id": "2006708a-dae4-4874-9207-22889cf2c886", "type": "personnel", "field_metadata": {"plan_node": {"edit_after_approve": true}}, "code": "personnel", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "contract_id": "97de1925-849d-4470-8d4d-673790a1b0d4", "show_name": "人员配置(人)", "status": null, "plan_attendance": 0, "actual_daily_attendance": 0, "attendance_rate": 0.0, "statistic_date": null, "plan_exit_date": "2026-12-31", "actual_exit_date": null, "plan_node": [{"date": "2024-06-01", "quantity": 12.0, "is_audit": false}, {"date": "2025-06-30", "quantity": 20.0, "is_audit": false}, {"date": "2026-06-30", "quantity": 28.0, "is_audit": false}], "plan_start_date": "2024-05-01", "plan_start_quantity": 12, "actual_start_date": null, "actual_start_quantity": null} diff --git a/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_detail_1.jsonl b/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_detail_1.jsonl new file mode 100644 index 0000000..6b403fe --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/personnel_detail/round_2_update/personnel_detail_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "1cda9548-ff40-431d-a012-fdb4dc8ce7f1", "type": "personnel_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "2006708a-dae4-4874-9207-22889cf2c886", "date": "2024-06-15", "quantity": 15, "remark": "自动化更新-明细1", "is_complete": false, "change_count": 1} +{"_id": "b21b0365-6134-409a-9fa1-d0f6c1d22944", "type": "personnel_detail", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "parent_id": "2006708a-dae4-4874-9207-22889cf2c886", "date": "2024-08-01", "quantity": 22, "remark": "自动化更新-明细2", "is_complete": false, "change_count": 1} diff --git a/tests/fixtures/auto_sync/datasource/preparation/round_1_create/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/preparation/round_1_create/preparation_1.jsonl new file mode 100644 index 0000000..a06f68b --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/preparation/round_1_create/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "_rev": "1-7700a8a38cdcaacbffce02a89d2456cd", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZLDZ", "name": "转轮吊装", "is_acquired": 0, "acquire_date": null, "is_exist": false} diff --git a/tests/fixtures/auto_sync/datasource/preparation/round_1_create/production_1.jsonl b/tests/fixtures/auto_sync/datasource/preparation/round_1_create/production_1.jsonl new file mode 100644 index 0000000..a580caf --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/preparation/round_1_create/production_1.jsonl @@ -0,0 +1 @@ +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/preparation/round_2_update/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/preparation/round_2_update/preparation_1.jsonl new file mode 100644 index 0000000..5769978 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/preparation/round_2_update/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "_rev": "2-auto-test-round2", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "preparation", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "ZLDZ", "name": "转轮吊装", "is_acquired": 0, "acquire_date": "2024-10-16", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/preparation/round_2_update/production_1.jsonl b/tests/fixtures/auto_sync/datasource/preparation/round_2_update/production_1.jsonl new file mode 100644 index 0000000..a580caf --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/preparation/round_2_update/production_1.jsonl @@ -0,0 +1 @@ +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/production/round_1_create/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/production/round_1_create/preparation_1.jsonl new file mode 100644 index 0000000..08320a6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/production/round_1_create/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "is_exist": false} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/production/round_1_create/production_1.jsonl b/tests/fixtures/auto_sync/datasource/production/round_1_create/production_1.jsonl new file mode 100644 index 0000000..d45be38 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/production/round_1_create/production_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "_rev": "1-721e5547ab2028b6735f3e41806debf9", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "a775915a-0bed-4a17-94f0-47b29916be90", "updated_by_name": "集团公司管理员", "updated_at": "2025-11-07 16:20:49", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JGYS", "name": "竣工验收", "is_acquired": 0, "acquire_date": null, "is_exist": false} + +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/production/round_2_update/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/production/round_2_update/preparation_1.jsonl new file mode 100644 index 0000000..08320a6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/production/round_2_update/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "is_exist": false} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/production/round_2_update/production_1.jsonl b/tests/fixtures/auto_sync/datasource/production/round_2_update/production_1.jsonl new file mode 100644 index 0000000..a15e654 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/production/round_2_update/production_1.jsonl @@ -0,0 +1,3 @@ +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "_rev": "2-auto-test-round2", "field_metadata": null, "approval_user": null, "approval_status": null, "approval_comment": null, "approval_time": null, "created_by": "a775915a-0bed-4a17-94f0-47b29916be90", "created_by_name": "集团公司管理员", "created_at": "2025-11-07 16:20:49", "updated_by": "auto-test", "updated_by_name": "auto-test", "updated_at": "2026-03-06 00:00:00", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "production", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "code": "JGYS", "name": "竣工验收", "is_acquired": 0, "acquire_date": "2025-12-27", "is_exist": true} + +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/project/round_1_bind/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project/round_1_bind/project_1.jsonl new file mode 100644 index 0000000..faa559a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project/round_1_bind/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "杜光远", "manager_phone": "13551034084", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "NONE", "key_constraints_remark": "", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/project/round_2_base_info_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project/round_2_base_info_update/project_1.jsonl new file mode 100644 index 0000000..a5393de --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project/round_2_base_info_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "昌波回归项目", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "自动化负责人A", "manager_phone": "13900001234", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 82.6, "investment_decision_date": "2021-07-27", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1412584.9, "complete_investment": 0.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "QT", "key_constraints_remark": "自动化回归关键制约备注", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": null, "static_total_investment": 1224284.97, "completed_investment": 194269.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/project/round_3_investment_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project/round_3_investment_update/project_1.jsonl new file mode 100644 index 0000000..8149cab --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project/round_3_investment_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "_rev": "20-7448552b6b9fb5ca20688049150ae037", "field_metadata": {"actual_construction_date": {"edit_after_approve": true}, "constructing_capacity": {"edit_after_approve": true}, "complete_investment": {"edit_after_approve": true}, "completed_settlement_quantity": {"edit_after_approve": true}, "progress_type": {"edit_after_approve": true}, "key_constraints": {"edit_after_approve": true}, "production_capacity": {"edit_after_approve": true}, "key_constraints_remark": {"edit_after_approve": true}, "completed_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199", "edit_after_approve": true}, "actual_construction_capacity": {"edit_after_approve": true}, "static_total_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}, "dynamic_investment": {"approval_status": "under_review", "approval_flow_id": "d5feb908-6628-484e-ac3f-b2f505f56199"}}, "approval_user": "a775915a-0bed-4a17-94f0-47b29916be90", "approval_status": "approved", "approval_comment": "审核通过", "approval_time": "2025-11-07 16:20:49", "created_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "created_by_name": "李远运", "created_at": "2025-11-07 14:58:45", "updated_by": "118573d7-2eaf-44f8-9cd7-26c2832229b3", "updated_by_name": "李远运", "updated_at": "2026-02-26 09:07:18", "deleted_at": null, "deleted_by": null, "deleted_by_name": null, "type": "project", "address": "中国西藏自治区昌都市芒康县", "code": "", "name": "金沙江上游昌波水电站", "short_name": "昌波回归项目", "region_name": ["中国", "西藏自治区", "昌都市", "芒康县"], "region_path": ["100000", "540000", "540300", "540328"], "province": "540000", "is_domestic": true, "company_id": "a1d69bf1-b95e-4832-9258-5bc35c629e9a", "company_name": "金上公司", "manager_name": "自动化负责人A", "manager_phone": "13900001234", "project_type": "hydropower", "authorization_date": "2023-05-24", "authorized_capacity": 82.6, "investment_decision_capacity": 83.1, "investment_decision_date": "2021-08-15", "plan_construction_capacity": 0.0, "plan_construction_date": "", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "constructing_capacity": 82.6, "dynamic_investment": 1413000.5, "complete_investment": 125000.0, "ensure_production_capacity": 0.0, "challenge_production_capacity": 0.0, "climb_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "production_capacity": 0.0, "production_date": "", "total_production_capacity": 0.0, "actual_production_date": null, "actual_full_production_date": null, "progress_type": "C", "key_constraints": "QT", "key_constraints_remark": "自动化回归关键制约备注", "status": "started", "apply_file_ids": ["095a2434910a42deb154cf8b0dc7b47c"], "syxs": null, "sub_type": null, "dbtc_score_list": [], "scgc_type": "power", "dam_type": "ZLB", "storage_capacity": 1670.0, "normal_storage_level": 2387.0, "regulation_performance": "RTJ", "workshop_type": "DX", "precon_start_date": "2023-05", "precon_end_date": "2025-03", "maincon_start_date": "2025-04", "maincon_end_date": "2030-05", "comm_start_date": "2030-06", "comm_end_date": "2031-12", "implementation_estimate": 1225000.0, "static_total_investment": 1224300.0, "completed_investment": 194500.0, "total_contract_quantity": null, "completed_settlement_quantity": null, "first_actual_construction_date": "2023-09-25"} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/preparation_1.jsonl new file mode 100644 index 0000000..08320a6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "is_exist": false} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/production_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/production_1.jsonl new file mode 100644 index 0000000..29c1c6d --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/production_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "is_exist": false} +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_1.jsonl new file mode 100644 index 0000000..9e0dd15 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "actual_construction_capacity": 0.0, "actual_construction_date": "", "accumulated_construction_capacity": 82.6, "plan_construction_capacity": 0.0, "plan_construction_date": "", "ensure_production_capacity": 0.0, "climb_production_capacity": 0.0, "challenge_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "actual_production_date": null, "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_detail_data_1.jsonl new file mode 100644 index 0000000..f025c35 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_1_create/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "c99ae2e4-809e-47dd-8b86-61674b6a5bea", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "actual_construction", "value": [{"year": 2023, "date": "2023-09-25", "capacity": 82.6, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/preparation_1.jsonl new file mode 100644 index 0000000..08320a6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "is_exist": false} \ No newline at end of file diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/production_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/production_1.jsonl new file mode 100644 index 0000000..29c1c6d --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/production_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "is_exist": false} +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_1.jsonl new file mode 100644 index 0000000..957ebf5 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "actual_construction_capacity": 5.5, "actual_construction_date": "2026-02-18", "accumulated_construction_capacity": 5.5, "constructing_capacity": 5.5, "plan_construction_capacity": 0.0, "plan_construction_date": "", "ensure_production_capacity": 0.0, "climb_production_capacity": 0.0, "challenge_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "actual_production_date": null, "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_detail_data_1.jsonl new file mode 100644 index 0000000..bb20de6 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_2_update/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "c99ae2e4-809e-47dd-8b86-61674b6a5bea", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "actual_construction", "value": [{"year": 2026, "date": "2026-02-18", "capacity": 5.5, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/preparation_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/preparation_1.jsonl new file mode 100644 index 0000000..672ffd0 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/preparation_1.jsonl @@ -0,0 +1 @@ +{"_id": "12e7e3e9-ca2d-4457-b89e-ee9e968ce50f", "is_exist": false} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/production_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/production_1.jsonl new file mode 100644 index 0000000..29c1c6d --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/production_1.jsonl @@ -0,0 +1,2 @@ +{"_id": "0f957d3d-367a-4f24-a6c8-0be465189335", "is_exist": false} +{"_id": "5943fc7b-b2c2-4cbf-ade2-db22fda994bd", "is_exist": true} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_1.jsonl new file mode 100644 index 0000000..d1974fd --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "actual_construction_capacity": 5.5, "actual_construction_date": "2026-02-18", "accumulated_construction_capacity": 5.5, "constructing_capacity": 5.5, "plan_construction_capacity": 6.6, "plan_construction_date": "2026-02-20", "ensure_production_capacity": 0.0, "climb_production_capacity": 0.0, "challenge_production_capacity": 0.0, "plan_production_date": null, "plan_full_production_date": null, "actual_production_date": null, "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_detail_data_1.jsonl new file mode 100644 index 0000000..46331ed --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_3_plan_construction_create/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "4bc5e9db-c9dc-41f1-a77d-574b4fe37b01", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "plan_construction", "value": [{"year": 2026, "date": "2026-02-20", "capacity": 6.6, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_1.jsonl new file mode 100644 index 0000000..73dbca5 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "constructing_capacity": 82.6, "ensure_production_capacity": 0.0, "climb_production_capacity": 0.0, "challenge_production_capacity": 0.0, "plan_production_date": "2026-04-01", "plan_full_production_date": "2026-06-01", "actual_production_date": "2025-12-27", "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_detail_data_1.jsonl new file mode 100644 index 0000000..b407986 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_4_production_update/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "0b3f7e2d-9dc7-4f71-aac9-c9e7093df64f", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "production", "plan_production_date": "2026-04-01", "plan_full_production_date": "2026-06-01", "actual_production_date": "2025-12-27", "actual_full_production_date": null, "value": [{"year": 2025, "date": "2025-12-27", "capacity": 51.0, "is_audit": true}, {"year": 2025, "date": "2025-12-28", "capacity": 51.0, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_1.jsonl new file mode 100644 index 0000000..416521a --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "constructing_capacity": 82.6, "ensure_production_capacity": 21.0, "climb_production_capacity": 0.0, "challenge_production_capacity": 0.0, "plan_production_date": "2026-04-01", "plan_full_production_date": "2026-06-01", "actual_production_date": "2025-12-27", "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_detail_data_1.jsonl new file mode 100644 index 0000000..47c8a55 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_5_ensure_production_push/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "11111111-1111-4111-8111-111111111111", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "ensure_production", "value": [{"year": 2025, "capacity": 51.0, "is_audit": true}, {"year": 2026, "capacity": 21.0, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_1.jsonl new file mode 100644 index 0000000..3b5a1c3 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "constructing_capacity": 82.6, "ensure_production_capacity": 21.0, "climb_production_capacity": 22.0, "challenge_production_capacity": 0.0, "plan_production_date": "2026-04-01", "plan_full_production_date": "2026-06-01", "actual_production_date": "2025-12-27", "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_detail_data_1.jsonl new file mode 100644 index 0000000..e9b6705 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_6_climb_production_push/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "22222222-2222-4222-8222-222222222222", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "climb_production", "value": [{"year": 2025, "capacity": 102.0, "is_audit": true}, {"year": 2026, "capacity": 22.0, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_1.jsonl new file mode 100644 index 0000000..b866fb2 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_1.jsonl @@ -0,0 +1 @@ +{"_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "constructing_capacity": 82.6, "ensure_production_capacity": 21.0, "climb_production_capacity": 22.0, "challenge_production_capacity": 23.0, "plan_production_date": "2026-04-01", "plan_full_production_date": "2026-06-01", "actual_production_date": "2025-12-27", "actual_full_production_date": null} diff --git a/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_detail_data_1.jsonl b/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_detail_data_1.jsonl new file mode 100644 index 0000000..3acd437 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/project_detail_data/round_7_challenge_production_push/project_detail_data_1.jsonl @@ -0,0 +1 @@ +{"_id": "33333333-3333-4333-8333-333333333333", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "key": "challenge_production", "value": [{"year": 2025, "capacity": 102.0, "is_audit": true}, {"year": 2026, "capacity": 23.0, "is_audit": true}]} diff --git a/tests/fixtures/auto_sync/datasource/units/round_1_create/units_1.jsonl b/tests/fixtures/auto_sync/datasource/units/round_1_create/units_1.jsonl new file mode 100644 index 0000000..7d5c3cd --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/units/round_1_create/units_1.jsonl @@ -0,0 +1 @@ +{"_id": "05bdc3b1-f455-4182-a50f-39ddfb3f5a69", "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 4.3, "plan_production_date": "2028-12-31", "actual_production_date": null, "serial_number": 1} diff --git a/tests/fixtures/auto_sync/datasource/units/round_2_update/units_1.jsonl b/tests/fixtures/auto_sync/datasource/units/round_2_update/units_1.jsonl new file mode 100644 index 0000000..fe5c9f3 --- /dev/null +++ b/tests/fixtures/auto_sync/datasource/units/round_2_update/units_1.jsonl @@ -0,0 +1 @@ +{"_id": "05bdc3b1-f455-4182-a50f-39ddfb3f5a69", "type": "generator_unit", "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", "capacity": 4.3, "plan_production_date": "2028-12-31", "actual_production_date": "2025-12-20", "serial_number": 1} diff --git a/tests/fixtures/auto_sync/domains/contract.yaml b/tests/fixtures/auto_sync/domains/contract.yaml new file mode 100644 index 0000000..2024180 --- /dev/null +++ b/tests/fixtures/auto_sync/domains/contract.yaml @@ -0,0 +1,31 @@ +domain: contract +description: 合同 domain 的最小闭环测试。先创建 1 条合同,再修改同一条合同,检查绑定和状态库。 +focus_node_types: + - company + - project + - contract +primary_local_ids: + contract: + - "92e3de18-354c-4acf-9cb5-58ee55708fbd" +rounds: + - name: round_1_create + purpose: 首轮创建合同 + dataset_dir: ${PROJECT_ROOT}/tests/fixtures/auto_sync/datasource/contract/round_1_create + checks: + required_bindings: + contract: + - "92e3de18-354c-4acf-9cb5-58ee55708fbd" + - name: round_2_update + purpose: 第二轮修改合同金额、负责人和签约日期,验证 update + dataset_dir: ${PROJECT_ROOT}/tests/fixtures/auto_sync/datasource/contract/round_2_update + changes: + contract: + "92e3de18-354c-4acf-9cb5-58ee55708fbd": + - total_price + - manager_name + - manager_phone + - sign_date + checks: + required_bindings: + contract: + - "92e3de18-354c-4acf-9cb5-58ee55708fbd" diff --git a/tests/fixtures/mock_domain.py b/tests/fixtures/mock_domain.py new file mode 100644 index 0000000..8b77f25 --- /dev/null +++ b/tests/fixtures/mock_domain.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +from collections import defaultdict +from typing import Dict, List, Optional, Sequence + +from pydantic import BaseModel + +from sync_state_machine.common.registry import DomainRegistry +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.datasource.handler import ValidationResult +from sync_state_machine.datasource.task_result import TaskResult +from sync_state_machine.sync_system.strategy import DefaultSyncStrategy + + +class TestProjectSchema(BaseModel): + __test__ = False + id: str + name: str + code: str + + +class TestContractSchema(BaseModel): + __test__ = False + id: str + name: str + code: str + project_ref: str + + +class TestProjectNode(SyncNode[TestProjectSchema]): + __test__ = False + node_type = "test_project" + schema = TestProjectSchema + + +class TestContractNode(SyncNode[TestContractSchema]): + __test__ = False + node_type = "test_contract" + schema = TestContractSchema + + +class TestProjectStrategy(DefaultSyncStrategy[TestProjectSchema]): + __test__ = False + schema = TestProjectSchema + + +class TestContractStrategy(DefaultSyncStrategy[TestContractSchema]): + __test__ = False + schema = TestContractSchema + + +def register_test_domain() -> None: + if not DomainRegistry.is_registered("test_project"): + DomainRegistry.register( + node_type="test_project", + schema=TestProjectSchema, + node_class=TestProjectNode, + strategy_class=TestProjectStrategy, + ) + if not DomainRegistry.is_registered("test_contract"): + DomainRegistry.register( + node_type="test_contract", + schema=TestContractSchema, + node_class=TestContractNode, + strategy_class=TestContractStrategy, + ) + + +def build_project_node( + node_id: str, + data_id: str, + *, + name: str, + code: str, + data_present: bool = True, +): + data = {"id": data_id, "name": name, "code": code} if data_present else None + return TestProjectNode(node_id=node_id, data_id=data_id, data=data) + + +def build_contract_node( + node_id: str, + data_id: str, + *, + name: str, + code: str, + project_ref: str, + data_present: bool = True, +): + data = ( + { + "id": data_id, + "name": name, + "code": code, + "project_ref": project_ref, + } + if data_present + else None + ) + return TestContractNode(node_id=node_id, data_id=data_id, data=data) + + +class InMemoryNodeHandler: + def __init__( + self, + *, + node_type: str, + node_class, + schema, + load_nodes: Sequence[SyncNode], + create_mode_by_code: Optional[Dict[str, str]] = None, + update_mode_by_code: Optional[Dict[str, str]] = None, + ): + self._node_type = node_type + self._node_class = node_class + self._schema = schema + self._load_nodes = load_nodes + self._collection = None + self._create_mode_by_code = create_mode_by_code or {} + self._update_mode_by_code = update_mode_by_code or {} + self._poll_sequences: Dict[str, List[str]] = defaultdict(list) + + @property + def node_type(self) -> str: + return self._node_type + + @property + def node_class(self): + return self._node_class + + @property + def schema(self): + return self._schema + + def set_collection(self, collection): + self._collection = collection + + def extract_id(self, data: Dict[str, str]) -> str: + return str(data.get("id", "")) + + async def validate(self, data: Dict[str, str]) -> ValidationResult: + try: + self._schema.model_validate(data) + return ValidationResult(is_valid=True) + except Exception as exc: + return ValidationResult(is_valid=False, errors=[str(exc)]) + + def _create_node(self, data: Dict[str, str]): + data_id = self.extract_id(data) + return self._node_class( + node_id=f"{self._node_type}-{data_id}", + data_id=data_id, + data=data, + ) + + async def load(self): + return [ + self._node_class( + node_id=node.node_id, + data_id=node.data_id, + data=node.get_data(), + origin_data=node.get_data(), + action=node.action, + status=node.status, + binding_status=node.binding_status, + depend_ids=list(node.depend_ids), + context=dict(node.context), + ) + for node in self._load_nodes + ] + + async def create_all(self, nodes): + results = [] + for node in nodes: + data = node.get_data() or {} + mode = self._create_mode_by_code.get(data.get("code", ""), "success") + results.append(self._result_for_mode(mode, node.node_id, node_code=data.get("code", ""), phase="create")) + return results + + async def update_all(self, nodes): + results = [] + for node in nodes: + data = node.get_data() or {} + mode = self._update_mode_by_code.get(data.get("code", ""), "success") + results.append(self._result_for_mode(mode, node.node_id, node_code=data.get("code", ""), phase="update")) + return results + + async def delete_all(self, nodes): + return [TaskResult.success(node_id=node.node_id, data_id=node.data_id) for node in nodes] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + out: Dict[str, TaskResult] = {} + for task_id in task_ids: + sequence = self._poll_sequences.get(task_id) or ["success"] + mode = sequence.pop(0) + if not sequence: + sequence = [mode] + self._poll_sequences[task_id] = sequence + node_id = task_id.split("::", 1)[1] + if mode == "success": + out[task_id] = TaskResult.success(node_id=node_id, data_id=f"polled-{node_id}") + elif mode == "failed": + out[task_id] = TaskResult.failed(node_id=node_id, error="poll failed") + else: + out[task_id] = TaskResult.in_progress(node_id=node_id, task_id=task_id) + return out + + def _result_for_mode(self, mode: str, node_id: str, *, node_code: str, phase: str) -> TaskResult: + if mode == "success": + return TaskResult.success(node_id=node_id, data_id=f"{phase}-ok-{node_id}") + if mode == "failed": + return TaskResult.failed(node_id=node_id, error=f"{phase} failed for {node_code}") + if mode == "skipped": + return TaskResult.skipped(node_id=node_id, reason=f"{phase} skipped for {node_code}") + if mode == "in_progress_success": + task_id = f"task::{node_id}" + self._poll_sequences[task_id] = ["success"] + return TaskResult.in_progress(node_id=node_id, task_id=task_id) + if mode == "in_progress_failed": + task_id = f"task::{node_id}" + self._poll_sequences[task_id] = ["failed"] + return TaskResult.in_progress(node_id=node_id, task_id=task_id) + raise ValueError(f"Unsupported mode: {mode}") + + +class InMemoryDataSource(BaseDataSource): + pass diff --git a/tests/integration/test_copy_pipeline_jsonl.py b/tests/integration/test_copy_pipeline_jsonl.py new file mode 100644 index 0000000..cf17f25 --- /dev/null +++ b/tests/integration/test_copy_pipeline_jsonl.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import json +import tempfile +from pathlib import Path + +import pytest + +import sync_state_machine.domain # noqa: F401 +from sync_state_machine.pipeline.copy_data_pipeline import CopyDataPipeline + + +@pytest.fixture +def source_data_dir() -> Path: + temp_dir = Path(tempfile.mkdtemp(prefix="sync_state_machine_source_")) + + project_data = [ + { + "_id": f"proj-{i}", + "type": "project", + "name": f"Test Project {i}", + "code": f"P{i:03d}", + "status": "active", + "progress_type": "C", + "project_type": "onshore_wind", + } + for i in range(1, 4) + ] + (temp_dir / "project_1.jsonl").write_text( + "\n".join(json.dumps(d, ensure_ascii=False) for d in project_data), + encoding="utf-8", + ) + + contract_data = [ + { + "_id": f"contract-{i}", + "type": "contract", + "name": f"Test Contract {i}", + "code": f"C{i:03d}", + "total_price": i * 10000, + } + for i in range(1, 6) + ] + (temp_dir / "contract_1.jsonl").write_text( + "\n".join(json.dumps(d, ensure_ascii=False) for d in contract_data), + encoding="utf-8", + ) + + return temp_dir + + +@pytest.fixture +def target_data_dir() -> Path: + return Path(tempfile.mkdtemp(prefix="sync_state_machine_target_")) + + +@pytest.mark.asyncio +async def test_copy_pipeline_jsonl_end_to_end(source_data_dir: Path, target_data_dir: Path) -> None: + pipeline = CopyDataPipeline( + source_dir=source_data_dir, + target_dir=target_data_dir, + node_types=["project", "contract"], + ) + + stats = await pipeline.run() + + assert stats["loaded"] == 8 + assert stats["copied"] == 8 + assert stats["saved"] == 8 + assert stats["failed"] == 0 + + output_files = {p.name for p in target_data_dir.glob("*.jsonl")} + assert "project_1.jsonl" in output_files + assert "contract_1.jsonl" in output_files diff --git a/tests/integration/test_full_pipeline_multinode_mock.py b/tests/integration/test_full_pipeline_multinode_mock.py new file mode 100644 index 0000000..08edd05 --- /dev/null +++ b/tests/integration/test_full_pipeline_multinode_mock.py @@ -0,0 +1,508 @@ +from __future__ import annotations + +import tempfile +from pathlib import Path +import copy +import json + +import pytest +import pytest_asyncio + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.pipeline.full_sync_pipeline import FullSyncPipeline +from sync_state_machine.sync_system.strategy_ops.compare_ops import ( + build_data_id_normalization_map, + normalized_data_for_compare, + collect_payload_diffs, +) +from sync_state_machine.sync_system.config import OrphanAction, UpdateDirection +from tests.fixtures.mock_domain import ( + InMemoryDataSource, + InMemoryNodeHandler, + TestContractNode, + TestContractSchema, + TestContractStrategy, + TestProjectNode, + TestProjectSchema, + TestProjectStrategy, + build_contract_node, + build_project_node, + register_test_domain, +) + + +@pytest_asyncio.fixture +async def pipeline_bundle(): + register_test_domain() + + db = Path(tempfile.mkdtemp(prefix="sync_state_machine_pipeline_") ) / "state.db" + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + local_project_nodes = [ + build_project_node("lp_norm", "P-NORM", name="Project Normal", code="NORM"), + build_project_node("lp_warn", "P-WARN", name="Project Warning", code="WARN"), + build_project_node("lp_auto", "P-AUTO", name="Project Auto", code="AUTO-1"), + build_project_node("lp_create_ok", "P-COK", name="Project Create OK", code="CREATE_OK"), + build_project_node("lp_create_fail", "P-CFAIL", name="Project Create Fail", code="CREATE_FAIL"), + build_project_node("lp_create_async", "P-CASYNC", name="Project Create Async", code="CREATE_ASYNC"), + build_project_node("lp_update", "P-UPD", name="Project Update New", code="UPD-1"), + ] + remote_project_nodes = [ + build_project_node("rp_norm", "RP-NORM", name="Project Normal", code="NORM"), + build_project_node("rp_warn", "RP-WARN", name="Project Warning", code="WARN", data_present=False), + build_project_node("rp_auto", "RP-AUTO", name="Project Auto", code="AUTO-1"), + build_project_node("rp_update", "RP-UPD", name="Project Update Old", code="UPD-1"), + ] + + local_contract_nodes = [ + build_contract_node( + "lc_dep_ok", + "C-DEP-OK", + name="Contract Dep OK", + code="C-DEP-OK", + project_ref="P-NORM", + ), + build_contract_node( + "lc_dep_err", + "C-DEP-ERR", + name="Contract Dep Err", + code="C-DEP-ERR", + project_ref="P-MISSING", + ), + build_contract_node( + "lc_upd_skip", + "C-UPD-SKIP", + name="Contract Update Skip New", + code="C-UPD-SKIP", + project_ref="P-NORM", + ), + build_contract_node( + "lc_upd_fail", + "C-UPD-FAIL", + name="Contract Update Fail New", + code="C-UPD-FAIL", + project_ref="P-NORM", + ), + ] + remote_contract_nodes = [ + build_contract_node( + "rc_upd_skip", + "RC-UPD-SKIP", + name="Contract Update Skip Old", + code="C-UPD-SKIP", + project_ref="RP-NORM", + ), + build_contract_node( + "rc_upd_fail", + "RC-UPD-FAIL", + name="Contract Update Fail Old", + code="C-UPD-FAIL", + project_ref="RP-NORM", + ), + ] + + local_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + remote_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + + local_ds.register_handler( + InMemoryNodeHandler( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=local_project_nodes, + ) + ) + local_ds.register_handler( + InMemoryNodeHandler( + node_type="test_contract", + node_class=TestContractNode, + schema=TestContractSchema, + load_nodes=local_contract_nodes, + ) + ) + + remote_ds.register_handler( + InMemoryNodeHandler( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=remote_project_nodes, + create_mode_by_code={ + "CREATE_OK": "success", + "CREATE_FAIL": "failed", + "CREATE_ASYNC": "in_progress_success", + }, + update_mode_by_code={"UPD-1": "success"}, + ) + ) + remote_ds.register_handler( + InMemoryNodeHandler( + node_type="test_contract", + node_class=TestContractNode, + schema=TestContractSchema, + load_nodes=remote_contract_nodes, + create_mode_by_code={"C-DEP-OK": "success"}, + update_mode_by_code={ + "C-UPD-SKIP": "skipped", + "C-UPD-FAIL": "failed", + }, + ) + ) + + await binding_manager.bind("test_project", "lp_norm", "rp_norm") + await binding_manager.bind("test_project", "lp_warn", "rp_warn") + await binding_manager.bind("test_project", "lp_update", "rp_update") + await binding_manager.bind("test_contract", "lc_upd_skip", "rc_upd_skip") + await binding_manager.bind("test_contract", "lc_upd_fail", "rc_upd_fail") + await binding_manager.persist() + + project_strategy = TestProjectStrategy("test_project", local_collection, remote_collection, binding_manager) + project_strategy.update_config( + auto_bind=True, + auto_bind_fields=["code"], + depend_fields={}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + contract_strategy = TestContractStrategy("test_contract", local_collection, remote_collection, binding_manager) + contract_strategy.update_config( + auto_bind=False, + depend_fields={"project_ref": "test_project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[project_strategy, contract_strategy], + node_types=["test_project", "test_contract"], + load_order=["test_project", "test_contract"], + sync_order=["test_project", "test_contract"], + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + enable_persistence=True, + ) + + yield pipeline, local_collection, remote_collection, binding_manager + + +@pytest.mark.asyncio +async def test_full_pipeline_multinode_mock_covers_business_points(pipeline_bundle): + pipeline, local_collection, remote_collection, binding_manager = pipeline_bundle + + stats = await pipeline.run() + + assert stats["post_check_passed"] is True + + assert local_collection.get("lp_norm").binding_status == BindingStatus.NORMAL + assert local_collection.get("lp_warn").binding_status == BindingStatus.WARNING + assert remote_collection.get("rp_warn").binding_status == BindingStatus.ABNORMAL + assert local_collection.get("lc_dep_err").binding_status == BindingStatus.DEPENDENCY_ERROR + + assert local_collection.get("lp_norm").context.get("bind_data_id") == remote_collection.get("rp_norm").data_id + assert remote_collection.get("rp_norm").context.get("bind_data_id") == local_collection.get("lp_norm").data_id + + assert await binding_manager.get_remote_id("test_project", "lp_auto") == "rp_auto" + + project_nodes = remote_collection.filter(node_type="test_project") + create_ok_nodes = [n for n in project_nodes if (n.get_data() or {}).get("code") == "CREATE_OK"] + create_fail_nodes = [n for n in project_nodes if (n.get_data() or {}).get("code") == "CREATE_FAIL"] + create_async_nodes = [n for n in project_nodes if (n.get_data() or {}).get("code") == "CREATE_ASYNC"] + + assert len(create_ok_nodes) == 1 + assert len(create_fail_nodes) == 1 + assert len(create_async_nodes) == 1 + + assert create_ok_nodes[0].status == SyncStatus.PENDING + assert create_ok_nodes[0].action == SyncAction.NONE + assert create_fail_nodes[0].status == SyncStatus.FAILED + assert create_async_nodes[0].status == SyncStatus.PENDING + assert create_async_nodes[0].action == SyncAction.NONE + + assert remote_collection.get("rc_upd_skip").status == SyncStatus.SKIPPED + assert remote_collection.get("rc_upd_skip").action == SyncAction.NONE + assert remote_collection.get("rc_upd_fail").status == SyncStatus.FAILED + + assert local_collection.get("lc_dep_ok").binding_status == BindingStatus.WARNING + assert await binding_manager.get_remote_id("test_contract", "lc_dep_ok") is None + + project_bindings = await binding_manager.get_all_records("test_project") + contract_bindings = await binding_manager.get_all_records("test_contract") + assert len(project_bindings) >= 7 + assert len(contract_bindings) >= 2 + + +@pytest.mark.asyncio +async def test_pipeline_reloads_after_create_update_writes(pipeline_bundle): + pipeline, _, _, _ = pipeline_bundle + + load_counts: dict[tuple[str, str], int] = {} + + def attach_counter(datasource, side: str, node_type: str): + handler = datasource.get_handler(node_type) + original_load = handler.load + + async def _wrapped_load(): + key = (side, node_type) + load_counts[key] = load_counts.get(key, 0) + 1 + return await original_load() + + handler.load = _wrapped_load # type: ignore[method-assign] + + for side_name, ds in (("local", pipeline.local_datasource), ("remote", pipeline.remote_datasource)): + attach_counter(ds, side_name, "test_project") + attach_counter(ds, side_name, "test_contract") + + await pipeline.run() + + assert load_counts[("local", "test_project")] >= 3 + assert load_counts[("remote", "test_project")] >= 3 + assert load_counts[("local", "test_contract")] >= 1 + assert load_counts[("remote", "test_contract")] >= 1 + + +@pytest.mark.asyncio +async def test_pipeline_emits_consistency_stats(pipeline_bundle): + pipeline, _, _, _ = pipeline_bundle + + stats = await pipeline.run() + + assert "consistency" in stats + assert "test_project" in stats["consistency"] + assert "test_contract" in stats["consistency"] + + project_consistency = stats["consistency"]["test_project"] + contract_consistency = stats["consistency"]["test_contract"] + + assert isinstance(project_consistency["ok"], bool) + assert isinstance(contract_consistency["ok"], bool) + assert isinstance(project_consistency["checked_pairs"], int) + assert isinstance(contract_consistency["checked_pairs"], int) + assert isinstance(project_consistency["mismatch_count"], int) + assert isinstance(contract_consistency["mismatch_count"], int) + + +@pytest.mark.asyncio +async def test_load_overrides_bind_data_id_from_bindings(pipeline_bundle): + pipeline, local_collection, remote_collection, _ = pipeline_bundle + + await pipeline.run() + + existing_persistence = local_collection.persistence + assert existing_persistence is not None + persistence = PersistenceBackend(existing_persistence.db_path) + await persistence.initialize() + + await persistence.conn.execute( + "UPDATE nodes SET bind_data_id = ?, context = ? WHERE collection_id = ? AND node_id = ?", + ("STALE", json.dumps({"bind_data_id": "STALE"}), "local", "lp_norm"), + ) + await persistence.conn.execute( + "UPDATE nodes SET bind_data_id = ?, context = ? WHERE collection_id = ? AND node_id = ?", + ("STALE", json.dumps({"bind_data_id": "STALE"}), "local", "lp_create_fail"), + ) + await persistence.conn.commit() + + local_reloaded = DataCollection("local", persistence=persistence, auto_persist=False) + remote_reloaded = DataCollection("remote", persistence=persistence, auto_persist=False) + await local_reloaded.load_from_persistence() + await remote_reloaded.load_from_persistence() + + assert local_reloaded.get("lp_norm").context.get("bind_data_id") == remote_reloaded.get("rp_norm").data_id + assert remote_reloaded.get("rp_norm").context.get("bind_data_id") == local_reloaded.get("lp_norm").data_id + assert "bind_data_id" not in local_reloaded.get("lp_create_fail").context + + await persistence.close() + + +@pytest.mark.asyncio +async def test_post_check_normalizes_id_fields_and_none_empty_equivalence(pipeline_bundle): + pipeline, local_collection, remote_collection, _ = pipeline_bundle + + await pipeline.run() + + local_node = local_collection.get("lp_norm") + remote_node = remote_collection.get("rp_norm") + local_ref = local_collection.get("lp_warn") + remote_ref = remote_collection.get("rp_warn") + + assert local_node is not None and remote_node is not None + assert local_ref is not None and remote_ref is not None + assert local_node.get_data() is not None and remote_node.get_data() is not None + + local_payload_seed = local_node.get_data() or {} + remote_payload_seed = remote_node.get_data() or {} + local_payload_seed["contract_id"] = local_ref.data_id + remote_payload_seed["contract_id"] = remote_ref.data_id + local_payload_seed["contract_type"] = None + remote_payload_seed["contract_type"] = "GP" + local_payload_seed["plan_start_date"] = None + remote_payload_seed["plan_start_date"] = "" + local_node.set_data(local_payload_seed, validate=False) + remote_node.set_data(remote_payload_seed, validate=False) + + data_id_map = await build_data_id_normalization_map( + node_type="test_project", + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=pipeline.binding_manager, + ) + local_payload = normalized_data_for_compare(local_node.get_data(), data_id_map) + remote_payload = normalized_data_for_compare(remote_node.get_data(), data_id_map) + diff_map = collect_payload_diffs(local_payload, remote_payload) + + assert "contract_id" not in diff_map + assert "contract_type" in diff_map + assert "plan_start_date" not in diff_map + + +class _MutableProjectRemoteHandler(InMemoryNodeHandler): + def __init__(self): + super().__init__( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=[], + ) + self._store_by_node_id: dict[str, dict] = {} + self.update_calls = 0 + + async def load(self): + nodes = [] + for row in self._store_by_node_id.values(): + nodes.append( + TestProjectNode( + node_id=row["node_id"], + data_id=row["data_id"], + data=copy.deepcopy(row["data"]), + origin_data=copy.deepcopy(row["data"]), + ) + ) + return nodes + + async def create_all(self, nodes): + for node in nodes: + node_data = node.get_data() or {} + new_data_id = f"RID-{node.node_id}" + self._store_by_node_id[node.node_id] = { + "node_id": node.node_id, + "data_id": new_data_id, + "data": { + "id": new_data_id, + "name": "REMOTE-STUB", + "code": node_data.get("code", ""), + }, + } + from sync_state_machine.datasource.task_result import TaskResult + return [ + TaskResult.success(node_id=node.node_id, data_id=f"RID-{node.node_id}") + for node in nodes + ] + + async def update_all(self, nodes): + self.update_calls += len(nodes) + from sync_state_machine.datasource.task_result import TaskResult + + results = [] + for node in nodes: + node_data = node.get_data() or {} + existing = self._store_by_node_id.get(node.node_id) + if existing is None: + existing_data_id = node.data_id or f"RID-{node.node_id}" + else: + existing_data_id = existing["data_id"] + self._store_by_node_id[node.node_id] = { + "node_id": node.node_id, + "data_id": existing_data_id, + "data": { + "id": existing_data_id, + "name": node_data.get("name", ""), + "code": node_data.get("code", ""), + }, + } + results.append(TaskResult.success(node_id=node.node_id, data_id=existing_data_id)) + return results + + +@pytest.mark.asyncio +async def test_pipeline_create_then_update_completes_in_single_run_with_reload(): + register_test_domain() + + db = Path(tempfile.mkdtemp(prefix="sync_state_machine_pipeline_reload_") ) / "state.db" + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + local_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + remote_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + + local_ds.register_handler( + InMemoryNodeHandler( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=[ + build_project_node("lp_create_then_update", "P-CREATE-UPDATE", name="Project Final", code="P-CU"), + ], + ) + ) + remote_handler = _MutableProjectRemoteHandler() + remote_ds.register_handler(remote_handler) + + project_strategy = TestProjectStrategy("test_project", local_collection, remote_collection, binding_manager) + project_strategy.update_config( + auto_bind=True, + auto_bind_fields=["code"], + depend_fields={}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[project_strategy], + node_types=["test_project"], + load_order=["test_project"], + sync_order=["test_project"], + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + enable_persistence=True, + ) + + stats = await pipeline.run() + + records = await binding_manager.get_all_records("test_project") + assert len(records) == 1 + local_id = records[0].local_id + remote_id = records[0].remote_id + assert remote_id is not None + + local_node = local_collection.get_by_node_id(local_id) + remote_node = remote_collection.get_by_node_id(remote_id) + assert local_node is not None + assert remote_node is not None + + assert remote_handler.update_calls >= 1 + assert (remote_node.get_data() or {}).get("name") == "Project Final" + assert stats["consistency"]["test_project"]["ok"] is True diff --git a/tests/integration/test_full_pipeline_multinode_persisted_db.py b/tests/integration/test_full_pipeline_multinode_persisted_db.py new file mode 100644 index 0000000..80e5b91 --- /dev/null +++ b/tests/integration/test_full_pipeline_multinode_persisted_db.py @@ -0,0 +1,175 @@ +from __future__ import annotations + +import sqlite3 +from pathlib import Path + +import pytest + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.pipeline.full_sync_pipeline import FullSyncPipeline +from sync_state_machine.sync_system.config import OrphanAction, UpdateDirection +from tests.fixtures.mock_domain import ( + InMemoryDataSource, + InMemoryNodeHandler, + TestContractNode, + TestContractSchema, + TestContractStrategy, + TestProjectNode, + TestProjectSchema, + TestProjectStrategy, + build_contract_node, + build_project_node, + register_test_domain, +) + + +@pytest.mark.asyncio +async def test_full_pipeline_multinode_mock_persisted_db_snapshot() -> None: + register_test_domain() + + report_dir = Path("test_results") / "sync_state_machine" + report_dir.mkdir(parents=True, exist_ok=True) + db_path = report_dir / "multinode_mock_pipeline.db" + + if db_path.exists(): + db_path.unlink() + + persistence = PersistenceBackend(str(db_path)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + local_project_nodes = [ + build_project_node("lp_norm", "P-NORM", name="Project Normal", code="NORM"), + build_project_node("lp_warn", "P-WARN", name="Project Warning", code="WARN"), + build_project_node("lp_auto", "P-AUTO", name="Project Auto", code="AUTO-1"), + build_project_node("lp_create_ok", "P-COK", name="Project Create OK", code="CREATE_OK"), + build_project_node("lp_create_fail", "P-CFAIL", name="Project Create Fail", code="CREATE_FAIL"), + build_project_node("lp_create_async", "P-CASYNC", name="Project Create Async", code="CREATE_ASYNC"), + build_project_node("lp_update", "P-UPD", name="Project Update New", code="UPD-1"), + ] + remote_project_nodes = [ + build_project_node("rp_norm", "RP-NORM", name="Project Normal", code="NORM"), + build_project_node("rp_warn", "RP-WARN", name="Project Warning", code="WARN", data_present=False), + build_project_node("rp_auto", "RP-AUTO", name="Project Auto", code="AUTO-1"), + build_project_node("rp_update", "RP-UPD", name="Project Update Old", code="UPD-1"), + ] + + local_contract_nodes = [ + build_contract_node("lc_dep_ok", "C-DEP-OK", name="Contract Dep OK", code="C-DEP-OK", project_ref="P-NORM"), + build_contract_node("lc_dep_err", "C-DEP-ERR", name="Contract Dep Err", code="C-DEP-ERR", project_ref="P-MISSING"), + build_contract_node("lc_upd_skip", "C-UPD-SKIP", name="Contract Update Skip New", code="C-UPD-SKIP", project_ref="P-NORM"), + build_contract_node("lc_upd_fail", "C-UPD-FAIL", name="Contract Update Fail New", code="C-UPD-FAIL", project_ref="P-NORM"), + ] + remote_contract_nodes = [ + build_contract_node("rc_upd_skip", "RC-UPD-SKIP", name="Contract Update Skip Old", code="C-UPD-SKIP", project_ref="RP-NORM"), + build_contract_node("rc_upd_fail", "RC-UPD-FAIL", name="Contract Update Fail Old", code="C-UPD-FAIL", project_ref="RP-NORM"), + ] + + local_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + remote_ds = InMemoryDataSource(poll_max_retries=2, poll_interval=0) + + local_ds.register_handler( + InMemoryNodeHandler( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=local_project_nodes, + ) + ) + local_ds.register_handler( + InMemoryNodeHandler( + node_type="test_contract", + node_class=TestContractNode, + schema=TestContractSchema, + load_nodes=local_contract_nodes, + ) + ) + + remote_ds.register_handler( + InMemoryNodeHandler( + node_type="test_project", + node_class=TestProjectNode, + schema=TestProjectSchema, + load_nodes=remote_project_nodes, + create_mode_by_code={ + "CREATE_OK": "success", + "CREATE_FAIL": "failed", + "CREATE_ASYNC": "in_progress_success", + }, + update_mode_by_code={"UPD-1": "success"}, + ) + ) + remote_ds.register_handler( + InMemoryNodeHandler( + node_type="test_contract", + node_class=TestContractNode, + schema=TestContractSchema, + load_nodes=remote_contract_nodes, + create_mode_by_code={"C-DEP-OK": "success"}, + update_mode_by_code={ + "C-UPD-SKIP": "skipped", + "C-UPD-FAIL": "failed", + }, + ) + ) + + await binding_manager.bind("test_project", "lp_norm", "rp_norm") + await binding_manager.bind("test_project", "lp_warn", "rp_warn") + await binding_manager.bind("test_project", "lp_update", "rp_update") + await binding_manager.bind("test_contract", "lc_upd_skip", "rc_upd_skip") + await binding_manager.bind("test_contract", "lc_upd_fail", "rc_upd_fail") + await binding_manager.persist() + + project_strategy = TestProjectStrategy("test_project", local_collection, remote_collection, binding_manager) + project_strategy.update_config( + auto_bind=True, + auto_bind_fields=["code"], + depend_fields={}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + contract_strategy = TestContractStrategy("test_contract", local_collection, remote_collection, binding_manager) + contract_strategy.update_config( + auto_bind=False, + depend_fields={"project_ref": "test_project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[project_strategy, contract_strategy], + node_types=["test_project", "test_contract"], + load_order=["test_project", "test_contract"], + sync_order=["test_project", "test_contract"], + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + enable_persistence=True, + ) + + stats = await pipeline.run() + assert stats["post_check_passed"] is True + + conn = sqlite3.connect(str(db_path)) + try: + rows = conn.execute("SELECT collection_id, COUNT(*) FROM nodes GROUP BY collection_id ORDER BY collection_id").fetchall() + total = conn.execute("SELECT COUNT(*) FROM nodes").fetchone()[0] + finally: + conn.close() + + assert total >= 10 + assert any(r[0] == "local" for r in rows) + assert any(r[0] == "remote" for r in rows) + + await persistence.close() diff --git a/tests/integration/test_mock_datasource_state_machine.py b/tests/integration/test_mock_datasource_state_machine.py new file mode 100644 index 0000000..821d22c --- /dev/null +++ b/tests/integration/test_mock_datasource_state_machine.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +import tempfile +from pathlib import Path + +import pytest + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.engine.dispatcher import StateMachineRuntime +from sync_state_machine.engine.model import StateMachineConfig +from tests.mocks.mock_datasource import ( + HandlerScript, + MockDataSource, + MockSyncNode, + ScriptedMockHandler, +) + + +@pytest.fixture +def datasource_bundle(): + db = Path(tempfile.mkdtemp(prefix="sync_state_machine_mock_ds_")) / "state.db" + persistence = PersistenceBackend(str(db)) + cfg_path = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + runtime = StateMachineRuntime(StateMachineConfig.load(cfg_path)) + collection = DataCollection("mock", persistence=None, auto_persist=False) + collection.set_state_machine_runtime(runtime) + datasource = MockDataSource(poll_max_retries=2, poll_interval=0) + datasource.set_state_machine_runtime(runtime) + return datasource, collection + + +def _new_node(node_id: str, action: SyncAction) -> MockSyncNode: + data_id = "" if action == SyncAction.CREATE else "mock-data-id" + return MockSyncNode( + node_id=node_id, + data_id=data_id, + data={"id": node_id, "name": "mock"}, + action=action, + status=SyncStatus.PENDING, + binding_status=BindingStatus.NORMAL, + ) + + +@pytest.mark.asyncio +async def test_create_success_to_s11(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n1", SyncAction.CREATE) + await collection.add(node) + + datasource.register_handler(ScriptedMockHandler(HandlerScript(create="success"))) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock") + + assert node.status == SyncStatus.SUCCESS + + +@pytest.mark.asyncio +async def test_create_skipped_is_rejected(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n2", SyncAction.CREATE) + await collection.add(node) + + datasource.register_handler(ScriptedMockHandler(HandlerScript(create="skipped"))) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock") + + assert node.status == SyncStatus.FAILED + assert node.action == SyncAction.CREATE + + +@pytest.mark.asyncio +async def test_update_skip_downgrade_to_s14(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n3", SyncAction.UPDATE) + await collection.add(node) + + datasource.register_handler( + ScriptedMockHandler(HandlerScript(update="skipped")) + ) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock") + + assert node.status == SyncStatus.SKIPPED + assert node.action == SyncAction.NONE + + +@pytest.mark.asyncio +async def test_update_success_writes_back_origin_data(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n3b", SyncAction.UPDATE) + node.set_origin_data({"id": "n3b", "name": "before"}) + node.set_data({"id": "n3b", "name": "after"}) + await collection.add(node) + + datasource.register_handler(ScriptedMockHandler(HandlerScript(update="success"))) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock") + + assert node.status == SyncStatus.SUCCESS + assert node.action == SyncAction.UPDATE + assert node.get_origin_data() == node.get_data() + + +@pytest.mark.asyncio +async def test_in_progress_poll_success_to_s11(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n4", SyncAction.CREATE) + await collection.add(node) + + datasource.register_handler( + ScriptedMockHandler(HandlerScript(create="in_progress", poll_sequence=["success"])) + ) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock", poll_async_tasks=True) + + assert node.status == SyncStatus.SUCCESS + + +@pytest.mark.asyncio +async def test_in_progress_poll_timeout_to_s12(datasource_bundle): + datasource, collection = datasource_bundle + node = _new_node("n5", SyncAction.CREATE) + await collection.add(node) + + datasource.register_handler( + ScriptedMockHandler(HandlerScript(create="in_progress", poll_sequence=["in_progress", "in_progress"])) + ) + datasource.set_collection(collection) + await datasource.sync_all(data_type="mock", poll_async_tasks=True) + + assert node.status == SyncStatus.FAILED + assert "timeout" in (node.error or "").lower() diff --git a/tests/integration/test_mock_full_event_state_coverage.py b/tests/integration/test_mock_full_event_state_coverage.py new file mode 100644 index 0000000..f8156ed --- /dev/null +++ b/tests/integration/test_mock_full_event_state_coverage.py @@ -0,0 +1,686 @@ +from __future__ import annotations + +import re +import sqlite3 +import tempfile +from pathlib import Path + +import pytest + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime +from sync_state_machine.engine.events import ( + decision_note, + e01_bootstrap, + e10_bind_core, + e15_bind_dependency, + e16_bind_auto, + e20_create_prepare, + e21_create_prepare, + e22_delete_prepare, + e30_update_prepare, + e41_post_create_ready, + e40_sync_execute, +) +from sync_state_machine.engine.state_apply import apply_state_to_node +from sync_state_machine.sync_system.strategy_ops.reset_ops import run_phase2_cleanup +from tests.mocks.mock_datasource import MockSyncNode +from sync_state_machine.domain.project.sync_node import ProjectSyncNode + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" +REPORT_DIR = Path(__file__).resolve().parents[3] / "test_results" / "sync_state_machine" + + +def _new_node( + node_id: str, + *, + data_id: str = "seed-id", + action: SyncAction = SyncAction.NONE, + status: SyncStatus = SyncStatus.PENDING, + binding_status: BindingStatus = BindingStatus.UNCHECKED, +) -> MockSyncNode: + return MockSyncNode( + node_id=node_id, + data_id=data_id, + data={"id": node_id, "name": "mock"}, + action=action, + status=status, + binding_status=binding_status, + ) + + +def _set_state(runtime: StateMachineRuntime, node: MockSyncNode, state_id: str, *, data_id: str) -> None: + apply_state_to_node( + runtime, + node, + state_id=state_id, + reason="test setup", + fields={"binding_status", "action", "status"}, + ) + apply_state_to_node( + runtime, + node, + state_id=state_id, + reason="test setup", + fields={"data_id"}, + data_id=data_id, + ) + + +def _collect_transition_lines(node: MockSyncNode) -> list[str]: + text = node.sync_log or "" + return [line for line in text.splitlines() if "状态机流转:" in line] + + +def _dump_db_sync_logs(db_path: Path, *, collection_id: str) -> str: + conn = sqlite3.connect(str(db_path)) + try: + cursor = conn.execute( + "SELECT node_id, node_type, action, status, binding_status, sync_log " + "FROM nodes WHERE collection_id = ? ORDER BY node_id", + (collection_id,), + ) + rows = cursor.fetchall() + finally: + conn.close() + + lines = [ + "node_id\tnode_type\taction\tstatus\tbinding_status\tsync_log", + ] + for row in rows: + node_id, node_type, action, status, binding_status, sync_log = row + lines.append( + f"{node_id}\t{node_type}\t{action}\t{status}\t{binding_status}\t{(sync_log or '').replace(chr(10), ' | ')}" + ) + return "\n".join(lines) + + +@pytest.mark.asyncio +async def test_mock_based_full_event_and_state_coverage() -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + cfg = runtime._config + + covered_events: set[str] = set() + covered_states: set[str] = set() + transition_lines: list[str] = [] + transition_rows: list[str] = ["node_id\tfrom_state\tevent\toutcome_index\tto_state\treason"] + + def record(node: MockSyncNode, decision) -> None: + covered_events.add(decision.event_id) + covered_states.add(decision.from_state) + if decision.to_state: + covered_states.add(decision.to_state) + transition_lines.extend(_collect_transition_lines(node)) + transition_rows.append( + f"{node.node_id}\t{decision.from_state}\t{decision.event_id}\t{decision.outcome_index}\t{decision.to_state or ''}\t{decision_note(decision)}" + ) + + # E01 + node_e01_keep = _new_node("e01_keep", action=SyncAction.NONE, status=SyncStatus.PENDING) + d = e01_bootstrap(runtime, node=node_e01_keep, is_create_zombie=False) + record(node_e01_keep, d) + + node_e01_del = _new_node("e01_del", action=SyncAction.CREATE, status=SyncStatus.FAILED) + d = e01_bootstrap(runtime, node=node_e01_del, is_create_zombie=True) + record(node_e01_del, d) + + # E10 merged outcomes + for idx, (has_binding, local_res, peer_res) in enumerate( + [ + (True, "NORMAL", "NORMAL"), + (True, "WARNING", "ABNORMAL"), + (True, "ABNORMAL", "WARNING"), + (True, "ABNORMAL", "ABNORMAL"), + (False, None, None), + ], + start=1, + ): + node = _new_node(f"e10_{idx}") + _set_state(runtime, node, "S00", data_id="id-e10") + d = e10_bind_core( + runtime, + node=node, + has_binding_record=has_binding, + core_binding_result=local_res, + peer_core_binding_result=peer_res, + ) + record(node, d) + + # E15 outcomes + e15_cases = [ + dict(data_present=True, has_depend_fields=False, dep_satisfied=True), + dict(data_present=False, has_depend_fields=True, dep_satisfied=True), + dict(data_present=True, has_depend_fields=True, dep_satisfied=False), + dict(data_present=True, has_depend_fields=True, dep_satisfied=True), + ] + for idx, case in enumerate(e15_cases, start=1): + node = _new_node(f"e15_{idx}") + _set_state(runtime, node, "S02", data_id="id-e15") + d = e15_bind_dependency(runtime, node=node, **case) + record(node, d) + + node_e22 = _new_node("e22") + _set_state(runtime, node_e22, "S02", data_id="id-e22") + d = e22_delete_prepare(runtime, node=node_e22) + record(node_e22, d) + + # E16 outcomes + e16_cases = [ + dict(auto_bind_enabled=False, auto_bind_outcome=None, create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="DATA_MISSING", create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="ONE_TO_ONE", create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="AMBIGUOUS", create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="KEY_MISSING", create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="KEY_ID_RESOLVE_FAIL", create_enabled=None), + dict(auto_bind_enabled=True, auto_bind_outcome="ZERO", create_enabled=True), + dict(auto_bind_enabled=True, auto_bind_outcome="ZERO", create_enabled=False), + ] + for idx, case in enumerate(e16_cases, start=1): + node = _new_node(f"e16_{idx}") + _set_state(runtime, node, "S02", data_id="id-e16") + d = e16_bind_auto(runtime, node=node, **case) + record(node, d) + + # E20 commit outcomes from S13 + node_e20_ok = _new_node("e20_ok", action=SyncAction.CREATE, status=SyncStatus.PENDING, binding_status=BindingStatus.MISSING) + _set_state(runtime, node_e20_ok, "S13", data_id="id-e20") + d = e20_create_prepare(runtime, node=node_e20_ok, spawn_success=True) + record(node_e20_ok, d) + + node_e20_commit_fail = _new_node("e20_commit_fail") + _set_state(runtime, node_e20_commit_fail, "S13", data_id="id-e20-f") + d = e20_create_prepare(runtime, node=node_e20_commit_fail, spawn_success=False) + assert d.to_state is None + record(node_e20_commit_fail, d) + + node_e21 = _new_node("e21") + _set_state(runtime, node_e21, "S02", data_id="id-e21") + d = e21_create_prepare( + runtime, + node=node_e21, + create_enabled=True, + data_present=True, + create_id_resolve_ok=False, + ) + record(node_e21, d) + + # E41: create success normalize to update entry + node_e41 = _new_node("e41", action=SyncAction.CREATE, status=SyncStatus.SUCCESS, binding_status=BindingStatus.NORMAL) + _set_state(runtime, node_e41, "S11C", data_id="id-e41") + d = e41_post_create_ready(runtime, node=node_e41, execute_action="CREATE") + record(node_e41, d) + assert d.to_state == "S01" + + # E30 outcomes (from S01 only) + source = _new_node("e30_source_1") + target = _new_node("e30_target_1") + _set_state(runtime, source, "S01", data_id="id-s1") + _set_state(runtime, target, "S01", data_id="id-t1") + d = e30_update_prepare( + runtime, + source_node=source, + target_node=target, + update_enabled=True, + target_has_data_id=False, + update_id_resolve_ok=False, + has_diff=False, + ) + record(target, d) + + source = _new_node("e30_source_2") + target = _new_node("e30_target_2") + _set_state(runtime, source, "S01", data_id="id-s2") + _set_state(runtime, target, "S01", data_id="id-t2") + d = e30_update_prepare( + runtime, + source_node=source, + target_node=target, + update_enabled=True, + target_has_data_id=True, + update_id_resolve_ok=False, + has_diff=False, + ) + record(target, d) + + source = _new_node("e30_source_3") + target = _new_node("e30_target_3") + _set_state(runtime, source, "S01", data_id="id-s3") + _set_state(runtime, target, "S01", data_id="id-t3") + d = e30_update_prepare( + runtime, + source_node=source, + target_node=target, + update_enabled=True, + target_has_data_id=True, + update_id_resolve_ok=True, + has_diff=True, + ) + record(target, d) + + # E40 outcomes (all branches) + node = _new_node("e40_timeout", action=SyncAction.CREATE, status=SyncStatus.IN_PROGRESS) + _set_state(runtime, node, "S10C", data_id="") + d = e40_sync_execute( + runtime, + node=node, + handler_result="FAILED", + action="CREATE", + poll_timeout=True, + ) + assert d is not None + assert d.to_state == "S12C" + record(node, d) + + node = _new_node("e40_success", action=SyncAction.CREATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S06", data_id="") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SUCCESS", + action="CREATE", + poll_timeout=False, + result_data_id="created-001", + ) + assert d is not None + assert node.data_id == "created-001" + record(node, d) + + node = _new_node("e40_failed", action=SyncAction.UPDATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S07", data_id="id-upd") + d = e40_sync_execute( + runtime, + node=node, + handler_result="FAILED", + action="UPDATE", + poll_timeout=False, + ) + assert d is not None + assert d.to_state == "S12U" + record(node, d) + + node = _new_node("e40_delete_failed", action=SyncAction.DELETE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S09", data_id="id-del-failed") + d = e40_sync_execute( + runtime, + node=node, + handler_result="FAILED", + action="DELETE", + poll_timeout=False, + ) + assert d is not None + assert d.to_state == "S12D" + record(node, d) + + node = _new_node("e40_update_success", action=SyncAction.UPDATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S07", data_id="id-upd-success") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SUCCESS", + action="UPDATE", + poll_timeout=False, + ) + assert d is not None + record(node, d) + + node = _new_node("e40_inprogress", action=SyncAction.CREATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S06", data_id="") + d = e40_sync_execute( + runtime, + node=node, + handler_result="IN_PROGRESS", + action="CREATE", + poll_timeout=False, + ) + assert d is not None + assert d.to_state == "S10C" + record(node, d) + + node = _new_node("e40_update_inprogress", action=SyncAction.UPDATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S07", data_id="id-upd-ip") + d = e40_sync_execute( + runtime, + node=node, + handler_result="IN_PROGRESS", + action="UPDATE", + poll_timeout=False, + ) + assert d is not None + assert d.to_state == "S10U" + record(node, d) + + node = _new_node("e40_delete_inprogress", action=SyncAction.DELETE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S09", data_id="id-del-ip") + d = e40_sync_execute( + runtime, + node=node, + handler_result="IN_PROGRESS", + action="DELETE", + poll_timeout=False, + ) + assert d is not None + assert d.to_state == "S10D" + record(node, d) + + node = _new_node("e40_update_success_from_ip", action=SyncAction.UPDATE, status=SyncStatus.IN_PROGRESS) + _set_state(runtime, node, "S10U", data_id="id-upd-ip2") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SUCCESS", + action="UPDATE", + poll_timeout=False, + ) + assert d is not None + record(node, d) + + node = _new_node("e40_delete_success_from_ip", action=SyncAction.DELETE, status=SyncStatus.IN_PROGRESS) + _set_state(runtime, node, "S10D", data_id="id-del-ip2") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SUCCESS", + action="DELETE", + poll_timeout=False, + ) + assert d is not None + record(node, d) + + node = _new_node("e40_skip_update", action=SyncAction.UPDATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S07", data_id="id-upd") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SKIPPED", + action="UPDATE", + poll_timeout=False, + ) + assert d is not None + record(node, d) + + node_e40_delete_success = _new_node("e40_delete_success", action=SyncAction.DELETE, status=SyncStatus.PENDING) + _set_state(runtime, node_e40_delete_success, "S09", data_id="id-e40-del") + d = e40_sync_execute( + runtime, + node=node_e40_delete_success, + handler_result="SUCCESS", + action="DELETE", + poll_timeout=False, + ) + record(node_e40_delete_success, d) + assert d is not None and d.to_state == "S11D" + + node_e40_delete_skipped = _new_node("e40_delete_skipped", action=SyncAction.DELETE, status=SyncStatus.PENDING) + _set_state(runtime, node_e40_delete_skipped, "S09", data_id="id-e40-del-s") + d = e40_sync_execute( + runtime, + node=node_e40_delete_skipped, + handler_result="SKIPPED", + action="DELETE", + poll_timeout=False, + ) + assert d is None + + node = _new_node("e40_skip_create", action=SyncAction.CREATE, status=SyncStatus.PENDING) + _set_state(runtime, node, "S06", data_id="") + d = e40_sync_execute( + runtime, + node=node, + handler_result="SKIPPED", + action="CREATE", + poll_timeout=False, + ) + assert d is None + + expected_events = set(cfg.transitions.keys()) + expected_states: set[str] = set() + for transition in cfg.transitions.values(): + expected_states.update(transition.from_states) + for outcome in transition.outcomes: + if outcome.to: + expected_states.add(outcome.to) + + assert covered_events == expected_events + assert expected_states <= covered_states + + assert transition_lines, "state-machine transition log should not be empty" + pattern = re.compile(r"状态机流转: S\d{2}[A-Z]? --E\d{2}\[\d+\]--> S\d{2}[A-Z]?") + assert any(pattern.search(line) for line in transition_lines) + + REPORT_DIR.mkdir(parents=True, exist_ok=True) + report_file = REPORT_DIR / "mock_full_event_state_transitions.txt" + report_file.write_text("\n".join(transition_lines), encoding="utf-8") + report_table = REPORT_DIR / "mock_full_event_state_transitions_table.tsv" + report_table.write_text("\n".join(transition_rows), encoding="utf-8") + print(f"[TEST-REPORT] Full event/state transition log written to: {report_file}") + print(f"[TEST-REPORT] Full event/state transition table written to: {report_table}") + + +@pytest.mark.asyncio +async def test_sync_log_cleared_on_initial_load(tmp_path: Path) -> None: + REPORT_DIR.mkdir(parents=True, exist_ok=True) + db = tmp_path / "sync_log_clear_state.db" + + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + collection = DataCollection("project-log-clear", persistence=persistence, auto_persist=False) + + node = ProjectSyncNode( + node_id="log-node", + data_id="proj-1", + data={ + "id": "proj-1", + "type": "project", + "name": "Log Project", + "code": "P-LOG", + "status": "active", + "progress_type": "C", + "project_type": "onshore_wind", + }, + action=SyncAction.CREATE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.NORMAL, + ) + node.append_log("old lifecycle") + + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + d1 = e01_bootstrap(runtime, node=node, is_create_zombie=False) + d2 = e10_bind_core(runtime, node=node, has_binding_record=False) + assert d1.to_state == "S00" + assert d2.to_state == "S02" + + await collection.add(node) + await collection.persist() + + before_reload_report = REPORT_DIR / "db_sync_log_before_reload.txt" + before_reload_report.write_text( + _dump_db_sync_logs(db, collection_id="project-log-clear"), + encoding="utf-8", + ) + print(f"[TEST-REPORT] DB sync_log snapshot before reload: {before_reload_report}") + + reloaded = DataCollection("project-log-clear", persistence=persistence, auto_persist=False) + await reloaded.load_from_persistence() + loaded_node = reloaded.get("log-node") + assert loaded_node is not None + assert loaded_node.sync_log is None + + in_memory_after_reload_report = REPORT_DIR / "in_memory_sync_log_after_reload.txt" + in_memory_after_reload_report.write_text( + f"node_id=log-node\nsync_log={loaded_node.sync_log}\n", + encoding="utf-8", + ) + print(f"[TEST-REPORT] In-memory sync_log snapshot after reload: {in_memory_after_reload_report}") + + await reloaded.persist() + after_reload_persist_report = REPORT_DIR / "db_sync_log_after_reload_persist.txt" + after_reload_persist_report.write_text( + _dump_db_sync_logs(db, collection_id="project-log-clear"), + encoding="utf-8", + ) + print(f"[TEST-REPORT] DB sync_log snapshot after reload+persist: {after_reload_persist_report}") + + await persistence.close() + + +@pytest.mark.asyncio +async def test_load_preserves_state_then_e01_normalizes_to_s00(tmp_path: Path) -> None: + REPORT_DIR.mkdir(parents=True, exist_ok=True) + db = tmp_path / "load_preserve_then_e01_normalize.db" + + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + + collection = DataCollection("project-e01-normalize", persistence=persistence, auto_persist=False) + node = ProjectSyncNode( + node_id="normalize-node", + data_id="proj-normalize-1", + data={ + "id": "proj-normalize-1", + "type": "project", + "name": "Normalize Project", + "code": "P-NORMALIZE", + "status": "active", + "progress_type": "C", + "project_type": "onshore_wind", + }, + action=SyncAction.UPDATE, + status=SyncStatus.FAILED, + binding_status=BindingStatus.WARNING, + error="last run failed", + ) + await collection.add(node) + await collection.persist() + + reloaded = DataCollection("project-e01-normalize", persistence=persistence, auto_persist=False) + await reloaded.load_from_persistence() + loaded_node = reloaded.get("normalize-node") + assert loaded_node is not None + + # 加载阶段保留持久化状态 + assert loaded_node.action == SyncAction.UPDATE + assert loaded_node.status == SyncStatus.FAILED + assert loaded_node.binding_status == BindingStatus.WARNING + assert loaded_node.error == "last run failed" + + # E01 后归并到 S00,并清空历史 error + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + decision = e01_bootstrap(runtime, node=loaded_node, is_create_zombie=False) + assert decision.to_state == "S00" + assert loaded_node.binding_status == BindingStatus.UNCHECKED + assert loaded_node.action == SyncAction.NONE + assert loaded_node.status == SyncStatus.PENDING + assert loaded_node.error is None + + await persistence.close() + + +@pytest.mark.asyncio +async def test_invalid_persisted_enum_is_bootstrap_blocked_and_skipped_in_reset(tmp_path: Path) -> None: + REPORT_DIR.mkdir(parents=True, exist_ok=True) + db = tmp_path / "invalid_enum_bootstrap_blocked.db" + + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + + collection_id = "project-invalid-enum" + collection = DataCollection(collection_id, persistence=persistence, auto_persist=False) + node = ProjectSyncNode( + node_id="invalid-enum-node", + data_id="proj-invalid-1", + data={ + "id": "proj-invalid-1", + "type": "project", + "name": "Invalid Enum Project", + "code": "P-INV", + "status": "active", + "progress_type": "C", + "project_type": "onshore_wind", + }, + action=SyncAction.UPDATE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.NORMAL, + ) + await collection.add(node) + await collection.persist() + + conn = sqlite3.connect(str(db)) + try: + conn.execute( + "UPDATE nodes SET action = ?, status = ?, binding_status = ? WHERE collection_id = ? AND node_id = ?", + ("BAD_ACTION", "BAD_STATUS", "BAD_BINDING", collection_id, "invalid-enum-node"), + ) + conn.commit() + finally: + conn.close() + + reloaded = DataCollection(collection_id, persistence=persistence, auto_persist=False) + await reloaded.load_from_persistence() + loaded_node = reloaded.get("invalid-enum-node") + assert loaded_node is not None + + assert reloaded.is_bootstrap_blocked(loaded_node) + assert loaded_node.action == SyncAction.NONE + assert loaded_node.status == SyncStatus.FAILED + assert loaded_node.binding_status == BindingStatus.ABNORMAL + assert loaded_node.error is not None and "LOAD_INVALID_ENUM" in loaded_node.error + + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + binding_manager = BindingManager(persistence, auto_persist=False) + remote_collection = DataCollection("empty-remote", persistence=persistence, auto_persist=False) + cleaned = await run_phase2_cleanup( + node_types=["project"], + local_collection=reloaded, + remote_collection=remote_collection, + binding_manager=binding_manager, + runtime=runtime, + ) + assert cleaned == 0 + assert reloaded.get("invalid-enum-node") is not None + + await persistence.close() + + +@pytest.mark.asyncio +async def test_collection_filter_by_state_ids_excludes_bootstrap_blocked_by_default() -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + collection = DataCollection("state-filter-demo", persistence=None, auto_persist=False) + collection.set_state_machine_runtime(runtime) + + node_s00 = MockSyncNode( + node_id="s00-node", + data_id="id-s00", + data={"id": "id-s00", "name": "s00"}, + binding_status=BindingStatus.UNCHECKED, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + context={}, + ) + blocked_s00 = MockSyncNode( + node_id="s00-blocked", + data_id="id-s00-blocked", + data={"id": "id-s00-blocked", "name": "blocked"}, + binding_status=BindingStatus.UNCHECKED, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + context={"bootstrap_blocked": True}, + ) + + await collection.add(node_s00) + await collection.add(blocked_s00) + + visible = collection.filter_by_state_ids(state_ids=["S00"]) + visible_ids = {n.node_id for n in visible} + assert "s00-node" in visible_ids + assert "s00-blocked" not in visible_ids + + all_with_blocked = collection.filter_by_state_ids( + state_ids=["S00"], + include_bootstrap_blocked=True, + ) + all_ids = {n.node_id for n in all_with_blocked} + assert "s00-node" in all_ids + assert "s00-blocked" in all_ids diff --git a/tests/integration/test_state_event_coverage.py b/tests/integration/test_state_event_coverage.py new file mode 100644 index 0000000..a4238a9 --- /dev/null +++ b/tests/integration/test_state_event_coverage.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from pathlib import Path + +from sync_state_machine.engine import StateMachineConfig + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def test_state_and_event_coverage_contract() -> None: + cfg = StateMachineConfig.load(CFG_PATH) + + transitions = cfg.raw.get("transitions", {}) + states = cfg.raw.get("states", {}) + pseudo_states = cfg.raw.get("pseudo_states", {}) + + all_events = set(transitions.keys()) if isinstance(transitions, dict) else set() + assert all_events == set(cfg.transitions.keys()) + + touched_states: set[str] = set() + for transition in cfg.transitions.values(): + touched_states.update(s for s in transition.from_states if s != "*") + for outcome in transition.outcomes: + if outcome.to: + touched_states.add(outcome.to) + + declared_states = set(states.keys()) | set(pseudo_states.keys()) + # 允许仅作为注释阶段使用的状态极少数暂不触发,但要求覆盖率至少95% + coverage = len(touched_states & declared_states) / max(1, len(declared_states)) + assert coverage >= 0.95 diff --git a/tests/integration/test_strategy_business_points_migrated.py b/tests/integration/test_strategy_business_points_migrated.py new file mode 100644 index 0000000..19b8f8c --- /dev/null +++ b/tests/integration/test_strategy_business_points_migrated.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +import tempfile +from pathlib import Path + +import pytest +import pytest_asyncio + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.sync_system.resolve_ids import IDResolver +from sync_state_machine.sync_system.config import OrphanAction, UpdateDirection +from sync_state_machine.sync_system.strategy_ops.bind_ops import ( + phase_auto_binding, + phase_core_state, + phase_dependency_check, +) +from tests.fixtures.mock_domain import ( + TestContractNode, + TestProjectNode, + TestContractStrategy, + TestProjectStrategy, + build_contract_node, + build_project_node, + register_test_domain, +) + + +@pytest_asyncio.fixture +async def setup_env(): + register_test_domain() + db = Path(tempfile.mkdtemp(prefix="sync_state_machine_biz_") ) / "state.db" + persistence = PersistenceBackend(str(db)) + await persistence.initialize() + + local = DataCollection("local", persistence=persistence, auto_persist=False) + remote = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + yield local, remote, binding_manager, persistence + await persistence.close() + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "name,has_binding,local_data,remote_data,expected_local,expected_remote", + [ + ("bind_yes_yes_yes", True, True, True, BindingStatus.NORMAL, BindingStatus.NORMAL), + ("bind_yes_yes_no", True, True, False, BindingStatus.WARNING, BindingStatus.ABNORMAL), + ("bind_yes_no_yes", True, False, True, BindingStatus.ABNORMAL, BindingStatus.WARNING), + ("bind_yes_no_no", True, False, False, BindingStatus.ABNORMAL, BindingStatus.ABNORMAL), + ("bind_no_local_only", False, True, None, BindingStatus.MISSING, None), + ("bind_no_remote_only", False, None, True, None, BindingStatus.MISSING), + ], +) +async def test_core_binding_matrix_migrated( + setup_env, + name: str, + has_binding: bool, + local_data: bool | None, + remote_data: bool | None, + expected_local: BindingStatus | None, + expected_remote: BindingStatus | None, +): + local, remote, bm, _ = setup_env + strategy = TestProjectStrategy("test_project", local, remote, bm) + + if local_data is not None: + await local.add( + build_project_node( + f"{name}_l", + f"L-{name}", + name=f"Local {name}", + code=f"LC-{name}", + data_present=local_data, + ) + ) + if remote_data is not None: + await remote.add( + build_project_node( + f"{name}_r", + f"R-{name}", + name=f"Remote {name}", + code=f"RC-{name}", + data_present=remote_data, + ) + ) + + if has_binding: + await bm.bind("test_project", f"{name}_l", f"{name}_r") + + await phase_core_state( + strategy, + local.filter(node_type="test_project"), + remote.filter(node_type="test_project"), + ) + + if expected_local is not None: + assert local.get(f"{name}_l").binding_status == expected_local + if expected_remote is not None: + assert remote.get(f"{name}_r").binding_status == expected_remote + + +@pytest.mark.asyncio +async def test_dependency_resolution_migrated(setup_env): + local, remote, bm, _ = setup_env + + project_strategy = TestProjectStrategy("test_project", local, remote, bm) + project_strategy.update_config(depend_fields={}) + + await local.add(build_project_node("proj_l", "P-1", name="Project A", code="P-A")) + await remote.add(build_project_node("proj_r", "P-1-R", name="Project A", code="P-A")) + await bm.bind("test_project", "proj_l", "proj_r") + + await phase_core_state( + project_strategy, + local.filter(node_type="test_project"), + remote.filter(node_type="test_project"), + ) + assert local.get("proj_l").binding_status == BindingStatus.NORMAL + + contract_strategy = TestContractStrategy("test_contract", local, remote, bm) + contract_strategy.update_config( + depend_fields={"project_ref": "test_project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.PUSH, + ) + + await local.add( + build_contract_node( + "contract_ok", + "C-OK", + name="Contract OK", + code="C-OK", + project_ref="P-1", + ) + ) + await local.add( + build_contract_node( + "contract_bad", + "C-BAD", + name="Contract Bad", + code="C-BAD", + project_ref="P-NOPE", + ) + ) + + local_contracts = local.filter(node_type="test_contract") + remote_contracts = remote.filter(node_type="test_contract") + await phase_core_state(contract_strategy, local_contracts, remote_contracts) + await phase_dependency_check(contract_strategy, local_contracts, remote_contracts) + + assert local.get("contract_ok").binding_status == BindingStatus.MISSING + assert local.get("contract_ok").depend_ids == ["proj_l"] + assert local.get("contract_bad").binding_status == BindingStatus.DEPENDENCY_ERROR + + +@pytest.mark.asyncio +async def test_auto_binding_migrated(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config(auto_bind=True, auto_bind_fields=["code"], depend_fields={}) + + await local.add(build_project_node("l1", "P1", name="A", code="AUTO-1")) + await remote.add(build_project_node("r1", "RP1", name="A", code="AUTO-1")) + + await strategy.bind() + + assert await bm.get_remote_id("test_project", "l1") == "r1" + assert await bm.get_local_id("test_project", "r1") == "l1" + + +@pytest.mark.asyncio +async def test_auto_binding_skip_on_ambiguous_migrated(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config(auto_bind=True, auto_bind_fields=["code"], depend_fields={}) + + await local.add(build_project_node("l1", "P1", name="A", code="AMB-1")) + await local.add(build_project_node("l2", "P2", name="A", code="AMB-1")) + await remote.add(build_project_node("r1", "RP1", name="A", code="AMB-1")) + + await strategy.bind() + + assert await bm.get_remote_id("test_project", "l1") is None + assert await bm.get_remote_id("test_project", "l2") is None + assert await bm.get_local_id("test_project", "r1") is None + + +@pytest.mark.asyncio +async def test_pre_bind_data_id_works_when_auto_bind_disabled(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config( + auto_bind=False, + auto_bind_fields=[], + pre_bind_data_id=[{"local_data_id": "PRE-DID-1", "remote_data_id": "PRE-DID-R-1"}], + depend_fields={}, + ) + + await local.add(build_project_node("pre_l1", "PRE-DID-1", name="Local A", code="LOCAL-ONLY")) + await remote.add(build_project_node("pre_r1", "PRE-DID-R-1", name="Remote A", code="REMOTE-ONLY")) + + await strategy.bind() + + assert await bm.get_remote_id("test_project", "pre_l1") == "pre_r1" + assert await bm.get_local_id("test_project", "pre_r1") == "pre_l1" + assert local.get("pre_l1").binding_status == BindingStatus.NORMAL + assert remote.get("pre_r1").binding_status == BindingStatus.NORMAL + + +@pytest.mark.asyncio +async def test_dependency_check_data_missing_goes_abnormal(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestContractStrategy("test_contract", local, remote, bm) + strategy.update_config(depend_fields={"project_ref": "test_project"}) + + await local.add( + build_contract_node( + "contract_no_data", + "C-NODATA", + name="Contract No Data", + code="C-NODATA", + project_ref="P-1", + data_present=False, + ) + ) + + local_contracts = local.filter(node_type="test_contract") + await phase_core_state(strategy, local_contracts, []) + await phase_dependency_check(strategy, local_contracts, []) + + assert local.get("contract_no_data").binding_status == BindingStatus.ABNORMAL + + +@pytest.mark.asyncio +async def test_auto_binding_key_missing_migrated(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config(auto_bind=True, auto_bind_fields=["code", "never_exists"], depend_fields={}) + + await local.add(build_project_node("km_l", "KM-L", name="KM", code="KM-1")) + + await strategy.bind() + + node = local.get("km_l") + assert node.binding_status == BindingStatus.WARNING + assert "缺少业务键字段" in (node.error or "") + + +@pytest.mark.asyncio +async def test_auto_binding_key_id_resolve_fail_migrated(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config( + auto_bind=True, + auto_bind_fields=["id", "code"], + depend_fields={"id": "test_project"}, + ) + + await local.add(build_project_node("kid_l", "KID-L", name="KID", code="KID-1")) + + local_nodes = local.filter(node_type="test_project") + await phase_core_state(strategy, local_nodes, []) + await phase_auto_binding(strategy, local_nodes, []) + + node = local.get("kid_l") + assert node.binding_status == BindingStatus.DEPENDENCY_ERROR + assert "业务键中的ID字段解析失败" in (node.error or "") + + +@pytest.mark.asyncio +async def test_create_prepare_e21_on_id_resolve_fail(setup_env, monkeypatch: pytest.MonkeyPatch): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config( + auto_bind=True, + auto_bind_fields=["code"], + depend_fields={"dummy_id": "test_project"}, + local_orphan_action=OrphanAction.CREATE_REMOTE, + remote_orphan_action=OrphanAction.NONE, + update_direction=UpdateDirection.NONE, + ) + + async def _always_fail_resolve_and_validate(self, data, node_type, depend_fields, to_remote): + return None, "forced resolve fail" + + monkeypatch.setattr(IDResolver, "resolve_and_validate", _always_fail_resolve_and_validate) + + node = TestProjectNode( + node_id="create_fail_src", + data_id="C-CREATE-FAIL", + data={"id": "C-CREATE-FAIL", "name": "Create Fail", "code": "CF-1"}, + binding_status=BindingStatus.UNCHECKED, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + ) + await local.add(node) + await strategy.bind() + + created_nodes = await strategy.create() + + assert created_nodes == [] + failed_node = local.get("create_fail_src") + assert failed_node is not None + assert failed_node.binding_status == BindingStatus.PEER_CREATING + assert "spawn_failed" in (failed_node.error or "") + + +@pytest.mark.asyncio +async def test_update_prepare_target_missing_data_id_goes_precondition_failed(setup_env): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config(update_direction=UpdateDirection.PUSH, depend_fields={}) + + local_src = TestProjectNode( + node_id="upd_src", + data_id="UPD-SRC", + data={"id": "UPD-SRC", "name": "Project New", "code": "UPD-1"}, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + ) + remote_target = TestProjectNode( + node_id="upd_tgt", + data_id="", + data={"id": "UPD-TGT", "name": "Project Old", "code": "UPD-1"}, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + ) + await local.add(local_src) + await remote.add(remote_target) + await bm.bind("test_project", "upd_src", "upd_tgt") + + updated_nodes = await strategy.update() + + assert updated_nodes == [] + target = remote.get("upd_tgt") + assert target.status == SyncStatus.PRECONDITION_FAILED + assert target.action == SyncAction.UPDATE + + +@pytest.mark.asyncio +async def test_update_prepare_e30b_on_id_resolve_fail(setup_env, monkeypatch: pytest.MonkeyPatch): + local, remote, bm, _ = setup_env + + strategy = TestProjectStrategy("test_project", local, remote, bm) + strategy.update_config( + depend_fields={"dummy_id": "test_project"}, + update_direction=UpdateDirection.PUSH, + ) + + async def _always_fail_resolve_and_validate(self, data, node_type, depend_fields, to_remote): + return None, "forced resolve fail" + + monkeypatch.setattr(IDResolver, "resolve_and_validate", _always_fail_resolve_and_validate) + + local_src = TestProjectNode( + node_id="upd_b_src", + data_id="UPDB-SRC", + data={"id": "UPDB-SRC", "name": "Project New", "code": "UPDB-1"}, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + ) + remote_target = TestProjectNode( + node_id="upd_b_tgt", + data_id="UPDB-TGT", + data={"id": "UPDB-TGT", "name": "Project Old", "code": "UPDB-1"}, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + ) + await local.add(local_src) + await remote.add(remote_target) + await bm.bind("test_project", "upd_b_src", "upd_b_tgt") + + updated_nodes = await strategy.update() + + assert updated_nodes == [] + target = remote.get("upd_b_tgt") + assert target.status == SyncStatus.PRECONDITION_FAILED + assert target.action == SyncAction.UPDATE diff --git a/tests/integration/test_toolchain_config_and_graph.py b/tests/integration/test_toolchain_config_and_graph.py new file mode 100644 index 0000000..e99444c --- /dev/null +++ b/tests/integration/test_toolchain_config_and_graph.py @@ -0,0 +1,27 @@ +from __future__ import annotations + +from pathlib import Path + +from tools.render_graph import render_mermaid +from tools.validate_config import validate_config + + +ROOT = Path(__file__).resolve().parents[2] +CFG_PATH = ROOT / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def test_validate_config_has_no_errors() -> None: + problems, _cfg = validate_config(CFG_PATH) + errors = [p for p in problems if p.level == "ERROR"] + assert not errors + + +def test_render_mermaid_contains_core_edges() -> None: + problems, cfg = validate_config(CFG_PATH) + errors = [p for p in problems if p.level == "ERROR"] + assert not errors + + mermaid = render_mermaid(cfg) + assert "flowchart LR" in mermaid + assert "S02 -- \"E16" in mermaid + assert "S06 -- \"E40" in mermaid diff --git a/tests/integration/test_ui_api_smoke.py b/tests/integration/test_ui_api_smoke.py new file mode 100644 index 0000000..5e919bc --- /dev/null +++ b/tests/integration/test_ui_api_smoke.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +from fastapi.testclient import TestClient + +from ui.app import create_app + + +def test_ui_api_smoke() -> None: + app = create_app() + client = TestClient(app) + + status_resp = client.get("/api/status") + assert status_resp.status_code == 200 + status_data = status_resp.json() + assert "running" in status_data + assert "last_error" in status_data + + cfg_resp = client.get("/api/config/default") + assert cfg_resp.status_code == 200 + cfg_data = cfg_resp.json() + assert "mode" in cfg_data + assert "node_types" in cfg_data + assert isinstance(cfg_data["node_types"], list) diff --git a/tests/mocks/__init__.py b/tests/mocks/__init__.py new file mode 100644 index 0000000..eb95964 --- /dev/null +++ b/tests/mocks/__init__.py @@ -0,0 +1 @@ +"""Mock components for sync_state_machine tests.""" diff --git a/tests/mocks/mock_datasource.py b/tests/mocks/mock_datasource.py new file mode 100644 index 0000000..a9041df --- /dev/null +++ b/tests/mocks/mock_datasource.py @@ -0,0 +1,113 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Dict, List, Optional + +from pydantic import BaseModel + +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.datasource.task_result import TaskResult + + +class MockSchema(BaseModel): + id: Optional[str] = None + name: str = "mock" + + +class MockSyncNode(SyncNode[MockSchema]): + node_type = "mock" + schema = MockSchema + + +@dataclass +class HandlerScript: + create: str = "success" # success | failed | skipped | in_progress + update: str = "success" + delete: str = "success" + poll_sequence: List[str] = field(default_factory=lambda: ["success"]) # success | failed | in_progress + + +class ScriptedMockHandler: + def __init__(self, script: HandlerScript): + self._script = script + self._collection = None + self._poll_index = 0 + + @property + def node_type(self) -> str: + return "mock" + + @property + def node_class(self): + return MockSyncNode + + @property + def schema(self): + return MockSchema + + def set_collection(self, collection): + self._collection = collection + + async def load(self): + return [] + + async def create_all(self, nodes): + return [self._build_result(self._script.create, node.node_id, "create") for node in nodes] + + async def update_all(self, nodes): + return [ + self._build_result( + self._script.update, + node.node_id, + "update", + ) + for node in nodes + ] + + async def delete_all(self, nodes): + return [self._build_result(self._script.delete, node.node_id, "delete") for node in nodes] + + async def poll_tasks(self, task_ids: List[str]) -> Dict[str, TaskResult]: + status = self._script.poll_sequence[min(self._poll_index, len(self._script.poll_sequence) - 1)] + self._poll_index += 1 + out: Dict[str, TaskResult] = {} + for task_id in task_ids: + out[task_id] = self._build_poll_result(status, task_id) + return out + + def _build_result( + self, + mode: str, + node_id: str, + phase: str, + ) -> TaskResult: + if mode == "success": + return TaskResult.success(node_id=node_id, data_id=f"{phase}-{node_id}") + if mode == "failed": + return TaskResult.failed(node_id=node_id, error=f"{phase} failed") + if mode == "skipped": + return TaskResult.skipped( + node_id=node_id, + reason=f"{phase} skipped", + ) + if mode == "in_progress": + return TaskResult.in_progress(node_id=node_id, task_id=f"task-{phase}-{node_id}") + raise ValueError(f"Unsupported mode: {mode}") + + def _build_poll_result(self, mode: str, task_id: str) -> TaskResult: + if mode == "success": + return TaskResult.success(node_id=self._node_id_from_task(task_id), data_id=f"done-{task_id}") + if mode == "failed": + return TaskResult.failed(node_id=self._node_id_from_task(task_id), error="poll failed") + if mode == "in_progress": + return TaskResult.in_progress(node_id=self._node_id_from_task(task_id), task_id=task_id) + raise ValueError(f"Unsupported poll mode: {mode}") + + @staticmethod + def _node_id_from_task(task_id: str) -> str: + return task_id.split("-")[-1] + + +class MockDataSource(BaseDataSource): + pass diff --git a/tests/unit/project_detail_upsert/test_project_detail_upsert_poll.py b/tests/unit/project_detail_upsert/test_project_detail_upsert_poll.py new file mode 100644 index 0000000..cde8003 --- /dev/null +++ b/tests/unit/project_detail_upsert/test_project_detail_upsert_poll.py @@ -0,0 +1,357 @@ +from __future__ import annotations + +from typing import Any, Dict, List + +import pytest +from pydantic import BaseModel + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.domain.project.api_handler import ProjectApiHandler +from sync_state_machine.domain.project_detail.api_handler import ProjectDetailApiHandler +from sync_state_machine.domain.project_detail.sync_node import ProjectDetailSyncNode +from sync_state_machine.datasource.task_result import TaskStatus + + +class _ProjectSchema(BaseModel): + id: str + + +class _ProjectNode(SyncNode[_ProjectSchema]): + node_type = "project" + schema = _ProjectSchema + + +class _MockApiClient: + def __init__(self): + self.requests: List[Dict[str, Any]] = [] + self.push_logs: Dict[str, Dict[str, Any]] = {} + self.all_info_calls: List[str] = [] + + async def request(self, method: str, endpoint: str, params: Dict[str, Any] | None = None, data: Dict[str, Any] | None = None, **kwargs): + if method == "GET" and endpoint == "/project/all_info": + project_id = (params or {}).get("project_id") + if project_id: + self.all_info_calls.append(str(project_id)) + self.requests.append( + { + "method": method, + "endpoint": endpoint, + "params": params, + "data": data, + } + ) + return {"code": 200, "data": {"biz_id": (data or {}).get("biz_id")}} + + async def get_push_logs(self, task_ids: List[str]) -> Dict[str, Dict[str, Any]]: + return {task_id: self.push_logs.get(task_id, {}) for task_id in task_ids} + + +def _build_project_node(*, node_id: str, project_id: str, all_info: Dict[str, Any]) -> _ProjectNode: + return _ProjectNode( + node_id=node_id, + data_id=project_id, + data={"id": project_id}, + context={"all_info": all_info}, + ) + + +def _build_project_detail_node(*, node_id: str, data_id: str, project_id: str, key: str, capacity: float = 12.3) -> ProjectDetailSyncNode: + payload = { + "id": data_id, + "project_id": project_id, + "key": key, + "value": [{"date": "2026-01-01", "capacity": capacity}], + } + return ProjectDetailSyncNode(node_id=node_id, data_id=data_id, data=payload) + + +def _patch_project_all_info_lookup( + monkeypatch: pytest.MonkeyPatch, + *, + collection: DataCollection, + call_recorder: List[str] | None = None, +) -> None: + async def _fake_get_all_info(cls, _client, project_id: str): + if call_recorder is not None: + call_recorder.append(project_id) + node = collection.get_by_data_id("project", project_id) + assert node is not None + return node.context.get("all_info", {}) + + monkeypatch.setattr(ProjectApiHandler, "get_all_info", classmethod(_fake_get_all_info)) + + +@pytest.mark.asyncio +async def test_create_all_uses_project_update_endpoint_and_returns_in_progress() -> None: + collection = DataCollection("remote") + project = _build_project_node(node_id="p-node", project_id="project-1", all_info={"project_detail": []}) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + + node = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + ) + + results = await handler.create_all([node]) + + assert len(results) == 1 + assert results[0].status == TaskStatus.IN_PROGRESS + assert isinstance(results[0].task_id, str) and results[0].task_id + + req = handler.api_client.requests[-1] + assert req["method"] == "PUT" + assert req["endpoint"] == "/project/plan_construction" + + +@pytest.mark.asyncio +async def test_poll_tasks_backfills_real_data_id_from_project_all_info(monkeypatch: pytest.MonkeyPatch) -> None: + collection = DataCollection("remote") + project = _build_project_node( + node_id="p-node", + project_id="project-1", + all_info={ + "project_detail": [ + { + "id": "remote-detail-1", + "project_id": "project-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 13.0}], + } + ] + }, + ) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + _patch_project_all_info_lookup(monkeypatch, collection=collection) + + node = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + ) + + create_result = (await handler.create_all([node]))[0] + assert create_result.task_id + + handler.api_client.push_logs[create_result.task_id] = {"code": 200, "data": {"biz_id": "project-1"}} + + polled = await handler.poll_tasks([create_result.task_id]) + final = polled[create_result.task_id] + + assert final.status == TaskStatus.SUCCESS + assert final.data_id == "remote-detail-1" + + +@pytest.mark.asyncio +async def test_poll_tasks_fails_when_all_info_missing_detail(monkeypatch: pytest.MonkeyPatch) -> None: + collection = DataCollection("remote") + project = _build_project_node(node_id="p-node", project_id="project-1", all_info={"project_detail": []}) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + _patch_project_all_info_lookup(monkeypatch, collection=collection) + + node = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + ) + + create_result = (await handler.create_all([node]))[0] + assert create_result.task_id + handler.api_client.push_logs[create_result.task_id] = {"code": 200, "data": {"biz_id": "project-1"}} + + polled = await handler.poll_tasks([create_result.task_id]) + final = polled[create_result.task_id] + + assert final.status == TaskStatus.FAILED + assert "project_detail not found in all_info" in (final.error or "") + + +@pytest.mark.asyncio +async def test_poll_tasks_fails_when_project_detail_has_duplicate_same_key(monkeypatch: pytest.MonkeyPatch) -> None: + collection = DataCollection("remote") + project = _build_project_node( + node_id="p-node", + project_id="project-1", + all_info={ + "project_detail": [ + { + "id": "remote-detail-1", + "project_id": "project-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 13.0}], + }, + { + "id": "remote-detail-2", + "project_id": "project-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 14.0}], + }, + ] + }, + ) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + _patch_project_all_info_lookup(monkeypatch, collection=collection) + + node = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + ) + + create_result = (await handler.create_all([node]))[0] + assert create_result.task_id + handler.api_client.push_logs[create_result.task_id] = {"code": 200, "data": {"biz_id": "project-1"}} + + polled = await handler.poll_tasks([create_result.task_id]) + final = polled[create_result.task_id] + + assert final.status == TaskStatus.FAILED + assert "duplicated" in (final.error or "") + + +@pytest.mark.asyncio +async def test_create_all_marks_duplicate_project_key_in_same_batch_as_error() -> None: + collection = DataCollection("remote") + project = _build_project_node(node_id="p-node", project_id="project-1", all_info={"project_detail": []}) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + + node1 = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + capacity=10.0, + ) + node2 = _build_project_detail_node( + node_id="detail-node-2", + data_id="local-detail-2", + project_id="project-1", + key="plan_construction", + capacity=20.0, + ) + + results = await handler.create_all([node1, node2]) + + assert results[0].status == TaskStatus.IN_PROGRESS + assert results[1].status == TaskStatus.FAILED + assert "Duplicate project_detail_data" in (results[1].error or "") + + +@pytest.mark.asyncio +async def test_create_node_reuses_existing_node_by_project_key_and_rebinds_data_id() -> None: + collection = DataCollection("remote") + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + handler.api_client = _MockApiClient() + + existing = _build_project_detail_node( + node_id="detail-node-old", + data_id="virtual:project_detail_data:project-1:plan_construction", + project_id="project-1", + key="plan_construction", + ) + await collection.add(existing) + + created = handler._create_node( + { + "id": "remote-detail-99", + "project_id": "project-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 21.0}], + } + ) + + assert created.node_id == "detail-node-old" + assert created.data_id == "remote-detail-99" + + +@pytest.mark.asyncio +async def test_poll_tasks_queries_all_info_once_per_project_for_multiple_keys(monkeypatch: pytest.MonkeyPatch) -> None: + collection = DataCollection("remote") + project = _build_project_node( + node_id="p-node", + project_id="project-1", + all_info={"project_detail": []}, + ) + await collection.add(project) + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + client = _MockApiClient() + handler.api_client = client + + node1 = _build_project_detail_node( + node_id="detail-node-1", + data_id="local-detail-1", + project_id="project-1", + key="plan_construction", + ) + node2 = _build_project_detail_node( + node_id="detail-node-2", + data_id="local-detail-2", + project_id="project-1", + key="actual_construction", + ) + + create_results = await handler.create_all([node1, node2]) + task_ids = [r.task_id for r in create_results if r.task_id] + assert len(task_ids) == 2 + + client.push_logs[task_ids[0]] = {"code": 200, "data": {"biz_id": "project-1"}} + client.push_logs[task_ids[1]] = {"code": 200, "data": {"biz_id": "project-1"}} + + project.context["all_info"] = { + "project_detail": [ + { + "id": "remote-detail-1", + "project_id": "project-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 11.0}], + }, + { + "id": "remote-detail-2", + "project_id": "project-1", + "key": "actual_construction", + "value": [{"date": "2026-01-01", "capacity": 22.0}], + }, + ] + } + _patch_project_all_info_lookup( + monkeypatch, + collection=collection, + call_recorder=client.all_info_calls, + ) + + polled = await handler.poll_tasks(task_ids) + + assert polled[task_ids[0]].status == TaskStatus.SUCCESS + assert polled[task_ids[0]].data_id == "remote-detail-1" + assert polled[task_ids[1]].status == TaskStatus.SUCCESS + assert polled[task_ids[1]].data_id == "remote-detail-2" + assert client.all_info_calls == ["project-1"] diff --git a/tests/unit/test_api_client_rate_limit.py b/tests/unit/test_api_client_rate_limit.py new file mode 100644 index 0000000..74ee0d7 --- /dev/null +++ b/tests/unit/test_api_client_rate_limit.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import asyncio +import time + +import pytest + +from sync_state_machine.datasource.api.client import ApiClient + + +class _FakeResponse: + status_code = 200 + + def raise_for_status(self) -> None: + return None + + def json(self) -> dict: + return {"code": 200, "data": []} + + +class _FakeAsyncClient: + def __init__(self) -> None: + self.call_times: list[float] = [] + + async def request(self, **kwargs): + self.call_times.append(time.monotonic()) + return _FakeResponse() + + +@pytest.mark.asyncio +async def test_api_client_global_rate_limit_applies_to_concurrent_requests() -> None: + client = ApiClient( + base_url="http://example.com", + uid="uid", + secret="secret", + rate_limit_max_requests=2, + rate_limit_window_seconds=0.2, + ) + fake_client = _FakeAsyncClient() + client._client = fake_client + + await asyncio.gather( + client.request("GET", "/ping"), + client.request("GET", "/ping"), + client.request("GET", "/ping"), + ) + + assert len(fake_client.call_times) == 3 + third_delay = fake_client.call_times[2] - fake_client.call_times[0] + assert third_delay >= 0.15 diff --git a/tests/unit/test_api_trace_and_load_source_logs.py b/tests/unit/test_api_trace_and_load_source_logs.py new file mode 100644 index 0000000..e221f39 --- /dev/null +++ b/tests/unit/test_api_trace_and_load_source_logs.py @@ -0,0 +1,148 @@ +from __future__ import annotations + +from typing import Any, cast + +import pytest +from pydantic import BaseModel + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.common.types import BindingStatus, SyncStatus +from sync_state_machine.common.types import SyncAction +from sync_state_machine.datasource.api.datasource import ApiDataSource +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.datasource.task_result import TaskResult + + +class _ProjectSchema(BaseModel): + id: str + name: str + + +class _ProjectNode(SyncNode[_ProjectSchema]): + node_type = "project" + schema = _ProjectSchema + + +class _Handler: + node_type = "project" + + +class _DS(BaseDataSource): + pass + + +def _build_node(*, node_id: str, data_id: str, name: str) -> _ProjectNode: + return _ProjectNode(node_id=node_id, data_id=data_id, data={"id": data_id, "name": name}) + + +def test_api_datasource_resolve_push_id_from_put_trace() -> None: + ds = ApiDataSource(base_url="http://example.com", uid="u", secret="s") + node = _build_node(node_id="n1", data_id="biz-1", name="A") + with node.allow_core_state_write("test"): + node.action = SyncAction.UPDATE + + ds.client._record_trace( + method="PUT", + endpoint="/project", + url="http://example.com/project", + request_params=None, + request_payload={"push_id": "push-123", "biz_id": "biz-1", "data": {"name": "B"}}, + response={"code": 200}, + elapsed_ms=8, + ) + + push_id = ds._resolve_push_id_for_success(node, TaskResult.success(node_id=node.node_id)) + assert push_id == "push-123" + + +@pytest.mark.asyncio +async def test_upsert_loaded_nodes_append_load_source_log() -> None: + collection = DataCollection("remote") + ds = _DS() + ds.set_collection(collection) + + existing = _build_node(node_id="n1", data_id="p-1", name="old") + existing.context["_loaded_from_persistence"] = True + await collection.add(existing) + + incoming = _build_node(node_id="n2", data_id="p-1", name="new") + await ds._upsert_loaded_nodes(cast(Any, _Handler()), "project", [incoming]) + + updated = collection.get_by_data_id("project", "p-1") + assert updated is not None + assert updated.sync_log is not None + assert "加载来源: persistence -> _DS.load 覆盖刷新" in updated.sync_log + + +@pytest.mark.asyncio +async def test_api_datasource_append_trace_on_failed_result() -> None: + collection = DataCollection("remote") + ds = ApiDataSource(base_url="http://example.com", uid="u", secret="s") + ds.set_collection(collection) + + node = _build_node(node_id="n-fail", data_id="biz-fail", name="X") + with node.allow_core_state_write("test"): + node.binding_status = BindingStatus.NORMAL + node.action = SyncAction.UPDATE + node.status = SyncStatus.IN_PROGRESS + await collection.add(node) + + ds.client._record_trace( + method="PUT", + endpoint="/contract/update", + url="http://example.com/contract/update", + request_params=None, + request_payload={"push_id": "push-fail", "biz_id": "biz-fail", "data": {"name": "Y"}}, + response={"code": 500, "message": "bad supplier"}, + elapsed_ms=15, + ) + + await ds._handle_task_result( + cast(Any, _Handler()), + TaskResult.failed(node_id=node.node_id, error="Update failed: bad supplier"), + {}, + ) + + updated = collection.get(node.node_id) + assert updated is not None + assert updated.sync_log is not None + assert "API链路[submit-failed] PUT /contract/update" in updated.sync_log + assert "response={\"code\":500,\"message\":\"bad supplier\"}" in updated.sync_log + assert updated.sync_log.index("API链路[submit-failed] PUT /contract/update") < updated.sync_log.index("执行状态写回") + + +@pytest.mark.asyncio +async def test_api_datasource_failed_update_does_not_use_unrelated_op_trace() -> None: + collection = DataCollection("remote") + ds = ApiDataSource(base_url="http://example.com", uid="u", secret="s") + ds.set_collection(collection) + + node = _build_node(node_id="n-miss", data_id="biz-target", name="X") + with node.allow_core_state_write("test"): + node.binding_status = BindingStatus.NORMAL + node.action = SyncAction.UPDATE + node.status = SyncStatus.IN_PROGRESS + await collection.add(node) + + ds.client._record_trace( + method="PUT", + endpoint="/material/plan", + url="http://example.com/material/plan", + request_params=None, + request_payload={"push_id": "push-other", "biz_id": "biz-other", "data": {"k": 1}}, + response={"code": 200, "message": "OK"}, + elapsed_ms=20, + ) + + await ds._handle_task_result( + cast(Any, _Handler()), + TaskResult.failed(node_id=node.node_id, error="Validation failed"), + {}, + ) + + updated = collection.get(node.node_id) + assert updated is not None + assert updated.sync_log is not None + assert "API链路[submit-failed] PUT /material/plan" not in updated.sync_log + assert "未找到匹配 biz_id 的请求记录" in updated.sync_log diff --git a/tests/unit/test_build_filtered_datasource_supplier_refs.py b/tests/unit/test_build_filtered_datasource_supplier_refs.py new file mode 100644 index 0000000..dba2004 --- /dev/null +++ b/tests/unit/test_build_filtered_datasource_supplier_refs.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from scripts.build_filtered_datasource_for_projects import ( + _extract_contract_supplier_ids, + _supplier_identity_set, +) + + +def test_extract_contract_supplier_ids_prefers_supplier_id_then_company_id() -> None: + contracts = [ + {"supplier_id": "sup-1", "company_id": "co-1"}, + {"company_id": "co-2"}, + {"supplier_id": " ", "company_id": "co-3"}, + {"supplier_id": "sup-4"}, + {}, + ] + + assert _extract_contract_supplier_ids(contracts) == {"sup-1", "co-2", "co-3", "sup-4"} + + +def test_supplier_identity_set_includes_id_and__id() -> None: + suppliers = [ + {"_id": "sup-1"}, + {"id": "sup-2"}, + {"_id": "sup-3", "id": "sup-3-alias"}, + {}, + ] + + assert _supplier_identity_set(suppliers) == {"sup-1", "sup-2", "sup-3", "sup-3-alias"} diff --git a/tests/unit/test_collection_project_filter.py b/tests/unit/test_collection_project_filter.py new file mode 100644 index 0000000..2987270 --- /dev/null +++ b/tests/unit/test_collection_project_filter.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import pytest + +from sync_state_machine.common.collection import DataCollection +from tests.fixtures.mock_domain import build_project_node, build_contract_node, register_test_domain + + +@pytest.mark.asyncio +async def test_collection_filter_by_project_ids() -> None: + register_test_domain() + + collection = DataCollection("local") + await collection.add(build_project_node("p1_node", "p1", name="P1", code="P1")) + await collection.add(build_project_node("p2_node", "p2", name="P2", code="P2")) + await collection.add(build_contract_node("c1", "c1", name="C1", code="C1", project_ref="p1")) + await collection.add(build_contract_node("c2", "c2", name="C2", code="C2", project_ref="p2")) + + c1 = collection.get("c1") + c2 = collection.get("c2") + assert c1 is not None and c1.get_data() is not None + assert c2 is not None and c2.get_data() is not None + c1_data = c1.get_data() or {} + c2_data = c2.get_data() or {} + c1_data["project_id"] = "p1" + c2_data["project_id"] = "p2" + c1.set_data(c1_data, validate=False) + c2.set_data(c2_data, validate=False) + + deleted = await collection.filter_by_project_ids(["p1"]) + + assert deleted == 1 + assert collection.get("p1_node") is not None + assert collection.get("c1") is not None + assert collection.get("p2_node") is not None + assert collection.get("c2") is None diff --git a/tests/unit/test_construction_plan_update_fallback.py b/tests/unit/test_construction_plan_update_fallback.py new file mode 100644 index 0000000..cf068c0 --- /dev/null +++ b/tests/unit/test_construction_plan_update_fallback.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +import pytest + +from sync_state_machine.domain.construction.api_handler import ConstructionTaskApiHandler +from sync_state_machine.domain.construction.sync_node import ConstructionTaskSyncNode + + +@pytest.mark.asyncio +async def test_construction_plan_update_uses_data_validation_and_reports_origin_status(monkeypatch: pytest.MonkeyPatch): + handler = ConstructionTaskApiHandler() + + called = {"plan": 0, "base": 0} + + async def _fake_update_base(client, data, push_id: str, biz_id: str): + called["base"] += 1 + + async def _fake_update_plan(client, data: dict, push_id: str, biz_id: str): + called["plan"] += 1 + assert data.get("plan_start_date") == "2025-11-28" + assert data.get("plan_complete_date") == "2029-03-08" + assert data.get("contract_quantity") == 196645.0 + + monkeypatch.setattr( + "sync_state_machine.domain.construction.api_handler.api_update_construction_task", + _fake_update_base, + ) + monkeypatch.setattr( + "sync_state_machine.domain.construction.api_handler.api_update_construction_task_plan", + _fake_update_plan, + ) + + handler.api_client = object() + + node = ConstructionTaskSyncNode( + node_id="n1", + data_id="e9be27e9-e4aa-4eaf-8255-1fe451737227", + data={ + "id": "e9be27e9-e4aa-4eaf-8255-1fe451737227", + "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", + "contract_id": "663dfc72-d63c-42da-8853-4abcddd405f6", + "show_name": "尾水隧洞开挖(方)", + "construction_section": "TJ", + "status": 1, + "task_type": "wssdkw", + "plan_start_date": "2025-11-28", + "plan_complete_date": "2029-03-08", + "actual_complete_date": None, + "complete_quantity": 29930.0, + "complete_rate": 15.22, + "contract_quantity": 196645.0, + "plan_node": [ + {"date": "2025-11-28", "quantity": 0.0, "is_audit": True}, + {"date": "2029-03-08", "quantity": 196645.0, "is_audit": True}, + ], + "statistic_date": "2026-01-29", + "is_crucial": False, + "delay_days": 0, + }, + ) + + node.set_origin_data( + { + "id": "e9be27e9-e4aa-4eaf-8255-1fe451737227", + "project_id": "f3e02e84-e81c-4aa6-88d4-f5aa108c8227", + "contract_id": "663dfc72-d63c-42da-8853-4abcddd405f6", + "show_name": "尾水隧洞开挖(方)", + "construction_section": "TJ", + "status": 1, + "task_type": "wssdkw", + "plan_start_date": None, + "plan_complete_date": None, + "actual_complete_date": "2026-01-29", + "complete_quantity": 29930.0, + "complete_rate": 0.0, + "contract_quantity": None, + "plan_node": [], + "statistic_date": "2026-01-29", + "is_crucial": False, + "delay_days": None, + } + ) + + results = await handler.update_all([node]) + + assert len(results) == 1 + assert results[0].status.value == "success" + assert called["plan"] == 1 + assert "UPDATE_SCHEMA: ConstructionPlanUpdate:" in (node.sync_log or "") + assert "origin_invalid=" in (node.sync_log or "") diff --git a/tests/unit/test_create_data_id_contract.py b/tests/unit/test_create_data_id_contract.py new file mode 100644 index 0000000..5f4cc3b --- /dev/null +++ b/tests/unit/test_create_data_id_contract.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime +from sync_state_machine.engine.events import e20_create_prepare, e40_sync_execute +from sync_state_machine.engine.state_apply import apply_state_to_node +from tests.mocks.mock_datasource import MockSyncNode + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def _new_node(node_id: str, *, data_id: str = "seed-id") -> MockSyncNode: + return MockSyncNode( + node_id=node_id, + data_id=data_id, + data={"id": node_id, "name": "mock"}, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.UNCHECKED, + ) + + +def _set_core_state(runtime: StateMachineRuntime, node: MockSyncNode, state_id: str, *, data_id: str) -> None: + apply_state_to_node( + runtime, + node, + state_id=state_id, + reason="test setup", + fields={"binding_status", "action", "status"}, + ) + apply_state_to_node( + runtime, + node, + state_id=state_id, + reason="test setup", + fields={"data_id"}, + data_id=data_id, + ) + + +def test_create_success_requires_non_empty_result_data_id() -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + node = _new_node("create-missing-result-id", data_id="") + _set_core_state(runtime, node, "S06", data_id="") + + with pytest.raises(RuntimeError, match="requires non-empty result_data_id"): + e40_sync_execute( + runtime, + node=node, + handler_result="SUCCESS", + action="CREATE", + poll_timeout=False, + result_data_id=None, + ) + + +def test_e20_requires_s13_data_id_present() -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + node = _new_node("s13-no-data-id", data_id="") + _set_core_state(runtime, node, "S13", data_id="") + + with pytest.raises(RuntimeError, match="cannot resolve current state"): + e20_create_prepare(runtime, node=node, spawn_success=True) diff --git a/tests/unit/test_datasource_load_continue_on_error.py b/tests/unit/test_datasource_load_continue_on_error.py new file mode 100644 index 0000000..fa86a04 --- /dev/null +++ b/tests/unit/test_datasource_load_continue_on_error.py @@ -0,0 +1,108 @@ +from __future__ import annotations + +import pytest + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.datasource.handler import ValidationResult +from sync_state_machine.datasource.task_result import TaskResult + + +class _FailHandler: + @property + def node_type(self) -> str: + return "fail" + + @property + def node_class(self): + return None + + @property + def schema(self): + return None + + def set_collection(self, collection) -> None: + self._collection = collection + + async def load(self): + raise RuntimeError("boom") + + async def create_all(self, nodes): + return [] + + async def update_all(self, nodes): + return [] + + async def delete_all(self, nodes): + return [] + + async def poll_tasks(self, task_ids): + return {} + + async def validate(self, data): + return ValidationResult(is_valid=True) + + def extract_id(self, data): + return "" + + def _create_node(self, data): + return None + + +class _OkHandler: + @property + def node_type(self) -> str: + return "ok" + + @property + def node_class(self): + return None + + @property + def schema(self): + return None + + def set_collection(self, collection) -> None: + self._collection = collection + + async def load(self): + return [] + + async def create_all(self, nodes): + return [TaskResult.success(node_id=str(i), data_id=str(i)) for i, _ in enumerate(nodes)] + + async def update_all(self, nodes): + return [TaskResult.success(node_id=str(i), data_id=str(i)) for i, _ in enumerate(nodes)] + + async def delete_all(self, nodes): + return [TaskResult.success(node_id=str(i), data_id=str(i)) for i, _ in enumerate(nodes)] + + async def poll_tasks(self, task_ids): + return {} + + async def validate(self, data): + return ValidationResult(is_valid=True) + + def extract_id(self, data): + return "" + + def _create_node(self, data): + return None + + +class _DS(BaseDataSource): + pass + + +@pytest.mark.asyncio +async def test_load_all_continue_when_one_handler_fails(capsys) -> None: + ds = _DS() + ds.register_handler(_FailHandler()) + ds.register_handler(_OkHandler()) + ds.set_collection(DataCollection("local")) + + await ds.load_all(order=["fail", "ok"]) + + out = capsys.readouterr().out + assert "[fail] 加载失败" in out + assert "Loaded nodes for ok: 0" in out diff --git a/tests/unit/test_datasource_target_project_ids_resolution.py b/tests/unit/test_datasource_target_project_ids_resolution.py new file mode 100644 index 0000000..1c644ff --- /dev/null +++ b/tests/unit/test_datasource_target_project_ids_resolution.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from pydantic import ValidationError +import pytest + +from sync_state_machine.config import ( + PipelineRunConfig, + JsonlDataSourceConfig, + ApiDataSourceConfig, + PersistConfig, + LoggingConfig, +) +from sync_state_machine.pipeline.factory import _resolve_datasource_target_project_ids + + +def _build_config( + *, + top_level: list[str], + local_ids: list[str] | None = None, + remote_ids: list[str] | None = None, +) -> PipelineRunConfig: + return PipelineRunConfig( + node_types=["project"], + target_project_ids=top_level, + local_datasource=JsonlDataSourceConfig( + type="jsonl", + jsonl_dir="./filtered_datasource/datasource/filtered", + target_project_ids=local_ids or [], + ), + remote_datasource=JsonlDataSourceConfig( + type="jsonl", + jsonl_dir="./remote_datasource/datasource", + target_project_ids=remote_ids or [], + ), + strategies=[], + persist=PersistConfig(db_path="./test_results/sync_state_machine/test.db"), + logging=LoggingConfig(initialize=False), + ) + + +def test_datasource_target_ids_take_precedence_over_top_level() -> None: + cfg = _build_config(top_level=["p_top"], local_ids=["p_local"], remote_ids=["p_remote"]) + + local_ids, remote_ids = _resolve_datasource_target_project_ids(cfg) + + assert local_ids == ["p_local"] + assert remote_ids == ["p_remote"] + + +def test_datasource_target_ids_fallback_to_top_level_when_missing() -> None: + cfg = _build_config(top_level=["p_top"], local_ids=[], remote_ids=[]) + + local_ids, remote_ids = _resolve_datasource_target_project_ids(cfg) + + assert local_ids == ["p_top"] + assert remote_ids == ["p_top"] + + +def test_datasource_target_ids_support_mixed_override_and_fallback() -> None: + cfg = _build_config(top_level=["p_top"], local_ids=["p_local"], remote_ids=[]) + + local_ids, remote_ids = _resolve_datasource_target_project_ids(cfg) + + assert local_ids == ["p_local"] + assert remote_ids == ["p_top"] + + +def test_api_datasource_requires_target_project_ids() -> None: + with pytest.raises(ValidationError) as exc_info: + ApiDataSourceConfig( + type="api", + api_base_url="https://example.com", + target_project_ids=[], # Empty list should fail + ) + assert "List should have at least 1 item" in str(exc_info.value) + + with pytest.raises(ValidationError) as exc_info: + ApiDataSourceConfig( + type="api", + api_base_url="https://example.com", + # Missing target_project_ids should fail + ) + assert "Field required" in str(exc_info.value) or "missing" in str(exc_info.value).lower() + + +def test_api_datasource_rate_limit_config_fields() -> None: + cfg = ApiDataSourceConfig( + type="api", + api_base_url="https://example.com", + target_project_ids=["p1"], + ) + assert cfg.api_rate_limit_max_requests == 10 + assert cfg.api_rate_limit_window_seconds == 10.0 + + overridden = ApiDataSourceConfig( + type="api", + api_base_url="https://example.com", + api_rate_limit_max_requests=5, + api_rate_limit_window_seconds=2.5, + target_project_ids=["p1"], + ) + assert overridden.api_rate_limit_max_requests == 5 + assert overridden.api_rate_limit_window_seconds == 2.5 diff --git a/tests/unit/test_e01_bootstrap_matrix.py b/tests/unit/test_e01_bootstrap_matrix.py new file mode 100644 index 0000000..b4e5022 --- /dev/null +++ b/tests/unit/test_e01_bootstrap_matrix.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime +from sync_state_machine.engine.events import e01_bootstrap +from sync_state_machine.sync_system.strategy_ops.reset_ops import _is_create_zombie +from tests.mocks.mock_datasource import MockSyncNode + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def _new_node(*, node_id: str, action: SyncAction, status: SyncStatus, data_id: str) -> MockSyncNode: + return MockSyncNode( + node_id=node_id, + data_id=data_id, + data={"id": data_id or "", "name": "mock"}, + action=action, + status=status, + binding_status=BindingStatus.WARNING, + error="seed-error", + ) + + +_CASES = [ + (action, status, data_id) + for action in SyncAction + for status in SyncStatus + for data_id in ("", "id-1") +] + + +@pytest.mark.parametrize("action,status,data_id", _CASES) +def test_is_create_zombie_matrix(action: SyncAction, status: SyncStatus, data_id: str) -> None: + node = _new_node(node_id=f"z-{action.value}-{status.value}-{data_id or 'empty'}", action=action, status=status, data_id=data_id) + expected = action == SyncAction.CREATE and (status == SyncStatus.FAILED or not bool(data_id)) + assert _is_create_zombie(node) is expected + + +@pytest.mark.parametrize("action,status,data_id", _CASES) +def test_e01_bootstrap_accepts_all_combinations(action: SyncAction, status: SyncStatus, data_id: str) -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + node = _new_node(node_id=f"e01-{action.value}-{status.value}-{data_id or 'empty'}", action=action, status=status, data_id=data_id) + + original_action = node.action + original_status = node.status + original_binding = node.binding_status + original_error = node.error + + is_zombie = _is_create_zombie(node) + decision = e01_bootstrap(runtime, node=node, is_create_zombie=is_zombie) + + if is_zombie: + assert decision.to_state == "S15" + assert node.action == original_action + assert node.status == original_status + assert node.binding_status == original_binding + assert node.error == original_error + else: + assert decision.to_state == "S00" + assert node.binding_status == BindingStatus.UNCHECKED + assert node.action == SyncAction.NONE + assert node.status == SyncStatus.PENDING + assert node.error is None diff --git a/tests/unit/test_engine_semantics.py b/tests/unit/test_engine_semantics.py new file mode 100644 index 0000000..278a1ba --- /dev/null +++ b/tests/unit/test_engine_semantics.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from sync_state_machine.engine.semantics import ( + CoreBindingResult, + classify_core_pair, +) + + +def test_core_pair_and_event_mapping(): + local, peer = classify_core_pair( + has_binding_record=True, + local_data={"id": "l1"}, + peer_data={"id": "r1"}, + ) + assert (local, peer) == (CoreBindingResult.NORMAL, CoreBindingResult.NORMAL) + + local2, peer2 = classify_core_pair( + has_binding_record=True, + local_data={"id": "l1"}, + peer_data=None, + ) + assert (local2, peer2) == (CoreBindingResult.WARNING, CoreBindingResult.ABNORMAL) diff --git a/tests/unit/test_events_invariant_enforcement.py b/tests/unit/test_events_invariant_enforcement.py new file mode 100644 index 0000000..120bee7 --- /dev/null +++ b/tests/unit/test_events_invariant_enforcement.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime +from sync_state_machine.engine.events import e10_bind_core +from sync_state_machine.engine.invariants import InvariantViolation +from tests.mocks.mock_datasource import MockSyncNode + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def _new_node(node_id: str) -> MockSyncNode: + return MockSyncNode( + node_id=node_id, + data_id="seed-id", + data={"id": node_id, "name": "mock"}, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.UNCHECKED, + ) + + +def test_event_path_calls_check_invariants(monkeypatch: pytest.MonkeyPatch) -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + called = {"value": False} + + def _fake_check_invariants(snapshot): + called["value"] = True + return [] + + monkeypatch.setattr(runtime, "check_invariants", _fake_check_invariants) + + node = _new_node("inv-call") + decision = e10_bind_core( + runtime, + node=node, + has_binding_record=False, + ) + + assert decision.to_state == "S02" + assert called["value"] is True + + +def test_event_path_raises_on_invariant_violation(monkeypatch: pytest.MonkeyPatch) -> None: + runtime = StateMachineRuntime(StateMachineConfig.load(CFG_PATH)) + + def _fake_violation(snapshot): + return [InvariantViolation(invariant_id="INV-X", message="boom")] + + monkeypatch.setattr(runtime, "check_invariants", _fake_violation) + + node = _new_node("inv-fail") + with pytest.raises(RuntimeError, match="Invariant violation"): + e10_bind_core( + runtime, + node=node, + has_binding_record=False, + ) diff --git a/tests/unit/test_factory_remote_jsonl_dir_creation.py b/tests/unit/test_factory_remote_jsonl_dir_creation.py new file mode 100644 index 0000000..a5a7f8c --- /dev/null +++ b/tests/unit/test_factory_remote_jsonl_dir_creation.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.pipeline.factory import _prepare_remote_jsonl_dir + + +def test_prepare_remote_jsonl_dir_autocreates_inside_project_root(tmp_path: Path) -> None: + project_root = tmp_path / "project" + project_root.mkdir(parents=True, exist_ok=True) + + remote_dir = project_root / "remote_datasource" / "datasource" + assert not remote_dir.exists() + + prepared = _prepare_remote_jsonl_dir(remote_dir, project_root=project_root) + + assert prepared == remote_dir + assert remote_dir.exists() + assert remote_dir.is_dir() + + +def test_prepare_remote_jsonl_dir_rejects_outside_project_root(tmp_path: Path) -> None: + project_root = tmp_path / "project" + outside_dir = tmp_path / "outside" / "remote_datasource" / "datasource" + project_root.mkdir(parents=True, exist_ok=True) + + with pytest.raises(FileNotFoundError, match="auto-create is only allowed"): + _prepare_remote_jsonl_dir(outside_dir, project_root=project_root) diff --git a/tests/unit/test_invariants_runtime.py b/tests/unit/test_invariants_runtime.py new file mode 100644 index 0000000..42b3653 --- /dev/null +++ b/tests/unit/test_invariants_runtime.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from pathlib import Path + +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def test_precondition_failed_requires_update_action() -> None: + cfg = StateMachineConfig.load(CFG_PATH) + runtime = StateMachineRuntime(cfg) + + bad_snapshot = { + "binding_status": "NORMAL", + "action": "NONE", + "status": "PRECONDITION_FAILED", + "data_id_exist": False, + } + violations = runtime.check_invariants(bad_snapshot) + assert any(v.invariant_id == "INV-3_PRECOND_IMPLIES_UPDATE" for v in violations) + + good_snapshot = { + "binding_status": "NORMAL", + "action": "UPDATE", + "status": "PRECONDITION_FAILED", + "data_id_exist": True, + } + violations2 = runtime.check_invariants(good_snapshot) + assert not any(v.invariant_id == "INV-3_PRECOND_IMPLIES_UPDATE" for v in violations2) diff --git a/tests/unit/test_module_import_surface.py b/tests/unit/test_module_import_surface.py new file mode 100644 index 0000000..5e2a1be --- /dev/null +++ b/tests/unit/test_module_import_surface.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +import importlib +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[2] +PKG_ROOT = REPO_ROOT / "sync_state_machine" + + +def _module_name(py_file: Path) -> str: + rel = py_file.relative_to(REPO_ROOT).with_suffix("") + return ".".join(rel.parts) + + +def test_sync_state_machine_module_import_surface() -> None: + py_files = sorted(PKG_ROOT.rglob("*.py")) + assert py_files, "No python modules found under sync_state_machine" + + excluded_names = {"__main__"} + excluded_parts = {"tests", "__pycache__"} + + imported = 0 + for py_file in py_files: + if any(part in excluded_parts for part in py_file.parts): + continue + if py_file.stem in excluded_names: + continue + + module_name = _module_name(py_file) + importlib.import_module(module_name) + imported += 1 + + assert imported >= 20 diff --git a/tests/unit/test_peer_creating_finalize.py b/tests/unit/test_peer_creating_finalize.py new file mode 100644 index 0000000..e614041 --- /dev/null +++ b/tests/unit/test_peer_creating_finalize.py @@ -0,0 +1,140 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.engine.state_apply import apply_state_to_node +from sync_state_machine.pipeline.full_sync_pipeline import FullSyncPipeline +from tests.mocks.mock_datasource import MockSyncNode + + +class _DS(BaseDataSource): + pass + + +def _set_state(pipeline: FullSyncPipeline, node: MockSyncNode, state_id: str, *, data_id: str) -> None: + apply_state_to_node( + pipeline.sm_runtime, + node, + state_id=state_id, + reason="test setup", + fields={"binding_status", "action", "status"}, + ) + apply_state_to_node( + pipeline.sm_runtime, + node, + state_id=state_id, + reason="test setup", + fields={"data_id"}, + data_id=data_id, + ) + + +async def _new_pipeline(tmp_path: Path) -> tuple[FullSyncPipeline, DataCollection, DataCollection, BindingManager, PersistenceBackend]: + db_path = tmp_path / "state.db" + persistence = PersistenceBackend(str(db_path)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + pipeline = FullSyncPipeline( + local_datasource=_DS(), + remote_datasource=_DS(), + strategies=[], + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + node_types=["mock"], + load_order=["mock"], + sync_order=["mock"], + enable_persistence=False, + ) + + return pipeline, local_collection, remote_collection, binding_manager, persistence + + +@pytest.mark.asyncio +async def test_peer_creating_source_moves_to_s01_when_target_create_success(tmp_path: Path) -> None: + pipeline, local, remote, bm, persistence = await _new_pipeline(tmp_path) + + src = MockSyncNode( + node_id="src_local", + data_id="SRC-ID", + data={"id": "SRC-ID", "name": "src"}, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.UNCHECKED, + ) + target = MockSyncNode( + node_id="tgt_remote", + data_id="TGT-ID", + data={"id": "TGT-ID", "name": "tgt"}, + action=SyncAction.CREATE, + status=SyncStatus.SUCCESS, + binding_status=BindingStatus.NORMAL, + ) + await local.add(src) + await remote.add(target) + + _set_state(pipeline, src, "S13", data_id="SRC-ID") + _set_state(pipeline, target, "S11C", data_id="TGT-ID") + + await bm.bind("mock", "src_local", "tgt_remote") + + await pipeline._finalize_peer_creating_sources("mock") + + assert src.binding_status == BindingStatus.NORMAL + assert src.action == SyncAction.NONE + assert src.status == SyncStatus.PENDING + + await pipeline.close() + await persistence.close() + + +@pytest.mark.asyncio +async def test_peer_creating_source_stays_s13_when_target_create_failed(tmp_path: Path) -> None: + pipeline, local, remote, bm, persistence = await _new_pipeline(tmp_path) + + src = MockSyncNode( + node_id="src_local_fail", + data_id="SRC-ID-FAIL", + data={"id": "SRC-ID-FAIL", "name": "src-fail"}, + action=SyncAction.NONE, + status=SyncStatus.PENDING, + binding_status=BindingStatus.UNCHECKED, + ) + target = MockSyncNode( + node_id="tgt_remote_fail", + data_id="", + data={"id": "", "name": "tgt-fail"}, + action=SyncAction.CREATE, + status=SyncStatus.FAILED, + binding_status=BindingStatus.NORMAL, + ) + await local.add(src) + await remote.add(target) + + _set_state(pipeline, src, "S13", data_id="SRC-ID-FAIL") + _set_state(pipeline, target, "S12C", data_id="") + target.error = "remote create failed" + + await bm.bind("mock", "src_local_fail", "tgt_remote_fail") + + await pipeline._finalize_peer_creating_sources("mock") + + assert src.binding_status == BindingStatus.PEER_CREATING + assert src.action == SyncAction.NONE + assert src.status == SyncStatus.PENDING + assert "peer_create_failed" in (src.error or "") + + await pipeline.close() + await persistence.close() diff --git a/tests/unit/test_pipeline_strategy_continue_on_error.py b/tests/unit/test_pipeline_strategy_continue_on_error.py new file mode 100644 index 0000000..d285423 --- /dev/null +++ b/tests/unit/test_pipeline_strategy_continue_on_error.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.datasource.datasource import BaseDataSource +from sync_state_machine.pipeline.full_sync_pipeline import FullSyncPipeline +from sync_state_machine.sync_system.strategy import BaseSyncStrategy + + +class _DS(BaseDataSource): + pass + + +class _FailStrategy(BaseSyncStrategy): + schema = object # type: ignore + + async def bind(self, **kwargs): + raise RuntimeError("bind failed") + + async def create(self): + return [] + + async def update(self): + return [] + + +class _OkStrategy(BaseSyncStrategy): + schema = object # type: ignore + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.bound = False + + async def bind(self, **kwargs): + self.bound = True + + async def create(self): + return [] + + async def update(self): + return [] + + +@pytest.mark.asyncio +async def test_phase_sync_by_node_type_continues_after_strategy_error(tmp_path: Path) -> None: + db_path = tmp_path / "state.db" + persistence = PersistenceBackend(str(db_path)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + local_ds = _DS() + remote_ds = _DS() + + fail_strategy = _FailStrategy("fail", local_collection, remote_collection, binding_manager) + fail_strategy.skip_sync = True + + ok_strategy = _OkStrategy("ok", local_collection, remote_collection, binding_manager) + ok_strategy.skip_sync = True + + pipeline = FullSyncPipeline( + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[fail_strategy, ok_strategy], + persistence=persistence, + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + node_types=[], + load_order=[], + sync_order=["fail", "ok"], + enable_persistence=False, + ) + + await pipeline.phase_sync_by_node_type() + + assert ok_strategy.bound is True + assert pipeline.stats["failed"] >= 1 + + await pipeline.close() diff --git a/tests/unit/test_post_check_dependency_id_normalization.py b/tests/unit/test_post_check_dependency_id_normalization.py new file mode 100644 index 0000000..3dbaed4 --- /dev/null +++ b/tests/unit/test_post_check_dependency_id_normalization.py @@ -0,0 +1,154 @@ +from __future__ import annotations + +import logging +from pathlib import Path + +import pytest + +from sync_state_machine.common.binding import BindingManager +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.persistence import PersistenceBackend +from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus +from sync_state_machine.domain.construction.sync_node import ConstructionTaskSyncNode +from sync_state_machine.domain.contract.sync_node import ContractSyncNode +from sync_state_machine.sync_system.strategy_ops.post_check_ops import evaluate_consistency_for_node_type + + +@pytest.mark.asyncio +async def test_post_check_uses_same_id_resolver_as_create_update_for_depend_ids(tmp_path: Path) -> None: + db_path = tmp_path / "state.db" + persistence = PersistenceBackend(str(db_path)) + await persistence.initialize() + + local_collection = DataCollection("local", persistence=persistence, auto_persist=False) + remote_collection = DataCollection("remote", persistence=persistence, auto_persist=False) + binding_manager = BindingManager(persistence, auto_persist=False) + + local_contract_data_id = "local-contract-1" + remote_contract_data_id = "remote-contract-1" + + local_contract = ContractSyncNode( + node_id="local-contract-node", + data_id=local_contract_data_id, + data={ + "id": local_contract_data_id, + "project_id": "", + "name": "合同A", + "short_name": "合同A", + "code": "C-001", + "contract_type": "施工", + "currency": "CNY", + "manager_name": "张三", + "manager_phone": "13800000000", + "sign_company": "示例公司", + "company_id": "company-1", + "sign_date": "2025-01-01", + "credit_code": None, + "total_price": 1.0, + "sub_name": None, + }, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.SUCCESS, + ) + remote_contract = ContractSyncNode( + node_id="remote-contract-node", + data_id=remote_contract_data_id, + data={ + "id": remote_contract_data_id, + "project_id": "", + "name": "合同A", + "short_name": "合同A", + "code": "C-001", + "contract_type": "施工", + "currency": "CNY", + "manager_name": "张三", + "manager_phone": "13800000000", + "sign_company": "示例公司", + "company_id": "company-1", + "sign_date": "2025-01-01", + "credit_code": None, + "total_price": 1.0, + "sub_name": None, + }, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.SUCCESS, + ) + + await local_collection.add(local_contract) + await remote_collection.add(remote_contract) + await binding_manager.bind("contract", local_contract.node_id, remote_contract.node_id) + + local_task = ConstructionTaskSyncNode( + node_id="local-task-node", + data_id="local-task-data-id", + data={ + "id": "local-task-data-id", + "project_id": "", + "contract_id": local_contract_data_id, + "show_name": "厂房开挖(方)", + "construction_section": "TJ", + "status": 0, + "task_type": "cfkw", + "plan_start_date": None, + "plan_complete_date": None, + "actual_complete_date": None, + "complete_quantity": 0.0, + "complete_rate": 0.0, + "contract_quantity": None, + "plan_node": [], + "statistic_date": None, + "is_crucial": False, + "delay_days": None, + }, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.SUCCESS, + ) + + remote_task = ConstructionTaskSyncNode( + node_id="remote-task-node", + data_id="remote-task-data-id", + data={ + "id": "remote-task-data-id", + "project_id": "", + "contract_id": remote_contract_data_id, + "show_name": "厂房开挖(方)", + "construction_section": "TJ", + "status": 0, + "task_type": "cfkw", + "plan_start_date": None, + "plan_complete_date": None, + "actual_complete_date": None, + "complete_quantity": 0.0, + "complete_rate": 0.0, + "contract_quantity": None, + "plan_node": [], + "statistic_date": None, + "is_crucial": False, + "delay_days": None, + }, + binding_status=BindingStatus.NORMAL, + action=SyncAction.NONE, + status=SyncStatus.SUCCESS, + ) + + await local_collection.add(local_task) + await remote_collection.add(remote_task) + await binding_manager.bind("construction_task", local_task.node_id, remote_task.node_id) + + result = await evaluate_consistency_for_node_type( + node_type="construction_task", + local_collection=local_collection, + remote_collection=remote_collection, + binding_manager=binding_manager, + logger=logging.getLogger("sync_state_machine"), + depend_fields={"contract_id": "contract"}, + compare_to_remote=True, + ) + + assert result["ok"] is True + assert result["mismatch_count"] == 0 + + await persistence.close() diff --git a/tests/unit/test_project_detail_api_handler.py b/tests/unit/test_project_detail_api_handler.py new file mode 100644 index 0000000..4376f22 --- /dev/null +++ b/tests/unit/test_project_detail_api_handler.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +from pydantic import BaseModel + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.domain.project_detail.api_handler import ProjectDetailApiHandler + + +class _ProjectSchema(BaseModel): + id: str + + +class _ProjectNode(SyncNode[_ProjectSchema]): + node_type = "project" + schema = _ProjectSchema + + +def test_project_detail_load_injects_project_id_before_validation() -> None: + collection = DataCollection("remote") + + project = _ProjectNode( + node_id="project-node-1", + data_id="project-1", + data={"id": "project-1"}, + context={ + "all_info": { + "project_detail": [ + { + "id": "detail-1", + "key": "plan_construction", + "value": [{"date": "2026-01-01", "capacity": 12.5}], + } + ] + } + }, + ) + collection._nodes[project.node_id] = project + + handler = ProjectDetailApiHandler() + handler.set_collection(collection) + + nodes = __import__("asyncio").run(handler.load()) + + assert len(nodes) == 1 + detail_data = nodes[0].get_data() + assert detail_data is not None + assert detail_data["project_id"] == "project-1" + assert detail_data["id"] == "detail-1" diff --git a/tests/unit/test_run_logger_node_filter.py b/tests/unit/test_run_logger_node_filter.py new file mode 100644 index 0000000..51c0ae4 --- /dev/null +++ b/tests/unit/test_run_logger_node_filter.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +import logging +from io import StringIO + +from sync_state_machine.pipeline.run_logger import clear_pipeline_logger_handlers, init_pipeline_logger + + +def test_suppress_node_logs_filter_works() -> None: + logger = logging.getLogger("sync_state_machine") + clear_pipeline_logger_handlers(logger) + + stream = StringIO() + handler = logging.StreamHandler(stream) + handler.setFormatter(logging.Formatter("%(message)s")) + + # init and then replace default console handler with our capture handler carrying same filter behavior + logger = init_pipeline_logger(level=logging.INFO, mirror_console=False, replace_handlers=True, suppress_node_logs=True) + clear_pipeline_logger_handlers(logger) + logger.addHandler(handler) + + class _LocalFilter(logging.Filter): + def filter(self, record: logging.LogRecord) -> bool: + msg = record.getMessage() + if "node=" in msg: + return False + if "节点 " in msg and "状态" in msg: + return False + return True + + handler.addFilter(_LocalFilter()) + + logger.info("[company] 自动绑定阻断: node=abc, reason=exists") + logger.info("✅ Strategy bind: company") + + output = stream.getvalue() + assert "node=abc" not in output + assert "Strategy bind: company" in output + + clear_pipeline_logger_handlers(logger) diff --git a/tests/unit/test_run_presets_yaml_loader.py b/tests/unit/test_run_presets_yaml_loader.py new file mode 100644 index 0000000..57876fd --- /dev/null +++ b/tests/unit/test_run_presets_yaml_loader.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from pathlib import Path + +import pytest + +from sync_state_machine.config.run_presets import load_overrides_from_file + + +def test_load_overrides_from_yaml_file(tmp_path: Path) -> None: + pytest.importorskip("yaml") + + yaml_file = tmp_path / "profile.yaml" + yaml_file.write_text( + """ +node_types: + - company +logging: + initialize: true + suppress_node_logs: true +local_datasource: + type: jsonl + jsonl_dir: ${PROJECT_ROOT}/filtered_datasource/datasource/filtered +""".strip(), + encoding="utf-8", + ) + + overrides = load_overrides_from_file(yaml_file, project_root=tmp_path) + + assert overrides["logging"]["suppress_node_logs"] is True + assert str(tmp_path) in overrides["local_datasource"]["jsonl_dir"] diff --git a/tests/unit/test_state_machine_outcomes.py b/tests/unit/test_state_machine_outcomes.py new file mode 100644 index 0000000..2e79c8c --- /dev/null +++ b/tests/unit/test_state_machine_outcomes.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from pathlib import Path + +from sync_state_machine.engine import StateMachineConfig, StateMachineRuntime + + +CFG_PATH = Path(__file__).resolve().parents[2] / "sync_state_machine" / "config" / "node_state_machine.yaml" + + +def test_all_event_outcomes_are_dispatchable() -> None: + cfg = StateMachineConfig.load(CFG_PATH) + runtime = StateMachineRuntime(cfg) + + covered_events: set[str] = set() + + for event_id, transition in cfg.transitions.items(): + if not transition.outcomes: + continue + + for idx, outcome in enumerate(transition.outcomes): + if outcome.to is None: + continue + + src = next((s for s in transition.from_states if s != "*"), "*") + decision = runtime.dispatch(current_state=src, event_id=event_id, context=dict(outcome.when)) + assert decision is not None, f"{event_id}[{idx}] did not dispatch" + assert decision.to_state == outcome.to, f"{event_id}[{idx}] target mismatch" + assert decision.outcome_index == idx, f"{event_id}[{idx}] wrong branch matched" + covered_events.add(event_id) + + assert covered_events == set(cfg.transitions.keys()) diff --git a/tests/unit/test_strategy_dependency_helpers.py b/tests/unit/test_strategy_dependency_helpers.py new file mode 100644 index 0000000..e632f24 --- /dev/null +++ b/tests/unit/test_strategy_dependency_helpers.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +from sync_state_machine.common.types import BindingStatus, SyncStatus +from sync_state_machine.sync_system.strategy_ops.bind_ops import ( + check_dependency_satisfied, + collect_dependency_errors, +) +from tests.fixtures.mock_domain import ( + TestProjectNode as ProjectNode, +) + + +def _normal_dep_node(*, data_id: str = "dep-1") -> ProjectNode: + return ProjectNode( + node_id="dep-node", + data_id=data_id, + data={"id": data_id or "", "name": "dep", "code": "DEP"}, + binding_status=BindingStatus.NORMAL, + status=SyncStatus.PENDING, + ) + + +def test_check_dependency_satisfied_allows_empty_ref_by_default() -> None: + ok = check_dependency_satisfied( + dependency_nodes=[None], + field_values=[""], + ) + assert ok is True + + +def test_check_dependency_satisfied_blocks_empty_ref_when_strict() -> None: + ok = check_dependency_satisfied( + dependency_nodes=[None], + field_values=[""], + allow_empty_dependency_ref=False, + ) + assert ok is False + + +def test_check_dependency_satisfied_missing_dep_data_id_strict_mode() -> None: + node = _normal_dep_node(data_id="") + loose = check_dependency_satisfied( + dependency_nodes=[node], + field_values=["P-1"], + allow_missing_dep_data_id=True, + ) + strict = check_dependency_satisfied( + dependency_nodes=[node], + field_values=["P-1"], + allow_missing_dep_data_id=False, + ) + assert loose is True + assert strict is False + + +def test_collect_dependency_errors_covers_not_found_bad_status_and_no_data_id() -> None: + bad_status_node = ProjectNode( + node_id="dep-bad-status", + data_id="dep-2", + data={"id": "dep-2", "name": "dep2", "code": "DEP2"}, + binding_status=BindingStatus.WARNING, + status=SyncStatus.PENDING, + ) + no_data_id_node = ProjectNode( + node_id="dep-no-id", + data_id="", + data={"id": "", "name": "dep3", "code": "DEP3"}, + binding_status=BindingStatus.NORMAL, + status=SyncStatus.SUCCESS, + ) + + errors = collect_dependency_errors( + dependency_nodes=[None, bad_status_node, no_data_id_node], + field_names=["project_ref", "supplier_ref", "company_ref"], + field_types=["project", "supplier", "company"], + field_values=["P-404", "S-1", "C-1"], + allow_empty_dependency_ref=False, + allow_missing_dep_data_id=False, + ) + + assert errors == [ + "not_found|project_ref|project|P-404", + "bad_status|supplier_ref|warning", + "no_data_id|company_ref|status=SUCCESS", + ] diff --git a/tests/unit/test_target_project_preload_filter.py b/tests/unit/test_target_project_preload_filter.py new file mode 100644 index 0000000..555dc24 --- /dev/null +++ b/tests/unit/test_target_project_preload_filter.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import json + +import pytest +from pydantic import BaseModel + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.common.sync_node import SyncNode +from sync_state_machine.datasource.jsonl.datasource import JsonlDataSource +from sync_state_machine.datasource.jsonl.handler import BaseJsonlHandler + + +class _ProjectSchema(BaseModel): + id: str + + +class _BizSchema(BaseModel): + id: str + project_id: str | None = None + + +class _ProjectNode(SyncNode[_ProjectSchema]): + node_type = "project" + schema = _ProjectSchema + + +class _BizNode(SyncNode[_BizSchema]): + node_type = "contract" + schema = _BizSchema + + +@pytest.mark.asyncio +async def test_jsonl_project_load_applies_target_project_filter(tmp_path): + data_file = tmp_path / "project_1.jsonl" + data_file.write_text( + "\n".join([ + json.dumps({"id": "p1"}, ensure_ascii=False), + json.dumps({"id": "p2"}, ensure_ascii=False), + ]) + + "\n", + encoding="utf-8", + ) + + datasource = JsonlDataSource(tmp_path) + datasource.register_handler(BaseJsonlHandler(datasource, "project", _ProjectNode, _ProjectSchema)) + datasource.set_target_project_ids(["p1"]) + datasource.set_collection(DataCollection("local")) + + await datasource.load_all(order=["project"]) + + loaded = datasource._collection.filter(node_type="project") # type: ignore[union-attr] + assert {node.data_id for node in loaded} == {"p1"} + + +@pytest.mark.asyncio +async def test_jsonl_non_project_load_filters_rows_by_project_id(tmp_path): + data_file = tmp_path / "contract_1.jsonl" + data_file.write_text( + "\n".join([ + json.dumps({"id": "c1", "project_id": "p1"}, ensure_ascii=False), + json.dumps({"id": "c2", "project_id": "p2"}, ensure_ascii=False), + json.dumps({"id": "c3"}, ensure_ascii=False), + ]) + + "\n", + encoding="utf-8", + ) + + datasource = JsonlDataSource(tmp_path) + datasource.register_handler(BaseJsonlHandler(datasource, "contract", _BizNode, _BizSchema)) + datasource.set_target_project_ids(["p1"]) + datasource.set_collection(DataCollection("local")) + + await datasource.load_all(order=["contract"]) + + loaded = datasource._collection.filter(node_type="contract") # type: ignore[union-attr] + assert {node.data_id for node in loaded} == {"c1", "c3"} diff --git a/tests/unit/test_units_jsonl_handler_alias_files.py b/tests/unit/test_units_jsonl_handler_alias_files.py new file mode 100644 index 0000000..8191177 --- /dev/null +++ b/tests/unit/test_units_jsonl_handler_alias_files.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import json + +import pytest + +from sync_state_machine.common.collection import DataCollection +from sync_state_machine.datasource.jsonl.datasource import JsonlDataSource +from sync_state_machine.domain.units.jsonl_handler import UnitsJsonlHandler + + +@pytest.mark.asyncio +async def test_units_jsonl_handler_loads_units_filename(tmp_path): + data_file = tmp_path / "units_1.jsonl" + data_file.write_text( + json.dumps( + { + "id": "u-1", + "project_id": "p-1", + "serial_number": 1, + "actual_production_date": "2025-01-01", + }, + ensure_ascii=False, + ) + + "\n", + encoding="utf-8", + ) + + datasource = JsonlDataSource(tmp_path) + datasource.register_handler(UnitsJsonlHandler(datasource)) + datasource.set_collection(DataCollection("local")) + + await datasource.load_all(order=["units"]) + + loaded = datasource._collection.filter(node_type="units") # type: ignore[union-attr] + assert {node.data_id for node in loaded} == {"u-1"} diff --git a/tests/unit/test_update_ops.py b/tests/unit/test_update_ops.py new file mode 100644 index 0000000..2ac3d4e --- /dev/null +++ b/tests/unit/test_update_ops.py @@ -0,0 +1,67 @@ +import pytest +from unittest.mock import AsyncMock, patch, MagicMock +from sync_state_machine.sync_system.config import UpdateDirection +from sync_state_machine.sync_system.strategy_ops.update_ops import run_update + +@pytest.mark.asyncio +async def test_run_update_with_direction_overrides(): + class FakeNode: + def __init__(self, data): + self._data = data + + def get_data(self): + return self._data + + # Setup mock strategy + strategy = MagicMock() + strategy.node_type = "TestNode" + strategy.config.field_direction_key = "sync_direction" + strategy.config.field_direction_overrides = { + "local_only": UpdateDirection.PUSH, + "remote_only": UpdateDirection.PULL, + "ignore": UpdateDirection.BIDIRECTIONAL # Just to check filtering + } + strategy.config.update_direction = UpdateDirection.PUSH + strategy.local_collection = MagicMock() + strategy.remote_collection = MagicMock() + + with patch('sync_state_machine.sync_system.strategy_ops.update_ops.add_update_action', new_callable=AsyncMock) as mock_add_action: + mock_add_action.return_value = [] + + await run_update(strategy) + + # In the active directions, PUSH and PULL should be handled because of overrides. + # Check PUSH call + assert mock_add_action.call_count == 2 + + push_call = mock_add_action.call_args_list[0] + assert push_call.kwargs['source_is_local'] is True + assert push_call.kwargs['from_collection'] == strategy.local_collection + + pull_call = mock_add_action.call_args_list[1] + assert pull_call.kwargs['source_is_local'] is False + assert pull_call.kwargs['from_collection'] == strategy.remote_collection + + # Test the node filters + push_filter = push_call.kwargs['node_filter'] + pull_filter = pull_call.kwargs['node_filter'] + + # Node that has 'local_only' -> PUSH + node_push = FakeNode({"sync_direction": "local_only"}) + assert push_filter(node_push) is True + assert pull_filter(node_push) is False + + # Node that has 'remote_only' -> PULL + node_pull = FakeNode({"sync_direction": "remote_only"}) + assert push_filter(node_pull) is False + assert pull_filter(node_pull) is True + + # Node with unknown key -> default direction (PUSH) + node_default = FakeNode({"sync_direction": "unknown"}) + assert push_filter(node_default) is True + assert pull_filter(node_default) is False + + # Node with empty data -> default direction (PUSH) + node_empty = FakeNode(None) + assert push_filter(node_empty) is True + assert pull_filter(node_empty) is False diff --git a/tests/unit/test_validate_config_strictness.py b/tests/unit/test_validate_config_strictness.py new file mode 100644 index 0000000..ff5437b --- /dev/null +++ b/tests/unit/test_validate_config_strictness.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from pathlib import Path + +from tools.validate_config import validate_config + + +REPO_ROOT = Path(__file__).resolve().parents[2] + + +def test_validate_config_rejects_missing_required_keys(tmp_path: Path) -> None: + invalid_cfg = tmp_path / "invalid.yaml" + invalid_cfg.write_text( + """ +meta: + version: 1 +context: {} +states: + S00: + action: NONE + status: PENDING + desc: missing binding_status +stages: {} +transitions: {} +invariants: {} +""".strip(), + encoding="utf-8", + ) + + problems, _ = validate_config(invalid_cfg) + errors = [p for p in problems if p.level == "ERROR"] + assert errors + assert any("binding_status" in p.message or "binding_status" in p.path for p in errors) diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..65f729a --- /dev/null +++ b/tools/__init__.py @@ -0,0 +1 @@ +"""State machine tooling package (validate + render).""" diff --git a/tools/render_graph.py b/tools/render_graph.py new file mode 100644 index 0000000..2a0441a --- /dev/null +++ b/tools/render_graph.py @@ -0,0 +1,376 @@ +from __future__ import annotations + +import argparse +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, List, Mapping, Optional, Sequence, Set, Tuple + +import yaml + + +@dataclass(frozen=True) +class Edge: + src: str + dst: str + label: str + + +@dataclass(frozen=True) +class Node: + node_id: str + label: str + kind: str # state | pseudo | event + shape: str = "rect" # rect | rounded | pseudo + + +def _format_guard_value(v: Any) -> str: + if v is True: + return "true" + if v is False: + return "false" + if v is None: + return "null" + if isinstance(v, (int, float)): + return str(v) + if isinstance(v, str): + return v + if isinstance(v, list): + # Keep it readable; lists are rare in guards. + return "[" + ",".join(_format_guard_value(x) for x in v[:6]) + ("]" if len(v) <= 6 else ",…]") + return str(v) + + +def _guard_summary(when: Mapping[str, Any], *, max_len: int = 42) -> str: + parts: List[str] = [] + for k in sorted(when.keys()): + parts.append(f"{k}={_format_guard_value(when[k])}") + s = " ".join(parts) + if len(s) > max_len: + return s[:max_len] + "…" + return s + + +def _shorten(s: str, max_len: int) -> str: + s = s.strip().replace("\n", " ") + if len(s) <= max_len: + return s + return s[:max_len] + "…" + + +def _desc_prefix(desc: str, *, max_len: int) -> str: + """Pick a high-signal prefix for edge labels. + + We prefer the text before common separators so the main meaning appears first. + """ + s = desc.strip().replace("\n", " ") + for sep in (":", "→", "->", "(", "(", ",", ",", ";", "。"): + if sep in s: + head = s.split(sep, 1)[0].strip() + if 4 <= len(head) <= max_len: + return head + return _shorten(s, max_len) + + +def _branch_suffix(i: int) -> str: + # a, b, c ...; if too many, fall back to xN. + if 0 <= i < 26: + return chr(ord("a") + i) + return f"x{i + 1}" + + +def _event_outcome_tag(event_id: str, when: Mapping[str, Any]) -> str: + """Optional human-friendly tag appended to an edge label. + + Keep it minimal and only for high-value cases to avoid clutter. + """ + if event_id == "E16": + # Auto-bind: show the effective matching shape (only the two requested ones). + outcome = when.get("auto_bind_outcome") + if outcome == "ONE_TO_ONE": + return "(1:1)" + if outcome == "ZERO": + return "(N:0)" + return "" + + +def _load_yaml(path: Path) -> Dict[str, Any]: + with path.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + if not isinstance(data, dict): + raise TypeError("Top-level YAML must be a mapping") + return data + + +def _get_state_status(states: Mapping[str, Any], state_id: str) -> Optional[str]: + s = states.get(state_id) + if not isinstance(s, dict): + return None + status = s.get("status") + return status if isinstance(status, str) else None + + +def _iter_to_map_targets(states: Mapping[str, Any], from_state: str, to_map: Mapping[str, Any]) -> Set[str]: + key = to_map.get("key") + mp = to_map.get("map") + if key != "self.status" or not isinstance(mp, dict): + # Unsupported mapping; fall back to all targets + return {v for v in mp.values()} if isinstance(mp, dict) else set() + + status = _get_state_status(states, from_state) + if status and status != "*" and status in mp and isinstance(mp[status], str): + return {mp[status]} + + # Wildcard or unknown status: return all possible targets + targets: Set[str] = set() + for v in mp.values(): + if isinstance(v, str): + targets.add(v) + return targets + + +def _collect_state_edges(cfg: Mapping[str, Any]) -> List[Edge]: + states = cfg.get("states") if isinstance(cfg.get("states"), dict) else {} + transitions = cfg.get("transitions") if isinstance(cfg.get("transitions"), dict) else {} + + # Aggregate multiple transitions between the same two states. + edge_events: Dict[Tuple[str, str], Set[str]] = {} + + for tid, tdef in transitions.items(): + if not isinstance(tdef, dict): + continue + frm = tdef.get("from") + if not isinstance(frm, list) or not frm: + continue + + outcomes = tdef.get("outcomes") + if not isinstance(outcomes, list) or not outcomes: + continue + + tid_str = str(tid) + desc = tdef.get("desc") + desc_short = _desc_prefix(desc, max_len=16) if isinstance(desc, str) and desc else "" + + for src in frm: + if not isinstance(src, str): + continue + if src == "*": + # For visualization, we don't expand "*" because it explodes. + continue + + src_action: Optional[str] = None + src_state = states.get(src) + if isinstance(src_state, dict): + action_val = src_state.get("action") + if isinstance(action_val, str): + src_action = action_val + + for oi, o in enumerate(outcomes): + if not isinstance(o, dict): + continue + + when = o.get("when") + if not isinstance(when, dict): + when = {} + + # Respect execute_action guard in graph generation so we don't + # draw branches that are impossible for the source state's action. + if src_action is not None and "execute_action" in when: + guarded_action = when.get("execute_action") + if isinstance(guarded_action, str) and src_action != guarded_action: + continue + if isinstance(guarded_action, list) and all(isinstance(v, str) for v in guarded_action): + if src_action not in guarded_action: + continue + + targets: Set[str] = set() + if "to" in o and isinstance(o.get("to"), str): + targets.add(o["to"]) + elif "to_map" in o and isinstance(o.get("to_map"), dict): + tm = o["to_map"] + if tm.get("key") == "self.status" and isinstance(tm.get("map"), dict): + for status_key, dst_state in tm["map"].items(): + if isinstance(dst_state, str) and isinstance(status_key, str): + targets.add(dst_state) + continue + targets |= _iter_to_map_targets(states, src, tm) + + for dst in sorted(targets): + label = f"{tid_str}{_branch_suffix(oi)}" + if desc_short: + tag = _event_outcome_tag(tid_str, when) + label = f"{label} {desc_short}{tag}" + edge_events.setdefault((src, dst), set()).add(label) + + edges: List[Edge] = [] + for (src, dst), tids in sorted(edge_events.items()): + label = ", ".join(sorted(tids)) + edges.append(Edge(src=src, dst=dst, label=label)) + return edges + + +def _iter_state_nodes(cfg: Mapping[str, Any]) -> List[Node]: + nodes: List[Node] = [] + states = cfg.get("states") if isinstance(cfg.get("states"), dict) else {} + pseudo = cfg.get("pseudo_states") if isinstance(cfg.get("pseudo_states"), dict) else {} + + for sid, sdef in states.items(): + if not isinstance(sdef, dict): + continue + desc = sdef.get("desc") + label = sid + if isinstance(desc, str) and desc: + label = f"{sid}\\n{desc}" + shape = "rect" + if sdef.get("shape") == "rounded": + shape = "rounded" + elif sdef.get("shape") == "pseudo": + shape = "pseudo" + nodes.append(Node(node_id=sid, label=label, kind="state", shape=shape)) + + for pid, pdef in pseudo.items(): + label = pid + if isinstance(pdef, dict) and isinstance(pdef.get("desc"), str) and pdef.get("desc"): + label = f"{pid}\\n{pdef['desc']}" + nodes.append(Node(node_id=pid, label=label, kind="pseudo", shape="pseudo")) + + return nodes + + +def render_dot(cfg: Mapping[str, Any]) -> str: + nodes = _iter_state_nodes(cfg) + edges = _collect_state_edges(cfg) + node_ids = {n.node_id for n in nodes} + + lines: List[str] = [] + lines.append("digraph NodeStateMachine {") + lines.append(" rankdir=LR;") + lines.append(" node [fontname=\"Consolas\"];\n") + + for n in nodes: + safe_label = n.label.replace('"', "\\\"") + shape = "box" + attrs: List[str] = [f"label=\"{safe_label}\"", f"shape={shape}"] + if n.kind == "pseudo": + attrs = [f"label=\"{safe_label}\"", "shape=oval"] + elif n.shape == "pseudo": + attrs = [f"label=\"{safe_label}\"", "shape=oval"] + elif n.shape == "rounded": + attrs.append("style=rounded") + lines.append(f" \"{n.node_id}\" [{', '.join(attrs)}]; ") + + lines.append("") + for e in edges: + safe_label = e.label.replace('"', "\\\"") + if safe_label: + lines.append(f" \"{e.src}\" -> \"{e.dst}\" [label=\"{safe_label}\"]; ") + else: + lines.append(f" \"{e.src}\" -> \"{e.dst}\"; ") + + if {"S13", "S06"}.issubset(node_ids): + lines.append( + ' "S13" -> "S06" [style=dashed, label="副作用: E16识别需创建后,对侧spawn S06"]; ' + ) + + lines.append("}") + return "\n".join(lines) + + +def render_mermaid(cfg: Mapping[str, Any]) -> str: + # Mermaid flowchart is more forgiving than stateDiagram-v2 when labels are long. + # Subgraphs are always enabled to reflect the five-stage mental model. + nodes = _iter_state_nodes(cfg) + edges = _collect_state_edges(cfg) + node_ids = {n.node_id for n in nodes} + + def _group(node_id: str) -> str: + if node_id in {"S16", "S15", "S17", "S00"}: + return "BOOT" + if node_id in {"S01", "S02", "S03", "S04", "S05"}: + return "BIND" + if node_id in {"S06", "S10C", "S11C", "S12C"}: + return "CREATE" + if node_id in {"S07", "S08", "S10U", "S11U", "S12U", "S14"}: + return "UPDATE" + if node_id in {"S09", "S10D", "S11D", "S12D"}: + return "DELETE" + return "BIND" + + group_titles = { + "BOOT": "Bootstrap / Reset", + "BIND": "Binding", + "CREATE": "Create", + "UPDATE": "Update", + "DELETE": "Delete", + } + + grouped_nodes: Dict[str, List[Node]] = {k: [] for k in group_titles.keys()} + for n in nodes: + grouped_nodes[_group(n.node_id)].append(n) + + lines: List[str] = [] + lines.append("flowchart LR") + + for group_id in ["BOOT", "BIND", "CREATE", "UPDATE", "DELETE"]: + lines.append("") + lines.append(f" subgraph {group_id}[\"{group_titles[group_id]}\"]") + for n in sorted(grouped_nodes[group_id], key=lambda x: x.node_id): + safe = n.label.replace("\\n", "
").replace("\n", "
").replace("\"", "'") + if n.kind == "pseudo" or n.shape == "pseudo": + lines.append(f" {n.node_id}([\"{safe}\"]) ") + elif n.shape == "rounded": + lines.append(f" {n.node_id}(\"{safe}\")") + else: + lines.append(f" {n.node_id}[\"{safe}\"]") + lines.append(" end") + + lines.append("") + for e in edges: + safe_label = e.label.replace("\"", "'") + if safe_label: + lines.append(f" {e.src} -- \"{safe_label}\" --> {e.dst}") + else: + lines.append(f" {e.src} --> {e.dst}") + + if {"S13", "S06"}.issubset(node_ids): + lines.append(' S13 -. "副作用: E16识别需创建后,对侧spawn S06" .-> S06') + + return "\n".join(lines) + + +def main(argv: Optional[List[str]] = None) -> int: + parser = argparse.ArgumentParser(description="Render state machine graph from YAML") + parser.add_argument( + "--config", + default=str(Path(__file__).resolve().parents[1] / "sync_state_machine" / "config" / "node_state_machine.yaml"), + help="Path to YAML config", + ) + parser.add_argument( + "--format", + choices=["dot", "mermaid"], + default="mermaid", + help="Output format", + ) + parser.add_argument( + "--out", + default=str(Path(__file__).resolve().parents[1] / "docs" / "state_machine.mmd"), + help="Output file path, or '-' for stdout", + ) + + args = parser.parse_args(argv) + + cfg = _load_yaml(Path(args.config)) + if args.format == "dot": + out = render_dot(cfg) + else: + out = render_mermaid(cfg) + + if args.out == "-": + print(out) + else: + Path(args.out).write_text(out, encoding="utf-8") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/validate_config.py b/tools/validate_config.py new file mode 100644 index 0000000..c209579 --- /dev/null +++ b/tools/validate_config.py @@ -0,0 +1,524 @@ +from __future__ import annotations + +import argparse +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, Iterable, List, Mapping, Optional, Sequence, Set, Tuple, Union + +import yaml + + +# Make sure the repository root is importable so we can import +# `sync_state_machine.common.types` when running as a script. +_REPO_ROOT = Path(__file__).resolve().parents[1] +if str(_REPO_ROOT) not in sys.path: + sys.path.insert(0, str(_REPO_ROOT)) + + +class ValidationError(Exception): + pass + + +@dataclass(frozen=True) +class Problem: + level: str # ERROR | WARN + message: str + path: str + + +def _load_yaml(path: Path) -> Dict[str, Any]: + try: + with path.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + except Exception as exc: + raise ValidationError(f"Failed to read YAML: {path}: {exc}") from exc + + if not isinstance(data, dict): + raise ValidationError(f"Top-level YAML must be a mapping/dict: {path}") + return data + + +def _as_list(x: Any) -> List[Any]: + if x is None: + return [] + if isinstance(x, list): + return x + return [x] + + +def _require_keys(obj: Mapping[str, Any], keys: Sequence[str], base_path: str, problems: List[Problem]) -> None: + for k in keys: + if k not in obj: + problems.append(Problem("ERROR", f"Missing required key '{k}'", f"{base_path}.{k}")) + + +def _import_enums() -> Tuple[Set[str], Set[str], Set[str]]: + # Only validate enum NAMES; values (lowercase strings) are implementation details. + from sync_state_machine.common.types import BindingStatus, SyncAction, SyncStatus + + binding = {e.name for e in BindingStatus} + action = {e.name for e in SyncAction} + status = {e.name for e in SyncStatus} + return binding, action, status + + +def _validate_state_def( + state_id: str, + state_def: Mapping[str, Any], + binding_names: Set[str], + action_names: Set[str], + status_names: Set[str], + problems: List[Problem], +) -> None: + base = f"states.{state_id}" + _require_keys(state_def, ["binding_status", "action", "status", "desc"], base, problems) + + def _validate_enum_or_list( + value: Any, + *, + allowed: Set[str], + field_path: str, + label: str, + ) -> None: + if isinstance(value, str): + if value != "*" and value not in allowed: + problems.append(Problem("ERROR", f"Unknown {label} name: {value}", field_path)) + return + if isinstance(value, list): + if not value: + problems.append(Problem("ERROR", f"{label} list must be non-empty", field_path)) + return + for i, item in enumerate(value): + if not isinstance(item, str): + problems.append(Problem("ERROR", f"{label} list items must be strings", f"{field_path}[{i}]")) + continue + if item != "*" and item not in allowed: + problems.append(Problem("ERROR", f"Unknown {label} name: {item}", f"{field_path}[{i}]")) + return + problems.append(Problem("ERROR", f"{label} must be a string, '*' or a list of strings", field_path)) + + _validate_enum_or_list( + state_def.get("binding_status"), + allowed=binding_names, + field_path=f"{base}.binding_status", + label="BindingStatus", + ) + _validate_enum_or_list( + state_def.get("action"), + allowed=action_names, + field_path=f"{base}.action", + label="SyncAction", + ) + _validate_enum_or_list( + state_def.get("status"), + allowed=status_names, + field_path=f"{base}.status", + label="SyncStatus", + ) + + # Optional: whether the node has data_id at this state. + # Used for signature uniqueness checks; kept optional to avoid forcing all configs to specify it. + data_id_exist = state_def.get("data_id_exist", None) + if data_id_exist is not None: + field_path = f"{base}.data_id_exist" + if data_id_exist == "*": + pass + elif isinstance(data_id_exist, bool): + pass + elif isinstance(data_id_exist, list): + if not data_id_exist: + problems.append(Problem("ERROR", "data_id_exist list must be non-empty", field_path)) + else: + for i, item in enumerate(data_id_exist): + if item == "*": + continue + if not isinstance(item, bool): + problems.append( + Problem( + "ERROR", + "data_id_exist list items must be bool or '*'", + f"{field_path}[{i}]", + ) + ) + else: + problems.append(Problem("ERROR", "data_id_exist must be bool, '*', or a list of them", field_path)) + + +def _expand_enum_values(value: Any, *, all_values: Set[str]) -> Set[str]: + if isinstance(value, str): + return set(all_values) if value == "*" else {value} + if isinstance(value, list): + out: Set[str] = set() + for item in value: + if not isinstance(item, str): + continue + if item == "*": + out |= set(all_values) + else: + out.add(item) + return out + return set() + + +def _expand_data_id_exist(value: Any) -> Set[bool]: + # Missing is treated as wildcard for uniqueness check (strict). + if value is None or value == "*": + return {True, False} + if isinstance(value, bool): + return {value} + if isinstance(value, list): + out: Set[bool] = set() + for item in value: + if item == "*": + out |= {True, False} + elif isinstance(item, bool): + out.add(item) + return out if out else {True, False} + return {True, False} + + +def _validate_state_signature_uniqueness( + states: Mapping[str, Any], + *, + binding_names: Set[str], + action_names: Set[str], + status_names: Set[str], + problems: List[Problem], +) -> None: + """Ensure no two states can share the same (binding_status, action, status, data_id_exist). + + Semantics: + - '*' expands to all enum values. + - list expands to the set. + - data_id_exist missing expands to {True, False} (strict), so uniqueness failures surface. + """ + + sig_to_states: Dict[Tuple[str, str, str, bool], List[str]] = {} + + for sid, sdef in states.items(): + if not isinstance(sdef, dict): + continue + + binding_set = _expand_enum_values(sdef.get("binding_status"), all_values=binding_names) + action_set = _expand_enum_values(sdef.get("action"), all_values=action_names) + status_set = _expand_enum_values(sdef.get("status"), all_values=status_names) + data_id_set = _expand_data_id_exist(sdef.get("data_id_exist")) + + # If any of the sets are empty due to prior validation errors, skip to avoid noise. + if not binding_set or not action_set or not status_set: + continue + + for b in binding_set: + for a in action_set: + for st in status_set: + for de in data_id_set: + sig_to_states.setdefault((b, a, st, de), []).append(str(sid)) + + collisions = [(sig, sids) for sig, sids in sig_to_states.items() if len(set(sids)) > 1] + collisions.sort(key=lambda x: (-len(set(x[1])), x[0])) + + for sig, sids in collisions: + uniq = sorted(set(sids)) + problems.append( + Problem( + "ERROR", + f"State signature overlaps for (binding_status, action, status, data_id_exist)={sig}: {', '.join(uniq)}", + "states", + ) + ) + + +def _collect_state_ids(cfg: Mapping[str, Any], problems: List[Problem]) -> Set[str]: + states = cfg.get("states") + if not isinstance(states, dict): + problems.append(Problem("ERROR", "'states' must be a mapping", "states")) + return set() + return set(states.keys()) + + +def _validate_context(cfg: Mapping[str, Any], problems: List[Problem]) -> Set[str]: + ctx = cfg.get("context") + if not isinstance(ctx, dict): + problems.append(Problem("ERROR", "'context' must be a mapping", "context")) + return set() + + ctx_keys: Set[str] = set() + for k, v in ctx.items(): + ctx_keys.add(k) + if not isinstance(v, dict): + problems.append(Problem("ERROR", "context entry must be a mapping", f"context.{k}")) + continue + if "type" not in v: + problems.append(Problem("ERROR", "context entry missing 'type'", f"context.{k}.type")) + if "desc" not in v: + problems.append(Problem("WARN", "context entry missing 'desc'", f"context.{k}.desc")) + if v.get("type") == "enum": + vals = v.get("values") + if not isinstance(vals, list) or not vals: + problems.append(Problem("ERROR", "enum context must have non-empty 'values'", f"context.{k}.values")) + return ctx_keys + + +def _validate_stage(cfg: Mapping[str, Any], stage_id: str, stage_def: Mapping[str, Any], state_ids: Set[str], problems: List[Problem]) -> None: + base = f"stages.{stage_id}" + _require_keys(stage_def, ["desc", "entry_states", "exit_states"], base, problems) + + for key in ("entry_states", "exit_states"): + vals = stage_def.get(key) + if not isinstance(vals, list) or not vals: + problems.append(Problem("ERROR", f"{key} must be a non-empty list", f"{base}.{key}")) + continue + for s in vals: + if s == "*": + continue + if s not in state_ids and s not in (cfg.get("pseudo_states") or {}): + problems.append(Problem("ERROR", f"Unknown state id '{s}'", f"{base}.{key}")) + + +def _validate_stages(cfg: Mapping[str, Any], state_ids: Set[str], problems: List[Problem]) -> Set[str]: + stages = cfg.get("stages") + if not isinstance(stages, dict): + problems.append(Problem("ERROR", "'stages' must be a mapping", "stages")) + return set() + + stage_ids: Set[str] = set() + for sid, sdef in stages.items(): + stage_ids.add(sid) + if not isinstance(sdef, dict): + problems.append(Problem("ERROR", "stage definition must be a mapping", f"stages.{sid}")) + continue + _validate_stage(cfg, sid, sdef, state_ids, problems) + return stage_ids + + +def _guard_keys(guard: Mapping[str, Any]) -> Set[str]: + keys: Set[str] = set() + for k, v in guard.items(): + if isinstance(v, dict): + # Nested structures are not allowed for now. + continue + keys.add(k) + return keys + + +def _validate_transition( + tid: str, + tdef: Mapping[str, Any], + stage_ids: Set[str], + state_ids: Set[str], + pseudo_state_ids: Set[str], + context_keys: Set[str], + problems: List[Problem], +) -> None: + base = f"transitions.{tid}" + _require_keys(tdef, ["stage", "desc", "from", "outcomes"], base, problems) + + stage = tdef.get("stage") + if isinstance(stage, str) and stage not in stage_ids: + problems.append(Problem("ERROR", f"Unknown stage '{stage}'", f"{base}.stage")) + + frm = tdef.get("from") + if not isinstance(frm, list) or not frm: + problems.append(Problem("ERROR", "'from' must be a non-empty list", f"{base}.from")) + else: + for s in frm: + if s == "*": + continue + if s not in state_ids and s not in pseudo_state_ids: + problems.append(Problem("ERROR", f"Unknown from-state '{s}'", f"{base}.from")) + + outcomes = tdef.get("outcomes") + if not isinstance(outcomes, list) or not outcomes: + problems.append(Problem("ERROR", "'outcomes' must be a non-empty list", f"{base}.outcomes")) + return + + # Basic overlap check for outcome guards. + normalized_guards: List[Tuple[int, Dict[str, Any]]] = [] + + for i, o in enumerate(outcomes): + opath = f"{base}.outcomes[{i}]" + if not isinstance(o, dict): + problems.append(Problem("ERROR", "outcome must be a mapping", opath)) + continue + if "when" not in o: + problems.append(Problem("ERROR", "outcome missing 'when'", f"{opath}.when")) + continue + when = o.get("when") + if not isinstance(when, dict): + problems.append(Problem("ERROR", "'when' must be a mapping", f"{opath}.when")) + continue + + # Guard variable key validation + for k in _guard_keys(when): + if k not in context_keys and k not in ("self.status",): + problems.append(Problem("ERROR", f"Unknown context key '{k}'", f"{opath}.when.{k}")) + + has_to = "to" in o + has_to_map = "to_map" in o + if not (has_to or has_to_map): + problems.append(Problem("ERROR", "outcome must have 'to' or 'to_map'", opath)) + continue + + if has_to: + to = o.get("to") + if not isinstance(to, str): + problems.append(Problem("ERROR", "'to' must be a state id string", f"{opath}.to")) + else: + if to not in state_ids and to not in pseudo_state_ids: + problems.append(Problem("ERROR", f"Unknown to-state '{to}'", f"{opath}.to")) + + if has_to_map: + tm = o.get("to_map") + if not isinstance(tm, dict): + problems.append(Problem("ERROR", "'to_map' must be a mapping", f"{opath}.to_map")) + else: + if tm.get("key") != "self.status": + problems.append(Problem("WARN", "Only to_map.key=self.status is supported by validator", f"{opath}.to_map.key")) + mp = tm.get("map") + if not isinstance(mp, dict) or not mp: + problems.append(Problem("ERROR", "to_map.map must be a non-empty mapping", f"{opath}.to_map.map")) + else: + for k, v in mp.items(): + if not isinstance(k, str): + problems.append(Problem("ERROR", "to_map.map keys must be strings", f"{opath}.to_map.map")) + if not isinstance(v, str) or v not in state_ids: + problems.append(Problem("ERROR", f"Unknown to_map target '{v}'", f"{opath}.to_map.map.{k}")) + + emit = o.get("emit") + if emit is not None: + if not isinstance(emit, dict): + problems.append(Problem("ERROR", "emit must be a mapping", f"{opath}.emit")) + else: + if "spawn_target_node_state" in emit: + spawn = emit.get("spawn_target_node_state") + if spawn not in state_ids: + problems.append(Problem("ERROR", f"Unknown spawn_target_node_state '{spawn}'", f"{opath}.emit.spawn_target_node_state")) + + normalized_guards.append((i, dict(when))) + + # Overlap check: if two guards are compatible (no contradictory assignments), they overlap. + for i in range(len(normalized_guards)): + idx_a, ga = normalized_guards[i] + for j in range(i + 1, len(normalized_guards)): + idx_b, gb = normalized_guards[j] + if _guards_overlap(ga, gb): + problems.append( + Problem( + "WARN", + f"Outcome guards may overlap (order-dependent): outcomes[{idx_a}] vs outcomes[{idx_b}]", + f"{base}.outcomes", + ) + ) + + +def _guards_overlap(a: Mapping[str, Any], b: Mapping[str, Any]) -> bool: + for k, va in a.items(): + if k not in b: + continue + vb = b[k] + if va != vb: + return False + for k, vb in b.items(): + if k not in a: + continue + va = a[k] + if va != vb: + return False + return True + + +def validate_config(cfg_path: Path) -> Tuple[List[Problem], Dict[str, Any]]: + cfg = _load_yaml(cfg_path) + + problems: List[Problem] = [] + + binding_names, action_names, status_names = _import_enums() + + # meta + meta = cfg.get("meta") + if not isinstance(meta, dict): + problems.append(Problem("ERROR", "'meta' must be a mapping", "meta")) + + # context + context_keys = _validate_context(cfg, problems) + + # states + state_ids = _collect_state_ids(cfg, problems) + states = cfg.get("states") if isinstance(cfg.get("states"), dict) else {} + for sid, sdef in states.items(): + if not isinstance(sdef, dict): + problems.append(Problem("ERROR", "state definition must be a mapping", f"states.{sid}")) + continue + _validate_state_def(sid, sdef, binding_names, action_names, status_names, problems) + + # Ensure states are uniquely identifiable by a strict field signature. + _validate_state_signature_uniqueness( + states, + binding_names=binding_names, + action_names=action_names, + status_names=status_names, + problems=problems, + ) + + pseudo_states = cfg.get("pseudo_states") + pseudo_state_ids: Set[str] = set() + if pseudo_states is not None: + if not isinstance(pseudo_states, dict): + problems.append(Problem("ERROR", "'pseudo_states' must be a mapping", "pseudo_states")) + else: + pseudo_state_ids = set(pseudo_states.keys()) + + # stages + stage_ids = _validate_stages(cfg, state_ids, problems) + + # transitions + transitions = cfg.get("transitions") + if not isinstance(transitions, dict): + problems.append(Problem("ERROR", "'transitions' must be a mapping", "transitions")) + else: + for tid, tdef in transitions.items(): + if not isinstance(tdef, dict): + problems.append(Problem("ERROR", "transition definition must be a mapping", f"transitions.{tid}")) + continue + _validate_transition(tid, tdef, stage_ids, state_ids, pseudo_state_ids, context_keys, problems) + + # invariants: basic structural checks only (semantics validated by runtime engine) + inv = cfg.get("invariants") + if inv is not None and not isinstance(inv, dict): + problems.append(Problem("ERROR", "'invariants' must be a mapping", "invariants")) + + return problems, cfg + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser(description="Validate state machine YAML config") + parser.add_argument( + "--config", + default=str(Path(__file__).resolve().parents[1] / "sync_state_machine" / "config" / "node_state_machine.yaml"), + help="Path to YAML config", + ) + args = parser.parse_args(list(argv) if argv is not None else None) + + cfg_path = Path(args.config) + problems, _ = validate_config(cfg_path) + + errors = [p for p in problems if p.level == "ERROR"] + warns = [p for p in problems if p.level == "WARN"] + + for p in problems: + print(f"[{p.level}] {p.path}: {p.message}") + + print("\nSummary:") + print(f" errors: {len(errors)}") + print(f" warns : {len(warns)}") + + if errors: + return 2 + if warns: + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/ui/__init__.py b/ui/__init__.py new file mode 100644 index 0000000..b94a1e8 --- /dev/null +++ b/ui/__init__.py @@ -0,0 +1,3 @@ +from .app import create_app + +__all__ = ["create_app"] diff --git a/ui/__main__.py b/ui/__main__.py new file mode 100644 index 0000000..bcbfde6 --- /dev/null +++ b/ui/__main__.py @@ -0,0 +1,5 @@ +from .main import main + + +if __name__ == "__main__": + main() diff --git a/ui/app.py b/ui/app.py new file mode 100644 index 0000000..74c7b43 --- /dev/null +++ b/ui/app.py @@ -0,0 +1,155 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from fastapi import FastAPI, HTTPException, Query +from fastapi.responses import FileResponse +from pydantic import BaseModel +from sync_state_machine.common.persistence import PersistenceBackend + +from .config_models import PipelineUiConfig, list_ui_presets, preset_ui_config, file_ui_config +from sync_state_machine.config import get_preset_file_candidates +from .runner import PipelineRunnerService + + +class LogsResponse(BaseModel): + chunks: list[str] + next_index: int + + +class SqlQueryRequest(BaseModel): + sql: str + limit: int = 200 + + +class SqlQueryResponse(BaseModel): + columns: list[str] + rows: list[dict[str, Any]] + error: str = "" + + +class LoadFileRequest(BaseModel): + path: str + + +def create_app() -> FastAPI: + app = FastAPI(title="Sync State Machine UI", version="0.1.0") + service = PipelineRunnerService() + web_root = Path(__file__).resolve().parent / "web" + + @app.get("/") + async def index() -> FileResponse: + return FileResponse(str(web_root / "index.html")) + + @app.get("/api/config/default", response_model=PipelineUiConfig) + async def get_default_config() -> PipelineUiConfig: + return service.get_default_config() + + @app.get("/api/config/presets") + async def get_presets() -> dict: + data = [] + for name in list_ui_presets(): + data.append( + { + "name": name, + "candidates": [str(p) for p in get_preset_file_candidates(name)], + } + ) + return {"presets": data} + + @app.get("/api/config/preset/{preset_name}", response_model=PipelineUiConfig) + async def get_preset_config(preset_name: str) -> PipelineUiConfig: + try: + return preset_ui_config(preset_name) + except Exception as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + + @app.post("/api/config/load-file", response_model=PipelineUiConfig) + async def load_config_file(payload: LoadFileRequest) -> PipelineUiConfig: + try: + return file_ui_config(payload.path) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + + @app.get("/api/config/current", response_model=PipelineUiConfig) + async def get_current_config() -> PipelineUiConfig: + return service.get_config() + + @app.get("/api/config/visualized") + async def get_visualized_config() -> dict: + cfg = service.get_config() + return cfg.model_dump() + + @app.post("/api/config/current", response_model=PipelineUiConfig) + async def set_current_config(config: PipelineUiConfig) -> PipelineUiConfig: + try: + return service.set_config(config) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + + @app.get("/api/status") + async def get_status() -> dict: + status = service.get_status() + return { + "running": status.running, + "started_at": status.started_at, + "ended_at": status.ended_at, + "last_error": status.last_error, + "last_stats": status.last_stats or {}, + "current_log_file": status.current_log_file, + } + + @app.post("/api/run") + async def run_pipeline(config: PipelineUiConfig) -> dict: + try: + status = await service.start(config) + return { + "running": status.running, + "started_at": status.started_at, + "current_log_file": status.current_log_file, + } + except Exception as exc: + raise HTTPException(status_code=409, detail=str(exc)) from exc + + @app.post("/api/stop") + async def stop_pipeline() -> dict: + status = await service.stop() + return { + "running": status.running, + "ended_at": status.ended_at, + "last_error": status.last_error, + } + + @app.get("/api/logs", response_model=LogsResponse) + async def get_logs(since: int = Query(default=0, ge=0)) -> LogsResponse: + chunks, next_idx = service.get_logs(since) + return LogsResponse(chunks=chunks, next_index=next_idx) + + @app.get("/api/records/summary") + async def get_records_summary() -> dict: + cfg = service.get_config() + return PersistenceBackend.records_summary( + backend=cfg.persist.backend, + db_path=str(Path(cfg.persist.db_path)), + ) + + @app.post("/api/records/query", response_model=SqlQueryResponse) + async def run_records_query(payload: SqlQueryRequest) -> SqlQueryResponse: + sql = (payload.sql or "").strip() + if not sql: + return SqlQueryResponse(columns=[], rows=[], error="SQL is empty") + + cfg = service.get_config() + try: + columns, rows = PersistenceBackend.query_records( + backend=cfg.persist.backend, + db_path=str(Path(cfg.persist.db_path)), + sql=sql, + limit=payload.limit, + ) + return SqlQueryResponse(columns=columns, rows=rows, error="") + except Exception as exc: + return SqlQueryResponse(columns=[], rows=[], error=f"{type(exc).__name__}: {exc}") + + return app diff --git a/ui/config_models.py b/ui/config_models.py new file mode 100644 index 0000000..528ab94 --- /dev/null +++ b/ui/config_models.py @@ -0,0 +1,141 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any, Dict, List, Literal + +from pydantic import BaseModel, ConfigDict, Field +from sync_state_machine.config import ( + JsonlDataSourceConfig, + DataSourceConfig, + PersistConfig, + LoggingConfig, + build_config, + list_preset_names, + load_named_preset_overrides, + load_overrides_from_file, +) + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + +DEFAULT_NODE_TYPES: List[str] = [ + "company", + "supplier", + "user", + "project", + "contract", + "contract_change", + "construction_task", + "construction_task_detail", + "material", + "material_detail", + "contract_settlement", + "contract_settlement_detail", + "personnel", + "personnel_detail", + "preparation", + "production", + "lar", + "units", +] + + +class PipelineUiConfig(BaseModel): + model_config = ConfigDict(extra="forbid", validate_assignment=True) + + mode: Literal["jsonl_to_jsonl", "jsonl_to_api"] = "jsonl_to_jsonl" + + node_types: List[str] = Field(default_factory=lambda: list(DEFAULT_NODE_TYPES)) + + local_datasource: DataSourceConfig = Field( + default_factory=lambda: JsonlDataSourceConfig( + type="jsonl", + jsonl_dir=str(PROJECT_ROOT / "filtered_datasource" / "datasource" / "ecm-2025-12-02"), + ) + ) + remote_datasource: DataSourceConfig = Field( + default_factory=lambda: JsonlDataSourceConfig( + type="jsonl", + jsonl_dir=str(PROJECT_ROOT / "remote_datasource" / "datasource"), + ) + ) + + persist: PersistConfig = Field( + default_factory=lambda: PersistConfig( + db_path=str(PROJECT_ROOT / "test_results" / "sync_state_machine" / "ui_pipeline.db"), + enable=True, + wipe_on_start=False, + ) + ) + logging: LoggingConfig = Field(default_factory=LoggingConfig) + + target_project_ids: List[str] = Field(default_factory=lambda: ["f3e02e84-e81c-4aa6-88d4-f5aa108c8227"]) + strategies: Dict[str, Dict[str, Any]] = Field(default_factory=dict) + + +def default_ui_config() -> PipelineUiConfig: + return preset_ui_config("simple_sm") + + +def list_ui_presets() -> List[str]: + return list_preset_names() + + +def preset_ui_config(preset_name: str) -> PipelineUiConfig: + overrides, _, _ = load_named_preset_overrides(PROJECT_ROOT, preset_name) + run_cfg = build_config(project_root=PROJECT_ROOT, overrides=overrides) + mode: Literal["jsonl_to_jsonl", "jsonl_to_api"] = ( + "jsonl_to_api" if getattr(run_cfg.remote_datasource, "type", "jsonl") == "api" else "jsonl_to_jsonl" + ) + + strategies: Dict[str, Dict[str, Any]] = {} + for runtime in run_cfg.strategies: + item: Dict[str, Any] = { + "config": runtime.config.model_dump(), + } + strategies[runtime.node_type] = item + + return PipelineUiConfig( + mode=mode, + node_types=list(run_cfg.node_types), + local_datasource=run_cfg.local_datasource.model_copy(deep=True), + remote_datasource=run_cfg.remote_datasource.model_copy(deep=True), + persist=run_cfg.persist.model_copy(deep=True), + logging=run_cfg.logging.model_copy(deep=True), + target_project_ids=list(run_cfg.target_project_ids), + strategies=strategies, + ) + + +def file_ui_config(config_file: str) -> PipelineUiConfig: + path = Path(config_file) + if not path.is_absolute(): + path = PROJECT_ROOT / path + path = path.resolve() + + if not path.exists() or not path.is_file(): + raise FileNotFoundError(f"Config file not found: {path}") + + overrides = load_overrides_from_file(path, PROJECT_ROOT) + run_cfg = build_config(project_root=PROJECT_ROOT, overrides=overrides) + mode: Literal["jsonl_to_jsonl", "jsonl_to_api"] = ( + "jsonl_to_api" if getattr(run_cfg.remote_datasource, "type", "jsonl") == "api" else "jsonl_to_jsonl" + ) + + strategies: Dict[str, Dict[str, Any]] = {} + for runtime in run_cfg.strategies: + item: Dict[str, Any] = { + "config": runtime.config.model_dump(), + } + strategies[runtime.node_type] = item + + return PipelineUiConfig( + mode=mode, + node_types=list(run_cfg.node_types), + local_datasource=run_cfg.local_datasource.model_copy(deep=True), + remote_datasource=run_cfg.remote_datasource.model_copy(deep=True), + persist=run_cfg.persist.model_copy(deep=True), + logging=run_cfg.logging.model_copy(deep=True), + target_project_ids=list(run_cfg.target_project_ids), + strategies=strategies, + ) diff --git a/ui/main.py b/ui/main.py new file mode 100644 index 0000000..796eebb --- /dev/null +++ b/ui/main.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +import argparse + +import uvicorn + +from .app import create_app + + +def main() -> None: + parser = argparse.ArgumentParser(description="Sync State Machine UI") + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, default=8765) + args = parser.parse_args() + + uvicorn.run(create_app(), host=args.host, port=args.port) + + +if __name__ == "__main__": + main() diff --git a/ui/runner.py b/ui/runner.py new file mode 100644 index 0000000..cfedcb5 --- /dev/null +++ b/ui/runner.py @@ -0,0 +1,208 @@ +from __future__ import annotations + +import asyncio +import logging +from collections import deque +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Deque, Dict, List, Optional, Tuple + +import sync_state_machine.domain # noqa: F401 +from sync_state_machine.pipeline import ( + FullSyncPipeline, + create_pipeline_from_config, +) +from sync_state_machine.config import ( + PipelineRunConfig, + JsonlDataSourceConfig, + ApiDataSourceConfig, + apply_config_overrides, + resolve_log_file_path, +) +from sync_state_machine.pipeline.run_logger import clear_pipeline_logger_handlers, init_pipeline_logger + +from .config_models import PipelineUiConfig, default_ui_config + + +@dataclass +class RunnerStatus: + running: bool = False + started_at: Optional[str] = None + ended_at: Optional[str] = None + last_error: str = "" + last_stats: Optional[Dict[str, Any]] = None + current_log_file: str = "" + + +class _UiLogHandler(logging.Handler): + def __init__(self, callback): + super().__init__(level=logging.INFO) + self._callback = callback + + def emit(self, record: logging.LogRecord) -> None: + try: + self._callback(self.format(record) + "\n") + except Exception: + return + + +class PipelineRunnerService: + def __init__(self) -> None: + self._status = RunnerStatus(last_stats={}) + self._config = default_ui_config() + self._task: Optional[asyncio.Task] = None + self._log_chunks: Deque[str] = deque(maxlen=5000) + self._lock = asyncio.Lock() + + def get_default_config(self) -> PipelineUiConfig: + return default_ui_config() + + def get_config(self) -> PipelineUiConfig: + return self._config + + def set_config(self, cfg: PipelineUiConfig) -> PipelineUiConfig: + self._config = cfg + return self._config + + def get_status(self) -> RunnerStatus: + return self._status + + def get_logs(self, since: int = 0) -> Tuple[List[str], int]: + chunks = list(self._log_chunks) + if since < 0: + since = 0 + if since >= len(chunks): + return [], len(chunks) + return chunks[since:], len(chunks) + + async def start(self, cfg: Optional[PipelineUiConfig] = None) -> RunnerStatus: + async with self._lock: + if self._task and not self._task.done(): + raise RuntimeError("Pipeline is already running") + + if cfg is not None: + self._config = cfg + + self._log_chunks.clear() + self._status = RunnerStatus( + running=True, + started_at=datetime.now().isoformat(timespec="seconds"), + ended_at=None, + last_error="", + last_stats={}, + current_log_file="", + ) + self._task = asyncio.create_task(self._run(self._config)) + return self._status + + async def stop(self) -> RunnerStatus: + async with self._lock: + task = self._task + if not task or task.done(): + return self._status + task.cancel() + + try: + await task + except asyncio.CancelledError: + pass + return self._status + + def _append_log(self, data: str) -> int: + self._log_chunks.append(data) + return len(data) + + def _append_log_callback(self, data: str) -> None: + self._append_log(data) + + def write(self, data: str) -> int: + return self._append_log(data) + + def flush(self) -> None: + return None + + async def _run(self, cfg: PipelineUiConfig) -> None: + pipeline = None + ui_handler = None + app_logger = None + + log_cfg = cfg.logging.model_copy(deep=True) + log_path = resolve_log_file_path(log_cfg) + self._status.current_log_file = str(log_path or "") + + try: + app_logger = init_pipeline_logger( + log_file_path=log_path, + mirror_console=True, + replace_handlers=True, + ) + ui_handler = _UiLogHandler(self._append_log_callback) + ui_handler.setFormatter(logging.Formatter("%(message)s")) + app_logger.addHandler(ui_handler) + + if cfg.mode == "jsonl_to_api": + pipeline = await self._create_jsonl_to_api_pipeline(cfg) + else: + pipeline = await self._create_jsonl_to_jsonl_pipeline(cfg) + + stats = await pipeline.run() + self._status.last_stats = stats + self._status.last_error = "" + except asyncio.CancelledError: + self._status.last_error = "cancelled" + raise + except Exception as exc: + self._status.last_error = f"{type(exc).__name__}: {exc}" + finally: + try: + if pipeline is not None: + await pipeline.close() + finally: + if app_logger is not None and ui_handler is not None: + app_logger.removeHandler(ui_handler) + try: + ui_handler.close() + except Exception: + pass + clear_pipeline_logger_handlers(app_logger) + self._status.running = False + self._status.ended_at = datetime.now().isoformat(timespec="seconds") + + async def _create_jsonl_to_api_pipeline(self, cfg: PipelineUiConfig) -> FullSyncPipeline: + local_ds = cfg.local_datasource.model_copy(deep=True) + remote_ds = cfg.remote_datasource.model_copy(deep=True) + local_ds = JsonlDataSourceConfig.model_validate(local_ds.model_dump()) + remote_ds = ApiDataSourceConfig.model_validate(remote_ds.model_dump()) + + run_cfg = PipelineRunConfig( + node_types=list(cfg.node_types), + target_project_ids=list(cfg.target_project_ids), + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[], + persist=cfg.persist.model_copy(deep=True), + logging=cfg.logging.model_copy(deep=True), + ) + if cfg.strategies: + run_cfg = apply_config_overrides(run_cfg, {"strategies": dict(cfg.strategies)}) + return await create_pipeline_from_config(run_cfg) + + async def _create_jsonl_to_jsonl_pipeline(self, cfg: PipelineUiConfig) -> FullSyncPipeline: + local_ds = cfg.local_datasource.model_copy(deep=True) + remote_ds = cfg.remote_datasource.model_copy(deep=True) + local_ds = JsonlDataSourceConfig.model_validate(local_ds.model_dump()) + remote_ds = JsonlDataSourceConfig.model_validate(remote_ds.model_dump()) + + run_cfg = PipelineRunConfig( + node_types=list(cfg.node_types), + target_project_ids=list(cfg.target_project_ids), + local_datasource=local_ds, + remote_datasource=remote_ds, + strategies=[], + persist=cfg.persist.model_copy(deep=True), + logging=cfg.logging.model_copy(deep=True), + ) + if cfg.strategies: + run_cfg = apply_config_overrides(run_cfg, {"strategies": dict(cfg.strategies)}) + return await create_pipeline_from_config(run_cfg) diff --git a/ui/web/index.html b/ui/web/index.html new file mode 100644 index 0000000..765db97 --- /dev/null +++ b/ui/web/index.html @@ -0,0 +1,449 @@ + + + + + + Sync Pipeline UI + + + +
+

Sync State Machine 调试 UI

+

覆盖流程:可视化配置 → 启动运行 → 查看日志与持久化记录(含 SQL 查询)。

+
+
+

步骤 1:配置

+
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + + + + +
+ + + + + + +
+

说明:策略里支持 `skip_sync` + `load_mode`(如 supplier 的 persisted_only)。

+
+ +
+

步骤 2:运行与日志

+
+ + +
+
状态:-
+
+
+
+ +
+
+

步骤 3:记录与数据库

+
+ + +
+
+
+

记录汇总

+
+
+
+

SQL 查询结果

+
+
+
+ +
+
+
+ + + + diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..696e12c --- /dev/null +++ b/uv.lock @@ -0,0 +1,723 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version < '3.10'", +] + +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, +] + +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af" }, +] + +[[package]] +name = "ecm-sync-system" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "aiosqlite" }, + { name = "email-validator" }, + { name = "fastapi", version = "0.128.8", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "fastapi", version = "0.134.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "uvicorn", version = "0.39.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "uvicorn", version = "0.41.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiosqlite", specifier = ">=0.20,<1" }, + { name = "email-validator", specifier = ">=2.2,<3" }, + { name = "fastapi", specifier = ">=0.115,<1" }, + { name = "httpx", specifier = ">=0.27,<1" }, + { name = "pydantic", specifier = ">=2.7,<3" }, + { name = "pytz", specifier = ">=2024.1,<2027" }, + { name = "pyyaml", specifier = ">=6.0,<7" }, + { name = "uvicorn", specifier = ">=0.30,<1" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.2,<9" }, + { name = "pytest-asyncio", specifier = ">=0.23,<1" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "dnspython", version = "2.7.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "dnspython", version = "2.8.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "idna" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" }, +] + +[[package]] +name = "fastapi" +version = "0.128.8" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "annotated-doc", marker = "python_full_version < '3.10'" }, + { name = "pydantic", marker = "python_full_version < '3.10'" }, + { name = "starlette", version = "0.49.3", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, + { name = "typing-inspection", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/01/72/0df5c58c954742f31a7054e2dd1143bae0b408b7f36b59b85f928f9b456c/fastapi-0.128.8.tar.gz", hash = "sha256:3171f9f328c4a218f0a8d2ba8310ac3a55d1ee12c28c949650288aee25966007" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/9f/37/37b07e276f8923c69a5df266bfcb5bac4ba8b55dfe4a126720f8c48681d1/fastapi-0.128.8-py3-none-any.whl", hash = "sha256:5618f492d0fe973a778f8fec97723f598aa9deee495040a8d51aaf3cf123ecf1" }, +] + +[[package]] +name = "fastapi" +version = "0.134.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "annotated-doc", marker = "python_full_version >= '3.10'" }, + { name = "pydantic", marker = "python_full_version >= '3.10'" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, + { name = "typing-inspection", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/96/15/647ea81cb73b55b48fb095158a9cd64e42e9e4f1d34dbb5cc4a4939779d6/fastapi-0.134.0.tar.gz", hash = "sha256:3122b1ea0dbeaab48b5976e80b99ca7eda02be154bf03e126a33220e73255a9a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/e3/e6/fd49c28a54b7d6f5c64045155e40f6cff9ed4920055043fb5ac7969f7f2f/fastapi-0.134.0-py3-none-any.whl", hash = "sha256:f4e7214f24b2262258492e05c48cf21125e4ffc427e30dd32fb4f74049a3d56a" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556" }, + { url = "https://mirrors.aliyun.com/pypi/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba" }, + { url = "https://mirrors.aliyun.com/pypi/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284" }, + { url = "https://mirrors.aliyun.com/pypi/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe" }, + { url = "https://mirrors.aliyun.com/pypi/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69" }, + { url = "https://mirrors.aliyun.com/pypi/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75" }, + { url = "https://mirrors.aliyun.com/pypi/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05" }, + { url = "https://mirrors.aliyun.com/pypi/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34" }, + { url = "https://mirrors.aliyun.com/pypi/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11" }, + { url = "https://mirrors.aliyun.com/pypi/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14" }, + { url = "https://mirrors.aliyun.com/pypi/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375" }, + { url = "https://mirrors.aliyun.com/pypi/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23" }, + { url = "https://mirrors.aliyun.com/pypi/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa" }, + { url = "https://mirrors.aliyun.com/pypi/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008" }, + { url = "https://mirrors.aliyun.com/pypi/packages/54/db/160dffb57ed9a3705c4cbcbff0ac03bdae45f1ca7d58ab74645550df3fbd/pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a3/7d/88e7de946f60d9263cc84819f32513520b85c0f8322f9b8f6e4afc938383/pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d5/c2/aef51e5b283780e85e99ff19db0f05842d2d4a8a8cd15e63b0280029b08f/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c7/97/492ab10f9ac8695cd76b2fdb24e9e61f394051df71594e9bcc891c9f586e/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ec/23/984149650e5269c59a2a4c41d234a9570adc68ab29981825cfaf4cfad8f4/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82" }, + { url = "https://mirrors.aliyun.com/pypi/packages/71/0c/85bcbb885b9732c28bec67a222dbed5ed2d77baee1f8bba2002e8cd00c5c/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c0/4a/412d2048be12c334003e9b823a3fa3d038e46cc2d64dd8aab50b31b65499/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/73/f4/c58b6a776b502d0a5540ad02e232514285513572060f0d78f7832ca3c98b/pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ed/ae/f06ea4c7e7a9eead3d165e7623cd2ea0cb788e277e4f935af63fc98fa4e6/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c1/57/25a11dcdc656bf5f8b05902c3c2934ac3ea296257cc4a3f79a6319e61856/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/96/82/e33d5f4933d7a03327c0c43c65d575e5919d4974ffc026bc917a5f7b9f61/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/81/45/4091be67ce9f469e81656f880f3506f6a5624121ec5eb3eab37d7581897d/pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460" }, + { url = "https://mirrors.aliyun.com/pypi/packages/44/8a/a98aede18db6e9cd5d66bcacd8a409fcf8134204cdede2e7de35c5a2c5ef/pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad" }, + { url = "https://mirrors.aliyun.com/pypi/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093" }, + { url = "https://mirrors.aliyun.com/pypi/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770" }, + { url = "https://mirrors.aliyun.com/pypi/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79" }, +] + +[[package]] +name = "pytest-asyncio" +version = "0.26.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956" }, + { url = "https://mirrors.aliyun.com/pypi/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00" }, + { url = "https://mirrors.aliyun.com/pypi/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196" }, + { url = "https://mirrors.aliyun.com/pypi/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28" }, + { url = "https://mirrors.aliyun.com/pypi/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be" }, + { url = "https://mirrors.aliyun.com/pypi/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26" }, + { url = "https://mirrors.aliyun.com/pypi/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310" }, + { url = "https://mirrors.aliyun.com/pypi/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788" }, + { url = "https://mirrors.aliyun.com/pypi/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35" }, + { url = "https://mirrors.aliyun.com/pypi/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065" }, + { url = "https://mirrors.aliyun.com/pypi/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926" }, + { url = "https://mirrors.aliyun.com/pypi/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007" }, +] + +[[package]] +name = "starlette" +version = "0.49.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "anyio", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/de/1a/608df0b10b53b0beb96a37854ee05864d182ddd4b1156a22f1ad3860425a/starlette-0.49.3.tar.gz", hash = "sha256:1c14546f299b5901a1ea0e34410575bc33bbd741377a10484a54445588d00284" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/a3/e0/021c772d6a662f43b63044ab481dc6ac7592447605b5b35a957785363122/starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f" }, +] + +[[package]] +name = "starlette" +version = "0.52.1" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "anyio", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74" }, +] + +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867" }, + { url = "https://mirrors.aliyun.com/pypi/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729" }, + { url = "https://mirrors.aliyun.com/pypi/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da" }, + { url = "https://mirrors.aliyun.com/pypi/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87" }, + { url = "https://mirrors.aliyun.com/pypi/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66" }, + { url = "https://mirrors.aliyun.com/pypi/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702" }, + { url = "https://mirrors.aliyun.com/pypi/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475" }, + { url = "https://mirrors.aliyun.com/pypi/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087" }, + { url = "https://mirrors.aliyun.com/pypi/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7" }, +] + +[[package]] +name = "uvicorn" +version = "0.39.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "h11", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ae/4f/f9fdac7cf6dd79790eb165639b5c452ceeabc7bbabbba4569155470a287d/uvicorn-0.39.0.tar.gz", hash = "sha256:610512b19baa93423d2892d7823741f6d27717b642c8964000d7194dded19302" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/6b/25/db2b1c6c35bf22e17fe5412d2ee5d3fd7a20d07ebc9dac8b58f7db2e23a0/uvicorn-0.39.0-py3-none-any.whl", hash = "sha256:7beec21bd2693562b386285b188a7963b06853c0d006302b3e4cfed950c9929a" }, +] + +[[package]] +name = "uvicorn" +version = "0.41.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple/" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "click", version = "8.3.1", source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "h11", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187" }, +]