Browse Source

chore: update backend graphify after monthly verify no

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 2 weeks ago
parent
commit
6c66eb164e

File diff suppressed because it is too large
+ 278 - 235
backend/graphify-out/.graphify_analysis.json


File diff suppressed because it is too large
+ 204 - 134
backend/graphify-out/.graphify_extract.json


+ 111 - 118
backend/graphify-out/GRAPH_REPORT.md

@@ -1,11 +1,11 @@
-# Graph Report - app  (2026-10-10)
+# Graph Report - app  (2026-10-13)
 
 ## Corpus Check
-- Large corpus: 291 files · ~344,645 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
+- Large corpus: 308 files · ~369,031 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
 
 ## Summary
-- 5913 nodes · 32444 edges · 44 communities detected
-- Extraction: 32% EXTRACTED · 68% INFERRED · 0% AMBIGUOUS · INFERRED: 22160 edges (avg confidence: 0.6)
+- 6235 nodes · 34205 edges · 43 communities detected
+- Extraction: 32% EXTRACTED · 68% INFERRED · 0% AMBIGUOUS · INFERRED: 23316 edges (avg confidence: 0.6)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -46,260 +46,253 @@
 - [[_COMMUNITY_Community 34|Community 34]]
 - [[_COMMUNITY_Community 35|Community 35]]
 - [[_COMMUNITY_Community 36|Community 36]]
-- [[_COMMUNITY_Community 37|Community 37]]
+- [[_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]]
 
 ## God Nodes (most connected - your core abstractions)
-1. `success_response()` - 820 edges
-2. `error_response()` - 690 edges
-3. `SysUser` - 664 edges
-4. `BizQcTaskResult` - 378 edges
-5. `BizProductionMaterial` - 362 edges
-6. `BizProductionMaterialUsage` - 355 edges
-7. `BizQcMaterialUsage` - 353 edges
-8. `BizQcMaterial` - 343 edges
-9. `BizProductionMaterialStockBatch` - 342 edges
-10. `BizMaterialUsage` - 339 edges
+1. `success_response()` - 825 edges
+2. `error_response()` - 694 edges
+3. `SysUser` - 694 edges
+4. `BizQcTaskResult` - 386 edges
+5. `BizProductionMaterial` - 370 edges
+6. `BizProductionMaterialUsage` - 363 edges
+7. `BizQcMaterialUsage` - 361 edges
+8. `BizQcMaterial` - 351 edges
+9. `BizProductionMaterialStockBatch` - 350 edges
+10. `BizMaterialUsage` - 347 edges
 
 ## Surprising Connections (you probably didn't know these)
 - `统一记录 API 请求/响应出入参的中间件` --uses--> `SysApiRequestLog`  [INFERRED]
   core/api_request_log_middleware.py → models/models.py
-- `get_menu_list()` --calls--> `success_response()`  [INFERRED]
-  api/menu.py → core/response.py
-- `sync_lab_storage_seq_after_use()` --calls--> `generate_uuid()`  [INFERRED]
-  crud/sample_reception_lab_code.py → core/utils.py
-- `中试服务申请单管理 API(申请单、患者信息、输注方案、输注计划、出库联动)` --uses--> `SysUser`  [INFERRED]
-  api/pilot_application.py → models/models.py
-- `一揽子保存:申请单 + 患者信息 + 输注方案 + 输注计划(含细胞产品)` --uses--> `SysUser`  [INFERRED]
-  api/pilot_application.py → models/models.py
+- `create_tasks_from_set()` --calls--> `apply_task_name_placeholders()`  [INFERRED]
+  crud/production_task_set.py → utils/production_task_name_placeholders.py
+- `历史库存变动(biz_material_stock_log,只读)。` --uses--> `SysUser`  [INFERRED]
+  api/material.py → models/models.py
+- `标记领用记录已使用完(盘点登记 / 变动记录)。` --uses--> `SysUser`  [INFERRED]
+  api/material.py → models/models.py
+- `盘点登记:待处理领用记录(未标记已使用完)。` --uses--> `SysUser`  [INFERRED]
+  api/material.py → models/models.py
 
 ## Communities
 
 ### Community 0 - "Community 0"
 Cohesion: 0.01
-Nodes (1101): _assert_user_tenant_access(), attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu() (+1093 more)
+Nodes (1114): _assert_user_tenant_access(), attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu() (+1106 more)
 
 ### Community 1 - "Community 1"
 Cohesion: 0.01
-Nodes (820): list_collection_regions(), BaseSettings, Config, secret_key_must_be_strong(), Settings, generate_uuid(), ApiRequestLogCRUD, delete() (+812 more)
+Nodes (834): BaseSettings, Config, secret_key_must_be_strong(), Settings, generate_uuid(), allocate_next_biz_no(), _format_biz_no(), _prefix_for() (+826 more)
 
 ### Community 2 - "Community 2"
-Cohesion: 0.05
-Nodes (674): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+666 more)
+Cohesion: 0.01
+Nodes (601): GarmentBatchDeleteBody, GarmentBatchDiscardBody, GarmentCreateBody, GarmentDiscardBody, GarmentUpdateBody, SterilizeLogBatchBody, SterilizeLogCreateBody, SterilizeLogUpdateBody (+593 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.01
-Nodes (581): GarmentBatchDeleteBody, GarmentBatchDiscardBody, GarmentCreateBody, GarmentDiscardBody, GarmentUpdateBody, SterilizeLogBatchBody, SterilizeLogCreateBody, SterilizeLogUpdateBody (+573 more)
+Nodes (427): _normalize_date_bound(), create_collection_protocol(), _persist_protocol_sub_resources(), _resolve_consent_form_urls(), _resolve_health_survey_form_urls(), _resolve_protocol_attachments(), update_collection_protocol(), list_ethnics_for_select() (+419 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.02
-Nodes (423): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+415 more)
+Cohesion: 0.07
+Nodes (438): InsuranceCompanyCreateBody, InsuranceCompanyInvoiceCreateBody, InsuranceCompanyInvoiceUpdateBody, InsuranceCompanyUpdateBody, InsuranceProjectPriceCreateBody, InsuranceProjectPriceUpdateBody, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), 小程序菜单:当前用户在「移动端菜单」树下有权限的入口。 (+430 more)
 
 ### Community 5 - "Community 5"
-Cohesion: 0.02
-Nodes (261): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), lookup_attachments_by_urls(), batch_review() (+253 more)
+Cohesion: 0.05
+Nodes (400): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+392 more)
 
 ### Community 6 - "Community 6"
 Cohesion: 0.02
-Nodes (243): _normalize_date_bound(), _persist_protocol_sub_resources(), format_date(), generate_id(), optional_date(), parse_date(), 将字符串 / date / datetime 转为 date 或 None, camel_to_snake() (+235 more)
+Nodes (357): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+349 more)
 
 ### Community 7 - "Community 7"
 Cohesion: 0.02
-Nodes (208): list_ethnics_for_select(), _create_insurance_company(), _create_insurance_company_invoice(), _create_insurance_project_price(), delete_insurance_company(), delete_insurance_company_invoice(), delete_insurance_project_price(), _fmt_dt() (+200 more)
+Nodes (262): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), build_void_type_label_map(), format_protocol_status_label() (+254 more)
 
 ### Community 8 - "Community 8"
 Cohesion: 0.02
-Nodes (168): mp_bind(), mp_bind_status(), 小程序鉴权:微信登录 / 绑定 openid。, 当前用户是否已绑定微信服务号 openid。, 服务号网页授权 code 绑定当前用户(需 Bearer)。, 微信登录:openid 已绑定时可静默换票;否则须授权手机号且与账号 phone_no 一致。, 密码登录后绑定当前微信 openid(需 Bearer)。, _resolve_user_id() (+160 more)
+Nodes (224): api_save_application(), format_date(), join_equipment_ids(), parse_equipment_ids(), 工艺/步骤设备多选:逗号分隔 ID 与名称快照解析, 校验设备列表,返回 (equipment_ids 逗号串, equipment_name 逗号串快照)。, resolve_equipment_list_snapshot(), auto_generate_schedules() (+216 more)
 
 ### Community 9 - "Community 9"
-Cohesion: 0.03
-Nodes (196): AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody, list_storage_slot_stats(), OccupancyCreateBody (+188 more)
+Cohesion: 0.02
+Nodes (127): _error_json(), lifespan(), 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin, 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, sqlalchemy_exception_handler(), unhandled_exception_handler(), BaseHTTPMiddleware, ApiCryptoError (+119 more)
 
 ### Community 10 - "Community 10"
