zlwu 5 месяцев назад
Родитель
Сommit
27ac28b8f5
58 измененных файлов с 2452 добавлено и 2148 удалено
  1. 0 0
      backend/app/graphify-out/cache/ast/7a30fc60732498ea6e41f153d3a74d4e47d3f0b7064d5defe0740716dd1dca05.json
  2. 0 0
      backend/app/graphify-out/cache/ast/8b8ba72ed331e3b2881b3a2e9c6a420a9f1bff234190c459812d2b268c7ae8a0.json
  3. 0 0
      backend/app/graphify-out/cache/ast/ec54363622b04db2ae80befca092a59771a3f8d8ce3cf91436d4ca9c27460121.json
  4. 500 521
      backend/graphify-out/.graphify_analysis.json
  5. 437 71
      backend/graphify-out/.graphify_extract.json
  6. 75 75
      backend/graphify-out/GRAPH_REPORT.md
  7. 1 1
      backend/graphify-out/graph.html
  8. 112 112
      backend/graphify-out/graph.json
  9. 3 3
      backend/graphify-out/manifest.json
  10. 581 589
      web-admin/graphify-out/.graphify_analysis.json
  11. 175 430
      web-admin/graphify-out/.graphify_extract.json
  12. 96 80
      web-admin/graphify-out/GRAPH_REPORT.md
  13. 1 1
      web-admin/graphify-out/graph.html
  14. 113 113
      web-admin/graphify-out/graph.json
  15. 41 41
      web-admin/graphify-out/manifest.json
  16. 0 0
      web-admin/src/graphify-out/cache/ast/035eaaa02e62aaa8f51291ef6f4784b4c555d09610be4359cfbbf531a4b282e8.json
  17. 0 0
      web-admin/src/graphify-out/cache/ast/07b3ca7d410878631c766cabdf618ad1eb5669ecdcf2804967aa15c9b691134e.json
  18. 0 0
      web-admin/src/graphify-out/cache/ast/134c2616c98e81e828ccddf01c80041cdcfe9f50c05b7e7ab036f5449cf53d0e.json
  19. 0 0
      web-admin/src/graphify-out/cache/ast/25df9a35a60b7f4a1c3a79e755f1bf8a6d7356cfe4709fbe08eba10935034449.json
  20. 0 0
      web-admin/src/graphify-out/cache/ast/2c670010845bf0c72988033b70ab63533d79a4f6d92d932f9b8ddcfa8cd8bc10.json
  21. 1 0
      web-admin/src/graphify-out/cache/ast/316749c06ec0798fb10a25210fba08d9c0dda9c47a9d33b0067d4dd662cd1795.json
  22. 0 0
      web-admin/src/graphify-out/cache/ast/33882166b296625fe8d8307f09b9733c759784f22cd9db0fd2bb00cae92a9550.json
  23. 0 0
      web-admin/src/graphify-out/cache/ast/4176cd933642cdc1136a95cf483a454e8a99a6f9264e054a2ecc8de05da642a0.json
  24. 1 0
      web-admin/src/graphify-out/cache/ast/47fec94e591b67321dab6a67656589db4136d756fd463c8a12c0af44d56181c8.json
  25. 1 0
      web-admin/src/graphify-out/cache/ast/48f8e6490ce8bbe3d0e700cde96475bd37b581c9b63e7e5a3f309789290d9c88.json
  26. 0 0
      web-admin/src/graphify-out/cache/ast/4f94285f7dc74e277145e100955764b500ea9ee02e0843d758f0b726256c62ef.json
  27. 0 0
      web-admin/src/graphify-out/cache/ast/54ab5a4aaead99b8864d7483056f3c55faebfbd65cc9c6085b5c4b5f0f8ddfdb.json
  28. 0 0
      web-admin/src/graphify-out/cache/ast/5637dddaa43cfe58a85bf3634a676cca52b3f135ba7ca29765a8fac32022efa8.json
  29. 1 0
      web-admin/src/graphify-out/cache/ast/6325b88eade62cc833817b8247bca22d47b85226707d473f89a67a85e13b22e7.json
  30. 1 0
      web-admin/src/graphify-out/cache/ast/690a32bf5ba70f6c065c91e77c976e715a77f7bc5bbef1c51a2ddc40f3274f56.json
  31. 0 0
      web-admin/src/graphify-out/cache/ast/7011f5d58e71c42f776b7dff561391cdf5b9550f2a61b7c033d0f82c2bbf8be9.json
  32. 0 0
      web-admin/src/graphify-out/cache/ast/7364dcbbb79071a70245bba8a4537564285ecbb881c4f6ae4aad0119d92a3343.json
  33. 1 0
      web-admin/src/graphify-out/cache/ast/760d9983a6914a4f5b7b79215f989ee763207091f5c05cc7674e4c2b7ec8fedb.json
  34. 0 0
      web-admin/src/graphify-out/cache/ast/7f768c5de54f7ec05495525847f5350008d29c1eb00f588ed7ded2ceeebee84b.json
  35. 0 0
      web-admin/src/graphify-out/cache/ast/830c378ec2e70922d3322ab341e15a010ea1e9bc34a8272d1f35b2d62d3c5800.json
  36. 1 0
      web-admin/src/graphify-out/cache/ast/83c5d04f95d1465bf6f97cb8aa4e5f2c42ab0a44dcc6e376e3749c6319dd4930.json
  37. 0 0
      web-admin/src/graphify-out/cache/ast/8b9a5c22481b06331ac81d14d4f8b235ef86b40c3ff9377dd35893cca806eec7.json
  38. 1 0
      web-admin/src/graphify-out/cache/ast/8ddc29c0904704c88d5eb608abc3c21518270d6e9ead8190e6cb18cf8cfac652.json
  39. 0 0
      web-admin/src/graphify-out/cache/ast/8df5237c5972e07f4947032469a81ecb7918da57044dabf6c63e441c28200e1f.json
  40. 1 0
      web-admin/src/graphify-out/cache/ast/918ade7893e7401f5c896be73c5c8da865bcc9a3d3585eca1539b9df5cdc3a17.json
  41. 1 0
      web-admin/src/graphify-out/cache/ast/92eb8d7c3a4a1fd2db5c6cd68ba46c3bbd39f04bf69ad96eb8e0eeaafadb16a0.json
  42. 1 0
      web-admin/src/graphify-out/cache/ast/93a1795bf617f29bafa86387139d8f320c9b9392ad5d7f4d948b4d4cffa6e0ba.json
  43. 0 0
      web-admin/src/graphify-out/cache/ast/af2f216bfaf988c83df3df709979d6db8bcef8b72b75cfc96d7b02cb89df1123.json
  44. 1 0
      web-admin/src/graphify-out/cache/ast/c2bfb599e1389210f4043d5dbf28e61c107e61092f564ab749c7e049a8bb11f7.json
  45. 0 0
      web-admin/src/graphify-out/cache/ast/c6a373998f21827a6e5415252e36222cb7b0c38f2df17cccbbb31e0ca1ab3f8d.json
  46. 1 0
      web-admin/src/graphify-out/cache/ast/deb8c88d8ec842a09642375d08ec0e62eea450d4194dc69c3dea6d20397558f9.json
  47. 0 0
      web-admin/src/graphify-out/cache/ast/e22d736fbfe01aa0393d8e050aec9ca77ecde46eb3b54287481f5a023d27391e.json
  48. 0 0
      web-admin/src/graphify-out/cache/ast/e4699a8d326eb6949d27ebccfe4c325c83e9ee1edb6f9c73dc3ec568d471bedd.json
  49. 1 0
      web-admin/src/graphify-out/cache/ast/e7d0ea06f6b25d1c171e2a4616a51c2733c8ef31fae971d5cb8e63bfee8e140f.json
  50. 1 0
      web-admin/src/graphify-out/cache/ast/f08af1fb0ef218552ffa9270aa3d66c02dd7df053e86833bdadf6f50d0b180b7.json
  51. 1 0
      web-admin/src/graphify-out/cache/ast/f0d2ae6b8e4fd01834c926c6c1ccd058e4be96358dbc79fbea290ea7c321a48c.json
  52. 0 0
      web-admin/src/graphify-out/cache/ast/f8de30c86a90e2d7e8c94d6fbfb08d15b27913c1533db1eaea96715eacc4c44e.json
  53. 0 0
      web-admin/src/graphify-out/cache/ast/f9fd9166384b83c9aa63524305895e152c13a08cc91aab5408808a5a9c5f4ffb.json
  54. 1 0
      web-admin/src/graphify-out/cache/ast/fd5216583b682679f3a345386ab340a8329a27641765ee3662d04de8ae4cfc31.json
  55. 1 0
      web-admin/src/graphify-out/cache/ast/fe7dda3ea99808f039be5fbfe9142a3d89fbbcf143df7589b6d08e3e182f64fa.json
  56. 1 0
      web-admin/src/graphify-out/cache/ast/fef5e9b2ee4b592c189ec579298c8a8cf01f4eeaaa8c4bee34f0bea2cada496c.json
  57. 111 14
      web-admin/src/views/system/dept/index.vue
  58. 187 97
      web-admin/src/views/system/dict/index.vue

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


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


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


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


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


+ 75 - 75
backend/graphify-out/GRAPH_REPORT.md

@@ -1,12 +1,12 @@
 # Graph Report - app  (2026-05-20)
 
 ## Corpus Check
