zlwu 4 месяцев назад
Родитель
Сommit
f1ef768c17
25 измененных файлов с 1691 добавлено и 1749 удалено
  1. 1 1
      backend/app.pid
  2. 44 1
      backend/app/crud/outbound_release_material.py
  3. 0 0
      backend/app/graphify-out/cache/ast/aff463a9dc362d8a58aeb806bd61b6d87078e2d45ead1d0fb0a656009001a6c0.json
  4. 345 698
      backend/graphify-out/.graphify_analysis.json
  5. 184 70
      backend/graphify-out/.graphify_extract.json
  6. 79 154
      backend/graphify-out/GRAPH_REPORT.md
  7. 1 1
      backend/graphify-out/graph.html
  8. 112 112
      backend/graphify-out/graph.json
  9. 1 1
      backend/graphify-out/manifest.json
  10. 457 373
      web-admin/graphify-out/.graphify_analysis.json
  11. 244 96
      web-admin/graphify-out/.graphify_extract.json
  12. 96 118
      web-admin/graphify-out/GRAPH_REPORT.md
  13. 1 1
      web-admin/graphify-out/graph.html
  14. 112 112
      web-admin/graphify-out/graph.json
  15. 11 11
      web-admin/graphify-out/manifest.json
  16. 0 0
      web-admin/src/graphify-out/cache/ast/02b8c97fc8914283ce7c1d16eeac8c9182696741d4a93d46efebde1ceda4cc09.json
  17. 0 0
      web-admin/src/graphify-out/cache/ast/1bfc1f5ebeb365205d8deb0a1aee1063b52bc99a52c3d15afc76c820e7d6e743.json
  18. 1 0
      web-admin/src/graphify-out/cache/ast/2572ebd8cf04f5b8d90e8e6a2c0276c3102149c263b0335cc02df7b9e4cb7eea.json
  19. 0 0
      web-admin/src/graphify-out/cache/ast/6999fd5bed0e4af259462197dbe59222ed16e8ff4a87494b5af06127c47f83c7.json
  20. 0 0
      web-admin/src/graphify-out/cache/ast/7e3f005e51ba75e8e534819e78e33f83804ab70272c0cc1d1f0df091c64e1d99.json
  21. 0 0
      web-admin/src/graphify-out/cache/ast/7f8c6523a09db6b79b0ce9be640dbffbf37978f0db9e724e577dccf9ae00908b.json
  22. 0 0
      web-admin/src/graphify-out/cache/ast/93198779b12cbdc2d3738b2321dadae8ec56a9a8be78127eed8d7f8ea78cae7e.json
  23. 0 0
      web-admin/src/graphify-out/cache/ast/ad40ba8950dd2c31af31467eab81e2b7de33426a346c51949f944e5161c8b1d8.json
  24. 1 0
      web-admin/src/graphify-out/cache/ast/bab838011e8911ae204c84419b8eaa9c7196b35a64bde729f5d7cc0545745d24.json
  25. 1 0
      web-admin/src/graphify-out/cache/ast/f97d03384a05a0e29420facbe908de57e831cee7d7aad4a9f3a6cb88dc6f0c3c.json

+ 1 - 1
backend/app.pid

@@ -1 +1 @@
-22388
+35869

+ 44 - 1
backend/app/crud/outbound_release_material.py

@@ -44,6 +44,43 @@ def _cell_row_to_dict(row: BizOutboundReleaseCell) -> Dict[str, Any]:
     }
 
 