-Cohesion: 0.02
-Nodes (172): api_save_application(), get_protocol_nos_used_in_protocols(), _fmt_dt(), get_handover_by_schedule(), get_outbound_handover(), get_outbound_handover_view(), _handover_row_to_dict(), _handover_view_dict() (+164 more)
+Cohesion: 0.03
+Nodes (155): _save_sample_payments(), deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 耗材变动记录 CRUD(biz_consumable_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减耗材库存并生成变动记录。调用方控制事务,本函数不 commit。 (+147 more)
 
 ### Community 11 - "Community 11"
-Cohesion: 0.04
-Nodes (116): _body_to_payload(), _get_current_user_id(), get_production_reception_detail(), _get_tenant_no(), post_production_reception(), ProductionReceptionBody, put_production_reception(), _resolve_reception_id() (+108 more)
+Cohesion: 0.03
+Nodes (156): AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, create_access_log(), create_storage_slot(), create_uv_disinfect_log(), delete_access_log() (+148 more)
 
 ### Community 12 - "Community 12"
-Cohesion: 0.03
-Nodes (114): build_void_type_label_map(), format_protocol_status_label(), resolve_void_type_label(), 登记步骤物料使用;关联领用记录时不扣减库存。调用方控制事务,本函数不 commit。, register_step_usage_from_requisition(), add_task_step(), _aggregate_production_tab_step_field(), assert_step_assignee_for_write() (+106 more)
+Cohesion: 0.02
+Nodes (134): _register_attachment_routes(), _register_freight_routes(), _register_payment_routes(), _register_presign_routes(), _register_protocol_routes(), _register_sample_routes(), mp_bind_status(), 小程序鉴权:微信登录 / 绑定 openid。 (+126 more)
 
 ### Community 13 - "Community 13"
-Cohesion: 0.05
-Nodes (65): _collect_descendants(), _current_user(), _find_mobile_root(), list_my_mobile_menus(), _mobile_menu_icon(), _mobile_menu_icon_colors(), _user_menu_ids(), _jwt_user_payload() (+57 more)
+Cohesion: 0.03
+Nodes (114): api_detail(), api_get_outbound_handover(), api_list(), api_save_outbound_handover(), _get_tenant_no(), ProductItemBody, UpdateQcStatusBody, UpdateScheduleBody (+106 more)
 
 ### Community 14 - "Community 14"
-Cohesion: 0.06
-Nodes (59): _save_sample_payments(), apply_fq_to_fgd_merge(), assert_sample_payment_structure_editable(), _build_list_summary_row(), _build_periods_array(), _compute_progress_for_payment(), confirm_receipt(), _filter_and_page_progress() (+51 more)
+Cohesion: 0.04
+Nodes (97): get_customer_service_dict(), _get_tenant_no(), _get_current_user_id(), get_sample_insurance(), get_sample_storage_cert(), _get_tenant_no(), put_sample_insurance(), put_sample_storage_cert() (+89 more)
 
 ### Community 15 - "Community 15"
-Cohesion: 0.13
-Nodes (29): _assert_routes_exist(), collect_missing_route_ids(), create_set(), create_set_from_work_order(), create_tasks_from_set(), delete_set(), get_set(), _item_count_map() (+21 more)
+Cohesion: 0.08
+Nodes (62): apply_freight_on_protocol_save(), create_freight(), _enrich_items_maps(), _fmt_dt(), freight_map_for_samples(), _generate_freight_no(), get_freight(), get_freight_detail() (+54 more)
 
 ### Community 16 - "Community 16"
-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)
+Cohesion: 0.09
+Nodes (30): get_designer_data(), list_results_by_task(), _list_saved_results_by_task(), list_saved_results_by_task_ids(), _merge_saved_into_template(), _resolve_task_item_ref(), _row_to_dict(), save_results_for_task() (+22 more)
 
 ### Community 17 - "Community 17"
-Cohesion: 0.13
-Nodes (25): create_customer(), get_customer(), id_card_taken(), list_customers(), 客户 CRUD(biz_customer), _row_to_dict(), soft_delete_customer(), update_customer() (+17 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 18 - "Community 18"
-Cohesion: 0.16
-Nodes (22): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+14 more)
+Cohesion: 0.19
+Nodes (27): _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() (+19 more)
 
 ### Community 19 - "Community 19"
-Cohesion: 0.21
-Nodes (19): _consumable_row_to_dict(), create_process(), _create_sub_consumable(), _create_sub_data_collection(), _create_sub_output(), _create_sub_reagent(), _data_collection_row_to_dict(), get_process() (+11 more)
+Cohesion: 0.17
+Nodes (23): apply_overtime_kit_hours(), _build_rest_day_segments(), _build_workday_windows(), calc_overtime_hours(), _day_at_minutes(), _day_start_ms(), _extract_rules(), _format_ymd() (+15 more)
 
 ### Community 20 - "Community 20"
-Cohesion: 0.21
-Nodes (17): create_protocol_refund_record(), delete_protocol_refund_record(), _get_current_user_id(), _get_tenant_no(), list_protocol_refund_records(), _protocol_accessible(), RefundRecordBody, RefundRecordUpdateBody (+9 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 21 - "Community 21"
-Cohesion: 0.22
-Nodes (15): apply_trip_kit_days(), calc_trip_leg_days(), _day_index(), _end_offset(), _extract_rules(), is_half_day_multiple(), 出差套件:半日制行程时长(与前端 oa-trip-days.ts 对齐), 遍历 tripKit:行程未手改则覆盖 duration;出差天数未手改则覆盖为各行程时长之和。 (+7 more)
+Cohesion: 0.25
+Nodes (15): create_protocol_refund_record(), delete_protocol_refund_record(), _get_current_user_id(), _get_tenant_no(), list_protocol_refund_records(), _protocol_accessible(), update_protocol_refund_record(), create_refund_record() (+7 more)
 
 ### Community 22 - "Community 22"
-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)
+Cohesion: 0.22
+Nodes (15): apply_trip_kit_days(), calc_trip_leg_days(), _day_index(), _end_offset(), _extract_rules(), is_half_day_multiple(), 出差套件:半日制行程时长(与前端 oa-trip-days.ts 对齐), 遍历 tripKit:行程未手改则覆盖 duration;出差天数未手改则覆盖为各行程时长之和。 (+7 more)
 
 ### Community 23 - "Community 23"
-Cohesion: 0.29
-Nodes (11): get_detail(), _load_sample_context(), _row_to_dict(), upsert(), dumps_payload(), empty_detail(), loads_payload(), normalize_payload() (+3 more)
+Cohesion: 0.26
+Nodes (14): apply_leave_kit_hours(), calc_leave_hours(), _extract_rules(), _kit_child_fields(), _overlap_minutes_on_day(), _parse_dt(), _parse_hm(), 请假套件:双段工时重叠小时(与前端 oa-leave-hours.ts 对齐) (+6 more)
 
 ### Community 24 - "Community 24"
-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)
+Cohesion: 0.27
+Nodes (12): _field_label(), _is_empty(), _is_required(), _parse_money(), OA 表单设计器:金额控件 form_data 校验, 校验 form_data 中金额控件的值格式,返回中文错误列表(空表示通过)。, 解析金额值。成功返回 (number, None);失败返回 (None, error_key)。, _rule_props() (+4 more)
 
 ### Community 25 - "Community 25"
-Cohesion: 0.27
-Nodes (11): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。 (+3 more)
+Cohesion: 0.29
+Nodes (11): get_detail(), _load_sample_context(), _row_to_dict(), upsert(), dumps_payload(), empty_detail(), loads_payload(), normalize_payload() (+3 more)
 
 ### Community 26 - "Community 26"
 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)
+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 27 - "Community 27"
 Cohesion: 0.31
 Nodes (10): create_account(), _filtered_query(), get_account(), list_accounts(), list_options(), OA 收款账户 CRUD(oa_receive_account), row_to_dict(), soft_delete_account() (+2 more)
 
 ### Community 28 - "Community 28"
+Cohesion: 0.31
+Nodes (10): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。, _row_to_dict() (+2 more)
+
+### Community 29 - "Community 29"
 Cohesion: 0.29
 Nodes (2): BaseModel, SoftDeleteModel
 
-### Community 29 - "Community 29"
+### 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 30 - "Community 30"
+### Community 31 - "Community 31"
 Cohesion: 0.4
 Nodes (5): batch_matches_stock_status(), normalize_batch_stock_status(), 质检物料入库批次:按剩余数量过滤的语义辅助。, 纯函数判定(供单测);list_batches 用 SQL 等价条件。, 返回 'available' | 'exhausted';全部 / 空 / 非法 → None(不加剩余数量条件)。
 
-### Community 31 - "Community 31"
-Cohesion: 0.6
-Nodes (5): _dec(), _fmt_dt(), list_stock_logs(), _row_to_dict(), _user_nick_name_map()
-
 ### Community 32 - "Community 32"
 Cohesion: 0.5
 Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
 
 ### Community 33 - "Community 33"
 Cohesion: 0.67
-Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)
-
-### Community 34 - "Community 34"
-Cohesion: 0.67
 Nodes (1): 转正套件:入职日 + 试用期月数 → 建议转正日(YYYY-MM-DD)。
 
-### Community 35 - "Community 35"
+### Community 34 - "Community 34"
 Cohesion: 1.0
 Nodes (1): 质检物料金额查看授权:专用角色与菜单权限常量。
 
-### Community 36 - "Community 36"
+### Community 35 - "Community 35"
 Cohesion: 1.0
 Nodes (1): 请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传
 
-### Community 37 - "Community 37"
+### Community 36 - "Community 36"
 Cohesion: 1.0
 Nodes (1): API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)
 
-### Community 40 - "Community 40"
+### Community 39 - "Community 39"
 Cohesion: 1.0
 Nodes (1): 发送订单状态通知                  Args:             openid: 用户openid             ord
 
-### Community 41 - "Community 41"
+### Community 40 - "Community 40"
 Cohesion: 1.0
 Nodes (1): 发送支付成功通知                  Args:             openid: 用户openid             ord
 
-### Community 42 - "Community 42"
+### Community 41 - "Community 41"
 Cohesion: 1.0
 Nodes (1): 发送配送通知                  Args:             openid: 配送员openid             task
 