-- 135 files · ~112,111 words
+- 135 files · ~112,579 words
 - Verdict: corpus is large enough that graph structure adds value.
 
 ## Summary
-- 2312 nodes · 8962 edges · 51 communities detected
-- Extraction: 42% EXTRACTED · 58% INFERRED · 0% AMBIGUOUS · INFERRED: 5177 edges (avg confidence: 0.63)
+- 2318 nodes · 9000 edges · 51 communities detected
+- Extraction: 42% EXTRACTED · 58% INFERRED · 0% AMBIGUOUS · INFERRED: 5206 edges (avg confidence: 0.63)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -63,9 +63,9 @@
 - [[_COMMUNITY_Community 52|Community 52]]
 
 ## God Nodes (most connected - your core abstractions)
-1. `success_response()` - 367 edges
-2. `error_response()` - 293 edges
-3. `SysUser` - 205 edges
+1. `success_response()` - 368 edges
+2. `error_response()` - 294 edges
+3. `SysUser` - 207 edges
 4. `BizQcTaskResult` - 193 edges
 5. `BizQcMaterialUsage` - 190 edges
 6. `BizMaterialStockLog` - 189 edges
@@ -90,63 +90,63 @@
 
 ### Community 0 - "Community 0"
 Cohesion: 0.02
-Nodes (396): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+388 more)
+Nodes (414): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+406 more)
 
 ### Community 1 - "Community 1"
-Cohesion: 0.01
-Nodes (358): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+350 more)
+Cohesion: 0.02
+Nodes (347): MaterialBody, MaterialUpdateBody, StockInBody, StockOutBody, CellProductPriceCreateBody, CellProductPriceUpdateBody, CellProductSpecCreateBody, CellProductSpecUpdateBody (+339 more)
 
 ### Community 2 - "Community 2"
-Cohesion: 0.05
-Nodes (235): InsuranceCompanyCreateBody, InsuranceCompanyInvoiceCreateBody, InsuranceCompanyInvoiceUpdateBody, InsuranceCompanyUpdateBody, InsuranceProjectPriceCreateBody, InsuranceProjectPriceUpdateBody, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody (+227 more)
+Cohesion: 0.01
+Nodes (224): get_designer_data(), generate_uuid(), delete(), get_multi_with_filters(), create_cell_product(), delete_cell_product(), get_cell_product(), list_cell_products() (+216 more)
 
 ### Community 3 - "Community 3"
-Cohesion: 0.02
-Nodes (134): get_designer_data(), delete(), get_multi_with_filters(), _access_log_to_dict(), create_access_log(), create_clean_room(), get_access_log(), get_clean_room() (+126 more)
+Cohesion: 0.05
+Nodes (238): InsuranceCompanyCreateBody, InsuranceCompanyInvoiceCreateBody, InsuranceCompanyInvoiceUpdateBody, InsuranceCompanyUpdateBody, InsuranceProjectPriceCreateBody, InsuranceProjectPriceUpdateBody, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody (+230 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.02
-Nodes (149): generate_uuid(), _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), list_materials(), options_list() (+141 more)
+Cohesion: 0.07
+Nodes (163): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+155 more)
 
 ### Community 5 - "Community 5"
-Cohesion: 0.1
-Nodes (122): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+114 more)
+Cohesion: 0.05
+Nodes (81): _format_attachment_file_size(), urls_to_attachment_list(), complete_production_work_order(), create_production_work_order_from_reception(), _fmt_dt(), _generate_work_order_no(), get_production_work_order(), list_production_work_orders() (+73 more)
 
 ### Community 6 - "Community 6"
 Cohesion: 0.04