+def _enrich_cell_dicts_with_live_status(
+    db: Session,
+    tenant_no: str,
+    cells: List[Dict[str, Any]],
+) -> List[Dict[str, Any]]:
+    """出库细胞状态以细胞产品库为准(台账 product_status 仅为保存时快照)。"""
+    cp_ids = {
+        (c.get("cellProductId") or c.get("cell_product_id") or "").strip()
+        for c in cells
+    }
+    cp_ids.discard("")
+    if not cp_ids:
+        return cells
+
+    live_status: Dict[str, str] = {}
+    for product in (
+        db.query(BizCellProduct)
+        .filter(
+            BizCellProduct.id.in_(cp_ids),
+            BizCellProduct.tenant_no == tenant_no,
+            BizCellProduct.del_flag == 0,
+        )
+        .all()
+    ):
+        live_status[product.id] = (product.product_status or "").strip()
+
+    enriched: List[Dict[str, Any]] = []
+    for cell in cells:
+        cp_id = (cell.get("cellProductId") or cell.get("cell_product_id") or "").strip()
+        status = live_status.get(cp_id)
+        if status:
+            enriched.append({**cell, "productStatus": status})
+        else:
+            enriched.append(cell)
+    return enriched
+
+
 def _qc_material_row_to_dict(row: BizOutboundReleaseQcMaterial) -> Dict[str, Any]:
     return {
         "id": row.id,
@@ -272,9 +309,15 @@ def get_outbound_material(
     if not paper_materials and header and (header.paper_attachments or "").strip():
         paper_materials = _legacy_paper_rows_from_attachments(header.paper_attachments)
 
+    cell_dicts = _enrich_cell_dicts_with_live_status(
+        db,
+        tenant_no,
+        [_cell_row_to_dict(r) for r in cell_rows],
+    )
+
     return _material_header_to_dict(
         header,
-        [_cell_row_to_dict(r) for r in cell_rows],
+        cell_dicts,
         [_qc_material_row_to_dict(r) for r in qc_rows],
         paper_materials,
     )

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/app/graphify-out/cache/ast/aff463a9dc362d8a58aeb806bd61b6d87078e2d45ead1d0fb0a656009001a6c0.json


Разница между файлами не показана из-за своего большого размера
+ 345 - 698
backend/graphify-out/.graphify_analysis.json


+ 184 - 70
backend/graphify-out/.graphify_extract.json

@@ -17045,82 +17045,89 @@
       "source_file": "crud/outbound_release_material.py",
       "source_location": "L28"
     },
+    {
+      "id": "crud_outbound_release_material_enrich_cell_dicts_with_live_status",
+      "label": "_enrich_cell_dicts_with_live_status()",
+      "file_type": "code",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L47"
+    },
     {
       "id": "crud_outbound_release_material_qc_material_row_to_dict",
       "label": "_qc_material_row_to_dict()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L47"
+      "source_location": "L84"
     },
     {
       "id": "crud_outbound_release_material_paper_row_to_dict",
       "label": "_paper_row_to_dict()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L63"
+      "source_location": "L100"
     },
     {
       "id": "crud_outbound_release_material_legacy_paper_rows_from_attachments",
       "label": "_legacy_paper_rows_from_attachments()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L76"
+      "source_location": "L113"
     },
     {
       "id": "crud_outbound_release_material_material_header_to_dict",
       "label": "_material_header_to_dict()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L98"
+      "source_location": "L135"
     },
     {
       "id": "crud_outbound_release_material_soft_delete_outbound_cells_not_in",
       "label": "_soft_delete_outbound_cells_not_in()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L129"
+      "source_location": "L166"
     },
     {
       "id": "crud_outbound_release_material_soft_delete_outbound_qc_materials_not_in",
       "label": "_soft_delete_outbound_qc_materials_not_in()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L147"
+      "source_location": "L184"
     },
     {
       "id": "crud_outbound_release_material_find_outbound_cell_row",
       "label": "_find_outbound_cell_row()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L165"
+      "source_location": "L202"
     },
     {
       "id": "crud_outbound_release_material_find_outbound_qc_material_row",
       "label": "_find_outbound_qc_material_row()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L181"
+      "source_location": "L218"
     },
     {
       "id": "crud_outbound_release_material_get_schedule",
       "label": "_get_schedule()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L196"
+      "source_location": "L233"
     },
     {
       "id": "crud_outbound_release_material_get_outbound_material",
       "label": "get_outbound_material()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L211"
+      "source_location": "L248"
     },
     {
       "id": "crud_outbound_release_material_save_outbound_material",
       "label": "save_outbound_material()",
       "file_type": "code",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L283"
+      "source_location": "L326"
     },
     {
       "id": "crud_outbound_release_material_rationale_1",
@@ -17130,18 +17137,25 @@
       "source_location": "L1"
     },
     {
-      "id": "crud_outbound_release_material_rationale_168",
+      "id": "crud_outbound_release_material_rationale_52",
+      "label": "\u51fa\u5e93\u7ec6\u80de\u72b6\u6001\u4ee5\u7ec6\u80de\u4ea7\u54c1\u5e93\u4e3a\u51c6\uff08\u53f0\u8d26 product_status \u4ec5\u4e3a\u4fdd\u5b58\u65f6\u5feb\u7167\uff09\u3002",
+      "file_type": "rationale",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L52"
+    },
+    {
+      "id": "crud_outbound_release_material_rationale_205",
       "label": "\u6309 schedule+cell \u67e5\u627e\u53f0\u8d26\u884c\uff08\u4f18\u5148\u672a\u5220\u9664\uff09\u3002",
       "file_type": "rationale",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L168"
+      "source_location": "L205"
     },
     {
-      "id": "crud_outbound_release_material_rationale_296",
+      "id": "crud_outbound_release_material_rationale_339",
       "label": "\u5168\u91cf\u4fdd\u5b58\u51fa\u5e93\u7269\u6599\u51c6\u5907\uff08\u53f0\u8d26\uff0c\u4e0d\u8054\u52a8\u5e93\u5b58\uff09\u3002",
       "file_type": "rationale",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L296"
+      "source_location": "L339"
     },
     {
       "id": "crud_process_py",
@@ -74572,20 +74586,29 @@
     },
     {
       "source": "crud_outbound_release_material_py",
-      "target": "crud_outbound_release_material_qc_material_row_to_dict",
+      "target": "crud_outbound_release_material_enrich_cell_dicts_with_live_status",
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
       "source_location": "L47",
       "weight": 1.0
     },
+    {
+      "source": "crud_outbound_release_material_py",
+      "target": "crud_outbound_release_material_qc_material_row_to_dict",
+      "relation": "contains",
+      "confidence": "EXTRACTED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L84",
+      "weight": 1.0
+    },
     {
       "source": "crud_outbound_release_material_py",
       "target": "crud_outbound_release_material_paper_row_to_dict",
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L63",
+      "source_location": "L100",
       "weight": 1.0
     },
     {
@@ -74594,7 +74617,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L76",
+      "source_location": "L113",
       "weight": 1.0
     },
     {
@@ -74603,7 +74626,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L98",
+      "source_location": "L135",
       "weight": 1.0
     },
     {
@@ -74612,7 +74635,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L129",
+      "source_location": "L166",
       "weight": 1.0
     },
     {
@@ -74621,7 +74644,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L147",
+      "source_location": "L184",
       "weight": 1.0
     },
     {
@@ -74630,7 +74653,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L165",
+      "source_location": "L202",
       "weight": 1.0
     },
     {
@@ -74639,7 +74662,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L181",
+      "source_location": "L218",
       "weight": 1.0
     },
     {
@@ -74648,7 +74671,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L196",
+      "source_location": "L233",
       "weight": 1.0
     },
     {
@@ -74657,7 +74680,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L211",
+      "source_location": "L248",
       "weight": 1.0
     },
     {
@@ -74666,7 +74689,7 @@
       "relation": "contains",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L283",
+      "source_location": "L326",
       "weight": 1.0
     },
     {
@@ -74675,7 +74698,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L124",
+      "source_location": "L161",
       "weight": 1.0
     },
     {
@@ -74684,7 +74707,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L217",
+      "source_location": "L254",
       "weight": 1.0
     },
     {
@@ -74693,7 +74716,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L271",
+      "source_location": "L308",
       "weight": 1.0
     },
     {
@@ -74702,16 +74725,16 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L273",
+      "source_location": "L310",
       "weight": 1.0
     },
     {
       "source": "crud_outbound_release_material_get_outbound_material",
-      "target": "crud_outbound_release_material_material_header_to_dict",
+      "target": "crud_outbound_release_material_enrich_cell_dicts_with_live_status",
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L275",
+      "source_location": "L312",
       "weight": 1.0
     },
     {
@@ -74720,7 +74743,16 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L277",
+      "source_location": "L315",
+      "weight": 1.0
+    },
+    {
+      "source": "crud_outbound_release_material_get_outbound_material",
+      "target": "crud_outbound_release_material_material_header_to_dict",
+      "relation": "calls",
+      "confidence": "EXTRACTED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L318",
       "weight": 1.0
     },
     {
@@ -74729,7 +74761,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L278",
+      "source_location": "L321",
       "weight": 1.0
     },
     {
@@ -74738,7 +74770,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L297",
+      "source_location": "L340",
       "weight": 1.0
     },
     {
@@ -74747,7 +74779,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L349",
+      "source_location": "L392",
       "weight": 1.0
     },
     {
@@ -74756,7 +74788,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L352",
+      "source_location": "L395",
       "weight": 1.0
     },
     {
@@ -74765,7 +74797,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L386",
+      "source_location": "L429",
       "weight": 1.0
     },
     {
@@ -74774,7 +74806,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L454",
+      "source_location": "L497",
       "weight": 1.0
     },
     {
@@ -74783,7 +74815,7 @@
       "relation": "calls",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L528",
+      "source_location": "L571",
       "weight": 1.0
     },
     {
@@ -74796,21 +74828,30 @@
       "weight": 1.0
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
+      "target": "crud_outbound_release_material_enrich_cell_dicts_with_live_status",
+      "relation": "rationale_for",
+      "confidence": "EXTRACTED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L52",
+      "weight": 1.0
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_205",
       "target": "crud_outbound_release_material_find_outbound_cell_row",
       "relation": "rationale_for",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L168",
+      "source_location": "L205",
       "weight": 1.0
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "crud_outbound_release_material_save_outbound_material",
       "relation": "rationale_for",
       "confidence": "EXTRACTED",
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L296",
+      "source_location": "L339",
       "weight": 1.0
     },
     {
@@ -174894,7 +174935,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
       "target": "models_models_bizcellproduct",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174903,7 +174944,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_205",
+      "target": "models_models_bizcellproduct",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizcellproduct",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174921,7 +174971,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
+      "target": "models_models_bizoutboundreleasecell",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_205",
       "target": "models_models_bizoutboundreleasecell",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174930,7 +174989,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizoutboundreleasecell",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174948,7 +175007,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
       "target": "models_models_bizoutboundreleasematerial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174957,7 +175016,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_205",
+      "target": "models_models_bizoutboundreleasematerial",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizoutboundreleasematerial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174975,7 +175043,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
       "target": "models_models_bizoutboundreleasepaper",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -174984,7 +175052,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_205",
+      "target": "models_models_bizoutboundreleasepaper",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizoutboundreleasepaper",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175002,7 +175079,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
+      "target": "models_models_bizoutboundreleaseqcmaterial",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_205",
       "target": "models_models_bizoutboundreleaseqcmaterial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175011,7 +175097,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizoutboundreleaseqcmaterial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175029,7 +175115,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
       "target": "models_models_bizpilotinfusionschedule",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175038,7 +175124,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_205",
+      "target": "models_models_bizpilotinfusionschedule",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L13",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_models_bizpilotinfusionschedule",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175056,7 +175151,7 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_168",
+      "source": "crud_outbound_release_material_rationale_52",
       "target": "models_material_bizmaterial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -175065,7 +175160,16 @@
       "weight": 0.8
     },
     {
-      "source": "crud_outbound_release_material_rationale_296",
+      "source": "crud_outbound_release_material_rationale_205",
+      "target": "models_material_bizmaterial",
+      "relation": "uses",
+      "confidence": "INFERRED",
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L21",
+      "weight": 0.8
+    },
+    {
+      "source": "crud_outbound_release_material_rationale_339",
       "target": "models_material_bizmaterial",
       "relation": "uses",
       "confidence": "INFERRED",
@@ -211521,6 +211625,16 @@
       "source_location": "L201",
       "weight": 1.0
     },
+    {
+      "source": "crud_outbound_release_material_enrich_cell_dicts_with_live_status",
+      "target": "crud_base_crudbase_get",
+      "relation": "calls",
+      "confidence": "INFERRED",
+      "confidence_score": 0.8,
+      "source_file": "crud/outbound_release_material.py",
+      "source_location": "L54",
+      "weight": 1.0
+    },
     {
       "source": "crud_outbound_release_material_soft_delete_outbound_cells_not_in",
       "target": "crud_base_crudbase_update",
@@ -211528,7 +211642,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L144",
+      "source_location": "L181",
       "weight": 1.0
     },
     {
@@ -211538,7 +211652,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L162",
+      "source_location": "L199",
       "weight": 1.0
     },
     {
@@ -211548,7 +211662,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L302",
+      "source_location": "L345",
       "weight": 1.0
     },
     {
@@ -211558,7 +211672,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L327",
+      "source_location": "L370",
       "weight": 1.0
     },
     {
@@ -211568,7 +211682,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L328",
+      "source_location": "L371",
       "weight": 1.0
     },
     {
@@ -211578,7 +211692,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L356",
+      "source_location": "L399",
       "weight": 1.0
     },
     {
@@ -211588,7 +211702,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L380",
+      "source_location": "L423",
       "weight": 1.0
     },
     {
@@ -211598,7 +211712,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L383",
+      "source_location": "L426",
       "weight": 1.0
     },
     {
@@ -211608,7 +211722,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L405",
+      "source_location": "L448",
       "weight": 1.0
     },
     {
@@ -211618,7 +211732,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L436",
+      "source_location": "L479",
       "weight": 1.0
     },
     {
@@ -211628,7 +211742,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L470",
+      "source_location": "L513",
       "weight": 1.0
     },
     {
@@ -211638,7 +211752,7 @@
       "confidence": "INFERRED",
       "confidence_score": 0.8,
       "source_file": "crud/outbound_release_material.py",
-      "source_location": "L508",
+      "source_location": "L551",
       "weight": 1.0
     },
     {

+ 79 - 154
backend/graphify-out/GRAPH_REPORT.md

@@ -1,11 +1,11 @@
 # Graph Report - app  (2026-06-16)
 
 ## Corpus Check
-- Large corpus: 208 files · ~242,600 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
+- Large corpus: 208 files · ~242,696 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
 
 ## Summary
-- 4163 nodes · 21838 edges · 57 communities detected
-- Extraction: 33% EXTRACTED · 67% INFERRED · 0% AMBIGUOUS · INFERRED: 14710 edges (avg confidence: 0.6)
+- 4165 nodes · 21849 edges · 42 communities detected
+- Extraction: 33% EXTRACTED · 67% INFERRED · 0% AMBIGUOUS · INFERRED: 14718 edges (avg confidence: 0.6)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -45,27 +45,12 @@
 - [[_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 41|Community 41]]
 - [[_COMMUNITY_Community 42|Community 42]]
 - [[_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 53|Community 53]]
-- [[_COMMUNITY_Community 54|Community 54]]
-- [[_COMMUNITY_Community 55|Community 55]]
-- [[_COMMUNITY_Community 56|Community 56]]
-- [[_COMMUNITY_Community 57|Community 57]]
-- [[_COMMUNITY_Community 58|Community 58]]
 
 ## God Nodes (most connected - your core abstractions)
 1. `success_response()` - 637 edges
@@ -95,267 +80,207 @@
 
 ### Community 0 - "Community 0"
 Cohesion: 0.01
-Nodes (792): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+784 more)
+Nodes (815): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+807 more)
 
 ### Community 1 - "Community 1"
 Cohesion: 0.01