-### Community 43 - "Community 43"
+### Community 42 - "Community 42"
 Cohesion: 1.0
 Nodes (1): 发送配送时效预警                  Args:             openid: 配送员openid             ta
 
-### Community 44 - "Community 44"
+### Community 43 - "Community 43"
 Cohesion: 1.0
 Nodes (1): 发送退款结果通知                  Args:             openid: 用户openid             ord
 
-### Community 45 - "Community 45"
+### Community 44 - "Community 44"
 Cohesion: 1.0
 Nodes (1): 发送催单通知给配送员                  Args:             deliver_openid: 配送员openid
 
 ## Knowledge Gaps
-- **200 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `加载 RSA 密钥对:优先环境变量,否则使用内置固定默认密钥。` (+195 more)
+- **212 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `严格判断当前租户用户是否拥有指定移动市场权限码。`, `为移动市场 API 提供租户化、精确匹配的菜单权限依赖。` (+207 more)
   These have ≤1 connection - possible missing edges or undocumented components.
-- **Thin community `Community 28`** (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 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 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 34`** (3 nodes): `add_months_ymd()`, `oa_confirmation_date.py`, `转正套件:入职日 + 试用期月数 → 建议转正日(YYYY-MM-DD)。`
+- **Thin community `Community 33`** (3 nodes): `add_months_ymd()`, `oa_confirmation_date.py`, `转正套件:入职日 + 试用期月数 → 建议转正日(YYYY-MM-DD)。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 35`** (2 nodes): `qc_material_amount_auth_constants.py`, `质检物料金额查看授权:专用角色与菜单权限常量。`
+- **Thin community `Community 34`** (2 nodes): `qc_material_amount_auth_constants.py`, `质检物料金额查看授权:专用角色与菜单权限常量。`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 36`** (2 nodes): `context.py`, `请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
+- **Thin community `Community 35`** (2 nodes): `context.py`, `请求级别的用户上下文变量  通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 37`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
+- **Thin community `Community 36`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 40`** (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 41`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 40`** (1 nodes): `发送支付成功通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 42`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
+- **Thin community `Community 41`** (1 nodes): `发送配送通知                  Args:             openid: 配送员openid             task`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 43`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
+- **Thin community `Community 42`** (1 nodes): `发送配送时效预警                  Args:             openid: 配送员openid             ta`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 44`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
+- **Thin community `Community 43`** (1 nodes): `发送退款结果通知                  Args:             openid: 用户openid             ord`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 45`** (1 nodes): `发送催单通知给配送员                  Args:             deliver_openid: 配送员openid`
+- **Thin community `Community 44`** (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 4` to `Community 0`, `Community 1`, `Community 2`, `Community 3`, `Community 5`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 18`, `Community 20`, `Community 24`, `Community 26`?**
-  _High betweenness centrality (0.114) - this node is a cross-community bridge._
-- **Why does `OaEngineError` connect `Community 4` to `Community 1`?**
-  _High betweenness centrality (0.040) - this node is a cross-community bridge._
-- **Why does `generate_uuid()` connect `Community 1` to `Community 0`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`?**
-  _High betweenness centrality (0.039) - this node is a cross-community bridge._
-- **Are the 1046 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
-  _`str` has 1046 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 819 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
-  _`success_response()` has 819 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 689 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
-  _`error_response()` has 689 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 662 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤)  data_scope 值:   1 = 全部数据   2 = 本部门数据   3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
-  _`SysUser` has 662 INFERRED edges - model-reasoned connections that need verification._
+- **Why does `SysUser` connect `Community 5` to `Community 0`, `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 6`, `Community 8`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 16`, `Community 26`?**
+  _High betweenness centrality (0.102) - this node is a cross-community bridge._
+- **Why does `success_response()` connect `Community 0` to `Community 2`, `Community 3`, `Community 8`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 21`?**
+  _High betweenness centrality (0.038) - this node is a cross-community bridge._
+- **Why does `OaEngineError` connect `Community 6` to `Community 0`, `Community 1`, `Community 2`, `Community 5`?**
+  _High betweenness centrality (0.032) - this node is a cross-community bridge._
+- **Are the 1118 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
+  _`str` has 1118 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 824 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
+  _`success_response()` has 824 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 693 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
+  _`error_response()` has 693 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 692 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤)  data_scope 值:   1 = 全部数据   2 = 本部门数据   3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
+  _`SysUser` has 692 INFERRED edges - model-reasoned connections that need verification._

File diff suppressed because it is too large
+ 162 - 108
backend/graphify-out/graph.json


+ 48 - 31
backend/graphify-out/manifest.json