-Nodes (96): _format_attachment_file_size(), get_protocol_nos_used_in_protocols(), urls_to_attachment_list(), complete_production_work_order(), create_production_work_order_from_reception(), _fmt_dt(), _generate_work_order_no(), get_production_work_order() (+88 more)
+Nodes (63): ApiRequestLogMiddleware, _claims_from_auth(), _format_body_bytes(), _persist_log(), 统一记录 API 请求/响应出入参的中间件, _redact_obj(), _schedule_persist_log(), _should_skip() (+55 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.03
-Nodes (71): _avatar_url_field(), _build_user_info_payload(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/zkxw.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 与 web-admin `userInfo` 字段约定一致。, Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致) (+63 more)
+Cohesion: 0.06
+Nodes (76): _persist_protocol_sub_resources(), _add_months_yyyymmdd(), align_fq_payment_details_payload(), _apply_submit_receipt_finance(), _apply_submit_refund_finance(), attachments_to_urls(), _audit_to_dict(), batch_submit_receipt_finance() (+68 more)
 
 ### Community 8 - "Community 8"
-Cohesion: 0.06
-Nodes (75): _persist_protocol_sub_resources(), _add_months_yyyymmdd(), align_fq_payment_details_payload(), _apply_submit_receipt_finance(), _apply_submit_refund_finance(), attachments_to_urls(), _audit_to_dict(), batch_submit_receipt_finance() (+67 more)
+Cohesion: 0.05
+Nodes (59): list_roles_for_select(), _avatar_url_field(), _build_user_info_payload(), get_web_auth_menu_codes(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/zkxw.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。 (+51 more)
 
 ### Community 9 - "Community 9"
 Cohesion: 0.05
 Nodes (26): BusinessException, InvalidStatusTransitionException, log_delivery_operation(), log_operation(), log_order_operation(), log_settlement_operation(), log_user_operation(), OrderLockedException (+18 more)
 
 ### Community 10 - "Community 10"
-Cohesion: 0.4
-Nodes (47): ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody, OutputTypeCreateBody, OutputTypeUpdateBody, PackItemInput, ProcessCategoryCreateBody (+39 more)
+Cohesion: 0.13
+Nodes (38): _parse_datetime_fields(), parse_datetime(), _audit_to_dict(), batch_delete_donations(), change_status(), _collection_to_dict(), convert_to_storage(), _create_collection() (+30 more)
 
 ### Community 11 - "Community 11"
-Cohesion: 0.14
-Nodes (34): parse_datetime(), _audit_to_dict(), batch_delete_donations(), change_status(), _collection_to_dict(), _create_collection(), create_donation(), _create_party() (+26 more)
+Cohesion: 0.16
+Nodes (26): add_step(), copy_step(), create_route(), _create_step_consumable(), _create_step_data_collection(), _create_step_output(), _create_step_reagent(), get_route() (+18 more)
 
 ### Community 12 - "Community 12"
 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)
+Nodes (23): BaseHTTPMiddleware, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json(), derive_key(), encrypt_json(), gen_nonce_hex() (+15 more)
 
 ### Community 13 - "Community 13"
-Cohesion: 0.1
-Nodes (26): BaseHTTPMiddleware, parse_admin_request_json(), 运营 Web(/web/admin)JSON 请求体解析。  与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `, 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。      Returns:, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json() (+18 more)
+Cohesion: 0.14
+Nodes (8): 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, 生成签名 V3 (SHA256 with RSA), wechat_pay(), WechatPayClient, WechatPayV2Client
 
 ### Community 14 - "Community 14"
-Cohesion: 0.21
-Nodes (22): _create_insurance_company(), _create_insurance_company_invoice(), _create_insurance_project_price(), delete_insurance_company(), delete_insurance_company_invoice(), delete_insurance_project_price(), _fmt_dt(), _generate_uuid() (+14 more)
+Cohesion: 0.13
+Nodes (19): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_to_dict(), list_collection_regions(), list_hospitals(), _region_to_dict() (+11 more)
 
 ### Community 15 - "Community 15"
 Cohesion: 0.18
@@ -157,81 +157,81 @@ Cohesion: 0.22
 Nodes (18): _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() (+10 more)
 
 ### Community 17 - "Community 17"
-Cohesion: 0.2
-Nodes (15): batch_create_slots(), collect_descendant_ids(), create_facility(), create_slot(), get_children(), get_facility(), get_slot(), list_all_facilities() (+7 more)
+Cohesion: 0.22
+Nodes (12): batch_generate_sample_codes(), batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), 样本编码池 CRUD(biz_sample_code), 批量生成样本编码: 类型前缀 + 中间段 + 补零序号 (+4 more)
 
 ### Community 18 - "Community 18"
-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 (12): batch_generate_protocol_nos(), batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), protocol_no_exists(), 采集协议号池 CRUD(biz_collection_protocol_no) (+4 more)
 
 ### Community 19 - "Community 19"
-Cohesion: 0.27
-Nodes (10): batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), 样本编码池 CRUD(biz_sample_code), _row_to_dict(), sample_code_exists() (+2 more)
+Cohesion: 0.24
+Nodes (9): 微信消息通知服务  支持微信小程序模板消息推送  使用方式:     from app.core.wechat_message import Wech, 发送模板消息                  Args:             openid: 用户openid             templ, send_delivery_notice(), send_delivery_warning(), send_order_status(), send_payment_success(), send_refund_result(), send_urge_notification() (+1 more)
 
 ### Community 20 - "Community 20"
-Cohesion: 0.27
-Nodes (10): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_to_dict(), list_hospitals(), soft_delete_collection_region(), soft_delete_hospital() (+2 more)
+Cohesion: 0.23
+Nodes (12): Config, ProductBase, ProductCategoryBase, ProductCategoryCreate, ProductCategoryResponse, ProductCreate, ProductResponse, ProductUnitBase (+4 more)
 
 ### Community 21 - "Community 21"
-Cohesion: 0.3
-Nodes (10): create_consumable_pack(), get_consumable_pack(), get_pack_detail(), _item_row_to_dict(), list_all_packs(), list_consumable_packs(), pack_code_exists(), _row_to_dict() (+2 more)
+Cohesion: 0.31
+Nodes (12): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), list_materials(), options_list(), _row_to_dict() (+4 more)
 
 ### Community 22 - "Community 22"
-Cohesion: 0.27
-Nodes (10): batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), protocol_no_exists(), 采集协议号池 CRUD(biz_collection_protocol_no), _row_to_dict() (+2 more)
-
-### Community 23 - "Community 23"
 Cohesion: 0.29
 Nodes (9): _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), _row_to_dict(), soft_delete_menu() (+1 more)
 
-### Community 24 - "Community 24"
+### Community 23 - "Community 23"
 Cohesion: 0.31
-Nodes (8): create_sop_document(), get_sop_document(), list_sop_documents(), SOP文档 CRUD(biz_sop_document), _row_to_dict(), soft_delete_sop_document(), sop_code_exists(), update_sop_document()
+Nodes (8): consumable_code_exists(), create_consumable(), get_consumable(), list_consumables(), 耗材 CRUD(biz_consumable), _row_to_dict(), soft_delete_consumable(), update_consumable()
 
-### Community 25 - "Community 25"
+### Community 24 - "Community 24"
 Cohesion: 0.31
 Nodes (8): create_express_company(), express_code_exists(), get_express_company(), list_express_companies(), 快递公司 CRUD(biz_express_company), _row_to_dict(), soft_delete_express_company(), update_express_company()
 
+### Community 25 - "Community 25"
+Cohesion: 0.38
+Nodes (9): create_check_item(), get_check_item(), item_code_exists(), list_active_check_items(), list_check_items(), _order_query(), _row_to_dict(), soft_delete_check_item() (+1 more)
+
 ### Community 26 - "Community 26"
+Cohesion: 0.27
+Nodes (8): create_dict_data(), get_dict_data(), list_dict_data(), list_dict_data_options(), 字典数据 CRUD(sys_dict_data), _row_to_dict(), soft_delete_dict_data(), update_dict_data()
+
+### Community 27 - "Community 27"
 Cohesion: 0.31
 Nodes (8): category_code_exists(), create_process_category(), get_process_category(), list_process_categories(), 工艺工序分类 CRUD(biz_process_category), _row_to_dict(), soft_delete_process_category(), update_process_category()
 
-### Community 27 - "Community 27"
+### Community 28 - "Community 28"
 Cohesion: 0.31
 Nodes (8): create_item_unit(), get_item_unit(), list_item_units(), 物品单位 CRUD(biz_item_unit), _row_to_dict(), soft_delete_item_unit(), unit_code_exists(), update_item_unit()
 
-### Community 28 - "Community 28"
+### Community 29 - "Community 29"
 Cohesion: 0.31
 Nodes (8): create_customer(), get_customer(), id_card_taken(), list_customers(), 客户 CRUD(biz_customer), _row_to_dict(), soft_delete_customer(), update_customer()
 
-### Community 29 - "Community 29"
+### Community 30 - "Community 30"
 Cohesion: 0.31
 Nodes (8): create_cell_sample_type(), get_cell_sample_type(), list_cell_sample_types(), 细胞样本类型 CRUD(biz_cell_sample_type), _row_to_dict(), soft_delete_cell_sample_type(), type_code_exists(), update_cell_sample_type()
 
-### Community 30 - "Community 30"
+### Community 31 - "Community 31"
 Cohesion: 0.33
 Nodes (9): _build_tree(), _cascade_soft_delete(), create_dept(), get_dept(), list_depts(), list_depts_tree(), _row_to_dict(), soft_delete_dept() (+1 more)
 
-### Community 31 - "Community 31"
+### Community 32 - "Community 32"
 Cohesion: 0.31
 Nodes (8): create_output_type(), get_output_type(), list_output_types(), 工艺产出物类型 CRUD(biz_output_type), _row_to_dict(), soft_delete_output_type(), type_code_exists(), update_output_type()
 
-### Community 32 - "Community 32"
+### Community 33 - "Community 33"
 Cohesion: 0.36
-Nodes (7): create_dict_type(), dict_type_code_exists(), get_dict_type(), list_dict_types(), _row_to_dict(), soft_delete_dict_type(), update_dict_type()
+Nodes (7): create_post(), get_post(), list_posts(), post_code_exists(), _row_to_dict(), soft_delete_post(), update_post()
 
-### Community 33 - "Community 33"
+### Community 34 - "Community 34"
 Cohesion: 0.36
 Nodes (7): create_tenant(), get_tenant(), list_tenants(), _row_to_dict(), soft_delete_tenant(), tenant_no_exists(), update_tenant()
 
-### Community 34 - "Community 34"
+### Community 35 - "Community 35"
 Cohesion: 0.39
 Nodes (8): create_lab_item(), get_lab_item(), item_code_exists(), list_active_lab_items(), list_lab_items(), _row_to_dict(), soft_delete_lab_item(), update_lab_item()
 
-### Community 35 - "Community 35"
-Cohesion: 0.31
-Nodes (7): create_cell_product(), delete_cell_product(), get_cell_product(), list_cell_products(), 细胞产品 CRUD(biz_cell_product), _row_to_dict(), update_cell_product()
-
 ### Community 36 - "Community 36"
 Cohesion: 0.36
 Nodes (7): create_site(), get_site(), list_sites(), _row_to_dict(), site_code_exists(), soft_delete_site(), update_site()
@@ -321,17 +321,17 @@ Nodes (1): 发送催单通知给配送员                  Args:             del
 ## Suggested Questions
 _Questions this graph is uniquely positioned to answer:_
 
-- **Why does `generate_uuid()` connect `Community 4` to `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 11`, `Community 15`, `Community 16`, `Community 17`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 34`, `Community 35`, `Community 36`?**
-  _High betweenness centrality (0.097) - this node is a cross-community bridge._
-- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 3`, `Community 39`, `Community 7`, `Community 42`, `Community 14`?**
-  _High betweenness centrality (0.085) - this node is a cross-community bridge._
-- **Why does `SysUser` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 10`?**
-  _High betweenness centrality (0.080) - this node is a cross-community bridge._
-- **Are the 366 inferred relationships involving `success_response()` (e.g. with `web_login_rsa_public_key()` and `web_login()`) actually correct?**
-  _`success_response()` has 366 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 331 inferred relationships involving `str` (e.g. with `extract_login_credentials()` and `._make_request()`) actually correct?**
-  _`str` has 331 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 292 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `web_login()`) actually correct?**
-  _`error_response()` has 292 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 203 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤)  data_scope 值:   1 = 全部数据   2 = 本部门数据   3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
-  _`SysUser` has 203 INFERRED edges - model-reasoned connections that need verification._
+- **Why does `generate_uuid()` connect `Community 2` to `Community 0`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 11`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 21`, `Community 22`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 34`, `Community 35`, `Community 36`?**
+  _High betweenness centrality (0.122) - this node is a cross-community bridge._
+- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 2`, `Community 39`, `Community 8`, `Community 42`?**
+  _High betweenness centrality (0.077) - this node is a cross-community bridge._
+- **Why does `SysUser` connect `Community 4` to `Community 8`, `Community 1`, `Community 3`, `Community 6`?**
+  _High betweenness centrality (0.072) - this node is a cross-community bridge._
+- **Are the 367 inferred relationships involving `success_response()` (e.g. with `web_login_rsa_public_key()` and `web_login()`) actually correct?**
+  _`success_response()` has 367 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 332 inferred relationships involving `str` (e.g. with `extract_login_credentials()` and `._make_request()`) actually correct?**
+  _`str` has 332 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 293 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `web_login()`) actually correct?**
+  _`error_response()` has 293 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 205 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤)  data_scope 值:   1 = 全部数据   2 = 本部门数据   3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
+  _`SysUser` has 205 INFERRED edges - model-reasoned connections that need verification._

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


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


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

@@ -64,7 +64,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_code.py": 1778739713.1609266,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task_result.py": 1779183941.5633752,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/post.py": 1778775532.8861995,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_result.py": 1779007909.293384,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_result.py": 1779255909.8554008,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/user.py": 1778775532.8870275,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_work_order.py": 1779207008.176256,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material.py": 1779230500.5468204,
@@ -100,7 +100,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_service.py": 1779097275.2615435,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1778733031.447253,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/workflow.py": 1778733044.3626168,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1779254072.885309,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1779255909.8553903,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable_pack.py": 1779094924.272136,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material.py": 1779229782.577612,
   "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol_no.py": 1778739676.552736,
@@ -126,7 +126,7 @@
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/ethnic.py": 1778929290.0303483,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_service.py": 1779097246.7527015,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/workflow.py": 1778729745.1120937,
-  "/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_reception.py": 1779175646.6263578,
+  "/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_reception.py": 1779255909.8553786,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py": 1779248617.010136,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py": 1779207670.5439875,
   "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1779242371.3065424,

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


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


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

@@ -1,11 +1,11 @@
 # Graph Report - src  (2026-05-20)
 
 ## Corpus Check