-Nodes (525): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+517 more)
+Nodes (590): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+582 more)
 
 ### Community 2 - "Community 2"
-Cohesion: 0.07
-Nodes (387): 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody, OccupancyCreateBody (+379 more)
+Cohesion: 0.06
+Nodes (469): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+461 more)
 
 ### Community 3 - "Community 3"
-Cohesion: 0.02
-Nodes (256): create_collection_protocol(), delete_collection_protocol(), _ensure_customer_for_mother(), get_collection_protocol_detail(), _get_current_user_id(), _get_tenant_no(), list_collection_protocol_audits(), list_collection_protocols() (+248 more)
+Cohesion: 0.03
+Nodes (288): AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody, OccupancyCreateBody, 运营支撑 API(洁净室、进出记录、仓储设施、储位、展厅预约) (+280 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.02
-Nodes (253): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), _format_attachment_file_size(), urls_to_attachment_list() (+245 more)
+Cohesion: 0.01
+Nodes (215): api_save_application(), ApiRequestLogCRUD, delete(), get_multi_with_filters(), create_cell_sample_type(), get_cell_sample_type(), list_cell_sample_types(), 细胞样本类型 CRUD(biz_cell_sample_type) (+207 more)
 
 ### Community 5 - "Community 5"
-Cohesion: 0.04
-Nodes (217): generate_uuid(), batch_stock_in(), batch_stock_out(), consumable_code_exists(), create_consumable(), _dec(), get_consumable(), _is_enabled_status() (+209 more)
+Cohesion: 0.02
+Nodes (166): _jwt_user_payload(), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), Web 端登录:账号为 sys_user.user_no,密码为 sys_user.password(bcrypt)。, refresh_token(), web_login(), web_login_rsa_public_key(), lifespan(), create_access_token() (+158 more)
 
 ### Community 6 - "Community 6"
 Cohesion: 0.02
-Nodes (185): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+177 more)
+Nodes (177): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), batch_review(), _dec() (+169 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.06
-Nodes (192): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+184 more)
+Cohesion: 0.03
+Nodes (166): _persist_protocol_sub_resources(), format_date(), optional_date(), parse_date(), 将字符串 / date / datetime 转为 date 或 None, allocate_next_biz_no(), _format_biz_no(), _prefix_for() (+158 more)
 
 ### Community 8 - "Community 8"
 Cohesion: 0.02
-Nodes (133): get_by_schedule(), get_method(), _get_tenant_no(), list_by_application(), list_materials(), 中试服务交付管理 API(交付信息、交付物料、交付方式), soft_delete(), generate_id() (+125 more)
+Nodes (110): get_designer_data(), _error_json(), 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin, sqlalchemy_exception_handler(), unhandled_exception_handler(), BaseHTTPMiddleware, ApiCryptoError (+102 more)
 
 ### Community 9 - "Community 9"
-Cohesion: 0.02
-Nodes (100): get_designer_data(), _error_json(), 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin, sqlalchemy_exception_handler(), unhandled_exception_handler(), BaseHTTPMiddleware, ApiCryptoError (+92 more)
+Cohesion: 0.03
+Nodes (164): batch_discard(), batch_options(), _batch_row_to_dict(), batch_stock_in(), batch_stock_out(), _create_batch_and_usage(), delete_batch(), _discard_batch() (+156 more)
 
 ### Community 10 - "Community 10"
 Cohesion: 0.03
-Nodes (136): get_next_cell_product_code(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain(), _build_facility_path_label(), build_split_product_codes() (+128 more)
+Nodes (129): list_ethnics_for_select(), apply_data_scope(), _get_child_dept_ids(), get_user_dept_id(), _resolve_user_role_scopes(), _build_tree(), _cascade_soft_delete(), _collect_with_ancestors() (+121 more)
 
 ### Community 11 - "Community 11"
-Cohesion: 0.05
-Nodes (68): _avatar_url_field(), _build_current_user_payload(), _build_user_info_payload(), get_current_user_profile(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/zkxw.sql 基线), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致) (+60 more)
+Cohesion: 0.03
+Nodes (122): _format_attachment_file_size(), urls_to_attachment_list(), _apply_sample_status_filter(), _base_query(), _fmt_dt(), list_protocol_sample_collections(), _row_to_dict(), _sample_status_label() (+114 more)
 
 ### Community 12 - "Community 12"
-Cohesion: 0.36
-Nodes (67): BatchStockInBody, BatchStockInItem, BatchStockOutBody, BatchStockOutItem, ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody (+59 more)
+Cohesion: 0.04
+Nodes (96): join_equipment_ids(), parse_equipment_ids(), 工艺/步骤设备多选:逗号分隔 ID 与名称快照解析, 校验设备列表,返回 (equipment_ids 逗号串, equipment_name 逗号串快照)。, resolve_equipment_list_snapshot(), _consumable_row_to_dict(), create_process(), _create_sub_consumable() (+88 more)
 
 ### Community 13 - "Community 13"
-Cohesion: 0.08
-Nodes (58): api_save_application(), auto_create_payment(), auto_generate_schedules(), complete_application(), create_application(), create_basic_experiment_sale_schedules(), create_infusion_plan(), create_schedule() (+50 more)
+Cohesion: 0.06
+Nodes (62): get_next_cell_product_code(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain(), _build_facility_path_label(), build_split_product_codes() (+54 more)
 
 ### Community 14 - "Community 14"
-Cohesion: 0.08
-Nodes (50): join_equipment_ids(), parse_equipment_ids(), 工艺/步骤设备多选:逗号分隔 ID 与名称快照解析, 校验设备列表,返回 (equipment_ids 逗号串, equipment_name 逗号串快照)。, resolve_equipment_list_snapshot(), _consumable_row_to_dict(), create_process(), _create_sub_consumable() (+42 more)
+Cohesion: 0.12
+Nodes (11): get_wechat_pay_client(), get_wechat_pay_v2(), 微信支付工具模块  支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.ht, 统一下单接口 (V3)          Args:             out_trade_no: 商户订单号             total, 申请退款          Args:             out_trade_no: 商户订单号             total_amount, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API)          Args:             out_trade_no: 商户订单号             tot, 生成签名 V3 (SHA256 with RSA) (+3 more)
 
 ### Community 15 - "Community 15"
