This commit is contained in:
zlwu committed 2026-08-02 17:18:33 +08:00
1 parent c00f19f8bd
commit 272c68af4b
134 files changed
+930389 -38617

No files matched your search

+1 -1
View File
@@ -80,7 +80,7 @@
### 状态与业务色
- 进行中/主状态:浅绿底 + 深绿字;警告琥珀 `#d97706` 系;危险红系用于强提醒;与订单/配送枚举映射时保持语义一致(见规范第 12 节)。
- 状态 Tag(`el-tag`):主状态/成功/警告/危险为深色底 + 白字(`#059669` / `#d97706` / `#dc2626`);中性 `info` 无背景 + 标准正文色 `#1e293b`;与订单/配送枚举映射时保持语义一致(见规范第 7.7 / 12 节)。
---
+1 -1
View File
@@ -44,7 +44,7 @@ Full specs: `openspec/changes/zkxw-engineering-standards/specs/*/spec.md`. Below
- **Miniprogram photo evidence upload** (`miniprogram`, baseline): Photo/album images only — `uni.chooseImage` + `uni.uploadFile` (`name: file`, `formData.folder`, Bearer header) → collect `data.url` → business API submits `imageUrls`. SHALL NOT use Web `el-upload`/`FormData`+`request`, Base64-in-JSON, or document pickers (`chooseMessageFile`). Upload path SHALL be in `API_ENCRYPT_EXCLUDE_PATHS`. Authority: `openspec/.../ui-conventions` §「小程序拍照凭证上传(基线)」+ `api-conventions` §「小程序拍照凭证上传接口」; reference pattern from `sqxp-wx` delivery/supplier evidence upload.
- **Button icons**: All `web-admin` `el-button` with visible text labels SHALL include a leading `<el-icon>` from `@element-plus/icons-vue` (explicit import). See `openspec/.../ui-conventions/spec.md` §「按钮须携带图标」.
- **Sort fields (sort_order/orderNum)**: web-admin 列表、新增弹窗、编辑弹窗中默认不展示排序字段。后续根据功能需要自行添加。
- **Status/conclusion/type fields as Tags**: All status, conclusion, and type fields in table columns and view dialogs SHALL render as `<el-tag>` with semantic colors. Tables: use `<el-tag :type="..." size="small">` in column templates. SystemViewDialog: use `tagType` property on `ViewField`. Semantic colors: `success`=正常/启用/已完成/通过, `warning`=进行中/待确认/已过期, `danger`=异常/已作废/拒绝/不通过, `info`=待执行/待生效/停用/默认, `primary`=特殊分类/来源类型. SHALL NOT use plain text or custom `<span class="tag">`. See `openspec/.../ui-conventions/spec.md` "状态、结论与类型字段使用 Tag 标签展示".
- **Status/conclusion/type fields as Tags**: All status, conclusion, and type fields in table columns and view dialogs SHALL render as `<el-tag>` with semantic colors (**dark background + white text** globally via `el-ui.scss`). Tables: use `<el-tag :type="..." size="small">` in column templates. SystemViewDialog: use `tagType` property on `ViewField`. Semantic colors: `success`/`primary`=`#059669`, `warning`=`#d97706`, `danger`=`#dc2626` (dark bg + white text); `info`=transparent bg + standard text `#1e293b` (avoid Element default `#909399`). SHALL NOT use plain text, custom `<span class="tag">`, or light-fill tags for non-info types. See `openspec/.../ui-conventions/spec.md` "状态、结论与类型字段使用 Tag 标签展示".
- **List primary column view link**: List pages with read-only view dialogs SHALL use `<el-link type="primary">` on the primary name/no column to open the view handler; SHALL NOT duplicate a「查看」button in the operation column when the link exists. Keep `@row-dblclick`. For standard CRUD lists (edit/delete only), SHALL NOT have an operation column—place「编辑」「删除」in the list toolbar (edit requires exactly one selected row; delete supports batch) and in `SystemViewDialog` `#hero-actions`. Reference: `crm/product/index.vue`, `system/user/index.vue`. See `openspec/.../ui-conventions/spec.md` §「列表主标识列链接查看与编辑删除外置」.
- **Template pages** — new pages SHALL match these exactly:
- Standard list: `src/views/system/unit/index.vue`
+1 -1
View File
@@ -1 +1 @@
76428
963
+32 -1
View File
@@ -49,6 +49,10 @@ from app.schemas.pl.plan import (
PlanWithProducts,
)
from app.services.pl_brand_archive import load_brand_qtys_by_plan_product_ids
from app.services.pl_product_display import (
load_crm_product_alias_maps,
resolve_product_display_names,
)
from app.schemas.pl.transport import (
PlanArrangeInfoRead,
TransportInventoryLinkRead,
@@ -90,6 +94,22 @@ router = APIRouter(prefix="/plan", tags=["运输计划-计划管理"])
_PLAN_NO_SEQ_WIDTH = 3
def _resolve_list_product_name(
product: PlPlanProduct,
*,
standard_by_id: dict[str, str],
alias_options_by_id: dict[str, list[str]],
) -> str:
"""列表展示用:优先 CRM 标准名(详情仍返回库内 product_name,以便编辑反推别名)。"""
display_name, _alias = resolve_product_display_names(
saved_product_name=product.product_name,
product_id=product.product_id,
standard_by_id=standard_by_id,
alias_options_by_id=alias_options_by_id,
)
return display_name or (product.product_name or "")
def _resolve_create_date(value: Optional[date]) -> date:
return value or date.today()
@@ -323,10 +343,16 @@ def list_plans(
for product in all_products:
products_by_plan.setdefault(product.plan_id, []).append(product)
product_ids = [product.product_id for product in all_products if product.product_id]
hazard_map = fetch_hazard_flags_map(
db,
tenant_no,
[product.product_id for product in all_products if product.product_id],
product_ids,
)
standard_by_id, alias_options_by_id = load_crm_product_alias_maps(
db,
tenant_no=tenant_no,
product_ids=product_ids,
)
brand_qtys_by_pp = load_brand_qtys_by_plan_product_ids(
db,
@@ -356,6 +382,11 @@ def list_plans(
"is_toxic": is_toxic,
"is_explosive": is_explosive,
"brand_qtys": brand_qtys,
"product_name": _resolve_list_product_name(
product,
standard_by_id=standard_by_id,
alias_options_by_id=alias_options_by_id,
),
}
)
enriched_products.append(item)
@@ -45,18 +45,15 @@ def _cert_row_complete(cert: CertRow | dict, required_name: str) -> bool:
if isinstance(cert, dict):
cert_name = cert.get("cert_name") or cert.get("certName")
expire_date = cert.get("expire_date") or cert.get("expireDate")
attachment_urls = cert.get("attachment_urls") or cert.get("attachmentUrls")
else:
cert_name = cert.cert_name
expire_date = cert.expire_date
attachment_urls = cert.attachment_urls
if not match_required_cert_name(cert_name, required_name):
return False
if not expire_date:
return False
if not (attachment_urls or "").strip():
return False
# 证书附件非必填(四页车辆/驾押人员统一)
return True
@@ -82,23 +79,20 @@ def _find_cert_for_required(
def _missing_field_labels(cert: CertRow | dict | None, required_name: str) -> list[str]:
if cert is None:
return ["有效期", "附件"]
return ["有效期"]
missing: list[str] = []
if isinstance(cert, dict):
expire_date = cert.get("expire_date") or cert.get("expireDate")
attachment_urls = cert.get("attachment_urls") or cert.get("attachmentUrls")
cert_name = cert.get("cert_name") or cert.get("certName")
else:
expire_date = cert.expire_date
attachment_urls = cert.attachment_urls
cert_name = cert.cert_name
if not match_required_cert_name(cert_name, required_name):
return ["有效期", "附件"]
return ["有效期"]
if not expire_date:
missing.append("有效期")
if not (attachment_urls or "").strip():
missing.append("附件")
# 证书附件非必填
return missing
+8 -7
View File
@@ -151,7 +151,7 @@
"149": "Community 149",
"150": "ContractListQuery",
"151": "Community 151",
"152": "Community 152",
"152": "MinIOStorage",
"153": "Community 153",
"154": "web_login_rsa_public_key",
"155": "Community 155",
@@ -161,25 +161,26 @@
"159": "context.py",
"160": "register_local_callback",
"161": "backfill_crm_contract_attachment_urls.py",
"162": "BaseStorage",
"162": "monitor.py",
"163": "login_crypto.py",
"164": "get_current_user_by_token",
"164": "redis_client.py",
"165": "Community 165",
"166": "code:block1 (/iflytek/shanxia2.0/backend)",
"167": "Community 167",
"168": "vehicle_urea.py",
"169": "product.py",
"170": "test_quote_approver_setting.py",
"171": "LocalStorage",
"172": "MinIOStorage",
"173": ".to_tenant_user_dict",
"171": "BaseStorage",
"172": "LocalStorage",
"173": "resolve_create_time_bounds",
"174": "datetime_parse.py",
"175": "vehicle_maintenance.py",
"176": "_forbid_legacy_invoice_fields",
"177": "vehicle_maintenance.py",
"178": "SoftDeleteModel",
"178": "_build_user_info_payload",
"179": "_ensure_subpack_slip_no",
"180": "menu.py",
"181": "web_login_rsa_public_key",
"185": "vehicle_urea.py",
"186": "transport_address.py",
"189": "create",
@@ -151,7 +151,6 @@
"149": "Community 149",
"150": "ContractListQuery",
"151": "Community 151",
"152": "Community 152",
"153": "Community 153",
"154": "web_login_rsa_public_key",
"155": "Community 155",
@@ -161,23 +160,17 @@
"159": "context.py",
"160": "register_local_callback",
"161": "backfill_crm_contract_attachment_urls.py",
"162": "BaseStorage",
"163": "login_crypto.py",
"164": "get_current_user_by_token",
"165": "Community 165",
"166": "code:block1 (/iflytek/shanxia2.0/backend)",
"167": "Community 167",
"168": "vehicle_urea.py",
"169": "product.py",
"170": "test_quote_approver_setting.py",
"171": "LocalStorage",
"172": "MinIOStorage",
"173": ".to_tenant_user_dict",
"174": "datetime_parse.py",
"175": "vehicle_maintenance.py",
"176": "_forbid_legacy_invoice_fields",
"177": "vehicle_maintenance.py",
"178": "SoftDeleteModel",
"179": "_ensure_subpack_slip_no",
"180": "menu.py",
"185": "vehicle_urea.py",
+196 -219
View File
@@ -1,16 +1,16 @@
# Graph Report - backend (2026-08-02)
## Corpus Check
- 301 files · ~206,686 words
- 303 files · ~206,853 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 4543 nodes · 15453 edges · 532 communities (514 shown, 18 thin omitted)
- 4551 nodes · 15467 edges · 525 communities (510 shown, 15 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 410 edges (avg confidence: 0.53)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `eccefc66`
- Built from commit: `c00f19f8`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -133,22 +133,15 @@
- [[_COMMUNITY_Community 147|Community 147]]
- [[_COMMUNITY_ContractListQuery|ContractListQuery]]
- [[_COMMUNITY_Community 151|Community 151]]
- [[_COMMUNITY_Community 152|Community 152]]
- [[_COMMUNITY_web_login_rsa_public_key|web_login_rsa_public_key]]
- [[_COMMUNITY_get_client_ip|get_client_ip]]
- [[_COMMUNITY_context.py|context.py]]
- [[_COMMUNITY_register_local_callback|register_local_callback]]
- [[_COMMUNITY_backfill_crm_contract_attachment_urls.py|backfill_crm_contract_attachment_urls.py]]
- [[_COMMUNITY_BaseStorage|BaseStorage]]
- [[_COMMUNITY_login_crypto.py|login_crypto.py]]
- [[_COMMUNITY_get_current_user_by_token|get_current_user_by_token]]
- [[_COMMUNITY_codeblock1 (iflytekshanxia2.0backend)|code:block1 (/iflytek/shanxia2.0/backend)]]
- [[_COMMUNITY_test_quote_approver_setting.py|test_quote_approver_setting.py]]
- [[_COMMUNITY_LocalStorage|LocalStorage]]
- [[_COMMUNITY_MinIOStorage|MinIOStorage]]
- [[_COMMUNITY_.to_tenant_user_dict|.to_tenant_user_dict]]
- [[_COMMUNITY_datetime_parse.py|datetime_parse.py]]
- [[_COMMUNITY_SoftDeleteModel|SoftDeleteModel]]
- [[_COMMUNITY__ensure_subpack_slip_no|_ensure_subpack_slip_no]]
- [[_COMMUNITY_menu.py|menu.py]]
- [[_COMMUNITY_crm_quote_pdf.py|crm_quote_pdf.py]]
@@ -198,251 +191,251 @@
## Import Cycles
- None detected.
## Communities (532 total, 18 thin omitted)
## Communities (525 total, 15 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.14
Nodes (15): BxAdvanceApply, BxAdvanceApproval, AdvanceService, Any, Session, 同一节点多次审批时,取 approval_time 最新的一条作为当前节点状态。, 返回全部审批动作,按时间正序排列,用于展示完整审批历史。, current_month_bounds() (+7 more)
Cohesion: 0.20
Nodes (7): BxAdvanceApply, BxAdvanceApproval, AdvanceService, Any, Session, 同一节点多次审批时,取 approval_time 最新的一条作为当前节点状态。, 返回全部审批动作,按时间正序排列,用于展示完整审批历史。
### Community 1 - "Community 1"
Cohesion: 0.28
Nodes (5): PublishVersionBody, WfNode, Any, Session, WorkflowEngine
Cohesion: 0.10
Nodes (41): CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), _change_row_to_dict(), create_contract_change(), create_contract_template(), execute_change(), export_contract_changes(), export_contract_templates() (+33 more)
### Community 2 - "Community 2"
Cohesion: 0.30
Nodes (12): PlCarrier, assert_carrier_eligible_for_transport(), carrier_agreement_expired(), carrier_audit_approved(), carrier_eligible_for_transport(), carrier_qualification_complete(), date, 资质附件均为选填,保留函数签名供兼容调用。 (+4 more)
### Community 3 - "Community 3"
Cohesion: 0.07
Nodes (66): attachment_download_url(), attachment_preview_url(), create_dept(), create_dict_data(), create_dict_type(), create_menu(), create_post(), create_role_management() (+58 more)
Cohesion: 0.08
Nodes (90): attachment_download_url(), attachment_preview_url(), AttachmentDownloadUrlBody, create_dept(), create_dict_data(), create_dict_type(), create_menu(), create_post() (+82 more)
### Community 4 - "Community 4"
Cohesion: 0.17
Nodes (43): _apply_list_filters(), assign_opportunities(), batch_update_expect_date(), batch_update_stage(), change_stage(), create_opportunity(), _decimal_value(), _enrich_user_names() (+35 more)
Cohesion: 0.09
Nodes (75): _apply_list_filters(), assign_opportunities(), batch_update_expect_date(), batch_update_stage(), change_stage(), create_opportunity(), _decimal_value(), _enrich_user_names() (+67 more)
### Community 5 - "Community 5"
Cohesion: 0.20
Nodes (24): count_source_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings(), load_settings_env(), load_user_mapping() (+16 more)
### Community 6 - "Community 6"
Cohesion: 0.27
Nodes (26): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, MenuCreateBody (+18 more)
Cohesion: 0.20
Nodes (30): assign_customer(), batch_claim_customers(), check_duplicate_customer(), claim_customer(), create_customer(), deal_customer(), _enrich_user_names(), _ensure_customer_in_scope() (+22 more)
### Community 7 - "Community 7"
Cohesion: 0.12
Nodes (36): get_password_hash(), Namespace, build_merged_users(), bx_role_labels(), check_minio(), check_mysql(), check_redis(), _clip() (+28 more)
### Community 8 - "Community 8"
Cohesion: 0.09
Nodes (71): register_quote_routes(), create_from_quote(), _quote_products_to_contract_products(), Java: createFromQuote — 返回合同 id, accept_quote(), _build_quote_filters(), calculate_quote_amount(), create_new_version() (+63 more)
Cohesion: 0.10
Nodes (53): create_from_quote(), _quote_products_to_contract_products(), Java: createFromQuote — 返回合同 id, _build_quote_filters(), calculate_quote_amount(), create_new_version(), create_quote(), _decimal_value() (+45 more)
### Community 11 - "Community 11"
Cohesion: 0.10
Nodes (54): cancel_apply(), create_apply(), create_disburse(), delete_applies(), delete_disburses(), get_apply(), get_disburse(), list_applies() (+46 more)
Nodes (55): cancel_apply(), create_apply(), create_disburse(), delete_applies(), delete_disburses(), get_apply(), get_disburse(), list_applies() (+47 more)
### Community 12 - "Community 12"
Cohesion: 0.07
Nodes (43): AttachmentUploadResponse, ChangePasswordRequest, Config, LoginRequest, LoginResponse, Pydantic schemas - 用户认证, ResetPasswordRequest, UserCreate (+35 more)
Cohesion: 0.04
Nodes (76): contact_add(), contact_delete(), customer_create(), customer_delete(), customer_update(), customer_name_exists(), BaseModel, AttachmentUploadResponse (+68 more)
### Community 13 - "Community 13"
Cohesion: 0.19
Nodes (26): create_instance(), create_process_def(), get_all_tasks_for_business(), get_instance(), get_nodes_by_version(), get_process_def(), get_transitions_by_version(), list_completed_tasks() (+18 more)
Cohesion: 0.09
Nodes (43): create_instance(), create_process_def(), create_task(), get_all_tasks_for_business(), get_instance(), get_latest_version(), get_nodes_by_version(), get_pending_tasks_by_node() (+35 more)
### Community 14 - "Community 14"
Cohesion: 0.10
Nodes (47): check_document_expiry(), document_reminder_stats(), get_inventory_ledger(), get_summary(), list_document_reminders(), list_transactions(), list_warnings(), date (+39 more)
Cohesion: 0.16
Nodes (32): check_document_expiry(), document_reminder_stats(), get_inventory_ledger(), get_summary(), list_document_reminders(), list_transactions(), list_warnings(), date (+24 more)
### Community 15 - "Community 15"
Cohesion: 0.12
Nodes (14): BxReimburseApply, BxReimburseApproval, BxReimburseDetail, BxReimburseInvoice, BxReimburseOffset, ReimburseApplyOut, ReimburseInvoiceBriefOut, Any (+6 more)
Cohesion: 0.10
Nodes (41): approve_reimburse(), approved_by_me(), _build_details_data(), create_reimburse(), delete_reimburse(), get_approval_history(), get_approvals(), get_generated_title() (+33 more)
### Community 16 - "Community 16"
Cohesion: 0.09
Nodes (60): cancel_apply(), create_apply(), create_record(), delete_applies(), delete_records(), get_apply(), get_record(), list_applies() (+52 more)
### Community 18 - "Community 18"
Cohesion: 0.11
Nodes (37): advance_pending_approval_stats(), advance_status_counts(), approve_advance(), approved_by_me(), create_advance(), delete_advance(), _fill_offset_amounts(), get_advance() (+29 more)
Cohesion: 0.08
Nodes (63): advance_pending_approval_stats(), advance_status_counts(), approve_advance(), approved_by_me(), create_advance(), delete_advance(), _fill_offset_amounts(), get_advance() (+55 more)
### Community 19 - "Community 19"
Cohesion: 0.16
Nodes (20): _avatar_url_field(), _build_user_info_payload(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/shanxia2.0.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 与 web-admin 静态路由 meta.roles(admin/super_admin)对齐的单元素数组。, 与 web-admin `userInfo` 字段约定一致。 (+12 more)
Nodes (17): change_current_user_password(), get_current_user_profile(), get_web_auth_menu_codes(), public_quote_share(), Request, Session, 获取当前用户信息(与 sys_user 字段对应)。, 获取当前用户菜单权限标识(sys_menu.perms,经角色继承)。 (+9 more)
### Community 21 - "Community 21"
Cohesion: 0.07
Nodes (70): _alias_row_to_dict(), _assert_brand_deletable(), barcode_exists(), _brand_row_to_dict(), _build_category_tree(), category_code_exists(), _collect_category_with_ancestors(), create_category() (+62 more)
Cohesion: 0.13
Nodes (36): _assert_brand_deletable(), barcode_exists(), category_code_exists(), _category_row_to_dict(), create_category(), create_product(), generate_auto_product_no(), generate_barcode() (+28 more)
### Community 22 - "Community 22"
Cohesion: 0.08
Nodes (28): parse_admin_request_json(), Any, Request, 运营 Web(/web/admin)JSON 请求体解析。 与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `{, 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。 Returns:, ApiCryptoError, _b64url_decode(), _b64url_encode() (+20 more)
### Community 23 - "Community 23"
Cohesion: 0.15
Nodes (6): convert_heic_to_jpeg(), OSSStorage, process_image_content(), 将 HEIC/HEIF 格式转换为 JPEG 格式, 处理图片内容,如果是 HEIC 格式则转换为 JPEG, BytesIO
Cohesion: 0.05
Nodes (31): BaseStorage, convert_heic_to_jpeg(), get_storage(), LocalStorage, MinIOStorage, OSSStorage, process_image_content(), Any (+23 more)
### Community 24 - "Community 24"
Cohesion: 0.50
Nodes (4): ApiRequestLogCRUD, Session, SysApiRequestLog, SysApiRequestLogHis
Cohesion: 0.13
Nodes (25): _build_public_page(), _format_file_size(), _format_plan_date(), get_public_transport(), _get_transport_by_token(), _parse_feedback_images(), Session, UploadFile (+17 more)
### Community 25 - "Community 25"
Cohesion: 0.07
Nodes (84): _build_driver_url(), get_plan_arrange_info(), 获取计划已安排运输后的司机链接与地磅出入库关联(供查看弹窗复制简述/二维码)。, _build_public_page(), _format_file_size(), _format_plan_date(), get_public_transport(), _get_transport_by_token() (+76 more)
Cohesion: 0.12
Nodes (58): _apply_plan_logistics_from_payload(), _apply_transport_arrange_fields(), arrange_transport(), _assert_vehicle_carrier_eligible(), _build_arrange_result(), _build_driver_url(), create_transport(), _ensure_driver_access_token() (+50 more)
### Community 26 - "Community 26"
Cohesion: 0.10
Nodes (45): CRM 合同 API 路由 — GET/PUT/DELETE/POST 对齐原 Java CRM, register_contract_routes(), 运营端角色守卫:admin / super_admin 可访问。, 接口菜单权限守卫。super_admin 直接放行。, require_admin_or_super_admin(), require_menu_code(), batch_assign_owner(), batch_submit_contract_approval() (+37 more)
Cohesion: 0.16
Nodes (28): register_contract_routes(), batch_assign_owner(), batch_submit_contract_approval(), _ensure_contract_in_scope(), finish_contract(), generate_template_no(), get_contract_row(), _get_contract_row_in_scope() (+20 more)
### Community 27 - "Community 27"
Cohesion: 0.17
Nodes (28): _apply_plan_product_update(), _apply_plan_update(), AutoGenerateMonthlyResult, _base_query(), create_plan(), delete_plan(), _generate_plan_no(), get_plan() (+20 more)
Cohesion: 0.13
Nodes (32): _apply_plan_product_update(), _apply_plan_update(), AutoGenerateMonthlyResult, _base_query(), create_plan(), delete_plan(), _generate_plan_no(), get_plan() (+24 more)
### Community 28 - "Community 28"
Cohesion: 0.11
Nodes (57): PlFreightSettlement, PlFreightSettlementApproval, PlFreightSettlementTransport, PlRemittanceVoucher, 运费结算表 pl_freight_settlement, 运费结算审批 pl_freight_settlement_approval, 结算单-运输关联表 pl_freight_settlement_transport, 汇款凭证表 pl_remittance_voucher (+49 more)
Cohesion: 0.06
Nodes (90): approve_settlement_legacy(), cancel_settlement(), create_settlement(), delete_settlement(), disburse_settlement(), _generate_settlement_no(), get_settlement(), get_settlement_approval_flow() (+82 more)
### Community 29 - "Community 29"
Cohesion: 0.11
Cohesion: 0.12
Nodes (31): _build_public_page(), _build_site_product_read(), _format_file_size(), get_public_site(), _get_site_link_by_token(), _parse_feedback_images(), Session, UploadFile (+23 more)
### Community 30 - "Community 30"
Cohesion: 0.10
Nodes (34): menu_badge_stats(), Session, Session, recognize_cert(), RecognizeCertBody, RecognizeCertResult, _address_to_read(), _build_address_query() (+26 more)
Cohesion: 0.16
Nodes (26): clear_target_categories(), compute_level(), count_target_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings() (+18 more)
### Community 33 - "Community 33"
Cohesion: 0.20
Nodes (15): bind_biz(), delete_attachment(), download_file(), list_by_biz(), _parse_id_list(), preview_attachment(), Session, UploadFile (+7 more)
Cohesion: 0.18
Nodes (17): bind_biz(), delete_attachment(), download_file(), list_by_biz(), _parse_id_list(), preview_attachment(), Session, UploadFile (+9 more)
### Community 34 - "Community 34"
Cohesion: 0.11
Nodes (49): customer_create(), customer_update(), follow_by_customer(), follow_detail(), assign_customer(), batch_claim_customers(), check_duplicate_customer(), claim_customer() (+41 more)
Cohesion: 0.12
Nodes (29): get_pool_record(), list_pool_records(), Any, Session, _row_to_dict(), total_pages(), create_pool_rule(), delete_pool_rules() (+21 more)
### Community 35 - "Community 35"
Cohesion: 0.18
Nodes (36): clear_portal_workflow(), _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_bx_user_mapping(), load_runtime_settings() (+28 more)
### Community 36 - "Community 36"
Cohesion: 0.18
Nodes (25): approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), delete_process_def(), _enrich_task_list(), get_business_all_tasks(), _get_business_form_fields() (+17 more)
Cohesion: 0.16
Nodes (32): approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), _enrich_task_list(), get_business_all_tasks(), _get_business_form_fields(), get_designer_data() (+24 more)
### Community 37 - "Community 37"
Cohesion: 0.24
Nodes (18): _actor_ids(), _actor_names(), assert_row_deletable_by_creator(), assert_rows_deletable_by_creator(), can_delete_by_creator(), is_super_admin(), normalize_user_info(), Any (+10 more)
### Community 38 - "Community 38"
Cohesion: 0.21
Nodes (15): load_brand_qtys_by_plan_product_ids(), persist_plan_product_brand_qtys(), Any, Decimal, Session, 按计划产品明细 ID 批量加载归档品牌数量(brandId/brandName/qty)。, 软删旧品牌量行后按归档结果插入;无品牌约定则只软删不插入。, validate_brand_qty_rows() (+7 more)
Cohesion: 0.42
Nodes (10): apply_archive_inventory_for_plan(), apply_brand_stock_change(), get_or_create_inventory(), Decimal, Session, qty_delta_for_plan(), 计划归档按产品+品牌写入库存台账与流水。 直销单 (direct) 首期不记账;入库增加、出库扣减(允许负库存,不做不足拦截)。 调整归档时先按 plan_i, 冲销该计划已产生的库存流水(调整归档前调用)。 (+2 more)
### Community 39 - "Community 39"
Cohesion: 0.11
Nodes (44): clue_assign(), clue_convert(), clue_create(), clue_delete(), clue_invalid(), clue_update(), clue_update_level(), clue_update_status() (+36 more)
Cohesion: 0.12
Nodes (49): assign_clues(), check_convert(), check_duplicate_clue(), convert_clue(), create_clue(), _enrich_user_names(), _ensure_clue_in_scope(), create_clue_follow() (+41 more)
### Community 42 - "Community 42"
Cohesion: 0.19
Nodes (32): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+24 more)
### Community 43 - "Community 43"
Cohesion: 0.11
Nodes (28): create_invoice(), delete_invoice(), get_mine_wallet_summary(), list_invoice_ledgers(), list_invoice_wallets(), list_invoices(), Request, Session (+20 more)
Cohesion: 0.08
Nodes (37): create_invoice(), delete_invoice(), get_mine_wallet_summary(), list_invoice_ledgers(), list_invoice_wallets(), list_invoices(), Request, Session (+29 more)
### Community 44 - "Community 44"
Cohesion: 0.13
Nodes (16): ApiCryptoMiddleware, _db_pool_keepalive_loop(), _error_json(), lifespan(), Exception, Request, 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin (+8 more)
Nodes (17): ApiCryptoMiddleware, ApiRequestLogMiddleware, _db_pool_keepalive_loop(), _error_json(), lifespan(), Exception, Request, 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误 (+9 more)
### Community 45 - "Community 45"
Cohesion: 0.22
Nodes (15): ApiRequestLogMiddleware, _claims_from_auth(), _format_body_bytes(), _persist_log(), Any, Request, 统一记录 API 请求/响应出入参的中间件, _redact_obj() (+7 more)
Cohesion: 0.50
Nodes (4): ApiRequestLogCRUD, Session, SysApiRequestLog, SysApiRequestLogHis
### Community 46 - "Community 46"
Cohesion: 0.18
Nodes (17): get_oper_log_meta(), OperLogMeta, 请求级操作日志元数据(ContextVar), 供异步落库线程使用,避免 ContextVar 跨线程丢失。, set_oper_log_meta(), snapshot_oper_log_meta(), _format_summary(), oper_log() (+9 more)
Nodes (22): register_quote_routes(), accept_quote(), delete_pending_approvals(), Java: CrmQuoteApprovalServiceImpl.withdrawApproval(不校验创建人), Java: deletePendingApprovals, withdraw_approval(), generate_pdf(), generate_share() (+14 more)
### Community 48 - "Community 48"
Cohesion: 0.20
Nodes (28): _apply_inventory_product_update(), _apply_inventory_update(), _base_query(), create_inventory(), create_link_for_plan(), delete_inventory(), _generate_batch_no(), _get_inventory() (+20 more)
Nodes (26): _apply_inventory_product_update(), _apply_inventory_update(), _base_query(), create_inventory(), create_link_for_plan(), delete_inventory(), _generate_batch_no(), _get_inventory() (+18 more)
### Community 49 - "Community 49"
Cohesion: 0.07
Nodes (50): _build_page(), _get_by_token(), _make_handlers(), _models(), Session, 运输计划 · 入库/出库单现场免登录公共 API, BizAttachment, PlDocumentReminder (+42 more)
Cohesion: 0.11
Nodes (33): list_vehicles(), _vehicle_to_read(), PlCert, CertRead, 运输计划 - 安排运输时车辆/人员/证件资源快照 Schema, SnapshotCertRead, SnapshotPersonnelRow, TransportResourceSnapshot (+25 more)
### Community 50 - "Community 50"
Cohesion: 0.13
Nodes (34): approve_settlement_legacy(), cancel_settlement(), create_settlement(), delete_settlement(), disburse_settlement(), _generate_settlement_no(), get_settlement(), get_settlement_approval_flow() (+26 more)
Cohesion: 0.29
Nodes (16): create_contact(), get_contact(), list_contacts_by_customer(), _parse_optional_date(), Any, date, Session, _row_to_dict() (+8 more)
### Community 51 - "Community 51"
Cohesion: 0.11
Nodes (32): generate_uuid(), CrmProductBrand, PlTransportProductBrandQty, PlTransportProductFeedback, 运输单按产品回传 pl_transport_product_feedback, 运输单产品回传品牌数量 pl_transport_product_brand_qty, _dict_field(), format_brand_qty_summary() (+24 more)
Cohesion: 0.10
Nodes (35): load_brand_qtys_by_plan_product_ids(), persist_plan_product_brand_qtys(), Any, Decimal, Session, 按计划产品明细 ID 批量加载归档品牌数量(brandId/brandName/qty)。, 软删旧品牌量行后按归档结果插入;无品牌约定则只软删不插入。, validate_brand_qty_rows() (+27 more)
### Community 52 - "Community 52"
Cohesion: 0.18
Nodes (29): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+21 more)
### Community 53 - "Community 53"
Cohesion: 0.12
Nodes (29): 报销模块认证适配:门户 JWT 用户 → bx 业务上下文。, filter_current_cycle_approvals(), 审批轮次过滤 — 驳回后重新提交时,进度接口仅展示当前轮次。, 审批进度仅展示当前轮次;完整历史由 get_approval_history 返回。, 报销模块 Service 基类 — 租户隔离 + UUID + 软删除。, apply_bx_scope(), assert_bx_attachment_biz_in_scope(), assert_bx_biz_in_scope() (+21 more)
Cohesion: 0.10
Nodes (37): 报销模块认证适配:门户 JWT 用户 → bx 业务上下文。, filter_current_cycle_approvals(), 审批轮次过滤 — 驳回后重新提交时,进度接口仅展示当前轮次。, 审批进度仅展示当前轮次;完整历史由 get_approval_history 返回。, 报销模块 Service 基类 — 租户隔离 + UUID + 软删除。, apply_bx_scope(), assert_bx_attachment_biz_in_scope(), assert_bx_biz_in_scope() (+29 more)
### Community 54 - "Community 54"
Cohesion: 0.26
Nodes (23): _get_by_plan(), get_inbound(), get_inbound_by_plan(), _get_order(), get_outbound(), get_outbound_by_plan(), inbound_site_url(), list_inbound() (+15 more)
Cohesion: 0.18
Nodes (29): _get_by_plan(), get_inbound(), get_inbound_by_plan(), _get_order(), get_outbound(), get_outbound_by_plan(), inbound_site_url(), list_inbound() (+21 more)
### Community 58 - "Community 58"
Cohesion: 0.25
Nodes (14): 获取用户所有角色的数据权限配置。 返回: [{"data_scope": str, "details": [SysRoleDataScopeDetai, _resolve_user_role_scopes(), business_type_from_path(), title_from_path(), _apply_oper_log_scope(), get_oper_log(), list_oper_logs(), _oper_log_row_in_scope() (+6 more)
Cohesion: 0.07
Nodes (51): operlog_detail(), operlog_list(), Session, 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), _user_info(), _claims_from_auth(), _format_body_bytes(), _persist_log() (+43 more)
### Community 59 - "Community 59"
Cohesion: 0.20
Nodes (28): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+20 more)
### Community 60 - "Community 60"
Cohesion: 0.10
Nodes (40): bx_health(), 报销(bx)API 路由聚合 — REST 风格,协议对齐 bx 原系统。, P0 健康检查:验证 bx 路由已挂载且响应协议为 code=0。, approve_reimburse(), approved_by_me(), _build_details_data(), create_reimburse(), delete_reimburse() (+32 more)
Cohesion: 0.18
Nodes (17): _alias_row_to_dict(), _build_category_tree(), _collect_category_with_ancestors(), list_category_tree(), list_oss_by_biz(), list_product_options(), list_products(), _load_brands_aliases_maps() (+9 more)
### Community 61 - "Community 61"
Cohesion: 0.16
Nodes (33): DbPurchasePlan, PlTransportDbLink, 运输-地磅出入库关联 pl_transport_db_link, _apply_plan_quantity_delta(), _create_db_inventory(), _create_db_plan(), DibangInventoryLinkResult, find_monthly_db_plan() (+25 more)
Cohesion: 0.17
Nodes (34): DbInboundOutbound, DbPurchasePlan, PlTransportDbLink, 运输-地磅出入库关联 pl_transport_db_link, _apply_plan_quantity_delta(), _create_db_inventory(), _create_db_plan(), DibangInventoryLinkResult (+26 more)
### Community 62 - "Community 62"
Cohesion: 0.21
Nodes (22): clear_target_products(), count_target_rows(), _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings() (+14 more)
### Community 63 - "Community 63"
Cohesion: 0.15
Nodes (16): 数据模型(与 docs/sql/shanxia2.0.sql 全库导出基线对齐的核心系统表), Web 管理端约定角色(由 sys_role.role_name 映射而来,非数据库枚举), 流程实例 wf_process_instance, UserRole, WfProcessInstance, _dispatch_local(), Any, 工作流回调服务 —— 流程状态变更时通知业务系统 (+8 more)
Cohesion: 0.31
Nodes (3): Any, Session, WorkflowEngine
### Community 64 - "Community 64"
Cohesion: 0.04
Nodes (160): clue_check_convert(), clue_check_duplicate(), clue_export(), clue_follow_create(), clue_follow_delete(), clue_follow_detail(), clue_follow_list(), clue_follow_statistics() (+152 more)
Nodes (197): clue_assign(), clue_check_convert(), clue_check_duplicate(), clue_convert(), clue_create(), clue_delete(), clue_detail(), clue_export() (+189 more)
### Community 65 - "Community 65"
Cohesion: 0.10
Nodes (62): cancel_apply(), create_apply(), create_process(), delete_applies(), delete_processes(), get_apply(), get_process(), list_applies() (+54 more)
Nodes (58): cancel_apply(), create_apply(), create_process(), delete_applies(), delete_processes(), get_apply(), get_process(), list_applies() (+50 more)
### Community 66 - "Community 66"
Cohesion: 0.15
Nodes (24): create_workflow(), delete_workflow(), get_workflow(), get_workflow_by_biz_type(), list_workflows(), Session, save_workflow_nodes(), update_workflow() (+16 more)
Cohesion: 0.13
Nodes (23): create_workflow(), delete_workflow(), get_workflow(), get_workflow_by_biz_type(), list_workflows(), Session, save_workflow_nodes(), update_workflow() (+15 more)
### Community 67 - "Community 67"
Cohesion: 0.29
Nodes (16): clue_detail(), customer_detail(), ensure_crm_customer_linked_row_in_scope(), ensure_crm_owner_row_in_scope(), 客户子表(开票信息等):先校验关联客户 owner scope,否则校验 create_by。, _clear_default_for_customer(), create_invoice_info(), get_invoice_info() (+8 more)
Cohesion: 0.38
Nodes (13): ensure_crm_customer_linked_row_in_scope(), 客户子表(开票信息等):先校验关联客户 owner scope,否则校验 create_by。, _clear_default_for_customer(), create_invoice_info(), get_invoice_info(), list_invoice_info_by_customer(), Any, Session (+5 more)
### Community 68 - "Community 68"
Cohesion: 0.34
Nodes (18): batch_add_opportunity_products(), _calc_subtotal(), create_opportunity_product(), _decimal_value(), _fill_product_redundant(), _get_opportunity_for_product(), get_opportunity_product(), list_opportunity_products() (+10 more)
Cohesion: 0.15
Nodes (33): bind_vehicle_driver(), create_vehicle(), get_vehicle(), paste_recognize_commit(), update_vehicle(), _vehicle_to_detail(), generate_uuid(), PlVehicle (+25 more)
### Community 69 - "Community 69"
Cohesion: 0.15
Nodes (25): _append_user_scope_conditions(), apply_data_scope(), assert_row_in_data_scope(), _collect_scope_ids(), _get_child_dept_ids(), get_user_dept_id(), Session, 数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3 (+17 more)
Cohesion: 0.14
Nodes (26): _append_user_scope_conditions(), apply_data_scope(), _collect_scope_ids(), _get_child_dept_ids(), get_user_dept_id(), Session, 数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3, 合并多角色数据范围为 dept_ids / user_ids 并集。 (+18 more)
### Community 70 - "Community 70"
Cohesion: 0.39
Nodes (10): create_post(), get_post(), list_posts(), post_code_exists(), Any, Session, _row_to_dict(), soft_delete_post() (+2 more)
### Community 71 - "Community 71"
Cohesion: 0.05
Nodes (68): CRM 报价单 API 路由 — 挂接到 crm.router, BaseModel, InvoiceAttachmentOut, InvoiceOut, LedgerOut, WalletSummaryOut, ContactByCustomerBody, ContactDetailBody (+60 more)
Cohesion: 0.11
Nodes (32): CRM 报价单 API 路由 — 挂接到 crm.router, QuoteApproverSettingSaveBody, QuoteAcceptBody, QuoteApprovalApproveBody, QuoteApprovalListBody, QuoteApprovalRefreshNamesBody, QuoteApprovalWithdrawBody, QuoteCreateBody (+24 more)
### Community 72 - "Community 72"
Cohesion: 0.17
Nodes (30): apply_biz_backfill(), BackfillRule, BizRef, build_biz_index(), count_target_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows() (+22 more)
Cohesion: 0.19
Nodes (28): apply_biz_backfill(), BackfillRule, BizRef, build_biz_index(), count_target_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows() (+20 more)
### Community 73 - "Community 73"
Cohesion: 0.20
@@ -457,68 +450,68 @@ Cohesion: 0.11
Nodes (12): get_wechat_pay_client(), get_wechat_pay_v2(), Any, 微信支付工具模块 支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.html, 统一下单接口 (V3) Args: out_trade_no: 商户订单号 total_amo, 申请退款 Args: out_trade_no: 商户订单号 total_amount: 订单, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API) Args: out_trade_no: 商户订单号 total_f (+4 more)
### Community 78 - "Community 78"
Cohesion: 0.16
Nodes (26): clear_target_categories(), compute_level(), count_target_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings() (+18 more)
Cohesion: 0.40
Nodes (12): create_follow(), _enrich_follow_dict(), get_follow(), list_follows(), list_follows_by_customer(), Any, Session, _row_to_dict() (+4 more)
### Community 81 - "Community 81"
Cohesion: 0.21
Nodes (13): format_datetime(), get_current_time(), parse_datetime(), datetime, datetime_end_of_day(), fmt_date(), fmt_datetime(), inventory_date_to_api() (+5 more)
Cohesion: 0.23
Nodes (12): enrich_io_items_with_brand_feedback(), enrich_io_order_dict(), _format_io_product_summary_line(), _io_item_brand_qty_model(), merge_plan_logistics_into_order(), merge_plan_product_into_item(), Any, 读时附加品牌模式、CRM 品牌选项与现场品牌数量子表。 (+4 more)
### Community 83 - "Community 83"
Cohesion: 0.09
Nodes (53): CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), _advance_contract_after_approval(), approve_contract(), approve_contract_by_contract_id(), approve_pass(), approve_reject(), approve_transfer() (+45 more)
Cohesion: 0.15
Nodes (30): _advance_contract_after_approval(), approve_contract(), approve_contract_by_contract_id(), approve_pass(), approve_reject(), approve_transfer(), _build_approval_list_filters(), can_user_approve() (+22 more)
### Community 84 - "Community 84"
Cohesion: 0.23
Nodes (23): build_id_maps(), clip_text(), count_rows(), export_mapping(), fetch_rows(), legacy_id_to_str(), main(), map_id() (+15 more)
### Community 86 - "Community 86"
Cohesion: 0.19
Nodes (26): _apply_weighing_product_update(), _apply_weighing_update(), _base_query(), create_weighing(), delete_weighing(), _get_weighing(), get_weighing_related(), list_weighing() (+18 more)
Cohesion: 0.14
Nodes (37): _apply_weighing_product_update(), _apply_weighing_update(), _base_query(), create_weighing(), delete_weighing(), _get_weighing(), get_weighing_related(), list_weighing() (+29 more)
### Community 87 - "Community 87"
Cohesion: 0.20
Nodes (19): approve_quote(), can_user_approve(), create_approval_records(), delete_pending_approvals(), get_quote_approval(), list_quote_approvals(), Any, Session (+11 more)
Cohesion: 0.26
Nodes (15): approve_quote(), can_user_approve(), create_approval_records(), get_quote_approval(), list_quote_approvals(), Any, Session, CRM 报价单审批 CRUD — 对照 CrmQuoteApprovalServiceImpl.java (+7 more)
### Community 88 - "Any"
Cohesion: 0.18
Nodes (31): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), legacy_parent_id(), load_oss_id_to_url(), load_runtime_settings() (+23 more)
### Community 89 - "pl_ocr_service.py"
Cohesion: 0.19
Nodes (22): PlOcrUsageMonth, 阿里云 OCR 月度调用计数 pl_ocr_usage_month(按自然月全局统计), assert_quota_available(), _build_ocr_client(), compress_image_bytes(), current_usage_month(), _first_attachment_url(), get_or_create_usage_row() (+14 more)
Cohesion: 0.08
Nodes (50): menu_badge_stats(), Session, Session, recognize_cert(), RecognizeCertBody, RecognizeCertResult, _address_to_read(), _build_address_query() (+42 more)
### Community 91 - "pl_vehicle_recharge_service.py"
Cohesion: 0.10
Nodes (58): _apply_contract_entity_fields(), _build_contract_filters(), _build_customer_address(), _calc_amount_with_tax(), _change_row_to_dict(), _contract_period_key(), contract_row_to_dict(), create_contract() (+50 more)
Cohesion: 0.11
Nodes (54): _apply_contract_entity_fields(), _build_contract_filters(), _build_customer_address(), _calc_amount_with_tax(), _contract_period_key(), contract_row_to_dict(), create_contract(), create_from_opportunity() (+46 more)
### Community 92 - "Community 92"
Cohesion: 0.14
Nodes (29): 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password(), change_password(), create_user(), get_user(), get_user_with_relations(), _hash_password(), list_post_ids_for_user() (+21 more)
Cohesion: 0.16
Nodes (25): 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password(), change_password(), create_user(), get_user(), get_user_with_relations(), _hash_password(), list_post_ids_for_user() (+17 more)
### Community 93 - "_invoice_info_by_customer_impl"
Cohesion: 0.23
Nodes (19): contact_by_customer(), contact_detail(), contact_set_primary(), create_contact(), get_contact(), list_contacts_by_customer(), _parse_optional_date(), Any (+11 more)
Cohesion: 0.28
Nodes (11): assert_products_allowed_for_supplier(), enrich_products_with_hazard_flags(), get_supplier_hazard_flags(), product_allowed(), Any, Session, 批量回填明细行 isToxic/isExplosive(来自产品主数据,供前端切换主体剔除)。, test_dual_requires_both() (+3 more)
### Community 94 - "response.py"
Cohesion: 0.09
Nodes (37): pool_rule_add(), pool_rule_delete(), pool_rule_detail(), pool_rule_execute(), pool_rule_list(), pool_rule_update(), pool_rule_update_status(), get_pool_record() (+29 more)
Cohesion: 0.12
Nodes (15): pool_rule_add(), pool_rule_delete(), pool_rule_detail(), pool_rule_execute(), pool_rule_list(), pool_rule_update(), pool_rule_update_status(), PoolRuleAddBody (+7 more)
### Community 95 - "Community 95"
Cohesion: 0.21
Nodes (13): Config, 文件存储工具模块 支持多种存储方式: 1. 本地存储 (local) - 默认 2. 七牛云存储 (qiniu) - 推荐生产环境使用 3. 阿里云OSS (, create_tenant(), get_tenant(), list_tenants(), Any, Session, _row_to_dict() (+5 more)
Cohesion: 0.35
Nodes (11): create_tenant(), get_tenant(), list_tenants(), Any, Session, _row_to_dict(), soft_delete_tenant(), tenant_no_exists() (+3 more)
### Community 97 - "_ensure_subpack_slip_no"
Cohesion: 0.05
Nodes (111): approve_carrier(), bind_vehicle_driver(), create_carrier(), create_driver(), create_personnel(), create_vehicle(), delete_carrier(), delete_driver() (+103 more)
Cohesion: 0.09
Nodes (56): approve_carrier(), create_carrier(), create_driver(), create_personnel(), delete_carrier(), delete_driver(), delete_personnel(), delete_vehicle() (+48 more)
### Community 100 - "price_letter_detail"
Cohesion: 0.27
Nodes (15): Settings, BaseSettings, apply_renumber(), build_mapping(), fetch_products(), format_new_product_no(), load_settings_env(), main() (+7 more)
### Community 101 - ".to_tenant_user_dict"
Cohesion: 0.27
Nodes (8): CRM 模块 Excel 导出列定义(字段与字典类型对齐 Java *Vo @ExcelDictFormat)。, _build_workbook(), DictLabelResolver, ExportColumn, Any, Excel 导出工具:集中处理字典 code → label(对齐 Java ExcelDictConvert / ExcelDictPreloadConver, 导出列定义,dict_type 非空时自动将字典 value 转为 label。, 导出单元格解析:按列配置做字典翻译或自定义格式化。
Cohesion: 0.21
Nodes (11): CRM 模块 Excel 导出列定义(字段与字典类型对齐 Java *Vo @ExcelDictFormat)。, _build_workbook(), DictLabelResolver, ExportColumn, load_dict_label_maps(), Any, Session, Excel 导出工具:集中处理字典 code → label(对齐 Java ExcelDictConvert / ExcelDictPreloadConver (+3 more)
### Community 102 - "dept.py"
Cohesion: 0.33
@@ -529,40 +522,40 @@ Cohesion: 0.24
Nodes (7): camel_to_snake(), CRUDBase, get_model_attr(), HistoryCRUD, Any, Session, ModelType
### Community 105 - "list_customers"
Cohesion: 0.23
Nodes (14): extend_session(), get_client_ip(), is_refresh_token_valid(), is_session_valid(), Request, 同步 Redis 调用;失败时返回 None 供调用方降级。, 刷新会话 TTL(已登录用户每次 API 校验通过后滑动续期), _redis_call_safe() (+6 more)
Cohesion: 0.12
Nodes (34): _avatar_url_field(), _build_user_info_payload(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/shanxia2.0.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 与 web-admin 静态路由 meta.roles(admin/super_admin)对齐的单元素数组。, 与 web-admin `userInfo` 字段约定一致。 (+26 more)
### Community 106 - "Community 106"
Cohesion: 0.23
Nodes (11): cancel_plan(), 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, _plan_type_to_business_type(), _normalize_plan_date(), date, Session, 运输计划 · 工厂现场链接(与地磅出入库单解耦), 入库/出库安排运输:按产品生成现场链接(不写 db_inbound_outbound)。 (+3 more)
Cohesion: 0.38
Nodes (11): apply_pl_scope(), Session, PL 模块数据权限辅助(create_by / create_dept_id,无 owner_field)。, build_menu_badge_counts(), count_document_reminder_expired_pending(), count_freight_approval_pending(), count_freight_disburse_pending(), _count_pending_applies() (+3 more)
### Community 107 - "apply_pl_scope"
Cohesion: 0.06
Nodes (62): category_delete(), clue_import_template(), customer_import_template(), invoice_info_add(), invoice_info_by_customer(), _invoice_info_by_customer_impl(), invoice_info_delete(), invoice_info_list() (+54 more)
Cohesion: 0.08
Nodes (25): category_add(), category_delete(), category_tree(), category_update(), product_add(), product_delete(), product_detail(), product_options() (+17 more)
### Community 109 - "Community 109"
Cohesion: 0.15
Nodes (17): create_expense_item(), delete_expense_item(), get_expense_item(), get_expense_item_tree(), Session, update_expense_item(), BxExpenseItem, _coerce_id() (+9 more)
Cohesion: 0.20
Nodes (13): create_expense_item(), delete_expense_item(), get_expense_item(), get_expense_item_tree(), Session, update_expense_item(), BxExpenseItem, _coerce_id() (+5 more)
### Community 110 - "Base"
Cohesion: 0.18
Nodes (17): get_web_auth_menu_codes(), 获取当前用户菜单权限标识(sys_menu.perms,经角色继承)。, get_user_menu_codes(), Session, 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, _expand_with_ancestor_menu_ids(), _granted_menu_ids_for_user(), iter_user_menu_perm_codes() (+9 more)
Cohesion: 0.20
Nodes (14): get_user_menu_codes(), Session, 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, _expand_with_ancestor_menu_ids(), _granted_menu_ids_for_user(), iter_user_menu_perm_codes(), Session, 角色仅勾选按钮(F)时,补齐祖先 C/M 菜单 id,便于前端匹配 :list 路由。 (+6 more)
### Community 111 - "Community 111"
Cohesion: 0.28
Nodes (14): _assert_editable(), _build_public_page(), _format_file_size(), _get_inventory_by_token(), get_public_inventory(), _parse_feedback_images(), Session, UploadFile (+6 more)
Cohesion: 0.21
Nodes (17): _assert_editable(), _build_public_page(), _format_file_size(), _get_inventory_by_token(), get_public_inventory(), _parse_feedback_images(), Session, UploadFile (+9 more)
### Community 112 - "storage.py"
Cohesion: 0.07
Nodes (48): 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 新增供方 — Java: CrmSupplierInfoController.add, 修改供方 — Java: CrmSupplierInfoController.edit, 删除供方 — Java: CrmSupplierInfoController.remove, supplier_info_add(), supplier_info_delete(), supplier_info_list_all(), supplier_info_update() (+40 more)
Cohesion: 0.09
Nodes (29): 供方详情 — Java: CrmSupplierInfoController.getInfo, 新增供方 — Java: CrmSupplierInfoController.add, 修改供方 — Java: CrmSupplierInfoController.edit, 删除供方 — Java: CrmSupplierInfoController.remove, 导出供方列表 — Java: CrmSupplierInfoController.export, supplier_info_add(), supplier_info_delete(), supplier_info_detail() (+21 more)
### Community 113 - "quote_share_log.py"
Cohesion: 0.26
Nodes (12): list_share_logs(), _parse_user_agent(), Any, Session, CRM 报价单分享访问日志 CRUD — 对照 CrmQuoteShareLogServiceImpl.java, Java: statisticsVisits, 简易 User-Agent 解析(替代 Hutool UserAgentUtil), Java: queryLogsByQuoteId (+4 more)
### Community 114 - "db_models.py"
Cohesion: 0.27
Nodes (10): DbSequence, 地磅(db)模块数据模型 — 对齐 docs/sql/db_tables.sql, _allocate_inbound_outbound_id(), _ensure_sequence_row(), max_numeric_inbound_outbound_id(), Session, 出入库单 id 生成 — 租户内纯数字自增,并发安全。, 当前租户下纯数字 id 的最大值(不含 UUID 等非数字主键)。 (+2 more)
Cohesion: 0.24
Nodes (12): DbSequence, 地磅(db)模块数据模型 — 对齐 docs/sql/db_tables.sql, _allocate_inbound_outbound_id(), _ensure_sequence_row(), max_numeric_inbound_outbound_id(), next_inbound_outbound_id(), Session, 出入库单 id 生成 — 租户内纯数字自增,并发安全。 (+4 more)
### Community 115 - "site.py"
Cohesion: 0.39
@@ -577,60 +570,60 @@ Cohesion: 0.22
Nodes (22): batch_insert_contract_products(), calculate_subtotal(), _decimal_value(), delete_price_tiers_by_contract_id(), delete_products_by_contract_id(), _get_field(), insert_contract_product(), _letter_oss_ids_to_json() (+14 more)
### Community 119 - "Community 119"
Cohesion: 0.17
Nodes (27): CertRow, VehiclePersonnelRow, _cert_row_complete(), collect_required_cert_errors(), _find_cert_for_required(), get_required_personnel_cert_names(), match_required_cert_name(), _missing_field_labels() (+19 more)
Cohesion: 0.16
Nodes (28): CertRow, _cert_row_complete(), collect_required_cert_errors(), _find_cert_for_required(), get_required_personnel_cert_names(), match_required_cert_name(), _missing_field_labels(), Session (+20 more)
### Community 122 - "Community 122"
Cohesion: 0.22
Nodes (15): get_storage(), download_file_bytes(), file_stream(), get_access_url(), get_download_url(), get_preview_url(), normalize_storage_path(), 报销附件存储适配 — 复用门户 app.core.storage,对外保持 bx 协议。 (+7 more)
Cohesion: 0.17
Nodes (11): pool_customer_assign(), pool_customer_claim(), pool_customer_list(), pool_record_detail(), pool_record_list(), PoolAssignBody, PoolClaimBody, PoolCustomerListBody (+3 more)
### Community 125 - "Community 125"
Cohesion: 0.10
Nodes (44): 按运输计划单据类型解析地磅往来单位(不区分 CRM 合同类型)。 - 入库单 inbound:供方 → party_a,其次 supplier_nam, resolve_partner_company(), apply_dibang_prefill_to_order(), apply_site_feedback(), build_io_order_site_url(), create_io_order_for_transport(), _dibang_qty_by_plan_product(), enrich_io_items_with_brand_feedback() (+36 more)
Cohesion: 0.06
Nodes (56): _build_page(), _get_by_token(), _make_handlers(), _models(), Session, 运输计划 · 入库/出库单现场免登录公共 API, Config, SoftDeleteModel (+48 more)
### Community 126 - "customer_pool.py"
Cohesion: 0.36
Nodes (8): operlog_detail(), operlog_list(), Session, 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), _user_info(), OperLogDetailBody, OperLogListBody, 操作日志(兼容 RuoYi OperLog 视图)
Cohesion: 0.45
Nodes (11): _customer_base_query(), get_follow_statistics(), get_industry_statistics(), get_level_statistics(), get_overview_statistics(), get_owner_statistics(), get_source_statistics(), get_trend_statistics() (+3 more)
### Community 127 - "Community 127"
Cohesion: 0.21
Nodes (19): _cargo_stats(), get_dashboard_stats(), get_inbound_by_cargo(), get_inbound_by_partner_cargo(), get_outbound_by_cargo(), get_outbound_by_partner_cargo(), _partner_cargo_stats(), Session (+11 more)
Cohesion: 0.20
Nodes (20): _cargo_stats(), get_dashboard_stats(), get_inbound_by_cargo(), get_inbound_by_partner_cargo(), get_outbound_by_cargo(), get_outbound_by_partner_cargo(), _partner_cargo_stats(), Session (+12 more)
### Community 128 - "plan.py"
Cohesion: 0.06
Nodes (110): archive_plan(), cancel_plan_wait_notice(), count_plans_by_contract(), create_from_contract(), create_plan(), create_plan_full(), delete_plan(), _determine_plan_type() (+102 more)
Cohesion: 0.11
Nodes (56): _generate_notify_message(), QrCodeResponse, PlPlan, PlPlanProduct, PlPlanTransport, 计划产品明细表 pl_plan_product, 计划-运输关联表 pl_plan_transport, PlanArchiveFreightBlock (+48 more)
### Community 129 - "BaseStorage"
Cohesion: 0.24
Nodes (10): ProcessDefCreateBody, ProcessDefUpdateBody, StartInstanceBody, create_task(), get_latest_version(), get_pending_tasks_by_node(), get_task(), 流程定义版本 wf_process_version (+2 more)
Cohesion: 0.17
Nodes (11): price_letter_add(), price_letter_detail(), price_letter_list(), price_letter_update(), price_letter_void(), PriceLetterCreateBody, PriceLetterDetailBody, PriceLetterListBody (+3 more)
### Community 130 - "datetime_parse.py"
Cohesion: 0.37
Nodes (14): create_opportunity_follow(), _ensure_parent_opportunity(), list_follows_by_opportunity(), list_opportunity_follows(), _parse_optional_datetime(), Any, datetime, Session (+6 more)
Cohesion: 0.40
Nodes (9): create_oss(), create_oss(), get_oss_by_id(), get_oss_by_url(), Session, 按主键 id 查询附件(兼容旧 CRM 雪花 oss_id 迁入后的记录), 将 fileUrl 或旧 CRM 数字 ossId 解析为 MinIO 相对路径。 门户新上传把相对路径写入业务字段;迁入合同附件仍存数字 ossId, resolve_storage_path() (+1 more)
### Community 131 - "LocalStorage"
Cohesion: 0.36
Nodes (7): list_ethnics(), Any, Session, 民族码表 CRUD(全局 sys_ethnic), _row_to_dict(), 民族码表 sys_ethnic(国标 GB/T 3304,全局), SysEthnic
Cohesion: 0.47
Nodes (5): list_ethnics(), Any, Session, 民族码表 CRUD(全局 sys_ethnic), _row_to_dict()
### Community 132 - "crm_supplier_hazard.py"
Cohesion: 0.15
Nodes (21): build_updates(), derive_source_url(), fetch_source_customers(), legacy_id_to_str(), load_oss_map(), load_runtime_settings(), load_settings_env(), main() (+13 more)
Cohesion: 0.14
Nodes (23): build_updates(), derive_source_url(), fetch_source_customers(), legacy_id_to_str(), load_oss_map(), load_runtime_settings(), load_settings_env(), main() (+15 more)
### Community 134 - "Community 134"
Cohesion: 0.15
Nodes (26): allocate_next_biz_no(), _format_biz_no(), _prefix_for(), datetime, Session, 业务协议号自动生成:XBCC / JZCC + YYYYMMDD + 6 位序号, 原子分配下一个业务协议号。 须在 create 事务内调用;使用 MySQL LAST_INSERT_ID 保证并发安全。, batch_generate_sample_codes() (+18 more)
Cohesion: 0.25
Nodes (18): batch_generate_sample_codes(), batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), _parse_issued_time(), Any (+10 more)
### Community 135 - "post.py"
Cohesion: 0.30
Nodes (10): get_last_month_range(), month_range(), date, Session, 地磅计划按月自动生成 — 迁移自 simple-dibang-xiaoshou/auto-create-plan/auto_create_monthly_pla, 按月自动生成采购计划。 - 默认仅在每月 1 日执行(force=True 时跳过该限制,供手动触发验收) - 遍历所有租户,按上月计划模板生, run_auto_generate_monthly_plans(), default_execution_status() (+2 more)
Cohesion: 0.24
Nodes (12): get_last_month_range(), month_range(), date, Session, 地磅计划按月自动生成 — 迁移自 simple-dibang-xiaoshou/auto-create-plan/auto_create_monthly_pla, 按月自动生成采购计划。 - 默认仅在每月 1 日执行(force=True 时跳过该限制,供手动触发验收) - 遍历所有租户,按上月计划模板生, run_auto_generate_monthly_plans(), default_execution_status() (+4 more)
### Community 136 - "Community 136"
Cohesion: 0.19
Nodes (18): create_role(), get_role(), get_role_data_scope(), get_role_menu_ids(), list_roles(), Any, Session, 角色 CRUD(sys_role / sys_role_menu / sys_role_data_scope_detail) (+10 more)
### Community 137 - "statistics.py"
Cohesion: 0.22
Nodes (22): advance_issue_stats(), batch_offset(), export_advance_issues(), issue_advance(), list_advance_issues(), list_advance_offset_records(), list_pending_payments(), list_processed_payments() (+14 more)
Cohesion: 0.13
Nodes (11): _coerce_id(), OffsetItem, PaymentFinanceStatsOut, 报销单勾选的发票附件(同一发票可勾选多个附件,各占一条)。, ReimburseApplyCreate, ReimburseApprovalOut, ReimburseApproverPendingStatsOut, ReimburseDetailCreate (+3 more)
### Community 138 - "Community 138"
Cohesion: 0.33
@@ -641,24 +634,24 @@ Cohesion: 0.15
Nodes (9): 微信消息通知服务 支持微信小程序模板消息推送 使用方式: from app.core.wechat_message import WechatMes, 发送订单状态通知 Args: openid: 用户openid order_n, 发送支付成功通知 Args: openid: 用户openid order_n, 发送配送通知 Args: openid: 配送员openid task_no:, 发送配送时效预警 Args: openid: 配送员openid task_n, 发送退款结果通知 Args: openid: 用户openid order_n, 发送催单通知给配送员 Args: deliver_openid: 配送员openid, 发送模板消息 Args: openid: 用户openid template_ (+1 more)
### Community 141 - "clue_statistics.py"
Cohesion: 0.49
Nodes (10): clue_statistics_level(), _apply_create_range(), _base_query(), get_clue_level_statistics(), get_clue_overview_statistics(), get_clue_owner_statistics(), get_clue_source_statistics(), get_clue_trend_statistics() (+2 more)
Cohesion: 0.40
Nodes (3): Any, 供 get_tenant_no 等门户工具使用。, 与门户 JWT / apply_data_scope 所需的 user_info 字段对齐。
### Community 143 - "SysEthnic"
Cohesion: 0.33
Nodes (11): create_leave(), get_leave(), list_leaves(), Any, Session, _row_to_dict(), soft_delete_leave(), update_leave() (+3 more)
### Community 144 - "SysApiRequestLog"
Cohesion: 0.10
Nodes (20): category_add(), category_tree(), category_update(), clue_import(), product_delete(), product_detail(), product_import(), UploadFile (+12 more)
Cohesion: 0.14
Nodes (28): _build_driver_url(), get_plan_arrange_info(), 获取计划已安排运输后的司机链接与地磅出入库关联(供查看弹窗复制简述/二维码)。, apply_dibang_prefill_to_order(), apply_site_feedback(), build_io_order_site_url(), create_io_order_for_transport(), _dibang_qty_by_plan_product() (+20 more)
### Community 145 - "minio_url.py"
Cohesion: 0.38
Nodes (7): change_current_user_password(), get_current_user_profile(), public_quote_share(), Request, Session, 获取当前用户信息(与 sys_user 字段对应)。, 公开分享查看报价单 — Java: GET /share/{shareCode}(无 JWT)
Cohesion: 0.67
Nodes (3): Web 管理端约定角色(由 sys_role.role_name 映射而来,非数据库枚举), UserRole, str
### Community 146 - "__init__.py"
Cohesion: 0.13
Nodes (26): price_letter_add(), price_letter_detail(), price_letter_list(), price_letter_update(), price_letter_void(), create_price_letter(), get_price_letter(), list_price_letters() (+18 more)
Cohesion: 0.28
Nodes (16): create_price_letter(), get_price_letter(), list_price_letters(), _parse_date(), Any, date, Session, _row_to_dict() (+8 more)
### Community 147 - "Community 147"
Cohesion: 0.37
@@ -666,63 +659,47 @@ Nodes (17): check_env(), check_python(), create_venv(), init_env(), install_depe
### Community 150 - "ContractListQuery"
Cohesion: 0.08
Nodes (28): ContractApprovalActionBody, ContractApprovalPassBody, ContractApprovalRejectBody, ContractApprovalTransferBody, ContractBatchAssignBody, ContractBatchSubmitBody, ContractChangeCreateBody, ContractChangeSubmitBody (+20 more)
### Community 152 - "Community 152"
Cohesion: 0.29
Nodes (6): Config, format_api_error_message(), PageResult, Exception, 将 HTTP/SQLAlchemy 等异常转为可展示的错误文案(避免 str([]) 空列表)。, ResponseModel
Nodes (38): CRM 合同 API 路由 — GET/PUT/DELETE/POST 对齐原 Java CRM, 接口菜单权限守卫。super_admin 直接放行。, require_menu_code(), ContractApproverSettingSaveBody, ContractApprovalActionBody, ContractApprovalPassBody, ContractApprovalRejectBody, ContractApprovalTransferBody (+30 more)
### Community 154 - "web_login_rsa_public_key"
Cohesion: 0.23
Nodes (10): check_customer_protect_time(), pool_recovery_job(), Session, 每天凌晨1点:检查保护期到期客户,跟进次数不足则退回公海, 每天早上9点:保护期到期提醒(3天内到期且跟进不足), _recycle_to_pool(), remind_customer_recycle(), warn_customer_recycle() (+2 more)
Cohesion: 0.19
Nodes (11): get_current_time(), parse_datetime(), datetime, allocate_next_biz_no(), _format_biz_no(), _prefix_for(), datetime, Session (+3 more)
### Community 156 - "get_client_ip"
Cohesion: 0.27
Nodes (11): create_dict_data(), get_dict_data(), list_dict_data(), list_dict_data_options(), Any, Session, 字典数据 CRUD(sys_dict_data), 字典下拉选项:租户主数据,忽略数据范围(user_info 保留兼容调用方,不参与过滤)。 (+3 more)
### Community 159 - "context.py"
Cohesion: 0.39
Nodes (8): _brand_row_to_dict(), CrmProductBrand, apply_updates(), collect_candidates(), main(), parse_name(), Path, write_csv()
### Community 160 - "register_local_callback"
Cohesion: 0.40
Nodes (3): API 路由包 — 山峡化工生产一体化门户, get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,14 个一级菜单)
Cohesion: 0.13
Nodes (19): API 路由包 — 山峡化工生产一体化门户, create_leave(), delete_leave(), get_leave(), _leave_local_callback(), leave_workflow_callback(), list_leaves(), Session (+11 more)
### Community 161 - "backfill_crm_contract_attachment_urls.py"
Cohesion: 0.33
Nodes (10): load_oss_map(), load_runtime_settings(), load_settings_env(), main(), Any, Engine, 返回 (新值, 是否发生了 id→url 替换)。, resolve_token() (+2 more)
### Community 162 - "BaseStorage"
Cohesion: 0.22
Nodes (3): BaseStorage, 带下载文件名的访问 URL;默认实现为普通访问地址。, 浏览器内联预览 URL;默认实现为普通访问地址。
### Community 163 - "login_crypto.py"
Cohesion: 0.31
Nodes (9): decrypt_login_payload(), ensure_initialized(), extract_login_credentials(), get_public_pem(), Any, 登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。, Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。, 从请求体解析用户名、密码。 返回 (username, password, error_message);error_message 非空时表示失败。 (+1 more)
### Community 164 - "get_current_user_by_token"
Cohesion: 0.50
Nodes (5): get_current_user(), get_current_user_by_token(), Session, 根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期), 获取当前用户(sync 依赖,配合 sync 路由在线程池执行,避免阻塞事件循环)。
### Community 170 - "test_quote_approver_setting.py"
Cohesion: 0.20
Nodes (21): _assert_users_exist(), get_setting(), Any, Session, _row_to_dict(), save_setting(), _assert_users_exist(), get_setting() (+13 more)
### Community 172 - "MinIOStorage"
Cohesion: 0.24
Nodes (5): MinIOStorage, Any, 从 MINIO_BASE_URL 解析公网 endpoint;未配置或与内网相同时复用 self.client。, MinIO 预签名下载 URL,携带原始文件名。, MinIO 预签名内联预览 URL(PDF 等 iframe 场景)。
### Community 173 - ".to_tenant_user_dict"
Cohesion: 0.38
Nodes (6): apply_product_snapshot_to_inventory(), ProductSnapshot, Session, 地磅模块 — CRM 产品解析与快照写入。, 校验 CRM 产品并返回名称/规格快照。新建单据 product_id 必填。, resolve_crm_product()
Cohesion: 0.18
Nodes (22): _assert_users_exist(), get_setting(), Any, Session, _row_to_dict(), save_setting(), _assert_users_exist(), get_setting() (+14 more)
### Community 174 - "datetime_parse.py"
Cohesion: 0.67
Nodes (3): parse_optional_plan_datetime(), datetime, 运输计划相关日期时间解析:前端 date-picker 仅传 YYYY-MM-DD。
### Community 179 - "_ensure_subpack_slip_no"
Cohesion: 0.40
Nodes (6): _ensure_subpack_slip_no(), _format_subpack_slip_no(), _normalize_subpack_slip_no(), 将历史分装单号统一为 NO:SXFZYYYYMMDD-###, 分配分装单号 NO:SXFZYYYYMMDD-###(按租户每日递增), _subpack_slip_no_seq()
Cohesion: 0.07
Nodes (73): archive_plan(), cancel_plan(), cancel_plan_wait_notice(), count_plans_by_contract(), create_from_contract(), create_plan(), create_plan_full(), delete_plan() (+65 more)
### Community 180 - "menu.py"
Cohesion: 0.36
Nodes (13): _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), menu_name_exists(), Any (+5 more)
Cohesion: 0.29
Nodes (14): _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), menu_name_exists(), Any (+6 more)
### Community 206 - "crm_quote_pdf.py"
Cohesion: 0.36
@@ -751,22 +728,22 @@ Nodes (6): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时
## Knowledge Gaps
- **30 isolated node(s):** `Config`, `Config`, `Config`, `Config`, `Config` (+25 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **18 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **15 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `generate_uuid()` connect `Community 51` to `plan.py`, `BaseStorage`, `datetime_parse.py`, `Community 0`, `Community 4`, `Community 134`, `post.py`, `Community 8`, `Community 136`, `Community 7`, `Community 11`, `Community 13`, `Community 14`, `SysEthnic`, `Community 15`, `Community 16`, `__init__.py`, `Community 19`, `Community 21`, `Community 25`, `web_login_rsa_public_key`, `Community 27`, `get_client_ip`, `Community 28`, `Community 30`, `Community 34`, `Community 38`, `Community 39`, `test_quote_approver_setting.py`, `Community 43`, `Community 49`, `menu.py`, `Community 53`, `Community 61`, `Community 65`, `Community 66`, `Community 67`, `Community 68`, `Community 70`, `Community 74`, `Community 81`, `Community 83`, `Community 86`, `Community 87`, `pl_ocr_service.py`, `pl_vehicle_recharge_service.py`, `Community 92`, `_invoice_info_by_customer_impl`, `response.py`, `Community 95`, `_ensure_subpack_slip_no`, `dept.py`, `Community 106`, `Community 109`, `storage.py`, `quote_share_log.py`, `db_models.py`, `site.py`, `Community 116`, `Community 118`, `Community 125`?**
_High betweenness centrality (0.151) - this node is a cross-community bridge._
- **Why does `Settings` connect `price_letter_detail` to `backfill_crm_contract_attachment_urls.py`, `Community 35`, `crm_supplier_hazard.py`, `Community 5`, `Community 7`, `Community 72`, `Community 73`, `Community 42`, `Community 78`, `Community 52`, `Any`, `Community 59`, `Community 62`, `Community 95`?**
_High betweenness centrality (0.110) - this node is a cross-community bridge._
- **Why does `BaseModel` connect `Community 71` to `plan.py`, `BaseStorage`, `Community 1`, `Community 6`, `statistics.py`, `Community 11`, `Community 12`, `Community 14`, `Community 15`, `SysApiRequestLog`, `Community 16`, `Community 18`, `__init__.py`, `ContractListQuery`, `Community 152`, `Community 25`, `Community 26`, `Community 27`, `Community 30`, `Community 33`, `Community 34`, `Community 36`, `Community 39`, `Community 48`, `Community 49`, `SoftDeleteModel`, `Community 50`, `Community 54`, `Community 60`, `Community 64`, `Community 65`, `Community 66`, `Community 83`, `Community 86`, `response.py`, `_ensure_subpack_slip_no`, `apply_pl_scope`, `Community 109`, `Community 111`, `storage.py`, `Community 119`, `customer_pool.py`, `Community 127`?**
_High betweenness centrality (0.106) - this node is a cross-community bridge._
- **Why does `generate_uuid()` connect `Community 68` to `Community 0`, `Community 1`, `datetime_parse.py`, `plan.py`, `Community 4`, `Community 6`, `Community 134`, `Community 8`, `Community 136`, `post.py`, `Community 11`, `Community 7`, `Community 13`, `Community 14`, `SysEthnic`, `Community 15`, `SysApiRequestLog`, `__init__.py`, `Community 16`, `Community 21`, `Community 25`, `web_login_rsa_public_key`, `Community 27`, `get_client_ip`, `Community 28`, `Community 29`, `context.py`, `Community 34`, `Community 38`, `Community 39`, `test_quote_approver_setting.py`, `Community 43`, `Community 49`, `Community 50`, `_ensure_subpack_slip_no`, `menu.py`, `Community 53`, `Community 51`, `Community 61`, `Community 65`, `Community 66`, `Community 67`, `Community 70`, `Community 74`, `Community 78`, `Community 83`, `Community 86`, `Community 87`, `pl_ocr_service.py`, `pl_vehicle_recharge_service.py`, `Community 92`, `Community 95`, `_ensure_subpack_slip_no`, `dept.py`, `list_customers`, `storage.py`, `quote_share_log.py`, `db_models.py`, `site.py`, `Community 116`, `Community 118`, `Community 125`?**
_High betweenness centrality (0.152) - this node is a cross-community bridge._
- **Why does `Settings` connect `price_letter_detail` to `backfill_crm_contract_attachment_urls.py`, `Community 35`, `crm_supplier_hazard.py`, `Community 5`, `Community 7`, `Community 72`, `Community 73`, `Community 42`, `Community 52`, `Community 30`, `Any`, `Community 59`, `Community 125`, `Community 62`?**
_High betweenness centrality (0.111) - this node is a cross-community bridge._
- **Why does `BaseModel` connect `Community 12` to `plan.py`, `Community 1`, `BaseStorage`, `Community 3`, `statistics.py`, `Community 11`, `Community 14`, `Community 15`, `Community 16`, `Community 18`, `ContractListQuery`, `Community 25`, `Community 27`, `Community 28`, `register_local_callback`, `Community 33`, `Community 36`, `Community 43`, `Community 48`, `Community 49`, `_ensure_subpack_slip_no`, `Community 54`, `Community 58`, `Community 64`, `Community 65`, `Community 66`, `Community 68`, `Community 71`, `Community 86`, `pl_ocr_service.py`, `response.py`, `_ensure_subpack_slip_no`, `apply_pl_scope`, `Community 109`, `Community 111`, `storage.py`, `Community 119`, `Community 122`, `Community 125`, `Community 127`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **Are the 8 inferred relationships involving `DbUserContext` (e.g. with `InventoryRelatedData` and `AutoGenerateMonthlyResult`) actually correct?**
_`DbUserContext` has 8 INFERRED edges - model-reasoned connections that need verification._
- **What connects `API 路由包 — 山峡化工生产一体化门户`, `返回运营端角色下拉选项(label=库中角色名,value=Web 角色码)。`, `返回用户下拉选项(label=昵称,value=用户ID,附带 nickName/userNo)。 供申请人/审批人等选择场景使用,返回本租户全部有效` to the rest of the system?**
_494 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.14304993252361672 - nodes in this community are weakly interconnected._
_496 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.10253699788583509 - nodes in this community are weakly interconnected._
- **Should `Community 3` be split into smaller, more focused modules?**
_Cohesion score 0.06672519754170325 - nodes in this community are weakly interconnected._
_Cohesion score 0.08205128205128205 - nodes in this community are weakly interconnected._
File diff suppressed because it is too large. Load diff
+204 -195
View File
@@ -1,16 +1,16 @@
# Graph Report - backend (2026-08-02)
## Corpus Check
- 303 files · ~206,845 words
- 303 files · ~206,910 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 4549 nodes · 15463 edges · 532 communities (514 shown, 18 thin omitted)
- 4553 nodes · 15476 edges · 533 communities (516 shown, 17 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 410 edges (avg confidence: 0.53)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `8d9f5777`
- Built from commit: `c00f19f8`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -133,24 +133,25 @@
- [[_COMMUNITY_Community 147|Community 147]]
- [[_COMMUNITY_ContractListQuery|ContractListQuery]]
- [[_COMMUNITY_Community 151|Community 151]]
- [[_COMMUNITY_Community 152|Community 152]]
- [[_COMMUNITY_MinIOStorage|MinIOStorage]]
- [[_COMMUNITY_web_login_rsa_public_key|web_login_rsa_public_key]]
- [[_COMMUNITY_get_client_ip|get_client_ip]]
- [[_COMMUNITY_context.py|context.py]]
- [[_COMMUNITY_register_local_callback|register_local_callback]]
- [[_COMMUNITY_backfill_crm_contract_attachment_urls.py|backfill_crm_contract_attachment_urls.py]]
- [[_COMMUNITY_BaseStorage|BaseStorage]]
- [[_COMMUNITY_monitor.py|monitor.py]]
- [[_COMMUNITY_login_crypto.py|login_crypto.py]]
- [[_COMMUNITY_get_current_user_by_token|get_current_user_by_token]]
- [[_COMMUNITY_redis_client.py|redis_client.py]]
- [[_COMMUNITY_codeblock1 (iflytekshanxia2.0backend)|code:block1 (/iflytek/shanxia2.0/backend)]]
- [[_COMMUNITY_test_quote_approver_setting.py|test_quote_approver_setting.py]]
- [[_COMMUNITY_BaseStorage|BaseStorage]]
- [[_COMMUNITY_LocalStorage|LocalStorage]]
- [[_COMMUNITY_MinIOStorage|MinIOStorage]]
- [[_COMMUNITY_.to_tenant_user_dict|.to_tenant_user_dict]]
- [[_COMMUNITY_resolve_create_time_bounds|resolve_create_time_bounds]]
- [[_COMMUNITY_datetime_parse.py|datetime_parse.py]]
- [[_COMMUNITY_SoftDeleteModel|SoftDeleteModel]]
- [[_COMMUNITY__build_user_info_payload|_build_user_info_payload]]
- [[_COMMUNITY__ensure_subpack_slip_no|_ensure_subpack_slip_no]]
- [[_COMMUNITY_menu.py|menu.py]]
- [[_COMMUNITY_web_login_rsa_public_key|web_login_rsa_public_key]]
- [[_COMMUNITY_crm_quote_pdf.py|crm_quote_pdf.py]]
- [[_COMMUNITY_shanxia2.0 后端骨架(FastAPI)|shanxia2.0 后端骨架(FastAPI)]]
- [[_COMMUNITY_api_crypto_middleware.py|api_crypto_middleware.py]]
@@ -198,79 +199,79 @@
## Import Cycles
- None detected.
## Communities (532 total, 18 thin omitted)
## Communities (533 total, 17 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.15
Nodes (11): BxAdvanceApply, BxAdvanceApproval, AdvanceService, Any, Session, 同一节点多次审批时,取 approval_time 最新的一条作为当前节点状态。, 返回全部审批动作,按时间正序排列,用于展示完整审批历史。, Any (+3 more)
Cohesion: 0.11
Nodes (37): approve_settlement_legacy(), cancel_settlement(), create_settlement(), delete_settlement(), disburse_settlement(), _generate_settlement_no(), get_settlement(), get_settlement_approval_flow() (+29 more)
### Community 1 - "Community 1"
Cohesion: 0.15
Nodes (22): _build_quote_filters(), _decimal_value(), _fill_contract_linked_count(), list_quotes(), _parse_optional_datetime(), _period_key(), Any, datetime (+14 more)
Cohesion: 0.18
Nodes (24): CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), execute_change(), export_contract_changes(), export_contract_templates(), _get_change_row(), get_contract_change_detail(), list_contract_changes() (+16 more)
### Community 2 - "Community 2"
Cohesion: 0.30
Nodes (12): PlCarrier, assert_carrier_eligible_for_transport(), carrier_agreement_expired(), carrier_audit_approved(), carrier_eligible_for_transport(), carrier_qualification_complete(), date, 资质附件均为选填,保留函数签名供兼容调用。 (+4 more)
Cohesion: 0.27
Nodes (11): assert_carrier_eligible_for_transport(), carrier_agreement_expired(), carrier_audit_approved(), carrier_eligible_for_transport(), carrier_qualification_complete(), date, 资质附件均为选填,保留函数签名供兼容调用。, _urls_nonempty() (+3 more)
### Community 3 - "Community 3"
Cohesion: 0.08
Cohesion: 0.07
Nodes (87): attachment_download_url(), attachment_preview_url(), AttachmentDownloadUrlBody, create_dept(), create_dict_data(), create_dict_type(), create_menu(), create_post() (+79 more)
### Community 4 - "Community 4"
Cohesion: 0.09
Nodes (76): _apply_list_filters(), assign_opportunities(), batch_update_expect_date(), batch_update_stage(), change_stage(), create_opportunity(), _decimal_value(), _enrich_user_names() (+68 more)
Cohesion: 0.12
Nodes (61): _apply_list_filters(), assign_opportunities(), batch_update_expect_date(), batch_update_stage(), change_stage(), create_opportunity(), _decimal_value(), _enrich_user_names() (+53 more)
### Community 5 - "Community 5"
Cohesion: 0.20
Nodes (24): count_source_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings(), load_settings_env(), load_user_mapping() (+16 more)
### Community 6 - "Community 6"
Cohesion: 0.28
Nodes (17): _address_to_read(), _build_address_query(), create_transport_address(), delete_transport_address(), _get_address(), get_transport_address(), list_all_transport_addresses(), list_transport_addresses() (+9 more)
Cohesion: 0.11
Nodes (49): customer_create(), customer_update(), follow_by_customer(), follow_detail(), assign_customer(), batch_claim_customers(), check_duplicate_customer(), claim_customer() (+41 more)
### Community 7 - "Community 7"
Cohesion: 0.12
Nodes (36): get_password_hash(), Namespace, build_merged_users(), bx_role_labels(), check_minio(), check_mysql(), check_redis(), _clip() (+28 more)
### Community 8 - "Community 8"
Cohesion: 0.13
Nodes (48): register_quote_routes(), create_from_quote(), _quote_products_to_contract_products(), Java: createFromQuote — 返回合同 id, accept_quote(), calculate_quote_amount(), create_new_version(), create_quote() (+40 more)
Cohesion: 0.11
Nodes (47): _build_quote_filters(), calculate_quote_amount(), create_new_version(), create_quote(), _decimal_value(), _enrich_contact_fields(), _enrich_supplier_name(), _fill_contract_linked_count() (+39 more)
### Community 11 - "Community 11"
Cohesion: 0.10
Nodes (55): cancel_apply(), create_apply(), create_disburse(), delete_applies(), delete_disburses(), get_apply(), get_disburse(), list_applies() (+47 more)
### Community 12 - "Community 12"
Cohesion: 0.05
Nodes (67): contact_add(), contact_delete(), contact_update(), customer_create(), customer_delete(), customer_update(), customer_name_exists(), BaseModel (+59 more)
Cohesion: 0.07
Nodes (43): AttachmentUploadResponse, ChangePasswordRequest, Config, LoginRequest, LoginResponse, Pydantic schemas - 用户认证, ResetPasswordRequest, UserCreate (+35 more)
### Community 13 - "Community 13"
Cohesion: 0.17
Nodes (27): create_instance(), create_process_def(), create_task(), get_all_tasks_for_business(), get_instance(), get_latest_version(), get_nodes_by_version(), get_pending_tasks_by_node() (+19 more)
Cohesion: 0.11
Nodes (37): create_instance(), create_process_def(), create_task(), get_all_tasks_for_business(), get_instance(), get_latest_version(), get_nodes_by_version(), get_pending_tasks_by_node() (+29 more)
### Community 14 - "Community 14"
Cohesion: 0.16
Nodes (32): check_document_expiry(), document_reminder_stats(), get_inventory_ledger(), get_summary(), list_document_reminders(), list_transactions(), list_warnings(), date (+24 more)
Cohesion: 0.10
Nodes (48): check_document_expiry(), document_reminder_stats(), get_inventory_ledger(), get_summary(), list_document_reminders(), list_transactions(), list_warnings(), date (+40 more)
### Community 15 - "Community 15"
Cohesion: 0.11
Nodes (13): BxReimburseApply, BxReimburseApproval, BxReimburseDetail, 报销单勾选的发票附件(同一发票可勾选多个附件,各占一条)。, ReimburseInvoiceBriefOut, ReimburseInvoiceLinkIn, Any, Session (+5 more)
Cohesion: 0.12
Nodes (14): BxReimburseApply, BxReimburseApproval, BxReimburseDetail, ReimburseApplyOut, ReimburseInvoiceBriefOut, Any, Session, 归一化勾选链接;返回 None 表示未传(不改关联),[] 表示清空。 (+6 more)
### Community 16 - "Community 16"
Cohesion: 0.09
Nodes (60): cancel_apply(), create_apply(), create_record(), delete_applies(), delete_records(), get_apply(), get_record(), list_applies() (+52 more)
Nodes (64): cancel_apply(), create_apply(), create_record(), delete_applies(), delete_records(), get_apply(), get_record(), list_applies() (+56 more)
### Community 18 - "Community 18"
Cohesion: 0.15
Nodes (30): advance_pending_approval_stats(), advance_status_counts(), approve_advance(), approved_by_me(), create_advance(), delete_advance(), _fill_offset_amounts(), get_advance() (+22 more)
Cohesion: 0.09
Nodes (37): advance_pending_approval_stats(), advance_status_counts(), approve_advance(), approved_by_me(), create_advance(), delete_advance(), _fill_offset_amounts(), get_advance() (+29 more)
### Community 19 - "Community 19"
Cohesion: 0.14
Nodes (26): _avatar_url_field(), _build_user_info_payload(), change_current_user_password(), get_current_user_profile(), get_web_auth_menu_codes(), _jwt_user_payload(), logout(), public_quote_share() (+18 more)
Cohesion: 0.23
Nodes (12): change_current_user_password(), get_current_user_profile(), public_quote_share(), Request, Session, 获取当前用户信息(与 sys_user 字段对应)。, 公开分享查看报价单 — Java: GET /share/{shareCode}(无 JWT), get_current_user() (+4 more)
### Community 21 - "Community 21"
Cohesion: 0.10
Nodes (54): _alias_row_to_dict(), _assert_brand_deletable(), barcode_exists(), _brand_row_to_dict(), _build_category_tree(), category_code_exists(), _category_row_to_dict(), _collect_category_with_ancestors() (+46 more)
Cohesion: 0.09
Nodes (56): _alias_row_to_dict(), _assert_brand_deletable(), barcode_exists(), _brand_row_to_dict(), _build_category_tree(), category_code_exists(), _category_row_to_dict(), _collect_category_with_ancestors() (+48 more)
### Community 22 - "Community 22"
Cohesion: 0.08
@@ -281,164 +282,164 @@ Cohesion: 0.11
Nodes (8): convert_heic_to_jpeg(), OSSStorage, process_image_content(), QiniuStorage, 文件存储工具模块 支持多种存储方式: 1. 本地存储 (local) - 默认 2. 七牛云存储 (qiniu) - 推荐生产环境使用 3. 阿里云OSS (, 将 HEIC/HEIF 格式转换为 JPEG 格式, 处理图片内容,如果是 HEIC 格式则转换为 JPEG, BytesIO
### Community 24 - "Community 24"
Cohesion: 0.20
Nodes (18): create_vehicle(), list_vehicles(), update_vehicle(), _vehicle_to_detail(), _vehicle_to_read(), generate_uuid(), PlVehiclePersonnel, 车辆-人员关联表 pl_vehicle_personnel (+10 more)
Cohesion: 0.12
Nodes (18): 地磅 API 路由聚合 — REST 风格,协议对齐原 simple-dibang-xiaoshou。, menu_badge_stats(), Session, Session, recognize_cert(), RecognizeCertBody, RecognizeCertResult, _auto_fill_create_dept_id() (+10 more)
### Community 25 - "Community 25"
Cohesion: 0.08
Nodes (75): _build_driver_url(), get_plan_arrange_info(), 获取计划已安排运输后的司机链接与地磅出入库关联(供查看弹窗复制简述/二维码)。, _apply_plan_logistics_from_payload(), _apply_transport_arrange_fields(), arrange_transport(), _assert_vehicle_carrier_eligible(), _build_arrange_result() (+67 more)
Cohesion: 0.07
Nodes (80): _build_public_page(), _format_file_size(), _format_plan_date(), get_public_transport(), _get_transport_by_token(), _parse_feedback_images(), Session, UploadFile (+72 more)
### Community 26 - "Community 26"
Cohesion: 0.10
Nodes (45): CRM 合同 API 路由 — GET/PUT/DELETE/POST 对齐原 Java CRM, register_contract_routes(), 接口菜单权限守卫。super_admin 直接放行。, require_menu_code(), batch_assign_owner(), batch_submit_contract_approval(), create_from_opportunity(), download_contract_pdf() (+37 more)
Cohesion: 0.28
Nodes (17): _address_to_read(), _build_address_query(), create_transport_address(), delete_transport_address(), _get_address(), get_transport_address(), list_all_transport_addresses(), list_transport_addresses() (+9 more)
### Community 27 - "Community 27"
Cohesion: 0.19
Nodes (28): _apply_plan_product_update(), _apply_plan_update(), AutoGenerateMonthlyResult, _base_query(), create_plan(), delete_plan(), _generate_plan_no(), get_plan() (+20 more)
Cohesion: 0.14
Nodes (35): _apply_plan_product_update(), _apply_plan_update(), AutoGenerateMonthlyResult, _base_query(), create_plan(), delete_plan(), _generate_plan_no(), get_plan() (+27 more)
### Community 28 - "Community 28"
Cohesion: 0.10
Nodes (60): PlFreightSettlement, PlFreightSettlementApproval, PlFreightSettlementTransport, PlRemittanceVoucher, 运费结算表 pl_freight_settlement, 运费结算审批 pl_freight_settlement_approval, 结算单-运输关联表 pl_freight_settlement_transport, 汇款凭证表 pl_remittance_voucher (+52 more)
Cohesion: 0.12
Nodes (53): PlFreightSettlement, PlFreightSettlementApproval, 运费结算表 pl_freight_settlement, 运费结算审批 pl_freight_settlement_approval, _advance_after_approval(), _approval_to_dict(), can_user_approve_settlement(), cancel_draft_settlement() (+45 more)
### Community 29 - "Community 29"
Cohesion: 0.13
Nodes (28): _build_public_page(), _build_site_product_read(), _format_file_size(), get_public_site(), _get_site_link_by_token(), _parse_feedback_images(), Session, UploadFile (+20 more)
Cohesion: 0.09
Nodes (36): _build_public_page(), _build_site_product_read(), _format_file_size(), get_public_site(), _get_site_link_by_token(), _parse_feedback_images(), Session, UploadFile (+28 more)
### Community 30 - "Community 30"
Cohesion: 0.15
Nodes (16): menu_badge_stats(), Session, Session, recognize_cert(), RecognizeCertBody, RecognizeCertResult, _auto_fill_create_dept_id(), get_db() (+8 more)
Cohesion: 0.16
Nodes (26): clear_target_categories(), compute_level(), count_target_rows(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings() (+18 more)
### Community 33 - "Community 33"
Cohesion: 0.20
Nodes (15): bind_biz(), delete_attachment(), download_file(), list_by_biz(), _parse_id_list(), preview_attachment(), Session, UploadFile (+7 more)
Cohesion: 0.14
Nodes (20): bind_biz(), delete_attachment(), download_file(), list_by_biz(), _parse_id_list(), preview_attachment(), Session, UploadFile (+12 more)
### Community 34 - "Community 34"
Cohesion: 0.06
Nodes (87): create_contact(), get_contact(), list_contacts_by_customer(), _parse_optional_date(), Any, date, Session, _row_to_dict() (+79 more)
Cohesion: 0.13
Nodes (18): get_current_time(), parse_datetime(), datetime, get_pool_record(), list_pool_records(), Any, Session, _row_to_dict() (+10 more)
### Community 35 - "Community 35"
Cohesion: 0.09
Nodes (62): clear_portal_workflow(), _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_bx_user_mapping(), load_runtime_settings() (+54 more)
Cohesion: 0.18
Nodes (36): clear_portal_workflow(), _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_bx_user_mapping(), load_runtime_settings() (+28 more)
### Community 36 - "Community 36"
Cohesion: 0.08
Nodes (60): approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), _enrich_task_list(), get_business_all_tasks(), _get_business_form_fields(), get_designer_data() (+52 more)
Cohesion: 0.09
Nodes (42): approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), delete_process_def(), _enrich_task_list(), get_business_all_tasks(), _get_business_form_fields() (+34 more)
### Community 37 - "Community 37"
Cohesion: 0.24
Nodes (18): _actor_ids(), _actor_names(), assert_row_deletable_by_creator(), assert_rows_deletable_by_creator(), can_delete_by_creator(), is_super_admin(), normalize_user_info(), Any (+10 more)
### Community 38 - "Community 38"
Cohesion: 0.12
Nodes (28): PlInventory, PlInventoryTransaction, 库存流水表 pl_inventory_transaction, load_brand_qtys_by_plan_product_ids(), persist_plan_product_brand_qtys(), Any, Decimal, Session (+20 more)
Cohesion: 0.14
Nodes (25): load_brand_qtys_by_plan_product_ids(), persist_plan_product_brand_qtys(), Any, Decimal, Session, 按计划产品明细 ID 批量加载归档品牌数量(brandId/brandName/qty)。, 软删旧品牌量行后按归档结果插入;无品牌约定则只软删不插入。, validate_brand_qty_rows() (+17 more)
### Community 39 - "Community 39"
Cohesion: 0.14
Nodes (42): assign_clues(), check_convert(), check_duplicate_clue(), convert_clue(), create_clue(), _enrich_user_names(), _ensure_clue_in_scope(), create_clue_follow() (+34 more)
Cohesion: 0.21
Nodes (29): assign_clues(), check_convert(), check_duplicate_clue(), convert_clue(), create_clue(), _enrich_user_names(), _ensure_clue_in_scope(), get_follow_statistics() (+21 more)
### Community 42 - "Community 42"
Cohesion: 0.19
Nodes (32): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+24 more)
### Community 43 - "Community 43"
Cohesion: 0.10
Nodes (30): create_invoice(), delete_invoice(), get_mine_wallet_summary(), list_invoice_ledgers(), list_invoice_wallets(), list_invoices(), Request, Session (+22 more)
Cohesion: 0.12
Nodes (26): create_invoice(), delete_invoice(), get_mine_wallet_summary(), list_invoice_ledgers(), list_invoice_wallets(), list_invoices(), Request, Session (+18 more)
### Community 44 - "Community 44"
Cohesion: 0.12
Nodes (15): Config, _db_pool_keepalive_loop(), _error_json(), lifespan(), Exception, Request, 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin (+7 more)
Cohesion: 0.13
Nodes (16): ApiCryptoMiddleware, _db_pool_keepalive_loop(), _error_json(), lifespan(), Exception, Request, 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin (+8 more)
### Community 45 - "Community 45"
Cohesion: 0.16
Nodes (19): ApiRequestLogMiddleware, _claims_from_auth(), _format_body_bytes(), _persist_log(), Any, Request, 统一记录 API 请求/响应出入参的中间件, _redact_obj() (+11 more)
Cohesion: 0.50
Nodes (4): ApiRequestLogCRUD, Session, SysApiRequestLog, SysApiRequestLogHis
### Community 46 - "Community 46"
Cohesion: 0.18
Nodes (17): get_oper_log_meta(), OperLogMeta, 请求级操作日志元数据(ContextVar), 供异步落库线程使用,避免 ContextVar 跨线程丢失。, set_oper_log_meta(), snapshot_oper_log_meta(), _format_summary(), oper_log() (+9 more)
Cohesion: 0.24
Nodes (20): register_quote_routes(), accept_quote(), _ensure_quote_in_scope(), generate_pdf(), generate_share(), get_quote(), get_quote_detail(), _get_quote_in_scope() (+12 more)
### Community 48 - "Community 48"
Cohesion: 0.17
Nodes (27): _apply_inventory_update(), _base_query(), create_inventory(), create_link_for_plan(), delete_inventory(), _generate_batch_no(), _get_inventory(), _get_inventory_by_id() (+19 more)
Cohesion: 0.20
Nodes (28): _apply_inventory_product_update(), _apply_inventory_update(), _base_query(), create_inventory(), create_link_for_plan(), delete_inventory(), _generate_batch_no(), _get_inventory() (+20 more)
### Community 49 - "Community 49"
Cohesion: 0.11
Nodes (34): create_personnel(), list_personnel(), _personnel_to_detail(), _personnel_to_read(), PlCert, PlDocumentReminder, PlPersonnel, 证件到期提醒表 pl_document_reminder (+26 more)
Cohesion: 0.18
Nodes (18): apply_crm_create_by_scope(), _apply_list_filters(), create_supplier_info(), list_all_supplier_info(), list_supplier_info(), Any, Session, CRM 供方信息 CRUD — 对照 CrmSupplierInfoServiceImpl.java (+10 more)
### Community 50 - "Community 50"
Cohesion: 0.11
Nodes (38): approve_settlement_legacy(), cancel_settlement(), create_settlement(), delete_settlement(), disburse_settlement(), _generate_settlement_no(), get_settlement(), get_settlement_approval_flow() (+30 more)
Nodes (33): contact_add(), contact_birthday(), contact_by_customer(), contact_decision(), contact_delete(), contact_detail(), contact_list(), contact_primary() (+25 more)
### Community 51 - "Community 51"
Cohesion: 0.08
Nodes (43): _build_public_page(), _format_file_size(), _format_plan_date(), get_public_transport(), _get_transport_by_token(), _parse_feedback_images(), Session, UploadFile (+35 more)
Cohesion: 0.16
Nodes (22): PlTransportProductFeedback, 运输单按产品回传 pl_transport_product_feedback, _dict_field(), format_brand_qty_summary(), load_transport_driver_product_feedbacks(), persist_io_item_brand_qtys(), persist_transport_product_feedback(), Any (+14 more)
### Community 52 - "Community 52"
Cohesion: 0.18
Nodes (29): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+21 more)
### Community 53 - "Community 53"
Cohesion: 0.09
Nodes (41): 报销模块认证适配:门户 JWT 用户 → bx 业务上下文。, BxReimburseInvoice, BxReimburseOffset, BxWorkflowNode, 报销(bx)模块数据模型 — 对齐 docs/sql/20260606_bx_tables.sql, filter_current_cycle_approvals(), 审批轮次过滤 — 驳回后重新提交时,进度接口仅展示当前轮次。, 审批进度仅展示当前轮次;完整历史由 get_approval_history 返回。 (+33 more)
Cohesion: 0.11
Nodes (34): 报销模块认证适配:门户 JWT 用户 → bx 业务上下文。, BxReimburseInvoice, BxReimburseOffset, BxWorkflowNode, 报销(bx)模块数据模型 — 对齐 docs/sql/20260606_bx_tables.sql, filter_current_cycle_approvals(), 审批轮次过滤 — 驳回后重新提交时,进度接口仅展示当前轮次。, 审批进度仅展示当前轮次;完整历史由 get_approval_history 返回。 (+26 more)
### Community 54 - "Community 54"
Cohesion: 0.26
Nodes (23): _get_by_plan(), get_inbound(), get_inbound_by_plan(), _get_order(), get_outbound(), get_outbound_by_plan(), inbound_site_url(), list_inbound() (+15 more)
Cohesion: 0.19
Nodes (28): _get_by_plan(), get_inbound(), get_inbound_by_plan(), _get_order(), get_outbound(), get_outbound_by_plan(), inbound_site_url(), list_inbound() (+20 more)
### Community 58 - "Community 58"
Cohesion: 0.17
Nodes (20): operlog_detail(), operlog_list(), Session, 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), _user_info(), business_type_from_path(), title_from_path(), _apply_oper_log_scope() (+12 more)
Cohesion: 0.18
Nodes (17): get_oper_log_meta(), OperLogMeta, 请求级操作日志元数据(ContextVar), 供异步落库线程使用,避免 ContextVar 跨线程丢失。, set_oper_log_meta(), snapshot_oper_log_meta(), _format_summary(), oper_log() (+9 more)
### Community 59 - "Community 59"
Cohesion: 0.20
Nodes (28): _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_oss_id_to_url(), load_runtime_settings(), load_settings_env() (+20 more)
### Community 60 - "Community 60"
Cohesion: 0.16
Nodes (31): bx_health(), 报销(bx)API 路由聚合 — REST 风格,协议对齐 bx 原系统。, P0 健康检查:验证 bx 路由已挂载且响应协议为 code=0。, approve_reimburse(), approved_by_me(), _build_details_data(), create_reimburse(), delete_reimburse() (+23 more)
Cohesion: 0.13
Nodes (19): clue_export(), clue_import_template(), contact_export(), customer_import_template(), _opp_list_kwargs(), opportunity_export(), opportunity_kanban(), opportunity_list() (+11 more)
### Community 61 - "Community 61"
Cohesion: 0.16
Nodes (33): DbInboundOutbound, PlTransportDbLink, 运输-地磅出入库关联 pl_transport_db_link, _apply_plan_quantity_delta(), _create_db_inventory(), _create_db_plan(), DibangInventoryLinkResult, find_monthly_db_plan() (+25 more)
Cohesion: 0.11
Nodes (44): generate_uuid(), PlTransport, PlTransportDbLink, 运输-地磅出入库关联 pl_transport_db_link, _apply_plan_quantity_delta(), _create_db_inventory(), _create_db_plan(), DibangInventoryLinkResult (+36 more)
### Community 62 - "Community 62"
Cohesion: 0.21
Nodes (22): clear_target_products(), count_target_rows(), _dec(), derive_source_url(), fetch_portal_admin_id(), fetch_source_rows(), legacy_id_to_str(), load_runtime_settings() (+14 more)
### Community 63 - "Community 63"
Cohesion: 0.24
Nodes (9): _dispatch_local(), Any, 工作流回调服务 —— 流程状态变更时通知业务系统, 注册本地回调函数。当 callback_url 以 path 开头时直接调用 fn。, 尝试本地直调。返回 True 表示已处理,False 表示无匹配的本地回调。, 流程实例状态变更后,向业务系统发送回调通知。 优先级: 1. 如果 callback_url 是内部路径(以 / 开头),优先尝试本地直调, register_local_callback(), trigger_callback() (+1 more)
Cohesion: 0.27
Nodes (6): BxExpenseItem, Any, Session, ExpenseItemService, Session, M
### Community 64 - "Community 64"
Cohesion: 0.04
Nodes (147): clue_check_convert(), clue_check_duplicate(), clue_detail(), clue_export(), clue_follow_detail(), clue_follow_statistics(), clue_import(), clue_import_template() (+139 more)
Cohesion: 0.05
Nodes (137): category_add(), category_delete(), category_tree(), category_update(), clue_check_convert(), clue_check_duplicate(), clue_follow_detail(), clue_follow_statistics() (+129 more)
### Community 65 - "Community 65"
Cohesion: 0.10
Nodes (58): cancel_apply(), create_apply(), create_process(), delete_applies(), delete_processes(), get_apply(), get_process(), list_applies() (+50 more)
Cohesion: 0.11
Nodes (57): cancel_apply(), create_apply(), create_process(), delete_applies(), delete_processes(), get_apply(), get_process(), list_applies() (+49 more)
### Community 66 - "Community 66"
Cohesion: 0.15
Nodes (24): create_workflow(), delete_workflow(), get_workflow(), get_workflow_by_biz_type(), list_workflows(), Session, save_workflow_nodes(), update_workflow() (+16 more)
Cohesion: 0.19
Nodes (17): create_workflow(), delete_workflow(), get_workflow(), get_workflow_by_biz_type(), list_workflows(), Session, save_workflow_nodes(), update_workflow() (+9 more)
### Community 67 - "Community 67"
Cohesion: 0.29
Nodes (16): ensure_crm_customer_linked_row_in_scope(), ensure_crm_owner_row_in_scope(), Session, CRM 数据权限辅助(负责人 owner_user_id + 标准 create_by/create_dept_id)。, 客户子表(开票信息等):先校验关联客户 owner scope,否则校验 create_by。, _clear_default_for_customer(), create_invoice_info(), get_invoice_info() (+8 more)
Cohesion: 0.12
Nodes (31): clue_detail(), customer_detail(), invoice_info_add(), invoice_info_by_customer(), _invoice_info_by_customer_impl(), invoice_info_delete(), invoice_info_list(), invoice_info_set_default() (+23 more)
### Community 68 - "Community 68"
Cohesion: 0.27
Nodes (17): get_vehicle(), paste_recognize_commit(), PlVehicle, ConflictAction, PasteCommitBody, PasteCommitResult, PastePersonnelIn, PasteVehicleIn (+9 more)
Cohesion: 0.32
Nodes (14): paste_recognize_commit(), ConflictAction, PasteCommitBody, PasteCommitResult, PastePersonnelIn, PasteVehicleIn, 运输计划 - 三方粘贴识别提交 Schema, commit_paste_recognize() (+6 more)
### Community 69 - "Community 69"
Cohesion: 0.15
Nodes (27): _append_user_scope_conditions(), apply_data_scope(), assert_row_in_data_scope(), _collect_scope_ids(), _get_child_dept_ids(), get_user_dept_id(), Session, 数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3 (+19 more)
Nodes (25): _append_user_scope_conditions(), apply_data_scope(), assert_row_in_data_scope(), _collect_scope_ids(), _get_child_dept_ids(), get_user_dept_id(), Session, 数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3 (+17 more)
### Community 70 - "Community 70"
Cohesion: 0.39
Nodes (10): create_post(), get_post(), list_posts(), post_code_exists(), Any, Session, _row_to_dict(), soft_delete_post() (+2 more)
### Community 71 - "Community 71"
Cohesion: 0.11
Nodes (32): CRM 报价单 API 路由 — 挂接到 crm.router, QuoteApproverSettingSaveBody, QuoteAcceptBody, QuoteApprovalApproveBody, QuoteApprovalListBody, QuoteApprovalRefreshNamesBody, QuoteApprovalWithdrawBody, QuoteCreateBody (+24 more)
Cohesion: 0.10
Nodes (35): CRM 报价单 API 路由 — 挂接到 crm.router, 接口菜单权限守卫。super_admin 直接放行。, require_menu_code(), total_pages(), QuoteApproverSettingSaveBody, QuoteAcceptBody, QuoteApprovalApproveBody, QuoteApprovalListBody (+27 more)
### Community 72 - "Community 72"
Cohesion: 0.19
@@ -457,24 +458,24 @@ Cohesion: 0.11
Nodes (12): get_wechat_pay_client(), get_wechat_pay_v2(), Any, 微信支付工具模块 支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.html, 统一下单接口 (V3) Args: out_trade_no: 商户订单号 total_amo, 申请退款 Args: out_trade_no: 商户订单号 total_amount: 订单, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API) Args: out_trade_no: 商户订单号 total_f (+4 more)
### Community 78 - "Community 78"
Cohesion: 0.15
Nodes (14): invoice_info_add(), invoice_info_by_customer(), _invoice_info_by_customer_impl(), invoice_info_delete(), invoice_info_list(), invoice_info_set_default(), invoice_info_update(), 按客户ID查询开票信息(与 by-customer 等价) (+6 more)
Cohesion: 0.22
Nodes (15): ApiRequestLogMiddleware, _claims_from_auth(), _format_body_bytes(), _persist_log(), Any, Request, 统一记录 API 请求/响应出入参的中间件, _redact_obj() (+7 more)
### Community 81 - "Community 81"
Cohesion: 0.22
Nodes (14): format_datetime(), get_current_time(), parse_datetime(), datetime, datetime_end_of_day(), fmt_date(), fmt_datetime(), inventory_date_to_api() (+6 more)
Cohesion: 0.25
Nodes (14): 获取用户所有角色的数据权限配置。 返回: [{"data_scope": str, "details": [SysRoleDataScopeDetai, _resolve_user_role_scopes(), business_type_from_path(), title_from_path(), _apply_oper_log_scope(), get_oper_log(), list_oper_logs(), _oper_log_row_in_scope() (+6 more)
### Community 83 - "Community 83"
Cohesion: 0.17
Nodes (28): _advance_contract_after_approval(), approve_contract(), approve_contract_by_contract_id(), approve_pass(), approve_reject(), approve_transfer(), _build_approval_list_filters(), create_approval_records() (+20 more)
Cohesion: 0.15
Nodes (30): _advance_contract_after_approval(), approve_contract(), approve_contract_by_contract_id(), approve_pass(), approve_reject(), approve_transfer(), _build_approval_list_filters(), can_user_approve() (+22 more)
### Community 84 - "Community 84"
Cohesion: 0.23
Nodes (23): build_id_maps(), clip_text(), count_rows(), export_mapping(), fetch_rows(), legacy_id_to_str(), main(), map_id() (+15 more)
### Community 86 - "Community 86"
Cohesion: 0.18
Nodes (27): _apply_weighing_product_update(), _apply_weighing_update(), _base_query(), create_weighing(), delete_weighing(), _get_weighing(), get_weighing_related(), list_weighing() (+19 more)
Cohesion: 0.15
Nodes (35): _apply_weighing_product_update(), _apply_weighing_update(), _base_query(), create_weighing(), delete_weighing(), _get_weighing(), get_weighing_related(), list_weighing() (+27 more)
### Community 87 - "Community 87"
Cohesion: 0.20
@@ -489,36 +490,36 @@ Cohesion: 0.19
Nodes (22): PlOcrUsageMonth, 阿里云 OCR 月度调用计数 pl_ocr_usage_month(按自然月全局统计), assert_quota_available(), _build_ocr_client(), compress_image_bytes(), current_usage_month(), _first_attachment_url(), get_or_create_usage_row() (+14 more)
### Community 91 - "pl_vehicle_recharge_service.py"
Cohesion: 0.09
Nodes (64): _apply_contract_entity_fields(), can_user_approve(), Java: canUserApprove — 顺序审批,当前步骤 pending 且 is_current=1, _build_contract_filters(), _build_customer_address(), _calc_amount_with_tax(), _change_row_to_dict(), _contract_period_key() (+56 more)
Cohesion: 0.07
Nodes (93): register_contract_routes(), _apply_contract_entity_fields(), batch_assign_owner(), batch_submit_contract_approval(), _build_contract_filters(), _build_customer_address(), _calc_amount_with_tax(), _change_row_to_dict() (+85 more)
### Community 92 - "Community 92"
Cohesion: 0.16
Nodes (25): 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password(), change_password(), create_user(), get_user(), get_user_with_relations(), _hash_password(), list_post_ids_for_user() (+17 more)
Cohesion: 0.15
Nodes (27): change_password(), create_user(), get_user(), get_user_with_relations(), _hash_password(), list_post_ids_for_user(), list_user_ids_bound_to_post(), list_users() (+19 more)
### Community 93 - "_invoice_info_by_customer_impl"
Cohesion: 0.24
Nodes (13): get_product(), soft_delete_product(), assert_products_allowed_for_supplier(), enrich_products_with_hazard_flags(), get_supplier_hazard_flags(), product_allowed(), Any, Session (+5 more)
Cohesion: 0.28
Nodes (11): assert_products_allowed_for_supplier(), enrich_products_with_hazard_flags(), get_supplier_hazard_flags(), product_allowed(), Any, Session, 批量回填明细行 isToxic/isExplosive(来自产品主数据,供前端切换主体剔除)。, test_dual_requires_both() (+3 more)
### Community 94 - "response.py"
Cohesion: 0.12
Nodes (15): pool_rule_add(), pool_rule_delete(), pool_rule_detail(), pool_rule_execute(), pool_rule_list(), pool_rule_update(), pool_rule_update_status(), PoolRuleAddBody (+7 more)
Cohesion: 0.22
Nodes (15): get_storage(), download_file_bytes(), file_stream(), get_access_url(), get_download_url(), get_preview_url(), normalize_storage_path(), 报销附件存储适配 — 复用门户 app.core.storage,对外保持 bx 协议。 (+7 more)
### Community 95 - "Community 95"
Cohesion: 0.35
Nodes (11): create_tenant(), get_tenant(), list_tenants(), Any, Session, _row_to_dict(), soft_delete_tenant(), tenant_no_exists() (+3 more)
### Community 97 - "_ensure_subpack_slip_no"
Cohesion: 0.09
Nodes (51): approve_carrier(), bind_vehicle_driver(), create_carrier(), create_driver(), delete_carrier(), delete_driver(), delete_personnel(), delete_vehicle() (+43 more)
Cohesion: 0.06
Nodes (91): approve_carrier(), bind_vehicle_driver(), create_carrier(), create_driver(), create_personnel(), create_vehicle(), delete_carrier(), delete_driver() (+83 more)
### Community 100 - "price_letter_detail"
Cohesion: 0.27
Nodes (15): Settings, BaseSettings, apply_renumber(), build_mapping(), fetch_products(), format_new_product_no(), load_settings_env(), main() (+7 more)
### Community 101 - ".to_tenant_user_dict"
Cohesion: 0.23
Nodes (12): CRM 模块 Excel 导出列定义(字段与字典类型对齐 Java *Vo @ExcelDictFormat)。, _build_workbook(), DictLabelResolver, export_rows_to_xlsx_response(), ExportColumn, Any, Excel 导出工具:集中处理字典 code → label(对齐 Java ExcelDictConvert / ExcelDictPreloadConver, CRM 列表导出统一入口:表头 + 行数据 + 字典 label 转换 + 文件流响应。 (+4 more)
Cohesion: 0.27
Nodes (8): CRM 模块 Excel 导出列定义(字段与字典类型对齐 Java *Vo @ExcelDictFormat)。, _build_workbook(), DictLabelResolver, ExportColumn, Any, Excel 导出工具:集中处理字典 code → label(对齐 Java ExcelDictConvert / ExcelDictPreloadConver, 导出列定义,dict_type 非空时自动将字典 value 转为 label。, 导出单元格解析:按列配置做字典翻译或自定义格式化。
### Community 102 - "dept.py"
Cohesion: 0.33
@@ -529,32 +530,32 @@ Cohesion: 0.24
Nodes (7): camel_to_snake(), CRUDBase, get_model_attr(), HistoryCRUD, Any, Session, ModelType
### Community 105 - "list_customers"
Cohesion: 0.15
Nodes (22): extend_session(), get_client_ip(), get_current_user(), get_current_user_by_token(), get_current_user_simple(), is_refresh_token_valid(), is_session_valid(), Request (+14 more)
Cohesion: 0.14
Nodes (29): _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/shanxia2.0.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, Web 端登录:账号为 sys_user.user_no,密码为 sys_user.password(bcrypt)。, refresh_token(), web_login(), create_access_token() (+21 more)
### Community 106 - "Community 106"
Cohesion: 0.38
Nodes (11): apply_pl_scope(), Session, PL 模块数据权限辅助(create_by / create_dept_id,无 owner_field)。, build_menu_badge_counts(), count_document_reminder_expired_pending(), count_freight_approval_pending(), count_freight_disburse_pending(), _count_pending_applies() (+3 more)
Cohesion: 0.36
Nodes (15): create_opportunity_follow(), _ensure_parent_opportunity(), get_opportunity_follow(), list_follows_by_opportunity(), list_opportunity_follows(), _parse_optional_datetime(), Any, datetime (+7 more)
### Community 107 - "apply_pl_scope"
Cohesion: 0.03
Nodes (97): category_add(), category_delete(), category_tree(), category_update(), clue_assign(), clue_convert(), clue_create(), clue_delete() (+89 more)
Cohesion: 0.30
Nodes (14): create_clue_follow(), delete_clue_follow(), get_clue_follow(), list_clue_follows(), Any, Session, 更新线索跟进记录,必要时同步线索 next_time, 软删除跟进记录,并回写线索 follow_count / last_time (+6 more)
### Community 109 - "Community 109"
Cohesion: 0.20
Nodes (13): create_expense_item(), delete_expense_item(), get_expense_item(), get_expense_item_tree(), Session, update_expense_item(), BxExpenseItem, _coerce_id() (+5 more)
Cohesion: 0.12
Nodes (45): create_expense_item(), delete_expense_item(), get_expense_item(), get_expense_item_tree(), Session, update_expense_item(), bx_health(), 报销(bx)API 路由聚合 — REST 风格,协议对齐 bx 原系统。 (+37 more)
### Community 110 - "Base"
Cohesion: 0.17
Nodes (18): get_user_menu_codes(), Session, 菜单 code 权限守卫(V0.3:通过 sys_user_role → sys_role_menu → sys_menu.perms), 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, _expand_with_ancestor_menu_ids(), _granted_menu_ids_for_user(), iter_user_menu_perm_codes(), _map_role_name_to_web() (+10 more)
Cohesion: 0.16
Nodes (19): get_web_auth_menu_codes(), 获取当前用户菜单权限标识(sys_menu.perms,经角色继承)。, get_user_menu_codes(), Session, 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, _expand_with_ancestor_menu_ids(), _granted_menu_ids_for_user(), iter_user_menu_perm_codes() (+11 more)
### Community 111 - "Community 111"
Cohesion: 0.28
Nodes (14): _assert_editable(), _build_public_page(), _format_file_size(), _get_inventory_by_token(), get_public_inventory(), _parse_feedback_images(), Session, UploadFile (+6 more)
### Community 112 - "storage.py"
Cohesion: 0.22
Nodes (17): _apply_list_filters(), create_supplier_info(), get_supplier_info(), list_all_supplier_info(), list_supplier_info(), Any, Session, CRM 供方信息 CRUD — 对照 CrmSupplierInfoServiceImpl.java (+9 more)
Cohesion: 0.12
Nodes (16): 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方详情 — Java: CrmSupplierInfoController.getInfo, 新增供方 — Java: CrmSupplierInfoController.add, 修改供方 — Java: CrmSupplierInfoController.edit, 删除供方 — Java: CrmSupplierInfoController.remove, supplier_info_add(), supplier_info_delete(), supplier_info_detail() (+8 more)
### Community 113 - "quote_share_log.py"
Cohesion: 0.26
@@ -574,43 +575,43 @@ Nodes (25): calculate_subtotal(), _decimal_value(), delete_products_by_quote_id(
### Community 118 - "Community 118"
Cohesion: 0.22
Nodes (21): batch_insert_contract_products(), calculate_subtotal(), _decimal_value(), delete_price_tiers_by_contract_id(), delete_products_by_contract_id(), _get_field(), insert_contract_product(), _letter_oss_ids_to_json() (+13 more)
Nodes (22): batch_insert_contract_products(), calculate_subtotal(), _decimal_value(), delete_price_tiers_by_contract_id(), delete_products_by_contract_id(), _get_field(), insert_contract_product(), _letter_oss_ids_to_json() (+14 more)
### Community 119 - "Community 119"
Cohesion: 0.17
Nodes (27): CertRow, VehiclePersonnelRow, _cert_row_complete(), collect_required_cert_errors(), _find_cert_for_required(), get_required_personnel_cert_names(), match_required_cert_name(), _missing_field_labels() (+19 more)
Cohesion: 0.16
Nodes (29): CertRow, VehiclePersonnelRow, _cert_row_complete(), collect_required_cert_errors(), _find_cert_for_required(), get_required_personnel_cert_names(), match_required_cert_name(), _missing_field_labels() (+21 more)
### Community 122 - "Community 122"
Cohesion: 0.22
Nodes (15): get_storage(), download_file_bytes(), file_stream(), get_access_url(), get_download_url(), get_preview_url(), normalize_storage_path(), 报销附件存储适配 — 复用门户 app.core.storage,对外保持 bx 协议。 (+7 more)
Cohesion: 0.05
Nodes (71): clue_assign(), clue_convert(), clue_create(), clue_delete(), clue_follow_create(), clue_follow_delete(), clue_follow_list(), clue_follow_update() (+63 more)
### Community 125 - "Community 125"
Cohesion: 0.05
Nodes (67): _build_page(), _get_by_token(), _make_handlers(), _models(), Session, 运输计划 · 入库/出库单现场免登录公共 API, 附件上传 bizType 与 MinIO 目录映射(对齐原 CRM oss 上传语义), 优先使用显式 folder;否则按 bizType 映射默认目录。 (+59 more)
Nodes (86): _build_driver_url(), get_plan_arrange_info(), 获取计划已安排运输后的司机链接与地磅出入库关联(供查看弹窗复制简述/二维码)。, _build_page(), _get_by_token(), _make_handlers(), _models(), Session (+78 more)
### Community 126 - "customer_pool.py"
Cohesion: 0.45
Nodes (11): _customer_base_query(), get_follow_statistics(), get_industry_statistics(), get_level_statistics(), get_overview_statistics(), get_owner_statistics(), get_source_statistics(), get_trend_statistics() (+3 more)
### Community 127 - "Community 127"
Cohesion: 0.38
Nodes (14): _cargo_stats(), get_dashboard_stats(), get_inbound_by_cargo(), get_inbound_by_partner_cargo(), get_outbound_by_cargo(), get_outbound_by_partner_cargo(), _partner_cargo_stats(), Session (+6 more)
Cohesion: 0.26
Nodes (18): _cargo_stats(), get_dashboard_stats(), get_inbound_by_cargo(), get_inbound_by_partner_cargo(), get_outbound_by_cargo(), get_outbound_by_partner_cargo(), _partner_cargo_stats(), Session (+10 more)
### Community 128 - "plan.py"
Cohesion: 0.10
Nodes (63): create_from_contract(), create_plan(), create_plan_full(), _generate_plan_no(), 创建运输计划(完整表单:合同产品 + 可选预选车辆,不自动安排运输), 生成计划编号 POYYYYMMDD###(当日 3 位序号,每日重置), update_plan(), PlPlan (+55 more)
Cohesion: 0.13
Nodes (49): PlPlan, PlPlanProduct, 计划产品明细表 pl_plan_product, PlanArchiveFreightBlock, PlanArchiveProductItem, PlanProductCreate, PlanTransportCreateBlock, all_hazard_products_cert_complete() (+41 more)
### Community 129 - "BaseStorage"
Cohesion: 0.24
Nodes (11): extract_minio_object_key(), join_relative_urls(), normalize_oss_storage_url(), MinIO 附件 URL 规范化(数据迁移共用)。 背景 ---- CRM / 地磅 / 报销与 shanxia2.0 共用同一 MinIO(bucket 默, 业务表 OSS ID 串 → 相对 URL 串(用于客户证照、跟进附件等)。, 去掉预签名 query(``?X-Amz-...``)。, 将绝对/相对 URL 规范为 MinIO object key(不含 bucket)。, 迁移 CRM ``sys_oss`` 行:``url`` + ``file_name`` → 门户相对路径。 (+3 more)
Cohesion: 0.31
Nodes (14): create_pool_rule(), delete_pool_rules(), execute_pool_rules(), _execute_single_rule(), get_pool_rule(), list_pool_rules(), Any, Session (+6 more)
### Community 130 - "datetime_parse.py"
Cohesion: 0.36
Nodes (9): create_oss(), get_oss_by_id(), get_oss_by_url(), Session, 按主键 id 查询附件(兼容旧 CRM 雪花 oss_id 迁入后的记录), 将 fileUrl 或旧 CRM 数字 ossId 解析为 MinIO 相对路径。 门户新上传把相对路径写入业务字段;迁入合同附件仍存数字 ossId, resolve_storage_path(), CRM 模块数据模型(产品分类、产品主表、统一附件表、客户管理、公海池、线索管理) (+1 more)
Cohesion: 0.47
Nodes (8): create_oss(), get_oss_by_id(), get_oss_by_url(), Session, 按主键 id 查询附件(兼容旧 CRM 雪花 oss_id 迁入后的记录), 将 fileUrl 或旧 CRM 数字 ossId 解析为 MinIO 相对路径。 门户新上传把相对路径写入业务字段;迁入合同附件仍存数字 ossId, resolve_storage_path(), SysOss
### Community 131 - "LocalStorage"
Cohesion: 0.36
Nodes (7): list_ethnics(), Any, Session, 民族码表 CRUD(全局 sys_ethnic), _row_to_dict(), 民族码表 sys_ethnic(国标 GB/T 3304,全局), SysEthnic
Cohesion: 0.47
Nodes (5): list_ethnics(), Any, Session, 民族码表 CRUD(全局 sys_ethnic), _row_to_dict()
### Community 132 - "crm_supplier_hazard.py"
Cohesion: 0.29
@@ -625,36 +626,36 @@ Cohesion: 0.24
Nodes (12): get_last_month_range(), month_range(), date, Session, 地磅计划按月自动生成 — 迁移自 simple-dibang-xiaoshou/auto-create-plan/auto_create_monthly_pla, 按月自动生成采购计划。 - 默认仅在每月 1 日执行(force=True 时跳过该限制,供手动触发验收) - 遍历所有租户,按上月计划模板生, run_auto_generate_monthly_plans(), default_execution_status() (+4 more)
### Community 136 - "Community 136"
Cohesion: 0.22
Nodes (16): create_role(), get_role(), get_role_data_scope(), get_role_menu_ids(), list_roles(), Any, Session, 角色 CRUD(sys_role / sys_role_menu / sys_role_data_scope_detail) (+8 more)
Cohesion: 0.19
Nodes (18): create_role(), get_role(), get_role_data_scope(), get_role_menu_ids(), list_roles(), Any, Session, 角色 CRUD(sys_role / sys_role_menu / sys_role_data_scope_detail) (+10 more)
### Community 137 - "statistics.py"
Cohesion: 0.09
Nodes (37): advance_issue_stats(), batch_offset(), export_advance_issues(), issue_advance(), list_advance_issues(), list_advance_offset_records(), list_pending_payments(), list_processed_payments() (+29 more)
Cohesion: 0.10
Nodes (33): advance_issue_stats(), batch_offset(), export_advance_issues(), issue_advance(), list_advance_issues(), list_advance_offset_records(), list_pending_payments(), list_processed_payments() (+25 more)
### Community 138 - "Community 138"
Cohesion: 0.33
Nodes (19): check_python(), create_venv(), ensure_dirs(), ensure_valid_venv(), ensure_venv_and_runtime(), install_dependencies(), is_running(), log_error() (+11 more)
### Community 139 - "Community 139"
Cohesion: 0.15
Nodes (9): 微信消息通知服务 支持微信小程序模板消息推送 使用方式: from app.core.wechat_message import WechatMes, 发送订单状态通知 Args: openid: 用户openid order_n, 发送支付成功通知 Args: openid: 用户openid order_n, 发送配送通知 Args: openid: 配送员openid task_no:, 发送配送时效预警 Args: openid: 配送员openid task_n, 发送退款结果通知 Args: openid: 用户openid order_n, 发送催单通知给配送员 Args: deliver_openid: 配送员openid, 发送模板消息 Args: openid: 用户openid template_ (+1 more)
Cohesion: 0.17
Nodes (8): 发送订单状态通知 Args: openid: 用户openid order_n, 发送支付成功通知 Args: openid: 用户openid order_n, 发送配送通知 Args: openid: 配送员openid task_no:, 发送配送时效预警 Args: openid: 配送员openid task_n, 发送退款结果通知 Args: openid: 用户openid order_n, 发送催单通知给配送员 Args: deliver_openid: 配送员openid, 发送模板消息 Args: openid: 用户openid template_, WechatMessageService
### Community 141 - "clue_statistics.py"
Cohesion: 0.49
Nodes (10): clue_statistics_level(), _apply_create_range(), _base_query(), get_clue_level_statistics(), get_clue_overview_statistics(), get_clue_owner_statistics(), get_clue_source_statistics(), get_clue_trend_statistics() (+2 more)
Cohesion: 0.24
Nodes (11): extract_minio_object_key(), join_relative_urls(), normalize_oss_storage_url(), MinIO 附件 URL 规范化(数据迁移共用)。 背景 ---- CRM / 地磅 / 报销与 shanxia2.0 共用同一 MinIO(bucket 默, 业务表 OSS ID 串 → 相对 URL 串(用于客户证照、跟进附件等)。, 去掉预签名 query(``?X-Amz-...``)。, 将绝对/相对 URL 规范为 MinIO object key(不含 bucket)。, 迁移 CRM ``sys_oss`` 行:``url`` + ``file_name`` → 门户相对路径。 (+3 more)
### Community 143 - "SysEthnic"
Cohesion: 0.33
Nodes (11): create_leave(), get_leave(), list_leaves(), Any, Session, _row_to_dict(), soft_delete_leave(), update_leave() (+3 more)
### Community 144 - "SysApiRequestLog"
Cohesion: 0.51
Nodes (10): apply_site_feedback(), OrderItem, _header(), _item(), test_apply_site_feedback_does_not_reset_first_submitted_at(), test_apply_site_feedback_keeps_in_progress_when_requested(), test_apply_site_feedback_rejects_already_voided(), test_apply_site_feedback_rejects_invalid_status() (+2 more)
Cohesion: 0.60
Nodes (9): apply_site_feedback(), _header(), _item(), test_apply_site_feedback_does_not_reset_first_submitted_at(), test_apply_site_feedback_keeps_in_progress_when_requested(), test_apply_site_feedback_rejects_already_voided(), test_apply_site_feedback_rejects_invalid_status(), test_apply_site_feedback_sets_status_completed() (+1 more)
### Community 145 - "minio_url.py"
Cohesion: 0.39
Nodes (8): get_redis_client(), get_sync_redis_client(), Redis, 共享 Redis 客户端(同步:会话鉴权;异步:API 加密 nonce)。, 同步 Redis(auth 会话等,在线程池中调用)。, 异步 Redis(API 加密 nonce 等中间件)。, _redis_common_kwargs(), redis_enabled()
Cohesion: 0.49
Nodes (10): clue_statistics_level(), _apply_create_range(), _base_query(), get_clue_level_statistics(), get_clue_overview_statistics(), get_clue_owner_statistics(), get_clue_source_statistics(), get_clue_trend_statistics() (+2 more)
### Community 146 - "__init__.py"
Cohesion: 0.29
@@ -665,12 +666,12 @@ Cohesion: 0.37
Nodes (17): check_env(), check_python(), create_venv(), init_env(), install_dependencies(), log_error(), log_info(), log_success() (+9 more)
### Community 150 - "ContractListQuery"
Cohesion: 0.08
Nodes (48): CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), execute_change(), _get_change_row(), Java Controller TODO — 保持 pending,记录备注, soft_delete_contract_changes(), soft_delete_contract_templates(), submit_change_approval() (+40 more)
Cohesion: 0.04
Nodes (71): CRM 合同 API 路由 — GET/PUT/DELETE/POST 对齐原 Java CRM, PageResult, ResponseModel, BaseModel, SoftDeleteModel, PagedQuery, PagedResponse, InvoiceAttachmentOut (+63 more)
### Community 152 - "Community 152"
Cohesion: 0.17
Nodes (10): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,14 个一级菜单), 运营端角色守卫:admin / super_admin 可访问。, require_admin_or_super_admin(), Config, format_api_error_message(), PageResult, Exception (+2 more)
### Community 152 - "MinIOStorage"
Cohesion: 0.24
Nodes (5): MinIOStorage, Any, 从 MINIO_BASE_URL 解析公网 endpoint;未配置或与内网相同时复用 self.client。, MinIO 预签名下载 URL,携带原始文件名。, MinIO 预签名内联预览 URL(PDF 等 iframe 场景)。
### Community 154 - "web_login_rsa_public_key"
Cohesion: 0.33
@@ -685,40 +686,48 @@ Cohesion: 0.46
Nodes (7): CrmProductBrand, apply_updates(), collect_candidates(), main(), parse_name(), Path, write_csv()
### Community 160 - "register_local_callback"
Cohesion: 0.21
Nodes (15): API 路由包 — 山峡化工生产一体化门户, create_leave(), delete_leave(), get_leave(), _leave_local_callback(), leave_workflow_callback(), list_leaves(), Session (+7 more)
Cohesion: 0.11
Nodes (24): API 路由包 — 山峡化工生产一体化门户, create_leave(), delete_leave(), get_leave(), _leave_local_callback(), leave_workflow_callback(), list_leaves(), Session (+16 more)
### Community 161 - "backfill_crm_contract_attachment_urls.py"
Cohesion: 0.33
Nodes (10): load_oss_map(), load_runtime_settings(), load_settings_env(), main(), Any, Engine, 返回 (新值, 是否发生了 id→url 替换)。, resolve_token() (+2 more)
### Community 162 - "BaseStorage"
Cohesion: 0.22
Nodes (3): BaseStorage, 带下载文件名的访问 URL;默认实现为普通访问地址。, 浏览器内联预览 URL;默认实现为普通访问地址。
### Community 162 - "monitor.py"
Cohesion: 0.36
Nodes (8): operlog_detail(), operlog_list(), Session, 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), _user_info(), OperLogDetailBody, OperLogListBody, 操作日志(兼容 RuoYi OperLog 视图)
### Community 163 - "login_crypto.py"
Cohesion: 0.31
Nodes (9): decrypt_login_payload(), ensure_initialized(), extract_login_credentials(), get_public_pem(), Any, 登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。, Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。, 从请求体解析用户名、密码。 返回 (username, password, error_message);error_message 非空时表示失败。 (+1 more)
Cohesion: 0.18
Nodes (11): Config, decrypt_login_payload(), ensure_initialized(), extract_login_credentials(), get_public_pem(), Any, 登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。, Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。 (+3 more)
### Community 164 - "redis_client.py"
Cohesion: 0.39
Nodes (8): get_redis_client(), get_sync_redis_client(), Redis, 共享 Redis 客户端(同步:会话鉴权;异步:API 加密 nonce)。, 同步 Redis(auth 会话等,在线程池中调用)。, 异步 Redis(API 加密 nonce 等中间件)。, _redis_common_kwargs(), redis_enabled()
### Community 170 - "test_quote_approver_setting.py"
Cohesion: 0.20
Nodes (21): _assert_users_exist(), get_setting(), Any, Session, _row_to_dict(), save_setting(), _assert_users_exist(), get_setting() (+13 more)
### Community 172 - "MinIOStorage"
Cohesion: 0.24
Nodes (5): MinIOStorage, Any, 从 MINIO_BASE_URL 解析公网 endpoint;未配置或与内网相同时复用 self.client。, MinIO 预签名下载 URL,携带原始文件名。, MinIO 预签名内联预览 URL(PDF 等 iframe 场景)。
### Community 171 - "BaseStorage"
Cohesion: 0.22
Nodes (3): BaseStorage, 带下载文件名的访问 URL;默认实现为普通访问地址。, 浏览器内联预览 URL;默认实现为普通访问地址。
### Community 173 - ".to_tenant_user_dict"
Cohesion: 0.33
Nodes (8): _apply_inventory_product_update(), apply_product_snapshot_to_inventory(), apply_product_snapshot_to_plan(), ProductSnapshot, Session, 地磅模块 — CRM 产品解析与快照写入。, 校验 CRM 产品并返回名称/规格快照。新建单据 product_id 必填。, resolve_crm_product()
### Community 173 - "resolve_create_time_bounds"
Cohesion: 0.52
Nodes (6): parse_create_time_day_bounds(), _parse_day_start(), datetime, 报销模块日期范围工具(从 bx-backend 迁移)。, 解析申请时间筛选边界,返回 (含起, 不含止)。, resolve_create_time_bounds()
### Community 174 - "datetime_parse.py"
Cohesion: 0.67
Nodes (3): parse_optional_plan_datetime(), datetime, 运输计划相关日期时间解析:前端 date-picker 仅传 YYYY-MM-DD。
### Community 178 - "_build_user_info_payload"
Cohesion: 0.40
Nodes (5): _avatar_url_field(), _build_user_info_payload(), 与 web-admin 静态路由 meta.roles(admin/super_admin)对齐的单元素数组。, 与 web-admin `userInfo` 字段约定一致。, _web_role_list()
### Community 179 - "_ensure_subpack_slip_no"
Cohesion: 0.07
Nodes (58): archive_plan(), cancel_plan(), cancel_plan_wait_notice(), count_plans_by_contract(), delete_plan(), _determine_plan_type(), _ensure_subpack_slip_no(), _format_subpack_slip_no() (+50 more)
Nodes (72): archive_plan(), cancel_plan(), cancel_plan_wait_notice(), count_plans_by_contract(), create_from_contract(), create_plan(), create_plan_full(), delete_plan() (+64 more)
### Community 180 - "menu.py"
Cohesion: 0.36
@@ -733,8 +742,8 @@ Cohesion: 0.18
Nodes (10): 1. 创建虚拟环境, 2. 安装依赖, 3. 配置环境变量, 4. 启动服务, API 路由分组, shanxia2.0 后端骨架(FastAPI), 开发规范, 快速开始 (+2 more)
### Community 220 - "api_crypto_middleware.py"
Cohesion: 0.21
Nodes (15): ApiCryptoMiddleware, _claims_from_auth(), _coerce_post_method_override_to_get(), _get_redis_client(), _is_crypto_api(), _json_error_response(), _mark_nonce_once(), _nonce_key() (+7 more)
Cohesion: 0.24
Nodes (13): _claims_from_auth(), _coerce_post_method_override_to_get(), _get_redis_client(), _is_crypto_api(), _json_error_response(), _mark_nonce_once(), _nonce_key(), Redis (+5 more)
### Community 237 - "order_status_compat.py"
Cohesion: 0.36
@@ -751,22 +760,22 @@ Nodes (6): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时
## Knowledge Gaps
- **30 isolated node(s):** `Config`, `Config`, `Config`, `Config`, `Config` (+25 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **18 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **17 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `generate_uuid()` connect `Community 24` to `plan.py`, `Community 0`, `datetime_parse.py`, `Community 4`, `Community 6`, `Community 134`, `Community 8`, `Community 136`, `post.py`, `Community 11`, `Community 7`, `Community 13`, `Community 14`, `SysEthnic`, `Community 15`, `Community 16`, `__init__.py`, `Community 19`, `Community 21`, `Community 25`, `web_login_rsa_public_key`, `Community 27`, `get_client_ip`, `Community 28`, `Community 29`, `context.py`, `Community 34`, `Community 38`, `Community 39`, `test_quote_approver_setting.py`, `Community 43`, `Community 49`, `_ensure_subpack_slip_no`, `menu.py`, `Community 53`, `Community 51`, `Community 61`, `Community 65`, `Community 66`, `Community 67`, `Community 68`, `Community 70`, `Community 74`, `Community 81`, `Community 83`, `Community 86`, `Community 87`, `pl_ocr_service.py`, `pl_vehicle_recharge_service.py`, `Community 92`, `Community 95`, `_ensure_subpack_slip_no`, `dept.py`, `storage.py`, `quote_share_log.py`, `db_models.py`, `site.py`, `Community 116`, `Community 118`, `Community 125`?**
_High betweenness centrality (0.152) - this node is a cross-community bridge._
- **Why does `Settings` connect `price_letter_detail` to `backfill_crm_contract_attachment_urls.py`, `Community 35`, `crm_supplier_hazard.py`, `Community 5`, `Community 7`, `Community 72`, `Community 73`, `Community 42`, `Community 44`, `Community 52`, `Any`, `Community 59`, `Community 62`?**
- **Why does `generate_uuid()` connect `Community 61` to `plan.py`, `BaseStorage`, `datetime_parse.py`, `Community 4`, `Community 6`, `Community 134`, `Community 8`, `Community 136`, `post.py`, `Community 11`, `Community 7`, `Community 13`, `Community 14`, `SysEthnic`, `Community 15`, `Community 16`, `__init__.py`, `Community 18`, `Community 21`, `Community 25`, `web_login_rsa_public_key`, `Community 26`, `Community 27`, `get_client_ip`, `Community 28`, `context.py`, `Community 34`, `Community 38`, `Community 39`, `test_quote_approver_setting.py`, `Community 43`, `Community 49`, `Community 50`, `_ensure_subpack_slip_no`, `menu.py`, `Community 53`, `Community 51`, `Community 63`, `Community 65`, `Community 66`, `Community 67`, `Community 68`, `Community 70`, `Community 74`, `Community 83`, `Community 86`, `Community 87`, `pl_ocr_service.py`, `pl_vehicle_recharge_service.py`, `Community 92`, `Community 95`, `_ensure_subpack_slip_no`, `dept.py`, `list_customers`, `Community 106`, `apply_pl_scope`, `quote_share_log.py`, `db_models.py`, `site.py`, `Community 116`, `Community 118`, `Community 125`?**
_High betweenness centrality (0.123) - this node is a cross-community bridge._
- **Why does `Settings` connect `price_letter_detail` to `backfill_crm_contract_attachment_urls.py`, `login_crypto.py`, `crm_supplier_hazard.py`, `Community 35`, `Community 5`, `Community 7`, `Community 72`, `Community 73`, `Community 42`, `Community 52`, `Community 30`, `Any`, `Community 59`, `Community 62`?**
_High betweenness centrality (0.111) - this node is a cross-community bridge._
- **Why does `BaseModel` connect `Community 12` to `plan.py`, `Community 3`, `Community 6`, `statistics.py`, `Community 11`, `Community 14`, `Community 15`, `Community 16`, `Community 18`, `ContractListQuery`, `Community 152`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 30`, `register_local_callback`, `Community 33`, `Community 36`, `Community 43`, `Community 48`, `Community 49`, `SoftDeleteModel`, `Community 50`, `_ensure_subpack_slip_no`, `Community 54`, `Community 58`, `Community 60`, `Community 64`, `Community 65`, `Community 66`, `Community 68`, `Community 71`, `Community 78`, `Community 86`, `response.py`, `_ensure_subpack_slip_no`, `apply_pl_scope`, `Community 109`, `Community 111`, `Community 119`, `Community 125`, `Community 127`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **Why does `BaseModel` connect `ContractListQuery` to `Community 0`, `Community 1`, `plan.py`, `Community 3`, `Community 6`, `statistics.py`, `Community 11`, `Community 12`, `Community 14`, `Community 15`, `Community 16`, `Community 18`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `register_local_callback`, `Community 33`, `monitor.py`, `Community 36`, `Community 48`, `Community 50`, `_ensure_subpack_slip_no`, `Community 54`, `Community 60`, `Community 64`, `Community 65`, `Community 66`, `Community 67`, `Community 68`, `Community 71`, `Community 86`, `_ensure_subpack_slip_no`, `Community 109`, `Community 111`, `storage.py`, `Community 119`, `Community 122`, `Community 125`, `Community 127`?**
_High betweenness centrality (0.093) - this node is a cross-community bridge._
- **Are the 8 inferred relationships involving `DbUserContext` (e.g. with `InventoryRelatedData` and `AutoGenerateMonthlyResult`) actually correct?**
_`DbUserContext` has 8 INFERRED edges - model-reasoned connections that need verification._
- **What connects `API 路由包 — 山峡化工生产一体化门户`, `返回运营端角色下拉选项(label=库中角色名,value=Web 角色码)。`, `返回用户下拉选项(label=昵称,value=用户ID,附带 nickName/userNo)。 供申请人/审批人等选择场景使用,返回本租户全部有效` to the rest of the system?**
_495 weakly-connected nodes found - possible documentation gaps or missing edges._
_497 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.14979757085020243 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.1471861471861472 - nodes in this community are weakly interconnected._
_Cohesion score 0.1141025641025641 - nodes in this community are weakly interconnected._
- **Should `Community 3` be split into smaller, more focused modules?**
_Cohesion score 0.07314524555903866 - nodes in this community are weakly interconnected._
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "label": "test_pl_personnel_cert_required.py", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_driver_qualification_exact", "label": "test_match_driver_qualification_exact()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_escort_qualification_and_alias", "label": "test_match_escort_qualification_and_alias()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_required_names_by_personnel_type", "label": "test_required_names_by_personnel_type()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L23"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_both_requires_four_certs", "label": "test_both_requires_four_certs()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L41"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_escort_alias_counts_as_complete", "label": "test_escort_alias_counts_as_complete()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L54"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_cert_no_optional_for_required_slot", "label": "test_cert_no_optional_for_required_slot()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L66"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_attachment_optional_for_required_slot", "label": "test_attachment_optional_for_required_slot()", "file_type": "code", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_rationale_1", "label": "pl_cert_required_service \u4eba\u5458\u5fc5\u5907\u8bc1\u4e66\u89c4\u5219\u6d4b\u8bd5\u3002", "file_type": "rationale", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_rationale_79", "label": "\u8bc1\u4e66\u9644\u4ef6\u975e\u5fc5\u586b\uff1a\u6709\u540d\u79f0+\u6709\u6548\u671f\u5373\u53ef\uff0c\u65e0\u9644\u4ef6\u4e0d\u62a5\u9519\u3002", "file_type": "rationale", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L79"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "app_services_pl_cert_required_service", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_driver_qualification_exact", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_escort_qualification_and_alias", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_required_names_by_personnel_type", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L23", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_both_requires_four_certs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_pl_personnel_cert_required.py", "source_location": "L41", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_resolve_list_product_name", "label": "_resolve_list_product_name()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L97"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_resolve_create_date", "label": "_resolve_create_date()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L113"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_generate_plan_no", "label": "_generate_plan_no()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L117"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_format_subpack_slip_no", "label": "_format_subpack_slip_no()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L149"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_normalize_subpack_slip_no", "label": "_normalize_subpack_slip_no()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L153"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_subpack_slip_no_seq", "label": "_subpack_slip_no_seq()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L178"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_ensure_subpack_slip_no", "label": "_ensure_subpack_slip_no()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L186"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_determine_plan_type", "label": "_determine_plan_type()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L218"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_get_plan_type_label", "label": "_get_plan_type_label()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L223"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_generate_notify_message", "label": "_generate_notify_message()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L232"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_list_plans", "label": "list_plans()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L253"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_count_plans_by_contract", "label": "count_plans_by_contract()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L408"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_create_plan", "label": "create_plan()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L436"}, {"id": "plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planread", "label": "PlanRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_create_plan_full", "label": "create_plan_full()", "file_type": "code", "source_file": "app/api/pl/plan.py", "source_location": "L518"}, {"id": "plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "", Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_py", "label": "pl_cert_required_service.py", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_match_required_cert_name", "label": "match_required_cert_name()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L35"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_cert_row_complete", "label": "_cert_row_complete()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L44"}, {"id": "certrow", "label": "CertRow", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_find_cert_for_required", "label": "_find_cert_for_required()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L60"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_missing_field_labels", "label": "_missing_field_labels()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_collect_required_cert_errors", "label": "collect_required_cert_errors()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_get_required_personnel_cert_names", "label": "get_required_personnel_cert_names()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_personnel_type_role_compat", "label": "validate_personnel_type_role_compat()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L135"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_personnel_required_certs", "label": "validate_personnel_required_certs()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L146"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_self_vehicle_required_certs", "label": "validate_self_vehicle_required_certs()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L170"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_carrier_vehicle_required_certs", "label": "validate_carrier_vehicle_required_certs()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L194"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_personnel_affiliation", "label": "validate_vehicle_personnel_affiliation()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L218"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "vehiclepersonnelrow", "label": "VehiclePersonnelRow", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_personnel_cert_links", "label": "validate_vehicle_personnel_cert_links()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L252"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_save_certs", "label": "validate_vehicle_save_certs()", "file_type": "code", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L291"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/services/pl_cert_required_service.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confideLine truncated
+1 -1
View File
@@ -1 +1 @@
{"/Users/zlwu/work/00code/shanxia2.0/backend/start-prod.sh":{"size":7357,"mtime_ns":1782639355476060453,"hash":"ca89869446be74a2bf2367b3b28f448580220859a39a84ad9613ac5fe35a8433"},"/Users/zlwu/work/00code/shanxia2.0/backend/start.sh":{"size":9548,"mtime_ns":1780114661446983244,"hash":"4d632863e8a0cd81194b491d83a0218a4157435ae812dec76a6f6197b4d48e57"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/__init__.py":{"size":21,"mtime_ns":1780113982281973984,"hash":"60a04ff08fd97084e83ea809fd13feda6d2848be20ebf309e31fc1dad7523230"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py":{"size":6280,"mtime_ns":1782790852770448643,"hash":"8f9da799977bee7134d87a26ff8434ac5ef8eabb0b7368dd537eee49ad7fd00b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/tasks/__init__.py":{"size":2207,"mtime_ns":1783208067881286091,"hash":"313e6da0e91d743ce891dd283458c79b50b24c4d909dc96ca7b3fd9d2bfa5013"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py":{"size":7457,"mtime_ns":1782790841500516545,"hash":"34bac56e1c2cb6215f4b5fa2dc32d77d4b4abca51428819eebf4afd269cc51cf"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto.py":{"size":1870,"mtime_ns":1780108930724444498,"hash":"c04b748aea86890a5971f749523c7b17dbad1ddd6f9f7f07a5679d159c984e33"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/login_crypto.py":{"size":3858,"mtime_ns":1780108930725155710,"hash":"b82d51afabf2293a9cb1fb2e5f994c383948e7f47ea95fe674686b4f3f3342b1"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py":{"size":6958,"mtime_ns":1784032424448146538,"hash":"c2fb44aedb880733de28afa7f92d2c1c681eb600f821bbeba2bcda3933e5bc37"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_pay.py":{"size":23585,"mtime_ns":1780108930725768130,"hash":"3d52265ce65d21e7103f94afa1e8547aee0823b5ea6d65c50317436ac81fb4fc"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_request_log_middleware.py":{"size":11971,"mtime_ns":1782701669198208175,"hash":"0b84c32828939e6102bb3647691fa8f04b1f68e0e0e9f28127374cc44e19a11c"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py":{"size":1510,"mtime_ns":1782790847265601586,"hash":"8bc9c8ae62e2be2c6920036582ba448dfcd1711c41cebb62274ff6bc6ee14b0b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/security.py":{"size":728,"mtime_ns":1780108930725470004,"hash":"df0f01115064f7b8de1c81dbe9a6db39360c236610b68c33b3234a51d7f0025b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/request_payload.py":{"size":2842,"mtime_ns":1780108930725350836,"hash":"e9937151530ab1417ef297aef59111977725cf90be2a8fa76c00a0618789aba0"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/__init__.py":{"size":61,"mtime_ns":1780108930724312414,"hash":"3dd1842ee59b0c804176b03b4b8a323bd4a252b7feb1bbc32db64f3a8928570e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/response.py":{"size":1824,"mtime_ns":1780108930725412462,"hash":"f1739352d65ea8287d76e282a59553aa8d63c97e35764c64ac378aa5bd9c347e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/menu_guard.py":{"size":1611,"mtime_ns":1780108930725223002,"hash":"3e26077288c3620a4780038b891a326206b45bffe00aca545bdae30172487235"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_collation.py":{"size":548,"mtime_ns":1780108930725025043,"hash":"0c680e25a18244ca839a7de6ed1f4313b33bc8da118d89c463aee1b6af00c6f9"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/context.py":{"size":421,"mtime_ns":1780108930724824458,"hash":"83a10aee67162374993c10a30bf8bb8bd9c4b35cf48f42c832415ccebd91660f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/utils.py":{"size":1498,"mtime_ns":1780108930725607296,"hash":"09323693661c1d4560458b86a954128ccff82bbaf6522da0b44f24da99ddf9ea"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/storage.py":{"size":14141,"mtime_ns":1782855136810943216,"hash":"3ae2c413c10898a8adb3d6773870bafbfbc18c739c10e0e8b4f765b4b5ca6c08"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/order_status_compat.py":{"size":2828,"mtime_ns":1780108930725284669,"hash":"5349e5a0745ee6734c4a995337779307adefc46f453906171988a77de2081540"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/exceptions.py":{"size":4946,"mtime_ns":1780108930725084335,"hash":"79c997d964bca1a4f12f2b92fb1f181fdb9e2b3cf72eae39f4cc164d23794fd7"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/data_scope.py":{"size":8043,"mtime_ns":1782648925694296304,"hash":"626dff86937e5cacec634ecbc61cd53d3763d760223a1d4ec7cd11f64e59a220"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/admin_request_json.py":{"size":2669,"mtime_ns":1780108930724378914,"hash":"4f68b3cf84291e7bddad6ecf4bb4d29ca5e1ec246a9f7f9c4cf5909d0ec1174a"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py":{"size":10876,"mtime_ns":1782790001926627098,"hash":"b39f128b6612589ea6ac5babd30752e9585b3af07b82bb1ad53c9e3c0d90816f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_message.py":{"size":11194,"mtime_ns":1780108930725684255,"hash":"5086070deb14d99d1a69e419b2299ec4Line truncated
{"/Users/zlwu/work/00code/shanxia2.0/backend/start-prod.sh":{"size":7357,"mtime_ns":1782639355476060453,"hash":"ca89869446be74a2bf2367b3b28f448580220859a39a84ad9613ac5fe35a8433"},"/Users/zlwu/work/00code/shanxia2.0/backend/start.sh":{"size":9548,"mtime_ns":1780114661446983244,"hash":"4d632863e8a0cd81194b491d83a0218a4157435ae812dec76a6f6197b4d48e57"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/__init__.py":{"size":21,"mtime_ns":1780113982281973984,"hash":"60a04ff08fd97084e83ea809fd13feda6d2848be20ebf309e31fc1dad7523230"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py":{"size":6280,"mtime_ns":1782790852770448643,"hash":"8f9da799977bee7134d87a26ff8434ac5ef8eabb0b7368dd537eee49ad7fd00b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/tasks/__init__.py":{"size":2207,"mtime_ns":1783208067881286091,"hash":"313e6da0e91d743ce891dd283458c79b50b24c4d909dc96ca7b3fd9d2bfa5013"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py":{"size":7457,"mtime_ns":1782790841500516545,"hash":"34bac56e1c2cb6215f4b5fa2dc32d77d4b4abca51428819eebf4afd269cc51cf"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto.py":{"size":1870,"mtime_ns":1780108930724444498,"hash":"c04b748aea86890a5971f749523c7b17dbad1ddd6f9f7f07a5679d159c984e33"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/login_crypto.py":{"size":3858,"mtime_ns":1780108930725155710,"hash":"b82d51afabf2293a9cb1fb2e5f994c383948e7f47ea95fe674686b4f3f3342b1"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py":{"size":6958,"mtime_ns":1784032424448146538,"hash":"c2fb44aedb880733de28afa7f92d2c1c681eb600f821bbeba2bcda3933e5bc37"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_pay.py":{"size":23585,"mtime_ns":1780108930725768130,"hash":"3d52265ce65d21e7103f94afa1e8547aee0823b5ea6d65c50317436ac81fb4fc"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_request_log_middleware.py":{"size":11971,"mtime_ns":1782701669198208175,"hash":"0b84c32828939e6102bb3647691fa8f04b1f68e0e0e9f28127374cc44e19a11c"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py":{"size":1510,"mtime_ns":1782790847265601586,"hash":"8bc9c8ae62e2be2c6920036582ba448dfcd1711c41cebb62274ff6bc6ee14b0b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/security.py":{"size":728,"mtime_ns":1780108930725470004,"hash":"df0f01115064f7b8de1c81dbe9a6db39360c236610b68c33b3234a51d7f0025b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/request_payload.py":{"size":2842,"mtime_ns":1780108930725350836,"hash":"e9937151530ab1417ef297aef59111977725cf90be2a8fa76c00a0618789aba0"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/__init__.py":{"size":61,"mtime_ns":1780108930724312414,"hash":"3dd1842ee59b0c804176b03b4b8a323bd4a252b7feb1bbc32db64f3a8928570e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/response.py":{"size":1824,"mtime_ns":1780108930725412462,"hash":"f1739352d65ea8287d76e282a59553aa8d63c97e35764c64ac378aa5bd9c347e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/menu_guard.py":{"size":1611,"mtime_ns":1780108930725223002,"hash":"3e26077288c3620a4780038b891a326206b45bffe00aca545bdae30172487235"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_collation.py":{"size":548,"mtime_ns":1780108930725025043,"hash":"0c680e25a18244ca839a7de6ed1f4313b33bc8da118d89c463aee1b6af00c6f9"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/context.py":{"size":421,"mtime_ns":1780108930724824458,"hash":"83a10aee67162374993c10a30bf8bb8bd9c4b35cf48f42c832415ccebd91660f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/utils.py":{"size":1498,"mtime_ns":1780108930725607296,"hash":"09323693661c1d4560458b86a954128ccff82bbaf6522da0b44f24da99ddf9ea"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/storage.py":{"size":14141,"mtime_ns":1782855136810943216,"hash":"3ae2c413c10898a8adb3d6773870bafbfbc18c739c10e0e8b4f765b4b5ca6c08"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/order_status_compat.py":{"size":2828,"mtime_ns":1780108930725284669,"hash":"5349e5a0745ee6734c4a995337779307adefc46f453906171988a77de2081540"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/exceptions.py":{"size":4946,"mtime_ns":1780108930725084335,"hash":"79c997d964bca1a4f12f2b92fb1f181fdb9e2b3cf72eae39f4cc164d23794fd7"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/data_scope.py":{"size":8043,"mtime_ns":1782648925694296304,"hash":"626dff86937e5cacec634ecbc61cd53d3763d760223a1d4ec7cd11f64e59a220"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/admin_request_json.py":{"size":2669,"mtime_ns":1780108930724378914,"hash":"4f68b3cf84291e7bddad6ecf4bb4d29ca5e1ec246a9f7f9c4cf5909d0ec1174a"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py":{"size":10876,"mtime_ns":1782790001926627098,"hash":"b39f128b6612589ea6ac5babd30752e9585b3af07b82bb1ad53c9e3c0d90816f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_message.py":{"size":11194,"mtime_ns":1780108930725684255,"hash":"5086070deb14d99d1a69e419b2299ec4Line truncated
+4 -4
View File
@@ -63,12 +63,12 @@
</div>
<div id="legend"></div>
</div>
<div id="stats">4549 nodes &middot; 15463 edges &middot; 532 communities</div>
<div id="stats">4553 nodes &middot; 15476 edges &middot; 533 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "app_init", "label": "__init__.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 304, "community_name": "__init__.py", "source_file": "app/__init__.py", "file_type": "code", "degree": 0}, {"id": "app_api_init", "label": "__init__.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 160, "community_name": "register_local_callback", "source_file": "app/api/__init__.py", "file_type": "code", "degree": 10}, {"id": "app_api_init_rationale_1", "label": "API \u8def\u7531\u5305 \u2014 \u5c71\u5ce1\u5316\u5de5\u751f\u4ea7\u4e00\u4f53\u5316\u95e8\u6237", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "API \u8def\u7531\u5305 \u2014 \u5c71\u5ce1\u5316\u5de5\u751f\u4ea7\u4e00\u4f53\u5316\u95e8\u6237", "community": 160, "community_name": "register_local_callback", "source_file": "app/api/__init__.py", "file_type": "rationale", "degree": 1}, {"id": "app_api_admin", "label": "admin.py", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 17.2, "font": {"size": 12, "color": "#ffffff"}, "title": "admin.py", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 110}, {"id": "app_api_admin_list_roles_for_select", "label": "list_roles_for_select()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_roles_for_select()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_py_session", "label": "Session", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 13.5, "font": {"size": 0, "color": "#ffffff"}, "title": "Session", "community": 3, "community_name": "Community 3", "source_file": "", "file_type": "code", "degree": 53}, {"id": "app_api_admin_list_users_for_select", "label": "list_users_for_select()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_users_for_select()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_list_roles_for_designer", "label": "list_roles_for_designer()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_roles_for_designer()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_tenantcreatebody", "label": "TenantCreateBody", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "TenantCreateBody", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 7}, {"id": "app_api_admin_tenantupdatebody", "label": "TenantUpdateBody", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "TenantUpdateBody", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 7}, {"id": "app_api_admin_list_tenants", "label": "list_tenants()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "list_tenants()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 3}, {"id": "app_api_admin_create_tenant", "label": "create_tenant()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "create_tenant()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_update_tenant", "label": "update_tenant()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "Line truncated
const RAW_EDGES = [{"from": "app_api_init", "to": "app_api_admin", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_bx_init", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_crm", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_db_init", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_leave", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_menu", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_monitor", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_public", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_workflow", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init_rationale_1", "to": "app_api_init", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachment_download_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachment_preview_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachmentdownloadurlbody", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dept", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dict_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dict_type", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_menu", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_post", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_role_management", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_site", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_tenant", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_user", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dept", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dict_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dict_type", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {Line truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 39}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 22}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 14}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 88}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 79}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 26}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 20}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 38}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 49}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 1}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 1}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 61}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 80}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 29}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 35}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 51}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 66}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 1}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 34}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 27}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 1}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 55}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 43}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 25}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 19}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 79}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 47}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 30}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 61}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 31}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 22}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 1}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 1}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 24}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 94}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 65}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 77}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 20}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 31}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 44}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 1}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 1}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 34}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 58}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 21}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 25}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 19}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 30}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 38}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 43}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 47}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 31}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 55}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 24}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 1}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 1}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 1}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 24}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 30}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 39}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 35}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 23}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 10}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 149}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 62}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 38}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 18}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 19}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 29}, {"cid": 70, "color": "#4E79A7", "label": "CoLine truncated
const RAW_NODES = [{"id": "app_init", "label": "__init__.py", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 304, "community_name": "__init__.py", "source_file": "app/__init__.py", "file_type": "code", "degree": 0}, {"id": "app_api_init", "label": "__init__.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 160, "community_name": "register_local_callback", "source_file": "app/api/__init__.py", "file_type": "code", "degree": 10}, {"id": "app_api_init_rationale_1", "label": "API \u8def\u7531\u5305 \u2014 \u5c71\u5ce1\u5316\u5de5\u751f\u4ea7\u4e00\u4f53\u5316\u95e8\u6237", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "API \u8def\u7531\u5305 \u2014 \u5c71\u5ce1\u5316\u5de5\u751f\u4ea7\u4e00\u4f53\u5316\u95e8\u6237", "community": 160, "community_name": "register_local_callback", "source_file": "app/api/__init__.py", "file_type": "rationale", "degree": 1}, {"id": "app_api_admin", "label": "admin.py", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 17.2, "font": {"size": 12, "color": "#ffffff"}, "title": "admin.py", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 110}, {"id": "app_api_admin_list_roles_for_select", "label": "list_roles_for_select()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_roles_for_select()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_py_session", "label": "Session", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 13.5, "font": {"size": 0, "color": "#ffffff"}, "title": "Session", "community": 3, "community_name": "Community 3", "source_file": "", "file_type": "code", "degree": 53}, {"id": "app_api_admin_list_users_for_select", "label": "list_users_for_select()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_users_for_select()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_list_roles_for_designer", "label": "list_roles_for_designer()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "list_roles_for_designer()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_tenantcreatebody", "label": "TenantCreateBody", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "TenantCreateBody", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 7}, {"id": "app_api_admin_tenantupdatebody", "label": "TenantUpdateBody", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "TenantUpdateBody", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 7}, {"id": "app_api_admin_list_tenants", "label": "list_tenants()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "list_tenants()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 3}, {"id": "app_api_admin_create_tenant", "label": "create_tenant()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "create_tenant()", "community": 3, "community_name": "Community 3", "source_file": "app/api/admin.py", "file_type": "code", "degree": 5}, {"id": "app_api_admin_update_tenant", "label": "update_tenant()", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "Line truncated
const RAW_EDGES = [{"from": "app_api_init", "to": "app_api_admin", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_bx_init", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_crm", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_db_init", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_leave", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_menu", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_monitor", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_public", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init", "to": "app_api_workflow", "label": "re_exports", "title": "re_exports [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_init_rationale_1", "to": "app_api_init", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachment_download_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachment_preview_url", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_attachmentdownloadurlbody", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dept", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dict_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_dict_type", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_menu", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_post", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_role_management", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_site", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_tenant", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_create_user", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dept", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dict_data", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_api_admin", "to": "app_api_admin_delete_dict_type", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {Line truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 40}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 25}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 13}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 88}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 63}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 26}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 53}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 37}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 48}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 1}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 1}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 61}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 51}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 42}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 54}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 53}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 72}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 1}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 64}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 12}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 1}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 57}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 43}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 25}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 27}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 86}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 20}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 38}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 54}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 41}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 27}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 1}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 1}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 30}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 24}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 38}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 56}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 20}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 28}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 30}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 1}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 1}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 34}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 53}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 20}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 8}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 20}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 30}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 20}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 36}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 24}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 31}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 47}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 30}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 1}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 1}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 1}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 19}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 30}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 19}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 47}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 23}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 18}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 141}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 61}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 29}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 33}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 16}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 27}, {"cid": 70, "color": "#4E79A7", "label": "ComLine truncated
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
File diff suppressed because it is too large. Load diff
@@ -73,3 +73,17 @@ def test_cert_no_optional_for_required_slot():
get_required_personnel_cert_names("escort"),
)
assert errors == []
def test_attachment_optional_for_required_slot():
"""证书附件非必填:有名称+有效期即可,无附件不报错。"""
cert_rows = [
{"certName": "身份证", "expireDate": "2030-01-01"},
{"certName": "押运员从业资格证", "expireDate": "2030-01-01"},
]
errors = collect_required_cert_errors(
cert_rows,
get_required_personnel_cert_names("escort"),
)
assert errors == []
assert not any("附件" in e for e in collect_required_cert_errors([], ("身份证",)))
@@ -0,0 +1,43 @@
# 计划列表产品信息拆列 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将运输计划 / 计划归档 / 计划证件列表的「产品信息」合并列拆成产品名称、型号/规格、数量、单位四列。
**Architecture:** 扩展 `PlPlanListProductCell` 支持 `field` 按字段渲染;三页列表替换列定义与模板;列设置 key 从 `products` 改为四个独立 prop。
**Tech Stack:** Vue 3 + Element Plus(web-admin)
**Spec:** `docs/superpowers/specs/2026-08-02-pl-plan-list-product-columns-design.md`
---
### Task 1: 扩展 PlPlanListProductCell
**Files:**
- Modify: `web-admin/src/components/business/pl-plan-list-product-cell/index.vue`
- [x] **Step 1:** 增加 `field?: 'name' | 'spec' | 'qty' | 'unit'`;未传时保持现有整行拼接。
- [x] **Step 2:** `field` 有值时按字段渲染多行堆叠;`name` 带危化 Tag;`qty`/`unit` 用 `getPlanProductQuantity` / 字典标签;空产品显示 `—`。
- [x] **Step 3:** 从 `pl-display` 引入 `getPlanProductSpec`、`getPlanProductQuantity`(有 `field` 时不再依赖整行 `formatPlanProductListText`)。
### Task 2: 运输计划列表
**Files:**
- Modify: `web-admin/src/views/pl/plan/index.vue`
- [x] **Step 1:** `listColumnDefs` 将 `products` 换成 `productName` / `productSpec` / `productQty` / `productUnit`。
- [x] **Step 2:** 模板中「产品信息」列替换为四列,分别传 `field="name|spec|qty|unit"`;数量右对齐、单位居中;min-width 140/120/90/80。
### Task 3: 计划归档 + 计划证件列表
**Files:**
- Modify: `web-admin/src/views/pl/plan-archive/index.vue`
- Modify: `web-admin/src/views/pl/plan-cert/index.vue`
- [x] **Step 1:** 两页同样替换 `listColumnDefs` 与表格列(证件页在原「产品信息」位置拆四列,不重排其它列)。
### Task 4: 验证与图谱
- [x] **Step 1:** 目视/类型检查三页无模板错误;确认 `PlPlanListProductCell` 无其它调用方需同步(三页 + 组件声明)。
- [x] **Step 2:** 运行 `./scripts/update-graph.sh frontend`(或 `graphify update` 于 web-admin)。
@@ -0,0 +1,104 @@
# 运输计划列表「产品信息」拆列设计
**日期**:2026-08-02
**状态**:已实现
**范围**:web-admin 计划列表三页(运输计划 / 计划归档 / 计划证件)
## 背景
当前三页列表将多字段拼成一列「产品信息」,单元格内用 `PlPlanListProductCell` + `formatPlanProductListText` 渲染为:
`产品名称(型号/规格),数量单位` + 危化 Tag(毒 / 爆)
用户需要按字段拆成独立表格列,便于扫读与列显隐控制。
## 目标
将「产品信息」拆为四个独立 `el-table-column`:
| 列标题 | 字段来源 | 展示规则 |
|--------|----------|----------|
| 产品名称 | `productName` | 名称 + 危化 Tag(毒 / 爆,与现列表一致) |
| 型号/规格 | `model \|\| packageSpec` | 空则 `—`(同 `getPlanProductSpec`) |
| 数量 | 数量取值 | 同 `getPlanProductQuantity`:实际数量存在且非 0 用实际,否则计划/预估数量;空则 `—` |
| 单位 | `unit` | 字典 `crm_product_unit` 标签;空则 `—` |
多产品计划:四列各自按 `products` 数组顺序纵向堆叠多行,**同一索引行对齐**(行间距与现产品单元格一致)。
## 非目标
- 不改查看弹窗、表单产品表、安排运输等场景的产品展示
- 不改后端 API / `PlanProduct` 数据结构
- 不改 `formatPlanProductListText` 在文案拼接场景(确认框、打印摘要等)的用法
- 不引入排序、筛选产品字段
## 方案(已确认:方案 A)
四个真正的表格列;列设置中各自独立开关。
### 涉及页面
1. `web-admin/src/views/pl/plan/index.vue` — 运输计划
2. `web-admin/src/views/pl/plan-archive/index.vue` — 计划归档
3. `web-admin/src/views/pl/plan-cert/index.vue` — 计划证件
三页当前均为:
```vue
<el-table-column ... label="产品信息">
<PlPlanListProductCell :products="row.products" />
</el-table-column>
```
替换为四列(顺序接在「客户名称」后;证件页按该页原「产品信息」位置替换,不重排无关列)。
### 列设置(`usePersistedListColumns`)
原单项:
```ts
{ prop: 'products', label: '产品信息' }
```
改为:
```ts
{ prop: 'productName', label: '产品名称' },
{ prop: 'productSpec', label: '型号/规格' },
{ prop: 'productQty', label: '数量' },
{ prop: 'productUnit', label: '单位' }
```
- 默认全部可见
- 持久化 key 仍用各页现有 storage key(如 `pl-plan-list-columns`);旧配置中的 `products` 失效后自然不再匹配,四列走默认可见,无需迁移脚本
### 组件复用
扩展或拆分 `PlPlanListProductCell`,避免三页复制模板:
- 推荐:组件增加 `field` prop:`'name' | 'spec' | 'qty' | 'unit'`
- 各列:`<PlPlanListProductCell :products="row.products" field="name" />` 等
- `field` 未传时:保留现有整行拼接行为(供其他潜在引用;本三页改为传 `field`)
- 数量 / 单位对齐:数量列 `align="right"`,单位列 `align="center"`;名称 / 规格左对齐
- 名称列保留危化 Tag;其余列不展示 Tag
- 无产品时四列均显示 `—`
列宽建议(`min-width`):名称 140、规格 120、数量 90、单位 80。
### 样式
多行堆叠沿用现有 `.pl-plan-list-product-cell` 纵向 gap;四列共用同一行高节奏,避免某一列多出额外间距导致错位。
## 验收
1. 三页列表不再出现「产品信息」合并列,改为上述四列
2. 单产品、多产品计划行内容正确,多产品时四列行序一致
3. 危化产品名称旁仍显示毒 / 爆 Tag
4. 列设置可分别显隐四列;重置后四列均显示
5. 数量取值与拆列前一致(实际优先逻辑不变)
6. 「计划附件」列行为不变(仍用 `PlPlanListCertCell` + `hide-product`)
## 实现备注
- 字典标签:继续 `useDictStore().getLabel('crm_product_unit', unit)` 或页内已有 `DictTag` 模式,与列表其它单位展示一致即可
- 改完后按仓库约定更新 graphify(`./scripts/update-graph.sh frontend` 或等价)
+17 -8
View File
@@ -400,10 +400,19 @@
- **`max-height: min(520px, calc(100vh - 300px))`**(可按页面微调)
- `-webkit-overflow-scrolling: touch`
### 7.7 状态标签 `.tag`
### 7.7 状态标签(`el-tag` / `.tag`)
- **默认**:`display: inline-block`,`padding: 2px 8px`,圆角 **6px**,`12px`,`600`,背景 `var(--primary-bg)`,字 `var(--primary-dark)`
- **`.muted`**:背景 `var(--table-head)`,字 `var(--text-muted)`,字重 **500**
业务状态、结论、类型等 **SHALL** 使用 Element Plus `el-tag`,全局样式为 **深色底 + 白字**(实现见 `web-admin/src/assets/styles/core/el-ui.scss`):
| Tag type | 背景 | 文字 |
|----------|------|------|
| `success` / `primary` / 默认 | `#059669` | `#fff` |
| `warning` | `#d97706` | `#fff` |
| `danger` | `#dc2626` | `#fff` |
| `info` | 透明(无背景) | `var(--mint-text)` `#1e293b` |
- 圆角 **6px**,`padding: 2px 8px`,字号 **12px**,字重 **600**,无边框
- HTML demo 自绘 **`.tag`**:默认可对齐上表 success;**`.muted`** 仍可用浅底 `var(--table-head)` + `var(--text-muted)`(非业务枚举 Tag)
### 7.8 分页(HTML demo:`.list-pager`)
@@ -600,12 +609,12 @@
## 12. 业务状态色(与订单/配送枚举)
主品牌仍为绿;列表/标签建议:
主品牌仍为绿;列表 `el-tag` 建议(**深色底 + 白字**,见 **§7.7**):
- **进行中 / 主状态**:浅绿底 + 深绿字(同 `.tag`)
- **成功 / 完结**:略深绿(可与 `--primary-dark` 协调)
- **警告 / 待支付**:琥珀 `#d97706` 系
- **危险 / 异常**:红系用于强提醒;取消/信息可用 **`.tag.muted`** 或 slate
- **进行中 / 主状态 / 成功 / 完结**:深绿底 `#059669` + 白字(`success` / `primary`)
- **警告 / 待支付**:琥珀底 `#d97706` + 白字(`warning`)
- **危险 / 异常**:红底 `#dc2626` + 白字(`danger`)
- **中性 / 停用 / 待生效**:无背景 + 标准正文色 `#1e293b`(`info`)
(与 `.cursorrules` 中订单/配送状态表配合时,**颜色类**映射到上列语义即可。)
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_json", "label": "package.json", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_name", "label": "name", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L2"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_version", "label": "version", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L3"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_description", "label": "description", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L4"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_type", "label": "type", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L5"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_engines", "label": "engines", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L6"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_engines_node", "label": "node", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L7"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_engines_pnpm", "label": "pnpm", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L8"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts", "label": "scripts", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L10"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_dev", "label": "dev", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_build", "label": "build", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L12"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_build_typecheck", "label": "build:typecheck", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L13"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_serve", "label": "serve", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L14"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_lint", "label": "lint", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L15"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_fix", "label": "fix", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_lint_prettier", "label": "lint:prettier", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_lint_stylelint", "label": "lint:stylelint", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L18"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_lint_lint_staged", "label": "lint:lint-staged", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L19"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_prepare", "label": "prepare", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L20"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_commit", "label": "commit", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L21"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_scripts_clean_dev", "label": "clean:dev", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L22"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_config", "label": "config", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_config_commitizen", "label": "commitizen", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L25"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_commitizen_path", "label": "path", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L26"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_lint_staged", "label": "lint-staged", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L29"}, {"id": "users_wuzilong_work_00code_shanxia2_0_web_admin_package_lint_staged_js_ts_mjs_mts_tsx", "label": "*.{js,ts,mjs,mts,tsx}", "file_type": "code", "source_file": "web-admin/package.json", "source_location": "L30"}, {"id": "users_wuzilong_work_00code_shanxia2_0_weLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "label": "test_pl_brand_archive.py", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_allows_other_brand_when_sum_matches", "label": "test_required_allows_other_brand_when_sum_matches()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L8"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_allows_multi_brand_when_sum_matches", "label": "test_required_allows_multi_brand_when_sum_matches()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_sum_must_match", "label": "test_required_sum_must_match()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L29"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_any_sum_must_match", "label": "test_any_sum_must_match()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L42"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_any_ok", "label": "test_any_ok()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_no_brand_ignores_rows", "label": "test_no_brand_ignores_rows()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L67"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_delta_for_plan_type", "label": "test_delta_for_plan_type()", "file_type": "code", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L76"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "pytest", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "app_services_pl_brand_archive", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_allows_other_brand_when_sum_matches", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_allows_multi_brand_when_sum_matches", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_required_sum_must_match", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_any_sum_must_match", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L42", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_any_ok", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_brand_archive.py", "source_location": "L55", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_brand_archive_test_no_brand_ignores_rows", "relation": Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_py", "label": "product.py", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L32"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_category_row_to_dict", "label": "_category_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L42"}, {"id": "crmproductcategory", "label": "CrmProductCategory", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/product.py"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_list_categories", "label": "list_categories()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L58"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_build_category_tree", "label": "_build_category_tree()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L85"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_collect_category_with_ancestors", "label": "_collect_category_with_ancestors()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L96"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_list_category_tree", "label": "list_category_tree()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L112"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_get_category", "label": "get_category()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L145"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_create_category", "label": "create_category()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L157"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_update_category", "label": "update_category()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L194"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_soft_delete_category", "label": "soft_delete_category()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L233"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_category_code_exists", "label": "category_code_exists()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L273"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_brand_row_to_dict", "label": "_brand_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L293"}, {"id": "crmproductbrand", "label": "CrmProductBrand", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_alias_row_to_dict", "label": "_alias_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L302"}, {"id": "crmproductalias", "label": "CrmProductAlias", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_load_brands_aliases_maps", "label": "_load_brands_aliases_maps()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L310"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_assert_brand_deletable", "label": "_assert_brand_deletable()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L344"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_replace_product_brands", "label": "_replace_product_brands()", "file_type": "code", "source_file": "backend/app/crud/crm/product.py", "source_location": "L381"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_product_replace_product_aliases", "label": "_replLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_md", "label": "2026-08-02-pl-vehicle-personnel-photo.md", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_\u8f66\u8f86_\u9a7e\u62bc\u4eba\u5458\u7167\u7247\u5b57\u6bb5_implementation_plan", "label": "\u8f66\u8f86/\u9a7e\u62bc\u4eba\u5458\u7167\u7247\u5b57\u6bb5 Implementation Plan", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_\u6587\u4ef6\u7ed3\u6784", "label": "\u6587\u4ef6\u7ed3\u6784", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_\u90e8\u7f72\u987a\u5e8f", "label": "\u90e8\u7f72\u987a\u5e8f", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_1_db_\u8fc1\u79fb\u4e0e_sql_\u57fa\u7ebf", "label": "Task 1: DB \u8fc1\u79fb\u4e0e SQL \u57fa\u7ebf", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_2_orm_\u6a21\u578b", "label": "Task 2: ORM \u6a21\u578b", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L106"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_3_schema_api_\u900f\u4f20_\u542b\u5355\u6d4b", "label": "Task 3: Schema + API \u900f\u4f20\uff08\u542b\u5355\u6d4b\uff09", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L140"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_4_\u524d\u7aef\u7c7b\u578b\u4e0e\u7167\u7247\u5de5\u5177\u51fd\u6570", "label": "Task 4: \u524d\u7aef\u7c7b\u578b\u4e0e\u7167\u7247\u5de5\u5177\u51fd\u6570", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L266"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_5_\u4e09\u65b9\u8f66\u8f86\u9875_vehicle_index_vue", "label": "Task 5: \u4e09\u65b9\u8f66\u8f86\u9875 `vehicle/index.vue`", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L327"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_6_\u5c71\u5ce1\u81ea\u6709\u8f66\u8f86\u9875_self_vehicle_index_vue", "label": "Task 6: \u5c71\u5ce1\u81ea\u6709\u8f66\u8f86\u9875 `self-vehicle/index.vue`", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L488"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_7_\u9a7e\u62bc\u4eba\u5458\u9875_personnel_index_vue", "label": "Task 7: \u9a7e\u62bc\u4eba\u5458\u9875 `personnel/index.vue`", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L518"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_task_8_\u9a8c\u6536\u4e0e\u56fe\u8c31\u66f4\u65b0", "label": "Task 8: \u9a8c\u6536\u4e0e\u56fe\u8c31\u66f4\u65b0", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L610"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_spec_\u8986\u76d6\u81ea\u68c0", "label": "Spec \u8986\u76d6\u81ea\u68c0", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-02-pl-vehicle-personnel-photo.md", "source_location": "L648"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_02_pl_vehicle_personnel_photo_\u8f66\u8f86_\u9a7e\u62bc\u4eba\u5458\u7167\u7247\u5b57\u6bb5_implementation_plan", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/plansLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_py", "label": "test_quote_approver_setting.py", "file_type": "code", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "label": "test_parse_and_join_roundtrip()", "file_type": "code", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L8"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_requires_enabled_and_nonempty", "label": "test_prefill_requires_enabled_and_nonempty()", "file_type": "code", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_filters_against_valid_ids", "label": "test_prefill_filters_against_valid_ids()", "file_type": "code", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L23"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_py", "target": "app_crud_crm_quote_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_requires_enabled_and_nonempty", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_filters_against_valid_ids", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_quote_approver_setting.py", "source_location": "L23", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "callee": "parse_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L9", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "callee": "parse_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L10", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "callee": "parse_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L11", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "callee": "parse_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L12", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_parse_and_join_roundtrip", "callee": "join_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L13", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_requires_enabled_and_nonempty", "callee": "prefill_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L17", "receiver": null}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_quote_approver_setting_test_prefill_requires_enabled_and_nonempty", "callee": "prefill_approver_ids", "is_member_call": false, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_quote_approver_setting.py", "source_location": "L18", "receiver": null}, {"caller_nid": "usersLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_py", "label": "admin.py", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_roles_for_select", "label": "list_roles_for_select()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L42"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/admin.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_users_for_select", "label": "list_users_for_select()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L74"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_roles_for_designer", "label": "list_roles_for_designer()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L100"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_tenantcreatebody", "label": "TenantCreateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L121"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_tenantupdatebody", "label": "TenantUpdateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L132"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_tenants", "label": "list_tenants()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L144"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_create_tenant", "label": "create_tenant()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L165"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_update_tenant", "label": "update_tenant()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L187"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_delete_tenant", "label": "delete_tenant()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L212"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L229"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_usercreatebody", "label": "UserCreateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L242"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_userupdatebody", "label": "UserUpdateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L259"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_users", "label": "list_users()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L275"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_get_user_by_id", "label": "get_user_by_id()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L319"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_create_user", "label": "create_user()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L339"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_update_user", "label": "update_user()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L372"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_delete_user", "label": "delete_user()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L402"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_reset_user_password", "label": "reset_user_password()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L415"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_dicttypecreatebody", "label": "DictTypeCreateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L432"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_dicttypeupdatebody", "label": "DictTypeUpdateBody", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L441"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_list_dict_types", "label": "list_dict_types()", "file_type": "code", "source_file": "backend/app/api/admin.py", "source_location": "L451"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_admin_create_dict_type", "label": "create_dict_type()", "file_type": "code", "source_file": "baLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "label": "public_transport.py", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_resolve_unit_label", "label": "_resolve_unit_label()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L47"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_get_transport_by_token", "label": "_get_transport_by_token()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L54"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_parse_feedback_images", "label": "_parse_feedback_images()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L68"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_format_plan_date", "label": "_format_plan_date()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_resolve_other_personnel", "label": "_resolve_other_personnel()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L90"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "publictransportpersonnelread", "label": "PublicTransportPersonnelRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_build_public_page", "label": "_build_public_page()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L119"}, {"id": "publictransportpageread", "label": "PublicTransportPageRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_get_public_transport", "label": "get_public_transport()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L275"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_save_public_feedback", "label": "save_public_feedback()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L282"}, {"id": "publictransportfeedback", "label": "PublicTransportFeedback", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_format_file_size", "label": "_format_file_size()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L338"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_upload_public_attachment", "label": "upload_public_attachment()", "file_type": "code", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L347"}, {"id": "uploadfile", "label": "UploadFile", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/pl/public_transport.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/pl/public_transportLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "label": "quote_approver_setting.py", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_parse_approver_ids", "label": "parse_approver_ids()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L6"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_join_approver_ids", "label": "join_approver_ids()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_prefill_approver_ids", "label": "prefill_approver_ids()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L21"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/quote_approver_setting.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L46"}, {"id": "crmquoteapproversetting", "label": "CrmQuoteApproverSetting", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/quote_approver_setting.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_get_setting", "label": "get_setting()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L56"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/quote_approver_setting.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_assert_users_exist", "label": "_assert_users_exist()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L69"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_save_setting", "label": "save_setting()", "file_type": "code", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_rationale_26", "label": "\u8fd4\u56de\u53ef\u9884\u586b\u7684\u5ba1\u6279\u4eba ID \u5217\u8868\uff1b\u4e0d\u53ef\u7528\u5219\u7a7a\u5217\u8868\u3002", "file_type": "rationale", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L26"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_parse_approver_ids", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_join_approver_ids", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_prefill_approver_ids", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L21", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_prefill_approver_ids", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/quote_approver_setting.py", "source_location": "L21", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_quote_approver_setting_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "label": "test_pl_feedback_brand_qty.py", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary", "label": "test_format_brand_qty_summary()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L8"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary_empty", "label": "test_format_brand_qty_summary_empty()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary_zero_only", "label": "test_format_brand_qty_summary_zero_only()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L20"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_require_skips_when_no_brand_mode", "label": "test_require_skips_when_no_brand_mode()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_require_skips_when_not_enforced", "label": "test_require_skips_when_not_enforced()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_require_enforces_when_completed", "label": "test_require_enforces_when_completed()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L44"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_require_calls_validate_when_positive_rows", "label": "test_require_calls_validate_when_positive_rows()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_persist_io_item_brand_qtys_writes_when_brand_mode_missing", "label": "test_persist_io_item_brand_qtys_writes_when_brand_mode_missing()", "file_type": "code", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_rationale_79", "label": "\u8ba1\u5212\u884c brand_mode \u4e22\u5931\u65f6\uff0c\u5ba2\u6237\u7aef\u63d0\u4ea4\u7684\u591a\u54c1\u724c\u660e\u7ec6\u4ecd\u5e94\u843d\u5e93\uff08\u4e0d\u80fd\u53ea\u8f6f\u5220\u4e0d\u5199\uff09\u3002", "file_type": "rationale", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L79"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "pytest", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "app_services_pl_feedback_brand_qty", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary_empty", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_feedback_brand_qty.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_feedback_brand_qty_test_format_brand_qty_summary_zero_only", "relation": "contains", "confidence": "EXTRACTED", "sLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_py", "label": "crm_models.py", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmproductcategory", "label": "CrmProductCategory", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L21"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmproduct", "label": "CrmProduct", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L43"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmproductbrand", "label": "CrmProductBrand", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmproductalias", "label": "CrmProductAlias", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L98"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_sysoss", "label": "SysOss", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L117"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcustomer", "label": "CrmCustomer", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L149"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontact", "label": "CrmContact", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L232"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crminvoiceinfo", "label": "CrmInvoiceInfo", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L267"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcustomerfollow", "label": "CrmCustomerFollow", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L295"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcustomerpool", "label": "CrmCustomerPool", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L326"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcustomerpoolrule", "label": "CrmCustomerPoolRule", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L352"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmopportunity", "label": "CrmOpportunity", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L375"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmopportunityfollow", "label": "CrmOpportunityFollow", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L418"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmopportunityproduct", "label": "CrmOpportunityProduct", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L449"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmopportunitystagelog", "label": "CrmOpportunityStageLog", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L479"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontract", "label": "CrmContract", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L510"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontractapproversetting", "label": "CrmContractApproverSetting", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L593"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontractapproval", "label": "CrmContractApproval", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L612"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontractchange", "label": "CrmContractChange", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L643"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontracttemplate", "label": "CrmContractTemplate", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_location": "L674"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_crm_models_crmcontractproduct", "label": "CrmContractProduct", "file_type": "code", "source_file": "backend/app/models/crm_models.py", "source_locatLine truncated
@@ -0,0 +1 @@
{"nodes": [], "edges": [], "skipped": "data json (not a config/manifest)"}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_md", "label": "2026-07-31-pl-required-brand-as-preference.md", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_\u6307\u5b9a\u54c1\u724c\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a_implementation_plan", "label": "\u6307\u5b9a\u54c1\u724c\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a Implementation Plan", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_file_map", "label": "File map", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L15"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_1_backend_validate_brand_qty_rows_\u653e\u5bbd_required", "label": "Task 1: Backend \u2014 `validate_brand_qty_rows` \u653e\u5bbd `required`", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L33"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_2_frontend_brandqtychipsfield_\u7edf\u4e00\u591a\u9009", "label": "Task 2: Frontend \u2014 `BrandQtyChipsField` \u7edf\u4e00\u591a\u9009", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L137"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_3_\u5f52\u6863\u5f39\u7a97_required_\u52a0\u8f7d\u5168\u54c1\u724c\u5e76\u9884\u9009", "label": "Task 3: \u5f52\u6863\u5f39\u7a97 \u2014 `required` \u52a0\u8f7d\u5168\u54c1\u724c\u5e76\u9884\u9009", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L184"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_4_\u7ba1\u7406\u7aef\u53f8\u673a\u56de\u4f20\u5f39\u7a97", "label": "Task 4: \u7ba1\u7406\u7aef\u53f8\u673a\u56de\u4f20\u5f39\u7a97", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L291"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_5_\u8ba1\u5212\u8be6\u60c5\u73b0\u573a\u7f16\u8f91_\u516c\u5f00\u9875", "label": "Task 5: \u8ba1\u5212\u8be6\u60c5\u73b0\u573a\u7f16\u8f91 + \u516c\u5f00\u9875", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L385"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_task_6_demo_\u6587\u6848_\u56de\u5f52", "label": "Task 6: Demo \u6587\u6848 + \u56de\u5f52", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L429"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_spec_coverage_checklist", "label": "Spec coverage checklist", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L485"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_out_of_scope", "label": "Out of scope", "file_type": "document", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L501"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_\u6307\u5b9a\u54c1\u724c\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a_implementation_plan", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/plans/2026-07-31-pl-required-brand-as-preference.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_\u6307\u5b9a\u54c1\u724c\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a_implementation_plan", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_07_31_pl_required_brand_as_preference_file_map", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_py", "label": "reimburse.py", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice", "label": "ReimburseService", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L56"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_tenant_no", "label": "._tenant_no()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L58"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "bxusercontext", "label": "BxUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_can_change_applicant", "label": ".can_change_applicant()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L62"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_resolve_applicant", "label": ".resolve_applicant()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L71"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_get_by_id", "label": ".get_by_id()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L109"}, {"id": "bxreimburseapply", "label": "BxReimburseApply", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_get_paged", "label": ".get_paged()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L122"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_soft_delete", "label": ".soft_delete()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L136"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_workflow_nodes", "label": "._workflow_nodes()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L143"}, {"id": "bxworkflownode", "label": "BxWorkflowNode", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_pending_approval", "label": ".pending_approval()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L156"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_approved_by_me", "label": ".approved_by_me()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L222"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_has_debit_reimburse", "label": "._has_debit_reimburse()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L283"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_normalize_invoice_links", "label": ".normalize_invoice_links()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L297"}, {"id": "reimburseinvoicelinkin", "label": "ReimburseInvoiceLinkIn", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_sync_reimburse_invoices", "label": ".sync_reimburse_invoices()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L329"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_reimburse_reimburseservice_get_linked_invoice_ids", "label": ".get_linked_invoice_ids()", "file_type": "code", "source_file": "backend/app/services/bx/reimburse.py", "source_location": "L418"}, {"id": "users_wuzilong_work_00cLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "label": "minio_url.py", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_strip_url_query", "label": "strip_url_query()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L39"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_strip_legacy_prefix", "label": "_strip_legacy_prefix()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L47"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_extract_minio_object_key", "label": "extract_minio_object_key()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_normalize_oss_storage_url", "label": "normalize_oss_storage_url()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L83"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_join_relative_urls", "label": "join_relative_urls()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L96"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_resolve_oss_id_csv", "label": "resolve_oss_id_csv()", "file_type": "code", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L109"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_rationale_1", "label": "MinIO \u9644\u4ef6 URL \u89c4\u8303\u5316\uff08\u6570\u636e\u8fc1\u79fb\u5171\u7528\uff09\u3002 \u80cc\u666f ---- CRM / \u5730\u78c5 / \u62a5\u9500\u4e0e shanxia2.0 \u5171\u7528\u540c\u4e00 MinIO\uff08bucket \u9ed8", "file_type": "rationale", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_rationale_40", "label": "\u53bb\u6389\u9884\u7b7e\u540d query\uff08``?X-Amz-...``\uff09\u3002", "file_type": "rationale", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L40"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_rationale_61", "label": "\u5c06\u7edd\u5bf9/\u76f8\u5bf9 URL \u89c4\u8303\u4e3a MinIO object key\uff08\u4e0d\u542b bucket\uff09\u3002", "file_type": "rationale", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L61"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_rationale_89", "label": "\u8fc1\u79fb CRM ``sys_oss`` \u884c\uff1a``url`` + ``file_name`` \u2192 \u95e8\u6237\u76f8\u5bf9\u8def\u5f84\u3002", "file_type": "rationale", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L89"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_rationale_113", "label": "\u4e1a\u52a1\u8868 OSS ID \u4e32 \u2192 \u76f8\u5bf9 URL \u4e32\uff08\u7528\u4e8e\u5ba2\u6237\u8bc1\u7167\u3001\u8ddf\u8fdb\u9644\u4ef6\u7b49\uff09\u3002", "file_type": "rationale", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L113"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L18", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "target": "urllib_parse", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_strip_url_query", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L39", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_strip_legacy_prefix", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/scripts/migration/minio_url.py", "source_location": "L47", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migration_minio_url_extract_minio_object_key", "relation": "contains", "confidence": "EXTRACTED", "source_fLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_md", "label": "2026-08-01-portal-mega-panel-min-width.md", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-portal-mega-panel-min-width.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_\u95e8\u6237\u5927\u9762\u677f\u6700\u5c0f\u5bbd\u5ea6_\u65b9\u6848_b", "label": "\u95e8\u6237\u5927\u9762\u677f\u6700\u5c0f\u5bbd\u5ea6\uff08\u65b9\u6848 B\uff09", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-portal-mega-panel-min-width.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_task_1_\u66f4\u65b0\u9762\u677f\u5b9a\u4f4d", "label": "Task 1: \u66f4\u65b0\u9762\u677f\u5b9a\u4f4d", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-portal-mega-panel-min-width.md", "source_location": "L13"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_\u95e8\u6237\u5927\u9762\u677f\u6700\u5c0f\u5bbd\u5ea6_\u65b9\u6848_b", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/plans/2026-08-01-portal-mega-panel-min-width.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_\u95e8\u6237\u5927\u9762\u677f\u6700\u5c0f\u5bbd\u5ea6_\u65b9\u6848_b", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_portal_mega_panel_min_width_task_1_\u66f4\u65b0\u9762\u677f\u5b9a\u4f4d", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/plans/2026-08-01-portal-mega-panel-min-width.md", "source_location": "L13", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_py", "label": "reimburse.py", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_tenant", "label": "_tenant()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L30"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/bx/reimburse.py"}, {"id": "bxusercontext", "label": "BxUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_build_details_data", "label": "_build_details_data()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_get_generated_title", "label": "get_generated_title()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L63"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_list_reimburses", "label": "list_reimburses()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_my_reimburses", "label": "my_reimburses()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L126"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_my_reimburse_stats", "label": "my_reimburse_stats()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L171"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_reimburse_status_counts", "label": "reimburse_status_counts()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L181"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_pending_approval", "label": "pending_approval()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L190"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_pending_approval_stats", "label": "pending_approval_stats()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L222"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_approved_by_me", "label": "approved_by_me()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L232"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_get_reimburse", "label": "get_reimburse()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L264"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_get_approvals", "label": "get_approvals()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L278"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_get_approval_history", "label": "get_approval_history()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L291"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_create_reimburse", "label": "create_reimburse()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L304"}, {"id": "reimburseapplycreate", "label": "ReimburseApplyCreate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_update_reimburse", "label": "update_reimburse()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L358"}, {"id": "reimburseapplyupdate", "label": "ReimburseApplyUpdate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_submit_reimburse", "label": "submit_reimburse()", "file_type": "code", "source_file": "backend/app/api/bx/reimburse.py", "source_location": "L403"}, {"id": "reimbursesubmitbody", "label": "ReimburseSubmitBody", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/bx/reimburse.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_bx_reimburse_approve_reimburse", "label": "approve_reimburse()", "file_type": "code", "source_fLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "label": "oss.py", "file_type": "code", "source_file": "backend/app/crud/oss.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_create_oss", "label": "create_oss()", "file_type": "code", "source_file": "backend/app/crud/oss.py", "source_location": "L12"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/oss.py"}, {"id": "sysoss", "label": "SysOss", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/oss.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_get_oss_by_url", "label": "get_oss_by_url()", "file_type": "code", "source_file": "backend/app/crud/oss.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_get_oss_by_id", "label": "get_oss_by_id()", "file_type": "code", "source_file": "backend/app/crud/oss.py", "source_location": "L66"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_resolve_storage_path", "label": "resolve_storage_path()", "file_type": "code", "source_file": "backend/app/crud/oss.py", "source_location": "L77"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_rationale_67", "label": "\u6309\u4e3b\u952e id \u67e5\u8be2\u9644\u4ef6\uff08\u517c\u5bb9\u65e7 CRM \u96ea\u82b1 oss_id \u8fc1\u5165\u540e\u7684\u8bb0\u5f55\uff09", "file_type": "rationale", "source_file": "backend/app/crud/oss.py", "source_location": "L67"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_rationale_78", "label": "\u5c06 fileUrl \u6216\u65e7 CRM \u6570\u5b57 ossId \u89e3\u6790\u4e3a MinIO \u76f8\u5bf9\u8def\u5f84\u3002 \u95e8\u6237\u65b0\u4e0a\u4f20\u628a\u76f8\u5bf9\u8def\u5f84\u5199\u5165\u4e1a\u52a1\u5b57\u6bb5\uff1b\u8fc1\u5165\u5408\u540c\u9644\u4ef6\u4ecd\u5b58\u6570\u5b57 ossId", "file_type": "rationale", "source_file": "backend/app/crud/oss.py", "source_location": "L78"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "app_core_utils", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "app_models_crm_models", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_create_oss", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_create_oss", "target": "session", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_create_oss", "target": "sysoss", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_get_oss_by_url", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L55", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_get_oss_by_url", "target": "session", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L55", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_get_oss_by_url", "target": "sysoss", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "backend/app/crud/oss.py", "source_location": "L55", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_oss_py", "target": "users_wuLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "label": "config.py", "file_type": "code", "source_file": "backend/app/core/config.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_settings", "label": "Settings", "file_type": "code", "source_file": "backend/app/core/config.py", "source_location": "L7"}, {"id": "basesettings", "label": "BaseSettings", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_config", "label": "Config", "file_type": "code", "source_file": "backend/app/core/config.py", "source_location": "L183"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pydantic_settings", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_settings", "target": "basesettings", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/core/config.py", "source_location": "L183", "weight": 1.0}], "raw_calls": [], "callable_nids": ["users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_config", "users_wuzilong_work_00code_shanxia2_0_backend_app_core_config_settings"]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "label": "pl_feedback_brand_qty.py", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_format_brand_qty_summary", "label": "format_brand_qty_summary()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_require_brand_qtys_if_needed", "label": "require_brand_qtys_if_needed()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L23"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_feedback_brand_qty.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_persist_io_item_brand_qtys", "label": "persist_io_item_brand_qtys()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L46"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_feedback_brand_qty.py"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_feedback_brand_qty.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_dict_field", "label": "_dict_field()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L98"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_persist_transport_product_feedback", "label": "persist_transport_product_feedback()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L105"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_load_transport_driver_product_feedbacks", "label": "load_transport_driver_product_feedbacks()", "file_type": "code", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L222"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_rationale_1", "label": "\u73b0\u573a\u5165\u51fa\u5e93\u660e\u7ec6\u4e0e\u8fd0\u8f93\u56de\u4f20\u7684\u54c1\u724c\u6570\u91cf\u6821\u9a8c\u4e0e\u6301\u4e45\u5316", "file_type": "rationale", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_rationale_228", "label": "\u7ba1\u7406\u7aef\u8bfb\u8fd0\u8f93\u5355\u65f6\u9644\u53f8\u673a\u6309\u4ea7\u54c1\u56de\u4f20\u53ca\u54c1\u724c\u6458\u8981\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L228"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "app_core_utils", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "app_services_pl_brand_archive", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_feedback_brand_qty.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_feedback_brand_qty_format_brand_qty_summary",Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_md", "label": "2026-08-02-pl-vehicle-personnel-photo-design.md", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u8fd0\u8f93\u8ba1\u5212_\u8f66\u8f86_\u9a7e\u62bc\u4eba\u5458\u7167\u7247\u5b57\u6bb5_\u8bbe\u8ba1\u6587\u6863", "label": "\u8fd0\u8f93\u8ba1\u5212 \u00b7 \u8f66\u8f86/\u9a7e\u62bc\u4eba\u5458\u7167\u7247\u5b57\u6bb5 \u2014 \u8bbe\u8ba1\u6587\u6863", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u76ee\u6807", "label": "\u76ee\u6807", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u5df2\u786e\u8ba4\u4e1a\u52a1\u89c4\u5219", "label": "\u5df2\u786e\u8ba4\u4e1a\u52a1\u89c4\u5219", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L20"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u975e\u76ee\u6807_\u672c\u671f\u4e0d\u505a", "label": "\u975e\u76ee\u6807\uff08\u672c\u671f\u4e0d\u505a\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L32"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u65b9\u6848\u9009\u578b", "label": "\u65b9\u6848\u9009\u578b", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L42"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u6570\u636e\u6a21\u578b\u53d8\u66f4", "label": "\u6570\u636e\u6a21\u578b\u53d8\u66f4", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L54"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_pl_vehicle_\u65b0\u589e\u5217", "label": "`pl_vehicle` \u65b0\u589e\u5217", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L56"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_pl_personnel_\u65b0\u589e\u5217", "label": "`pl_personnel` \u65b0\u589e\u5217", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L65"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u540e\u7aef\u8bbe\u8ba1", "label": "\u540e\u7aef\u8bbe\u8ba1", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L82"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_schema_backend_app_schemas_pl_base_data_py", "label": "Schema\uff08`backend/app/schemas/pl/base_data.py`\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_api_backend_app_api_pl_base_data_py", "label": "API\uff08`backend/app/api/pl/base_data.py`\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L95"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u524d\u7aef\u8bbe\u8ba1", "label": "\u524d\u7aef\u8bbe\u8ba1", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L117"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehicle_personnel_photo_design_\u7c7b\u578b_web_admin_src_api_pl_index_ts", "label": "\u7c7b\u578b\uff08`web-admin/src/api/pl/index.ts`\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-02-pl-vehicle-personnel-photo-design.md", "source_location": "L119"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_02_pl_vehiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "label": "io_order.py", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandoption", "label": "BrandOption", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L11"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandqtyitem", "label": "BrandQtyItem", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_ioorderitemread", "label": "IoOrderItemRead", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_ioorderitempatch", "label": "IoOrderItemPatch", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L51"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_ioorderpatch", "label": "IoOrderPatch", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L58"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_ioorderread", "label": "IoOrderRead", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L67"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_ioorderlistresponse", "label": "IoOrderListResponse", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L106"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_publicioorderitemfeedback", "label": "PublicIoOrderItemFeedback", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L111"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_publicioorderfeedback", "label": "PublicIoOrderFeedback", "file_type": "code", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L118"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_rationale_1", "label": "\u5165\u5e93\u5355 / \u51fa\u5e93\u5355 Pydantic schemas", "file_type": "rationale", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandoption", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandoption", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandqtyitem", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_io_order_brandqtyitem", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/pl/io_order.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backeLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_md", "label": "spec.md", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_added_requirements", "label": "ADDED Requirements", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_web_\u7ba1\u7406\u7aef\u4ee5_fresh_mint_\u89c4\u8303\u4e3a\u552f\u4e00\u89c6\u89c9\u6743\u5a01", "label": "Requirement: Web \u7ba1\u7406\u7aef\u4ee5 Fresh Mint \u89c4\u8303\u4e3a\u552f\u4e00\u89c6\u89c9\u6743\u5a01", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L3"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_scenario_\u65b0\u589e\u5217\u8868\u9875", "label": "Scenario: \u65b0\u589e\u5217\u8868\u9875", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L7"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_\u5c0f\u7a0b\u5e8f\u4ee5\u4e09\u5899_demo_\u4f53\u7cfb\u4e3a\u552f\u4e00\u89c6\u89c9\u6743\u5a01", "label": "Requirement: \u5c0f\u7a0b\u5e8f\u4ee5\u4e09\u5899 Demo \u4f53\u7cfb\u4e3a\u552f\u4e00\u89c6\u89c9\u6743\u5a01", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L12"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_scenario_\u65b0\u589e\u5c0f\u7a0b\u5e8f\u9875\u9762", "label": "Scenario: \u65b0\u589e\u5c0f\u7a0b\u5e8f\u9875\u9762", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_\u7981\u6b62\u8de8\u7aef\u8c03\u8272\u677f\u6df7\u7528", "label": "Requirement: \u7981\u6b62\u8de8\u7aef\u8c03\u8272\u677f\u6df7\u7528", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L21"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_scenario_code_review", "label": "Scenario: Code review", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L25"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_\u6811\u5f62\u4e3b\u6570\u636e\u5c55\u793a\u89c4\u5219", "label": "Requirement: \u6811\u5f62\u4e3b\u6570\u636e\u5c55\u793a\u89c4\u5219", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L30"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_scenario_\u6811\u9009\u62e9\u4e0e\u8868\u683c\u5217", "label": "Scenario: \u6811\u9009\u62e9\u4e0e\u8868\u683c\u5217", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_\u5f39\u7a97\u4e0e\u906e\u7f69", "label": "Requirement: \u5f39\u7a97\u4e0e\u906e\u7f69", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L39"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_scenario_\u65b0\u589e\u7f16\u8f91\u5f39\u7a97", "label": "Scenario: \u65b0\u589e\u7f16\u8f91\u5f39\u7a97", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L43"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspec_changes_zkxw_engineering_standards_specs_ui_conventions_spec_requirement_\u5c0f\u7a0b\u5e8f\u5a92\u4f53\u4e0e\u89e6\u63a7", "label": "Requirement: \u5c0f\u7a0b\u5e8f\u5a92\u4f53\u4e0e\u89e6\u63a7", "file_type": "document", "source_file": "openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md", "source_location": "L48"}, {"id": "users_wuzilong_work_00code_shanxia2_0_openspeLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_py", "label": "migrate_crm_payment_invoice.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L52"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L56"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L62"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_payment_invoice.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L71"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L75"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L97"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_payment_invoice.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L115"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_payment_invoice.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L123"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L145"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L154"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_count_source_rows", "label": "count_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L161"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_target_table_exists", "label": "target_table_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L169"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L175"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_payment_invoice_transform_invoice_info", "label": "transform_invoice_info()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_payment_invoice.py", "source_location": "L179"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scrLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_list_carriers", "label": "list_carriers()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L74"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "carrierlistresponse", "label": "CarrierListResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_create_carrier", "label": "create_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L118"}, {"id": "carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_get_carrier", "label": "get_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L148"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_update_carrier", "label": "update_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L159"}, {"id": "carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_delete_carrier", "label": "delete_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L188"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_approve_carrier", "label": "approve_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L202"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_reject_carrier", "label": "reject_carrier()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L211"}, {"id": "carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_vehicle_to_read", "label": "_vehicle_to_read()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L240"}, {"id": "plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "certread", "label": "CertRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_vehicle_to_detail", "label": "_vehicle_to_detail()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L257"}, {"id": "vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_base_data_list_vehicles", "label": "list_vehicles()", "file_type": "code", "source_file": "backend/app/api/pl/base_data.py", "source_location": "L275"}, {"id": "vehiclelistresponse", "label": "VehicleListResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00cLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_md", "label": "2026-08-01-quote-approver-setting-design.md", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e_\u79df\u6237\u7ea7\u9ed8\u8ba4\u5ba1\u6279\u4eba", "label": "\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e\uff08\u79df\u6237\u7ea7\u9ed8\u8ba4\u5ba1\u6279\u4eba\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_1_\u76ee\u6807", "label": "1. \u76ee\u6807", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L9"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_2_\u975e\u76ee\u6807_\u9996\u7248\u4e0d\u505a", "label": "2. \u975e\u76ee\u6807\uff08\u9996\u7248\u4e0d\u505a\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L15"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_3_\u5df2\u786e\u8ba4\u51b3\u7b56", "label": "3. \u5df2\u786e\u8ba4\u51b3\u7b56", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L23"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_4_\u6570\u636e\u6a21\u578b", "label": "4. \u6570\u636e\u6a21\u578b", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L33"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_4_1_\u8868_crm_quote_approver_setting", "label": "4.1 \u8868 `crm_quote_approver_setting`", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L35"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_4_2_\u6a21\u578b\u4e0e_crud", "label": "4.2 \u6a21\u578b\u4e0e CRUD", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_5_api", "label": "5. API", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L62"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_6_\u524d\u7aef", "label": "6. \u524d\u7aef", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_6_1_\u8bbe\u7f6e\u9875", "label": "6.1 \u8bbe\u7f6e\u9875", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_6_2_\u63d0\u4ea4\u5ba1\u6279\u5f39\u7a97\u9884\u586b", "label": "6.2 \u63d0\u4ea4\u5ba1\u6279\u5f39\u7a97\u9884\u586b", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L89"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_6_3_\u754c\u9762\u6a21\u5f0f", "label": "6.3 \u754c\u9762\u6a21\u5f0f", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L105"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_7_\u6570\u636e\u6d41", "label": "7. \u6570\u636e\u6d41", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L110"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_quote_approver_setting_design_8_\u8fb9\u754c\u60c5\u51b5", "label": "8. \u8fb9\u754c\u60c5\u51b5", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-quote-approver-setting-design.md", "source_location": "L119"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "label": "test_pl_personnel_cert_required.py", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_driver_qualification_exact", "label": "test_match_driver_qualification_exact()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_escort_qualification_and_alias", "label": "test_match_escort_qualification_and_alias()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_required_names_by_personnel_type", "label": "test_required_names_by_personnel_type()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L23"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_both_requires_four_certs", "label": "test_both_requires_four_certs()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L41"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_escort_alias_counts_as_complete", "label": "test_escort_alias_counts_as_complete()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L54"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_cert_no_optional_for_required_slot", "label": "test_cert_no_optional_for_required_slot()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L66"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_attachment_optional_for_required_slot", "label": "test_attachment_optional_for_required_slot()", "file_type": "code", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_rationale_1", "label": "pl_cert_required_service \u4eba\u5458\u5fc5\u5907\u8bc1\u4e66\u89c4\u5219\u6d4b\u8bd5\u3002", "file_type": "rationale", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_rationale_79", "label": "\u8bc1\u4e66\u9644\u4ef6\u975e\u5fc5\u586b\uff1a\u6709\u540d\u79f0+\u6709\u6548\u671f\u5373\u53ef\uff0c\u65e0\u9644\u4ef6\u4e0d\u62a5\u9519\u3002", "file_type": "rationale", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L79"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "app_services_pl_cert_required_service", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_driver_qualification_exact", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_match_escort_qualification_and_alias", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_required_names_by_personnel_type", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L23", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_personnel_cert_required_test_both_requires_four_certs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_personnel_cert_required.py", "source_location": "L41", "weight"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "label": "renumber_crm_product_no.py", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_renumberstats", "label": "RenumberStats", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L40"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L48"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_product_id_sort_key", "label": "product_id_sort_key()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L64"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_format_new_product_no", "label": "format_new_product_no()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L71"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_fetch_products", "label": "fetch_products()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L77"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/renumber_crm_product_no.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_build_mapping", "label": "build_mapping()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_validate_mapping", "label": "validate_mapping()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L111"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_write_mapping_csv", "label": "write_mapping_csv()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L123"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/renumber_crm_product_no.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_apply_renumber", "label": "apply_renumber()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L143"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_main", "label": "main()", "file_type": "code", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L185"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_rationale_144", "label": "\u4e24\u9636\u6bb5 UPDATE\uff0c\u907f\u514d uk_product_no \u4e2d\u95f4\u6001\u51b2\u7a81\u3002", "file_type": "rationale", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L144"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "argparse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "csv", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L18", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/renumber_crm_product_no.py", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_renumber_crm_product_no_py", "target": "dataclasses", "relation": "imports_from", "context":Line truncated
@@ -0,0 +1 @@
{"nodes": [], "edges": [], "skipped": "data json (not a config/manifest)"}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "label": "crm_quote_routes.py", "file_type": "code", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_register_quote_routes", "label": "register_quote_routes()", "file_type": "code", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L85"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_rationale_1", "label": "CRM \u62a5\u4ef7\u5355 API \u8def\u7531 \u2014 \u6302\u63a5\u5230 crm.router", "file_type": "rationale", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_core_menu_guard", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_core_response", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_core_tenant_context", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_data_scope_helpers", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_quote", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_quote_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L36", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_quote_approval", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L37", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_quote_product", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L43", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_crud_crm_quote_share_log", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L49", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "target": "app_schemas_crm_quote_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_quote_routes.py", "source_location": "L50", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_quote_routes_py", "taLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_md", "label": "web-admin-ui-pattern-index.md", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_web_admin_\u754c\u9762\u6a21\u5f0f\u7d22\u5f15", "label": "web-admin \u754c\u9762\u6a21\u5f0f\u7d22\u5f15", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_\u4e00_\u600e\u4e48\u7528_30_\u79d2\u9009\u578b", "label": "\u4e00\u3001\u600e\u4e48\u7528\uff0830 \u79d2\u9009\u578b\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_\u4e8c_\u529f\u80fd\u7279\u5f81_\u6a21\u5f0f_\u51b3\u7b56\u8868", "label": "\u4e8c\u3001\u529f\u80fd\u7279\u5f81 \u2192 \u6a21\u5f0f\uff08\u51b3\u7b56\u8868\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L33"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_\u4e09_\u6a21\u5f0f\u8be6\u89e3_\u6807\u51c6\u5199\u6cd5_\u53c2\u8003", "label": "\u4e09\u3001\u6a21\u5f0f\u8be6\u89e3\uff08\u6807\u51c6\u5199\u6cd5 + \u53c2\u8003\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L67"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p01_\u6807\u51c6\u5217\u8868_crud", "label": "P01 \u6807\u51c6\u5217\u8868 CRUD", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L69"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p02_\u590d\u6742\u4e1a\u52a1\u5217\u8868", "label": "P02 \u590d\u6742\u4e1a\u52a1\u5217\u8868", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L101"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p03_\u6811\u5f62\u4e3b\u6570\u636e", "label": "P03 \u6811\u5f62\u4e3b\u6570\u636e", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p04_\u5de6\u6811\u53f3\u8868", "label": "P04 \u5de6\u6811\u53f3\u8868", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L144"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p05_\u4e3b\u4ece\u53cc\u8868_\u540c\u9875", "label": "P05 \u4e3b\u4ece\u53cc\u8868\uff08\u540c\u9875\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L154"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p06_\u4e3b\u4ece\u5f39\u7a97_\u5b50\u8868\u5728_dialog", "label": "P06 \u4e3b\u4ece\u5f39\u7a97\uff08\u5b50\u8868\u5728 Dialog\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L163"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p07_\u53f7\u6c60_\u6279\u91cf\u8fd0\u7ef4", "label": "P07 \u53f7\u6c60 / \u6279\u91cf\u8fd0\u7ef4", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L173"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p08_\u72b6\u6001_tab_\u5217\u8868", "label": "P08 \u72b6\u6001 Tab \u5217\u8868", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L191"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p09_\u6807\u51c6\u67e5\u770b\u5f39\u7a97_systemviewdialog", "label": "P09 \u6807\u51c6\u67e5\u770b\u5f39\u7a97\uff08SystemViewDialog\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L201"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p10_\u4e1a\u52a1\u4e13\u7528\u67e5\u770b\u5f39\u7a97", "label": "P10 \u4e1a\u52a1\u4e13\u7528\u67e5\u770b\u5f39\u7a97", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L222"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p11_\u8f7b\u91cf\u4e1a\u52a1\u5f39\u7a97_560px", "label": "P11 \u8f7b\u91cf\u4e1a\u52a1\u5f39\u7a97\uff08560px\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_location": "L240"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_pattern_index_p12_\u91cd\u8868\u5355\u5f39\u7a97_tab_\u5206\u533a", "label": "P12 \u91cd\u8868\u5355\u5f39\u7a97\uff08Tab \u5206\u533a\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-pattern-index.md", "source_lLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_md", "label": "2026-08-01-quote-approver-setting.md", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e_implementation_plan", "label": "\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e Implementation Plan", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_file_map", "label": "File map", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L17"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_1_\u7eaf\u51fd\u6570\u4e0e\u5355\u6d4b_tdd", "label": "Task 1: \u7eaf\u51fd\u6570\u4e0e\u5355\u6d4b\uff08TDD\uff09", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L37"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_2_sql_\u8fc1\u79fb_\u8868_\u83dc\u5355", "label": "Task 2: SQL \u8fc1\u79fb\uff08\u8868 + \u83dc\u5355\uff09", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L144"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_3_model_crud_upsert_schema", "label": "Task 3: Model + CRUD upsert + Schema", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L228"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_4_api_\u8def\u7531", "label": "Task 4: API \u8def\u7531", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L393"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_5_\u524d\u7aef_api_\u4e0e\u7c7b\u578b", "label": "Task 5: \u524d\u7aef API \u4e0e\u7c7b\u578b", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L468"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_6_\u8bbe\u7f6e\u9875_\u8def\u7531", "label": "Task 6: \u8bbe\u7f6e\u9875 + \u8def\u7531", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L532"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_7_\u63d0\u4ea4\u5ba1\u6279\u5f39\u7a97\u9884\u586b", "label": "Task 7: \u63d0\u4ea4\u5ba1\u6279\u5f39\u7a97\u9884\u586b", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L631"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_task_8_\u6536\u5c3e", "label": "Task 8: \u6536\u5c3e", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L714"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_spec_coverage_checklist", "label": "Spec coverage checklist", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L744"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_self_review_notes", "label": "Self-review notes", "file_type": "document", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L757"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e_implementation_plan", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/plans/2026-08-01-quote-approver-setting.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_\u62a5\u4ef7\u5355\u5ba1\u6279\u4eba\u8bbe\u7f6e_implementation_plan", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_plans_2026_08_01_quote_approver_setting_file_map", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/supLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_py", "label": "quote_approver_setting.py", "file_type": "code", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_quoteapproversettingsavebody", "label": "QuoteApproverSettingSaveBody", "file_type": "code", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L6"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_quoteapproversettingsavebody", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_quoteapproversettingsavebody", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/quote_approver_setting.py", "source_location": "L6", "weight": 1.0}], "raw_calls": [], "callable_nids": ["users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_quote_approver_setting_quoteapproversettingsavebody"]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "label": "import_solid_products.py", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_connect", "label": "connect()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L31"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_norm_text", "label": "norm_text()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L46"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_fix_name", "label": "fix_name()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L51"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_fix_alias", "label": "fix_alias()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L60"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_parse_groups", "label": "parse_groups()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L67"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_load_live_categories", "label": "load_live_categories()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L118"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_resolve_unit_and_category", "label": "resolve_unit_and_category()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L129"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_main", "label": "main()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L275"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "urllib_parse", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "pymysql", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_solid_products.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_solid_products_py", "target": "dotenv", "relation": "imports_from", "context": "import", "confidence"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_py", "label": "transport.py", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportbase", "label": "TransportBase", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L18"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportcreate", "label": "TransportCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L42"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportarrange", "label": "TransportArrange", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L47"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportinventorylinkread", "label": "TransportInventoryLinkRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L75"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportsitelinkread", "label": "TransportSiteLinkRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L85"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportupdate", "label": "TransportUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportdriverproductfeedbackread", "label": "TransportDriverProductFeedbackRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L123"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportread", "label": "TransportRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L139"}, {"id": "planresourcesnapshotmixin", "label": "PlanResourceSnapshotMixin", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportioorderbrief", "label": "TransportIoOrderBrief", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L161"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportarrangeresult", "label": "TransportArrangeResult", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L171"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_planarrangeinforead", "label": "PlanArrangeInfoRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L182"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportwithplans", "label": "TransportWithPlans", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L193"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_transportfeedback", "label": "TransportFeedback", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L202"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportproductfeedbackitem", "label": "PublicTransportProductFeedbackItem", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L211"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportfeedback", "label": "PublicTransportFeedback", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L218"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportplanproductread", "label": "PublicTransportPlanProductRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L226"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportpersonnelread", "label": "PublicTransportPersonnelRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L244"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportpageread", "label": "PublicTransportPageRead", "file_type": "code", "source_file": "backend/app/schemas/pl/transport.py", "source_location": "L251"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_transport_publictransportsitepageread", "label": "PublicTransportSitePageRead", "file_type": "code", "source_file": "backend/app/scLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_py", "label": "pl_cert_required_service.py", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_match_required_cert_name", "label": "match_required_cert_name()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L35"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_cert_row_complete", "label": "_cert_row_complete()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L44"}, {"id": "certrow", "label": "CertRow", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_find_cert_for_required", "label": "_find_cert_for_required()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L60"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_missing_field_labels", "label": "_missing_field_labels()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_collect_required_cert_errors", "label": "collect_required_cert_errors()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_get_required_personnel_cert_names", "label": "get_required_personnel_cert_names()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_personnel_type_role_compat", "label": "validate_personnel_type_role_compat()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L135"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_personnel_required_certs", "label": "validate_personnel_required_certs()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L146"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_self_vehicle_required_certs", "label": "validate_self_vehicle_required_certs()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L170"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_carrier_vehicle_required_certs", "label": "validate_carrier_vehicle_required_certs()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L194"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_personnel_affiliation", "label": "validate_vehicle_personnel_affiliation()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L218"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "vehiclepersonnelrow", "label": "VehiclePersonnelRow", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_cert_required_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_personnel_cert_links", "label": "validate_vehicle_personnel_cert_links()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L252"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_validate_vehicle_save_certs", "label": "validate_vehicle_save_certs()", "file_type": "code", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L291"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_cert_required_service_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_cert_required_service.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_aLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "label": "apply-list-toolbar-selected-to-pager.py", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_extract_selected_blocks", "label": "extract_selected_blocks()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_selected_to_pager_html", "label": "selected_to_pager_html()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_inject_into_pagers", "label": "inject_into_pagers()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L62"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_ensure_date_select_variant_safe", "label": "ensure_date_select_variant_safe()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_process_file", "label": "process_file()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L103"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/scripts/apply-list-toolbar-selected-to-pager.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_main", "label": "main()", "file_type": "code", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L158"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_extract_selected_blocks", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_selected_to_pager_html", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L45", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_inject_into_pagers", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L62", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_ensure_date_select_variant_safe", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L84", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_py", "target": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_process_file", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/apply-list-toolbar-selected-to-pager.py", "source_location": "L103", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_scripts_apply_list_toolbar_selected_to_pager_process_file", "target": "path", "relation": "references", "context": "parameteLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_py", "label": "migrate_users.py", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_sourceuser", "label": "SourceUser", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L97"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L112"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_has_chinese", "label": "_has_chinese()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L121"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_clip", "label": "_clip()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L125"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_users.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_normalize_phone", "label": "_normalize_phone()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L130"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_generate_initial_password", "label": "generate_initial_password()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L135"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_bx_role_labels", "label": "bx_role_labels()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L145"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_crm_role_labels", "label": "crm_role_labels()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L149"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_load_dept_mapping_csv", "label": "load_dept_mapping_csv()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L153"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_users.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L177"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L184"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L191"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_check_mysql", "label": "check_mysql()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L209"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_users.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_check_redis", "label": "check_redis()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L214"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_check_minio", "label": "check_minio()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L232"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_fetch_bx_users", "label": "fetch_bx_users()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L250"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_fetch_crm_users", "label": "fetch_crm_users()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L262"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_fetch_bx_role_users", "label": "fetch_bx_role_users()", "file_type": "code", "source_file": "backend/scripts/migrate_users.py", "source_location": "L275"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_users_fetch_crm_user_roles", "label": "fetch_crm_user_roles()", "file_type": "code", "source_file": "backend/scripts/migrate_usersLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_py", "label": "pl_inventory_service.py", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_qty_delta_for_plan", "label": "qty_delta_for_plan()", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L23"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_inventory_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_get_or_create_inventory", "label": "get_or_create_inventory()", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L31"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_inventory_service.py"}, {"id": "plinventory", "label": "PlInventory", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_inventory_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_apply_brand_stock_change", "label": "apply_brand_stock_change()", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L79"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_inventory_service.py"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_inventory_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_reverse_plan_inventory_postings", "label": "reverse_plan_inventory_postings()", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L139"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_apply_archive_inventory_for_plan", "label": "apply_archive_inventory_for_plan()", "file_type": "code", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L178"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_rationale_1", "label": "\u8ba1\u5212\u5f52\u6863\u6309\u4ea7\u54c1+\u54c1\u724c\u5199\u5165\u5e93\u5b58\u53f0\u8d26\u4e0e\u6d41\u6c34\u3002 \u76f4\u9500\u5355 (direct) \u9996\u671f\u4e0d\u8bb0\u8d26\uff1b\u5165\u5e93\u589e\u52a0\u3001\u51fa\u5e93\u6263\u51cf\uff08\u5141\u8bb8\u8d1f\u5e93\u5b58\uff0c\u4e0d\u505a\u4e0d\u8db3\u62e6\u622a\uff09\u3002 \u8c03\u6574\u5f52\u6863\u65f6\u5148\u6309 plan_i", "file_type": "rationale", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_rationale_146", "label": "\u51b2\u9500\u8be5\u8ba1\u5212\u5df2\u4ea7\u751f\u7684\u5e93\u5b58\u6d41\u6c34\uff08\u8c03\u6574\u5f52\u6863\u524d\u8c03\u7528\uff09\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L146"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_rationale_186", "label": "\u5f52\u6863\u540e\u6309\u54c1\u724c\u91cf\uff08\u6216\u65e0\u54c1\u724c actual_qty\uff09\u843d\u8d26\uff1b\u5148\u51b2\u9500\u65e7\u6d41\u6c34\u518d\u91cd\u8bb0\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L186"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_inventory_service_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_inventory_service.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_invenLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_py", "label": "migrate_crm_product.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L63"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L72"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L92"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L98"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L116"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L146"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_count_target_rows", "label": "count_target_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L153"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L166"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_transform_row", "label": "transform_row()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L172"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L254"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_write_mapping_csv", "label": "write_mapping_csv()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L260"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_print_report", "label": "print_report()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L283"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_clear_target_products", "label": "clear_target_products()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product.py", "source_location": "L296"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_run_migration", "label": "run_migration()", "file_type": "code", "source_file": "backend/scLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_md", "label": "2026-08-01-portal-mega-menu-design.md", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "label": "\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355\uff08\u65b9\u6848 A\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u76ee\u6807", "label": "\u76ee\u6807", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L3"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u4ea4\u4e92", "label": "\u4ea4\u4e92", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L7"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u8303\u56f4", "label": "\u8303\u56f4", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u975e\u76ee\u6807", "label": "\u975e\u76ee\u6807", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L21"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u9762\u677f\u5bbd\u5ea6_\u4e00\u7ea7\u8f83\u5c11\u65f6", "label": "\u9762\u677f\u5bbd\u5ea6\uff08\u4e00\u7ea7\u8f83\u5c11\u65f6\uff09", "file_type": "document", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L26"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u76ee\u6807", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u4ea4\u4e92", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u8303\u56f4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u975e\u76ee\u6807", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-01-portal-mega-menu-design.md", "source_location": "L21", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u95e8\u6237\u9876\u680f\u5927\u9762\u677f\u83dc\u5355_\u65b9\u6848_a", "target": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_08_01_portal_mega_menu_design_\u9762\u677f\u5bbd\u5ea6_\u4e00\u7ea7\u8f83\u5c11\u65f6", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/superpowers/specs/2026-08-0Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_py", "label": "pl_models.py", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L28"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L57"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plpersonnel", "label": "PlPersonnel", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransportaddress", "label": "PlTransportAddress", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L119"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plcert", "label": "PlCert", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L143"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pldriver", "label": "PlDriver", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L169"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plvehiclepersonnel", "label": "PlVehiclePersonnel", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L195"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plvehicledriver", "label": "PlVehicleDriver", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L216"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plplan", "label": "PlPlan", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L241"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L346"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plplanproductbrandqty", "label": "PlPlanProductBrandQty", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L405"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plplanchange", "label": "PlPlanChange", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L427"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransport", "label": "PlTransport", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L454"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransportproductfeedback", "label": "PlTransportProductFeedback", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L516"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransportproductbrandqty", "label": "PlTransportProductBrandQty", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L537"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransportdblink", "label": "PlTransportDbLink", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L560"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plplantransport", "label": "PlPlanTransport", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L583"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_pltransportsitelink", "label": "PlTransportSiteLink", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L602"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plinboundorder", "label": "PlInboundOrder", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L635"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plinboundorderitem", "label": "PlInboundOrderItem", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L665"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_pl_models_plinboundorderitembrandqty", "label": "PlInboundOrderItemBrandQty", "file_type": "code", "source_file": "backend/app/models/pl_models.py", "source_location": "L691"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_plLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_py", "label": "migrate_dibang_data.py", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L56"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_parse_date", "label": "parse_date()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L64"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_dibang_data.py"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_dibang_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_parse_datetime", "label": "parse_datetime()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L80"}, {"id": "datetime", "label": "datetime", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_dibang_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_clip_text", "label": "clip_text()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L104"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_fetch_rows", "label": "fetch_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L114"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_dibang_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_count_rows", "label": "count_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L120"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_map_id", "label": "map_id()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L125"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L145"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_build_id_maps", "label": "build_id_maps()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L150"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_transform_plan", "label": "transform_plan()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L159"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_transform_inventory", "label": "transform_inventory()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L200"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_transform_weighing", "label": "transform_weighing()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L238"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_truncate_target_tables", "label": "truncate_target_tables()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L347"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_export_mapping", "label": "export_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L355"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_dibang_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_print_report", "label": "print_report()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L363"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_migrate", "label": "migrate()", "file_type": "code", "source_file": "backend/scripts/migrate_dibang_data.py", "source_location": "L392"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_dibang_data_maiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductbase", "label": "PlanProductBase", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L16"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L49"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductupdate", "label": "PlanProductUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planarchivebrandqtyitem", "label": "PlanArchiveBrandQtyItem", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L75"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductread", "label": "PlanProductRead", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L82"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planbase", "label": "PlanBase", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L147"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_plantransportcreateblock", "label": "PlanTransportCreateBlock", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L156"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L170"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_hazardcertreadybody", "label": "HazardCertReadyBody", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L211"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planread", "label": "PlanRead", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L216"}, {"id": "planresourcesnapshotmixin", "label": "PlanResourceSnapshotMixin", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L244"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planinboundsliptemplatesave", "label": "PlanInboundSlipTemplateSave", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L248"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_plandeliverysliptemplatesave", "label": "PlanDeliverySlipTemplateSave", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L253"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_plansubpacksliptemplatesave", "label": "PlanSubpackSlipTemplateSave", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L260"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L272"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L283"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planlistquery", "label": "PlanListQuery", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L294"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductcertitem", "label": "PlanProductCertItem", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L309"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/plan.py", "source_location": "L317"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_plan_planarcLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "label": "crm_contract_routes.py", "file_type": "code", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_register_contract_routes", "label": "register_contract_routes()", "file_type": "code", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_rationale_1", "label": "CRM \u5408\u540c API \u8def\u7531 \u2014 GET/PUT/DELETE/POST \u5bf9\u9f50\u539f Java CRM", "file_type": "rationale", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_core_menu_guard", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_core_oper_log_decorator", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_core_response", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_core_tenant_context", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_crud_crm_data_scope_helpers", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_crud_crm_contract", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_crud_crm_contract_approval", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L47", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_crud_crm_contract_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L51", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_crm_contract_routes_py", "target": "app_crud_crm_contract_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/api/crm_contract_routes.py", "source_location": "L5Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_py", "label": "contract_approver_setting.py", "file_type": "code", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_contractapproversettingsavebody", "label": "ContractApproverSettingSaveBody", "file_type": "code", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L6"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_contractapproversettingsavebody", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_contractapproversettingsavebody", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/crm/contract_approver_setting.py", "source_location": "L6", "weight": 1.0}], "raw_calls": [], "callable_nids": ["users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_crm_contract_approver_setting_contractapproversettingsavebody"]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_py", "label": "storage.py", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_normalize_storage_path", "label": "normalize_storage_path()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_upload_bx_file", "label": "upload_bx_file()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L31"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_get_access_url", "label": "get_access_url()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L44"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_get_preview_url", "label": "get_preview_url()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_get_download_url", "label": "get_download_url()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L65"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_download_file_bytes", "label": "download_file_bytes()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L72"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_file_stream", "label": "file_stream()", "file_type": "code", "source_file": "backend/app/services/bx/storage.py", "source_location": "L98"}, {"id": "bytesio", "label": "BytesIO", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/bx/storage.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_1", "label": "\u62a5\u9500\u9644\u4ef6\u5b58\u50a8\u9002\u914d \u2014 \u590d\u7528\u95e8\u6237 app.core.storage\uff0c\u5bf9\u5916\u4fdd\u6301 bx \u534f\u8bae\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_12", "label": "\u5c06 upload \u8fd4\u56de\u7684\u5b8c\u6574 URL \u5f52\u4e00\u5316\u4e3a\u5b58\u50a8\u76f8\u5bf9\u8def\u5f84\uff08\u4e0e admin \u9644\u4ef6 upload \u4e00\u81f4\uff09\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L12"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_32", "label": "\u4e0a\u4f20\u6587\u4ef6\u5230\u5bf9\u8c61\u5b58\u50a8\u3002 \u8fd4\u56de (relative_path, access_url)\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L32"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_45", "label": "\u83b7\u53d6\u53ef\u8bbf\u95ee URL\uff08\u672c\u5730/MinIO \u516c\u5f00\u5730\u5740\uff09\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_54", "label": "\u56fe\u7247/\u9644\u4ef6\u9884\u89c8 URL\uff1aMinIO \u9884\u7b7e\u540d inline\uff0c\u672c\u5730/\u5176\u4ed6\u5b58\u50a8\u7528 get_url\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L54"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_66", "label": "\u5e26\u6587\u4ef6\u540d\u7684\u4e0b\u8f7d URL\uff08\u5bf9\u9f50\u95e8\u6237 attachment/download-url\uff09\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L66"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_rationale_73", "label": "\u8bfb\u53d6\u6587\u4ef6\u4e8c\u8fdb\u5236\uff0c\u4f9b StreamingResponse \u4e0b\u8f7d\u3002", "file_type": "rationale", "source_file": "backend/app/services/bx/storage.py", "source_location": "L73"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_py", "target": "io", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/bx/storage.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bx_storage_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/bx/storage.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_bLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_py", "label": "migrate_crm_product_category.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L47"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L55"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product_category.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L65"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L70"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L86"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L92"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product_category.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L117"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_product_category.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L128"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L153"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_count_target_rows", "label": "count_target_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L160"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_topo_sort_categories", "label": "topo_sort_categories()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L173"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_compute_level", "label": "compute_level()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L207"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_transform_row", "label": "transform_row()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L214"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L264"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_write_mapping_csv", "label": "write_mapping_csv()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L305"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_product_category_print_report", "label": "print_report()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_product_category.py", "source_location": "L338"}, {"id": "userLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "label": "README.md", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u751f\u4ea7\u6570\u636e\u540c\u6b65_shanxia2_0", "label": "\u751f\u4ea7\u6570\u636e\u540c\u6b65\uff08shanxia2.0\uff09", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u4e0e\u4ee3\u7801\u79fb\u690d\u6587\u6863\u7684\u5173\u7cfb", "label": "\u4e0e\u4ee3\u7801\u79fb\u690d\u6587\u6863\u7684\u5173\u7cfb", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L5"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_sql_\u5feb\u7167\u6743\u5a01\u6765\u6e90", "label": "SQL \u5feb\u7167\u6743\u5a01\u6765\u6e90", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u6587\u6863\u7d22\u5f15", "label": "\u6587\u6863\u7d22\u5f15", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u5f53\u524d\u72b6\u6001", "label": "\u5f53\u524d\u72b6\u6001", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u6267\u884c\u8bb0\u5f55", "label": "\u6267\u884c\u8bb0\u5f55", "file_type": "document", "source_file": "docs/data-migration/README.md", "source_location": "L55"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u751f\u4ea7\u6570\u636e\u540c\u6b65_shanxia2_0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u751f\u4ea7\u6570\u636e\u540c\u6b65_shanxia2_0", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u4e0e\u4ee3\u7801\u79fb\u690d\u6587\u6863\u7684\u5173\u7cfb", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u751f\u4ea7\u6570\u636e\u540c\u6b65_shanxia2_0", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_sql_\u5feb\u7167\u6743\u5a01\u6765\u6e90", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u751f\u4ea7\u6570\u636e\u540c\u6b65_shanxia2_0", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_\u6587\u6863\u7d22\u5f15", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L24", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L28", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_00_master_plan_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_01_user_account_inventory_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_02_user_unification_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readme_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_05_id_preservation_policy_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/README.md", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_readmLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_py", "label": "migrate_crm_contract.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L61"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L65"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L71"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L100"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L106"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L124"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L132"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_load_oss_id_to_url", "label": "load_oss_id_to_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L157"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_normalize_attachment_csv", "label": "normalize_attachment_csv()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L166"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_normalize_contract_attachment_files", "label": "normalize_contract_attachment_files()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L187"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_normalize_file_path", "label": "normalize_file_path()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L212"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L222"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_contract.py", "source_location": "L228"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_contract_fetch_source_rows", "labLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "label": "backfill_crm_customer_license_urls.py", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L44"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/backfill_crm_customer_license_urls.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L57"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L73"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_load_oss_map", "label": "load_oss_map()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L79"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/backfill_crm_customer_license_urls.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_fetch_source_customers", "label": "fetch_source_customers()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L88"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_build_updates", "label": "build_updates()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_write_report_csv", "label": "write_report_csv()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L137"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/backfill_crm_customer_license_urls.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_main", "label": "main()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L161"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "argparse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "csv", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_customer_license_urls.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_customer_license_urls_py", "target": "pathlib", "relationLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_py", "label": "storage.py", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_convert_heic_to_jpeg", "label": "convert_heic_to_jpeg()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L37"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_process_image_content", "label": "process_image_content()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L52"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage", "label": "BaseStorage", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L61"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_upload_file", "label": ".upload_file()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L64"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_upload_base64", "label": ".upload_base64()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L68"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_delete_file", "label": ".delete_file()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L72"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_get_url", "label": ".get_url()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_presigned_download_url", "label": ".presigned_download_url()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L80"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_basestorage_presigned_preview_url", "label": ".presigned_preview_url()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L86"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage", "label": "LocalStorage", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_init", "label": ".__init__()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L94"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_ensure_dir", "label": "._ensure_dir()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L98"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/core/storage.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_generate_filename", "label": "._generate_filename()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L104"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_upload_file", "label": ".upload_file()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L110"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_upload_base64", "label": ".upload_base64()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L125"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_delete_file", "label": ".delete_file()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L134"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_localstorage_get_url", "label": ".get_url()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L151"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_qiniustorage", "label": "QiniuStorage", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L156"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_qiniustorage_init", "label": ".__init__()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L159"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_qiniustorage_generate_filename", "label": "._generate_filename()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L168"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_core_storage_qiniustorage_upload_file", "label": ".upload_file()", "file_type": "code", "source_file": "backend/app/core/storage.py", "source_location": "L174"}, {"id": "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_agents_md", "label": "AGENTS.md", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_agents_md_shanxia2_0_\u5c71\u5ce1\u5316\u5de5", "label": "AGENTS.md \u2014 shanxia2.0 (\u5c71\u5ce1\u5316\u5de5)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_repository_layout", "label": "Repository Layout", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L5"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_ecosystem_multi_system", "label": "Ecosystem (multi-system)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L15"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_openspec_engineering_standards", "label": "OpenSpec engineering standards", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L27"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_ui_conventions_web_admin_miniprogram", "label": "UI Conventions (web-admin + miniprogram)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L31"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_api_conventions_backend", "label": "API Conventions (backend)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L57"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_database_conventions", "label": "Database Conventions", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L65"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_architecture_conventions", "label": "Architecture Conventions", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L73"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_coding_conventions", "label": "Coding Conventions", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L79"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_permission_conventions", "label": "Permission Conventions", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L88"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_workflow_conventions_target_design_not_yet_implemented", "label": "Workflow Conventions (target design, not yet implemented)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L96"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_backend_backend", "label": "Backend (`backend/`)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L104"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_stack", "label": "Stack", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L106"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_commands", "label": "Commands", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L109"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_entrypoint_structure", "label": "Entrypoint & Structure", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L119"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_key_patterns", "label": "Key Patterns", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L130"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_frontend_web_admin", "label": "Frontend (`web-admin/`)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L139"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_stack_141", "label": "Stack", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L141"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_commands_144", "label": "Commands", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L144"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_entrypoint_structure_158", "label": "Entrypoint & Structure", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L158"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_path_aliases_tsconfig_vite", "label": "Path Aliases (tsconfig + vite)", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L166"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_key_patterns_169", "label": "Key Patterns", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L169"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_code_style", "label": "Code Style", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L180"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_ui_design_authority", "label": "UI Design Authority", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L187"}, {"id": "users_wuzilong_work_00code_shanxia2_0_agents_knowledge_graph_\u4ee3\u7801\u77e5\u8bc6\u56fe\u8c31", "label": "Knowledge Graph (\u4ee3\u7801\u77e5\u8bc6\u56fe\u8c31)", "file_type": "document", "source_fiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "label": "contract_approver_setting.py", "file_type": "code", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L14"}, {"id": "crmcontractapproversetting", "label": "CrmContractApproverSetting", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract_approver_setting.py"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract_approver_setting.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_get_setting", "label": "get_setting()", "file_type": "code", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L24"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract_approver_setting.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_assert_users_exist", "label": "_assert_users_exist()", "file_type": "code", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L37"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_save_setting", "label": "save_setting()", "file_type": "code", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L52"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "app_core_utils", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "app_crud_crm_quote_approver_setting", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "app_models_crm_models", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "app_models_models", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_row_to_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_row_to_dict", "target": "crmcontractapproversetting", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "backend/app/crud/crm/contract_approver_setting.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_approver_setting_row_to_dict", "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_py", "label": "contract.py", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_ensure_contract_in_scope", "label": "_ensure_contract_in_scope()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L48"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "crmcontract", "label": "CrmContract", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_get_contract_row_in_scope", "label": "_get_contract_row_in_scope()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L52"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L69"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_decimal_value", "label": "_decimal_value()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L75"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_parse_optional_date", "label": "_parse_optional_date()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L83"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_parse_optional_datetime", "label": "_parse_optional_datetime()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L101"}, {"id": "datetime", "label": "datetime", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contract.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_get_field", "label": "_get_field()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L117"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_resolve_user_display_name", "label": "_resolve_user_display_name()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_is_blank", "label": "_is_blank()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L134"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_first_non_blank", "label": "_first_non_blank()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L138"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_get_default_invoice_info", "label": "_get_default_invoice_info()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L146"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_build_customer_address", "label": "_build_customer_address()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L156"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L168"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_contract_row_to_dict", "label": "contract_row_to_dict()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L245"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_crud_crm_contract_build_contract_filters", "label": "_build_contract_filters()", "file_type": "code", "source_file": "backend/app/crud/crm/contract.py", "source_location": "L249"}, {"id": "query", "label": "Query", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/crud/crm/contLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_md", "label": "product-schema-diff-and-scripts.md", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_crm_\u4ea7\u54c1\u8fc1\u79fb_\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "label": "CRM \u4ea7\u54c1\u8fc1\u79fb\uff1a\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_1_\u4ee5\u524d\u6709\u6ca1\u6709\u811a\u672c_\u80fd\u4e0d\u80fd\u76f4\u63a5\u7528", "label": "1. \u4ee5\u524d\u6709\u6ca1\u6709\u811a\u672c\uff1f\u80fd\u4e0d\u80fd\u76f4\u63a5\u7528\uff1f", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L9"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_2_crm_product_\u5b57\u6bb5\u5bf9\u7167", "label": "2. `crm_product` \u5b57\u6bb5\u5bf9\u7167", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L21"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_3_crm_product_category_\u5b57\u6bb5\u5bf9\u7167", "label": "3. `crm_product_category` \u5b57\u6bb5\u5bf9\u7167", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L42"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_4_\u63a8\u8350\u6267\u884c\u987a\u5e8f_\u672a\u81ea\u52a8\u6267\u884c_\u9700\u4f60\u786e\u8ba4\u540e\u8dd1", "label": "4. \u63a8\u8350\u6267\u884c\u987a\u5e8f\uff08\u672a\u81ea\u52a8\u6267\u884c\uff0c\u9700\u4f60\u786e\u8ba4\u540e\u8dd1\uff09", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L54"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_5_\u4e0d\u5728\u672c\u6b21\u8303\u56f4", "label": "5. \u4e0d\u5728\u672c\u6b21\u8303\u56f4", "file_type": "document", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L79"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_crm_\u4ea7\u54c1\u8fc1\u79fb_\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_md", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_05_id_preservation_policy_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_crm_\u4ea7\u54c1\u8fc1\u79fb_\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_1_\u4ee5\u524d\u6709\u6ca1\u6709\u811a\u672c_\u80fd\u4e0d\u80fd\u76f4\u63a5\u7528", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_crm_\u4ea7\u54c1\u8fc1\u79fb_\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "target": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_2_crm_product_\u5b57\u6bb5\u5bf9\u7167", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/data-migration/phase-1-crm/product-schema-diff-and-scripts.md", "source_location": "L21", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_phase_1_crm_product_schema_diff_and_scripts_crm_\u4ea7\u54c1\u8fc1\u79fb_\u8868\u6a21\u578b\u5dee\u5f02\u4e0e\u811a\u672c\u8bf4\u660e", "target": "users_wuzilong_work_00code_shaLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_py", "label": "io_order.py", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_models", "label": "_models()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L34"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_order", "label": "_get_order()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L40"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/io_order.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_to_read", "label": "_to_read()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L58"}, {"id": "ioorderread", "label": "IoOrderRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/io_order.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_list_orders", "label": "_list_orders()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L64"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/io_order.py"}, {"id": "ioorderlistresponse", "label": "IoOrderListResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/io_order.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_patch_order", "label": "_patch_order()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L125"}, {"id": "ioorderpatch", "label": "IoOrderPatch", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/io_order.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_by_plan", "label": "_get_by_plan()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L182"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_inbound_by_plan", "label": "get_inbound_by_plan()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L207"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_list_inbound", "label": "list_inbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L220"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_inbound", "label": "get_inbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L252"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_patch_inbound", "label": "patch_inbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L263"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_inbound_site_url", "label": "inbound_site_url()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L273"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_outbound_by_plan", "label": "get_outbound_by_plan()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L285"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_list_outbound", "label": "list_outbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L298"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_get_outbound", "label": "get_outbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L330"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_patch_outbound", "label": "patch_outbound()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L341"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_outbound_site_url", "label": "outbound_site_url()", "file_type": "code", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L351"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_io_order_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212 \u00b7 \u5165\u5e93\u5355 / \u51fa\u5e93\u5355\u7ba1\u7406\u7aef API", "file_type": "rationale", "source_file": "backend/app/api/pl/io_order.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "label": "pl_product_display.py", "file_type": "code", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_resolve_alias_from_saved_name", "label": "resolve_alias_from_saved_name()", "file_type": "code", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L11"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_load_crm_product_alias_maps", "label": "load_crm_product_alias_maps()", "file_type": "code", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L26"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_product_display.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_resolve_product_display_names", "label": "resolve_product_display_names()", "file_type": "code", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L74"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_apply_product_alias_display", "label": "apply_product_alias_display()", "file_type": "code", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L94"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212\u4ea7\u54c1\u5c55\u793a\uff1a\u6807\u51c6\u540d / \u522b\u540d\u62c6\u5206\uff08\u4e0e\u524d\u7aef applyAliasDisplayMeta \u5bf9\u9f50\uff09", "file_type": "rationale", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_rationale_16", "label": "\u4ece\u5df2\u5b58 productName \u53cd\u63a8\u522b\u540d\uff1b\u7b49\u4e8e\u6807\u51c6\u540d\u6216\u4e0d\u5728\u522b\u540d\u5217\u8868 \u2192 None\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_rationale_32", "label": "\u6279\u91cf\u52a0\u8f7d CRM \u6807\u51c6\u540d\u4e0e\u522b\u540d\u9009\u9879\u3002\u8fd4\u56de (standard_name_by_id, alias_options_by_id)\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L32"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_rationale_81", "label": "\u8fd4\u56de (\u5c55\u793a\u7528\u4ea7\u54c1\u540d\u79f0, \u522b\u540d)\u3002 \u4ea7\u54c1\u540d\u79f0\u4f18\u5148 CRM \u6807\u51c6\u540d\uff1b\u522b\u540d\u4ec5\u5728\u5df2\u5b58\u540d\u547d\u4e2d\u522b\u540d\u5217\u8868\u65f6\u8fd4\u56de\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L81"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_rationale_102", "label": "\u5c31\u5730\u5199\u5165 item \u7684 productName\uff08\u6807\u51c6\u540d\uff09\u4e0e aliasName\u3002", "file_type": "rationale", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L102"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "target": "app_models_crm_models", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_resolve_alias_from_saved_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/pl_product_display.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_product_display_load_crm_product_alias_maps", "relation": "contains", "confideLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_py", "label": "migrate_crm_sys_oss.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_backfillrule", "label": "BackfillRule", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_bizref", "label": "BizRef", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L93"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L102"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L113"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_sys_oss.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L122"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L126"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L142"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L148"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_sys_oss.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L166"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_sys_oss.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L174"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L196"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_count_target_rows", "label": "count_target_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L202"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_transform_row", "label": "transform_row()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L212"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L288"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_parse_oss_id_tokens", "label": "parse_oss_id_tokens()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L295"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_normalize_oss_token", "label": "_normalize_oss_token()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L335"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_table_exists", "label": "table_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_sys_oss.py", "source_location": "L348"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_sys_oss_build_biz_index", "label": "build_biz_index()", "fileLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_md", "label": "PRODUCTION_MIGRATION_RUNLOG.md", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_\u751f\u4ea7\u6570\u636e\u8fc1\u79fb\u5168\u8fc7\u7a0b\u8bb0\u5f55_\u53ef\u7eed\u5199", "label": "\u751f\u4ea7\u6570\u636e\u8fc1\u79fb\u5168\u8fc7\u7a0b\u8bb0\u5f55\uff08\u53ef\u7eed\u5199\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_0_\u73af\u5883\u7ea6\u5b9a_\u672c\u6b21", "label": "0. \u73af\u5883\u7ea6\u5b9a\uff08\u672c\u6b21\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L9"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_1_\u7b2c\u4e00\u6b65_\u90e8\u95e8\u6570\u636e_p0_2", "label": "1. \u7b2c\u4e00\u6b65\uff1a\u90e8\u95e8\u6570\u636e\uff08P0-2\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L28"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_1_1_\u6743\u5a01\u6765\u6e90_\u5df2\u786e\u8ba4", "label": "1.1 \u6743\u5a01\u6765\u6e90\uff08\u5df2\u786e\u8ba4\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L30"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_1_2_v1_\u5907\u4efd\u4e2d\u7684_5_\u6761\u90e8\u95e8_\u4e0e_migrate_users_py_\u786c\u7f16\u7801\u4e00\u81f4", "label": "1.2 v1 \u5907\u4efd\u4e2d\u7684 5 \u6761\u90e8\u95e8\uff08\u4e0e `migrate_users.py` \u786c\u7f16\u7801\u4e00\u81f4\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L43"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_1_3_\u6267\u884c\u6b65\u9aa4_\u7eed\u8dd1\u65f6\u52fe\u9009", "label": "1.3 \u6267\u884c\u6b65\u9aa4\uff08\u7eed\u8dd1\u65f6\u52fe\u9009\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L58"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_1_4_\u672c\u6b65\u6267\u884c\u65e5\u5fd7", "label": "1.4 \u672c\u6b65\u6267\u884c\u65e5\u5fd7", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L66"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_2_\u5168\u8fc7\u7a0b\u9636\u6bb5\u6e05\u5355_\u5bf9\u7167\u6267\u884c", "label": "2. \u5168\u8fc7\u7a0b\u9636\u6bb5\u6e05\u5355\uff08\u5bf9\u7167\u6267\u884c\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L75"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_p0_\u57fa\u7840", "label": "P0 \u57fa\u7840", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L77"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_p1_crm_\u6e90_sx", "label": "P1 CRM\uff08\u6e90 `sx`\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L86"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_p2_\u62a5\u9500_\u6e90_sx", "label": "P2 \u62a5\u9500\uff08\u6e90 `sx`\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L101"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_p3_\u5730\u78c5_\u6e90_dibang_test", "label": "P3 \u5730\u78c5\uff08\u6e90 `dibang-test`\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L107"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_p4_\u9a8c\u6536", "label": "P4 \u9a8c\u6536", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L116"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_data_migration_production_migration_runlog_3_\u64cd\u4f5c\u547d\u4ee4\u6a21\u677f_\u5bc6\u7801\u8131\u654f", "label": "3. \u64cd\u4f5c\u547d\u4ee4\u6a21\u677f\uff08\u5bc6\u7801\u8131\u654f\uff09", "file_type": "document", "source_file": "docs/data-migration/PRODUCTION_MIGRATION_RUNLOG.md", "source_location": "L122"}, {"id": "users_wuzilong_wLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "label": "bx_models.py", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxexpenseitem", "label": "BxExpenseItem", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L10"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxworkflowdef", "label": "BxWorkflowDef", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L33"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxworkflownode", "label": "BxWorkflowNode", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L62"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxadvanceapply", "label": "BxAdvanceApply", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L95"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxadvanceapproval", "label": "BxAdvanceApproval", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L128"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxreimburseapply", "label": "BxReimburseApply", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L151"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxreimbursedetail", "label": "BxReimburseDetail", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L189"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxreimburseapproval", "label": "BxReimburseApproval", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L210"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxreimburseoffset", "label": "BxReimburseOffset", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L233"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxattachment", "label": "BxAttachment", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L251"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxinvoice", "label": "BxInvoice", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L274"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxinvoiceledger", "label": "BxInvoiceLedger", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L296"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxreimburseinvoice", "label": "BxReimburseInvoice", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L321"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxinvoicewalletsummary", "label": "BxInvoiceWalletSummary", "file_type": "code", "source_file": "backend/app/models/bx_models.py", "source_location": "L339"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_rationale_1", "label": "\u62a5\u9500\uff08bx\uff09\u6a21\u5757\u6570\u636e\u6a21\u578b \u2014 \u5bf9\u9f50 docs/sql/20260606_bx_tables.sql", "file_type": "rationale", "source_file": "backend/app/models/bx_models.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/models/bx_models.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/models/bx_models.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/models/bx_models.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/models/bx_models.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_app_models_bx_models_bxLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_py", "label": "pl_io_order_service.py", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_ioordercreateresult", "label": "IoOrderCreateResult", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_build_io_order_site_url", "label": "build_io_order_site_url()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_normalize_plan_date", "label": "_normalize_plan_date()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L59"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_next_order_no", "label": "_next_order_no()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L70"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_dibang_qty_by_plan_product", "label": "_dibang_qty_by_plan_product()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L88"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_create_io_order_for_transport", "label": "create_io_order_for_transport()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L120"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_apply_dibang_prefill_to_order", "label": "apply_dibang_prefill_to_order()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L202"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_void_io_orders_for_plan", "label": "void_io_orders_for_plan()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L247"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_get_active_io_order_for_plan", "label": "get_active_io_order_for_plan()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L271"}, {"id": "orderheader", "label": "OrderHeader", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/services/pl_io_order_service.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_parse_feedback_images", "label": "parse_feedback_images()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L301"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_dump_feedback_images", "label": "dump_feedback_images()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L313"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_io_item_brand_qty_model", "label": "_io_item_brand_qty_model()", "file_type": "code", "source_file": "backend/app/services/pl_io_order_service.py", "source_location": "L320"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_services_pl_io_order_service_update_io_order_items_qty_and_brand", "label": "update_io_order_items_qty_and_brand()", "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_py", "label": "migrate_crm_quote.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L52"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L60"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L64"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L70"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_quote.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_legacy_parent_id", "label": "legacy_parent_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L79"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L90"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L94"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L110"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L116"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_quote.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L134"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_quote.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L142"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_load_oss_id_to_url", "label": "load_oss_id_to_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L167"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_normalize_attachment_csv", "label": "normalize_attachment_csv()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L176"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_normalize_pdf_url", "label": "normalize_pdf_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L197"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L207"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_quote.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L213"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_quote_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_quote.py", "source_location": "L222"}, {"id": "users_wuzilong_work_00cLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_py", "label": "migrate_bx_data.py", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L61"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L68"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L72"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L78"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_bx_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L87"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L107"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_load_bx_user_mapping", "label": "load_bx_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L113"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_bx_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L131"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_bx_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_map_bx_user_id", "label": "map_bx_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L139"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L167"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L176"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_bx_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_parse_reimburse_meta", "label": "parse_reimburse_meta()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L182"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_bx_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L191"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L205"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_clear_portal_workflow", "label": "clear_portal_workflow()", "file_type": "code", "source_file": "backend/scripts/migrate_bx_data.py", "source_location": "L209"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_bx_data_transform_expense_item", "label": "transform_expense_item()", "file_type": "code", "sourLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_py", "label": "migrate_crm_opportunity.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L64"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L72"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L82"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_opportunity.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L95"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L111"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L117"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_opportunity.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L135"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_opportunity.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L143"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_load_oss_id_to_url", "label": "load_oss_id_to_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L165"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_normalize_follow_type", "label": "normalize_follow_type()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L174"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L179"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_opportunity.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L185"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L194"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_opportunity_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_opportunity.py", "source_location": "L201"}, {"id": "users_wuzilong_work_00code_sLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "label": "test_pl_vehicle_personnel_photo_schema.py", "file_type": "code", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_create_accepts_photo_urls", "label": "test_vehicle_create_accepts_photo_urls()", "file_type": "code", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L7"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_update_accepts_photo_urls", "label": "test_vehicle_update_accepts_photo_urls()", "file_type": "code", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L19"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_personnel_create_accepts_photo_urls", "label": "test_personnel_create_accepts_photo_urls()", "file_type": "code", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_personnel_update_accepts_photo_urls", "label": "test_personnel_update_accepts_photo_urls()", "file_type": "code", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L37"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_rationale_1", "label": "\u8f66\u8f86/\u4eba\u5458 Schema \u63a5\u53d7 photoUrls\u3002", "file_type": "rationale", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "target": "app_schemas_pl_base_data", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_create_accepts_photo_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_update_accepts_photo_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_personnel_create_accepts_photo_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L24", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_personnel_update_accepts_photo_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L37", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_rationale_1", "target": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_create_accepts_photo_urls", "callee": "model_validate", "is_member_call": true, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_location": "L8", "receiver": "VehicleCreate"}, {"caller_nid": "users_wuzilong_work_00code_shanxia2_0_backend_tests_test_pl_vehicle_personnel_photo_schema_test_vehicle_update_accepts_photo_urls", "callee": "model_validate", "is_member_call": true, "source_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/tests/test_pl_vehicle_personnel_photo_schema.py", "source_locatioLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_resolve_create_date", "label": "_resolve_create_date()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L93"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_generate_plan_no", "label": "_generate_plan_no()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L97"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_format_subpack_slip_no", "label": "_format_subpack_slip_no()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L129"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_normalize_subpack_slip_no", "label": "_normalize_subpack_slip_no()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L133"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_subpack_slip_no_seq", "label": "_subpack_slip_no_seq()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L158"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_ensure_subpack_slip_no", "label": "_ensure_subpack_slip_no()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L166"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_determine_plan_type", "label": "_determine_plan_type()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L198"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_get_plan_type_label", "label": "_get_plan_type_label()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L203"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_generate_notify_message", "label": "_generate_notify_message()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L212"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_list_plans", "label": "list_plans()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L233"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_count_plans_by_contract", "label": "count_plans_by_contract()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L377"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_create_plan", "label": "create_plan()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L405"}, {"id": "plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planread", "label": "PlanRead", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_create_plan_full", "label": "create_plan_full()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_location": "L487"}, {"id": "plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/api/pl/plan.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_api_pl_plan_create_from_contract", "label": "create_from_contract()", "file_type": "code", "source_file": "backend/app/api/pl/plan.py", "source_loLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_py", "label": "migrate_crm_customer.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L79"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L87"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L91"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L97"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_customer.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L106"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L110"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L126"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L132"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_customer.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L150"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_customer.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L158"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_load_oss_id_to_url", "label": "load_oss_id_to_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L184"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_normalize_customer_type", "label": "normalize_customer_type()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L193"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_normalize_follow_type", "label": "normalize_follow_type()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L210"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_dec", "label": "_dec()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L215"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_customer.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L221"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_customer.py", "source_location": "L230"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_customer_target_row_exists", "label": "target_row_exists()", "filLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "label": "backfill_crm_contract_attachment_urls.py", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L36"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L52"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_load_oss_map", "label": "load_oss_map()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L58"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/backfill_crm_contract_attachment_urls.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_resolve_token", "label": "resolve_token()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L67"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/backfill_crm_contract_attachment_urls.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_rewrite_attachment_files", "label": "rewrite_attachment_files()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L79"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_rewrite_contract_file", "label": "rewrite_contract_file()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_main", "label": "main()", "file_type": "code", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L139"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_rationale_68", "label": "\u8fd4\u56de (\u65b0\u503c, \u662f\u5426\u53d1\u751f\u4e86 id\u2192url \u66ff\u6362)\u3002", "file_type": "rationale", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L68"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "argparse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "csv", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L18", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/scripts/backfill_crm_contract_attachment_urls.py", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_backfill_crm_contract_attachment_urls_py", "target": "datetimeLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_md", "label": "web-admin-ui-spec-fresh-mint.md", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_web_\u7ba1\u7406\u7aef_ui_\u89c4\u8303_fresh_mint", "label": "Web \u7ba1\u7406\u7aef UI \u89c4\u8303\uff08Fresh Mint\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_\u76ee\u5f55", "label": "\u76ee\u5f55", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L10"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_1_\u8bbe\u8ba1\u7406\u5ff5\u4e0e\u539f\u5219", "label": "1. \u8bbe\u8ba1\u7406\u5ff5\u4e0e\u539f\u5219", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L30"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_2_\u8bbe\u8ba1_token_css_\u53d8\u91cf", "label": "2. \u8bbe\u8ba1 Token\uff08CSS \u53d8\u91cf\uff09", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L41"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_\u5168\u5c40\u4e0e\u5e03\u5c40\u7ed3\u6784", "label": "3. \u5168\u5c40\u4e0e\u5e03\u5c40\u7ed3\u6784", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L87"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_1_\u6839\u5e03\u5c40_layout", "label": "3.1 \u6839\u5e03\u5c40 `.layout`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L89"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_2_\u4fa7\u680f_sidebar", "label": "3.2 \u4fa7\u680f `.sidebar`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L93"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_3_logo_logo_logo_span", "label": "3.3 Logo `.logo` / `.logo span`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L99"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_4_\u5bfc\u822a\u5206\u7ec4_nav_details", "label": "3.4 \u5bfc\u822a\u5206\u7ec4 `.nav-details`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L105"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_5_\u4fa7\u680f\u5e95\u90e8_nav_foot", "label": "3.5 \u4fa7\u680f\u5e95\u90e8 `.nav-foot`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L129"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_6_\u4e3b\u5217_main", "label": "3.6 \u4e3b\u5217 `.main`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L134"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_7_\u9876\u680f_header", "label": "3.7 \u9876\u680f `.header`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L138"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_8_\u5185\u5bb9\u533a_content", "label": "3.8 \u5185\u5bb9\u533a `.content`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L150"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_9_tab_\u6761_tabs_strip_tab_chip", "label": "3.9 Tab \u6761 `.tabs-strip` / `.tab-chip`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L155"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_3_10_tab_\u5185\u5bb9\u6302\u8f7d\u4e0e\u5237\u65b0\u6001", "label": "3.10 Tab \u5185\u5bb9\u6302\u8f7d\u4e0e\u5237\u65b0\u6001", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L172"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_4_\u9875\u9762\u7ea7\u5143\u7d20", "label": "4. \u9875\u9762\u7ea7\u5143\u7d20", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L189"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_4_1_\u9875\u6807\u9898_page_head", "label": "4.1 \u9875\u6807\u9898 `.page-head`", "file_type": "document", "source_file": "docs/web-admin-ui-spec-fresh-mint.md", "source_location": "L191"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_web_admin_ui_spec_fresh_mint_4_2_\u7edf\uLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrierbase", "label": "CarrierBase", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L19"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrierqualificationbase", "label": "CarrierQualificationBase", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L27"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L45"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L49"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L71"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L77"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_carrier_to_read", "label": "carrier_to_read()", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L96"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehiclepersonnelrow", "label": "VehiclePersonnelRow", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L132"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_certrow", "label": "CertRow", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L143"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_certread", "label": "CertRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L158"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehiclebase", "label": "VehicleBase", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L174"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehiclecreate", "label": "VehicleCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L190"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehicleupdate", "label": "VehicleUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L196"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L213"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L228"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_personnelbase", "label": "PersonnelBase", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L239"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_personnelcreate", "label": "PersonnelCreate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L263"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_personnelupdate", "label": "PersonnelUpdate", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L268"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_personnelread", "label": "PersonnelRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py", "source_location": "L286"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_personneldetailread", "label": "PersonnelDetailRead", "file_type": "code", "source_file": "backend/app/schemas/pl/base_data.py"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "label": "import_liquid_products.py", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_parse_rows", "label": "parse_rows()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L25"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_connect", "label": "connect()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L55"}, {"id": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_main", "label": "main()", "file_type": "code", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L70"}], "edges": [{"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "urllib_parse", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "pymysql", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "dotenv", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_parse_rows", "relation": "contains", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L25", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_connect", "relation": "contains", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L55", "weight": 1.0}, {"source": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_py", "target": "users_wuzilong_work_00code_shanxia2_0_\u4ea7\u54c1\u6570\u636e\u5237\u65b0_import_liquid_products_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "\u4ea7\u54c1\u6570\u636e\u5237\u65b0/import_liquid_products.py", "source_location": "L70", "weight": 1.0}, {"source": "users_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_py", "label": "reimburse.py", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_coerce_id", "label": "_coerce_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L9"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimbursedetailcreate", "label": "ReimburseDetailCreate", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L15"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimbursedetailcreate_validate_expense_item_id", "label": ".validate_expense_item_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L24"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimbursedetailout", "label": "ReimburseDetailOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L31"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseinvoicelinkin", "label": "ReimburseInvoiceLinkIn", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L41"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseinvoicelinkin_validate_invoice_id", "label": ".validate_invoice_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L51"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseinvoicelinkin_coerce_attachment_id", "label": ".coerce_attachment_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L59"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseinvoicebriefout", "label": "ReimburseInvoiceBriefOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L63"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplycreate", "label": "ReimburseApplyCreate", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplycreate_details_must_not_be_empty", "label": ".details_must_not_be_empty()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L89"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplycreate_coerce_applicant_id", "label": ".coerce_applicant_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L96"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplyupdate", "label": "ReimburseApplyUpdate", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L100"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplyupdate_coerce_applicant_id", "label": ".coerce_applicant_id()", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L113"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimbursesubmitbody", "label": "ReimburseSubmitBody", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L117"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapplyout", "label": "ReimburseApplyOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L124"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapprovalcreate", "label": "ReimburseApprovalCreate", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L154"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapprovalout", "label": "ReimburseApprovalOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L161"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimbursemystatsout", "label": "ReimburseMyStatsOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location": "L174"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_app_schemas_bx_reimburse_reimburseapproverpendingstatsout", "label": "ReimburseApproverPendingStatsOut", "file_type": "code", "source_file": "backend/app/schemas/bx/reimburse.py", "source_location":Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_md", "label": "2026-07-31-pl-required-brand-as-preference-design.md", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u8fd0\u8f93\u8ba1\u5212_\u6307\u5b9a\u54c1\u724c_\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a\u8bbe\u8ba1", "label": "\u8fd0\u8f93\u8ba1\u5212\u300c\u6307\u5b9a\u54c1\u724c\u300d\u56de\u586b\u6539\u4e3a\u504f\u597d\u63d0\u793a\u8bbe\u8ba1", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u80cc\u666f\u4e0e\u76ee\u6807", "label": "\u80cc\u666f\u4e0e\u76ee\u6807", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L8"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u51b3\u7b56\u6458\u8981", "label": "\u51b3\u7b56\u6458\u8981", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L16"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u884c\u4e3a\u89c4\u5219", "label": "\u884c\u4e3a\u89c4\u5219", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L27"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u4e0d\u53d8", "label": "\u4e0d\u53d8", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L29"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u53d8\u66f4\u540e\u56de\u586b\u89c4\u5219", "label": "\u53d8\u66f4\u540e\u56de\u586b\u89c4\u5219", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L36"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u5c55\u793a", "label": "\u5c55\u793a", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L46"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u5b9e\u73b0\u8981\u70b9", "label": "\u5b9e\u73b0\u8981\u70b9", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L51"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u540e\u7aef", "label": "\u540e\u7aef", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L53"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u524d\u7aef", "label": "\u524d\u7aef", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L59"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u6587\u6863_demo", "label": "\u6587\u6863 / Demo", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L71"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u6d4b\u8bd5", "label": "\u6d4b\u8bd5", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u540e\u7aef_78", "label": "\u540e\u7aef", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-as-preference-design.md", "source_location": "L78"}, {"id": "users_wuzilong_work_00code_shanxia2_0_docs_superpowers_specs_2026_07_31_pl_required_brand_as_preference_design_\u524d\u7aef\u624b\u5de5\u9a8c\u6536", "label": "\u524d\u7aef\u624b\u5de5\u9a8c\u6536", "file_type": "document", "source_file": "docs/superpowers/specs/2026-07-31-pl-required-brand-asLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_py", "label": "migrate_crm_clue.py", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L1"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_stepstats", "label": "StepStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L76"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_migrationstats", "label": "MigrationStats", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L84"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_migrationstats_step", "label": ".step()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L88"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_legacy_id_to_str", "label": "legacy_id_to_str()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L94"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_clue.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_derive_source_url", "label": "derive_source_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L103"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_load_settings_env", "label": "load_settings_env()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L107"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_load_runtime_settings", "label": "load_runtime_settings()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L123"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_load_user_mapping", "label": "load_user_mapping()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L129"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_clue.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_fetch_portal_admin_id", "label": "fetch_portal_admin_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L147"}, {"id": "engine", "label": "Engine", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/wuzilong/work/00code/shanxia2.0/backend/scripts/migrate_crm_clue.py"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_resolve_portal_user_id", "label": "resolve_portal_user_id()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L155"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_load_oss_id_to_url", "label": "load_oss_id_to_url()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L177"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_normalize_customer_type", "label": "normalize_customer_type()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L186"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_normalize_follow_type", "label": "normalize_follow_type()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L203"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_str_or_none", "label": "_str_or_none()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L208"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_fetch_source_rows", "label": "fetch_source_rows()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L217"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_target_row_exists", "label": "target_row_exists()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L224"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_transform_clue", "label": "transform_clue()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "L228"}, {"id": "users_wuzilong_work_00code_shanxia2_0_backend_scripts_migrate_crm_clue_transform_clue_follow", "label": "transform_clue_follow()", "file_type": "code", "source_file": "backend/scripts/migrate_crm_clue.py", "source_location": "LLine truncated
Loaded 100 of 134 files, more files were not shown because too many files have changed in this diff. Show more