@@ -1,8 +1,9 @@
 {
   "/Users/wuzilong/work/00code/zkxw/backend/app/__init__.py": 1778578257.989357,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/main.py": 1791520627.5289237,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/main.py": 1791860609.7614543,
   "/Users/wuzilong/work/00code/zkxw/backend/app/tasks/__init__.py": 1778579841.437791,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py": 1786415793.4635684,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py": 1791692287.6777437,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/core/mobile_menu_guard.py": 1791642893.5237567,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/api_crypto.py": 1778578258.039314,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/login_crypto.py": 1782186069.0708613,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/config.py": 1790216731.3913553,
@@ -23,7 +24,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/storage.py": 1786527936.515132,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/order_status_compat.py": 1778578258.0426462,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/exceptions.py": 1778578258.0413945,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/core/data_scope.py": 1785663691.2518938,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/core/data_scope.py": 1791643686.8535404,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/admin_request_json.py": 1778578258.038963,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/api_crypto_middleware.py": 1778581508.2309763,
   "/Users/wuzilong/work/00code/zkxw/backend/app/core/wechat_message.py": 1778578258.0458734,
@@ -33,11 +34,11 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py": 1782894693.6389399,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/production_material.py": 1782404882.9262497,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_param.py": 1782379593.174925,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1791603961.4959393,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1791859551.794606,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/cleanroom_garment.py": 1781347080.6165943,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/cn_holiday.py": 1786373798.242758,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/__init__.py": 1791386246.9181905,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py": 1791432129.1135461,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py": 1791864348.7514138,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_material.py": 1787116012.3385794,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/base.py": 1778578258.0821667,
   "/Users/wuzilong/work/00code/zkxw/backend/app/models/clinical_payment.py": 1779834956.9588954,
@@ -63,6 +64,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/inquiry.py": 1778578258.095357,
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/order.py": 1778578258.0960286,
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/__init__.py": 1781502992.2721803,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/market_mobile.py": 1791775353.4940228,
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/order_adjust.py": 1778578258.0963318,
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/cell_product.py": 1782711015.11309,
   "/Users/wuzilong/work/00code/zkxw/backend/app/schemas/menu.py": 1778578258.0957444,
@@ -92,7 +94,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_result.py": 1779255909.8554008,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_inspection_item_template.py": 1786941802.105201,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_stock_batch.py": 1782404955.550011,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/user.py": 1786616084.8158407,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/user.py": 1791693092.544366,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_work_order.py": 1789366011.0738122,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material.py": 1781522283.6438622,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_type.py": 1779265621.5212462,
@@ -113,14 +115,14 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_production_reception.py": 1788159570.8985534,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/reagent.py": 1779512669.9847593,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_inbound_lab_storage_sort.py": 1786959444.2857325,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1791603944.4774525,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1791799767.0891197,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cleanroom_garment.py": 1782264452.4901433,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/temp_qc_target.py": 1787193516.0555077,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_usage.py": 1783428516.0973594,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/biz_no_generator.py": 1779882385.4674172,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/presign_order.py": 1791606023.4116733,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/presign_order.py": 1791799767.087053,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_month_template.py": 1787115871.8303692,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_info_quick_register.py": 1791299727.9118006,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_info_quick_register.py": 1791860152.5581493,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_infusion_confirm.py": 1779828818.7646794,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/reagent_stock_log.py": 1779515479.6599197,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_infusion_schedule_mgmt.py": 1781604486.4315972,
@@ -130,6 +132,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/equipment_snapshot.py": 1781524050.998141,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_entry_sms_notification.py": 1781063498.05542,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/express_company.py": 1781402091.5987046,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer_service_dict.py": 1791859621.720187,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_application.py": 1781079895.8304482,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_lab_test_item.py": 1779265673.3888667,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py": 1783921714.0966582,
@@ -149,10 +152,11 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_region.py": 1791436619.5126424,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_delivery.py": 1779935673.6808827,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_item.py": 1779007909.2933013,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_storage_cert.py": 1791860094.4119813,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/site.py": 1781401290.6845422,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/api_request_log.py": 1778578258.0614743,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py": 1782893595.9312406,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py": 1791517650.4311852,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py": 1791868317.7273736,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_stock_in_no.py": 1787114586.3799527,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/ethnic.py": 1779265849.547566,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_freight.py": 1791468766.6474462,
@@ -168,11 +172,12 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_release_material.py": 1781612877.0137436,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/process.py": 1787621642.2171764,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_service.py": 1781599314.0124536,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1791454064.7945733,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1791648050.9604611,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/workflow.py": 1779265993.677624,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_customer_service.py": 1791860094.4207802,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/oa_receive_account.py": 1785390044.8154407,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_sms_notification.py": 1781063495.0317714,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1788233133.5793514,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1791777806.124801,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable_pack.py": 1779265715.416005,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_inspection_batch.py": 1786011049.96145,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_prep.py": 1781514953.3551314,
@@ -188,20 +193,21 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable_stock_log.py": 1779515477.284446,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dept.py": 1785145511.4446244,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/base.py": 1778578258.062207,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_donation_convert.py": 1779161468.6582925,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py": 1791187386.0011332,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_payment.py": 1791615497.9605725,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_donation_convert.py": 1791786447.2823255,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_insurance.py": 1791860094.3744645,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py": 1791860264.2204025,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_payment.py": 1791799787.7867901,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_item_param.py": 1782380067.962216,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/leave.py": 1779265839.500242,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/output_type.py": 1779265703.7363207,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/exhibition_appointment.py": 1778801075.5211918,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/clinical_payment.py": 1782713876.5518267,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/clinical_payment.py": 1791799767.089836,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/storage_release_review.py": 1787110947.8175044,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/outbound_release_review.py": 1785303263.2759058,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/public.py": 1789710686.7963963,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/public.py": 1791692287.6797194,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py": 1782894693.6582327,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/production_material.py": 1782404982.2474263,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/mini_menu.py": 1789979771.8476667,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/mini_menu.py": 1791861013.3286748,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py": 1787193588.7157009,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/market.py": 1781522283.6823432,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_production_reception.py": 1788159565.164049,
@@ -211,8 +217,10 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/presign_order.py": 1791606023.394863,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_infusion_confirm.py": 1779657043.1389203,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_infusion_schedule_mgmt.py": 1779940938.18027,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/__init__.py": 1791520620.6934447,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/__init__.py": 1791860598.0884578,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/market_mobile.py": 1791712866.1233537,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/storage_entry_sms_notification.py": 1780325524.9170487,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/customer_service_dict.py": 1791859621.7209744,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_application.py": 1781079904.0516074,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pre_transit_sample.py": 1786938943.6929982,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc_sms_notification.py": 1780326875.7886882,
@@ -220,8 +228,9 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/oa_approval.py": 1789977632.0231144,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_refund_record.py": 1790996724.7941585,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/operations.py": 1785213144.2881503,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1791504651.1573102,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1791860293.770292,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_delivery.py": 1779655584.820777,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_cert_insurance.py": 1791860584.54875,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/admin.py": 1790217215.444356,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/env_detect.py": 1786945487.513935,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py": 1783920522.841086,
@@ -236,20 +245,20 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_storage_cert_qc.py": 1791520619.236499,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py": 1781410837.9443986,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py": 1788234236.5398064,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_sample_collection.py": 1791299447.2139852,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_sample_collection.py": 1791860187.4092474,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_sample_payment.py": 1791615498.0325954,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1790217143.1910717,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/clinical_payment.py": 1781750841.074568,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_engine.py": 1789972028.300875,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_info_list_enrich.py": 1791187353.991077,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_period_summary.py": 1791528484.4779947,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_info_list_enrich.py": 1791860245.9007792,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_period_summary.py": 1791799261.7547023,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_overtime_hours.py": 1786373766.5113294,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_callback.py": 1790217147.1955774,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/qc_work_order_fee_summary.py": 1791517006.7566624,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/qc_work_order_fee_summary.py": 1791862731.1926508,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/storage_facility_code.py": 1785213139.8646047,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_person_select.py": 1785401156.2563787,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/qc_work_order_conclusion.py": 1785206750.2532814,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/party_customer_sync.py": 1791454146.9545324,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/party_customer_sync.py": 1791648050.9613898,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_dept_select.py": 1786000695.5043027,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/wechat_mini_auth.py": 1789710434.6386433,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_publish.py": 1786001976.196836,
@@ -258,36 +267,44 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/wx_qr_session.py": 1789710006.0382662,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_transport_mode.py": 1791386325.9832487,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/cn_holiday.py": 1786373910.8580065,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_info_quick_register.py": 1791299380.0357544,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_info_quick_register.py": 1791860094.3744802,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_payment.py": 1791799767.0907419,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_confirmation_date.py": 1785403063.141215,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py": 1785909942.9479194,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py": 1791692287.6755066,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_trip_days.py": 1785407394.0606225,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_payment_installment.py": 1781432208.0765035,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_sample_list_summary.py": 1791187322.7863488,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_related_approval.py": 1787892816.3154016,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/wechat_mp_message.py": 1786689383.1677845,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_leave_hours.py": 1785397787.0493405,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_transfer_status.py": 1791605518.9053025,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/payment_chase.py": 1791531453.7590458,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_transfer_status.py": 1791799767.0946853,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/payment_chase.py": 1791799261.7316206,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_refund_record.py": 1790996661.009547,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_sample.py": 1791712921.0372562,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_schedule_validate.py": 1791539753.4546175,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_info_progress.py": 1791187232.4075856,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_instance_comment.py": 1790052184.171669,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_progress.py": 1791176083.458991,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_progress.py": 1791800781.2391684,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_resignation_kit_sync.py": 1785405020.285242,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/wechat_mp_auth.py": 1786615330.0733685,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_support.py": 1791776868.8753943,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_assignee.py": 1790665524.6969597,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/wechat_login_service.py": 1786615952.6840453,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_protocol.py": 1791868338.353628,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_field_scope.py": 1791651783.1531875,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/customer_relations.py": 1791383150.5354238,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_receive_account.py": 1785390254.4121296,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_presign.py": 1791713904.5883873,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_owner_fields.py": 1785401151.5200977,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_money_field.py": 1785380625.3526123,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_storage_cert_qc.py": 1791520419.7485287,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_pay_mode_switch.py": 1791504357.182062,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_pay_mode_switch.py": 1791799767.094203,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/market_freight.py": 1791712218.0777793,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_post_select.py": 1785394392.5716882,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_wechat_notify.py": 1789108034.959046,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_confirmation_kit_sync.py": 1785403667.4270058,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_payment_fgd_convert.py": 1791525433.8399634,
   "/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_formula.py": 1785145511.513383,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/services/sample_customer_service_register.py": 1791860136.2147195,
   "/Users/wuzilong/work/00code/zkxw/backend/app/ws/__init__.py": 1778578258.105995
 }

File diff suppressed because it is too large
+ 369 - 543
web-admin/graphify-out/.graphify_analysis.json


File diff suppressed because it is too large
+ 232 - 141
web-admin/graphify-out/.graphify_extract.json


+ 120 - 115
web-admin/graphify-out/GRAPH_REPORT.md

@@ -1,11 +1,11 @@
-# Graph Report - src  (2026-10-10)
+# Graph Report - src  (2026-10-13)
 
 ## Corpus Check
-- Large corpus: 1026 files · ~680,890 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
+- Large corpus: 1032 files · ~683,796 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
 
 ## Summary
-- 3839 nodes · 5656 edges · 61 communities detected
-- Extraction: 76% EXTRACTED · 24% INFERRED · 0% AMBIGUOUS · INFERRED: 1353 edges (avg confidence: 0.8)
+- 3851 nodes · 5658 edges · 62 communities detected
+- Extraction: 76% EXTRACTED · 24% INFERRED · 0% AMBIGUOUS · INFERRED: 1351 edges (avg confidence: 0.8)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -52,8 +52,8 @@
 - [[_COMMUNITY_Community 40|Community 40]]
 - [[_COMMUNITY_Community 41|Community 41]]
 - [[_COMMUNITY_Community 42|Community 42]]
-- [[_COMMUNITY_Community 44|Community 44]]
-- [[_COMMUNITY_Community 46|Community 46]]
+- [[_COMMUNITY_Community 43|Community 43]]
+- [[_COMMUNITY_Community 45|Community 45]]
 - [[_COMMUNITY_Community 47|Community 47]]
 - [[_COMMUNITY_Community 50|Community 50]]
 - [[_COMMUNITY_Community 51|Community 51]]
@@ -64,20 +64,21 @@
 - [[_COMMUNITY_Community 58|Community 58]]
 - [[_COMMUNITY_Community 61|Community 61]]
 - [[_COMMUNITY_Community 62|Community 62]]
-- [[_COMMUNITY_Community 67|Community 67]]
-- [[_COMMUNITY_Community 71|Community 71]]
-- [[_COMMUNITY_Community 75|Community 75]]
-- [[_COMMUNITY_Community 88|Community 88]]
-- [[_COMMUNITY_Community 91|Community 91]]
+- [[_COMMUNITY_Community 64|Community 64]]
+- [[_COMMUNITY_Community 68|Community 68]]
+- [[_COMMUNITY_Community 73|Community 73]]
+- [[_COMMUNITY_Community 77|Community 77]]
+- [[_COMMUNITY_Community 89|Community 89]]
 - [[_COMMUNITY_Community 92|Community 92]]
+- [[_COMMUNITY_Community 93|Community 93]]
 
 ## God Nodes (most connected - your core abstractions)
-1. `get()` - 339 edges
+1. `get()` - 342 edges
 2. `push()` - 128 edges
-3. `Number()` - 103 edges
-4. `emit()` - 36 edges
+3. `Number()` - 102 edges
+4. `emit()` - 35 edges
 5. `WebSocketClient` - 26 edges
-6. `set()` - 22 edges
+6. `set()` - 23 edges
 7. `withFullscreenLoading()` - 20 edges
 8. `handleDynamicRoutes()` - 20 edges
 9. `onPick()` - 18 edges