-Cohesion: 0.11
-Nodes (36): batch_create_sterilize_logs(), batch_create_wash_logs(), batch_discard_garments(), batch_soft_delete_garments(), _count_map(), create_garment(), create_sterilize_log(), create_wash_log() (+28 more)
+Cohesion: 0.17
+Nodes (21): batch_stock_in(), batch_stock_out(), code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), _is_enabled_status() (+13 more)
 
 ### Community 16 - "Community 16"
-Cohesion: 0.12
-Nodes (10): get_wechat_pay_client(), get_wechat_pay_v2(), 微信支付工具模块  支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.ht, 统一下单接口 (V3)          Args:             out_trade_no: 商户订单号             total, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API)          Args:             out_trade_no: 商户订单号             tot, 生成签名 V3 (SHA256 with RSA), wechat_pay() (+2 more)
+Cohesion: 0.2
+Nodes (19): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+11 more)
 
 ### Community 17 - "Community 17"
-Cohesion: 0.19
-Nodes (26): _amount_for_row(), _batch_map(), deduct_for_task(), _deduct_task_usage_legacy_batch(), _display_remark(), _fmt_date_val(), _linked_qc_task_no_map(), list_linked_task_usages() (+18 more)
+Cohesion: 0.18
+Nodes (18): company_code_exists(), create_company(), get_company(), list_companies(), list_company_options(), _row_to_dict(), soft_delete_company(), update_company() (+10 more)
 
 ### Community 18 - "Community 18"
-Cohesion: 0.17
-Nodes (21): batch_stock_in(), batch_stock_out(), code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), _is_enabled_status() (+13 more)
+Cohesion: 0.18
+Nodes (17): get_by_schedule(), get_method(), _get_tenant_no(), list_by_application(), list_materials(), 中试服务交付管理 API(交付信息、交付物料、交付方式), soft_delete(), create_delivery() (+9 more)
 
 ### Community 19 - "Community 19"
-Cohesion: 0.15
-Nodes (20): _access_log_to_dict(), _calc_duration_minutes(), create_access_log(), create_clean_room(), create_uv_disinfect_log(), get_access_log(), get_clean_room(), get_uv_disinfect_log() (+12 more)
+Cohesion: 0.21
+Nodes (15): batch_stock_in(), batch_stock_out(), consumable_code_exists(), create_consumable(), _dec(), get_consumable(), _is_enabled_status(), list_consumables() (+7 more)
 
 ### Community 20 - "Community 20"
-Cohesion: 0.18
-Nodes (18): company_code_exists(), create_company(), get_company(), list_companies(), list_company_options(), _row_to_dict(), soft_delete_company(), update_company() (+10 more)
+Cohesion: 0.21
+Nodes (15): batch_generate_protocol_nos(), batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), _parse_issued_time(), protocol_no_exists() (+7 more)
 
 ### Community 21 - "Community 21"
-Cohesion: 0.22
-Nodes (13): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_names_by_region_ids(), _hospital_to_dict(), list_collection_regions(), list_hospitals() (+5 more)
+Cohesion: 0.23
+Nodes (12): Config, ProductBase, ProductCategoryBase, ProductCategoryCreate, ProductCategoryResponse, ProductCreate, ProductResponse, ProductUnitBase (+4 more)
 
 ### Community 22 - "Community 22"
-Cohesion: 0.25
-Nodes (13): batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), _parse_issued_time(), protocol_no_exists(), 采集协议号池 CRUD(biz_collection_protocol_no) (+5 more)
-
-### Community 23 - "Community 23"
-Cohesion: 0.24
-Nodes (9): 微信消息通知服务  支持微信小程序模板消息推送  使用方式:     from app.core.wechat_message import Wech, 发送模板消息                  Args:             openid: 用户openid             templ, send_delivery_notice(), send_delivery_warning(), send_order_status(), send_payment_success(), send_refund_result(), send_urge_notification() (+1 more)
-
-### Community 24 - "Community 24"
 Cohesion: 0.31
 Nodes (11): create_equipment(), _dec(), equipment_code_exists(), equipment_is_referenced(), get_equipment(), list_equipments(), _norm_status(), _parse_date() (+3 more)
 
-### Community 25 - "Community 25"
+### Community 23 - "Community 23"
 Cohesion: 0.27
 Nodes (11): create_consumable_pack(), get_consumable_pack(), get_pack_detail(), _item_row_to_dict(), list_all_packs(), list_consumable_packs(), pack_code_exists(), 耗材包 CRUD(biz_consumable_pack + biz_consumable_pack_item) (+3 more)
 
-### Community 26 - "Community 26"
+### Community 24 - "Community 24"
 Cohesion: 0.24
-Nodes (12): appointment_no_exists(), create_exhibition_appointment(), _format_visit_date(), _generate_appointment_no(), get_exhibition_appointment(), list_exhibition_appointments(), 展览预约 CRUD(biz_exhibition_appointment), 生成预约编号:YYYYMMDD + 6位序号(如 20260515000001) (+4 more)
+Nodes (9): 微信消息通知服务  支持微信小程序模板消息推送  使用方式:     from app.core.wechat_message import Wech, 发送模板消息                  Args:             openid: 用户openid             templ, send_delivery_notice(), send_delivery_warning(), send_order_status(), send_payment_success(), send_refund_result(), send_urge_notification() (+1 more)
 
-### Community 27 - "Community 27"
+### Community 25 - "Community 25"
 Cohesion: 0.24
 Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 试剂变动记录 CRUD(biz_reagent_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减试剂库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
 
-### Community 28 - "Community 28"
+### Community 26 - "Community 26"
 Cohesion: 0.32
 Nodes (11): create_env_detect_record(), _generate_record_no(), get_env_detect_record(), _join_csv(), list_env_detect_records(), _resolve_inspector_snapshots(), _resolve_item_snapshot(), _row_to_dict() (+3 more)
 
-### Community 29 - "Community 29"
+### Community 27 - "Community 27"
 Cohesion: 0.24
 Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 耗材变动记录 CRUD(biz_consumable_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减耗材库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
 
-### Community 30 - "Community 30"
-Cohesion: 0.27
-Nodes (11): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。 (+3 more)
-
-### Community 31 - "Community 31"
-Cohesion: 0.29
-Nodes (9): _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), _row_to_dict(), soft_delete_menu() (+1 more)
-
-### Community 32 - "Community 32"
-Cohesion: 0.31
-Nodes (8): create_express_company(), express_code_exists(), get_express_company(), list_express_companies(), 快递公司 CRUD(biz_express_company), _row_to_dict(), soft_delete_express_company(), update_express_company()
-
-### Community 33 - "Community 33"
-Cohesion: 0.38
-Nodes (9): create_check_item(), get_check_item(), item_code_exists(), list_active_check_items(), list_check_items(), _order_query(), _row_to_dict(), soft_delete_check_item() (+1 more)
-
-### Community 34 - "Community 34"
-Cohesion: 0.27
-Nodes (8): create_dict_data(), get_dict_data(), list_dict_data(), list_dict_data_options(), 字典数据 CRUD(sys_dict_data), _row_to_dict(), soft_delete_dict_data(), update_dict_data()
-
-### Community 35 - "Community 35"
-Cohesion: 0.38
-Nodes (9): create_env_detect_item(), get_env_detect_item(), item_code_exists(), list_active_env_detect_items(), list_env_detect_items(), _order_query(), _row_to_dict(), soft_delete_env_detect_item() (+1 more)
-
-### Community 36 - "Community 36"
-Cohesion: 0.31
-Nodes (8): category_code_exists(), create_process_category(), get_process_category(), list_process_categories(), 工艺工序分类 CRUD(biz_process_category), _row_to_dict(), soft_delete_process_category(), update_process_category()
-
-### Community 37 - "Community 37"
-Cohesion: 0.31
-Nodes (8): create_item_unit(), get_item_unit(), list_item_units(), 物品单位 CRUD(biz_item_unit), _row_to_dict(), soft_delete_item_unit(), unit_code_exists(), update_item_unit()
-
-### Community 38 - "Community 38"
-Cohesion: 0.31
-Nodes (8): create_cell_sample_type(), get_cell_sample_type(), list_cell_sample_types(), 细胞样本类型 CRUD(biz_cell_sample_type), _row_to_dict(), soft_delete_cell_sample_type(), type_code_exists(), update_cell_sample_type()
-
-### Community 39 - "Community 39"
-Cohesion: 0.31
-Nodes (8): create_output_type(), get_output_type(), list_output_types(), 工艺产出物类型 CRUD(biz_output_type), _row_to_dict(), soft_delete_output_type(), type_code_exists(), update_output_type()
-
-### Community 40 - "Community 40"
-Cohesion: 0.36
-Nodes (7): create_post(), get_post(), list_posts(), post_code_exists(), _row_to_dict(), soft_delete_post(), update_post()
-
-### Community 41 - "Community 41"
-Cohesion: 0.36
-Nodes (7): create_site(), get_site(), list_sites(), _row_to_dict(), site_code_exists(), soft_delete_site(), update_site()
-
-### Community 42 - "Community 42"
-Cohesion: 0.36
-Nodes (7): create_tenant(), get_tenant(), list_tenants(), _row_to_dict(), soft_delete_tenant(), tenant_no_exists(), update_tenant()
-
-### Community 43 - "Community 43"
+### Community 28 - "Community 28"
 Cohesion: 0.25
 Nodes (7): 菜单 code 权限守卫(V0.3:通过 sys_user_role → sys_role_menu → sys_menu.perms), 运营端角色守卫:admin / super_admin 可访问。, 接口菜单权限守卫。super_admin 直接放行。, 接口菜单权限守卫:拥有任一 menuCode 即可访问。super_admin 直接放行。, require_admin_or_super_admin(), require_any_menu_code(), require_menu_code()
 
-### Community 44 - "Community 44"
+### Community 29 - "Community 29"
 Cohesion: 0.29
 Nodes (2): BaseModel, SoftDeleteModel
 
-### Community 45 - "Community 45"
+### Community 30 - "Community 30"
 Cohesion: 0.38
 Nodes (6): derive_legacy_status_from_three(), derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。     约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断;     若业务侧已有更精确, 阶段A兼容:从三字段反推旧 status(用于旧前端/旧筛选参数兼容)。, ThreeStatus, _to_decimal()
 
-### Community 46 - "Community 46"
+### Community 31 - "Community 31"
 Cohesion: 0.5
 Nodes (3): BaseSettings, Config, Settings
 
-### Community 47 - "Community 47"
+### Community 32 - "Community 32"
 Cohesion: 0.5
 Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
 
-### Community 48 - "Community 48"
+### Community 33 - "Community 33"
 Cohesion: 0.67
 Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)
 
