zlwu пре 6 месеци
родитељ
комит
8f8a139d6c

+ 3 - 1
backend/app/api/admin.py

@@ -3894,7 +3894,8 @@ def list_orders(
     payStatus: Optional[str] = Query(None, description="支付状态"),
     paymentMethod: Optional[str] = Query(None, description="支付方式: online/offline"),
     clientId: Optional[str] = Query(None, description="客户ID"),
-    orderNo: Optional[str] = Query(None, description="订单号"),
+    orderNo: Optional[str] = Query(None, description="订单号(模糊,兼容旧参数)"),
+    keyword: Optional[str] = Query(None, description="关键词:订单编号/联系人/电话/客户姓名或用户名等"),
     startDate: Optional[str] = Query(None, description="开始日期"),
     endDate: Optional[str] = Query(None, description="结束日期"),
     db: Session = Depends(get_db),
@@ -3921,6 +3922,7 @@ def list_orders(
         payment_method=paymentMethod,
         client_id=clientId,
         order_no=orderNo,
+        keyword=keyword,
         start_date=startDate,
         end_date=endDate,
         skip=(page - 1) * pageSize,

+ 3 - 1
backend/app/api/delivery.py

@@ -165,7 +165,8 @@ def list_delivery_tasks(
     pageSize: int = Query(10, ge=1, le=100, description="每页条数"),
     regionId: Optional[str] = Query(None, description="区域ID"),
     status: Optional[str] = Query(None, description="状态"),
-    orderNo: Optional[str] = Query(None, description="订单号"),
+    orderNo: Optional[str] = Query(None, description="订单号(兼容:仅按配送单号 task_no 模糊匹配)"),
+    keyword: Optional[str] = Query(None, description="关键词:配送单号/订单编号/联系人/电话等(与运营端筛选一致)"),
     db: Session = Depends(get_db),
     current_user: dict = Depends(require_admin)
 ):
@@ -177,6 +178,7 @@ def list_delivery_tasks(
         region_id=regionId,
         status=status,
         order_no=orderNo,
+        keyword=keyword,
         skip=(page - 1) * pageSize,
         limit=pageSize
     )

+ 28 - 2
backend/app/crud/order.py

@@ -4,9 +4,9 @@ import json
 from datetime import datetime
 from decimal import Decimal
 from sqlalchemy.orm import Session
-from sqlalchemy import and_, or_, func
+from sqlalchemy import and_, or_, func, select, exists
 
-from app.models.models import BizOrder, BizOrderItem, BizOrderStatusLog, BizOrderHis, BizOrderAdjust
+from app.models.models import BizOrder, BizOrderItem, BizOrderStatusLog, BizOrderHis, BizOrderAdjust, SysUser
 from app.crud.base import CRUDBase
 from app.core.utils import generate_id
 from app.core.order_status_compat import derive_three_status_from_legacy, derive_legacy_status_from_three
@@ -83,6 +83,7 @@ class OrderCRUD(CRUDBase[BizOrder]):
         payment_method: str = None,
         cancel_status: str = None,
         order_no: str = None,
+        keyword: str = None,
         start_date: str = None,
         end_date: str = None,
         skip: int = 0,
@@ -120,6 +121,31 @@ class OrderCRUD(CRUDBase[BizOrder]):
             query = query.filter(BizOrder.cancel_status == cancel_status)
         if order_no:
             query = query.filter(BizOrder.order_no.like(f"%{order_no}%"))
+        if keyword:
+            kw = (keyword or "").strip()
+            if kw:
+                pattern = f"%{kw}%"
+                client_user_match = exists(
+                    select(1).select_from(SysUser).where(
+                        and_(
+                            SysUser.id == BizOrder.client_id,
+                            SysUser.is_del == 0,
+                            or_(
+                                SysUser.real_name.like(pattern),
+                                SysUser.username.like(pattern),
+                                SysUser.phone.like(pattern),
+                            ),
+                        )
+                    )
+                )
+                query = query.filter(
+                    or_(
+                        BizOrder.order_no.like(pattern),
+                        BizOrder.contact_person.like(pattern),
+                        BizOrder.contact_phone.like(pattern),
+                        client_user_match,
+                    )
+                )
         if start_date:
             query = query.filter(BizOrder.create_at >= start_date)
         if end_date:

+ 188 - 175
graphify-out/GRAPH_REPORT.md

@@ -1,12 +1,12 @@
 # Graph Report - sqxp_副本2  (2026-05-02)
 
 ## Corpus Check
-- 703 files · ~644,109 words
+- 703 files · ~644,114 words
 - Verdict: corpus is large enough that graph structure adds value.
 
 ## Summary
-- 4995 nodes · 26760 edges · 79 communities detected
-- Extraction: 19% EXTRACTED · 81% INFERRED · 0% AMBIGUOUS · INFERRED: 21565 edges (avg confidence: 0.54)
+- 5010 nodes · 27155 edges · 82 communities detected
+- Extraction: 19% EXTRACTED · 81% INFERRED · 0% AMBIGUOUS · INFERRED: 21960 edges (avg confidence: 0.54)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -43,64 +43,67 @@
 - [[_COMMUNITY_Community 30|Community 30]]
 - [[_COMMUNITY_Community 31|Community 31]]
 - [[_COMMUNITY_Community 32|Community 32]]
+- [[_COMMUNITY_Community 33|Community 33]]
+- [[_COMMUNITY_Community 34|Community 34]]
 - [[_COMMUNITY_Community 35|Community 35]]
-- [[_COMMUNITY_Community 36|Community 36]]
-- [[_COMMUNITY_Community 37|Community 37]]
 - [[_COMMUNITY_Community 38|Community 38]]
+- [[_COMMUNITY_Community 39|Community 39]]
 - [[_COMMUNITY_Community 40|Community 40]]
-- [[_COMMUNITY_Community 42|Community 42]]
+- [[_COMMUNITY_Community 41|Community 41]]
 - [[_COMMUNITY_Community 43|Community 43]]
-- [[_COMMUNITY_Community 44|Community 44]]
 - [[_COMMUNITY_Community 45|Community 45]]
 - [[_COMMUNITY_Community 46|Community 46]]
+- [[_COMMUNITY_Community 47|Community 47]]
 - [[_COMMUNITY_Community 48|Community 48]]
 - [[_COMMUNITY_Community 49|Community 49]]
-- [[_COMMUNITY_Community 50|Community 50]]
 - [[_COMMUNITY_Community 51|Community 51]]
 - [[_COMMUNITY_Community 52|Community 52]]
-- [[_COMMUNITY_Community 56|Community 56]]
-- [[_COMMUNITY_Community 59|Community 59]]
+- [[_COMMUNITY_Community 53|Community 53]]
+- [[_COMMUNITY_Community 54|Community 54]]
+- [[_COMMUNITY_Community 55|Community 55]]
 - [[_COMMUNITY_Community 61|Community 61]]
-- [[_COMMUNITY_Community 62|Community 62]]
 - [[_COMMUNITY_Community 63|Community 63]]
 - [[_COMMUNITY_Community 64|Community 64]]
 - [[_COMMUNITY_Community 65|Community 65]]
 - [[_COMMUNITY_Community 66|Community 66]]
+- [[_COMMUNITY_Community 67|Community 67]]
 - [[_COMMUNITY_Community 68|Community 68]]
 - [[_COMMUNITY_Community 69|Community 69]]
-- [[_COMMUNITY_Community 73|Community 73]]
+- [[_COMMUNITY_Community 71|Community 71]]
+- [[_COMMUNITY_Community 72|Community 72]]
 - [[_COMMUNITY_Community 76|Community 76]]
-- [[_COMMUNITY_Community 77|Community 77]]
 - [[_COMMUNITY_Community 79|Community 79]]
-- [[_COMMUNITY_Community 91|Community 91]]
-- [[_COMMUNITY_Community 101|Community 101]]
-- [[_COMMUNITY_Community 103|Community 103]]
-- [[_COMMUNITY_Community 155|Community 155]]
-- [[_COMMUNITY_Community 156|Community 156]]
-- [[_COMMUNITY_Community 157|Community 157]]
+- [[_COMMUNITY_Community 80|Community 80]]
+- [[_COMMUNITY_Community 82|Community 82]]
+- [[_COMMUNITY_Community 94|Community 94]]
+- [[_COMMUNITY_Community 104|Community 104]]
+- [[_COMMUNITY_Community 106|Community 106]]
 - [[_COMMUNITY_Community 158|Community 158]]
 - [[_COMMUNITY_Community 159|Community 159]]
 - [[_COMMUNITY_Community 160|Community 160]]
-- [[_COMMUNITY_Community 428|Community 428]]
-- [[_COMMUNITY_Community 429|Community 429]]
-- [[_COMMUNITY_Community 430|Community 430]]
+- [[_COMMUNITY_Community 161|Community 161]]
+- [[_COMMUNITY_Community 162|Community 162]]
+- [[_COMMUNITY_Community 163|Community 163]]
 - [[_COMMUNITY_Community 431|Community 431]]
 - [[_COMMUNITY_Community 432|Community 432]]
 - [[_COMMUNITY_Community 433|Community 433]]
 - [[_COMMUNITY_Community 434|Community 434]]
 - [[_COMMUNITY_Community 435|Community 435]]
+- [[_COMMUNITY_Community 436|Community 436]]
+- [[_COMMUNITY_Community 437|Community 437]]
+- [[_COMMUNITY_Community 438|Community 438]]
 
 ## God Nodes (most connected - your core abstractions)
-1. `BizPriceListItem` - 800 edges
-2. `BizInquiry` - 729 edges
-3. `BizQuotation` - 727 edges
-4. `BizAttachment` - 717 edges
-5. `BasProduct` - 716 edges
-6. `BizDeliveryTask` - 708 edges
-7. `SysUser` - 707 edges
-8. `BasProductCategory` - 706 edges
-9. `BasProductUnit` - 706 edges
-10. `BizOrder` - 696 edges
+1. `BizPriceListItem` - 814 edges
+2. `BizInquiry` - 743 edges
+3. `BizQuotation` - 741 edges
+4. `BizAttachment` - 731 edges
+5. `SysUser` - 730 edges
+6. `BasProduct` - 730 edges
+7. `BizDeliveryTask` - 722 edges
+8. `BasProductCategory` - 720 edges
+9. `BasProductUnit` - 720 edges
+10. `BizOrder` - 711 edges
 
 ## Surprising Connections (you probably didn't know these)
 - `get_active()` --calls--> `query()`  [INFERRED]
@@ -118,402 +121,412 @@
 
 ### Community 0 - "Community 0"
 Cohesion: 0.07
-Nodes (710): 获取管理员的区域过滤条件      对于区域管理员,返回其所属区域ID(用于过滤数据)     对于超级管理员(无区域绑定),返回None(不过滤), 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 与 PUT 同逻辑:前端按 POST 模式调用时复用。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。 (+702 more)
+Nodes (724): 获取管理员的区域过滤条件      对于区域管理员,返回其所属区域ID(用于过滤数据)     对于超级管理员(无区域绑定),返回None(不过滤), 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 与 PUT 同逻辑:前端按 POST 模式调用时复用。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。, 兼容旧逻辑:返回单区域过滤ID。多区域场景返回排序后首个区域。, 更新用户菜单授权(按 code 全量覆盖;兼容明文/密文载荷)。 (+716 more)
 
 ### Community 1 - "Community 1"
 Cohesion: 0.01
-Nodes (203): fullRegion(), if(), if(), FireworkSystem, mapKeys(), VantComponent(), HTMLParser(), parseAttrs() (+195 more)
+Nodes (186): fullRegion(), if(), if(), FireworkSystem, mapKeys(), VantComponent(), HTMLParser(), parseAttrs() (+178 more)
 
 ### Community 2 - "Community 2"
 Cohesion: 0.01
-Nodes (202): handleSubmit(), loadDetail(), onRegionMultiConfirm(), regionLabel(), syncMultiFromForm(), validate(), fetchActiveRegions(), fetchAssignableMenuCodes() (+194 more)
+Nodes (205): handleSubmit(), loadDetail(), onRegionMultiConfirm(), regionLabel(), syncMultiFromForm(), validate(), fetchActiveRegions(), fetchAssignableMenuCodes() (+197 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.01
-Nodes (157): calendar(), memo(), record(), handleSelect(), onMenuShow(), showMenu(), onClear(), onInput() (+149 more)
+Nodes (172): calendar(), memo(), record(), handleSelect(), onMenuShow(), showMenu(), onClear(), onInput() (+164 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.03
-Nodes (259): _aggregate_client_settlement_history(), _aggregate_supplier_settlement_history(), _apply_region_minutes_to_data(), approve_quotation(), assign_deliverer_to_order(), assign_delivery_alias(), batch_create_settlements(), _batch_scope_region_ids_by_user() (+251 more)
-
-### Community 5 - "Community 5"
 Cohesion: 0.01
 Nodes (244): InvoiceCreateRequest, MessageCreateRequest, 获取商品的评价列表(仅显示已审核通过的评价), AdjustResponse, Config, CreateAdjustRequest, 批量添加轮播图(请求体为 JSON 数组;兼容密文信封与 ApiCryptoMiddleware 未改写 body 的场景), 批量添加轮播图(请求体为 JSON 数组;兼容密文信封与 ApiCryptoMiddleware 未改写 body 的场景) (+236 more)
 
+### Community 5 - "Community 5"
+Cohesion: 0.03
+Nodes (242): _aggregate_client_settlement_history(), _aggregate_supplier_settlement_history(), approve_quotation(), assign_deliverer_to_order(), assign_delivery_alias(), batch_create_settlements(), _batch_scope_region_ids_by_user(), _batch_supplier_totals_for_orders() (+234 more)
+
 ### Community 6 - "Community 6"
 Cohesion: 0.02
-Nodes (70): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchGetMenuList(), fetchGetRoleList(), fetchGetUserList(), reload(), addUnit() (+62 more)
+Nodes (72): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchGetMenuList(), fetchGetRoleList(), fetchGetUserList(), reload(), nextTick() (+64 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.02
-Nodes (100): _build_order_delivery_timeline(), _delivery_timeline_type(), get_today_orders_by_client(), _log_entry_in_delivery_timeline(), require_admin(), _status_log_timeline_description(), fetchAdjustableOrders(), fetchClientSettlementHistorySummary() (+92 more)
+Cohesion: 0.03
+Nodes (75): BizMessage, update_banner(), create_comment(), 获取中国地图GeoJSON数据     返回保存在系统配置中的地图数据, Base, ApiRequestLogCRUD, InquiryCRUD, 取消发布询价单(published -> draft) (+67 more)
 
 ### Community 8 - "Community 8"
 Cohesion: 0.02
-Nodes (103): 小程序客户端扩展接口:购物车、商品分类、仪表盘、发票、下单、支付, 从叶子分类 id 向上解析(含缓存):返回 (根分类, 叶子分类)。, 可申请开票的已完成订单(简化:已完成且尚无发票), 可申请开票的已完成订单(简化:已完成且尚无发票), 可申请开票的已完成订单(简化:已完成且尚无发票), 商品对应的一级(根)分类,供购物车行展示与序列化。, 从叶子分类 id 向上解析(含缓存):返回 (根分类, 叶子分类)。, 购物车:先一级分类 sort_order,再商品名、商品 id(稳定)。 (+95 more)
+Nodes (63): askAbortDownload(), checkLocalStoragePackage(), closeUpdate(), compare(), deleteSavedFile(), downLoadComplete(), installPackage(), onLoad() (+55 more)
 
 ### Community 9 - "Community 9"
 Cohesion: 0.03
-Nodes (76): update_detail_media(), 获取中国地图GeoJSON数据     返回保存在系统配置中的地图数据, Base, ApiRequestLogCRUD, CategoryParameterCRUD, CategoryParameterHisCRUD, 将购物车中仍属于当前生效价格清单的商品行,同步为区域最新生效清单的单价、单位与清单 ID。         同一商品多条行(历史清单 ID 不同)合并数量并保留, InquiryCRUD (+68 more)
+Nodes (64): create_price_version(), get_dashboard_statistics(), get_today_orders_by_region(), list_units(), delivery_complete(), get_deliver_profile(), get_delivery_task(), get_expiring_tasks() (+56 more)
 
 ### Community 10 - "Community 10"
-Cohesion: 0.03
-Nodes (65): adjust_order(), create_price_version(), get_dashboard_statistics(), get_today_orders_by_region(), list_products_simple(), list_units(), delivery_complete(), get_deliver_profile() (+57 more)
+Cohesion: 0.02
+Nodes (84): _build_order_delivery_timeline(), _delivery_timeline_type(), get_today_orders_by_client(), _log_entry_in_delivery_timeline(), require_admin(), _status_log_timeline_description(), fetchAdjustableOrders(), fetchClientSettlementHistorySummary() (+76 more)
 
 ### Community 11 - "Community 11"
 Cohesion: 0.03
 Nodes (54): handleFormClose(), handleClose(), initForm(), resetFormModel(), _Blur(), created(), init(), inputContentStyle() (+46 more)
 
 ### Community 12 - "Community 12"
-Cohesion: 0.04
-Nodes (78): DeliveryWarningCRUD, 处理预警请求体(与前端 JSON / axios 自动转 body 对齐), 处理预警(兼容明文 JSON、密文信封 enc/edata,以及 { data: {...} } 包裹), 处理预警(与 ApiCryptoMiddleware / 运营端加密协议一致:Request.json + parse_admin_request_json), 处理预警(与 ApiCryptoMiddleware / 运营端加密协议一致:Request.json + parse_admin_request_json), # TODO: 发送微信模板消息提醒配送员, # TODO: 发送微信模板消息提醒配送员, # TODO: 发送微信模板消息提醒配送员 (+70 more)
+Cohesion: 0.03
+Nodes (93): 小程序客户端扩展接口:购物车、商品分类、仪表盘、发票、下单、支付, 从叶子分类 id 向上解析(含缓存):返回 (根分类, 叶子分类)。, 可申请开票的已完成订单(简化:已完成且尚无发票), 可申请开票的已完成订单(简化:已完成且尚无发票), 可申请开票的已完成订单(简化:已完成且尚无发票), 商品对应的一级(根)分类,供购物车行展示与序列化。, 从叶子分类 id 向上解析(含缓存):返回 (根分类, 叶子分类)。, 购物车:先一级分类 sort_order,再商品名、商品 id(稳定)。 (+85 more)
 
 ### Community 13 - "Community 13"
 Cohesion: 0.04
-Nodes (34): post_user_menu_scopes(), put_user_menu_scopes(), _update_user_menu_scopes(), assign_delivery_task(), assign_delivery_task_batch(), InvoiceCRUD, BizMessage, client_urge_order() (+26 more)
+Nodes (73): DeliveryWarningCRUD, 处理预警请求体(与前端 JSON / axios 自动转 body 对齐), 处理预警(兼容明文 JSON、密文信封 enc/edata,以及 { data: {...} } 包裹), 处理预警(与 ApiCryptoMiddleware / 运营端加密协议一致:Request.json + parse_admin_request_json), 处理预警(与 ApiCryptoMiddleware / 运营端加密协议一致:Request.json + parse_admin_request_json), # TODO: 发送微信模板消息提醒配送员, # TODO: 发送微信模板消息提醒配送员, # TODO: 发送微信模板消息提醒配送员 (+65 more)
 
 ### Community 14 - "Community 14"
-Cohesion: 0.03
-Nodes (17): toLogin(), if(), confirmLogout(), getDefaultLanguage(), emitUrls(), removeItem(), revokeLocalPreview(), checkStorageCompatibility() (+9 more)
+Cohesion: 0.05
+Nodes (29): adjust_order(), cancel_order_admin(), confirm_quotation_supplier(), _replace_user_region_scopes(), InvoiceCRUD, client_urge_order(), apply_invoice(), _upsert_wechat_pay_pending() (+21 more)
 
 ### Community 15 - "Community 15"
 Cohesion: 0.05
-Nodes (65): change_password(), get_client_ip(), _avatar_url_field(), get_current_user(), logout(), mini_bind_wechat(), mini_change_password(), mini_code_openid() (+57 more)
+Nodes (77): 批量获取供应商取货地址,避免列表接口逐条查询。, 一级/二级分类用 / 连接(与订单详情一致)。, 价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。, (price_list_id, product_id, unit_id) -> BizPriceListItem, 供应商默认取货地址;无默认时取第一条 pickup 类型地址。, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供 (+69 more)
 
 ### Community 16 - "Community 16"
-Cohesion: 0.05
-Nodes (77): 批量获取供应商取货地址,避免列表接口逐条查询。, 一级/二级分类用 / 连接(与订单详情一致)。, 价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。, (price_list_id, product_id, unit_id) -> BizPriceListItem, 供应商默认取货地址;无默认时取第一条 pickup 类型地址。, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供, 获取供应商配送任务详情(订单仅返回客户订单号;商品行含主图与规格;单价由价格清单行 price(客户最终单价)与 pricing_coefficient 反推供 (+69 more)
+Cohesion: 0.06
+Nodes (61): change_password(), get_client_ip(), _avatar_url_field(), get_current_user(), get_mini_current_user(), logout(), mini_bind_wechat(), mini_change_password() (+53 more)
 
 ### Community 17 - "Community 17"
-Cohesion: 0.04
-Nodes (33): get_category_parameters(), update_category_parameters(), create_review(), get_product_review_stats(), like_review(), list_product_reviews(), require_client_or_supplier(), approve_review() (+25 more)
+Cohesion: 0.05
+Nodes (15): fetchGetLatestUpgradeLog(), if(), getDefaultLanguage(), emitUrls(), removeItem(), revokeLocalPreview(), checkStorageCompatibility(), StorageConfig (+7 more)
 
 ### Community 18 - "Community 18"
-Cohesion: 0.03
-Nodes (43): askAbortDownload(), checkLocalStoragePackage(), closeUpdate(), compare(), deleteSavedFile(), downLoadComplete(), installPackage(), onLoad() (+35 more)
+Cohesion: 0.06
+Nodes (37): _apply_region_minutes_to_data(), create_inquiry(), create_region(), create_unit(), _minutes_value_from_request(), _resolve_admin_payload_with_crypto_fallback(), update_client_settlement_sheet(), update_inquiry() (+29 more)
 
 ### Community 19 - "Community 19"
-Cohesion: 0.04
-Nodes (58): _supplier_pickup_address_block(), delete_attachment(), get_business_attachments(), get_business_types(), list_attachments(), _batch_supplier_pickup_address_map(), _category_path_display(), get_delivery_task() (+50 more)
+Cohesion: 0.05
+Nodes (26): get_settlement_statistics(), get_product_review_stats(), like_review(), list_product_reviews(), require_client_or_supplier(), approve_review(), get_review_statistics(), list_reviews() (+18 more)
 
 ### Community 20 - "Community 20"
 Cohesion: 0.05
-Nodes (22): change(), created(), getDataList(), getSelectedValue(), handler(), loadData(), mixinDatacomResData(), modelValue() (+14 more)
+Nodes (35): delete_attachment(), get_business_attachments(), get_business_types(), list_attachments(), upload_attachment(), confirm_deliver(), confirm_pickup(), get_deliverer_efficiency_statistics() (+27 more)
 
 ### Community 21 - "Community 21"
 Cohesion: 0.1
-Nodes (31): create_order(), add_cart(), _cart_item_to_dict(), _cart_list_dicts(), _cart_resolve_root_category(), _cart_row_sort_key(), _cart_rows_after_sync(), cart_summary() (+23 more)
+Nodes (33): create_order(), add_cart(), _cart_item_to_dict(), _cart_list_dicts(), _cart_resolve_root_category(), _cart_row_sort_key(), _cart_rows_after_sync(), cart_summary() (+25 more)
 
 ### Community 22 - "Community 22"
-Cohesion: 0.08
-Nodes (30): submit_quotation(), BaseHTTPMiddleware, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json(), derive_key(), encrypt_json() (+22 more)
+Cohesion: 0.09
+Nodes (32): post_user_menu_scopes(), _update_user_menu_scopes(), 兼容明文/密文请求,返回业务 payload。失败时返回 error_response。, _resolve_payload_with_crypto_fallback(), BaseHTTPMiddleware, ApiCryptoError, _b64url_decode(), _b64url_encode() (+24 more)
 
 ### Community 23 - "Community 23"
-Cohesion: 0.09
-Nodes (26): handle_warning(), _preview_text(), get_client_product_detail(), get_client_product_detail_readonly(), get_deliverer_product_detail(), 配送员查看商品详情:轮播、基础信息、参数、富文本、详情媒体(与供应商端一致,不依赖客户价目表/区域绑定), create_banners(), delete_banner() (+18 more)
+Cohesion: 0.08
+Nodes (27): handle_warning(), _preview_text(), get_client_product_detail(), get_client_product_detail_readonly(), get_deliverer_product_detail(), 配送员查看商品详情:轮播、基础信息、参数、富文本、详情媒体(与供应商端一致,不依赖客户价目表/区域绑定), get_supplier_product_detail(), create_banners() (+19 more)
 
 ### Community 24 - "Community 24"
-Cohesion: 0.18
-Nodes (21): destroyed(), getDirection(), getDom(), isPC(), mousedown(), mouseleave(), mousemove(), mouseup() (+13 more)
+Cohesion: 0.07
+Nodes (16): addUnit(), getSystemInfoSync(), isDef(), isNumber(), setSizeWithUnit(), setSizeWithUnit(), setTextSizeWithUnit(), mounted() (+8 more)
 
 ### Community 25 - "Community 25"
-Cohesion: 0.13
-Nodes (13): change(), clearVal(), created(), debounce(), emit(), formatItemName(), getCache(), handler() (+5 more)
+Cohesion: 0.09
+Nodes (19): get_category_parameters(), update_category_parameters(), 兼容明文/密文请求,返回业务 payload。失败时返回 error_response。, CategoryParameterCRUD, CategoryParameterHisCRUD, ProductParameterCRUD, ProductParameterHisCRUD, BasCategoryParameter (+11 more)
 
 ### Community 26 - "Community 26"
-Cohesion: 0.15
-Nodes (16): create_parameter(), delete_parameter(), 兼容明文/密文请求,返回业务 payload。失败时返回 error_response。, require_admin(), _resolve_payload_with_crypto_fallback(), update_parameter(), ProductParameterCRUD, ProductParameterHisCRUD (+8 more)
+Cohesion: 0.1
+Nodes (20): _supplier_pickup_address_block(), _batch_supplier_pickup_address_map(), cancel_delivery_task(), _category_path_display(), get_delivery_task(), list_delivery_tasks(), _numeric_to_float_optional(), _price_list_item_map() (+12 more)
 
 ### Community 27 - "Community 27"
-Cohesion: 0.12
-Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
+Cohesion: 0.11
+Nodes (12): activated(), bottom(), center(), close(), deactivated(), destroyed(), left(), onTap() (+4 more)
 
 ### Community 28 - "Community 28"
-Cohesion: 0.17
-Nodes (12): BusinessException, InvalidStatusTransitionException, log_delivery_operation(), log_operation(), log_order_operation(), log_settlement_operation(), log_user_operation(), OrderLockedException (+4 more)
+Cohesion: 0.18
+Nodes (21): destroyed(), getDirection(), getDom(), isPC(), mousedown(), mouseleave(), mousemove(), mouseup() (+13 more)
 
 ### Community 29 - "Community 29"
-Cohesion: 0.17
-Nodes (16): animation(), bindTiming(), close(), getDom(), getEl(), getSelectorQuery(), init(), leftOptions() (+8 more)
+Cohesion: 0.13
+Nodes (13): change(), clearVal(), created(), debounce(), emit(), formatItemName(), getCache(), handler() (+5 more)
 
 ### Community 30 - "Community 30"
+Cohesion: 0.12
+Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
+
+### Community 31 - "Community 31"
+Cohesion: 0.17
+Nodes (12): BusinessException, InvalidStatusTransitionException, log_delivery_operation(), log_operation(), log_order_operation(), log_settlement_operation(), log_user_operation(), OrderLockedException (+4 more)
+
+### Community 32 - "Community 32"
 Cohesion: 0.16
 Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
 
-### Community 31 - "Community 31"
+### Community 33 - "Community 33"
 Cohesion: 0.2
 Nodes (14): defaultAvatarPathByRole(), normalizeAvatarUrlForMini(), resolveUserAvatarUrl(), appendQueryParam(), fallbackVersionFromManifest(), getStaticAssetsVersion(), hasSignedQuery(), hasVersionParam() (+6 more)
 
-### Community 32 - "Community 32"
+### Community 34 - "Community 34"
+Cohesion: 0.14
+Nodes (11): Exception, notify_price_list_updated(), WebSocket:区域价格清单更新推送(客户端实时刷新), 小程序端 WebSocket 入口:/ws/mini, 在 FastAPI app 上注册 websocket 路由。, 按 region_id 管理 websocket 连接并广播。, 鉴权并接入房间。返回 current_user dict。, 向 region 房间广播消息。返回尝试发送的连接数。 (+3 more)
+
+### Community 35 - "Community 35"
 Cohesion: 0.28
 Nodes (14): getDirection(), getDisabledType(), getDom(), move(), moveDirection(), openState(), range(), resetTouchStatus() (+6 more)
 
-### Community 35 - "Community 35"
+### Community 38 - "Community 38"
 Cohesion: 0.17
 Nodes (2): clean(), onInput()
 
-### Community 36 - "Community 36"
+### Community 39 - "Community 39"
 Cohesion: 0.24
 Nodes (4): getVal(), leftIconWidth(), navbarHeight(), rightIconWidth()
 
-### Community 37 - "Community 37"
+### Community 40 - "Community 40"
 Cohesion: 0.4
 Nodes (9): backup_table(), count_affected(), get_text_columns(), main(), make_backup_table_name(), parse_args(), quote_ident(), 生成备份表名,控制在 MySQL 64 字符限制内。 (+1 more)
 
-### Community 38 - "Community 38"
+### Community 41 - "Community 41"
 Cohesion: 0.24
 Nodes (3): _calcValue(), _getDecimalScale(), _onBlur()
 
-### Community 40 - "Community 40"
+### Community 43 - "Community 43"
 Cohesion: 0.27
 Nodes (4): dataValue(), emit(), onChange(), setOpen()
 
-### Community 42 - "Community 42"
+### Community 45 - "Community 45"
 Cohesion: 0.25
 Nodes (2): borderStyle(), value2px()
 
-### Community 43 - "Community 43"
+### Community 46 - "Community 46"
 Cohesion: 0.29
 Nodes (3): BaseModel, get_active(), SoftDeleteModel
 
-### Community 44 - "Community 44"
+### Community 47 - "Community 47"
 Cohesion: 0.39
 Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
 
-### Community 45 - "Community 45"
+### Community 48 - "Community 48"
 Cohesion: 0.29
 Nodes (2): handleTouchEnd(), setTransition()
 
-### Community 46 - "Community 46"
+### Community 49 - "Community 49"
 Cohesion: 0.36
 Nodes (1): TableHeightCalculator
 
-### Community 48 - "Community 48"
+### Community 51 - "Community 51"
 Cohesion: 0.36
 Nodes (1): RouteValidator
 
-### Community 49 - "Community 49"
+### Community 52 - "Community 52"
 Cohesion: 0.39
 Nodes (5): chooseAll(), chooseAndUploadFile(), chooseImage(), chooseVideo(), uploadFiles()
 
-### Community 50 - "Community 50"
+### Community 53 - "Community 53"
 Cohesion: 0.33
 Nodes (2): logApiCryptoBootInfo(), maskSecret()
 
-### Community 51 - "Community 51"
+### Community 54 - "Community 54"
 Cohesion: 0.38
 Nodes (4): fetchApiRequestLogList(), handleReset(), handleSearch(), loadData()
 
-### Community 52 - "Community 52"
+### Community 55 - "Community 55"
 Cohesion: 0.38
 Nodes (3): _change(), close(), open()
 
-### Community 56 - "Community 56"
-Cohesion: 0.4
-Nodes (1): CategoryCRUD
-
-### Community 59 - "Community 59"
+### Community 61 - "Community 61"
 Cohesion: 0.33
 Nodes (1): BridgeError
 
-### Community 61 - "Community 61"
+### Community 63 - "Community 63"
 Cohesion: 0.4
 Nodes (2): created(), getTable()
 
-### Community 62 - "Community 62"
+### Community 64 - "Community 64"
 Cohesion: 0.47
 Nodes (3): get_file_data(), get_file_ext(), get_file_info()
 
-### Community 63 - "Community 63"
+### Community 65 - "Community 65"
 Cohesion: 0.4
 Nodes (2): created(), getForm()
 
-### Community 64 - "Community 64"
+### Community 66 - "Community 66"
 Cohesion: 0.47
 Nodes (4): onDial(), onTextClick(), dialPhone(), normalizeDialNumber()
 
-### Community 65 - "Community 65"
+### Community 67 - "Community 67"
 Cohesion: 0.4
 Nodes (4): 运营端角色守卫:admin / super_admin 可访问。, 接口菜单权限守卫。super_admin 直接放行。, require_admin_or_super_admin(), require_menu_code()
 
-### Community 66 - "Community 66"
+### Community 68 - "Community 68"
+Cohesion: 0.6
+Nodes (4): derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。     约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断;     若业务侧已有更精确, ThreeStatus, _to_decimal()
+
+### Community 69 - "Community 69"
 Cohesion: 0.5
 Nodes (2): focusInput(), handleKeydown()
 
-### Community 68 - "Community 68"
+### Community 71 - "Community 71"
 Cohesion: 0.5
 Nodes (3): BaseSettings, Config, Settings
 
-### Community 69 - "Community 69"
+### Community 72 - "Community 72"
 Cohesion: 0.5
 Nodes (1): collectIds()
 
-### Community 73 - "Community 73"
+### Community 76 - "Community 76"
 Cohesion: 0.83
 Nodes (3): classes(), isTrue(), onClick()
 
-### Community 76 - "Community 76"
+### Community 79 - "Community 79"
 Cohesion: 0.67
 Nodes (2): created(), getParent()
 
-### Community 77 - "Community 77"
+### Community 80 - "Community 80"
 Cohesion: 1.0
 Nodes (2): getSettingDefaults(), resetToDefaults()
 
-### Community 79 - "Community 79"
+### Community 82 - "Community 82"
 Cohesion: 1.0
 Nodes (2): defaultAvatarPathByRole(), resolveUserAvatarUrl()
 
-### Community 91 - "Community 91"
+### Community 94 - "Community 94"
 Cohesion: 0.67
 Nodes (1): updateUseModal()
 
-### Community 101 - "Community 101"
+### Community 104 - "Community 104"
 Cohesion: 1.0
 Nodes (2): buildMiniEncryptedLoginBody(), fetchLoginPublicKey()
 
-### Community 103 - "Community 103"
+### Community 106 - "Community 106"
 Cohesion: 0.67
 Nodes (1): return()
 
-### Community 155 - "Community 155"
+### Community 158 - "Community 158"
 Cohesion: 1.0
 Nodes (1): 发送订单状态通知                  Args:             openid: 用户openid             ord
 
-### Community 156 - "Community 156"
+### Community 159 - "Community 159"
 Cohesion: 1.0
 Nodes (1): 发送支付成功通知                  Args:             openid: 用户openid             ord
 
-### Community 157 - "Community 157"
+### Community 160 - "Community 160"
 Cohesion: 1.0
 Nodes (1): 发送配送通知                  Args:             openid: 配送员openid             task
 
-### Community 158 - "Community 158"
+### Community 161 - "Community 161"
 Cohesion: 1.0
 Nodes (1): 发送配送时效预警                  Args:             openid: 配送员openid             ta
 
-### Community 159 - "Community 159"
+### Community 162 - "Community 162"
 Cohesion: 1.0
 Nodes (1): 发送退款结果通知                  Args:             openid: 用户openid             ord
 
-### Community 160 - "Community 160"
+### Community 163 - "Community 163"
 Cohesion: 1.0
 Nodes (1): 发送催单通知给配送员                  Args:             deliver_openid: 配送员openid
 
-### Community 428 - "Community 428"
+### Community 431 - "Community 431"
 Cohesion: 1.0
 Nodes (1): 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。      Returns:
 
-### Community 429 - "Community 429"
+### Community 432 - "Community 432"
 Cohesion: 1.0
 Nodes (1): 按 region_id 管理 websocket 连接并广播。
 
-### Community 430 - "Community 430"
+### Community 433 - "Community 433"
 Cohesion: 1.0
 Nodes (1): 鉴权并接入房间。返回 current_user dict。
 
-### Community 431 - "Community 431"
+### Community 434 - "Community 434"
 Cohesion: 1.0
 Nodes (1): 向 region 房间广播消息。返回尝试发送的连接数。
 
-### Community 432 - "Community 432"
+### Community 435 - "Community 435"
 Cohesion: 1.0
 Nodes (1): 小程序端 WebSocket 入口:/ws/mini
 
-### Community 433 - "Community 433"
+### Community 436 - "Community 436"
 Cohesion: 1.0
 Nodes (1): 在 FastAPI app 上注册 websocket 路由。
 
-### Community 434 - "Community 434"
+### Community 437 - "Community 437"
 Cohesion: 1.0
 Nodes (1): Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。
 
-### Community 435 - "Community 435"
+### Community 438 - "Community 438"
 Cohesion: 1.0
 Nodes (1): 从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。
 
 ## Knowledge Gaps
 - **84 isolated node(s):** `关闭超时未支付的线上订单(超时分钟数来自系统设置 auto_cancel_minutes)。`, `初始化定时任务      Args:         get_db_session: 数据库会话获取函数(从 app.core.database 导入)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。`, `从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。` (+79 more)
   These have ≤1 connection - possible missing edges or undocumented components.
-- **Thin community `Community 35`** (13 nodes): `uni-combox.vue`, `clean()`, `data()`, `default()`, `filterCandidates()`, `filterCandidatesLength()`, `handler()`, `labelStyle()`, `onBlur()`, `onFocus()`, `onInput()`, `onSelectorClick()`, `toggleSelector()`
-  Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 42`** (9 nodes): `upload-file.vue`, `borderLineStyle()`, `borderStyle()`, `choose()`, `default()`, `delFile()`, `styles()`, `uploadFiles()`, `value2px()`
+- **Thin community `Community 38`** (13 nodes): `uni-combox.vue`, `clean()`, `data()`, `default()`, `filterCandidates()`, `filterCandidatesLength()`, `handler()`, `labelStyle()`, `onBlur()`, `onFocus()`, `onInput()`, `onSelectorClick()`, `toggleSelector()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 45`** (8 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `setTransition()`, `setupEventListeners()`, `index.vue`
+- **Thin community `Community 45`** (9 nodes): `upload-file.vue`, `borderLineStyle()`, `borderStyle()`, `choose()`, `default()`, `delFile()`, `styles()`, `uploadFiles()`, `value2px()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 46`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
+- **Thin community `Community 48`** (8 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `setTransition()`, `setupEventListeners()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 48`** (8 nodes): `RouteValidator`, `.checkComponents()`, `.checkDuplicates()`, `.checkNestedIndexComponent()`, `.logLayoutError()`, `.resolvePath()`, `.validate()`, `RouteValidator.ts`
+- **Thin community `Community 49`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 50`** (7 nodes): `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `App.vue`, `main.ts`, `console.ts`
+- **Thin community `Community 51`** (8 nodes): `RouteValidator`, `.checkComponents()`, `.checkDuplicates()`, `.checkNestedIndexComponent()`, `.logLayoutError()`, `.resolvePath()`, `.validate()`, `RouteValidator.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 56`** (6 nodes): `category.py`, `CategoryCRUD`, `._build_tree()`, `.get_by_name()`, `.get_children()`, `.get_tree()`
+- **Thin community `Community 53`** (7 nodes): `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `App.vue`, `main.ts`, `console.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 59`** (6 nodes): `bridge-error.js`, `BridgeError`, `.code()`, `.constructor()`, `.errCode()`, `.errMsg()`
+- **Thin community `Community 61`** (6 nodes): `bridge-error.js`, `BridgeError`, `.code()`, `.constructor()`, `.errCode()`, `.errMsg()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 61`** (6 nodes): `uni-thead.vue`, `checkboxSelected()`, `created()`, `data()`, `getTable()`, `init()`
+- **Thin community `Community 63`** (6 nodes): `uni-thead.vue`, `checkboxSelected()`, `created()`, `data()`, `getTable()`, `init()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 63`** (6 nodes): `uni-group.vue`, `created()`, `data()`, `getForm()`, `onClick()`, `title()`
+- **Thin community `Community 65`** (6 nodes): `uni-group.vue`, `created()`, `data()`, `getForm()`, `onClick()`, `title()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 66`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
+- **Thin community `Community 69`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 69`** (4 nodes): `catch()`, `collectIds()`, `handleCategoryTableSelectionChange()`, `index.vue`
+- **Thin community `Community 72`** (4 nodes): `catch()`, `collectIds()`, `handleCategoryTableSelectionChange()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 76`** (4 nodes): `popup.js`, `created()`, `data()`, `getParent()`
+- **Thin community `Community 79`** (4 nodes): `popup.js`, `created()`, `data()`, `getParent()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 77`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
+- **Thin community `Community 80`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 79`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
+- **Thin community `Community 82`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 91`** (3 nodes): `check-update.js`, `check-update.ts`, `updateUseModal()`
+- **Thin community `Community 94`** (3 nodes): `check-update.js`, `check-update.ts`, `updateUseModal()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 101`** (3 nodes): `loginRsa.js`, `buildMiniEncryptedLoginBody()`, `fetchLoginPublicKey()`
+- **Thin community `Community 104`** (3 nodes): `loginRsa.js`, `buildMiniEncryptedLoginBody()`, `fetchLoginPublicKey()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 103`** (3 nodes): `return()`, `detail.vue`, `detail.vue`
+- **Thin community `Community 106`** (3 nodes): `return()`, `detail.vue`, `detail.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 155`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 158`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 156`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 159`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 157`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
+- **Thin community `Community 160`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 158`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
+- **Thin community `Community 161`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 159`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 162`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 160`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
+- **Thin community `Community 163`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 428`** (1 nodes): `读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。      Returns:`
+- **Thin community `Community 431`** (1 nodes): `读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。      Returns:`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 429`** (1 nodes): `按 region_id 管理 websocket 连接并广播。`
+- **Thin community `Community 432`** (1 nodes): `按 region_id 管理 websocket 连接并广播。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 430`** (1 nodes): `鉴权并接入房间。返回 current_user dict。`
+- **Thin community `Community 433`** (1 nodes): `鉴权并接入房间。返回 current_user dict。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 431`** (1 nodes): `向 region 房间广播消息。返回尝试发送的连接数。`
+- **Thin community `Community 434`** (1 nodes): `向 region 房间广播消息。返回尝试发送的连接数。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 432`** (1 nodes): `小程序端 WebSocket 入口:/ws/mini`
+- **Thin community `Community 435`** (1 nodes): `小程序端 WebSocket 入口:/ws/mini`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 433`** (1 nodes): `在 FastAPI app 上注册 websocket 路由。`
+- **Thin community `Community 436`** (1 nodes): `在 FastAPI app 上注册 websocket 路由。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 434`** (1 nodes): `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。`
+- **Thin community `Community 437`** (1 nodes): `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 435`** (1 nodes): `从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。`
+- **Thin community `Community 438`** (1 nodes): `从请求体解析用户名、密码。     返回 (username, password, error_message);error_message 非空时表示失败。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
 
 ## Suggested Questions
 _Questions this graph is uniquely positioned to answer:_
 
-- **Why does `push()` connect `Community 1` to `Community 2`, `Community 3`, `Community 11`, `Community 13`, `Community 14`, `Community 18`, `Community 20`?**
-  _High betweenness centrality (0.115) - this node is a cross-community bridge._
-- **Why does `number()` connect `Community 2` to `Community 1`, `Community 7`, `Community 11`, `Community 18`, `Community 20`?**
+- **Why does `push()` connect `Community 1` to `Community 2`, `Community 3`, `Community 8`, `Community 11`, `Community 14`, `Community 17`, `Community 18`?**
+  _High betweenness centrality (0.114) - this node is a cross-community bridge._
+- **Why does `number()` connect `Community 2` to `Community 1`, `Community 3`, `Community 8`, `Community 11`, `Community 18`, `Community 24`?**
   _High betweenness centrality (0.062) - this node is a cross-community bridge._
-- **Why does `BizPriceListItem` connect `Community 0` to `Community 4`, `Community 8`, `Community 9`, `Community 10`, `Community 13`, `Community 16`?**
+- **Why does `BizPriceListItem` connect `Community 0` to `Community 7`, `Community 9`, `Community 12`, `Community 14`, `Community 15`?**
   _High betweenness centrality (0.039) - this node is a cross-community bridge._
-- **Are the 798 inferred relationships involving `BizPriceListItem` (e.g. with `PriceListCRUD` and `PriceListItemCRUD`) actually correct?**
-  _`BizPriceListItem` has 798 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 727 inferred relationships involving `BizInquiry` (e.g. with `InquiryCRUD` and `InquiryItemCRUD`) actually correct?**
-  _`BizInquiry` has 727 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 725 inferred relationships involving `BizQuotation` (e.g. with `QuotationCRUD` and `QuotationItemCRUD`) actually correct?**
-  _`BizQuotation` has 725 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 715 inferred relationships involving `BizAttachment` (e.g. with `AttachmentCRUD` and `价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。`) actually correct?**
-  _`BizAttachment` has 715 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 812 inferred relationships involving `BizPriceListItem` (e.g. with `PriceListCRUD` and `PriceListItemCRUD`) actually correct?**
+  _`BizPriceListItem` has 812 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 741 inferred relationships involving `BizInquiry` (e.g. with `InquiryCRUD` and `InquiryItemCRUD`) actually correct?**
+  _`BizInquiry` has 741 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 739 inferred relationships involving `BizQuotation` (e.g. with `QuotationCRUD` and `QuotationItemCRUD`) actually correct?**
+  _`BizQuotation` has 739 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 729 inferred relationships involving `BizAttachment` (e.g. with `AttachmentCRUD` and `价格清单行 price 为面向客户的最终单价;pricing_coefficient 为调价系数(%),供货单价 = price / (1 + 系数/100)。`) actually correct?**
+  _`BizAttachment` has 729 INFERRED edges - model-reasoned connections that need verification._

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
graphify-out/cache/ast/bb230f56680d3f948ab6b8ce02b565cf98811a3ec11186fdfdf98abdcd430943.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
graphify-out/cache/ast/c1b458671224c193fd80b356762b62da492541e475307a446f222818974edff9.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
graphify-out/cache/ast/d39ab58607f4e51c0bc0cadf20e7131e8fa2e94ed04a093adcfba28dfbc09bfb.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 62
graphify-out/graph.html


Разлика између датотеке није приказан због своје велике величине
+ 112 - 112
graphify-out/graph.json


Неке датотеке нису приказане због велике количине промена