@@ -91,9 +92,9 @@
 - `isStorageSlotAvailable()` --calls--> `Number()`  [INFERRED]
   utils/storage-slot-options.ts → views/cell-storage/payment-info/PaymentBySampleTab.vue
 - `handleBatchDelete()` --calls--> `withFullscreenLoading()`  [INFERRED]
-  views/operations/exhibition-appointment/index.vue → utils/fullscreen-loading.ts
+  views/system/tenant/index.vue → utils/fullscreen-loading.ts
 - `handleBatchDelete()` --calls--> `withFullscreenLoading()`  [INFERRED]
-  views/basic-info/cell-sample-type/index.vue → utils/fullscreen-loading.ts
+  views/system/unit/index.vue → utils/fullscreen-loading.ts
 
 ## Communities
 
@@ -103,180 +104,180 @@ Nodes (214): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fe
 
 ### Community 1 - "Community 1"
 Cohesion: 0.02
-Nodes (153): fetchDeptTree(), fetchUserList(), fetchUploadAttachment(), fetchOaFlowPreview(), fetchOaTemplateDetail(), FireworkSystem, handleReportUpload(), handleReportUpload() (+145 more)
+Nodes (165): fetchNotDeletedRegions(), fetchRegionList(), fetchUploadAttachment(), FireworkSystem, handleReportUpload(), handleReportUpload(), walk(), if() (+157 more)
 
 ### Community 2 - "Community 2"
 Cohesion: 0.02
-Nodes (142): fetchSamplePaymentDetail(), handleFocus(), handleInput(), if(), buildPreviewRow(), findEarliestConfirmableSchedule(), fullFileUrl(), handleAttachPreview() (+134 more)
+Nodes (109): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCollectionRegionList(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchCreateCollectionRegion(), fetchCreateHospital() (+101 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.02
-Nodes (106): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), buildTemporaryViewSections(), buildInsertedSiblingCard(), fetchMineTasksForWorkOrders(), resolveShowProtocolPaymentAtGroup() (+98 more)
+Nodes (86): handleBlur(), handleFocus(), handleInput(), fetchConfirmPresignTransfer(), fetchPresignOrderDetail(), fetchPresignOrderList(), fetchPresignTransferReceiptConfirmedList(), fetchPresignTransferReceiptConfirmList() (+78 more)
 
 ### Community 4 - "Community 4"
 Cohesion: 0.02
-Nodes (89): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), fetchPilotCheckupList(), fetchUpdatePostBoundRoles() (+81 more)
+Nodes (72): fetchBatchDeleteOaReceiveAccounts(), fetchBatchMarkOaCcTasksRead(), fetchCreateOaReceiveAccount(), fetchDeleteOaReceiveAccount(), fetchMarkOaCcTaskRead(), fetchOaAppDraft(), fetchOaCcUnreadCount(), fetchOaFormAttachments() (+64 more)
 
 ### Community 5 - "Community 5"
 Cohesion: 0.02
-Nodes (71): fetchBatchDeleteOaReceiveAccounts(), fetchBatchMarkOaCcTasksRead(), fetchCreateOaReceiveAccount(), fetchDeleteOaReceiveAccount(), fetchMarkOaCcTaskRead(), fetchOaAppDraft(), fetchOaCcUnreadCount(), fetchOaFormAttachments() (+63 more)
+Nodes (69): fetchProductionWasteOutputList(), fetchCreateSampleFreight(), fetchLinkSampleFreight(), fetchSampleFreightDetail(), fetchSampleFreightList(), fetchSampleFreightSampleOptions(), fetchUpdateSampleFreight(), fetchProductionReceptionBySampleCode() (+61 more)
 
 ### Community 6 - "Community 6"
 Cohesion: 0.03
-Nodes (71): collectIds(), buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTransportSection(), resolveInboundProtocolStatus(), buildBaseFields() (+63 more)
+Nodes (89): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), fetchPilotCheckupList(), markPilotCheckupChecked() (+81 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.02
-Nodes (82): handleBlur(), handleFocus(), handleInput(), fetchProtocolInvoicePendingCount(), fetchConfirmPresignTransfer(), fetchPresignOrderDetail(), fetchPresignOrderList(), fetchPresignTransferReceiptConfirmedList() (+74 more)
+Cohesion: 0.03
+Nodes (51): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchUpdateProfile(), fetchUploadProfileAvatar(), fetchWxQrStatus(), useSettingsHandlers() (+43 more)
 
 ### Community 8 - "Community 8"
-Cohesion: 0.02
-Nodes (81): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchCreateItemUnit(), fetchCreateTenant(), fetchDeleteItemUnit() (+73 more)
+Cohesion: 0.03
+Nodes (68): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), fetchMineTasksForWorkOrders(), useInboundSiblingNavigation(), shouldApplyTriggerSourceFilter(), useQcWorkOrderTabPage() (+60 more)
 
 ### Community 9 - "Community 9"
 Cohesion: 0.03
-Nodes (49): fetchProductionWasteOutputList(), fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), fetchSampleStorageCertQc(), saveSampleStorageCertQc(), handleDialogClose(), onAdd() (+41 more)
+Nodes (59): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTemporaryViewSections(), buildTransportSection(), resolveInboundProtocolStatus(), buildInsertedSiblingCard() (+51 more)
 
 ### Community 10 - "Community 10"
 Cohesion: 0.03
-Nodes (59): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator, useCeremony(), useTheme(), if(), nodeSummary() (+51 more)
+Nodes (59): if(), addDispatchItem(), createDispatchItem(), seedRouteOptionsFromItems(), handleSiblingLinkClick(), resolveInboundWorkOrderCardTitle(), companyProgressTagType(), companyProgressText() (+51 more)
 
 ### Community 11 - "Community 11"
-Cohesion: 0.03
-Nodes (33): fetchGetMenuList(), ComponentLoader, IframeRouteManager, MenuProcessor, RouteRegistry, RouteTransformer, useAppMode(), useAuth() (+25 more)
+Cohesion: 0.04
+Nodes (49): buildBaseFields(), buildFeeSection(), buildInboundBasicSection(), buildInboundCellStorageProductionViewSections(), buildInboundResearchDonationProductionViewSections(), buildOutboundBasicExperimentProductionViewSections(), buildOutboundClinicalProductionViewSections(), buildOutboundDetail() (+41 more)
 
 ### Community 12 - "Community 12"
 Cohesion: 0.04
-Nodes (54): fetchDictDataOptions(), fetchAttachmentDownloadUrl(), qcAttachmentFullUrl(), qcDownloadAttachment(), qcPreviewAttachment(), handleDownloadAttachment(), attachmentFullUrl(), dash() (+46 more)
+Nodes (69): fetchDeptTree(), fetchUserList(), fetchOaFlowPreview(), fetchOaTemplateDetail(), openForDraft(), remoteSearchHandoverUsers(), applySchema(), flowNeedsInitiatorSelect() (+61 more)
 
 ### Community 13 - "Community 13"
-Cohesion: 0.03
-Nodes (33): fetchCollectionProtocolList(), fetchProductionWorkOrderQcInfo(), fetchUpdateFullmoonHandle(), fetchUpdateStorageCertHandle(), dash(), fmtMoney(), auditorDisplay(), dash() (+25 more)
+Cohesion: 0.04
+Nodes (48): fetchDictDataOptions(), fetchAttachmentDownloadUrl(), qcAttachmentFullUrl(), qcDownloadAttachment(), qcPreviewAttachment(), handleDownloadAttachment(), attachmentFullUrl(), dash() (+40 more)
 
 ### Community 14 - "Community 14"
-Cohesion: 0.04
-Nodes (57): fetchCollectionRegionList(), fetchCreateCollectionRegion(), fetchCreateHospital(), fetchCreateRegionStaff(), fetchDeleteCollectionRegion(), fetchDeleteHospital(), fetchDeleteRegionStaff(), fetchHospitalList() (+49 more)
+Cohesion: 0.03
+Nodes (28): fetchCollectionProtocolList(), fetchSampleInsurance(), fetchSampleStorageCert(), fetchUpdateSampleStorageCert(), dash(), fmtMoney(), auditorDisplay(), dash() (+20 more)
 
 ### Community 15 - "Community 15"
-Cohesion: 0.05
-Nodes (54): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchRefreshToken(), fetchUpdateProfile(), fetchUploadProfileAvatar(), fetchWxQrStatus(), toLogin() (+46 more)
+Cohesion: 0.04
+Nodes (51): fetchCreateItemUnit(), fetchCreateMenu(), fetchCreateTenant(), fetchDeleteItemUnit(), fetchDeleteMenu(), fetchDeleteTenant(), fetchItemUnitList(), fetchMenuTree() (+43 more)
 
 ### Community 16 - "Community 16"
-Cohesion: 0.04
-Nodes (40): fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList(), fetchMyMaterialUsageList() (+32 more)
+Cohesion: 0.05
+Nodes (60): fetchOaRelatedSummaries(), buildFormRows(), buildOaPrintFilename(), buildOaPrintModel(), canvasToPdf(), ensurePlainObject(), exportOaApprovalPdf(), extractUrls() (+52 more)
 
 ### Community 17 - "Community 17"
-Cohesion: 0.05
-Nodes (54): fetchOaRelatedSummaries(), buildFormRows(), buildOaPrintFilename(), buildOaPrintModel(), canvasToPdf(), ensurePlainObject(), exportOaApprovalPdf(), extractUrls() (+46 more)
+Cohesion: 0.04
+Nodes (38): fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList(), fetchMyMaterialUsageList() (+30 more)
 
 ### Community 18 - "Community 18"