-- Large corpus: 575 files · ~283,231 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
+- Large corpus: 575 files · ~284,580 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
 
 ## Summary
-- 1452 nodes · 1866 edges · 41 communities detected
-- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 418 edges (avg confidence: 0.8)
+- 1440 nodes · 1839 edges · 43 communities detected
+- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 411 edges (avg confidence: 0.8)
 - Token cost: 0 input · 0 output
 
 ## Community Hubs (Navigation)
@@ -36,9 +36,9 @@
 - [[_COMMUNITY_Community 24|Community 24]]
 - [[_COMMUNITY_Community 25|Community 25]]
 - [[_COMMUNITY_Community 26|Community 26]]
-- [[_COMMUNITY_Community 27|Community 27]]
 - [[_COMMUNITY_Community 28|Community 28]]
 - [[_COMMUNITY_Community 30|Community 30]]
+- [[_COMMUNITY_Community 31|Community 31]]
 - [[_COMMUNITY_Community 32|Community 32]]
 - [[_COMMUNITY_Community 33|Community 33]]
 - [[_COMMUNITY_Community 34|Community 34]]
@@ -49,13 +49,15 @@
 - [[_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 45|Community 45]]
 
 ## God Nodes (most connected - your core abstractions)
 1. `get()` - 150 edges
 2. `WebSocketClient` - 26 edges
 3. `withFullscreenLoading()` - 21 edges
-4. `push()` - 20 edges
+4. `push()` - 19 edges
 5. `MenuProcessor` - 16 edges
 6. `VersionManager` - 15 edges
 7. `handleDynamicRoutes()` - 15 edges
@@ -72,75 +74,75 @@
   views/pilot-service/project-price-system/index.vue → utils/fullscreen-loading.ts
 - `handleBatchDelete()` --calls--> `withFullscreenLoading()`  [INFERRED]
   views/basic-info/cell-sample-type/index.vue → utils/fullscreen-loading.ts
-- `handleBatchDeleteHospital()` --calls--> `withFullscreenLoading()`  [INFERRED]
-  views/basic-info/collection-region/index.vue → utils/fullscreen-loading.ts
+- `handleBatchDelete()` --calls--> `withFullscreenLoading()`  [INFERRED]
+  views/basic-info/customer/index.vue → utils/fullscreen-loading.ts
 
 ## Communities
 
 ### Community 0 - "Community 0"
 Cohesion: 0.01
-Nodes (79): fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAgreementPrices(), fetchChannelAgreements() (+71 more)
+Nodes (72): fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAgreementPrices(), fetchChannelAgreements() (+64 more)
 
 ### Community 1 - "Community 1"
 Cohesion: 0.03
-Nodes (56): fetchBatchGenerateProtocolNos(), fetchBatchGenerateSampleCodes(), fetchBatchIssueProtocolNos(), fetchBatchIssueSampleCodes(), fetchCollectionProtocolNoList(), fetchCreateCollectionProtocolNo(), fetchCreateSampleCode(), fetchDeleteCollectionProtocolNo() (+48 more)
+Nodes (55): fetchBatchGenerateProtocolNos(), fetchBatchGenerateSampleCodes(), fetchBatchIssueProtocolNos(), fetchBatchIssueSampleCodes(), fetchCollectionProtocolNoList(), fetchCreateCollectionProtocolNo(), fetchCreateSampleCode(), fetchDeleteCollectionProtocolNo() (+47 more)
 
 ### Community 2 - "Community 2"
 Cohesion: 0.03
-Nodes (36): fetchAllConsumablePacks(), fetchAllConsumables(), fetchAllOutputTypes(), fetchAllProcessCategories(), fetchAllProcesses(), fetchAllReagents(), fetchAllSopDocuments(), fetchConsumableList() (+28 more)
+Nodes (37): fetchUploadAttachment(), fetchAllConsumablePacks(), fetchAllConsumables(), fetchAllOutputTypes(), fetchAllProcessCategories(), fetchAllProcesses(), fetchAllReagents(), fetchAllSopDocuments() (+29 more)
 
 ### Community 3 - "Community 3"
 Cohesion: 0.04
 Nodes (31): fetchGetUserInfo(), clickTab(), handleTouchEnd(), setTransition(), IframeRouteManager, RouteRegistry, useCommon(), setupAfterEachGuard() (+23 more)
 
 ### Community 4 - "Community 4"
-Cohesion: 0.04
-Nodes (27): fetchAttachmentDownloadUrl(), fetchOrderAdjusts(), fetchOrderDetail(), fetchOrderItems(), fetchOrderList(), fetchPriceVersionDetail(), fetchSystemConfig(), fetchUploadAttachment() (+19 more)
+Cohesion: 0.05
+Nodes (25): FireworkSystem, reload(), collectIds(), formatUserLabel(), onPersonSelectChange(), RoutePermissionValidator, handleMenuJump(), openExternalLink() (+17 more)
 
 ### Community 5 - "Community 5"
 Cohesion: 0.05
-Nodes (23): FireworkSystem, reload(), collectIds(), formatUserLabel(), onPersonSelectChange(), RoutePermissionValidator, formatLeaderUserLabel(), handleMenuJump() (+15 more)
+Nodes (43): fetchAccessLogList(), fetchCleanRoomList(), fetchCreateAccessLog(), fetchCreateCleanRoom(), fetchCreateSite(), fetchDeleteAccessLog(), fetchDeleteCleanRoom(), fetchDeleteSite() (+35 more)
 
 ### Community 6 - "Community 6"
-Cohesion: 0.09
-Nodes (5): handleReset(), handleSearch(), WebSocketClient, TableCache, emit()
+Cohesion: 0.06
+Nodes (30): toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes() (+22 more)
 
 ### Community 7 - "Community 7"
-Cohesion: 0.06
-Nodes (35): fetchCreateDept(), fetchCreateSite(), fetchDeleteDept(), fetchDeleteSite(), fetchDictDataOptions(), fetchSiteList(), fetchUpdateDept(), fetchUpdateSite() (+27 more)
+Cohesion: 0.09
+Nodes (5): handleReset(), handleSearch(), WebSocketClient, TableCache, emit()
 
 ### Community 8 - "Community 8"
-Cohesion: 0.09
-Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
+Cohesion: 0.06
+Nodes (14): fetchAttachmentDownloadUrl(), fetchOrderAdjusts(), fetchOrderDetail(), fetchOrderItems(), fetchOrderList(), fetchPriceVersionDetail(), fetchSystemConfig(), handleReceptionAttachmentDownload() (+6 more)
 
 ### Community 9 - "Community 9"
 Cohesion: 0.09
-Nodes (28): toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes() (+20 more)
+Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
 
 ### Community 10 - "Community 10"
-Cohesion: 0.09
-Nodes (24): fetchAccessLogList(), fetchCleanRoomList(), fetchCreateAccessLog(), fetchCreateCleanRoom(), fetchDeleteAccessLog(), fetchDeleteCleanRoom(), fetchUpdateAccessLog(), fetchUpdateCleanRoom() (+16 more)
+Cohesion: 0.1
+Nodes (13): fetchEthnicList(), addSample(), applyDonationBundleToForm(), confirmBatchTransportApply(), createEmptyTransport(), ensureDonationProtocolNoInOptions(), ensureEthnicOptionInList(), handleOpenForAdd() (+5 more)
 
 ### Community 11 - "Community 11"
 Cohesion: 0.09
 Nodes (21): fetchCreateUser(), fetchDeleteUser(), fetchDeptTree(), fetchPostBoundUserIds(), fetchResetPassword(), fetchUpdateUser(), loadDeptData(), collectAllPostBindDeptIds() (+13 more)
 
 ### Community 12 - "Community 12"
-Cohesion: 0.1
-Nodes (13): fetchEthnicList(), addSample(), applyDonationBundleToForm(), confirmBatchTransportApply(), createEmptyTransport(), ensureDonationProtocolNoInOptions(), ensureEthnicOptionInList(), handleOpenForAdd() (+5 more)
-
-### Community 13 - "Community 13"
 Cohesion: 0.09
 Nodes (18): fetchCollectionRegionList(), fetchCreateCollectionRegion(), fetchCreateHospital(), fetchDeleteCollectionRegion(), fetchDeleteHospital(), fetchHospitalList(), fetchUpdateCollectionRegion(), fetchUpdateHospital() (+10 more)
 
-### Community 14 - "Community 14"
+### Community 13 - "Community 13"
 Cohesion: 0.1
 Nodes (7): fetchGetMenuList(), fetchGetMenuCodes(), fetchLogin(), MenuProcessor, useAppMode(), useAuth(), buildWebEncryptedLoginBody()
 
-### Community 15 - "Community 15"
+### Community 14 - "Community 14"
 Cohesion: 0.11
 Nodes (17): fetchCreateMaterial(), fetchDeleteMaterial(), fetchMaterialList(), fetchMaterialOptions(), fetchMaterialStockLogList(), fetchStockInMaterial(), fetchStockOutMaterial(), fetchUpdateMaterial() (+9 more)
 
+### Community 15 - "Community 15"
+Cohesion: 0.12
+Nodes (16): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), postorder(), preorder(), applyTreeExpand(), handleAdd() (+8 more)
+
 ### Community 16 - "Community 16"
 Cohesion: 0.12
 Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