-### Community 49 - "Community 49"
+### Community 34 - "Community 34"
 Cohesion: 1.0
 Nodes (1): 请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传
 
-### Community 50 - "Community 50"
+### Community 35 - "Community 35"
 Cohesion: 1.0
 Nodes (1): API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)
 
-### Community 53 - "Community 53"
+### Community 38 - "Community 38"
 Cohesion: 1.0
 Nodes (1): 发送订单状态通知                  Args:             openid: 用户openid             ord
 
-### Community 54 - "Community 54"
+### Community 39 - "Community 39"
 Cohesion: 1.0
 Nodes (1): 发送支付成功通知                  Args:             openid: 用户openid             ord
 
-### Community 55 - "Community 55"
+### Community 40 - "Community 40"
 Cohesion: 1.0
 Nodes (1): 发送配送通知                  Args:             openid: 配送员openid             task
 
-### Community 56 - "Community 56"
+### Community 41 - "Community 41"
 Cohesion: 1.0
 Nodes (1): 发送配送时效预警                  Args:             openid: 配送员openid             ta
 
-### Community 57 - "Community 57"
+### Community 42 - "Community 42"
 Cohesion: 1.0
 Nodes (1): 发送退款结果通知                  Args:             openid: 用户openid             ord
 
-### Community 58 - "Community 58"
+### Community 43 - "Community 43"
 Cohesion: 1.0
 Nodes (1): 发送催单通知给配送员                  Args:             deliver_openid: 配送员openid
 
 ## Knowledge Gaps
 - **127 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。` (+122 more)
   These have ≤1 connection - possible missing edges or undocumented components.
-- **Thin community `Community 44`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
+- **Thin community `Community 29`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 47`** (4 nodes): `_auto_fill_create_dept_id()`, `get_db()`, `database.py`, `ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID`
+- **Thin community `Community 32`** (4 nodes): `_auto_fill_create_dept_id()`, `get_db()`, `database.py`, `ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 48`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
+- **Thin community `Community 33`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 49`** (2 nodes): `context.py`, `请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
+- **Thin community `Community 34`** (2 nodes): `context.py`, `请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 50`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
+- **Thin community `Community 35`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 53`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 38`** (1 nodes): `发送订单状态通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 54`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 39`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 55`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
+- **Thin community `Community 40`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 56`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
+- **Thin community `Community 41`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 57`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 42`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 58`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
+- **Thin community `Community 43`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
   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 `SysUser` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 11`, `Community 12`, `Community 22`, `Community 27`, `Community 29`?**
-  _High betweenness centrality (0.107) - this node is a cross-community bridge._
-- **Why does `generate_uuid()` connect `Community 5` to `Community 0`, `Community 3`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 34`, `Community 35`, `Community 36`, `Community 37`, `Community 38`, `Community 39`, `Community 40`, `Community 41`, `Community 42`?**
-  _High betweenness centrality (0.059) - this node is a cross-community bridge._
-- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 3`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 13`, `Community 48`?**
-  _High betweenness centrality (0.055) - this node is a cross-community bridge._
+- **Why does `SysUser` connect `Community 1` to `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 18`, `Community 20`, `Community 25`, `Community 27`?**
+  _High betweenness centrality (0.117) - this node is a cross-community bridge._
+- **Why does `generate_uuid()` connect `Community 3` to `Community 0`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 15`, `Community 16`, `Community 17`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 25`, `Community 26`, `Community 27`?**
+  _High betweenness centrality (0.061) - this node is a cross-community bridge._
+- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 33`, `Community 4`, `Community 5`, `Community 8`, `Community 10`, `Community 13`, `Community 18`?**
+  _High betweenness centrality (0.056) - this node is a cross-community bridge._
 - **Are the 689 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
   _`str` has 689 INFERRED edges - model-reasoned connections that need verification._
 - **Are the 636 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
backend/graphify-out/graph.html


Разница между файлами не показана из-за своего большого размера
+ 112 - 112
backend/graphify-out/graph.json


+ 1 - 1
backend/graphify-out/manifest.json

@@ -139,7 +139,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py": 1781607961.140553,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_handover_inventory.py": 1781598316.476379,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/env_detect_record.py": 1781145773.959546,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_release_material.py": 1781598316.369666,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_release_material.py": 1781612877.0137436,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/process.py": 1781524075.6578302,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_service.py": 1781599314.0124536,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1779686149.7508218,

Разница между файлами не показана из-за своего большого размера
+ 457 - 373
web-admin/graphify-out/.graphify_analysis.json


Разница между файлами не показана из-за своего большого размера
+ 244 - 96
web-admin/graphify-out/.graphify_extract.json


+ 96 - 118
web-admin/graphify-out/GRAPH_REPORT.md

@@ -1,11 +1,11 @@
 # Graph Report - src  (2026-06-16)
 
 ## Corpus Check
-- Large corpus: 782 files · ~515,044 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
+- Large corpus: 782 files · ~515,267 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
 
 ## Summary
-- 2582 nodes · 3579 edges · 51 communities detected
-- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 780 edges (avg confidence: 0.8)
+- 2589 nodes · 3596 edges · 47 communities detected
+- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 787 edges (avg confidence: 0.8)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -42,28 +42,24 @@
 - [[_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 41|Community 41]]
-- [[_COMMUNITY_Community 44|Community 44]]
+- [[_COMMUNITY_Community 42|Community 42]]
 - [[_COMMUNITY_Community 45|Community 45]]
 - [[_COMMUNITY_Community 46|Community 46]]
+- [[_COMMUNITY_Community 48|Community 48]]
 - [[_COMMUNITY_Community 49|Community 49]]
-- [[_COMMUNITY_Community 50|Community 50]]
-- [[_COMMUNITY_Community 52|Community 52]]
-- [[_COMMUNITY_Community 53|Community 53]]
-- [[_COMMUNITY_Community 55|Community 55]]
-- [[_COMMUNITY_Community 60|Community 60]]
-- [[_COMMUNITY_Community 62|Community 62]]
+- [[_COMMUNITY_Community 51|Community 51]]
+- [[_COMMUNITY_Community 56|Community 56]]
+- [[_COMMUNITY_Community 58|Community 58]]
 
 ## God Nodes (most connected - your core abstractions)
 1. `get()` - 261 edges
-2. `push()` - 63 edges
+2. `push()` - 64 edges
 3. `emit()` - 27 edges
 4. `WebSocketClient` - 26 edges
 5. `MenuProcessor` - 16 edges
@@ -74,58 +70,58 @@
 10. `TableCache` - 14 edges
 
 ## Surprising Connections (you probably didn't know these)
+- `handleBatchDelete()` --calls--> `withFullscreenLoading()`  [INFERRED]
+  views/basic-info/customer/index.vue → utils/fullscreen-loading.ts
 - `buildInboundMetaFields()` --calls--> `push()`  [INFERRED]
   utils/production-work-order-card-meta.ts → views/operations/storage-facility/index.vue
 - `fmtMoney()` --calls--> `formatMoneyDisplay()`  [INFERRED]
   components/business/clinical-schedule-payment-detail/index.vue → utils/money-format.ts
 - `subscribeTokenRefresh()` --calls--> `push()`  [INFERRED]
   utils/http/index.ts → views/operations/storage-facility/index.vue
-- `handleUnauthorizedResponse()` --calls--> `fetchRefreshToken()`  [INFERRED]
-  utils/http/index.ts → api/auth.ts
-- `handleCardSelect()` --calls--> `emit()`  [INFERRED]
-  views/production/production-work-order/ProductionWorkOrderCardList.vue → components/core/layouts/art-settings-panel/widget/SettingItem.vue
+- `fetchSampleReceptionCheckItemList()` --calls--> `get()`  [INFERRED]
+  api/sample-reception-check-item.ts → views/production/process/ProcessRouteTab.vue
 
 ## Communities
 
 ### Community 0 - "Community 0"
 Cohesion: 0.01
-Nodes (179): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchChannelAccount(), fetchChannelAgreementPrices(), fetchChannelAgreements() (+171 more)
+Nodes (185): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchChannelAccount(), fetchChannelAgreementPrices(), fetchChannelAgreements() (+177 more)
 
 ### Community 1 - "Community 1"
 Cohesion: 0.01
-Nodes (11): fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchDeleteProjectSystemItem(), fetchGetRoleList(), fetchNotDeletedRegions(), fetchRegionList(), fetchUpdateCheckupInstitution(), fetchUpdateCheckupInstitutionInvoice() (+3 more)
+Nodes (37): fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateUser(), fetchDeleteProjectSystemItem(), fetchDeleteUser(), fetchDeptTree(), fetchGetRoleList(), fetchNotDeletedRegions() (+29 more)
 
 ### Community 2 - "Community 2"
 Cohesion: 0.03
-Nodes (51): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchRefreshToken(), fetchUpdateProfile(), fetchUploadProfileAvatar(), IframeRouteManager (+43 more)
+Nodes (52): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchUpdateProfile(), fetchUploadProfileAvatar(), ComponentLoader, IframeRouteManager (+44 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.03
-Nodes (62): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionList(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitutionProject(), submitOutboundReleaseReview(), fetchConsumablePackDetail(), fetchConsumablePackList() (+54 more)
+Nodes (79): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupActualItems(), fetchPilotCheckupDetail(), fetchPilotCheckupReserveItems() (+71 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.04
-Nodes (74): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupActualItems(), fetchPilotCheckupDetail(), fetchPilotCheckupReserveItems(), markPilotCheckupChecked() (+66 more)
+Cohesion: 0.03
+Nodes (59): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), fetchProductionTaskList(), handleAdd(), handleBatchDelete() (+51 more)
 
 ### Community 5 - "Community 5"
 Cohesion: 0.04
-Nodes (61): fetchUploadAttachment(), FireworkSystem, reload(), handleReportUpload(), handleReportUpload(), walk(), handleMenuJump(), openExternalLink() (+53 more)
+Nodes (67): fetchUploadAttachment(), FireworkSystem, reload(), handleReportUpload(), formatNowDatetime(), handleReportUpload(), walk(), formatTodayDate() (+59 more)
 
 ### Community 6 - "Community 6"
-Cohesion: 0.04
-Nodes (51): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), fetchProductionTaskList(), handleDelete(), handleDropdownCommand() (+43 more)
+Cohesion: 0.03
+Nodes (50): fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList(), fetchEnvDetectItemsActive(), fetchUpdateEnvDetectItem(), submitOutboundReleaseReview(), fetchConsumablePackDetail() (+42 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.03
-Nodes (43): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), for(), set(), annotateForkEdges(), chainApiToElements() (+35 more)
+Cohesion: 0.04
+Nodes (53): fetchCellProductSpecList(), fetchCellProductTypeList(), fetchStorageSlotSelectOptions(), fetchMaxPassageProductSeq(), useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator (+45 more)
 
 ### Community 8 - "Community 8"
 Cohesion: 0.04
-Nodes (48): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchCreateMenu(), fetchDeleteCellSampleType(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateCellSampleType(), fetchUpdateMenu() (+40 more)
+Nodes (42): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), for(), set(), annotateForkEdges(), chainApiToElements() (+34 more)
 
 ### Community 9 - "Community 9"
-Cohesion: 0.05
-Nodes (47): fetchCellProductSpecList(), fetchCellProductTypeList(), fetchStorageSlotSelectOptions(), fetchMaxPassageProductSeq(), RoutePermissionValidator, handleAdd(), resetForm(), applyProductCodeToLines() (+39 more)
+Cohesion: 0.04
+Nodes (45): handleBlur(), handleFocus(), handleInput(), fetchEthnicList(), formatAmount(), formatAmount(), formatProtocolAmount(), buildBaseFields() (+37 more)
 
 ### Community 10 - "Community 10"
 Cohesion: 0.05
@@ -136,196 +132,178 @@ Cohesion: 0.04
 Nodes (37): fetchInfusionScheduleMgmtDetail(), fetchAttachmentDownloadUrl(), qcAttachmentFullUrl(), qcDownloadAttachment(), qcPreviewAttachment(), handleDownloadAttachment(), attachmentFullUrl(), handleAttachmentDownload() (+29 more)
 
 ### Community 12 - "Community 12"
-Cohesion: 0.05
-Nodes (34): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+26 more)
+Cohesion: 0.06
+Nodes (11): fetchGetLatestUpgradeLog(), getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager (+3 more)
 
 ### Community 13 - "Community 13"
-Cohesion: 0.06
-Nodes (34): toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes() (+26 more)
+Cohesion: 0.05
+Nodes (13): fmtMoney(), auditorDisplay(), dash(), ensureUnitsInOptions(), expressName(), formatYm(), formatYmd(), sampleTypeName() (+5 more)
 
 ### Community 14 - "Community 14"
-Cohesion: 0.05
-Nodes (27): fetchEthnicList(), formatNowDatetime(), formatHandoverUserLabel(), formatNowDatetime(), fullFileUrl(), handlePreviewAttachment(), isVideoFile(), resetHandoverForm() (+19 more)
+Cohesion: 0.07
+Nodes (33): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchReassignProductionTask(), fetchReorderTaskSteps() (+25 more)
 
 ### Community 15 - "Community 15"
-Cohesion: 0.05
-Nodes (13): fmtMoney(), auditorDisplay(), dash(), ensureUnitsInOptions(), expressName(), formatYm(), formatYmd(), sampleTypeName() (+5 more)
-
-### Community 16 - "Community 16"
 Cohesion: 0.07
 Nodes (24): fetchDeleteQcMaterialBatch(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), ensureTabMounted() (+16 more)
 
-### Community 17 - "Community 17"
+### Community 16 - "Community 16"
 Cohesion: 0.1
 Nodes (2): WebSocketClient, TableCache
 
+### Community 17 - "Community 17"
+Cohesion: 0.08
+Nodes (33): fetchRefreshToken(), toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url() (+25 more)
+
 ### Community 18 - "Community 18"
 Cohesion: 0.08
 Nodes (28): fetchUserOptions(), fetchSampleReceptionCheckItemList(), fetchSampleReceptionCheckItemsActive(), fetchAllocateLabStorageCodes(), fetchSampleReceptionBySampleCode(), fetchSampleReceptionDetail(), fetchSampleReceptionPendingList(), fetchSampleReceptionReceivedList() (+20 more)
 
 ### Community 19 - "Community 19"
-Cohesion: 0.08
-Nodes (20): maskIdCard(), buildBasicExperimentApplicationFields(), buildDefaultApplicationFields(), buildOutboundPilotContextSections(), applicationStatusLabel(), applicationStatusTagType(), cellProductStatusLabel(), cellProductStatusTagType() (+12 more)
+Cohesion: 0.07
+Nodes (23): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), collectIds(), postorder(), preorder(), applyTreeExpand() (+15 more)
 
 ### Community 20 - "Community 20"
-Cohesion: 0.09
-Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
+Cohesion: 0.08
+Nodes (23): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTemporaryViewSections(), buildTransportSection(), formatCheckResults(), formatMetric() (+15 more)
 
 ### Community 21 - "Community 21"
-Cohesion: 0.09
-Nodes (30): handleBlur(), handleFocus(), handleInput(), formatAmount(), formatAmount(), formatProtocolAmount(), buildBaseFields(), buildFeeSection() (+22 more)
-
-### Community 22 - "Community 22"
 Cohesion: 0.08
-Nodes (29): fetchCreateUser(), fetchDeleteUser(), fetchDeptTree(), fetchPostBoundUserIds(), fetchResetPassword(), fetchRoleOptions(), fetchUpdateUser(), fetchUserDetail() (+21 more)
+Nodes (20): maskIdCard(), buildBasicExperimentApplicationFields(), buildDefaultApplicationFields(), buildOutboundPilotContextSections(), applicationStatusLabel(), applicationStatusTagType(), cellProductStatusLabel(), cellProductStatusTagType() (+12 more)
 
-### Community 23 - "Community 23"
+### Community 22 - "Community 22"
 Cohesion: 0.07
 Nodes (18): fetchDictDataOptions(), fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList() (+10 more)
 
-### Community 24 - "Community 24"
+### Community 23 - "Community 23"
 Cohesion: 0.1
-Nodes (27): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchReassignProductionTask(), fetchReorderTaskSteps() (+19 more)
+Nodes (24): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitutionProject(), handleAdd(), handleAddItem(), handleDelete(), handleDropdownCommand() (+16 more)
 
-### Community 25 - "Community 25"
+### Community 24 - "Community 24"
 Cohesion: 0.12
 Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
 
+### Community 25 - "Community 25"
+Cohesion: 0.11
+Nodes (11): fetchOutboundReleaseMaterial(), fetchOutboundReleaseReviewDetail(), fetchOutboundReleaseReviewList(), fetchReleaseReviewList(), handleReset(), handleSearch(), handleToggleSelect(), loadData() (+3 more)
+
 ### Community 26 - "Community 26"
-Cohesion: 0.16
-Nodes (14): fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList(), fetchEnvDetectItemsActive(), fetchUpdateEnvDetectItem(), handleAdd(), handleBatchDelete() (+6 more)
+Cohesion: 0.13
+Nodes (18): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleDelete(), handleDropdownCommand(), handleEdit() (+10 more)
 
 ### Community 27 - "Community 27"
-Cohesion: 0.16
-Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
+Cohesion: 0.17
+Nodes (13): fetchClinicalRefundConfirmed(), buildConfirmedParams(), buildPendingParams(), handleConfirmedReset(), handleConfirmedSearch(), handlePendingReset(), handlePendingSearch(), loadAll() (+5 more)
 
 ### Community 28 - "Community 28"
-Cohesion: 0.2
-Nodes (2): ComponentLoader, RouteTransformer
+Cohesion: 0.16
+Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
 
 ### Community 29 - "Community 29"
-Cohesion: 0.27
-Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
+Cohesion: 0.18
+Nodes (10): fetchClinicalReceiptConfirmed(), buildConfirmedParams(), buildPendingParams(), handleConfirmedReset(), handleConfirmedSearch(), handlePendingReset(), handlePendingSearch(), loadAll() (+2 more)
 
 ### Community 30 - "Community 30"
-Cohesion: 0.14
-Nodes (8): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), themeAnimation(), toggleTheme(), toggleTransition()
+Cohesion: 0.27
+Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
 
 ### Community 31 - "Community 31"
-Cohesion: 0.16
-Nodes (5): canDeleteWorkOrder(), canDispatchTask(), canEditWorkOrder(), handleCardSelect(), hasMoreActions()
-
-### Community 32 - "Community 32"
 Cohesion: 0.33
 Nodes (13): buildProtocolPaymentFlowSteps(), dash(), financeReceiptTime(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit() (+5 more)
 
-### Community 33 - "Community 33"
+### Community 32 - "Community 32"
 Cohesion: 0.19
 Nodes (6): fetchServiceOrderTxnList(), handleReset(), handleSearch(), handleTabChange(), loadData(), switchTab()
 
-### Community 35 - "Community 35"
-Cohesion: 0.21
-Nodes (7): handleReset(), handleSearch(), handleToggleSelect(), loadData(), onReviewSubmitted(), rowId(), isSelected()
+### Community 34 - "Community 34"
+Cohesion: 0.18
+Nodes (3): normalizeStepSubTables(), parseEquipmentIds(), syncEquipmentNamesFromOptions()
 
-### Community 36 - "Community 36"
+### Community 35 - "Community 35"
 Cohesion: 0.17
 Nodes (3): fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList()
 
-### Community 37 - "Community 37"
-Cohesion: 0.18
-Nodes (3): normalizeStepSubTables(), parseEquipmentIds(), syncEquipmentNamesFromOptions()
-
-### Community 38 - "Community 38"
+### Community 36 - "Community 36"
 Cohesion: 0.24
 Nodes (6): buildInboundMetaFields(), getCardMetaConfig(), getCardMetaConfigForLegacyTab(), parseReceptionTime(), receptionOver24HoursLabel(), receptionOver24HoursTagType()
 
-### Community 39 - "Community 39"
+### Community 37 - "Community 37"
 Cohesion: 0.42
 Nodes (9): buildPaymentFlowSteps(), dash(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit(), receiptSubmitTime() (+1 more)
 
-### Community 40 - "Community 40"
-Cohesion: 0.29
-Nodes (5): canConfigureWorkOrder(), canDeleteWorkOrder(), canEditRemarkWorkOrder(), canEditTemporaryWorkOrder(), hasMoreWorkOrderActions()
-
-### Community 41 - "Community 41"
+### Community 38 - "Community 38"
 Cohesion: 0.25
 Nodes (2): handleTouchEnd(), setTransition()
 
-### Community 44 - "Community 44"
-Cohesion: 0.28
-Nodes (4): fetchMyProductionMaterialConsumptions(), handleReset(), handleSearch(), loadData()
-
-### Community 45 - "Community 45"
+### Community 41 - "Community 41"
 Cohesion: 0.39
 Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
 
-### Community 46 - "Community 46"
+### Community 42 - "Community 42"
 Cohesion: 0.36
 Nodes (1): TableHeightCalculator
 
-### Community 49 - "Community 49"
+### Community 45 - "Community 45"
 Cohesion: 0.33
 Nodes (2): logApiCryptoBootInfo(), maskSecret()
 
-### Community 50 - "Community 50"
+### Community 46 - "Community 46"
 Cohesion: 0.47
 Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
 
-### Community 52 - "Community 52"
+### Community 48 - "Community 48"
 Cohesion: 0.5
 Nodes (2): formatProtocolDocDeleteConfirm(), formatProtocolDocSubject()
 
-### Community 53 - "Community 53"
+### Community 49 - "Community 49"
 Cohesion: 0.5
 Nodes (2): focusInput(), handleKeydown()
 
-### Community 55 - "Community 55"
+### Community 51 - "Community 51"
 Cohesion: 0.67
 Nodes (2): if(), logSidebarMenu()
 
-### Community 60 - "Community 60"
+### Community 56 - "Community 56"
 Cohesion: 1.0
 Nodes (2): getSettingDefaults(), resetToDefaults()
 
-### Community 62 - "Community 62"
+### Community 58 - "Community 58"
 Cohesion: 1.0
 Nodes (2): copyTextToClipboard(), copyTextWithFallback()
 
 ## Knowledge Gaps
-- **Thin community `Community 17`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
-  Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 28`** (17 nodes): `ComponentLoader`, `.constructor()`, `.createEmptyComponent()`, `.createErrorComponent()`, `.load()`, `.loadIframe()`, `.loadLayout()`, `.load()`, `RouteTransformer`, `.extractFirstSegment()`, `.handleFirstLevelRoute()`, `.handleIframeRoute()`, `.handleNormalRoute()`, `.isFirstLevelRoute()`, `.transform()`, `ComponentLoader.ts`, `RouteTransformer.ts`
+- **Thin community `Community 16`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 41`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
+- **Thin community `Community 38`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
   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 42`** (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 49`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
+- **Thin community `Community 45`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 52`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
+- **Thin community `Community 48`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 53`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
+- **Thin community `Community 49`** (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 55`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
+- **Thin community `Community 51`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 60`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
+- **Thin community `Community 56`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 62`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
+- **Thin community `Community 58`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
   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 `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 14`, `Community 16`, `Community 18`, `Community 22`, `Community 23`, `Community 24`, `Community 26`, `Community 33`, `Community 36`, `Community 44`?**
-  _High betweenness centrality (0.364) - this node is a cross-community bridge._
-- **Why does `push()` connect `Community 5` to `Community 1`, `Community 3`, `Community 4`, `Community 38`, `Community 7`, `Community 6`, `Community 9`, `Community 10`, `Community 8`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 19`, `Community 21`, `Community 22`?**
-  _High betweenness centrality (0.180) - this node is a cross-community bridge._
-- **Why does `fetchNotDeletedRegions()` connect `Community 1` to `Community 5`?**
-  _High betweenness centrality (0.032) - this node is a cross-community bridge._
+- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 14`, `Community 15`, `Community 18`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 25`, `Community 26`, `Community 27`, `Community 29`, `Community 32`, `Community 35`?**
+  _High betweenness centrality (0.362) - this node is a cross-community bridge._
+- **Why does `push()` connect `Community 5` to `Community 1`, `Community 3`, `Community 36`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 17`, `Community 19`, `Community 20`, `Community 21`, `Community 23`?**
+  _High betweenness centrality (0.188) - this node is a cross-community bridge._
+- **Why does `emit()` connect `Community 4` to `Community 0`, `Community 3`, `Community 6`, `Community 7`, `Community 9`, `Community 14`, `Community 18`?**
+  _High betweenness centrality (0.040) - this node is a cross-community bridge._
 - **Are the 260 inferred relationships involving `get()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
   _`get()` has 260 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 62 inferred relationships involving `push()` (e.g. with `collectLeafFacilityNodesInTreeOrder()` and `formatDetectMethods()`) actually correct?**
-  _`push()` has 62 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 63 inferred relationships involving `push()` (e.g. with `collectLeafFacilityNodesInTreeOrder()` and `formatDetectMethods()`) actually correct?**
+  _`push()` has 63 INFERRED edges - model-reasoned connections that need verification._
 - **Are the 26 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleBlur()`) actually correct?**
   _`emit()` has 26 INFERRED edges - model-reasoned connections that need verification._
 - **Should `Community 0` be split into smaller, more focused modules?**

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
web-admin/graphify-out/graph.html