-Cohesion: 0.05
-Nodes (34): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+26 more)
+Cohesion: 0.04
+Nodes (43): fetchUpdatePostBoundRoles(), fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderQcInfo() (+35 more)
 
 ### Community 19 - "Community 19"
+Cohesion: 0.04
+Nodes (35): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+27 more)
+
+### Community 20 - "Community 20"
 Cohesion: 0.05
 Nodes (39): fetchCreateQcInspectionItemTemplate(), fetchDeleteQcInspectionItemTemplate(), fetchQcInspectionItemTemplateDetail(), fetchQcInspectionItemTemplateList(), fetchQcInspectionItemTemplatesActive(), fetchUpdateQcInspectionItemTemplate(), fetchQcLabTestItemList(), fetchQcLabTestItemsActive() (+31 more)
 
-### Community 20 - "Community 20"
+### Community 21 - "Community 21"
 Cohesion: 0.06
-Nodes (43): completePilotApplication(), deletePilotApplication(), fetchCreateExhibitionAppointment(), fetchDeleteExhibitionAppointment(), fetchExhibitionAppointmentList(), fetchPilotApplicationList(), fetchUpdateExhibitionAppointment(), startPilotApplication() (+35 more)
+Nodes (42): completePilotApplication(), deletePilotApplication(), fetchCreateExhibitionAppointment(), fetchDeleteExhibitionAppointment(), fetchExhibitionAppointmentList(), fetchPilotApplicationList(), fetchUpdateExhibitionAppointment(), startPilotApplication() (+34 more)
 
-### Community 21 - "Community 21"
+### Community 22 - "Community 22"
 Cohesion: 0.06
 Nodes (25): fetchQcMaterialBatchDetail(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), financeAttachmentsToUrlString() (+17 more)
 
-### Community 22 - "Community 22"
+### Community 23 - "Community 23"
 Cohesion: 0.06
 Nodes (26): fetchProductionTaskList(), createEmptySnapshots(), normalizeConfiguredReagents(), normalizeConsumables(), normalizeDataCollections(), normalizeReagents(), normalizeStepOutputs(), serializeAttachments() (+18 more)
 
-### Community 23 - "Community 23"
+### Community 24 - "Community 24"
 Cohesion: 0.1
 Nodes (2): WebSocketClient, TableCache
 
-### Community 24 - "Community 24"
-Cohesion: 0.09
-Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
-
 ### Community 25 - "Community 25"
-Cohesion: 0.09
-Nodes (29): fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit(), fetchReassignProductionTask() (+21 more)
+Cohesion: 0.08
+Nodes (33): fetchRefreshToken(), toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url() (+25 more)
 
 ### Community 26 - "Community 26"
-Cohesion: 0.08
-Nodes (22): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderTabStepCounts(), fetchProductionWorkOrderTabStepCountsDeduped() (+14 more)
+Cohesion: 0.09
+Nodes (34): formatDueDate(), formatDueDate(), buildPaymentFlowSteps(), dash(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit() (+26 more)
 
 ### Community 27 - "Community 27"
-Cohesion: 0.09
-Nodes (22): fetchOaAppList(), fetchOaGroupList(), fetchPublishOaApp(), loadData(), loadGroups(), resetForm(), onSuccess(), goBack() (+14 more)
+Cohesion: 0.08
+Nodes (12): ComponentLoader, IframeRouteManager, RouteTransformer, getFirstMenuPath(), getFirstSecondLevelMenuPath(), isIframe(), isNavigableMenuItem(), isWorkbenchMenuItem() (+4 more)
 
 ### Community 28 - "Community 28"
-Cohesion: 0.08
-Nodes (17): fetchEthnicList(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), loadEthnicOptions(), normalizeSampleRow(), resetForm() (+9 more)
+Cohesion: 0.09
+Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
 
 ### Community 29 - "Community 29"
 Cohesion: 0.09
-Nodes (12): fetchMineQcWorkOrderTabUnfinishedCounts(), fetchOutboundQcDetail(), fetchQcWorkOrderDetail(), fetchQcWorkOrderList(), fetchQcWorkOrdersBySample(), fetchQcWorkOrderTabUnfinishedCounts(), reload(), reloadTabCounts() (+4 more)
+Nodes (29): fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit(), fetchReassignProductionTask() (+21 more)
 
 ### Community 30 - "Community 30"
-Cohesion: 0.12
-Nodes (17): fetchCreateSampleFreight(), fetchLinkSampleFreight(), fetchSampleFreightDetail(), fetchSampleFreightList(), fetchSampleFreightSampleOptions(), fetchUpdateSampleFreight(), clearSampleSelection(), handleSampleSearch() (+9 more)
+Cohesion: 0.09
+Nodes (22): fetchOaAppList(), fetchOaGroupList(), fetchPublishOaApp(), loadData(), loadGroups(), resetForm(), onSuccess(), goBack() (+14 more)
 
 ### Community 31 - "Community 31"
-Cohesion: 0.13
-Nodes (19): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), postorder(), preorder(), applyTreeExpand(), handleAdd() (+11 more)
+Cohesion: 0.09
+Nodes (16): fetchEthnicList(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), loadEthnicOptions(), normalizeSampleRow(), resetForm() (+8 more)
 
 ### Community 32 - "Community 32"
-Cohesion: 0.1
-Nodes (12): fetchOutboundReleaseMaterial(), fetchOutboundReleaseReviewDetail(), fetchOutboundReleaseReviewList(), fetchReleaseReviewList(), handleReset(), handleSearch(), handleTabChange(), handleToggleSelect() (+4 more)
+Cohesion: 0.09
+Nodes (12): fetchMineQcWorkOrderTabUnfinishedCounts(), fetchOutboundQcDetail(), fetchQcWorkOrderDetail(), fetchQcWorkOrderList(), fetchQcWorkOrdersBySample(), fetchQcWorkOrderTabUnfinishedCounts(), reload(), reloadTabCounts() (+4 more)
 
 ### Community 33 - "Community 33"
-Cohesion: 0.13
-Nodes (19): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleBatchDelete(), handleDelete(), handleDropdownCommand() (+11 more)
+Cohesion: 0.1
+Nodes (12): fetchOutboundReleaseMaterial(), fetchOutboundReleaseReviewDetail(), fetchOutboundReleaseReviewList(), fetchReleaseReviewList(), handleReset(), handleSearch(), handleTabChange(), handleToggleSelect() (+4 more)
 
 ### Community 34 - "Community 34"
 Cohesion: 0.12
 Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
 
 ### Community 35 - "Community 35"
+Cohesion: 0.13
+Nodes (18): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleDelete(), handleDropdownCommand(), handleEdit() (+10 more)
+
+### Community 36 - "Community 36"
+Cohesion: 0.13
+Nodes (8): chipTitle(), confirmPicker(), memberOptionLabel(), removeUser(), resolveUser(), signBadge(), signBadgeText(), updateSelect()
+
+### Community 37 - "Community 37"
 Cohesion: 0.2
 Nodes (14): applyFlagToRule(), applySchema(), countRules(), getActiveRule(), getDesigner(), getSetupState(), onMessage(), readFlag() (+6 more)
 
-### Community 36 - "Community 36"
+### Community 38 - "Community 38"
 Cohesion: 0.16
 Nodes (14): fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList(), fetchEnvDetectItemsActive(), fetchUpdateEnvDetectItem(), handleAdd(), handleBatchDelete() (+6 more)
 
-### Community 37 - "Community 37"
+### Community 39 - "Community 39"
 Cohesion: 0.12
 Nodes (6): setupOaConfirmationKit(), ensureOaKitMenu(), setupOaLeaveKit(), setupOaOvertimeKit(), setupOaResignationKit(), setupOaTripKit()
 
-### Community 38 - "Community 38"
+### Community 40 - "Community 40"
 Cohesion: 0.16
 Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
 
-### Community 39 - "Community 39"
+### Community 41 - "Community 41"
 Cohesion: 0.27
 Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
 