@@ -150,135 +152,149 @@ Cohesion: 0.13
 Nodes (17): fetchCreateProjectSystem(), fetchCreateProjectSystemItem(), fetchDeleteProjectSystemItem(), fetchProjectSystemItems(), fetchProjectSystemList(), fetchUpdateProjectSystem(), handleAdd(), handleBatchDelete() (+9 more)
 
 ### Community 18 - "Community 18"
-Cohesion: 0.19
-Nodes (3): fetchGetLatestUpgradeLog(), systemUpgrade(), VersionManager
-
-### Community 19 - "Community 19"
 Cohesion: 0.12
 Nodes (12): fetchApproveTask(), fetchBusinessAllTasks(), fetchCompletedTasks(), fetchDesignerData(), fetchInstanceDetail(), fetchMyInstances(), fetchPendingTasks(), fetchProcessDefList() (+4 more)
 
-### Community 20 - "Community 20"
-Cohesion: 0.15
-Nodes (14): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), applyTreeExpand(), handleAdd(), handleAddChild(), handleDelete() (+6 more)
-
-### Community 21 - "Community 21"
-Cohesion: 0.1
-Nodes (6): fetchQcTaskDetail(), fetchQcTaskList(), fetchQcThirdPartyCompanyList(), fetchQcThirdPartyCompanyOptions(), fetchQcThirdPartyItemList(), fetchQcThirdPartyItemsActive()
+### Community 19 - "Community 19"
+Cohesion: 0.11
+Nodes (8): fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchPaymentDetailList(), fetchReceiptConfirmedList(), fetchReceiptConfirmList(), fetchRefundConfirmedList(), fetchRefundConfirmList()
 
-### Community 22 - "Community 22"
+### Community 20 - "Community 20"
 Cohesion: 0.2
 Nodes (2): ComponentLoader, RouteTransformer
 
-### Community 23 - "Community 23"
+### Community 21 - "Community 21"
 Cohesion: 0.16
 Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
 
-### Community 24 - "Community 24"
+### Community 22 - "Community 22"
 Cohesion: 0.27
 Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
 
-### Community 25 - "Community 25"
+### Community 23 - "Community 23"
+Cohesion: 0.18
+Nodes (9): auditorDisplay(), dash(), expressName(), formatYm(), formatYmd(), sampleTypeName(), siteName(), unitName() (+1 more)
+
+### Community 24 - "Community 24"
 Cohesion: 0.17
 Nodes (12): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleBatchDelete(), handleDelete(), handleReset() (+4 more)
 
+### Community 25 - "Community 25"
+Cohesion: 0.17
+Nodes (12): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), handleAdd(), handleBatchDelete(), handleDelete(), handleReset() (+4 more)
+
 ### Community 26 - "Community 26"
 Cohesion: 0.14
 Nodes (8): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), themeAnimation(), toggleTheme(), toggleTransition()
 
-### Community 27 - "Community 27"
-Cohesion: 0.18
-Nodes (11): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), handleAdd(), handleDelete(), handleReset(), handleSearch() (+3 more)
-
 ### Community 28 - "Community 28"
-Cohesion: 0.14
-Nodes (2): fetchProductionTaskDetail(), fetchProductionTaskList()
-
-### Community 30 - "Community 30"
 Cohesion: 0.17
 Nodes (3): fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList()
 
-### Community 32 - "Community 32"
+### Community 30 - "Community 30"
 Cohesion: 0.39
 Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
 
-### Community 33 - "Community 33"
+### Community 31 - "Community 31"
 Cohesion: 0.36
 Nodes (1): TableHeightCalculator
 
-### Community 34 - "Community 34"
+### Community 32 - "Community 32"
 Cohesion: 0.33
 Nodes (2): logApiCryptoBootInfo(), maskSecret()
 
-### Community 35 - "Community 35"
+### Community 33 - "Community 33"
 Cohesion: 0.29
 Nodes (2): fetchLeaveDetail(), fetchLeaveList()
 
-### Community 36 - "Community 36"
+### Community 34 - "Community 34"
 Cohesion: 0.29
 Nodes (2): fetchQcMaterialList(), fetchQcMaterialOptions()
 
-### Community 37 - "Community 37"
+### Community 35 - "Community 35"
 Cohesion: 0.47
 Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
 
+### Community 36 - "Community 36"
+Cohesion: 0.33
+Nodes (2): fetchSampleReceptionCheckItemList(), fetchSampleReceptionCheckItemsActive()
+
+### Community 37 - "Community 37"
+Cohesion: 0.33
+Nodes (2): fetchQcThirdPartyItemList(), fetchQcThirdPartyItemsActive()
+
 ### Community 38 - "Community 38"
 Cohesion: 0.33
-Nodes (2): fetchQcLabTestItemList(), fetchQcLabTestItemsActive()
+Nodes (2): fetchQcThirdPartyCompanyList(), fetchQcThirdPartyCompanyOptions()
 
 ### Community 39 - "Community 39"
+Cohesion: 0.33
+Nodes (2): fetchCellProductDetail(), fetchCellProductList()
+
+### Community 40 - "Community 40"
+Cohesion: 0.33
+Nodes (2): fetchQcTaskDetail(), fetchQcTaskList()
+
+### Community 41 - "Community 41"
 Cohesion: 0.5
 Nodes (2): focusInput(), handleKeydown()
 
-### Community 40 - "Community 40"
+### Community 42 - "Community 42"
 Cohesion: 0.67
 Nodes (2): if(), logSidebarMenu()
 
-### Community 41 - "Community 41"
+### Community 43 - "Community 43"
 Cohesion: 1.0
 Nodes (2): getSettingDefaults(), resetToDefaults()
 
-### Community 43 - "Community 43"
+### Community 45 - "Community 45"
 Cohesion: 1.0
 Nodes (2): defaultAvatarPathByRole(), resolveUserAvatarUrl()
 
 ## Knowledge Gaps