Разница между файлами не показана из-за своего большого размера
+ 112 - 112
web-admin/graphify-out/graph.json


+ 11 - 11
web-admin/graphify-out/manifest.json

@@ -17,8 +17,8 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1781272556.3597305,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1781272556.3601494,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1781272556.3606477,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1781605758.34215,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1781605412.0921795,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1781607727.241396,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1781607713.6896257,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1781272556.364766,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1781272556.3652694,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1781272556.3657222,
@@ -48,17 +48,17 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/fullscreen-loading.ts": 1781272556.3849921,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-material-ui.ts": 1781525352.6976836,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-tabs.ts": 1781600462.9964879,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-card-meta.ts": 1781595914.1273482,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-card-meta.ts": 1781608059.199473,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/router.ts": 1781272556.3875713,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-mine-task-groups.ts": 1781583493.924234,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-mine-task-groups.ts": 1781595945.3450615,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-mine-task-groups.ts": 1781608059.9990764,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-labels.ts": 1781272556.3878465,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts": 1781604158.2285209,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts": 1781595872.8488274,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts": 1781607345.7468734,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/fetch-paged-list.ts": 1781272556.3903377,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sort-order.ts": 1781272556.3913012,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/outbound-qc-pilot-view-sections.ts": 1781566346.7618802,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-groups.ts": 1781595881.1878915,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-groups.ts": 1781607964.911379,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/equipment-select.ts": 1781524048.96866,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/clinical-payment-flow-steps.ts": 1781566916.7893076,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/copy-text.ts": 1781272556.4018052,
@@ -355,7 +355,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue": 1781528130.4755712,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/CompleteProductionTaskDialog.vue": 1781563767.3525257,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskInputEnhancedTable.vue": 1781585388.6972075,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue": 1781585388.6976979,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue": 1781607677.069648,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/SampleReceptionDialog.vue": 1781599793.4040868,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue": 1781588551.0654483,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/EditTaskInfoDialog.vue": 1781577178.2471955,
@@ -405,7 +405,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1781272556.8548205,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1781592807.1040754,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskResultPanel.vue": 1781589482.0890527,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSingleCard.vue": 1781595993.2583652,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSingleCard.vue": 1781607988.3595095,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderFeeSummaryBar.vue": 1781585388.7152023,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSampleGroup.vue": 1781601939.108729,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskSubList.vue": 1781590356.5447705,
@@ -413,7 +413,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue": 1781588255.9076052,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundPilotTab.vue": 1781582034.0446215,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundCellStorageTab.vue": 1781582031.9110096,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue": 1781595942.9077249,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue": 1781608023.8214188,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundBasicExperimentTab.vue": 1781582033.9975233,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundResearchDonationTab.vue": 1781582033.9975069,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/TemporaryTab.vue": 1781582036.0799434,
@@ -423,8 +423,8 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTaskViewSections.ts": 1781589505.5582125,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useInboundQcViewDialog.ts": 1781589515.800703,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcViewAttachmentHelpers.ts": 1781581579.8782947,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/inbound-view-sections.ts": 1781581785.95148,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTabPage.ts": 1781600311.9968688,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/inbound-view-sections.ts": 1781608057.8810816,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTabPage.ts": 1781608043.655311,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/QcWorkOrderSystemViewDialog.vue": 1781589553.6371684,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcProductTable.vue": 1781604200.1464918,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcDiagnosisAttachments.vue": 1781581843.4276094,

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/02b8c97fc8914283ce7c1d16eeac8c9182696741d4a93d46efebde1ceda4cc09.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/1bfc1f5ebeb365205d8deb0a1aee1063b52bc99a52c3d15afc76c820e7d6e743.json