-### Community 40 - "Community 40"
-Cohesion: 0.33
-Nodes (13): buildProtocolPaymentFlowSteps(), dash(), financeReceiptTime(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit() (+5 more)
-
-### Community 41 - "Community 41"
+### Community 42 - "Community 42"
 Cohesion: 0.19
 Nodes (6): fetchServiceOrderTxnList(), handleReset(), handleSearch(), handleTabChange(), loadData(), switchTab()
 
-### Community 42 - "Community 42"
+### Community 43 - "Community 43"
 Cohesion: 0.24
 Nodes (10): buildPrintDocumentHtml(), cleanupPrintIframe(), embedSopImagesAsDataUrls(), getSopA4ContentHeightPx(), getSopA4EditorHeightPx(), normalizeSopCheckboxes(), prepareSopHtmlForPrint(), printSopHtml() (+2 more)
 
-### Community 44 - "Community 44"
+### Community 45 - "Community 45"
 Cohesion: 0.25
 Nodes (2): handleTouchEnd(), setTransition()
 
-### Community 46 - "Community 46"
-Cohesion: 0.28
-Nodes (5): fetchMyProductionMaterialConsumptions(), displayConsumptionQty(), handleReset(), handleSearch(), loadData()
-
 ### Community 47 - "Community 47"
 Cohesion: 0.28
 Nodes (4): isActiveHistoryInstance(), isUploadPreviewLabel(), previewColumnMinWidth(), syncWorktabTitle()
@@ -294,8 +295,8 @@ Cohesion: 0.33
 Nodes (2): logApiCryptoBootInfo(), maskSecret()
 
 ### Community 54 - "Community 54"
-Cohesion: 0.29
-Nodes (1): fetchQcMonthTemplateList()
+Cohesion: 0.38
+Nodes (4): handleFocus(), handleInput(), parseDecimalToNumber(), sanitizeDecimalInput()
 
 ### Community 55 - "Community 55"
 Cohesion: 0.4
@@ -317,41 +318,43 @@ Nodes (2): isCurrentPending(), isNotReached()
 Cohesion: 0.67
 Nodes (2): if(), logSidebarMenu()
 
-### Community 67 - "Community 67"
+### Community 64 - "Community 64"
+Cohesion: 0.5
+Nodes (1): fetchStorageEntrySmsList()
+
+### Community 68 - "Community 68"
 Cohesion: 1.0
 Nodes (2): getSettingDefaults(), resetToDefaults()
 
-### Community 71 - "Community 71"
+### Community 73 - "Community 73"
 Cohesion: 1.0
 Nodes (2): copyTextToClipboard(), copyTextWithFallback()
 
-### Community 75 - "Community 75"
+### Community 77 - "Community 77"
 Cohesion: 1.0
 Nodes (2): getSourceProtocolAttachment(), normalizeAttachmentFiles()
 
-### Community 88 - "Community 88"
+### Community 89 - "Community 89"
 Cohesion: 1.0
 Nodes (2): emptyTabCounts(), useProductionWorkOrderTabStepCounts()
 
-### Community 91 - "Community 91"
+### Community 92 - "Community 92"
 Cohesion: 1.0
 Nodes (2): initialProgress(), useQcWorkOrderAttachmentExport()
 
-### Community 92 - "Community 92"
+### Community 93 - "Community 93"
 Cohesion: 1.0
 Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
 
 ## Knowledge Gaps
-- **Thin community `Community 23`** (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`
+- **Thin community `Community 24`** (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 44`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
+- **Thin community `Community 45`** (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 51`** (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 53`** (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 54`** (7 nodes): `fetchConfirmQcMonthImport()`, `fetchCreateQcMonthTemplate()`, `fetchDeleteQcMonthTemplate()`, `fetchPreviewQcMonthImport()`, `fetchQcMonthTemplateList()`, `fetchUpdateQcMonthTemplate()`, `qc-material-month-template.ts`
-  Too small to be a meaningful cluster - may be noise or needs more connections extracted.
 - **Thin community `Community 55`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
 - **Thin community `Community 56`** (5 nodes): `equipmentOptionLabel()`, `joinEquipmentIds()`, `parseEquipmentIds()`, `syncEquipmentNamesFromOptions()`, `equipment-select.ts`
@@ -362,33 +365,35 @@ Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
 - **Thin community `Community 62`** (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 67`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
+- **Thin community `Community 64`** (4 nodes): `fetchGenerateStorageEntrySms()`, `fetchStorageEntrySmsList()`, `fetchToggleStorageEntrySmsNotified()`, `storage-entry-sms-notification.ts`
+  Too small to be a meaningful cluster - may be noise or needs more connections extracted.
+- **Thin community `Community 68`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 71`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
+- **Thin community `Community 73`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 75`** (3 nodes): `getSourceProtocolAttachment()`, `normalizeAttachmentFiles()`, `protocol-source-attachment.ts`
+- **Thin community `Community 77`** (3 nodes): `getSourceProtocolAttachment()`, `normalizeAttachmentFiles()`, `protocol-source-attachment.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 88`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
+- **Thin community `Community 89`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 91`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
+- **Thin community `Community 92`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 92`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
+- **Thin community `Community 93`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.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 7`, `Community 8`, `Community 9`, `Community 10`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 36`, `Community 41`, `Community 46`, `Community 54`?**
-  _High betweenness centrality (0.264) - this node is a cross-community bridge._
-- **Why does `push()` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 12`, `Community 13`, `Community 15`, `Community 16`, `Community 17`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 25`, `Community 26`, `Community 27`, `Community 29`?**
-  _High betweenness centrality (0.239) - this node is a cross-community bridge._
-- **Why does `Number()` connect `Community 2` to `Community 0`, `Community 1`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 13`, `Community 15`, `Community 16`, `Community 17`, `Community 21`, `Community 22`, `Community 28`, `Community 30`, `Community 39`, `Community 40`, `Community 46`?**
-  _High betweenness centrality (0.192) - this node is a cross-community bridge._
-- **Are the 338 inferred relationships involving `get()` (e.g. with `resolveStorageSlotRangeFill()` and `buildNodeCodePathFromFlat()`) actually correct?**
-  _`get()` has 338 INFERRED edges - model-reasoned connections that need verification._
+- **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 12`, `Community 13`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 35`, `Community 38`, `Community 42`, `Community 64`?**
+  _High betweenness centrality (0.272) - this node is a cross-community bridge._
+- **Why does `push()` connect `Community 1` to `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 17`, `Community 18`, `Community 20`, `Community 21`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 29`, `Community 30`, `Community 32`, `Community 36`?**
+  _High betweenness centrality (0.257) - this node is a cross-community bridge._
+- **Why does `Number()` connect `Community 1` to `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 14`, `Community 16`, `Community 17`, `Community 22`, `Community 23`, `Community 25`, `Community 26`, `Community 31`, `Community 41`, `Community 54`?**
+  _High betweenness centrality (0.179) - this node is a cross-community bridge._
+- **Are the 341 inferred relationships involving `get()` (e.g. with `resolveStorageSlotRangeFill()` and `buildNodeCodePathFromFlat()`) actually correct?**
+  _`get()` has 341 INFERRED edges - model-reasoned connections that need verification._
 - **Are the 127 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
   _`push()` has 127 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 98 inferred relationships involving `Number()` (e.g. with `slotOrderNum()` and `isSlotAvailable()`) actually correct?**
-  _`Number()` has 98 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 35 inferred relationships involving `emit()` (e.g. with `updateSamples()` and `notifyChanged()`) actually correct?**
-  _`emit()` has 35 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 97 inferred relationships involving `Number()` (e.g. with `slotOrderNum()` and `isSlotAvailable()`) actually correct?**
+  _`Number()` has 97 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 34 inferred relationships involving `emit()` (e.g. with `updateSamples()` and `notifyChanged()`) actually correct?**
+  _`emit()` has 34 INFERRED edges - model-reasoned connections that need verification._

File diff suppressed because it is too large
+ 1 - 1
web-admin/graphify-out/graph.html


File diff suppressed because it is too large
+ 112 - 112
web-admin/graphify-out/graph.json


+ 45 - 39
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": 1791623130.219415,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1791623111.7933967,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1791855138.6081727,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1791855121.5676157,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1787887312.735774,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1787887320.8486114,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentActions.ts": 1788162977.6691713,
@@ -45,7 +45,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-menu-badge.ts": 1782396392.0954244,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-production-reception-fields.test.ts": 1788159504.2955287,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/patch-el-select-filterable.ts": 1781272556.3791182,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-sample-payment.test.ts": 1791602181.2131088,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-sample-payment.test.ts": 1791799680.9704125,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-range-fill.ts": 1785235070.1226468,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts": 1785235070.1219137,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-value-display.ts": 1786364516.517105,
@@ -86,10 +86,10 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-freight-flatten.ts": 1791468382.3859549,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-labels.ts": 1782893910.9937537,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print-flow.ts": 1786601489.1530275,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts": 1791504447.1470554,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts": 1791800783.158462,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts": 1788234947.3617282,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/fetch-paged-list.ts": 1781272556.3903377,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-audit-flatten.ts": 1791517102.258915,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-audit-flatten.ts": 1791868355.944149,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-owner-person.ts": 1785401005.1552768,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-menu-badge.ts": 1785990724.1404996,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-receive-account.ts": 1785390573.9898896,
@@ -123,6 +123,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-overtime-hours.ts": 1786373623.0874693,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-leave-kit.ts": 1785488971.141004,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-step-badge.ts": 1783307221.345424,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-freight-config-guard.ts": 1791784010.7375543,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-owner-field-defaults.ts": 1785401266.0298183,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-inbound-sample-cards.ts": 1786958660.8933563,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sanitize-html.ts": 1790217233.924453,
@@ -171,7 +172,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-labels.ts": 1785206799.7537315,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-step-assignee.ts": 1782472559.244021,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/process-material-ui.ts": 1785243503.4279134,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-fq-params-change.ts": 1781687645.2065177,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-fq-params-change.ts": 1791799710.1024482,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-leave-kit-runtime.ts": 1785398692.446228,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts": 1785145511.866446,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-flow-steps.ts": 1791162210.6796443,
@@ -181,18 +182,19 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/loginRsa.ts": 1781272556.4129546,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/chinese-datetime-parse.ts": 1782958233.483039,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-task-editor-cache.ts": 1782602746.754815,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts": 1785145536.399596,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-pay-mode-switch.ts": 1791799709.3673208,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-progress-merge-comments.ts": 1790044349.0062284,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-resignation-kit-runtime.ts": 1785405017.8343015,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-audit-flatten.test.ts": 1791517334.8909705,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-audit-flatten.test.ts": 1791868361.7182913,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-progress-person-lines.ts": 1786600724.5366488,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-sample-payment.ts": 1791602203.9183865,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-sample-payment.ts": 1791799708.4315357,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-person.ts": 1785385009.8220263,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-post-select-rule.ts": 1785394334.9268312,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-installment.ts": 1783329873.2829163,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-source-attachment.ts": 1783921716.666595,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/download-attachment.ts": 1781272556.4160507,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-flow-preview-refresh.test.ts": 1786590563.254121,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-freight-config-guard.test.ts": 1791784005.2490308,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-dept.ts": 1785148503.14446,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-progress-person-lines.test.ts": 1786600948.2912912,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/ui/colors.ts": 1781272556.3798137,
@@ -211,7 +213,9 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/worktab.ts": 1787887332.2557578,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/jump.ts": 1781272556.3920226,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/route.ts": 1781272556.3928444,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/index.ts": 1781272556.3933916,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/keep-alive-exclude.ts": 1791777371.0673263,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/index.ts": 1791777395.5052269,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/keep-alive-exclude.test.ts": 1791777373.51103,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage/storage.ts": 1781272556.3952327,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage/storage-config.ts": 1781272556.3957188,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage/index.ts": 1781272556.3961456,
@@ -280,7 +284,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue": 1782893852.8545432,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue": 1782893852.8381548,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue": 1782893852.8006544,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1782893852.7315974,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1791777395.0880022,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-chat-window/index.vue": 1782893852.684171,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-page-content/index.vue": 1782893852.6055937,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1782893852.4847596,
@@ -312,7 +316,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-video-player/index.vue": 1782893851.5118508,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-cutter-img/index.vue": 1782893851.4950457,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/TinyMceEditor/index.vue": 1787643214.0412707,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1791451936.6013951,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1791785224.3434331,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-attachment-mini-readonly/index.vue": 1785145511.689019,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/cell-product-lineage-qc-dialog/index.vue": 1785290453.1924367,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-freight-pick-table/index.vue": 1791540667.8527935,
@@ -330,7 +334,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/product-view-dialog/index.vue": 1790217249.4347427,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-payment-detail-dialog/index.vue": 1791623760.681438,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-production-info-cards/index.vue": 1791471821.0584927,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-handle-panel/index.vue": 1791199806.8365252,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-handle-panel/index.vue": 1791860633.8460462,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-storage-release-info/index.vue": 1791471822.4833055,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/infusion-schedule-outbound-chain-view/index.vue": 1782893852.19879,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/work-order-remark-dialog/index.vue": 1785207196.8619192,
@@ -340,8 +344,9 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-schedule-payment-detail/index.vue": 1782893852.0159285,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-batch-readonly/index.vue": 1787104773.0737202,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/outbound-material-form-sections/index.vue": 1791328376.3002267,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/freight-unlink-dialog/index.vue": 1791785185.5377457,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/attachment-zip-progress-dialog/index.vue": 1782893851.6959429,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/payment-receipt-confirm-dialog/index.vue": 1791176641.976911,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/payment-receipt-confirm-dialog/index.vue": 1791799714.5278995,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-payment-detail-readonly/index.vue": 1783330021.0864918,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-code-with-special-display/index.vue": 1791523270.4904654,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-item-param-select-editor/index.vue": 1782893851.5957565,
@@ -403,7 +408,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/leave.ts": 1781272556.654047,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception-check-item.ts": 1781272556.654672,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production.ts": 1785145511.6866825,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-info-handle.ts": 1791299465.997316,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-info-handle.ts": 1791860612.992672,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task-set.ts": 1788231763.140203,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/infusion-schedule-handover.ts": 1781272556.6558568,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts": 1785303420.050366,
@@ -428,6 +433,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/business.ts": 1781750847.0646322,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts": 1791436628.0888722,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/inbound-sample.ts": 1782889889.452178,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/customer-service-dict.ts": 1791860298.5249445,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/ethnic.ts": 1781272556.6658764,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation-sample-collection.ts": 1791187765.9137378,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-freight.ts": 1791468380.799269,
@@ -452,44 +458,44 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception.ts": 1782719389.581961,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/auth.ts": 1790217216.9281998,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/protocol-sample-payment.ts": 1791616440.5825613,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1791517009.179358,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1791862690.2468123,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/auth/login/index.vue": 1789715240.9777095,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/presign-order/index.vue": 1791603964.5550117,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/presign-order/PresignOrderFormDialog.vue": 1791606023.3949256,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/presign-order/PresignOrderFormDialog.vue": 1791786470.4828007,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/refund-confirm/index.vue": 1782893854.3402505,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-freight/index.vue": 1791468585.7784426,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-freight/index.vue": 1791785255.6524422,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-freight/FreightConfigDialog.vue": 1791469261.2545865,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-freight/FreightEditDialog.vue": 1791424830.3864272,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/my-material-usage/index.vue": 1791296731.262585,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1791471097.8728843,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolStatusChangeDialog.vue": 1782894806.0188534,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolRefundRecordDialog.vue": 1791471058.669799,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1791606023.4121006,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1791860636.438133,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue": 1791162227.1000674,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1791611177.706224,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/SamplePaymentPanel.vue": 1791606023.4114842,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1791775339.9426832,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/SamplePaymentPanel.vue": 1791799729.0385313,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAuditDialog.vue": 1782893854.3675368,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/index.vue": 1791187848.6336563,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/SampleInfoQuickRegisterDialog.vue": 1791534113.8381252,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/UnifiedSampleInfoPage.vue": 1791523256.3088045,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/SampleInfoQuickRegisterDialog.vue": 1791860370.0576584,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/UnifiedSampleInfoPage.vue": 1791860530.6114886,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-reception-info/index.vue": 1791200162.920515,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue": 1791504621.1780708,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/PaymentBySampleTab.vue": 1791176894.8275044,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/PaymentExcelList.vue": 1791616550.8223867,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/PaymentBySampleTab.vue": 1791800784.733568,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/PaymentExcelList.vue": 1791800787.8884168,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue": 1791199760.6008983,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-chase/index.vue": 1791532837.8293414,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue": 1791346519.2317798,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/DonationProtocolTab.vue": 1791517657.7766538,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/DonationProtocolTab.vue": 1791868429.5362544,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/UnifiedProtocolPage.vue": 1791429008.46071,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/ProtocolAuditTab.vue": 1791516141.4918864,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue": 1791179939.300409,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/ProtocolAuditTab.vue": 1791769656.733718,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue": 1791799748.8159494,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue": 1791328376.3211129,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialUsageTab.vue": 1783429524.4350624,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialStockCheckTab.vue": 1791328376.3238451,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue": 1791199762.446884,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-entry-info/index.vue": 1791200163.9343994,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/index.vue": 1791606023.4115098,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue": 1791327889.8646357,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/index.vue": 1791799748.2355216,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue": 1791799718.3705418,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/InvoiceRequestTab.vue": 1791327890.717047,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1782893853.8275082,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/outside/Iframe.vue": 1782893853.8888595,
@@ -501,10 +507,10 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/sample-info/index.vue": 1791187849.9149377,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/index.vue": 1791437070.4771616,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationAuditDialog.vue": 1782893853.885547,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1791456392.2431421,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1791611213.396906,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1791775350.7223852,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1791775341.5097153,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationStatusChangeDialog.vue": 1782894808.1240149,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1791296731.2757878,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1791855531.6714394,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue": 1791328376.332648,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/order/index.vue": 1791328448.0895212,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue": 1791328376.3340044,
@@ -715,8 +721,8 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelViewDialog.vue": 1782894738.0196648,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelServiceOrderTab.vue": 1791328376.3956213,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-refund-confirm/index.vue": 1782893851.613325,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue": 1791328376.3962655,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue": 1791328376.3966053,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue": 1791799723.8419306,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue": 1791799740.8046174,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/index.vue": 1791296731.3012133,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseViewDialog.vue": 1782893853.1006944,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewDialog.vue": 1791328376.3973112,
@@ -729,7 +735,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/InfusionScheduleTab.vue": 1791328376.402699,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationFormDialog.vue": 1791611177.7698886,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/CheckupManagementTab.vue": 1791328376.4052205,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue": 1791328376.4056072,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue": 1791799725.7044778,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue": 1782893852.3049684,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/index.vue": 1791296731.2962532,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupReserveItemsTable.vue": 1782893852.2584097,
@@ -748,13 +754,13 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/SampleCodeTab.vue": 1791328376.4102836,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1791328376.4114585,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1789716962.6334765,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1791454780.9611673,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1791855532.0969582,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1791328376.4137537,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/CollectionProtocolNoTab.vue": 1791328376.4142537,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/assets/svg/loading.ts": 1781272558.486104,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/index.ts": 1781272559.227605,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/qc-menu-badge.ts": 1782394567.2213001,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1787887329.153417,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1791777409.1597261,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/table.ts": 1781272559.2465377,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/oa-menu-badge.ts": 1785990702.1987846,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts": 1781272559.2476027,
@@ -771,7 +777,7 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/RoutePermissionValidator.ts": 1781272559.4235668,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/index.ts": 1781272559.424284,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/IframeRouteManager.ts": 1781272559.425215,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1791504648.3683255,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1791860293.80043,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/index.ts": 1781272559.5419338,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/exception.ts": 1781272559.549901,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/routes/staticRoutes.ts": 1781272559.596198,

Some files were not shown because too many files changed in this diff