-- **Thin community `Community 22`** (17 nodes): `ComponentLoader`, `.constructor()`, `.createEmptyComponent()`, `.createErrorComponent()`, `.load()`, `.loadIframe()`, `.loadLayout()`, `.load()`, `RouteTransformer`, `.extractFirstSegment()`, `.handleFirstLevelRoute()`, `.handleIframeRoute()`, `.handleNormalRoute()`, `.isFirstLevelRoute()`, `.transform()`, `ComponentLoader.ts`, `RouteTransformer.ts`
+- **Thin community `Community 20`** (17 nodes): `ComponentLoader`, `.constructor()`, `.createEmptyComponent()`, `.createErrorComponent()`, `.load()`, `.loadIframe()`, `.loadLayout()`, `.load()`, `RouteTransformer`, `.extractFirstSegment()`, `.handleFirstLevelRoute()`, `.handleIframeRoute()`, `.handleNormalRoute()`, `.isFirstLevelRoute()`, `.transform()`, `ComponentLoader.ts`, `RouteTransformer.ts`
+  Too small to be a meaningful cluster - may be noise or needs more connections extracted.
+- **Thin community `Community 31`** (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 32`** (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 33`** (7 nodes): `fetchCreateLeave()`, `fetchDeleteLeave()`, `fetchLeaveDetail()`, `fetchLeaveList()`, `fetchSubmitLeave()`, `fetchUpdateLeave()`, `leave.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 28`** (14 nodes): `fetchAddTaskStep()`, `fetchCreateProductionTask()`, `fetchDeleteTaskStep()`, `fetchProductionTaskDetail()`, `fetchProductionTaskList()`, `fetchReplaceStepConsumables()`, `fetchReplaceStepDataCollection()`, `fetchReplaceStepReagents()`, `fetchSetTaskInputs()`, `fetchSetTaskOutputs()`, `fetchUpdateProductionTask()`, `fetchUpdateProductionTaskStatus()`, `fetchUpdateTaskStep()`, `production-task.ts`
+- **Thin community `Community 34`** (7 nodes): `fetchCreateQcMaterial()`, `fetchDeleteQcMaterial()`, `fetchQcMaterialList()`, `fetchQcMaterialOptions()`, `fetchStockInQcMaterial()`, `fetchUpdateQcMaterial()`, `qc-material.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 33`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
+- **Thin community `Community 36`** (6 nodes): `fetchCreateSampleReceptionCheckItem()`, `fetchDeleteSampleReceptionCheckItem()`, `fetchSampleReceptionCheckItemList()`, `fetchSampleReceptionCheckItemsActive()`, `fetchUpdateSampleReceptionCheckItem()`, `sample-reception-check-item.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 34`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
+- **Thin community `Community 37`** (6 nodes): `fetchCreateQcThirdPartyItem()`, `fetchDeleteQcThirdPartyItem()`, `fetchQcThirdPartyItemList()`, `fetchQcThirdPartyItemsActive()`, `fetchUpdateQcThirdPartyItem()`, `qc-third-party-item.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 35`** (7 nodes): `fetchCreateLeave()`, `fetchDeleteLeave()`, `fetchLeaveDetail()`, `fetchLeaveList()`, `fetchSubmitLeave()`, `fetchUpdateLeave()`, `leave.ts`
+- **Thin community `Community 38`** (6 nodes): `fetchCreateQcThirdPartyCompany()`, `fetchDeleteQcThirdPartyCompany()`, `fetchQcThirdPartyCompanyList()`, `fetchQcThirdPartyCompanyOptions()`, `fetchUpdateQcThirdPartyCompany()`, `qc-third-party-company.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 36`** (7 nodes): `fetchCreateQcMaterial()`, `fetchDeleteQcMaterial()`, `fetchQcMaterialList()`, `fetchQcMaterialOptions()`, `fetchStockInQcMaterial()`, `fetchUpdateQcMaterial()`, `qc-material.ts`
+- **Thin community `Community 39`** (6 nodes): `fetchCellProductDetail()`, `fetchCellProductList()`, `fetchCreateCellProduct()`, `fetchDeleteCellProduct()`, `fetchUpdateCellProduct()`, `cell-product.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 38`** (6 nodes): `fetchCreateQcLabTestItem()`, `fetchDeleteQcLabTestItem()`, `fetchQcLabTestItemList()`, `fetchQcLabTestItemsActive()`, `fetchUpdateQcLabTestItem()`, `qc-lab-test-item.ts`
+- **Thin community `Community 40`** (6 nodes): `fetchCompleteQcTask()`, `fetchQcTaskDetail()`, `fetchQcTaskList()`, `fetchStartQcTask()`, `fetchUpdateQcTaskAttachments()`, `qc-task.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 39`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
+- **Thin community `Community 41`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 40`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
+- **Thin community `Community 42`** (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 41`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
+- **Thin community `Community 43`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
   Too small to be a meaningful cluster - may be noise or needs more connections extracted.
-- **Thin community `Community 43`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
+- **Thin community `Community 45`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.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 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 25`, `Community 27`, `Community 28`, `Community 30`, `Community 35`, `Community 36`, `Community 38`?**
-  _High betweenness centrality (0.233) - this node is a cross-community bridge._
-- **Why does `push()` connect `Community 5` to `Community 0`, `Community 2`, `Community 3`, `Community 4`, `Community 6`, `Community 11`, `Community 12`, `Community 17`, `Community 18`?**
-  _High betweenness centrality (0.091) - this node is a cross-community bridge._
-- **Why does `handleDynamicRoutes()` connect `Community 3` to `Community 5`, `Community 14`?**
-  _High betweenness centrality (0.052) - this node is a cross-community bridge._
+- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 8`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 19`, `Community 24`, `Community 25`, `Community 28`, `Community 33`, `Community 34`, `Community 36`, `Community 37`, `Community 38`, `Community 39`, `Community 40`?**
+  _High betweenness centrality (0.225) - this node is a cross-community bridge._
+- **Why does `push()` connect `Community 4` to `Community 0`, `Community 2`, `Community 3`, `Community 6`, `Community 7`, `Community 10`, `Community 11`, `Community 17`?**
+  _High betweenness centrality (0.096) - this node is a cross-community bridge._
+- **Why does `handleDynamicRoutes()` connect `Community 3` to `Community 4`, `Community 13`?**
+  _High betweenness centrality (0.047) - this node is a cross-community bridge._
 - **Are the 149 inferred relationships involving `get()` (e.g. with `buildTreePathLabelFromFlat()` and `alignFqPaymentDetailsForDisplay()`) actually correct?**
   _`get()` has 149 INFERRED edges - model-reasoned connections that need verification._
 - **Are the 20 inferred relationships involving `withFullscreenLoading()` (e.g. with `.close()` and `handleSubmit()`) actually correct?**
   _`withFullscreenLoading()` has 20 INFERRED edges - model-reasoned connections that need verification._
-- **Are the 19 inferred relationships involving `push()` (e.g. with `fetchAllPagedRecords()` and `calcInstallmentDueAmounts()`) actually correct?**
-  _`push()` has 19 INFERRED edges - model-reasoned connections that need verification._
+- **Are the 18 inferred relationships involving `push()` (e.g. with `fetchAllPagedRecords()` and `calcInstallmentDueAmounts()`) actually correct?**
+  _`push()` has 18 INFERRED edges - model-reasoned connections that need verification._
 - **Should `Community 0` be split into smaller, more focused modules?**
   _Cohesion score 0.01 - nodes in this community are weakly interconnected._

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


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


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

@@ -1,6 +1,6 @@
 {
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/App.vue": 1779227461.5503292,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts": 1778582068.0052972,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts": 1779258114.8468678,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/env.d.ts": 1778582067.998984,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/shims-loose.d.ts": 1778582068.0215242,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/directives/index.ts": 1778582067.9976711,
@@ -17,8 +17,8 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1778582068.0254738,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1778582068.026978,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1778582068.0246184,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1779252747.4872186,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1779247808.9064798,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1779259535.4025662,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1779258689.222576,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1778582068.0293276,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1778775532.895603,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1778582068.004279,
@@ -212,14 +212,14 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts": 1779229719.5245204,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/system.ts": 1778582067.862994,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material.ts": 1779230497.4437034,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception.ts": 1779175599.405736,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception.ts": 1779255909.8553667,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/auth.ts": 1778582067.8610063,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1779180968.908451,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/auth/login/index.vue": 1778910234.3222458,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/refund-confirm/index.vue": 1779227503.9687061,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1779253420.0480523,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolStatusChangeDialog.vue": 1779161483.857836,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1779253423.3756242,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1779255586.96183,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue": 1778938314.528914,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1779200506.6351457,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAuditDialog.vue": 1778978838.5026703,
@@ -232,28 +232,28 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1779247462.6808264,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/outside/Iframe.vue": 1778582068.071536,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/demo/index.vue": 1779227504.0518396,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/clean-room/index.vue": 1779227504.1094522,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/clean-room/index.vue": 1779257191.2628584,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue": 1779227504.140581,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/exhibition-appointment/index.vue": 1779227504.1494327,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/exhibition-appointment/index.vue": 1779257191.2639105,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/audit/index.vue": 1779227504.1761265,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/index.vue": 1779227504.1804457,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationAuditDialog.vue": 1779112125.8042517,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1779254486.7302408,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1779255542.4968102,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1779199512.4395914,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationStatusChangeDialog.vue": 1779161484.445245,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1779227504.1947322,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue": 1779227504.198454,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue": 1779257191.2809517,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/order/index.vue": 1779227504.2074113,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue": 1779227504.217365,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/role/index.vue": 1779227504.225613,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/post/index.vue": 1779227504.2338052,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/category/index.vue": 1779227504.23895,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/express/index.vue": 1779227504.2433767,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue": 1779227504.2464156,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue": 1779257191.2812536,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/role/index.vue": 1779257191.279841,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/post/index.vue": 1779257191.278071,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/category/index.vue": 1779257191.273557,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/express/index.vue": 1779257191.276537,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue": 1779257191.281717,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/detail.vue": 1778775532.9022598,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-dialog.vue": 1778775532.9028454,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-search.vue": 1778582068.0978386,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/product/index.vue": 1779227504.254309,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/product/index.vue": 1779257191.279313,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/my-applications/index.vue": 1779227504.2606454,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-pending/index.vue": 1779227504.2707877,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-completed/index.vue": 1779227504.2790737,
@@ -261,52 +261,52 @@
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/components/ApprovalDialog.vue": 1778726550.7429476,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/designer/FlowDesigner.vue": 1778758509.6141794,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/process/index.vue": 1779227504.2942972,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/menu/index.vue": 1779227504.3028471,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/site/index.vue": 1779227504.3174644,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dept/index.vue": 1779227504.3256836,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue": 1779227504.3335083,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1779227504.3385537,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue": 1779227504.3470194,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/menu/index.vue": 1779257191.27756,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/site/index.vue": 1779257191.280453,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dept/index.vue": 1779259560.1445239,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue": 1779259163.7560437,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1779257191.2768743,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue": 1779257191.2697432,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/index.vue": 1779227504.3581011,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-route/index.vue": 1779227504.3756542,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sop/index.vue": 1779227504.3932817,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-route/index.vue": 1779257191.2718098,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sop/index.vue": 1779257191.2729118,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-task/index.vue": 1779227504.4261596,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue": 1779227504.4347544,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue": 1779257191.2725492,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue": 1779227504.4425921,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable-pack/index.vue": 1779227504.4548802,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue": 1779227504.4683006,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/index.vue": 1779227504.477872,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue": 1779227504.4907124,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable-pack/index.vue": 1779257191.268789,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue": 1779257191.2678325,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/index.vue": 1779257191.2705104,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue": 1779257191.2710657,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1778582068.070888,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1779227504.4966545,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception-check-item/index.vue": 1779227504.506105,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1779227504.5119748,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1779247473.0542848,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1779227504.5202835,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1779255980.3303447,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-task/index.vue": 1779230107.5226734,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue": 1779247570.0360196,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/third-party-company/index.vue": 1779227504.5332224,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/500/index.vue": 1778582068.0705533,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/403/index.vue": 1778582068.0697916,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/404/index.vue": 1778582068.0701847,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/index.vue": 1779227504.5398912,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/index.vue": 1779257191.2655544,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/index.vue": 1779227504.5469866,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/CheckupPackagePanel.vue": 1779183442.0366285,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/index.vue": 1779227504.5599887,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/index.vue": 1779257191.266318,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelViewDialog.vue": 1779200648.692725,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue": 1779227504.5666144,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/project-price-system/index.vue": 1779227504.5711877,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue": 1779227504.5794835,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/sample-code/index.vue": 1779235428.819512,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/index.vue": 1779235427.422648,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue": 1779257191.2644286,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/project-price-system/index.vue": 1779257191.2666597,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue": 1779257191.265186,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/sample-code/index.vue": 1779257191.2613704,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/index.vue": 1779257191.2560186,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1779248595.3531237,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1779235425.8449798,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1779235305.2294273,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1779235424.7565684,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1779257191.2566798,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1779257191.261004,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1779257191.260546,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/assets/svg/loading.ts": 1778582067.932299,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/index.ts": 1778582068.0218356,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1779240489.093459,
-  "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/table.ts": 1778582068.0227401,
+  "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/table.ts": 1779257771.098434,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts": 1779240273.3067045,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/setting.ts": 1778582068.0225098,
   "/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/user.ts": 1778582068.0230925,

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


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


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


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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "label": "ProtocolViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1"}, {"id": "protocol_protocolviewdialog_dash", "label": "dash()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310"}, {"id": "protocol_protocolviewdialog_handleclosed", "label": "handleClosed()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1623"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_dash", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_handleclosed", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1623", "weight": 1.0}], "raw_calls": [{"caller_nid": "protocol_protocolviewdialog_dash", "callee": "unitName", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310"}]}

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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_leave_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_express_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/express/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_consumable_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_output_type_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_reagent_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_unit_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_pilot_service_cell_product_type_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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

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

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_operations_exhibition_appointment_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/exhibition-appointment/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_dict_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_dict_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_tenant_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_sample_reception_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue", "source_location": "L1"}, {"id": "sample_reception_index_pad", "label": "pad()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue", "source_location": "L802"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_sample_reception_index_vue", "target": "sample_reception_index_pad", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue", "source_location": "L802", "weight": 1.0}], "raw_calls": [{"caller_nid": "sample_reception_index_pad", "callee": "padStart", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue", "source_location": "L802"}, {"caller_nid": "sample_reception_index_pad", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue", "source_location": "L802"}]}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_pilot_service_cell_product_spec_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_process_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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


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


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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_process_category_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_consumable_pack_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable-pack/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

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

@@ -0,0 +1 @@
+{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_pilot_service_cell_product_price_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}

+ 111 - 14
web-admin/src/views/system/dept/index.vue

@@ -144,6 +144,24 @@
           :scroll-into-view-options="{ behavior: 'smooth', block: 'center' }"
         >
           <div class="form-grid-2">
+            <el-form-item label="上级组织" style="grid-column: 1 / -1">
+              <el-tree-select
+                v-model="parentSelectId"
+                :data="deptTreeSelectData"
+                node-key="value"
+                :props="{ label: 'label', children: 'children' }"
+                check-strictly
+                filterable
+                clearable
+                :disabled="isEdit"
+                placeholder="请选择上级组织(留空为顶级)"
+                class="w-full"
+              >
+                <template #label="{ value }">
+                  {{ formatDeptPathLabel(value) }}
+                </template>
+              </el-tree-select>
+            </el-form-item>
             <el-form-item label="组织名称" prop="deptName" style="grid-column: 1 / -1">
               <el-input v-model="formData.deptName" placeholder="请输入组织名称" />
             </el-form-item>
@@ -235,11 +253,15 @@
     fetchDictDataOptions,
     fetchUserList
   } from '@/api/admin'
+  import { buildTreePathLabelFromFlat } from '@/utils/tree-path'
 
   defineOptions({ name: 'SystemDept' })
 
   const searchForm = reactive<{ keyword: string }>({ keyword: '' })
   const tableData = ref<Api.Dept.DeptItem[]>([])
+  /** 弹窗上级组织:全量树(不受列表关键词筛选影响) */
+  const deptTreeForSelect = ref<Api.Dept.DeptItem[]>([])
+  const deptFlatList = ref<Api.Dept.DeptItem[]>([])
   const selectedRows = ref<Api.Dept.DeptItem[]>([])
   const loading = ref(false)
   const isExpandAll = ref(true)
@@ -273,6 +295,56 @@
   const deptCategoryOptions = ref<Api.Dict.DictDataOption[]>([])
   const statusOptions = ref<Api.Dict.DictDataOption[]>([])
 
+  type DeptTreeSelectNode = { value: string; label: string; children?: DeptTreeSelectNode[] }
+
+  function flattenDeptTree(nodes: Api.Dept.DeptItem[]): Api.Dept.DeptItem[] {
+    const out: Api.Dept.DeptItem[] = []
+    const walk = (list: Api.Dept.DeptItem[]) => {
+      for (const n of list) {
+        out.push({ ...n, children: undefined })
+        if (n.children?.length) walk(n.children)
+      }
+    }
+    walk(nodes || [])
+    return out
+  }
+
+  function buildDeptTreeSelectData(nodes: Api.Dept.DeptItem[]): DeptTreeSelectNode[] {
+    return (nodes || []).map((n) => ({
+      value: n.id,
+      label: n.deptName || '',
+      children: n.children?.length ? buildDeptTreeSelectData(n.children) : undefined
+    }))
+  }
+
+  const deptTreeSelectData = computed(() => buildDeptTreeSelectData(deptTreeForSelect.value))
+
+  const parentSelectId = computed({
+    get() {
+      const pid = (formData.parentId || '').trim()
+      return pid && pid !== '0' ? pid : undefined
+    },
+    set(val: string | undefined) {
+      formData.parentId = val ? val : '0'
+    }
+  })
+
+  function formatDeptPathLabel(nodeId: string | null | undefined) {
+    const id = String(nodeId ?? '').trim()
+    if (!id) return ''
+    return (
+      buildTreePathLabelFromFlat(id, deptFlatList.value, { nameKey: 'deptName' }) ||
+      deptFlatList.value.find((d) => d.id === id)?.deptName ||
+      ''
+    )
+  }
+
+  function getParentDeptDisplay(parentId: string | null | undefined) {
+    const pid = (parentId || '').trim()
+    if (!pid || pid === '0') return '无(顶级组织)'
+    return formatDeptPathLabel(pid) || pid
+  }
+
   /** 负责人:关联 sys_user,提交仍写 leader / leaderPhone 字符串 */
   const leaderUserId = ref<string | null>(null)
   const leaderUserOptions = ref<Api.User.UserItem[]>([])
@@ -398,6 +470,7 @@
       title: '基本信息',
       fields: [
         { label: '组织名称', value: viewRow.value?.deptName },
+        { label: '上级组织', value: getParentDeptDisplay(viewRow.value?.parentId) },
         { label: '组织类别', value: getDeptCategoryLabel(viewRow.value?.deptCategoryCode || '') },
         { label: '状态', value: viewRow.value?.status === '1' ? '正常' : '停用', tagType: viewRow.value?.status === '1' ? 'success' : 'info' },
         { label: '负责人', value: viewRow.value?.leader },
@@ -440,6 +513,18 @@
     else postorder(tableData.value)
   }
 
+  async function loadDeptTreeForSelect() {
+    try {
+      const res = await fetchDeptTree()
+      deptTreeForSelect.value = res || []
+      deptFlatList.value = flattenDeptTree(deptTreeForSelect.value)
+    } catch (error) {
+      console.error('加载上级组织选项失败:', error)
+      deptTreeForSelect.value = []
+      deptFlatList.value = []
+    }
+  }
+
   async function loadData() {
     loading.value = true
     try {
@@ -528,24 +613,35 @@
     await formRef.value?.validate?.()
     submitLoading.value = true
     try {
-      const payload = {
-        parentId: formData.parentId || undefined,
-        deptName: formData.deptName.trim(),
-        deptCategoryCode: formData.deptCategoryCode || undefined,
-        status: formData.status,
-        leader: formData.leader?.trim() || undefined,
-        leaderPhone: formData.leaderPhone?.trim() || undefined,
-        orderNum: formData.orderNum,
-        remark: formData.remark?.trim() || undefined
-      }
+      const leader = (formData.leader ?? '').trim()
+      const leaderPhone = (formData.leaderPhone ?? '').trim()
+      const remark = (formData.remark ?? '').trim()
       if (isEdit.value && editingId.value) {
-        await fetchUpdateDept(editingId.value, payload)
+        // 编辑时须显式传空字符串,否则 undefined 不会进入请求体,后端无法清空字段
+        await fetchUpdateDept(editingId.value, {
+          deptName: formData.deptName.trim(),
+          deptCategoryCode: formData.deptCategoryCode || '',
+          status: formData.status,
+          leader,
+          leaderPhone,
+          orderNum: formData.orderNum,
+          remark
+        })
       } else {
-        await fetchCreateDept(payload)
+        await fetchCreateDept({
+          parentId: formData.parentId || undefined,
+          deptName: formData.deptName.trim(),
+          deptCategoryCode: formData.deptCategoryCode || undefined,
+          status: formData.status,
+          leader: leader || undefined,
+          leaderPhone: leaderPhone || undefined,
+          orderNum: formData.orderNum,
+          remark: remark || undefined
+        })
       }
       ElMessage.success(isEdit.value ? '更新成功' : '创建成功')
       dialogVisible.value = false
-      await loadData()
+      await Promise.all([loadData(), loadDeptTreeForSelect()])
     } catch {
       /* 校验或接口错误已由全局处理 */
     } finally {
@@ -563,7 +659,7 @@
       await ElMessageBox.confirm(confirmText, '提示', { type: 'warning' })
       await fetchDeleteDept(row.id)
       ElMessage.success('删除成功')
-      await loadData()
+      await Promise.all([loadData(), loadDeptTreeForSelect()])
     } catch (error: any) {
       if (error !== 'cancel') console.error('删除失败:', error)
     }
@@ -576,6 +672,7 @@
 
   onMounted(() => {
     loadData()
+    loadDeptTreeForSelect()
     loadDictOptions()
   })
 </script>

+ 187 - 97
web-admin/src/views/system/dict/index.vue

@@ -204,95 +204,159 @@
       <SystemViewDialog
         v-model:visible="viewVisible"
         :title="viewRow?.dictName || '字典详情'"
+        width="900px"
         :icon="Collection"
         :meta="`字典类型编码:${viewRow?.dictType || ''}${viewRow?.createTime ? ' · ' + viewRow.createTime : ''}`"
         :sections="viewSections"
-      />
+      >
+        <template #append>
+          <div class="view-section dict-view-data-section">
+            <h3>字典数据</h3>
+            <div class="list-body list-wrap dict-view-table-wrap">
+              <el-table
+                class="list-table"
+                :data="viewDictDataList"
+                v-loading="viewDictDataLoading"
+                stripe
+                row-key="id"
+                empty-text="暂无字典数据"
+              >
+                <el-table-column
+                  type="index"
+                  label="序号"
+                  width="68"
+                  align="center"
+                  header-align="center"
+                />
+                <el-table-column
+                  prop="dictLabel"
+                  label="数据标签"
+                  min-width="120"
+                  align="center"
+                  header-align="center"
+                />
+                <el-table-column
+                  prop="dictValue"
+                  label="数据值"
+                  min-width="120"
+                  align="center"
+                  header-align="center"
+                />
+                <el-table-column
+                  prop="remark"
+                  label="备注"
+                  min-width="150"
+                  show-overflow-tooltip
+                  align="center"
+                  header-align="center"
+                />
+              </el-table>
+            </div>
+          </div>
+        </template>
+      </SystemViewDialog>
     </section>
 
     <el-dialog
       v-model="dictDataDialogVisible"
       :title="`${currentDictType.dictName} - 字典数据配置`"
       width="900px"
-      class="dialog-form-layout"
+      class="dialog-form-layout dict-data-config-dialog"
       align-center
       destroy-on-close
       :close-on-click-modal="false"
     >
-      <div style="margin-bottom: 12px">
-        <el-button class="btn-main" type="primary" @click="handleAddDictData">
-          <el-icon><Plus /></el-icon>
-          新增数据
-        </el-button>
+      <div class="dict-data-dialog-head">
+        <span class="muted">字典类型编码:{{ currentDictType.dictType }}</span>
       </div>
-
-      <el-table
-        :data="dictDataTableData"
-        v-loading="dictDataLoading"
-        stripe
-        row-key="id"
-      >
-        <el-table-column type="index" label="#" width="50" align="center" />
-        <el-table-column
-          prop="dictLabel"
-          label="数据标签"
-          min-width="120"
-          align="center"
-          header-align="center"
-        />
-        <el-table-column
-          prop="dictValue"
-          label="数据值"
-          min-width="120"
-          align="center"
-          header-align="center"
-        />
-        <el-table-column
-          prop="remark"
-          label="备注"
-          min-width="120"
-          show-overflow-tooltip
-          align="center"
-          header-align="center"
-        />
-        <el-table-column
-          label="操作"
-          width="160"
-          fixed="right"
-          align="center"
-          header-align="center"
+      <div class="list-toolbar dict-data-toolbar">
+        <div class="list-toolbar-row">
+          <el-button class="btn-main" type="primary" @click="handleAddDictData">
+            <el-icon><Plus /></el-icon>
+            新增数据
+          </el-button>
+        </div>
+      </div>
+      <div class="list-body list-wrap dict-data-table-wrap">
+        <el-table
+          class="list-table"
+          :data="dictDataTableData"
+          v-loading="dictDataLoading"
+          stripe
+          row-key="id"
         >
-          <template #default="{ row }">
-            <el-button
-              class="btn-op-item primary"
-              @click="handleEditDictData(row)"
-            >
-              编辑
-            </el-button>
-            <el-button class="btn-op-item" @click="handleDeleteDictData(row)">
-              删除
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="pagination list-pager-bar" style="margin-top: 12px">
-        <el-pagination
-          :current-page="dictDataPagination.page"
-          :page-size="dictDataPagination.pageSize"
-          :total="dictDataPagination.total"
-          :page-sizes="[10, 20, 50]"
-          layout="total, sizes, prev, pager, next"
-          @size-change="
-            (val) => (
-              (dictDataPagination.page = 1),
-              (dictDataPagination.pageSize = val),
-              loadDictData()
-            )
-          "
-          @current-change="
-            (val) => ((dictDataPagination.page = val), loadDictData())
-          "
-        />
+          <el-table-column
+            type="index"
+            label="序号"
+            width="68"
+            align="center"
+            header-align="center"
+            :index="
+              (index) =>
+                (dictDataPagination.page - 1) * dictDataPagination.pageSize + index + 1
+            "
+          />
+          <el-table-column
+            prop="dictLabel"
+            label="数据标签"
+            min-width="120"
+            align="center"
+            header-align="center"
+          />
+          <el-table-column
+            prop="dictValue"
+            label="数据值"
+            min-width="120"
+            align="center"
+            header-align="center"
+          />
+          <el-table-column
+            prop="remark"
+            label="备注"
+            min-width="150"
+            show-overflow-tooltip
+            align="center"
+            header-align="center"
+          />
+          <el-table-column
+            label="操作"
+            width="260"
+            fixed="right"
+            align="center"
+            header-align="center"
+          >
+            <template #default="{ row }">
+              <el-button
+                class="btn-op-item primary"
+                @click="handleEditDictData(row)"
+              >
+                编辑
+              </el-button>
+              <el-button class="btn-op-item" @click="handleDeleteDictData(row)">
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pagination list-pager-bar">
+          <el-pagination
+            :current-page="dictDataPagination.page"
+            :page-size="dictDataPagination.pageSize"
+            :total="dictDataPagination.total"
+            :page-sizes="[10, 20, 50]"
+            layout="total, sizes, prev, pager, next"
+            @size-change="
+              (val) => (
+                (dictDataPagination.page = 1),
+                (dictDataPagination.pageSize = val),
+                loadDictData()
+              )
+            "
+            @current-change="
+              (val) => ((dictDataPagination.page = val), loadDictData())
+            "
+          />
+        </div>
       </div>
 
       <el-dialog
@@ -385,6 +449,7 @@
   const viewVisible = ref(false)
   const viewRow = ref<Api.Dict.DictTypeItem | null>(null)
   const viewDictDataList = ref<Api.Dict.DictDataItem[]>([])
+  const viewDictDataLoading = ref(false)
 
   const formData = reactive({
     dictName: '',
@@ -436,35 +501,23 @@
     editingId.value = null
   }
 
-  const viewSections = computed(() => {
-    const sections: any[] = [
-      {
-        title: '基本信息',
-        fields: [
-          { label: '字典名称', value: viewRow.value?.dictName },
-          { label: '字典类型编码', value: viewRow.value?.dictType },
-          { label: '备注', value: viewRow.value?.remark, span: true },
-          { label: '创建时间', value: viewRow.value?.createTime }
-        ]
-      }
-    ]
-    if (viewDictDataList.value.length > 0) {
-      sections.push({
-        title: '字典数据',
-        fields: viewDictDataList.value.map((item) => ({
-          label: item.dictLabel || '',
-          value: item.dictValue || '',
-          span: false
-        }))
-      })
+  const viewSections = computed(() => [
+    {
+      title: '基本信息',
+      fields: [
+        { label: '字典名称', value: viewRow.value?.dictName },
+        { label: '字典类型编码', value: viewRow.value?.dictType },
+        { label: '备注', value: viewRow.value?.remark, span: true },
+        { label: '创建时间', value: viewRow.value?.createTime }
+      ]
     }
-    return sections
-  })
+  ])
 
   async function handleView(row: Api.Dict.DictTypeItem) {
     viewRow.value = { ...row }
     viewDictDataList.value = []
     viewVisible.value = true
+    viewDictDataLoading.value = true
     try {
       const res = await fetchDictDataList({
         page: 1,
@@ -474,6 +527,8 @@
       viewDictDataList.value = res.list || []
     } catch (e) {
       console.error('加载字典数据失败:', e)
+    } finally {
+      viewDictDataLoading.value = false
     }
   }
 
@@ -668,6 +723,41 @@
     :deep(.el-form-item) {
       margin-bottom: 0;
     }
+  }
+
+  .dict-view-data-section {
+    padding: 18px 22px;
+    border-bottom: none;
+
+    h3 {
+      margin: 0 0 14px;
+      padding-left: 10px;
+      font-size: 14px;
+      font-weight: 600;
+      color: #1e293b;
+      border-left: 3px solid #10b981;
+      line-height: 1;
+    }
+  }
+
+  .dict-view-table-wrap {
+    padding-top: 0;
+  }
+
+  .dict-data-dialog-head {
+    margin-bottom: 12px;
+
+    .muted {
+      font-size: 13px;
+      color: var(--mint-text-muted);
+    }
+  }
+
+  .dict-data-toolbar {
+    margin-bottom: 0;
+  }
 
+  .dict-data-table-wrap {
+    padding-top: 0;
   }
 </style>

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