+ 1 - 0
web-admin/src/graphify-out/cache/ast/2572ebd8cf04f5b8d90e8e6a2c0276c3102149c263b0335cc02df7b9e4cb7eea.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_tabs_qcworkordertabpanel_vue", "label": "QcWorkOrderTabPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue", "source_location": "L1"}, {"id": "tabs_qcworkordertabpanel_handlecommand", "label": "handleCommand()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue", "source_location": "L277"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_work_order_tabs_qcworkordertabpanel_vue", "target": "tabs_qcworkordertabpanel_handlecommand", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue", "source_location": "L277", "weight": 1.0}], "raw_calls": [{"caller_nid": "tabs_qcworkordertabpanel_handlecommand", "callee": "handleView", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue", "source_location": "L279"}, {"caller_nid": "tabs_qcworkordertabpanel_handlecommand", "callee": "emit", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue", "source_location": "L282"}]}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/6999fd5bed0e4af259462197dbe59222ed16e8ff4a87494b5af06127c47f83c7.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/7e3f005e51ba75e8e534819e78e33f83804ab70272c0cc1d1f0df091c64e1d99.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/7f8c6523a09db6b79b0ce9be640dbffbf37978f0db9e724e577dccf9ae00908b.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/93198779b12cbdc2d3738b2321dadae8ec56a9a8be78127eed8d7f8ea78cae7e.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web-admin/src/graphify-out/cache/ast/ad40ba8950dd2c31af31467eab81e2b7de33426a346c51949f944e5161c8b1d8.json


+ 1 - 0
web-admin/src/graphify-out/cache/ast/bab838011e8911ae204c84419b8eaa9c7196b35a64bde729f5d7cc0545745d24.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}

+ 1 - 0
web-admin/src/graphify-out/cache/ast/f97d03384a05a0e29420facbe908de57e831cee7d7aad4a9f3a6cb88dc6f0c3c.json

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "label": "DispatchQcWorkOrderDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L83", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L84", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L85", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L86", "weight": 1.0}], "raw_calls": []}

Некоторые файлы не были показаны из-за большого количества измененных файлов