From d0ce897a0f97e060c874ddc64c314052f73b1477 Mon Sep 17 00:00:00 2001 From: liu <2302563948@qq.com> Date: Sat, 29 Aug 2026 13:54:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=94=AE=E5=90=8E=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .phpunit.result.cache | 2 +- app/Exports/BillExport.php | 14 +++- app/Http/Controllers/Mini/BillController.php | 1 + app/Http/Controllers/Mini/CartController.php | 1 + app/Http/Controllers/Mini/OrderController.php | 1 + .../Controllers/Mini/PaymentController.php | 2 +- .../Controllers/Recon/PaymentController.php | 2 +- .../Purchase/PurchaseBillGenerateRequest.php | 8 +- app/Models/BillModel.php | 1 + app/Models/StoreOrderItemModel.php | 1 + app/Services/BillGenerateService.php | 12 +-- ..._07_23_030610_create_store_order_table.php | 1 + .../2026_08_13_000001_create_bill_table.php | 4 +- public/assets/bill-Yl-chnYY.js | 1 + public/assets/index-CkDjMKy9.css | 2 + public/assets/index-eBrnVZAn.js | 20 +++++ public/assets/order-9whwRixn.js | 1 + public/index.html | 4 +- tests/Feature/BillExportTest.php | 24 +++--- tests/Feature/BillPaymentTest.php | 73 +++++++++++++++++-- tests/Feature/MiniBillTest.php | 3 +- web/api/purchase/order.ts | 6 +- web/domain/iPurchaseOrder.ts | 4 +- web/pages/purchase/order.tsx | 20 ++--- web/pages/recon/bill.tsx | 25 +++++-- 25 files changed, 175 insertions(+), 58 deletions(-) create mode 100644 public/assets/bill-Yl-chnYY.js create mode 100644 public/assets/index-CkDjMKy9.css create mode 100644 public/assets/index-eBrnVZAn.js create mode 100644 public/assets/order-9whwRixn.js diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 469594f..7e70230 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":2,"defects":{"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":8,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":8,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":7,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":8,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":8,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":8,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":8,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":8,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":8,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":7,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":7,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":8,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":7,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":8,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":8,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":7,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":7,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":7,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":5,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":7,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":7,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":8,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":8,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":7,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":8,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":8,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":8,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":8,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":8,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":8,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":8,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":8,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":7,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":8,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":7,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":7,"Tests\\Feature\\ExportTest::test_export_pdf":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":7,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":7,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":7,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":8,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":7,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":8,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":8,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":8,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":7,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":7,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":8,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":7,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":7,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":7,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":7,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":7,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":7,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":8,"Tests\\Feature\\DashboardDebugTest::test_debug":8,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":8,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":8,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":8,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":8,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":8,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":7,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":8,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":7,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":7,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":7,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":7},"times":{"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":0.017,"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":0.089,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":0.007,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":0.01,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":0.007,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":0.05,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":0.048,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":0.007,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":0.05,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":0.05,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":0.095,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":0.028,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":0.101,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":0.006,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":0.101,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":0.076,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":0.022,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":0.028,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":0.021,"Tests\\Feature\\DebugGenerateTest::test_debug_generate":0.047,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":0.019,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":0.022,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":0.019,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":0.02,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":0.036,"Tests\\Feature\\StatementTest::test_generate_snapshots_payment_cycle":0.011,"Tests\\Feature\\StatementTest::test_statement_isolated_between_stores":0.013,"Tests\\Feature\\StatementTest::test_generate_excludes_cancelled_and_used_items":0.016,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":0.056,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":0.003,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":0.005,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":0.001,"Tests\\Feature\\MiniAuthTest::test_sys_token_cannot_access_mini":0.005,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":0.045,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":0.1,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":0.017,"Tests\\Feature\\ExportTest::test_export_pdf":0.015,"Tests\\Feature\\ExportTest::test_export_invalid_format_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_requires_export_permission":0.056,"Tests\\Unit\\ExampleTest::test_that_true_is_true":0.001,"Tests\\Feature\\MiniAuthTest::test_login_fails_when_wechat_rejects_code":0.003,"Tests\\Feature\\CartTest::test_add_to_cart_succeeds":0.046,"Tests\\Feature\\CartTest::test_duplicate_add_merges_quantity":0.049,"Tests\\Feature\\CartTest::test_off_shelf_product_rejected":0.048,"Tests\\Feature\\CartTest::test_soft_deleted_product_rejected":0.008,"Tests\\Feature\\CartTest::test_product_without_level_price_rejected":0.006,"Tests\\Feature\\CartTest::test_unbound_user_rejected":0.006,"Tests\\Feature\\CartTest::test_store_without_level_rejected":0.087,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":0.05,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":0.051,"Tests\\Feature\\CartTest::test_empty_cart_returns_empty_items":0.046,"Tests\\Feature\\CartTest::test_update_quantity":0.048,"Tests\\Feature\\CartTest::test_update_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_update_missing_item_rejected":0.049,"Tests\\Feature\\CartTest::test_invalid_quantity_rejected":0.048,"Tests\\Feature\\CartTest::test_delete_item":0.048,"Tests\\Feature\\CartTest::test_delete_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_clear_only_own_cart":0.109,"Tests\\Feature\\CartTest::test_unauthenticated_returns_401":0.002,"Tests\\Feature\\CartTest::test_cart_isolated_between_users":0.011,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":0.057,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_fixed_and_percent":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_actual_price":0.009,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":0.046,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":0.008,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":0.007,"Tests\\Feature\\ProductCostPriceTest::test_update_switches_fixed_to_percent":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":0.009,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":0.008,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":0.007,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_percent_columns":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":0.01,"Tests\\Feature\\PurchaseGenerateTest::test_generate_uses_min_actual_price_across_types":0.014,"Tests\\Feature\\ProductPriceTest::test_store_without_level_sees_products_without_price":0.045,"Tests\\Feature\\ProductPriceTest::test_unbound_user_can_browse_products_without_price_but_cannot_cart":0.009,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_registered_user":0.01,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unregistered_openid":0.002,"Tests\\Feature\\MiniAuthTest::test_register_binds_store_and_issues_token":0.009,"Tests\\Feature\\MiniAuthTest::test_register_rejects_unknown_store":0.002,"Tests\\Feature\\MiniAuthTest::test_register_rejects_duplicate_openid":0.003,"Tests\\Feature\\MiniStoreTest::test_info_returns_bound_store":0.005,"Tests\\Feature\\MiniStoreTest::test_update_info":0.045,"Tests\\Feature\\MiniStoreTest::test_update_info_ignores_readonly_fields":0.047,"Tests\\Feature\\MiniStoreTest::test_requires_bound_store":0.007,"Tests\\Feature\\MiniStoreTest::test_update_info_validates_length":0.046,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":0.012,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":0.022,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":0.019,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":0.02,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":0.014,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_accepted_orders_fails":0.052,"Tests\\Feature\\PurchaseGenerateTest::test_generate_with_selected_order_ids":0.106,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":0.048,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":0.052,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":0.053,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":0.012,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":0.013,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":0.01,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":0.01,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":0.057,"Tests\\Feature\\StoreOrderTest::test_soft_delete_only_cancelled_orders":0.061,"Tests\\Feature\\StoreOrderTest::test_soft_delete_rejected_for_non_cancelled_orders":0.249,"Tests\\Feature\\StoreOrderTest::test_soft_delete_twice_rejected":0.057,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":0.103,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":0.102,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":0.105,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":0.032,"Tests\\Feature\\PurchaseEditTest::test_update_row_requires_at_least_one_field":0.099,"Tests\\Feature\\PurchaseEditTest::test_update_cell_rejects_negative_quantity":0.1,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":0.104,"Tests\\Feature\\ReconciliationTest::test_build_excludes_unfinished_orders":0.016,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":0.104,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":0.019,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":0.102,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_rejects_missing_params":0.1,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":0.104,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":0.012,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":0.113,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":0.107,"Tests\\Feature\\PurchaseEditTest::test_store_summary_returns_aggregated_items":0.101,"Tests\\Feature\\PurchaseEditTest::test_store_summary_aggregates_multiple_orders_with_weighted_price":0.072,"Tests\\Feature\\PurchaseEditTest::test_store_summary_rejects_missing_or_invalid_params":0.102,"Tests\\Feature\\ExportTest::test_export_invalid_type_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_missing_purchase_rejected":0.006,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_container_summary":0.022,"Tests\\Feature\\PurchaseEditTest::test_update_container_syncs_order_amounts":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejected_when_purchase_completed":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejects_incomplete_or_foreign_orders":0.026,"Tests\\Feature\\PurchaseEditTest::test_update_container_validates_negative_and_duplicate_orders":0.018,"Tests\\Feature\\ProductCategoryTest::test_create_child_category_under_top_level":0.007,"Tests\\Feature\\ProductCategoryTest::test_create_category_under_second_level_rejected":0.009,"Tests\\Feature\\ProductCategoryTest::test_update_second_level_move_to_another_top":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_parent_with_children_cannot_move_under_category":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_with_missing_parent_rejected":0.006,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_parent_category_rejected":0.008,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":0.007,"Tests\\Feature\\ProductCategoryTest::test_mini_categories_returns_all_enabled_categories":0.045,"Tests\\Feature\\MiniBillTest::test_bill_list_derives_pay_state_and_settlement_date":0.048,"Tests\\Feature\\MiniBillTest::test_bill_list_summary_aggregates_unpaid":0.047,"Tests\\Feature\\MiniBillTest::test_bill_list_payable_filter":0.047,"Tests\\Feature\\MiniBillTest::test_bill_list_filters_by_bill_date_range":0.051,"Tests\\Feature\\MiniBillTest::test_bill_data_isolated_between_stores":0.089,"Tests\\Feature\\MiniBillTest::test_bill_detail_outputs_bill_items_and_orders":0.049,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":0.054,"Tests\\Feature\\StoreOrderTest::test_order_list_filters_by_order_date_range":0.06,"Tests\\Feature\\StoreOrderTest::test_order_list_rejects_invalid_filters":0.049,"Tests\\Feature\\BillExportTest::test_export_merges_items_across_bills":0.102,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":0.052,"Tests\\Feature\\BillExportTest::test_export_empty_category_rejected":0.086,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":0.052,"Tests\\Feature\\BillExportTest::test_export_invalid_ids_rejected":0.01,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":0.098,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_bound_store":0.014,"Tests\\Feature\\BillExportTest::test_mini_export_requires_store_binding":0.005,"Tests\\Feature\\MiniNoticeTest::test_notice_list_includes_personal_and_broadcast":0.045,"Tests\\Feature\\MiniNoticeTest::test_broadcast_read_creates_personal_copy":0.049,"Tests\\Feature\\MiniNoticeTest::test_personal_notice_read_marks_directly":0.045,"Tests\\Feature\\MiniNoticeTest::test_other_users_notice_not_found":0.007,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_only_accept_and_cancel":0.101,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_rejects_delivery_and_completion":0.149,"Tests\\Feature\\StoreOrderTest::test_batch_status_only_accept_and_cancel":0.103,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":0.059,"Tests\\Feature\\BillPaymentTest::test_manual_pay_accumulates_store_total_purchase_amount":0.068,"Tests\\Feature\\BillPaymentTest::test_payment_audit_pass_accumulates_store_total_purchase_amount":0.054,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":0.049,"Tests\\Feature\\MiniProductTest::test_product_detail_guest_sees_null_price":0.045,"Tests\\Feature\\MiniProductTest::test_product_detail_store_user_sees_level_price":0.006,"Tests\\Feature\\MiniProductTest::test_product_detail_percent_price_calculated_from_cost":0.046,"Tests\\Feature\\MiniProductTest::test_product_detail_off_shelf_or_missing_rejected":0.046,"Tests\\Feature\\MiniProductTest::test_product_list_store_user_sees_level_price":0.005,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_null_price":0.044,"Tests\\Feature\\BillPaymentTest::test_admin_order_list_and_detail_show_bill_info":0.072,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":0.053,"Tests\\Feature\\StoreOrderTest::test_order_list_preview_includes_image_spec_and_unit":0.051,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":0.061,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":0.059,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":0.06,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":0.065,"Tests\\Feature\\ContainerReturnTest::test_non_integer_containers_rejected":0.048,"Tests\\Feature\\ContainerReturnTest::test_manual_create_and_delete_routes_removed":0.023,"Tests\\Feature\\ContainerReturnTest::test_export_matrix_merges_same_day_and_zero_fills":0.091,"Tests\\Feature\\ContainerReturnTest::test_export_filters_by_selected_stores":0.129,"Tests\\Feature\\ContainerReturnTest::test_export_invalid_params_rejected":0.01,"Tests\\Feature\\ContainerReturnTest::test_export_empty_range_rejected":0.006,"Tests\\Feature\\ContainerReturnTest::test_export_requires_export_permission":0.008,"Tests\\Feature\\DashboardTest::test_guest_cannot_access_dashboard":0.002,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":0.006,"Tests\\Feature\\DashboardTest::test_empty_database_returns_zero_structure":0.01,"Tests\\Feature\\DashboardTest::test_overview_excludes_cancelled_orders":0.053,"Tests\\Feature\\DashboardTest::test_week_growth_rate":0.055,"Tests\\Feature\\DashboardTest::test_trend_covers_30_days_with_zero_filling":0.051,"Tests\\Feature\\DashboardTest::test_category_sales_grouped_by_category":0.053,"Tests\\Feature\\DashboardTest::test_top_products_aggregated_across_orders":0.054,"Tests\\Feature\\DashboardTest::test_top_stores_ranked_by_amount":0.092,"Tests\\Feature\\DashboardTest::test_purchase_amount_prefers_actual_over_estimate":0.009,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":0.052,"Tests\\Feature\\DashboardTest::test_latest_orders_limited_and_ordered":0.052,"Tests\\Feature\\DashboardTest::test_archives_count_active_records_only":0.132,"Tests\\Feature\\DashboardDebugTest::test_debug_ability_check":0.044,"Tests\\Feature\\DashboardDebugTest::test_debug":0.045,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_cost_and_notifies_all_stores":0.089,"Tests\\Feature\\ProductPriceTest::test_level_percent_update_notifies_level_stores":0.104,"Tests\\Feature\\ProductPriceTest::test_level_update_without_percent_change_sends_no_notice":0.048,"Tests\\Feature\\ProductPriceTest::test_level_percent_validation":0.01,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_level_prices":0.008,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_price":0.007,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_row_update":0.052,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_level_price_columns":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_level_price":0.049,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_level_price":0.048,"Tests\\Feature\\CartTest::test_store_level_missing_rejected":0.006,"Tests\\Feature\\StoreOrderTest::test_store_level_missing_rejected":0.047,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":0.104,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_creates_item_and_recalculates":0.105,"Tests\\Feature\\PurchaseEditTest::test_store_item_update_merges_multi_order_rows":0.061,"Tests\\Feature\\PurchaseEditTest::test_store_item_remove_deletes_and_recalculates":0.102,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_recalculates_totals":0.059,"Tests\\Feature\\StoreOrderItemTest::test_store_item_edits_rejected_when_purchase_completed":0.062,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_validates_negative_values":0.058,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":0.06,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_rejected_when_product_deleted":0.058,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":0.104,"Tests\\Feature\\ExportTest::test_export_supplier_filter":0.102,"Tests\\Feature\\ExportTest::test_export_stores_multi_sheet":0.105,"Tests\\Feature\\ExportTest::test_export_stores_single_store":0.101,"Tests\\Feature\\ExportTest::test_export_stores_without_items_rejected":0.143,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":0.103,"Tests\\Feature\\ExportTest::test_export_suppliers_single":0.103,"Tests\\Feature\\ExportTest::test_export_suppliers_without_items_rejected":0.104,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_change_reprices_items_by_store_level":0.103,"Tests\\Feature\\PurchaseEditTest::test_update_row_without_cost_change_keeps_item_price":0.105,"Tests\\Feature\\CartTest::test_update_other_stores_item_rejected":0.091,"Tests\\Feature\\CartTest::test_delete_other_stores_item_rejected":0.091,"Tests\\Feature\\CartTest::test_cart_isolated_between_stores":0.09,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_valid_credentials":0.126,"Tests\\Feature\\MiniAuthTest::test_login_rejects_wrong_password":0.124,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unknown_username":0.002,"Tests\\Feature\\MiniAuthTest::test_disabled_store_cannot_login":0.124,"Tests\\Feature\\MiniAuthTest::test_login_validates_required_params":0.002,"Tests\\Feature\\MiniAuthTest::test_login_token_accesses_protected_routes":0.126,"Tests\\Feature\\MiniAuthTest::test_set_password_succeeds":0.21,"Tests\\Feature\\MiniAuthTest::test_set_password_rejects_wrong_old_password":0.129,"Tests\\Feature\\MiniAuthTest::test_set_password_validates_confirmation":0.055,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_own_store":0.094,"Tests\\Feature\\MiniNoticeTest::test_other_stores_notice_not_found":0.085,"Tests\\Feature\\MiniProductTest::test_product_detail_store_sees_level_price":0.046,"Tests\\Feature\\MiniProductTest::test_product_list_store_sees_level_price":0.046,"Tests\\Feature\\MiniStoreTest::test_info_returns_current_store":0.044,"Tests\\Feature\\MiniStoreTest::test_disabled_store_rejected":0.047,"Tests\\Feature\\ProductImportExportTest::test_export_downloads_all_products":0.009,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":0.008,"Tests\\Feature\\ProductImportExportTest::test_export_template_mode":0.005,"Tests\\Feature\\ProductImportExportTest::test_export_requires_permission":0.006,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":0.037,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":0.018,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":0.017,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":0.035,"Tests\\Feature\\ProductImportExportTest::test_import_rejects_invalid_header":0.015,"Tests\\Feature\\ProductImportExportTest::test_import_requires_permission":0.012,"Tests\\Feature\\ProductImportExportTest::test_list_filters_by_market":0.011,"Tests\\Feature\\MiniReportTest::test_report_aggregates_total_and_item_percent":0.046,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":0.047,"Tests\\Feature\\MiniReportTest::test_report_filters_by_custom_date_range":0.046,"Tests\\Feature\\MiniReportTest::test_report_excludes_cancelled_and_deleted_orders":0.048,"Tests\\Feature\\MiniReportTest::test_report_preset_month_and_last_month":0.051,"Tests\\Feature\\MiniReportTest::test_report_preset_week_and_last_week":0.064,"Tests\\Feature\\MiniReportTest::test_report_defaults_to_current_month":0.047,"Tests\\Feature\\MiniReportTest::test_report_data_isolated_between_stores":0.088,"Tests\\Feature\\MiniReportTest::test_report_empty_period_returns_zero":0.046,"Tests\\Feature\\MiniReportTest::test_report_validates_params":0.065,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_soft_deletes_selected_products":0.022,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_requires_non_empty_ids":0.006,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_forbidden_without_permission":0.008,"Tests\\Feature\\CartTest::test_place_order_clears_ordered_items_from_cart":0.06,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_filters_by_order_date_range":0.077,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_search_by_purchase_no":0.064,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":0.058,"Tests\\Feature\\BillPaymentTest::test_generate_bill_saves_after_sale_and_remark":0.119,"Tests\\Feature\\ProductCostPriceTest::test_product_price_unit_default_and_editable":0.013,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_by_overdue_unpaid_bill":0.053,"Tests\\Feature\\StoreOrderTest::test_place_order_allowed_within_payment_cycle":0.056,"Tests\\Feature\\CartTest::test_cart_summary_endpoint":0.053,"Tests\\Feature\\CartTest::test_cart_summary_requires_login":0.002,"Tests\\Feature\\MiniProductTest::test_product_list_appends_cart_quantity_and_summary":0.054,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_zero_cart_fields":0.046,"Tests\\Feature\\MiniProductTest::test_product_detail_appends_cart_quantity":0.049,"Tests\\Feature\\MiniProductTest::test_home_appends_cart_summary":0.052,"Tests\\Feature\\MiniOnlinePaymentTest::test_sign_matches_document_example":0.002,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":0.063,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_validation":0.099,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_fails_when_code2session_fails":0.048,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_gateway_failure_releases_bills":0.051,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_settles_payment":0.051,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_rejects_invalid_messages":0.05,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":0.053,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_rejects_other_store_payment":0.087,"Tests\\Feature\\MiniOnlinePaymentTest::test_offline_payment_flow_unaffected":0.047}} \ No newline at end of file +{"version":2,"defects":{"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":8,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":8,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":7,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":8,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":8,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":8,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":8,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":8,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":8,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":7,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":7,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":8,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":7,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":8,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":8,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":7,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":7,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":7,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":5,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":7,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":7,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":8,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":8,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":7,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":8,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":8,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":8,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":8,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":8,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":8,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":8,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":8,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":7,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":8,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":7,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":7,"Tests\\Feature\\ExportTest::test_export_pdf":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":7,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":7,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":7,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":8,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":7,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":8,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":8,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":8,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":7,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":7,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":8,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":7,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":7,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":7,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":7,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":7,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":7,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":8,"Tests\\Feature\\DashboardDebugTest::test_debug":8,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":8,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":8,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":8,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":8,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":8,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":7,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":8,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":7,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":7,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":7,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":7},"times":{"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":0.003,"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":0.108,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":0.007,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":0.01,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":0.007,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":0.062,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":0.053,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":0.007,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":0.06,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":0.055,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":0.095,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":0.028,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":0.098,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":0.006,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":0.099,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":0.076,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":0.022,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":0.028,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":0.021,"Tests\\Feature\\DebugGenerateTest::test_debug_generate":0.047,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":0.019,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":0.022,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":0.019,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":0.02,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":0.036,"Tests\\Feature\\StatementTest::test_generate_snapshots_payment_cycle":0.011,"Tests\\Feature\\StatementTest::test_statement_isolated_between_stores":0.013,"Tests\\Feature\\StatementTest::test_generate_excludes_cancelled_and_used_items":0.016,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":0.056,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":0.003,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":0.005,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":0.001,"Tests\\Feature\\MiniAuthTest::test_sys_token_cannot_access_mini":0.009,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":0.051,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":0.137,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":0.017,"Tests\\Feature\\ExportTest::test_export_pdf":0.015,"Tests\\Feature\\ExportTest::test_export_invalid_format_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_requires_export_permission":0.07,"Tests\\Unit\\ExampleTest::test_that_true_is_true":0.001,"Tests\\Feature\\MiniAuthTest::test_login_fails_when_wechat_rejects_code":0.003,"Tests\\Feature\\CartTest::test_add_to_cart_succeeds":0.047,"Tests\\Feature\\CartTest::test_duplicate_add_merges_quantity":0.051,"Tests\\Feature\\CartTest::test_off_shelf_product_rejected":0.046,"Tests\\Feature\\CartTest::test_soft_deleted_product_rejected":0.008,"Tests\\Feature\\CartTest::test_product_without_level_price_rejected":0.006,"Tests\\Feature\\CartTest::test_unbound_user_rejected":0.006,"Tests\\Feature\\CartTest::test_store_without_level_rejected":0.089,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":0.05,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":0.051,"Tests\\Feature\\CartTest::test_empty_cart_returns_empty_items":0.045,"Tests\\Feature\\CartTest::test_update_quantity":0.048,"Tests\\Feature\\CartTest::test_update_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_update_missing_item_rejected":0.048,"Tests\\Feature\\CartTest::test_invalid_quantity_rejected":0.047,"Tests\\Feature\\CartTest::test_delete_item":0.047,"Tests\\Feature\\CartTest::test_delete_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_clear_only_own_cart":0.094,"Tests\\Feature\\CartTest::test_unauthenticated_returns_401":0.002,"Tests\\Feature\\CartTest::test_cart_isolated_between_users":0.011,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":0.057,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_fixed_and_percent":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_actual_price":0.009,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":0.053,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":0.008,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":0.007,"Tests\\Feature\\ProductCostPriceTest::test_update_switches_fixed_to_percent":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":0.009,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":0.008,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":0.009,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_percent_columns":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":0.01,"Tests\\Feature\\PurchaseGenerateTest::test_generate_uses_min_actual_price_across_types":0.014,"Tests\\Feature\\ProductPriceTest::test_store_without_level_sees_products_without_price":0.047,"Tests\\Feature\\ProductPriceTest::test_unbound_user_can_browse_products_without_price_but_cannot_cart":0.009,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_registered_user":0.01,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unregistered_openid":0.002,"Tests\\Feature\\MiniAuthTest::test_register_binds_store_and_issues_token":0.009,"Tests\\Feature\\MiniAuthTest::test_register_rejects_unknown_store":0.002,"Tests\\Feature\\MiniAuthTest::test_register_rejects_duplicate_openid":0.003,"Tests\\Feature\\MiniStoreTest::test_info_returns_bound_store":0.005,"Tests\\Feature\\MiniStoreTest::test_update_info":0.05,"Tests\\Feature\\MiniStoreTest::test_update_info_ignores_readonly_fields":0.052,"Tests\\Feature\\MiniStoreTest::test_requires_bound_store":0.007,"Tests\\Feature\\MiniStoreTest::test_update_info_validates_length":0.057,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":0.012,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":0.022,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":0.019,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":0.02,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":0.014,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_accepted_orders_fails":0.054,"Tests\\Feature\\PurchaseGenerateTest::test_generate_with_selected_order_ids":0.106,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":0.06,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":0.052,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":0.058,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":0.012,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":0.013,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":0.01,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":0.01,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":0.069,"Tests\\Feature\\StoreOrderTest::test_soft_delete_only_cancelled_orders":0.072,"Tests\\Feature\\StoreOrderTest::test_soft_delete_rejected_for_non_cancelled_orders":0.3,"Tests\\Feature\\StoreOrderTest::test_soft_delete_twice_rejected":0.056,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":0.143,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":0.138,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":0.165,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":0.032,"Tests\\Feature\\PurchaseEditTest::test_update_row_requires_at_least_one_field":0.099,"Tests\\Feature\\PurchaseEditTest::test_update_cell_rejects_negative_quantity":0.1,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":0.106,"Tests\\Feature\\ReconciliationTest::test_build_excludes_unfinished_orders":0.016,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":0.121,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":0.019,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":0.105,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_rejects_missing_params":0.118,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":0.119,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":0.012,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":0.109,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":0.179,"Tests\\Feature\\PurchaseEditTest::test_store_summary_returns_aggregated_items":0.123,"Tests\\Feature\\PurchaseEditTest::test_store_summary_aggregates_multiple_orders_with_weighted_price":0.079,"Tests\\Feature\\PurchaseEditTest::test_store_summary_rejects_missing_or_invalid_params":0.111,"Tests\\Feature\\ExportTest::test_export_invalid_type_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_missing_purchase_rejected":0.009,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_container_summary":0.022,"Tests\\Feature\\PurchaseEditTest::test_update_container_syncs_order_amounts":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejected_when_purchase_completed":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejects_incomplete_or_foreign_orders":0.026,"Tests\\Feature\\PurchaseEditTest::test_update_container_validates_negative_and_duplicate_orders":0.018,"Tests\\Feature\\ProductCategoryTest::test_create_child_category_under_top_level":0.009,"Tests\\Feature\\ProductCategoryTest::test_create_category_under_second_level_rejected":0.008,"Tests\\Feature\\ProductCategoryTest::test_update_second_level_move_to_another_top":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_parent_with_children_cannot_move_under_category":0.006,"Tests\\Feature\\ProductCategoryTest::test_update_with_missing_parent_rejected":0.009,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_parent_category_rejected":0.024,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":0.008,"Tests\\Feature\\ProductCategoryTest::test_mini_categories_returns_all_enabled_categories":0.057,"Tests\\Feature\\MiniBillTest::test_bill_list_derives_pay_state_and_settlement_date":0.059,"Tests\\Feature\\MiniBillTest::test_bill_list_summary_aggregates_unpaid":0.055,"Tests\\Feature\\MiniBillTest::test_bill_list_payable_filter":0.055,"Tests\\Feature\\MiniBillTest::test_bill_list_filters_by_bill_date_range":0.063,"Tests\\Feature\\MiniBillTest::test_bill_data_isolated_between_stores":0.098,"Tests\\Feature\\MiniBillTest::test_bill_detail_outputs_bill_items_and_orders":0.057,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":0.07,"Tests\\Feature\\StoreOrderTest::test_order_list_filters_by_order_date_range":0.099,"Tests\\Feature\\StoreOrderTest::test_order_list_rejects_invalid_filters":0.057,"Tests\\Feature\\BillExportTest::test_export_merges_items_across_bills":0.097,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":0.051,"Tests\\Feature\\BillExportTest::test_export_empty_category_rejected":0.067,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":0.052,"Tests\\Feature\\BillExportTest::test_export_invalid_ids_rejected":0.01,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":0.098,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_bound_store":0.014,"Tests\\Feature\\BillExportTest::test_mini_export_requires_store_binding":0.005,"Tests\\Feature\\MiniNoticeTest::test_notice_list_includes_personal_and_broadcast":0.049,"Tests\\Feature\\MiniNoticeTest::test_broadcast_read_creates_personal_copy":0.051,"Tests\\Feature\\MiniNoticeTest::test_personal_notice_read_marks_directly":0.049,"Tests\\Feature\\MiniNoticeTest::test_other_users_notice_not_found":0.007,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_only_accept_and_cancel":0.099,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_rejects_delivery_and_completion":0.159,"Tests\\Feature\\StoreOrderTest::test_batch_status_only_accept_and_cancel":0.116,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":0.06,"Tests\\Feature\\BillPaymentTest::test_manual_pay_accumulates_store_total_purchase_amount":0.066,"Tests\\Feature\\BillPaymentTest::test_payment_audit_pass_accumulates_store_total_purchase_amount":0.052,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":0.048,"Tests\\Feature\\MiniProductTest::test_product_detail_guest_sees_null_price":0.059,"Tests\\Feature\\MiniProductTest::test_product_detail_store_user_sees_level_price":0.006,"Tests\\Feature\\MiniProductTest::test_product_detail_percent_price_calculated_from_cost":0.066,"Tests\\Feature\\MiniProductTest::test_product_detail_off_shelf_or_missing_rejected":0.055,"Tests\\Feature\\MiniProductTest::test_product_list_store_user_sees_level_price":0.005,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_null_price":0.053,"Tests\\Feature\\BillPaymentTest::test_admin_order_list_and_detail_show_bill_info":0.075,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":0.052,"Tests\\Feature\\StoreOrderTest::test_order_list_preview_includes_image_spec_and_unit":0.065,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":0.061,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":0.083,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":0.072,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":0.073,"Tests\\Feature\\ContainerReturnTest::test_non_integer_containers_rejected":0.059,"Tests\\Feature\\ContainerReturnTest::test_manual_create_and_delete_routes_removed":0.007,"Tests\\Feature\\ContainerReturnTest::test_export_matrix_merges_same_day_and_zero_fills":0.118,"Tests\\Feature\\ContainerReturnTest::test_export_filters_by_selected_stores":0.159,"Tests\\Feature\\ContainerReturnTest::test_export_invalid_params_rejected":0.013,"Tests\\Feature\\ContainerReturnTest::test_export_empty_range_rejected":0.008,"Tests\\Feature\\ContainerReturnTest::test_export_requires_export_permission":0.008,"Tests\\Feature\\DashboardTest::test_guest_cannot_access_dashboard":0.002,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":0.006,"Tests\\Feature\\DashboardTest::test_empty_database_returns_zero_structure":0.011,"Tests\\Feature\\DashboardTest::test_overview_excludes_cancelled_orders":0.072,"Tests\\Feature\\DashboardTest::test_week_growth_rate":0.069,"Tests\\Feature\\DashboardTest::test_trend_covers_30_days_with_zero_filling":0.059,"Tests\\Feature\\DashboardTest::test_category_sales_grouped_by_category":0.072,"Tests\\Feature\\DashboardTest::test_top_products_aggregated_across_orders":0.055,"Tests\\Feature\\DashboardTest::test_top_stores_ranked_by_amount":0.108,"Tests\\Feature\\DashboardTest::test_purchase_amount_prefers_actual_over_estimate":0.009,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":0.068,"Tests\\Feature\\DashboardTest::test_latest_orders_limited_and_ordered":0.061,"Tests\\Feature\\DashboardTest::test_archives_count_active_records_only":0.152,"Tests\\Feature\\DashboardDebugTest::test_debug_ability_check":0.044,"Tests\\Feature\\DashboardDebugTest::test_debug":0.045,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_cost_and_notifies_all_stores":0.104,"Tests\\Feature\\ProductPriceTest::test_level_percent_update_notifies_level_stores":0.104,"Tests\\Feature\\ProductPriceTest::test_level_update_without_percent_change_sends_no_notice":0.058,"Tests\\Feature\\ProductPriceTest::test_level_percent_validation":0.008,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_level_prices":0.007,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_price":0.012,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_row_update":0.051,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_level_price_columns":0.009,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_level_price":0.054,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_level_price":0.053,"Tests\\Feature\\CartTest::test_store_level_missing_rejected":0.006,"Tests\\Feature\\StoreOrderTest::test_store_level_missing_rejected":0.051,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":0.105,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_creates_item_and_recalculates":0.14,"Tests\\Feature\\PurchaseEditTest::test_store_item_update_merges_multi_order_rows":0.086,"Tests\\Feature\\PurchaseEditTest::test_store_item_remove_deletes_and_recalculates":0.109,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_recalculates_totals":0.074,"Tests\\Feature\\StoreOrderItemTest::test_store_item_edits_rejected_when_purchase_completed":0.078,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_validates_negative_values":0.079,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":0.061,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_rejected_when_product_deleted":0.077,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":0.127,"Tests\\Feature\\ExportTest::test_export_supplier_filter":0.114,"Tests\\Feature\\ExportTest::test_export_stores_multi_sheet":0.116,"Tests\\Feature\\ExportTest::test_export_stores_single_store":0.107,"Tests\\Feature\\ExportTest::test_export_stores_without_items_rejected":0.17,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":0.147,"Tests\\Feature\\ExportTest::test_export_suppliers_single":0.115,"Tests\\Feature\\ExportTest::test_export_suppliers_without_items_rejected":0.123,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_change_reprices_items_by_store_level":0.109,"Tests\\Feature\\PurchaseEditTest::test_update_row_without_cost_change_keeps_item_price":0.119,"Tests\\Feature\\CartTest::test_update_other_stores_item_rejected":0.093,"Tests\\Feature\\CartTest::test_delete_other_stores_item_rejected":0.089,"Tests\\Feature\\CartTest::test_cart_isolated_between_stores":0.089,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_valid_credentials":0.133,"Tests\\Feature\\MiniAuthTest::test_login_rejects_wrong_password":0.149,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unknown_username":0.002,"Tests\\Feature\\MiniAuthTest::test_disabled_store_cannot_login":0.142,"Tests\\Feature\\MiniAuthTest::test_login_validates_required_params":0.002,"Tests\\Feature\\MiniAuthTest::test_login_token_accesses_protected_routes":0.148,"Tests\\Feature\\MiniAuthTest::test_set_password_succeeds":0.251,"Tests\\Feature\\MiniAuthTest::test_set_password_rejects_wrong_old_password":0.148,"Tests\\Feature\\MiniAuthTest::test_set_password_validates_confirmation":0.071,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_own_store":0.093,"Tests\\Feature\\MiniNoticeTest::test_other_stores_notice_not_found":0.106,"Tests\\Feature\\MiniProductTest::test_product_detail_store_sees_level_price":0.074,"Tests\\Feature\\MiniProductTest::test_product_list_store_sees_level_price":0.061,"Tests\\Feature\\MiniStoreTest::test_info_returns_current_store":0.057,"Tests\\Feature\\MiniStoreTest::test_disabled_store_rejected":0.056,"Tests\\Feature\\ProductImportExportTest::test_export_downloads_all_products":0.016,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":0.016,"Tests\\Feature\\ProductImportExportTest::test_export_template_mode":0.006,"Tests\\Feature\\ProductImportExportTest::test_export_requires_permission":0.007,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":0.06,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":0.023,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":0.022,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":0.043,"Tests\\Feature\\ProductImportExportTest::test_import_rejects_invalid_header":0.015,"Tests\\Feature\\ProductImportExportTest::test_import_requires_permission":0.011,"Tests\\Feature\\ProductImportExportTest::test_list_filters_by_market":0.014,"Tests\\Feature\\MiniReportTest::test_report_aggregates_total_and_item_percent":0.048,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":0.057,"Tests\\Feature\\MiniReportTest::test_report_filters_by_custom_date_range":0.056,"Tests\\Feature\\MiniReportTest::test_report_excludes_cancelled_and_deleted_orders":0.055,"Tests\\Feature\\MiniReportTest::test_report_preset_month_and_last_month":0.051,"Tests\\Feature\\MiniReportTest::test_report_preset_week_and_last_week":0.068,"Tests\\Feature\\MiniReportTest::test_report_defaults_to_current_month":0.056,"Tests\\Feature\\MiniReportTest::test_report_data_isolated_between_stores":0.096,"Tests\\Feature\\MiniReportTest::test_report_empty_period_returns_zero":0.046,"Tests\\Feature\\MiniReportTest::test_report_validates_params":0.051,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_soft_deletes_selected_products":0.016,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_requires_non_empty_ids":0.011,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_forbidden_without_permission":0.011,"Tests\\Feature\\CartTest::test_place_order_clears_ordered_items_from_cart":0.061,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_filters_by_order_date_range":0.066,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_search_by_purchase_no":0.081,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":0.072,"Tests\\Feature\\BillPaymentTest::test_generate_bill_saves_after_sale_and_remark":0.115,"Tests\\Feature\\ProductCostPriceTest::test_product_price_unit_default_and_editable":0.012,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_by_overdue_unpaid_bill":0.062,"Tests\\Feature\\StoreOrderTest::test_place_order_allowed_within_payment_cycle":0.064,"Tests\\Feature\\CartTest::test_cart_summary_endpoint":0.052,"Tests\\Feature\\CartTest::test_cart_summary_requires_login":0.003,"Tests\\Feature\\MiniProductTest::test_product_list_appends_cart_quantity_and_summary":0.062,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_zero_cart_fields":0.06,"Tests\\Feature\\MiniProductTest::test_product_detail_appends_cart_quantity":0.052,"Tests\\Feature\\MiniProductTest::test_home_appends_cart_summary":0.061,"Tests\\Feature\\MiniOnlinePaymentTest::test_sign_matches_document_example":0.003,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":0.122,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_validation":0.121,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_fails_when_code2session_fails":0.054,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_gateway_failure_releases_bills":0.061,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_settles_payment":0.049,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_rejects_invalid_messages":0.048,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":0.066,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_rejects_other_store_payment":0.095,"Tests\\Feature\\MiniOnlinePaymentTest::test_offline_payment_flow_unaffected":0.06,"Tests\\Feature\\BillPaymentTest::test_generate_bill_positive_after_sale_added_to_total":0.112,"Tests\\Feature\\BillPaymentTest::test_generate_bill_rejects_non_numeric_after_sale":0.047}} \ No newline at end of file diff --git a/app/Exports/BillExport.php b/app/Exports/BillExport.php index 8c5701f..5b4a542 100644 --- a/app/Exports/BillExport.php +++ b/app/Exports/BillExport.php @@ -14,7 +14,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; /** * 门店账单合并导出:勾选账单跨账单按商品合并明细(可按一级分类过滤), - * 表尾汇总商品金额/配送费/附加金额/总金额 + * 表尾汇总商品金额/配送费/附加金额/售后金额/总金额 */ class BillExport implements FromCollection, WithStyles { @@ -113,18 +113,20 @@ class BillExport implements FromCollection, WithStyles $rows[] = ['', '合计', '', '', '', $totalQuantity, (float) $totalWeight, (float) $totalAmount]; $this->specialRows[++$rowIndex] = 'summary'; - // 配送费/附加金额/总金额(账单级费用全额汇总,不受分类过滤影响) + // 配送费/附加金额/售后金额/总金额(账单级费用全额汇总,不受分类过滤影响) $deliveryTotal = '0'; $addedTotal = '0'; + $afterSaleTotal = '0'; $boxNum = 0; $trayNum = 0; foreach ($this->bills as $bill) { $deliveryTotal = bcadd($deliveryTotal, (string) $bill->delivery_fee, 2); $addedTotal = bcadd($addedTotal, (string) $bill->added_amount, 2); + $afterSaleTotal = bcadd($afterSaleTotal, (string) $bill->after_sale, 2); $boxNum += (int) $bill->box_num; $trayNum += (int) $bill->tray_num; } - $grandTotal = bcadd(bcadd($totalAmount, $deliveryTotal, 2), $addedTotal, 2); + $grandTotal = bcadd(bcadd(bcadd($totalAmount, $deliveryTotal, 2), $addedTotal, 2), $afterSaleTotal, 2); $rows[] = ['配送费合计', '', '', '', '', '', '', (float) $deliveryTotal]; $this->specialRows[++$rowIndex] = 'summary'; @@ -134,7 +136,11 @@ class BillExport implements FromCollection, WithStyles $this->specialRows[++$rowIndex] = 'summary'; $this->mergeRows[] = $rowIndex; - $rows[] = ['总金额(商品金额+配送费+附加金额)', '', '', '', '', '', '', (float) $grandTotal]; + $rows[] = ['售后金额合计(可正负)', '', '', '', '', '', '', (float) $afterSaleTotal]; + $this->specialRows[++$rowIndex] = 'summary'; + $this->mergeRows[] = $rowIndex; + + $rows[] = ['总金额(商品金额+配送费+附加金额+售后金额)', '', '', '', '', '', '', (float) $grandTotal]; $this->specialRows[++$rowIndex] = 'grand'; $this->mergeRows[] = $rowIndex; diff --git a/app/Http/Controllers/Mini/BillController.php b/app/Http/Controllers/Mini/BillController.php index 5d73495..3c5c817 100644 --- a/app/Http/Controllers/Mini/BillController.php +++ b/app/Http/Controllers/Mini/BillController.php @@ -174,6 +174,7 @@ class BillController extends BaseMiniController 'box_price' => $bill->box_price, 'tray_price' => $bill->tray_price, 'added_amount' => $bill->added_amount, + 'after_sale' => $bill->after_sale, 'total_amount' => $bill->total_amount, 'status' => $bill->status, 'status_name' => BillModel::STATUS_NAMES[$bill->status] ?? '', diff --git a/app/Http/Controllers/Mini/CartController.php b/app/Http/Controllers/Mini/CartController.php index ee74986..b46e31f 100644 --- a/app/Http/Controllers/Mini/CartController.php +++ b/app/Http/Controllers/Mini/CartController.php @@ -145,6 +145,7 @@ class CartController extends BaseMiniController 'name' => $product->name ?? '', 'spec' => $product->spec ?? '', 'unit' => $product->unit ?? '', + 'price_unit' => $product->price_unit ?? '', 'image' => $firstFile?->file_url ?? '', 'price' => $price, 'quantity' => $quantity, diff --git a/app/Http/Controllers/Mini/OrderController.php b/app/Http/Controllers/Mini/OrderController.php index 7175e02..1f9bb57 100644 --- a/app/Http/Controllers/Mini/OrderController.php +++ b/app/Http/Controllers/Mini/OrderController.php @@ -97,6 +97,7 @@ class OrderController extends BaseMiniController 'product_spec' => $product->spec, 'unit' => (string) $product->unit, 'price' => $price, + 'price_unit' => $product->price_unit, 'image_ids' => implode(',', (array) $product->image_ids), 'content' => (string) $product->content, 'shelf_life' => (int) $product->shelf_life, diff --git a/app/Http/Controllers/Mini/PaymentController.php b/app/Http/Controllers/Mini/PaymentController.php index 48d56ae..62294ac 100644 --- a/app/Http/Controllers/Mini/PaymentController.php +++ b/app/Http/Controllers/Mini/PaymentController.php @@ -152,7 +152,7 @@ class PaymentController extends BaseMiniController $bills = $payment->bills() ->orderBy('id') - ->get(['id', 'bill_no', 'bill_date', 'product_amount', 'delivery_fee', 'added_amount', 'total_amount', 'status']) + ->get(['id', 'bill_no', 'bill_date', 'product_amount', 'delivery_fee', 'added_amount', 'after_sale', 'total_amount', 'status']) ->toArray(); $data = $payment->toArray(); diff --git a/app/Http/Controllers/Recon/PaymentController.php b/app/Http/Controllers/Recon/PaymentController.php index 241a7f1..4a4fdaf 100644 --- a/app/Http/Controllers/Recon/PaymentController.php +++ b/app/Http/Controllers/Recon/PaymentController.php @@ -56,7 +56,7 @@ class PaymentController extends BaseController $bills = $payment->bills() ->orderBy('id') - ->get(['id', 'bill_no', 'bill_date', 'product_amount', 'delivery_fee', 'added_amount', 'total_amount', 'status']) + ->get(['id', 'bill_no', 'bill_date', 'product_amount', 'delivery_fee', 'added_amount', 'after_sale', 'total_amount', 'status']) ->toArray(); $data = $payment->toArray(); diff --git a/app/Http/Requests/Purchase/PurchaseBillGenerateRequest.php b/app/Http/Requests/Purchase/PurchaseBillGenerateRequest.php index d29265b..d0380a0 100644 --- a/app/Http/Requests/Purchase/PurchaseBillGenerateRequest.php +++ b/app/Http/Requests/Purchase/PurchaseBillGenerateRequest.php @@ -5,8 +5,8 @@ namespace App\Http\Requests\Purchase; use Modules\Common\Http\Requests\BaseFormRequest; /** - * 采购单生成账单 验证(按门店提交配送费/周转筐/托盘数量与售后/备注,金额由系统汇总不可修改; - * 筐/托盘数量正数=压筐附加金额,负数=回筐抵扣金额) + * 采购单生成账单 验证(按门店提交配送费/周转筐/托盘数量与售后金额/备注,金额由系统汇总不可修改; + * 筐/托盘数量正数=压筐附加金额,负数=回筐抵扣金额;售后金额可正负,计入总金额) */ class PurchaseBillGenerateRequest extends BaseFormRequest { @@ -20,7 +20,7 @@ class PurchaseBillGenerateRequest extends BaseFormRequest 'stores.*.delivery_fee' => 'required|numeric|min:0', 'stores.*.box_num' => 'required|integer', 'stores.*.tray_num' => 'required|integer', - 'stores.*.after_sale' => 'nullable|string|max:255', + 'stores.*.after_sale' => 'nullable|numeric', 'stores.*.remark' => 'nullable|string|max:255', ]; } @@ -41,7 +41,7 @@ class PurchaseBillGenerateRequest extends BaseFormRequest 'stores.*.box_num.integer' => '周转筐数量必须为整数(正数=压筐,负数=回筐)', 'stores.*.tray_num.required' => '周转托盘数量不能为空', 'stores.*.tray_num.integer' => '周转托盘数量必须为整数(正数=压筐,负数=回筐)', - 'stores.*.after_sale.max' => '售后说明最长 255 个字符', + 'stores.*.after_sale.numeric' => '售后金额格式错误(可正负)', 'stores.*.remark.max' => '备注最长 255 个字符', ]; } diff --git a/app/Models/BillModel.php b/app/Models/BillModel.php index 6605d91..1275372 100644 --- a/app/Models/BillModel.php +++ b/app/Models/BillModel.php @@ -90,6 +90,7 @@ class BillModel extends Model 'tray_price' => 'decimal:2', 'added_amount' => 'decimal:2', 'total_amount' => 'decimal:2', + 'after_sale' => 'decimal:2', 'status' => 'integer', 'payment_id' => 'integer', 'paid_at' => 'datetime:Y-m-d H:i:s', diff --git a/app/Models/StoreOrderItemModel.php b/app/Models/StoreOrderItemModel.php index 70f40ec..f491450 100644 --- a/app/Models/StoreOrderItemModel.php +++ b/app/Models/StoreOrderItemModel.php @@ -30,6 +30,7 @@ class StoreOrderItemModel extends Model 'product_spec', 'unit', 'price', + 'price_unit', 'image_ids', 'content', 'shelf_life', diff --git a/app/Services/BillGenerateService.php b/app/Services/BillGenerateService.php index a3ebf3b..689999b 100644 --- a/app/Services/BillGenerateService.php +++ b/app/Services/BillGenerateService.php @@ -20,8 +20,9 @@ use Throwable; * 2. 商品金额 = 门店订单商品金额汇总(快照,生成后不可修改) * 3. 附加金额 = 周转筐数量×筐单价 + 托盘数量×托盘单价(单价取站点配置快照; * 数量正数=压筐附加金额,负数=回筐抵扣金额) - * 4. 总金额 = 商品金额 + 配送费 + 附加金额;回写门店订单 bill_id 完成关联,订单状态置为已完成 - * 5. 压回筐记录:筐/托盘数量非 0 时写入完整快照(数量/单价/金额均可为负) + * 4. 售后金额 = 按门店填写的调整金额(可正负:正数=加收,负数=售后减免) + * 5. 总金额 = 商品金额 + 配送费 + 附加金额 + 售后金额;回写门店订单 bill_id 完成关联,订单状态置为已完成 + * 6. 压回筐记录:筐/托盘数量非 0 时写入完整快照(数量/单价/金额均可为负) */ readonly class BillGenerateService { @@ -31,7 +32,7 @@ readonly class BillGenerateService /** * @param PurchaseOrderModel $purchase 已完成采购单 - * @param array $stores 按门店提交的配送费/周转筐/托盘数量与售后/备注 + * @param array $stores 按门店提交的配送费/周转筐/托盘数量与售后金额/备注 * @param int $operatorId 生成人(后台系统用户ID) * @return BillModel[] 生成的账单列表 * @throws Throwable @@ -95,7 +96,8 @@ readonly class BillGenerateService bcmul((string) (int) $row['tray_num'], $trayPrice, 2), 2 ); - $totalAmount = bcadd(bcadd($productAmount, $deliveryFee, 2), $addedAmount, 2); + $afterSale = bcadd((string) ($row['after_sale'] ?? '0'), '0', 2); + $totalAmount = bcadd(bcadd(bcadd($productAmount, $deliveryFee, 2), $addedAmount, 2), $afterSale, 2); $bill = BillModel::create([ 'bill_no' => $this->billNumberService->make('ZD'), @@ -111,7 +113,7 @@ readonly class BillGenerateService 'added_amount' => $addedAmount, 'total_amount' => $totalAmount, 'operator_id' => $operatorId, - 'after_sale' => (string) ($row['after_sale'] ?? ''), + 'after_sale' => $afterSale, 'remark' => (string) ($row['remark'] ?? ''), ]); diff --git a/database/migrations/2026_07_23_030610_create_store_order_table.php b/database/migrations/2026_07_23_030610_create_store_order_table.php index 12e46bf..feecf6b 100644 --- a/database/migrations/2026_07_23_030610_create_store_order_table.php +++ b/database/migrations/2026_07_23_030610_create_store_order_table.php @@ -49,6 +49,7 @@ return new class extends Migration $table->string('product_spec', 100)->default('')->comment('规格/包规'); $table->string('unit', 20)->default('斤')->comment('计价单位(斤/件/箱等)'); $table->decimal('price', 10, 2)->default(0)->comment('单价'); + $table->string('price_unit', 20)->default('')->comment('单价单位'); $table->string('image_ids', 255)->default('')->comment('商品图片'); $table->text('content')->comment('商品图文详情'); $table->integer('shelf_life')->default(0)->comment('保质期'); diff --git a/database/migrations/2026_08_13_000001_create_bill_table.php b/database/migrations/2026_08_13_000001_create_bill_table.php index d4a6605..1507157 100644 --- a/database/migrations/2026_08_13_000001_create_bill_table.php +++ b/database/migrations/2026_08_13_000001_create_bill_table.php @@ -28,7 +28,7 @@ return new class extends Migration $table->decimal('box_price', 10, 2)->default(0)->comment('周转筐单价(生成时快照)'); $table->decimal('tray_price', 10, 2)->default(0)->comment('周转托盘单价(生成时快照)'); $table->decimal('added_amount', 10, 2)->default(0)->comment('附加金额(周转筐/托盘金额)'); - $table->decimal('total_amount', 10, 2)->default(0)->comment('账单总金额 = 商品金额 + 配送费 + 附加金额'); + $table->decimal('total_amount', 10, 2)->default(0)->comment('账单总金额 = 商品金额 + 配送费 + 附加金额 + 售后金额'); $table->integer('status')->default(0)->comment('支付状态(0未支付 1已支付)'); $table->integer('payment_id')->default(0)->comment('关联支付记录ID(0=未发起支付)'); $table->timestamp('paid_at')->nullable()->comment('付款时间(线下收款手动登记)'); @@ -36,7 +36,7 @@ return new class extends Migration $table->integer('paid_operator_id')->default(0)->comment('收款操作人(后台系统用户ID)'); $table->integer('operator_id')->default(0)->comment('生成人(后台系统用户ID)'); $table->string('remark', 255)->nullable()->default('')->comment('备注(生成账单时按门店填写)'); - $table->string('after_sale', 255)->nullable()->default('')->comment('售后说明(生成账单时按门店填写)'); + $table->decimal('after_sale', 10, 2)->default(0)->comment('售后金额(生成账单时按门店填写,可正负,计入总金额)'); $table->timestamps(); $table->unique(['purchase_id', 'store_id'], 'bill_purchase_store_unique'); $table->index(['store_id', 'bill_date'], 'bill_store_date_index'); diff --git a/public/assets/bill-Yl-chnYY.js b/public/assets/bill-Yl-chnYY.js new file mode 100644 index 0000000..ce84c21 --- /dev/null +++ b/public/assets/bill-Yl-chnYY.js @@ -0,0 +1 @@ +import{i as e}from"./rolldown-runtime-BgaNhQyE.js";import{Dr as t,t as n}from"./jsx-runtime-CRBytmvs.js";import{t as r}from"./request--UCyt0wo.js";import{t as i}from"./typography-DRFhazK9.js";import{L as a,a as o}from"./lodash-DzOfPy0f.js";import{t as s}from"./table-BXi9q3AE.js";import{t as c}from"./button-BILozH6U.js";import{r as l}from"./DoubleRightOutlined-Blfli1UU.js";import{n as u}from"./LockOutlined-B8eRH1x4.js";import{u as d}from"./XinForm-BPDYdeax.js";import{t as f}from"./modal-g8Q5gNCx.js";import{t as p}from"./descriptions-BLF6MKiu.js";import{t as m}from"./form-B3R3kIqp.js";import{t as h}from"./input-CHcsaDtX.js";import{r as g}from"./PictureOutlined-CB8Pr7jP.js";import{t as _}from"./tag-DBV1bHre.js";import{t as v}from"./DownloadOutlined-DJY9Mu8c.js";import{t as y}from"./XinTable-DOLiJ5rL.js";import{t as b}from"./AuthButton-DvrpreK4.js";import{t as x}from"./store-JDnJsv44.js";import{n as S}from"./iStoreOrder-CyyYoLoV.js";import{t as C}from"./download-DC9wDwqQ.js";import{t as w}from"./iPurchaseOrder-Dn-laOqY.js";import{n as T}from"./category-MmrJkdbs.js";var E=e(t(),1),D=e(u(),1);async function O(e){return r({url:`/recon/bill/${e}`,method:`get`})}async function k(e,t){return r({url:`/recon/bill/${e}/pay`,method:`put`,data:t})}async function A(e,t){return C(`/recon/bill/export`,{ids:e.join(`,`),category_id:t},`门店账单.xlsx`)}var j=n(),{Title:M,Text:N}=i,P=()=>{let e=(0,E.useRef)(null),[t,n]=(0,E.useState)([]),[r,i]=(0,E.useState)(!1),[u,C]=(0,E.useState)(null),[P,F]=(0,E.useState)(!1),[I,L]=(0,E.useState)(null),[R,z]=(0,E.useState)(!1),[B]=m.useForm(),[V,H]=(0,E.useState)([]),[U,W]=(0,E.useState)(!1),[G,K]=(0,E.useState)(!1),[q,J]=(0,E.useState)(0),[Y,X]=(0,E.useState)([]);(0,E.useEffect)(()=>{x().then(e=>n(e.data.data??[])),T().then(e=>X((e.data.data??[]).map(e=>({value:e.id,label:e.name??``}))))},[]);let Z=async e=>{i(!0),F(!0);try{let t=await O(e);C(t.data.data??null)}finally{F(!1)}},Q=e=>{L(e),B.setFieldsValue({paid_at:(0,D.default)(),pay_remark:``})},$=async t=>{if(I?.id){z(!0);try{await k(I.id,{paid_at:t.paid_at.format(`YYYY-MM-DD HH:mm:ss`),pay_remark:t.pay_remark??``}),g.success(`收款已登记,账单已置为已支付`),L(null),await e.current?.reload()}finally{z(!1)}}},ee=async()=>{if(V.length!==0){K(!0);try{await A(V,q),W(!1)}finally{K(!1)}}},te=[{title:`品名`,dataIndex:`product_name`,width:160,align:`center`},{title:`包规`,dataIndex:`product_spec`,width:100,align:`center`,render:e=>e||`-`},{title:`单位`,dataIndex:`unit`,width:80,align:`center`,render:e=>e||`-`},{title:`单价`,dataIndex:`price`,width:100,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`数量`,dataIndex:`quantity`,width:90,align:`center`,render:e=>(0,j.jsx)(N,{strong:!0,children:e})},{title:`重量`,dataIndex:`weight`,width:100,align:`center`,render:e=>`${e}斤`},{title:`金额`,dataIndex:`amount`,width:110,align:`center`,render:e=>(0,j.jsxs)(N,{strong:!0,children:[`¥`,Number(e).toFixed(2)]})}],ne=()=>{let e=u?.items??[],t=e.reduce((e,t)=>e+Number(t.quantity),0),n=e.reduce((e,t)=>e+Number(t.weight),0),r=e.reduce((e,t)=>e+Number(t.amount),0);return(0,j.jsxs)(s.Summary.Row,{children:[(0,j.jsx)(s.Summary.Cell,{index:0,colSpan:4,align:`center`,children:(0,j.jsx)(N,{strong:!0,children:`合计`})}),(0,j.jsx)(s.Summary.Cell,{index:4,align:`center`,children:(0,j.jsx)(N,{strong:!0,children:t})}),(0,j.jsx)(s.Summary.Cell,{index:5,align:`center`,children:(0,j.jsxs)(N,{strong:!0,children:[n.toFixed(3),`斤`]})}),(0,j.jsx)(s.Summary.Cell,{index:6,align:`center`,children:(0,j.jsxs)(N,{strong:!0,type:`danger`,children:[`¥`,r.toFixed(2)]})})]})},re=[{title:`订单号`,dataIndex:`order_no`,align:`center`,render:e=>(0,j.jsx)(N,{copyable:{text:e},children:e})},{title:`订货日期`,dataIndex:`order_date`,align:`center`},{title:`订货数量`,dataIndex:`total_quantity`,align:`center`},{title:`总重量`,dataIndex:`total_weight`,align:`center`,render:e=>`${e}斤`},{title:`订单金额`,dataIndex:`total_amount`,align:`center`,render:e=>(0,j.jsxs)(N,{strong:!0,children:[`¥`,e]})},{title:`状态`,dataIndex:`status`,align:`center`,render:e=>{let t=S[Number(e??0)];return(0,j.jsx)(_,{color:t?.color,children:t?.text})}}],ie=[{title:`账单号`,dataIndex:`bill_no`,valueType:`text`,hideInForm:!0,width:210,render:(e,t)=>(0,j.jsx)(N,{copyable:{text:t.bill_no},children:t.bill_no})},{title:`门店`,dataIndex:`store_id`,valueType:`select`,hideInForm:!0,fieldProps:{options:t.map(e=>({label:e.name,value:e.id})),showSearch:!0,optionFilterProp:`label`},render:(e,t)=>t.store?.name??`门店#${t.store_id}`},{title:`采购单号`,dataIndex:`purchase_no`,valueType:`text`,hideInForm:!0,render:(e,t)=>t.purchase?.purchase_no??`-`},{title:`账单日期`,dataIndex:`bill_date`,valueType:`dateRange`,hideInForm:!0,align:`center`,render:(e,t)=>t.bill_date},{title:`商品金额`,dataIndex:`product_amount`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>`¥${t.product_amount}`},{title:`配送费`,dataIndex:`delivery_fee`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>`¥${t.delivery_fee}`},{title:`附加金额`,dataIndex:`added_amount`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>(0,j.jsxs)(`span`,{title:`周转筐 ${t.box_num} 个 / 周转托盘 ${t.tray_num} 个`,children:[`¥`,t.added_amount]})},{title:`售后金额`,dataIndex:`after_sale`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>(0,j.jsxs)(N,{type:Number(t.after_sale??0)<0?`success`:void 0,children:[`¥`,t.after_sale??`0.00`]})},{title:`账单总金额`,dataIndex:`total_amount`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>(0,j.jsxs)(N,{strong:!0,type:`danger`,children:[`¥`,t.total_amount]})},{title:`支付状态`,dataIndex:`status`,valueType:`select`,hideInForm:!0,align:`center`,fieldProps:{options:Object.entries(w).map(([e,t])=>({value:Number(e),label:t.text}))},render:(e,t)=>{let n=w[t.status??0];return(0,j.jsx)(_,{color:n?.color,children:n?.text})}},{title:`关联订单`,dataIndex:`orders_count`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>`${t.orders_count??0} 笔`},{title:`生成时间`,dataIndex:`created_at`,hideInForm:!0,hideInSearch:!0,align:`center`}];return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{className:`mb-5`,children:[(0,j.jsx)(M,{level:3,children:`门店账单`}),(0,j.jsx)(N,{type:`secondary`,children:`采购单完成后在「采购单」页生成,每个门店单独一张;账单总金额 = 商品金额 + 配送费 + 附加金额(周转筐/托盘)+ 售后金额(可正负); 勾选多张账单可合并导出为一个 Excel(明细跨账单按商品合并,可按一级分类过滤)。`})]}),(0,j.jsx)(y,{api:`/recon/bill`,columns:ie,rowKey:`id`,accessName:`recon.bill`,tableRef:e,operateRender:e=>[(0,j.jsx)(c,{size:`small`,type:`primary`,icon:(0,j.jsx)(o,{}),onClick:()=>Z(e.id)},`detail`),e.status===0?(0,j.jsx)(b,{auth:`recon.bill.pay`,children:(0,j.jsx)(c,{size:`small`,variant:`solid`,color:`green`,onClick:()=>Q(e),children:`确认收款`})},`pay`):null],formProps:!1,actionBarRender:e=>[e.search,e.keywordSearch],rowSelection:{selectedRowKeys:V,onChange:e=>H(e.map(Number)),preserveSelectedRowKeys:!0},toolBarRender:e=>[(0,j.jsx)(b,{auth:`recon.bill.export`,children:(0,j.jsxs)(c,{icon:(0,j.jsx)(v,{}),disabled:V.length===0,onClick:()=>W(!0),children:[`导出`,V.length>0?`(${V.length})`:``]})},`export`),e.columnSetting,e.hideBorder,e.reload,e.columnHeight]}),(0,j.jsx)(a,{title:u?`账单 ${u.bill.bill_no}`:`账单详情`,open:r,onClose:()=>i(!1),size:1e3,loading:P,children:u?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(p,{column:3,size:`small`,bordered:!0,children:[(0,j.jsx)(p.Item,{label:`门店`,children:u.bill.store?.name??`门店#${u.bill.store_id}`}),(0,j.jsx)(p.Item,{label:`采购单号`,children:u.bill.purchase?.purchase_no??`-`}),(0,j.jsx)(p.Item,{label:`账单日期`,children:u.bill.bill_date}),(0,j.jsxs)(p.Item,{label:`商品金额`,children:[`¥`,u.bill.product_amount]}),(0,j.jsxs)(p.Item,{label:`配送费`,children:[`¥`,u.bill.delivery_fee]}),(0,j.jsxs)(p.Item,{label:`附加金额`,children:[`¥`,u.bill.added_amount,(0,j.jsxs)(N,{type:`secondary`,className:`ml-2!`,children:[`(筐 `,u.bill.box_num,`×¥`,u.bill.box_price,`,托盘 `,u.bill.tray_num,`×¥`,u.bill.tray_price,`)`]})]}),(0,j.jsxs)(p.Item,{label:`售后金额`,children:[(0,j.jsxs)(N,{type:Number(u.bill.after_sale??0)<0?`success`:void 0,children:[`¥`,u.bill.after_sale??`0.00`]}),(0,j.jsx)(N,{type:`secondary`,className:`ml-2!`,children:`(可正负,计入总金额)`})]}),(0,j.jsx)(p.Item,{label:`账单总金额`,children:(0,j.jsxs)(N,{strong:!0,type:`danger`,children:[`¥`,u.bill.total_amount]})}),(0,j.jsx)(p.Item,{label:`支付状态`,children:(0,j.jsx)(_,{color:w[u.bill.status??0]?.color,children:w[u.bill.status??0]?.text})}),(0,j.jsx)(p.Item,{label:`付款时间`,children:u.bill.paid_at??`-`}),(0,j.jsx)(p.Item,{label:`收款人`,children:u.bill.paid_operator?.nickname??`-`}),(0,j.jsx)(p.Item,{label:`生成人`,children:u.bill.operator?.nickname??`-`}),(0,j.jsx)(p.Item,{label:`生成时间`,children:u.bill.created_at}),u.bill.pay_remark?(0,j.jsx)(p.Item,{label:`付款备注`,span:3,children:u.bill.pay_remark}):null,u.bill.remark?(0,j.jsx)(p.Item,{label:`备注`,span:3,children:u.bill.remark}):null]}),(0,j.jsx)(M,{level:5,className:`mt-6! mb-3!`,children:`商品明细(按商品合并)`}),(0,j.jsx)(s,{rowKey:`product_id`,size:`small`,bordered:!0,columns:te,dataSource:u.items,pagination:!1,scroll:{x:`max-content`},summary:ne}),(0,j.jsxs)(M,{level:5,className:`mt-6! mb-3!`,children:[`关联订单(`,u.orders.length,` 笔)`]}),(0,j.jsx)(s,{rowKey:`id`,size:`small`,bordered:!0,columns:re,dataSource:u.orders,pagination:!1,scroll:{x:`max-content`}})]}):null}),(0,j.jsxs)(f,{title:I?`确认收款 · ${I.bill_no}`:`确认收款`,open:I!==null,onCancel:()=>L(null),onOk:()=>B.submit(),confirmLoading:R,okText:`确认收款`,destroyOnHidden:!0,children:[(0,j.jsxs)(`div`,{className:`py-2 text-gray-500`,children:[`应收金额 `,(0,j.jsxs)(N,{strong:!0,type:`danger`,children:[`¥`,I?.total_amount??`0.00`]}),`(商品 ¥`,I?.product_amount??`0.00`,` + 配送费 ¥`,I?.delivery_fee??`0.00`,` + 附加 ¥`,I?.added_amount??`0.00`,` + 售后 ¥`,I?.after_sale??`0.00`,`); 线下收款完成后登记付款信息,账单支付状态将置为「已支付」。`]}),(0,j.jsxs)(m,{form:B,layout:`vertical`,onFinish:$,children:[(0,j.jsx)(m.Item,{label:`付款时间`,name:`paid_at`,rules:[{required:!0,message:`请选择付款时间`}],children:(0,j.jsx)(d,{className:`w-full`,showTime:!0,allowClear:!1})}),(0,j.jsx)(m.Item,{label:`付款备注`,name:`pay_remark`,rules:[{max:255}],children:(0,j.jsx)(h.TextArea,{rows:2,maxLength:255,placeholder:`如:现金/转账单号等线下收款信息(选填)`})})]})]}),(0,j.jsxs)(f,{title:`导出账单`,open:U,onCancel:()=>W(!1),onOk:ee,confirmLoading:G,okText:`导出`,destroyOnHidden:!0,children:[(0,j.jsxs)(`div`,{className:`py-2 text-gray-500`,children:[`已选 `,(0,j.jsx)(N,{strong:!0,children:V.length}),` 张账单,导出为一个 Excel:商品明细跨账单按商品合并,表尾汇总配送费、附加金额与总金额; 选择分类后仅导出该一级分类下的商品明细(配送费/附加金额仍全额汇总)。`]}),(0,j.jsx)(m,{layout:`vertical`,children:(0,j.jsx)(m.Item,{label:`商品分类`,children:(0,j.jsx)(l,{value:q,onChange:e=>J(e),options:[{value:0,label:`全部分类`},...Y]})})})]})]})};export{P as default}; \ No newline at end of file diff --git a/public/assets/index-CkDjMKy9.css b/public/assets/index-CkDjMKy9.css new file mode 100644 index 0000000..2ca676d --- /dev/null +++ b/public/assets/index-CkDjMKy9.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-500:oklch(70.5% .213 47.604);--color-green-500:oklch(72.3% .219 149.579);--color-blue-50:oklch(97% .014 254.604);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer antd,components;@layer utilities{.\@container{container-type:inline-size}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.visible\!{visibility:visible!important}.\!\[position\:relative\]{position:relative!important}.\[position\:absolute\],.absolute{position:absolute}.fixed{position:fixed}.fixed\!{position:fixed!important}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.\[bottom\:20px\]{bottom:20px}.bottom-0{bottom:0}.bottom-8{bottom:calc(var(--spacing) * 8)}.left-8{left:calc(var(--spacing) * 8)}.isolate{isolation:isolate}.z-1{z-index:1}.z-10{z-index:10}.z-999{z-index:999}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0\!{margin:0!important}.m-1{margin:var(--spacing)}.m-256{margin:calc(var(--spacing) * 256)}.m-472{margin:calc(var(--spacing) * 472)}.\[margin-inline\:auto\]{margin-inline:auto}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\!{margin-top:calc(var(--spacing) * 3)!important}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\!{margin-top:calc(var(--spacing) * 4)!important}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6\!{margin-top:calc(var(--spacing) * 6)!important}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-2\.5{margin-right:calc(var(--spacing) * 2.5)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mr-5{margin-right:calc(var(--spacing) * 5)}.\!mb-1{margin-bottom:var(--spacing)!important}.mb-0{margin-bottom:0}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\!{margin-bottom:calc(var(--spacing) * 3)!important}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:var(--spacing)}.ml-1\!{margin-left:var(--spacing)!important}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-2\!{margin-left:calc(var(--spacing) * 2)!important}.ml-2\.5{margin-left:calc(var(--spacing) * 2.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.\[display\:flex\]{display:flex}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.\[height\:32px\]{height:32px}.\[height\:40vh\]{height:40vh}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-\[80vh\]{height:80vh}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-\[400px\]{max-height:400px}.min-h-\[500px\]{min-height:500px}.min-h-screen{min-height:100vh}.\[width\:32px\]{width:32px}.\[width\:60\%\]{width:60%}.\[width\:100\%\]{width:100%}.w-3{width:calc(var(--spacing) * 3)}.w-6{width:calc(var(--spacing) * 6)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-26{width:calc(var(--spacing) * 26)}.w-28{width:calc(var(--spacing) * 28)}.w-30{width:calc(var(--spacing) * 30)}.w-32{width:calc(var(--spacing) * 32)}.w-33{width:calc(var(--spacing) * 33)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-40\!{width:calc(var(--spacing) * 40)!important}.w-60\!{width:calc(var(--spacing) * 60)!important}.w-full{width:100%}.max-w-none{max-width:none}.min-w-0{min-width:0}.\[flex\:1\],.flex-1{flex:1}.flex-auto{flex:auto}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.\[cursor\:pointer\],.cursor-pointer{cursor:pointer}.resize{resize:both}.resize\!{resize:both!important}.\[scrollbar-width\:none\]{scrollbar-width:none}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.\[align-items\:center\],.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.\[justify-content\:center\]{justify-content:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-solid{--tw-border-style:solid;border-style:solid}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-purple-200{border-color:var(--color-purple-200)}.border-white{border-color:var(--color-white)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:0}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\!{padding-inline:var(--spacing)!important}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-8\!{padding-block:calc(var(--spacing) * 8)!important}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-right{text-align:right}.\[font-family\:inherit\]{font-family:inherit}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[font-size\:16px\]{font-size:16px}.\[font-size\:18px\]{font-size:18px}.text-\[12px\]{font-size:12px}.text-\[16px\]{font-size:16px}.text-\[20px\]{font-size:20px}.text-\[30px\]{font-size:30px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.whitespace-pre-line{white-space:pre-line}.\!text-white{color:var(--color-white)!important}.text-\[\#999\]{color:#999}.text-\[red\]{color:red}.text-blue-500{color:var(--color-blue-500)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-green-500{color:var(--color-green-500)}.text-indigo-500{color:var(--color-indigo-500)}.text-orange-500{color:var(--color-orange-500)}.text-purple-500{color:var(--color-purple-500)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[background\:transparent\]{background:0 0}.\[border\:0\]{border:0}@media (hover:hover){.hover\:border-blue-500:hover{border-color:var(--color-blue-500)}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:underline:hover{text-decoration-line:underline}}.disabled\:\[cursor\:default\]:disabled{cursor:default}.disabled\:\[opacity\:20\%\]:disabled{opacity:.2}@media (width>=40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:block{display:block}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (width>=64rem){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\~section\:first-of-type\]\:\[margin-top\:16px\]~section:first-of-type{margin-top:16px}.\[\&\~section\:last-of-type\]\:\[margin-bottom\:16px\]~section:last-of-type{margin-bottom:16px}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false} diff --git a/public/assets/index-eBrnVZAn.js b/public/assets/index-eBrnVZAn.js new file mode 100644 index 0000000..91c5cd2 --- /dev/null +++ b/public/assets/index-eBrnVZAn.js @@ -0,0 +1,20 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/agent-BacKF2o-.js","assets/rolldown-runtime-BgaNhQyE.js","assets/jsx-runtime-CRBytmvs.js","assets/chunk-KS7C4IRE-Zm15rq6F.js","assets/typography-DRFhazK9.js","assets/tooltip-SaeG1Uv7.js","assets/style-BmYds38x.js","assets/CopyOutlined-pYq9KfGb.js","assets/es-DGcDZmXr.js","assets/CloseCircleFilled-C_pAsEWy.js","assets/space-Cu4QVMgQ.js","assets/button-BILozH6U.js","assets/ColorPresets-CG7aHuoG.js","assets/app-Bntg8WFU.js","assets/CheckCircleFilled-DcF3PzkE.js","assets/PlusOutlined-B8K2rG8r.js","assets/ExclamationCircleFilled-B0FwC6ZE.js","assets/context-D6bvp8kb.js","assets/useClosable-BLB2IUFV.js","assets/mergeProps-yLeqvqMM.js","assets/useModal-uyHD1DJx.js","assets/config-provider-CqLGIhNd.js","assets/empty-_1ZFK8yy.js","assets/avatar-DPxbCsa4.js","assets/useBreakpoint-DLqc4AYE.js","assets/popover-BGq_MyT2.js","assets/card-DU2T2-YW.js","assets/spin-CfJYIffX.js","assets/switch--LhkZymx.js","assets/tag-DBV1bHre.js","assets/theme-D5FZSALB.js","assets/useTranslation-DBl6NYjI.js","assets/agent-CCozney_.js","assets/request--UCyt0wo.js","assets/chat-CfnvY2VS.js","assets/global-DPRsdECQ.js","assets/middleware-Ctqt9WwX.js","assets/divider-BWjoWWHX.js","assets/dropdown-BgpiO8SY.js","assets/dropdown-Cg5iA4jt.js","assets/LeftOutlined-8zj_FQJP.js","assets/PurePanel-CRkmGKGB.js","assets/flex-BUqc4pUn.js","assets/input-CHcsaDtX.js","assets/SearchOutlined-C1nd7QQO.js","assets/Input-CJ-n8Xgl.js","assets/EyeOutlined-LSBUmW0e.js","assets/CaretDownFilled-DsboRsp5.js","assets/DeleteOutlined-DwOvobSM.js","assets/ArrowUpOutlined-C-Hx3V4D.js","assets/ClearOutlined-D3ecEqjC.js","assets/UserOutlined-D5Ziy0eL.js","assets/chat-Iht936bQ.css","assets/conversation-CgPPysYU.js","assets/lodash-DzOfPy0f.js","assets/DoubleRightOutlined-Blfli1UU.js","assets/DownOutlined-OYbvV7zr.js","assets/LockOutlined-B8eRH1x4.js","assets/modal-g8Q5gNCx.js","assets/ClockCircleOutlined-CNdnBEY0.js","assets/LinkOutlined-C-pRqXVc.js","assets/form-B3R3kIqp.js","assets/useForm-CAC6DWbf.js","assets/row-VfXXpsnR.js","assets/PictureOutlined-CB8Pr7jP.js","assets/WarningFilled-D9XuDTkJ.js","assets/CaretUpOutlined-ButGJLYH.js","assets/FileOutlined-DcVPckWl.js","assets/DownloadOutlined-DJY9Mu8c.js","assets/WeiboOutlined-Bp26feUj.js","assets/SmileOutlined-CxtYvF4K.js","assets/ArrowDownOutlined-hMgHFKfN.js","assets/FileDoneOutlined-Bp46bcBB.js","assets/CheckCircleOutlined-IJiAu4Hy.js","assets/CloseCircleOutlined-D2to6Tog.js","assets/EnvironmentOutlined-Be7mN2bK.js","assets/InfoCircleOutlined-ZdiYvwVM.js","assets/UploadOutlined-NadwXvrl.js","assets/PrinterOutlined-V8ipM95d.js","assets/QqOutlined-DnUKpfIS.js","assets/RiseOutlined-gXjyF9G9.js","assets/ShopOutlined-CwwKSpcq.js","assets/WalletOutlined-Bjy-chtO.js","assets/ShoppingOutlined-CsazpDg7.js","assets/TeamOutlined-DAHp-vuL.js","assets/table-BXi9q3AE.js","assets/radio-CxFl70_7.js","assets/useBubbleLock-BOXZxiMO.js","assets/checkbox-BSxplF7f.js","assets/pagination-aogAYU7q.js","assets/zh_CN-BT8mdvr9.js","assets/XinTable-DOLiJ5rL.js","assets/XinForm-BPDYdeax.js","assets/row-DfzKzMF0.js","assets/ImageUploader-C4yPpD75.js","assets/upload-oMV5VJeJ.js","assets/progress-BvFjoSli.js","assets/tslib.es6-5i5FW2KX.js","assets/XinForm-CeTR0shq.css","assets/AuthButton-DvrpreK4.js","assets/user-LBumqaa7.js","assets/banner-CJe0agU6.js","assets/image-CTRBNpBE.js","assets/nav-Dih5jXxX.js","assets/promo-CfsZu-jA.js","assets/level-BCGrZbbc.js","assets/notice-DkzNYgG3.js","assets/store-JDnJsv44.js","assets/store-B-wG8BVA.js","assets/supplier-D0qvu-sA.js","assets/analysis-ChRcSk16.js","assets/statistic-G8YfPOC4.js","assets/iStoreOrder-CyyYoLoV.js","assets/monitor-Dd1gBWfo.js","assets/list-C8spiXAQ.js","assets/workplace-I8FwqFbs.js","assets/badge-__AeKia1.js","assets/icon-selector-Dy7uWjj7.js","assets/image-uploader-DBHOFZqO.js","assets/user-selector-C_7kHqFz.js","assets/xin-form-CjpDqXrA.js","assets/xin-table-Bw1qt43O.js","assets/403-kF5cJUEE.js","assets/result-D_u5wtF_.js","assets/404-CF76bH-T.js","assets/500-pw04psNL.js","assets/login-CKGg-k4h.js","assets/first-VYyrluR5.js","assets/breadcrumb-CSvdSHzR.js","assets/second-urN6pQJ9.js","assets/third-CmYUgLWR.js","assets/store-Djm3n7E5.js","assets/descriptions-BLF6MKiu.js","assets/popconfirm-DyseZgpU.js","assets/order-DuGMZhv9.js","assets/download-DC9wDwqQ.js","assets/iPurchaseOrder-Dn-laOqY.js","assets/base-layout-o2EQVE3N.js","assets/descriptions-DSR6x1nO.js","assets/timeline-BB5N-LF8.js","assets/fix-header-DIZqZWCz.js","assets/category-BQA8kSpc.js","assets/category-MmrJkdbs.js","assets/goods--CsYEOam.js","assets/alert-DuXzwpQC.js","assets/goods-CYe5se2j.js","assets/order-9whwRixn.js","assets/bill-Yl-chnYY.js","assets/container-return-BKpwFY6R.js","assets/payment-m5LFx4J0.js","assets/fail-BFEpQBfc.js","assets/info-DmaRTlzJ.js","assets/success-BtLkPs9S.js","assets/warning-D9M9NjTA.js","assets/ai-BaBcitlo.js","assets/config-tH2RSZ-J.js","assets/dept-wABp4Ul9.js","assets/useAuth-AiNV0bRw.js","assets/dict-j8wfnfhh.js","assets/dict-CDRllPHM.js","assets/item-DyrMo47d.js","assets/file-BhqTJxRm.js","assets/info-CVHNTwj4.js","assets/mail-ChpDRzPT.js","assets/role-D-VBhILf.js","assets/relativeTime-jamE_cdZ.js","assets/rule-CqyTke2b.js","assets/storage-DhJApafx.js","assets/user-Bt-PQ9Uv.js","assets/profile-CGJ4n7jj.js","assets/useMobile-Bcq0nkW4.js"])))=>i.map(i=>d[i]); +import{i as e}from"./rolldown-runtime-BgaNhQyE.js";import{Bn as t,Dr as n,Jn as r,Ln as i,Tr as a,Vn as o,Xn as s,t as c,zn as l}from"./jsx-runtime-CRBytmvs.js";import{a as u,c as d,i as f,n as p,o as m,r as h,t as g}from"./chunk-KS7C4IRE-Zm15rq6F.js";import{i as _,n as v,r as y,t as b}from"./global-DPRsdECQ.js";import{B as x,L as S,S as ee,V as C,_ as w,b as T,g as E,i as te,l as ne,n as D,t as re,x as ie}from"./lodash-DzOfPy0f.js";import{t as ae}from"./tooltip-SaeG1Uv7.js";import{t as oe}from"./config-provider-CqLGIhNd.js";import{t as se}from"./space-Cu4QVMgQ.js";import{t as O}from"./button-BILozH6U.js";import{t as ce}from"./app-Bntg8WFU.js";import{r as le}from"./DoubleRightOutlined-Blfli1UU.js";import{t as ue}from"./empty-_1ZFK8yy.js";import{t as de}from"./SearchOutlined-C1nd7QQO.js";import{t as fe}from"./avatar-DPxbCsa4.js";import{t as pe}from"./breadcrumb-CSvdSHzR.js";import{a as me,i as he,n as ge,o as _e,s as ve}from"./dropdown-Cg5iA4jt.js";import{n as ye}from"./LockOutlined-B8eRH1x4.js";import{n as be,t as xe}from"./row-DfzKzMF0.js";import{t as k}from"./divider-BWjoWWHX.js";import{t as Se}from"./modal-g8Q5gNCx.js";import{t as Ce}from"./dropdown-BgpiO8SY.js";import{t as we}from"./input-CHcsaDtX.js";import{n as Te}from"./CopyOutlined-pYq9KfGb.js";import{r as Ee}from"./PictureOutlined-CB8Pr7jP.js";import{t as De}from"./switch--LhkZymx.js";import{t as A}from"./theme-D5FZSALB.js";import{t as Oe}from"./ArrowDownOutlined-hMgHFKfN.js";import{t as ke}from"./ArrowUpOutlined-C-Hx3V4D.js";import{r as Ae}from"./InfoCircleOutlined-ZdiYvwVM.js";import{t as je}from"./UserOutlined-D5Ziy0eL.js";import{i as Me,t as j}from"./user-LBumqaa7.js";import{n as Ne,r as Pe,t as M}from"./useTranslation-DBl6NYjI.js";import{i as Fe,r as Ie,t as Le}from"./login-CKGg-k4h.js";import{t as N}from"./useMobile-Bcq0nkW4.js";import{t as Re}from"./dict-CDRllPHM.js";import{t as ze}from"./relativeTime-jamE_cdZ.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function Be(e,t,n){return typeof n==`boolean`?n:e.length?!0:r(t).some(e=>e.type===he)}var P=e(n()),F=({suffixCls:e,tagName:t,displayName:n})=>n=>P.forwardRef((r,i)=>P.createElement(n,{ref:i,suffixCls:e,tagName:t,...r})),I=P.forwardRef((e,t)=>{let{prefixCls:n,suffixCls:r,className:a,tagName:s,...c}=e,{getPrefixCls:l}=P.useContext(i),u=l(`layout`,n),[d,f]=_e(u),p=r?`${u}-${r}`:u;return P.createElement(s,{className:o(n||p,a,d,f),ref:t,...c})}),Ve=P.forwardRef((e,n)=>{let{direction:r}=P.useContext(i),[a,c]=P.useState([]),{prefixCls:u,className:d,rootClassName:f,children:p,hasSider:m,tagName:h,style:g,..._}=e,v=s(_,[`suffixCls`]),{getPrefixCls:y,className:b,style:x}=l(`layout`),S=y(`layout`,u),ee=Be(a,p,m),[C,w]=_e(S),T=o(S,{[`${S}-has-sider`]:ee,[`${S}-rtl`]:r===`rtl`},b,d,f,C,w),E=P.useMemo(()=>({siderHook:{addSider:e=>{c(n=>[].concat(t(n),[e]))},removeSider:e=>{c(t=>t.filter(t=>t!==e))}}}),[]);return P.createElement(ve.Provider,{value:E},P.createElement(h,{ref:n,className:T,style:{...x,...g},...v},p))}),He=F({tagName:`div`,displayName:`Layout`})(Ve),Ue=F({suffixCls:`header`,tagName:`header`,displayName:`Header`})(I),We=F({suffixCls:`footer`,tagName:`footer`,displayName:`Footer`})(I),Ge=F({suffixCls:`content`,tagName:`main`,displayName:`Content`})(I),L=He;L.Header=Ue,L.Footer=We,L.Content=Ge,L.Sider=he,L._InternalSiderContext=me;var Ke={type:`3rdParty`,init(e){Pe(e.options.react),Ne(e)}},qe=e(a(),1),R=c(),{useToken:Je}=A,Ye=()=>{let{token:e}=Je(),{t}=M(),n=m(),r=b(e=>e.themeDrawer),i=b(e=>e.setThemeDrawer),a=j(e=>e.userinfo),o=j(e=>e.logout),s=N(),[c,l]=(0,P.useState)(!1),[u,d]=(0,P.useState)(!1),f=()=>{let e=document.documentElement;document.fullscreenElement?document.exitFullscreen().then(()=>{l(!1)}):e.requestFullscreen().then(()=>{l(!0)})},p=[{key:`1`,label:t(`layout.profile`),icon:(0,R.jsx)(je,{}),onClick:()=>n(`/user/profile`)},{key:`2`,label:t(`layout.logout`),icon:(0,R.jsx)(te,{}),onClick:async()=>{o().then(()=>{Ee.success(t(`layout.logoutSuccess`)),window.location.href=`/login`}).catch(()=>{Ee.error(t(`layout.logoutFailed`))})}}];return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(Se,{closable:!1,open:u,footer:null,style:{top:40,width:600},styles:{body:{maxHeight:`80vh`},container:{padding:0}},onCancel:()=>d(!1),children:[(0,R.jsxs)(`div`,{className:`p-5`,children:[(0,R.jsx)(we,{size:`large`,placeholder:t(`layout.searchPlaceholder`),prefix:(0,R.jsx)(de,{})}),(0,R.jsx)(`div`,{className:`mt-5`,children:(0,R.jsx)(ue,{})})]}),(0,R.jsxs)(se,{className:`mt-5 flex align-center pl-5 pr-5 pt-2.5 pb-2.5`,style:{borderTop:`1px solid `+e.colorBorder},children:[(0,R.jsx)(Te,{}),` `,(0,R.jsx)(`span`,{className:`mr-4`,children:t(`layout.searchConfirm`)}),(0,R.jsx)(ke,{}),(0,R.jsx)(Oe,{}),` `,(0,R.jsx)(`span`,{className:`mr-4`,children:t(`layout.searchSwitch`)}),`Esc `,(0,R.jsx)(`span`,{className:`mr-2`,children:t(`layout.searchClose`)})]})]}),(0,R.jsxs)(se,{children:[!s&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(O,{icon:(0,R.jsx)(T,{}),size:`large`,type:`text`,onClick:()=>window.open(`https://xin-admin.com`)}),(0,R.jsx)(O,{icon:(0,R.jsx)(Ae,{}),size:`large`,type:`text`,onClick:()=>window.open(`https://github.com/xin-admin/xin-admin-ui`)}),(0,R.jsx)(O,{icon:(0,R.jsx)(de,{}),size:`large`,type:`text`,onClick:()=>d(!0)}),(0,R.jsx)(O,{onClick:f,icon:c?(0,R.jsx)(ee,{}):(0,R.jsx)(ie,{}),size:`large`,type:`text`}),(0,R.jsx)(Ie,{size:`large`,type:`text`}),(0,R.jsx)(O,{onClick:()=>i(!r),icon:(0,R.jsx)(ne,{}),size:`large`,type:`text`})]}),a?(0,R.jsx)(Ce,{menu:{items:p},children:(0,R.jsxs)(O,{size:`large`,type:`text`,children:[(0,R.jsx)(`div`,{children:a.nickname||a.username}),(0,R.jsx)(fe,{src:a.avatar_url?a.avatar_url:null,size:`small`})]})}):null]})]})};function Xe(e){let t={},n=(e,r=[])=>{if(!e.key)return;let i={href:e.path,title:e.name,icon:e.icon,local:e.local},a=[...r,i];t[e.key]=a,e.children&&e.children.length&&e.children.forEach(e=>n(e,a))};return e.forEach(e=>n(e)),t}function z(e,t){for(let n of e){if(n.path===t)return n;if(n.children&&n.children.length>0){let e=z(n.children,t);if(e)return e}}return null}function Ze(e,t,n=[]){for(let r of e){if(!r.key)continue;let e=[...n,r.key];if(r.path===t)return e;if(r.children&&r.children.length>0){let n=Ze(r.children,t,e);if(n)return n}}return null}function Qe(e,t){for(let n of e){if(n.key===t)return n;if(n.children&&n.children.length>0){let e=Qe(n.children,t);if(e)return e}}return null}var $e=(0,P.createContext)(null),et=({children:e})=>{let t=u(),[n,r]=(0,P.useState)([]),[i,a]=(0,P.useState)(),[o,s]=(0,P.useState)([]),[c,l]=(0,P.useState)(!1);return(0,P.useEffect)(()=>{Me().then(({data:e})=>{let t=e.data.menus;r(t)})},[]),(0,P.useEffect)(()=>{let e=t.pathname,r=Ze(n,e);r&&r.length&&(s(r),a(r[0]))},[n]),(0,R.jsx)($e.Provider,{value:{menus:n,parentKey:i,selectKey:o,collapsed:c,setParentKey:a,setCollapsed:l,setSelectKey:s},children:e})},B=()=>{let e=(0,P.useContext)($e);if(!e)throw Error(`useLayoutContext must be used within LayoutProvider`);return e},V=(e,t)=>e.reduce((e,n)=>{if(![`route`,`menu`].includes(n.type)||!n.hidden)return e;let r={label:n.local?t(n.local):n.name,icon:n.icon?(0,R.jsx)(D,{name:n.icon}):void 0,key:n.key};return n.type===`menu`&&n.children?.length&&(r.children=V(n.children,t)),e.push(r),e},[]),H=()=>{let{t:e}=M(),t=N(),n=m(),[r,i]=(0,P.useState)([]),a=b(e=>e.layout),{menus:o,parentKey:s,selectKey:c,setSelectKey:l,setParentKey:u}=B();(0,P.useEffect)(()=>{if(t){i(V(o,e));return}if([`columns`,`mix`].includes(a)&&s){let t=o.find(e=>e.key===s);i(V(t?.children||[],e))}else i(V(o,e))},[o,a,s,e,t]);let d=e=>{l(e),[`top`,`side`].includes(a)&&u(e[e.length-1]);let t=Qe(o,e[0]);if(!(!t||!t.key)){if(t.type===`route`&&t.link){window.open(t.path,`_blank`);return}if(t.type===`route`&&t.path){n(t.path);return}}};return(0,R.jsx)(R.Fragment,{children:r.length>0&&(0,R.jsx)(ge,{className:`border-b-0 flex-1`,mode:a===`top`&&!t?`horizontal`:`inline`,items:r,onSelect:e=>d(e.keyPath),selectedKeys:c})})},tt=[{title:(0,R.jsx)(T,{})}],nt=()=>{let{t:e}=M(),t=u(),{menus:n}=B(),[r,i]=(0,P.useState)(tt),a=(0,P.useMemo)(()=>Xe(n),[n]);return(0,P.useEffect)(()=>{let r=t.pathname,o=z(n,r);if(o&&o.key){let t=a[o.key];if(t){i([{title:(0,R.jsx)(T,{})},...t.map(t=>({title:(0,R.jsxs)(R.Fragment,{children:[t.icon&&(0,R.jsx)(D,{name:t.icon}),(0,R.jsx)(`span`,{children:t.local?e(t.local):t.title})]})}))]);return}}i(tt)},[e,t.pathname,a]),(0,R.jsx)(pe,{items:r})},{Header:rt}=L,it=()=>{let{t:e}=M(),t=N(),n=m(),r=b(e=>e.logo),i=b(e=>e.title),a=b(e=>e.layout),o=b(e=>e.themeConfig),{menus:s,parentKey:c,collapsed:l,setCollapsed:u,setParentKey:d,setSelectKey:f}=B(),p={token:{colorTextBase:o.headerColor},components:{Menu:{activeBarBorderWidth:0,itemBg:`transparent`}}},[h,g]=(0,P.useState)([]);(0,P.useEffect)(()=>{g(s.filter(e=>e.hidden).map(t=>({label:t.local?e(t.local):t.name,icon:t.icon?(0,R.jsx)(D,{name:t.icon}):!1,key:t.key})))},[s,e]);let _=e=>{let t=Qe(s,e);if(!(!t||!t.key)&&(d(t.key),t.type!==`menu`)){if(f([t.key]),t.type===`route`&&t.link){window.open(t.path,`_blank`);return}if(t.type===`route`&&t.path){n(t.path);return}}};return(0,R.jsx)(oe,{theme:p,children:t?(0,R.jsxs)(rt,{className:`flex sticky z-1 top-0 backdrop-blur-xs justify-between items-center`,children:[(0,R.jsxs)(`div`,{className:`flex items-center`,children:[(0,R.jsx)(`img`,{className:`w-9 mr-5`,src:r,alt:`logo`}),(0,R.jsx)(`span`,{className:`font-semibold text-[20px] mr-2`,children:i})]}),(0,R.jsx)(Ye,{})]}):(0,R.jsxs)(rt,{className:`flex sticky z-1 top-0 backdrop-blur-xs`,style:{borderBottom:`1px solid `+o.colorBorder},children:[(0,R.jsxs)(`div`,{className:`flex items-center relative`,children:[(0,R.jsx)(`img`,{className:`h-8`,src:r,alt:`logo`}),(0,R.jsx)(`span`,{className:`font-semibold text-[20px] ml-5 mr-5`,children:i}),a!==`top`&&(0,R.jsx)(O,{type:`text`,className:`text-[16px] mr-2.5`,onClick:()=>u(!l),children:l?(0,R.jsx)(E,{}):(0,R.jsx)(w,{})}),[`columns`,`side`].includes(a)&&(0,R.jsx)(nt,{})]}),(0,R.jsxs)(`div`,{className:`overflow-hidden flex-1`,children:[a==`top`&&(0,R.jsx)(H,{}),a==`mix`&&(0,R.jsx)(ge,{className:`border-b-0 w-full`,mode:`horizontal`,items:h,onSelect:e=>_(e.key),selectedKeys:[c]})]}),(0,R.jsx)(Ye,{})]})})},{Footer:at}=L,ot=()=>{let e=new Date().getFullYear(),t=b(e=>e.themeConfig);return(0,R.jsxs)(R.Fragment,{children:[t.fixedFooter&&(0,R.jsx)(`div`,{className:`h-10`}),(0,R.jsx)(at,{className:(t.fixedFooter?`sticky`:`relative`)+` z-10 w-full bottom-0 pt-2.5 pb-2.5`,style:{borderTop:`1px solid `+t.colorBorder},children:(0,R.jsxs)(`div`,{className:`flex items-center justify-center w-full`,children:[`Xin Admin ©`,e,` Created by xiaoliu`]})})]})},st=()=>{let e=b(e=>e.themeConfig),t=b(e=>e.themeDrawer),n=b(e=>e.setThemeDrawer),[r,i]=(0,P.useState)(!1);return(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`div`,{className:`fixed bottom-8 left-8 z-999`,children:(0,R.jsx)(O,{type:`primary`,shape:`circle`,size:`large`,icon:r?(0,R.jsx)(w,{}):(0,R.jsx)(E,{}),onClick:()=>i(!r)})}),(0,R.jsx)(S,{placement:`left`,closable:!0,onClose:()=>i(!1),open:r,styles:{section:{width:280},header:{borderBottom:`1px solid `+e.colorBorder,background:e.siderBg,color:e.siderColor},body:{padding:0,background:e.siderBg}},footer:(0,R.jsxs)(se,{children:[(0,R.jsx)(O,{icon:(0,R.jsx)(T,{}),size:`large`,type:`text`,onClick:()=>window.open(`https://xin-admin.com`)}),(0,R.jsx)(O,{icon:(0,R.jsx)(Ae,{}),size:`large`,type:`text`,onClick:()=>window.open(`https://github.com/xin-admin/xin-admin-ui`)}),(0,R.jsx)(Ie,{size:`large`,type:`text`}),(0,R.jsx)(O,{onClick:()=>n(!t),icon:(0,R.jsx)(ne,{}),size:`large`,type:`text`})]}),children:(0,R.jsx)(`div`,{style:{height:`100%`,overflowY:`auto`,width:`100%`,background:e.siderBg},children:(0,R.jsx)(H,{})})})]})},ct=re(),lt={defaultAlgorithm:A.defaultAlgorithm,darkAlgorithm:A.darkAlgorithm,defaultCompactAlgorithm:[A.defaultAlgorithm,A.compactAlgorithm],darkCompactAlgorithm:[A.darkAlgorithm,A.compactAlgorithm]},ut=[{label:`layout.algorithmDefault`,value:`defaultAlgorithm`},{label:`layout.algorithmDark`,value:`darkAlgorithm`},{label:`layout.algorithmDefaultCompact`,value:`defaultCompactAlgorithm`},{label:`layout.algorithmDarkCompact`,value:`darkCompactAlgorithm`}],{useToken:dt}=A,ft=[{key:`colorPrimary`,label:`layout.colorPrimary`},{key:`colorText`,label:`layout.colorText`},{key:`colorBg`,label:`layout.colorBg`},{key:`colorSuccess`,label:`layout.colorSuccess`},{key:`colorWarning`,label:`layout.colorWarning`},{key:`colorError`,label:`layout.colorError`},{key:`bodyBg`,label:`layout.bodyBg`},{key:`footerBg`,label:`layout.footerBg`},{key:`headerBg`,label:`layout.headerBg`},{key:`headerColor`,label:`layout.headerColor`},{key:`siderBg`,label:`layout.siderBg`},{key:`siderColor`,label:`layout.siderColor`},{key:`colorBorder`,label:`layout.colorBorder`}],pt=[{key:`fixedFooter`,label:`layout.fixedFooter`,type:`switch`},{key:`borderRadius`,label:`layout.borderRadius`,type:`number`,min:0,max:30},{key:`controlHeight`,label:`layout.controlHeight`,type:`number`,min:0},{key:`headerPadding`,label:`layout.headerPadding`,type:`number`,min:0},{key:`headerHeight`,label:`layout.headerHeight`,type:`number`,min:0},{key:`siderWeight`,label:`layout.siderWeight`,type:`number`,min:0},{key:`bodyPadding`,label:`layout.bodyPadding`,type:`number`,min:0}],mt=[{background:`/static/theme/default.svg`,name:`light`,title:`layout.themeLight`},{background:`/static/theme/dark.svg`,name:`dark`,title:`layout.themeDark`}],ht=[{key:`side`,title:`layout.layoutSide`,render:e=>(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:`rounded-sm w-full h-6 mb-1.5`,style:{background:e.colorPrimaryBorder}}),(0,R.jsxs)(`div`,{className:`flex`,children:[(0,R.jsx)(`div`,{className:`rounded-sm h-16 w-6`,style:{background:e.colorPrimary}}),(0,R.jsx)(`div`,{className:`rounded-sm flex-1 ml-1.5`,style:{background:e.colorPrimaryBg}})]})]})},{key:`top`,title:`layout.layoutTop`,render:e=>(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:`rounded-sm h-6 w-full mb-1.5`,style:{background:e.colorPrimary}}),(0,R.jsx)(`div`,{className:`rounded-sm h-16`,style:{background:e.colorPrimaryBg}})]})},{key:`mix`,title:`layout.layoutMix`,render:e=>(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`div`,{className:`rounded-sm w-full h-6 mb-1.5`,style:{background:e.colorPrimary}}),(0,R.jsxs)(`div`,{className:`flex`,children:[(0,R.jsx)(`div`,{className:`rounded-sm h-16 w-6`,style:{background:e.colorPrimary}}),(0,R.jsx)(`div`,{className:`rounded-sm flex-1 ml-1.5`,style:{background:e.colorPrimaryBg}})]})]})},{key:`columns`,title:`layout.layoutColumns`,render:e=>(0,R.jsxs)(`div`,{className:`flex`,children:[(0,R.jsx)(`div`,{className:`rounded-sm mr-1.5 w-3 h-24`,style:{background:e.colorPrimary}}),(0,R.jsx)(`div`,{className:`rounded-sm mr-1.5 w-6 h-24`,style:{background:e.colorPrimaryHover}}),(0,R.jsx)(`div`,{className:`rounded-sm flex-auto h-24`,style:{background:e.colorPrimaryBg}})]})}],gt=()=>{let{t:e}=M(),{token:t}=dt(),n=b(e=>e.themeDrawer),r=b(e=>e.setThemeDrawer),i=b(e=>e.setThemeConfig),a=b(e=>e.themeConfig),o=b(e=>e.layout),s=b(e=>e.setLayout),c=ut?.map(t=>({...t,label:e(t.label)}))||[],l=(0,ct.debounce)((e,t)=>{i({...a,[e]:t})},400,{leading:!0,trailing:!1});return(0,R.jsxs)(S,{styles:{body:{paddingTop:10}},placement:`right`,closable:!1,onClose:()=>r(!1),open:n,footer:(0,R.jsx)(`div`,{className:`flex w-full justify-between`,children:(0,R.jsx)(O,{onClick:()=>{i({...v,..._})},children:e(`layout.resetTheme`)})}),children:[(0,R.jsx)(k,{children:e(`layout.layoutStyle`)}),(0,R.jsx)(xe,{gutter:[20,20],children:ht.map(({key:n,title:r,render:i})=>(0,R.jsx)(be,{span:12,children:(0,R.jsx)(ae,{title:e(r),children:(0,R.jsx)(`div`,{className:`p-2 rounded-lg cursor-pointer`,style:{boxShadow:t.boxShadow,borderRadius:t.borderRadius,border:o===n?`2px solid ${t.colorPrimary}`:`2px solid transparent`},onClick:()=>s(n),children:i(t)})})},n))}),(0,R.jsx)(k,{children:e(`layout.presetTheme`)}),(0,R.jsxs)(xe,{gutter:20,onClick:e=>{let t=e.target.closest(`[data-theme]`);if(!t)return;let n=t.dataset.theme,r={dark:y,light:_};r[n]&&i({...a,...r[n]})},children:[mt.map(n=>(0,R.jsxs)(be,{span:8,className:`mb-2.5`,children:[(0,R.jsx)(`div`,{"data-theme":n.name,className:`cursor-pointer overflow-hidden border-solid`,style:{borderRadius:t.borderRadius,borderWidth:a.themeScheme===n.name?`2px`:`0px`,borderColor:a.themeScheme===n.name?t.colorPrimary:`transparent`},children:(0,R.jsx)(`img`,{src:n.background,alt:n.name})}),(0,R.jsx)(`div`,{className:`text-center mt-1.5`,children:e(n.title)})]},n.name)),(0,R.jsx)(be,{span:24,className:`mb-2.5`,children:(0,R.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,R.jsx)(`div`,{children:e(`layout.themeAlgorithm`)}),(0,R.jsx)(le,{value:a.algorithm,style:{width:160},onChange:e=>l(`algorithm`,e),options:c})]})})]}),(0,R.jsx)(k,{children:e(`layout.themeColor`)}),ft.map(({key:t,label:n})=>(0,R.jsxs)(`div`,{className:`flex justify-between items-center mb-2.5`,children:[(0,R.jsx)(`div`,{children:e(n)}),(0,R.jsx)(x,{showText:!0,value:a[t],onChange:e=>l(t,e.toCssString())})]},t)),(0,R.jsx)(k,{children:e(`layout.styleConfig`)}),pt.map(({key:t,label:n,type:r,...i})=>(0,R.jsxs)(`div`,{className:`flex justify-between items-center mb-2.5`,children:[(0,R.jsx)(`div`,{children:e(n)}),r===`switch`?(0,R.jsx)(De,{value:a[t],onChange:e=>l(t,e)}):(0,R.jsx)(C,{value:a[t],onChange:e=>l(t,e),...i})]},t))]})},_t=()=>{let{t:e}=M(),t=u(),n=b(e=>e.title),{menus:r}=B();return(0,P.useEffect)(()=>{let i=n||`Xin Admin`,a=z(r,t.pathname);if(!a){document.title=i;return}let o=a.local?e(a.local):a.name;o?document.title=o+` - `+i:document.title=i},[t.pathname,n,e,r]),null},{useToken:vt}=A,yt=()=>{let{t:e}=M(),{token:t}=vt(),n=m(),{menus:r,parentKey:i,collapsed:a,setParentKey:o,setSelectKey:s}=B(),c=b(e=>e.themeConfig),l=e=>{if(e.key&&(o(e.key),e.type!==`menu`)){if(s([e.key]),e.type===`route`&&e.link){window.open(e.path,`_blank`);return}if(e.type===`route`&&e.path){n(e.path);return}}};return(0,R.jsxs)(`div`,{className:`flex h-full`,children:[(0,R.jsx)(`div`,{className:`box-border shrink-0 h-full overflow-auto`,style:{borderRight:a?`none`:`1px solid `+c.colorBorder,width:79},children:r.filter(e=>e.hidden).map(n=>(0,R.jsxs)(`div`,{style:{backgroundColor:i===n.key?t.colorPrimaryBg:`transparent`,color:i===n.key?t.colorPrimary:c.siderColor},className:`flex items-center justify-center flex-col p-2 mb-2 pt-3 pb-3 cursor-pointer`,onClick:()=>l(n),children:[(0,R.jsx)(D,{name:n.icon,style:{fontSize:18}}),(0,R.jsx)(`span`,{className:`mt-1 truncate w-full text-center`,children:n.local?e(n.local):n.name})]},n.key))}),!a&&(0,R.jsx)(`div`,{className:`flex-1 h-full overflow-y-auto`,children:(0,R.jsx)(H,{})})]})},{Content:bt,Sider:xt}=L,St=()=>{let e=N(),t=b(e=>e.themeConfig),n=b(e=>e.layout),[r,i]=(0,P.useState)(226),{menus:a,collapsed:o,parentKey:s}=B();return(0,P.useEffect)(()=>{let e=t.siderWeight?t.siderWeight:226,r=n===`columns`?79:0,o=a.find(e=>e.key===s);[`mix`,`columns`].includes(n)?o?.children&&o?.children.length?i(r+e):i(r):i(e)},[t,n,a,s]),(0,R.jsxs)(L,{className:`min-h-screen`,style:{background:t.background},children:[(0,R.jsx)(_t,{}),(0,R.jsx)(gt,{}),(0,R.jsx)(it,{}),e&&(0,R.jsx)(st,{}),(0,R.jsxs)(L,{hasSider:!0,className:`relative`,children:[n!==`top`&&!e&&(0,R.jsx)(xt,{collapsed:o,width:r,style:{borderRight:`1px solid `+t.colorBorder,height:`calc(100vh - ${t.headerHeight}px)`,top:t.headerHeight,overflowY:`auto`,overflowX:`hidden`,position:`sticky`},children:n===`columns`?(0,R.jsx)(yt,{}):(0,R.jsx)(H,{})}),(0,R.jsxs)(L,{className:`min-w-0`,children:[(0,R.jsx)(bt,{style:{padding:t.bodyPadding},children:(0,R.jsx)(p,{})}),(0,R.jsx)(ot,{})]})]})]})},Ct=()=>(0,R.jsx)(et,{children:(0,R.jsx)(St,{})}),wt=Object.assign({"/web/pages/ai/agent/index.tsx":()=>d(()=>import(`./agent-BacKF2o-.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33])),"/web/pages/ai/chat/index.tsx":()=>d(()=>import(`./chat-CfnvY2VS.js`),__vite__mapDeps([34,1,2,3,35,36,33,4,5,6,7,8,9,21,10,15,11,12,13,14,16,17,18,19,20,23,24,25,26,37,38,39,40,41,42,43,44,45,46,47,30,48,49,50,51,31,32,52])),"/web/pages/ai/conversation/index.tsx":()=>d(()=>import(`./conversation-CgPPysYU.js`),__vite__mapDeps([53,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,29,31,91,92,26,93,28,30,94,95,96,97,98,42,99,100,36])),"/web/pages/client/banner.tsx":()=>d(()=>import(`./banner-CJe0agU6.js`),__vite__mapDeps([101,1,2,4,5,6,7,8,9,102,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,29,91,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/client/nav.tsx":()=>d(()=>import(`./nav-Dih5jXxX.js`),__vite__mapDeps([103,1,2,4,5,6,7,8,9,102,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,29,91,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/client/promo.tsx":()=>d(()=>import(`./promo-CfsZu-jA.js`),__vite__mapDeps([104,1,2,4,5,6,7,8,9,102,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,29,91,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/customer/level.tsx":()=>d(()=>import(`./level-BCGrZbbc.js`),__vite__mapDeps([105,1,2,4,5,6,7,8,9,102,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,29,91,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/customer/notice.tsx":()=>d(()=>import(`./notice-DkzNYgG3.js`),__vite__mapDeps([106,1,2,4,5,6,7,8,9,29,18,19,15,12,91,54,21,10,14,16,17,24,20,11,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36,107])),"/web/pages/customer/store.tsx":()=>d(()=>import(`./store-B-wG8BVA.js`),__vite__mapDeps([108,1,2,33,4,5,6,7,8,9,29,18,19,15,12,91,54,21,10,14,16,17,24,20,11,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/customer/supplier.tsx":()=>d(()=>import(`./supplier-D0qvu-sA.js`),__vite__mapDeps([109,1,2,4,5,6,7,8,9,29,18,19,15,12,91,54,21,10,14,16,17,24,20,11,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/dashboard/analysis.tsx":()=>d(()=>import(`./analysis-ChRcSk16.js`),__vite__mapDeps([110,1,2,33,85,19,5,21,10,24,12,11,55,9,15,6,40,41,22,56,44,39,86,62,87,27,88,45,8,38,89,90,66,67,47,26,93,63,37,111,29,18,30,71,49,81,82,31,97,112])),"/web/pages/dashboard/monitor.tsx":()=>d(()=>import(`./monitor-Dd1gBWfo.js`),__vite__mapDeps([113,2,1,10,5,23,24,25,26,15,93,63,37,114,19,55,9,6,40,41,21,22,56,44,27,89,90,30,71,49,31])),"/web/pages/dashboard/workplace.tsx":()=>d(()=>import(`./workplace-I8FwqFbs.js`),__vite__mapDeps([115,2,1,4,5,6,7,8,9,10,22,23,24,25,116,26,15,37,59,60,114,19,55,40,41,21,56,44,27,63,89,90,29,18,12,70,75,81,84,100,36,33,31])),"/web/pages/example/icon-selector.tsx":()=>d(()=>import(`./icon-selector-Dy7uWjj7.js`),__vite__mapDeps([117,1,2,4,5,6,7,8,9,10,92,33,54,21,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/example/image-uploader.tsx":()=>d(()=>import(`./image-uploader-DBHOFZqO.js`),__vite__mapDeps([118,1,2,4,5,6,7,8,9,10,11,12,26,15,61,14,16,62,24,63,94,33,58,20,21,17,18,19,41,64,95,46,96,67,48,68,31,97])),"/web/pages/example/user-selector.tsx":()=>d(()=>import(`./user-selector-C_7kHqFz.js`),__vite__mapDeps([119,1,2,4,5,6,7,8,9,10,92,33,54,21,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/example/xin-form.tsx":()=>d(()=>import(`./xin-form-CjpDqXrA.js`),__vite__mapDeps([120,1,2,4,5,6,7,8,9,10,11,12,92,33,54,21,14,15,16,17,18,19,24,20,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/example/xin-table.tsx":()=>d(()=>import(`./xin-table-Bw1qt43O.js`),__vite__mapDeps([121,2,1,11,12,29,5,18,19,15,72,91,54,21,10,14,9,16,17,6,24,20,40,41,55,22,56,44,25,39,57,37,45,8,58,59,60,61,62,63,43,46,7,64,65,66,67,47,48,68,69,70,71,49,50,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,33,26,93,28,30,31,94,95,96,97,98,42,99,100,36])),"/web/pages/exception/403.tsx":()=>d(()=>import(`./403-kF5cJUEE.js`),__vite__mapDeps([122,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/exception/404.tsx":()=>d(()=>import(`./404-CF76bH-T.js`),__vite__mapDeps([124,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/exception/500.tsx":()=>d(()=>import(`./500-pw04psNL.js`),__vite__mapDeps([125,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/login/index.tsx":()=>d(()=>import(`./login-CKGg-k4h.js`).then(e=>e.n),__vite__mapDeps([126,1,2,3,35,36,33,4,5,6,7,8,9,10,11,12,57,88,87,93,63,24,37,38,39,40,41,21,61,14,16,62,43,44,45,46,90,69,79,51,100,31])),"/web/pages/multi-menu/first.tsx":()=>d(()=>import(`./first-VYyrluR5.js`),__vite__mapDeps([127,2,1,10,5,11,12,128,56,39,40,41,21,26,15,93,63,24])),"/web/pages/multi-menu/second.tsx":()=>d(()=>import(`./second-urN6pQJ9.js`),__vite__mapDeps([129,2,1,10,5,11,12,128,56,39,40,41,21,26,15,93,63,24])),"/web/pages/multi-menu/third.tsx":()=>d(()=>import(`./third-CmYUgLWR.js`),__vite__mapDeps([130,2,1,10,5,11,12,128,56,39,40,41,21,26,15,93,63,24])),"/web/pages/order/store.tsx":()=>d(()=>import(`./store-Djm3n7E5.js`),__vite__mapDeps([131,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,92,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98,132,102,133,91,42,99,100,36,107,112,134,135,136])),"/web/pages/page-layout/base-layout.tsx":()=>d(()=>import(`./base-layout-o2EQVE3N.js`),__vite__mapDeps([137,2,1,4,5,6,7,8,9,10,11,12,23,24,25,26,15,93,63,132,38,39,40,41,21,42,96,14,111,29,18,19,80,83,84,51])),"/web/pages/page-layout/descriptions.tsx":()=>d(()=>import(`./descriptions-DSR6x1nO.js`),__vite__mapDeps([138,2,1,4,5,6,7,8,9,85,19,21,10,24,12,11,55,15,40,41,22,56,44,39,86,62,87,27,88,45,38,89,90,66,67,47,23,25,26,93,63,37,59,132,42,139,29,18,68,73,78,83,51])),"/web/pages/page-layout/fix-header.tsx":()=>d(()=>import(`./fix-header-DIZqZWCz.js`),__vite__mapDeps([140,1,2,4,5,6,7,8,9,10,11,12,23,24,25,116,26,15,93,63,37,59,132,42,61,14,16,62,43,44,45,46,139,29,18,19,72,73,74,78])),"/web/pages/product/category.tsx":()=>d(()=>import(`./category-BQA8kSpc.js`),__vite__mapDeps([141,1,2,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,92,33,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98,91,42,99,100,36,142])),"/web/pages/product/goods.tsx":()=>d(()=>import(`./goods--CsYEOam.js`),__vite__mapDeps([143,1,2,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,144,85,86,87,27,88,38,89,90,92,33,26,93,28,29,30,31,94,95,96,97,98,102,91,42,99,100,36,142,145,135])),"/web/pages/purchase/order.tsx":()=>d(()=>import(`./order-9whwRixn.js`),__vite__mapDeps([146,1,2,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,33,26,93,28,29,30,31,94,95,96,97,98,132,102,133,91,42,99,100,36,112,134,135,136,145])),"/web/pages/recon/bill.tsx":()=>d(()=>import(`./bill-Yl-chnYY.js`),__vite__mapDeps([147,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,26,93,28,29,30,31,94,95,96,97,98,132,91,42,99,100,36,107,112,135,136,142])),"/web/pages/recon/container-return.tsx":()=>d(()=>import(`./container-return-BKpwFY6R.js`),__vite__mapDeps([148,1,2,4,5,6,7,8,9,11,12,55,15,40,41,21,10,22,56,44,57,92,33,54,14,16,17,18,19,24,20,25,39,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98,91,42,99,100,36,107,135])),"/web/pages/recon/payment.tsx":()=>d(()=>import(`./payment-m5LFx4J0.js`),__vite__mapDeps([149,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,132,102,29,91,92,26,93,28,30,31,94,95,96,97,98,42,99,100,36,107,136])),"/web/pages/result/fail.tsx":()=>d(()=>import(`./fail-BFEpQBfc.js`),__vite__mapDeps([150,1,2,4,5,6,7,8,9,11,12,26,15,123,14,16,65,74])),"/web/pages/result/info.tsx":()=>d(()=>import(`./info-DmaRTlzJ.js`),__vite__mapDeps([151,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/result/success.tsx":()=>d(()=>import(`./success-BtLkPs9S.js`),__vite__mapDeps([152,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/result/warning.tsx":()=>d(()=>import(`./warning-D9M9NjTA.js`),__vite__mapDeps([153,1,2,11,12,26,15,123,14,9,16,65])),"/web/pages/system/ai.tsx":()=>d(()=>import(`./ai-BaBcitlo.js`),__vite__mapDeps([154,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,144,92,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/system/config.tsx":()=>d(()=>import(`./config-tH2RSZ-J.js`),__vite__mapDeps([155,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,92,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98,133])),"/web/pages/system/dept.tsx":()=>d(()=>import(`./dept-wABp4Ul9.js`),__vite__mapDeps([156,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,144,85,86,87,27,88,38,89,90,92,26,93,28,29,30,31,94,95,96,97,98,133,99,100,36,157])),"/web/pages/system/dict/index.tsx":()=>d(()=>import(`./dict-j8wfnfhh.js`),__vite__mapDeps([158,1,2,3,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,116,31,159,36,33,91,85,86,87,27,88,38,89,90,92,26,93,28,29,30,94,95,96,97,98,42,99,100])),"/web/pages/system/dict/item.tsx":()=>d(()=>import(`./item-DyrMo47d.js`),__vite__mapDeps([160,1,2,3,4,5,6,7,8,9,10,11,12,40,116,57,92,33,54,21,14,15,16,17,18,19,24,20,41,55,22,56,44,25,39,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98,91,42,99,100,36])),"/web/pages/system/file.tsx":()=>d(()=>import(`./file-BhqTJxRm.js`),__vite__mapDeps([161,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,92,26,93,28,29,30,31,94,95,96,97,98,132,102])),"/web/pages/system/info.tsx":()=>d(()=>import(`./info-CVHNTwj4.js`),__vite__mapDeps([162,2,1,4,5,6,7,8,9,23,24,25,26,15,37,60,139,12,29,18,19,76,79,51,31])),"/web/pages/system/mail.tsx":()=>d(()=>import(`./mail-ChpDRzPT.js`),__vite__mapDeps([163,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,92,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/system/role.tsx":()=>d(()=>import(`./role-D-VBhILf.js`),__vite__mapDeps([164,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,85,86,87,27,88,38,89,90,26,93,28,29,31,165,91,92,30,94,95,96,97,98,42,99,100,36])),"/web/pages/system/rule.tsx":()=>d(()=>import(`./rule-CqyTke2b.js`),__vite__mapDeps([166,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,116,28,29,31,159,36,165,91,85,86,87,27,88,38,89,90,92,26,93,30,94,95,96,97,98,42,99,100,157])),"/web/pages/system/storage.tsx":()=>d(()=>import(`./storage-DhJApafx.js`),__vite__mapDeps([167,1,2,33,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,92,85,86,87,27,88,38,89,90,26,93,28,29,30,31,94,95,96,97,98])),"/web/pages/system/user.tsx":()=>d(()=>import(`./user-Bt-PQ9Uv.js`),__vite__mapDeps([168,1,2,4,5,6,7,8,9,54,21,10,14,15,16,17,18,19,24,20,11,12,40,41,55,22,56,44,25,39,57,37,45,58,59,60,61,62,63,43,46,64,65,66,67,47,48,68,69,70,71,49,50,72,73,74,75,76,77,78,79,80,81,82,83,84,51,23,29,100,36,33,31,165,91,85,86,87,27,88,38,89,90,92,26,93,28,30,94,95,96,97,98,42,99,157])),"/web/pages/user/profile.tsx":()=>d(()=>import(`./profile-CGJ4n7jj.js`),__vite__mapDeps([169,1,2,4,5,6,7,8,9,10,11,12,23,24,25,57,86,62,87,26,15,61,14,16,63,43,44,45,46,114,19,55,40,41,21,22,56,27,89,90,64,17,29,18,95,96,67,48,68,73,74,75,77,51,100,36,33,31,170]))}),Tt=[`/login`];function Et(e){return(0,R.jsx)(P.Suspense,{fallback:null,children:(0,R.jsx)((0,P.lazy)(e),{})})}function Dt(){let e=[];for(let t in wt){let n=t.replace(`/web/pages`,``).replace(/\.tsx$/,``).replace(/\/index$/,``);n||=`/`,!Tt.includes(n)&&e.push({id:n,path:n,element:Et(wt[t])})}return e}function Ot(){return f([{Component:Ct,children:[...Dt(),{path:`*`,element:Et(wt[`/web/pages/result/404.tsx`])}]},{path:`/`,element:(0,R.jsx)(g,{to:`/dashboard/analysis`})},{path:`login`,element:(0,R.jsx)(Le,{})}])}function kt(){let{message:e,modal:t,notification:n}=ce.useApp();return window.$message=e,window.$modal=t,window.$notification=n,null}var At=({children:e})=>{let t=b(e=>e.themeConfig),{antdLocale:n}=Fe();return(0,R.jsx)(oe,{theme:(0,P.useMemo)(()=>({components:{Layout:{headerPadding:`0 `+t.headerPadding+`px`,headerHeight:t.headerHeight,bodyBg:t.bodyBg,footerBg:t.footerBg,headerBg:t.headerBg,headerColor:t.headerColor,siderBg:t.siderBg,footerPadding:0},Menu:{activeBarBorderWidth:0,itemBg:`transparent`,subMenuItemBg:`transparent`}},token:{colorPrimary:t.colorPrimary,colorBgBase:t.colorBg,colorTextBase:t.colorText,colorError:t.colorError,colorInfo:t.colorPrimary,colorLink:t.colorPrimary,colorSuccess:t.colorSuccess,colorWarning:t.colorWarning,borderRadius:t.borderRadius,controlHeight:t.controlHeight},algorithm:t.algorithm?lt[t.algorithm]:void 0}),[t]),locale:n,children:(0,R.jsxs)(ce,{children:[(0,R.jsx)(kt,{}),e]})})},jt=()=>{let{changeLanguage:e}=Fe(),t=j(e=>e.info),n=b(e=>e.initWebInfo),r=Re(e=>e.initDict),[i,a]=(0,P.useState)(),o=async()=>{n(),await r(),await e(localStorage.getItem(`i18nextLng`)||`zh`),localStorage.getItem(`token`)?await t():window.location.pathname!==`/login`&&(window.location.href=`/login`)};return(0,P.useEffect)(()=>{o(),a(Ot())},[]),(0,R.jsx)(At,{children:i&&(0,R.jsx)(h,{router:i})})},U=e=>typeof e==`string`,W=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},Mt=e=>e==null?``:``+e,Nt=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},Pt=/###/g,Ft=e=>e&&e.indexOf(`###`)>-1?e.replace(Pt,`.`):e,It=e=>!e||U(e),G=(e,t,n)=>{let r=U(t)?t.split(`.`):t,i=0;for(;i{let{obj:r,k:i}=G(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=G(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=G(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},Rt=(e,t,n,r)=>{let{obj:i,k:a}=G(e,t,Object);i[a]=i[a]||[],i[a].push(n)},K=(e,t)=>{let{obj:n,k:r}=G(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},zt=(e,t,n)=>{let r=K(e,n);return r===void 0?K(t,n):r},Bt=(e,t,n)=>{for(let r in t)r!==`__proto__`&&r!==`constructor`&&(r in e?U(e[r])||e[r]instanceof String||U(t[r])||t[r]instanceof String?n&&(e[r]=t[r]):Bt(e[r],t[r],n):e[r]=t[r]);return e},q=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),Vt={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`,"/":`/`},Ht=e=>U(e)?e.replace(/[&<>"'\/]/g,e=>Vt[e]):e,Ut=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},Wt=[` `,`,`,`?`,`!`,`;`],Gt=new Ut(20),Kt=(e,t,n)=>{t||=``,n||=``;let r=Wt.filter(e=>t.indexOf(e)<0&&n.indexOf(e)<0);if(r.length===0)return!0;let i=Gt.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},qt=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e-1&&oe?.replace(/_/g,`-`),Jt={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},Y=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||Jt,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,t,n,r){return r&&!this.debug?null:(U(e[0])&&(e[0]=`${n}${this.prefix} ${e[0]}`),this.logger[t](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},X=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r{for(let i=0;i-1&&this.options.ns.splice(t,1)}getResource(e,t,n,r={}){let i=r.keySeparator===void 0?this.options.keySeparator:r.keySeparator,a=r.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:r.ignoreJSONStructure,o;e.indexOf(`.`)>-1?o=e.split(`.`):(o=[e,t],n&&(Array.isArray(n)?o.push(...n):U(n)&&i?o.push(...n.split(i)):o.push(n)));let s=K(this.data,o);return!s&&!t&&!n&&e.indexOf(`.`)>-1&&(e=o[0],t=o[1],n=o.slice(2).join(`.`)),s||!a||!U(n)?s:qt(this.data?.[e]?.[t],n,i)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.indexOf(`.`)>-1&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),Lt(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,t,n,r={silent:!1}){for(let r in n)(U(n[r])||Array.isArray(n[r]))&&this.addResource(e,t,r,n[r],{silent:!0});r.silent||this.emit(`added`,e,t,n)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.indexOf(`.`)>-1&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=K(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?Bt(s,n,i):s={...s,...n},Lt(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},Xt={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},Zt=Symbol(`i18next/PATH_KEY`);function Qt(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===Zt?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function Z(e,t){let{[Zt]:n}=e(Qt()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`;if(n.length>1&&i){let e=t?.ns,a=Array.isArray(e)?e:null;if(a&&a.length>1&&a.slice(1).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var $t={},en=e=>!U(e)&&typeof e!=`boolean`&&typeof e!=`number`,tn=class e extends X{constructor(e,t={}){super(),Nt([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=Y.create(`translator`)}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=en(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,t){let n=t.nsSeparator===void 0?this.options.nsSeparator:t.nsSeparator;n===void 0&&(n=`:`);let r=t.keySeparator===void 0?this.options.keySeparator:t.keySeparator,i=t.ns||this.options.defaultNS||[],a=n&&e.indexOf(n)>-1,o=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!Kt(e,n,r);if(a&&!o){let t=e.match(this.interpolator.nestingRegexp);if(t&&t.length>0)return{key:e,namespaces:U(i)?[i]:i};let a=e.split(n);(n!==r||n===r&&this.options.ns.indexOf(a[0])>-1)&&(i=a.shift()),e=a.join(r)}return{key:e,namespaces:U(i)?[i]:i}}translate(t,n,r){let i=typeof n==`object`?{...n}:n;if(typeof i!=`object`&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i==`object`&&(i={...i}),i||={},t==null)return``;typeof t==`function`&&(t=Z(t,{...this.options,...i})),Array.isArray(t)||(t=[String(t)]),t=t.map(e=>typeof e==`function`?Z(e,{...this.options,...i}):String(e));let a=i.returnDetails===void 0?this.options.returnDetails:i.returnDetails,o=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,{key:s,namespaces:c}=this.extractFromKey(t[t.length-1],i),l=c[c.length-1],u=i.nsSeparator===void 0?this.options.nsSeparator:i.nsSeparator;u===void 0&&(u=`:`);let d=i.lng||this.language,f=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d?.toLowerCase()===`cimode`)return f?a?{res:`${l}${u}${s}`,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:`${l}${u}${s}`:a?{res:s,usedKey:s,exactUsedKey:s,usedLng:d,usedNS:l,usedParams:this.getUsedParamsDetails(i)}:s;let p=this.resolve(t,i),m=p?.res,h=p?.usedKey||s,g=p?.exactUsedKey||s,_=[`[object Number]`,`[object Function]`,`[object RegExp]`],v=i.joinArrays===void 0?this.options.joinArrays:i.joinArrays,y=!this.i18nFormat||this.i18nFormat.handleAsObject,b=i.count!==void 0&&!U(i.count),x=e.hasDefaultValue(i),S=b?this.pluralResolver.getSuffix(d,i.count,i):``,ee=i.ordinal&&b?this.pluralResolver.getSuffix(d,i.count,{ordinal:!1}):``,C=b&&!i.ordinal&&i.count===0,w=C&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${S}`]||i[`defaultValue${ee}`]||i.defaultValue,T=m;y&&!m&&x&&(T=w);let E=en(T),te=Object.prototype.toString.apply(T);if(y&&T&&E&&_.indexOf(te)<0&&!(U(v)&&Array.isArray(T))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,T,{...i,ns:c}):`key '${s} (${this.language})' returned an object instead of string.`;return a?(p.res=e,p.usedParams=this.getUsedParamsDetails(i),p):e}if(o){let e=Array.isArray(T),t=e?[]:{},n=e?g:h;for(let e in T)if(Object.prototype.hasOwnProperty.call(T,e)){let r=`${n}${o}${e}`;x&&!m?t[e]=this.translate(r,{...i,defaultValue:en(w)?w[e]:void 0,joinArrays:!1,ns:c}):t[e]=this.translate(r,{...i,joinArrays:!1,ns:c}),t[e]===r&&(t[e]=T[e])}m=t}}else if(y&&U(v)&&Array.isArray(m))m=m.join(v),m&&=this.extendTranslation(m,t,i,r);else{let e=!1,n=!1;!this.isValidLookup(m)&&x&&(e=!0,m=w),this.isValidLookup(m)||(n=!0,m=s);let a=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&n?void 0:m,c=x&&w!==m&&this.options.updateMissing;if(n||e||c){if(this.logger.log(c?`updateKey`:`missingKey`,d,l,s,c?w:m),o){let e=this.resolve(s,{...i,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n{let r=x&&n!==m?n:a;this.options.missingKeyHandler?this.options.missingKeyHandler(e,l,t,r,c,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,l,t,r,c,i),this.emit(`missingKey`,e,l,t,m)};this.options.saveMissing&&(this.options.saveMissingPlurals&&b?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,i);C&&i[`defaultValue${this.options.pluralSeparator}zero`]&&t.indexOf(`${this.options.pluralSeparator}zero`)<0&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],s+t,i[`defaultValue${t}`]||w)})}):n(e,s,w))}m=this.extendTranslation(m,t,i,p,r),n&&m===s&&this.options.appendNamespaceToMissingKey&&(m=`${l}${u}${s}`),(n||e)&&this.options.parseMissingKeyHandler&&(m=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}${u}${s}`:s,e?m:void 0,i))}return a?(p.res=m,p.usedParams=this.getUsedParamsDetails(i),p):m}extendTranslation(e,t,n,r,i){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});let a=U(e)&&(n?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:n.interpolation.skipOnVariables),o;if(a){let t=e.match(this.interpolator.nestingRegexp);o=t&&t.length}let s=n.replace&&!U(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(s={...this.options.interpolation.defaultVariables,...s}),e=this.interpolator.interpolate(e,s,n.lng||this.language||r.usedLng,n),a){let t=e.match(this.interpolator.nestingRegexp),r=t&&t.length;oi?.[0]===e[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${t[0]}`),null):this.translate(...e,t),n)),n.interpolation&&this.interpolator.reset()}let a=n.postProcess||this.options.postProcess,o=U(a)?[a]:a;return e!=null&&o?.length&&n.applyPostProcessor!==!1&&(e=Xt.handle(o,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),e}resolve(e,t={}){let n,r,i,a,o;return U(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?Z(e,{...this.options,...t}):e)),e.forEach(e=>{if(this.isValidLookup(n))return;let s=this.extractFromKey(e,t),c=s.key;r=c;let l=s.namespaces;this.options.fallbackNS&&(l=l.concat(this.options.fallbackNS));let u=t.count!==void 0&&!U(t.count),d=u&&!t.ordinal&&t.count===0,f=t.context!==void 0&&(U(t.context)||typeof t.context==`number`)&&t.context!==``,p=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);l.forEach(e=>{this.isValidLookup(n)||(o=e,!$t[`${p[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&($t[`${p[0]}-${e}`]=!0,this.logger.warn(`key "${r}" for languages "${p.join(`, `)}" won't get resolved as namespace "${o}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),p.forEach(r=>{if(this.isValidLookup(n))return;a=r;let o=[c];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(o,c,r,e,t);else{let e;u&&(e=this.pluralResolver.getSuffix(r,t.count,t));let n=`${this.options.pluralSeparator}zero`,i=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(u&&(t.ordinal&&e.indexOf(i)===0&&o.push(c+e.replace(i,this.options.pluralSeparator)),o.push(c+e),d&&o.push(c+n)),f){let r=`${c}${this.options.contextSeparator||`_`}${t.context}`;o.push(r),u&&(t.ordinal&&e.indexOf(i)===0&&o.push(r+e.replace(i,this.options.pluralSeparator)),o.push(r+e),d&&o.push(r+n))}}let s;for(;s=o.pop();)this.isValidLookup(n)||(i=s,n=this.getResource(r,e,s,t))}))})}),{res:n,usedKey:r,exactUsedKey:i,usedLng:a,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let t=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],n=e.replace&&!U(e.replace),r=n?e.replace:e;if(n&&e.count!==void 0&&(r.count=e.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!n){r={...r};for(let e of t)delete r[e]}return r}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.substring(0,12)===`defaultValue`&&e[t]!==void 0)return!0;return!1}},nn=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=Y.create(`languageUtils`)}getScriptPartFromCode(e){if(e=J(e),!e||e.indexOf(`-`)<0)return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=J(e),!e||e.indexOf(`-`)<0)return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(U(e)&&e.indexOf(`-`)>-1){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>{if(e===r||!(e.indexOf(`-`)<0&&r.indexOf(`-`)<0)&&(e.indexOf(`-`)>0&&r.indexOf(`-`)<0&&e.substring(0,e.indexOf(`-`))===r||e.indexOf(r)===0&&r.length>1))return e})}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,t){if(!e)return[];if(typeof e==`function`&&(e=e(t)),U(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let n=e[t];return n||=e[this.getScriptPartFromCode(t)],n||=e[this.formatLanguageCode(t)],n||=e[this.getLanguagePartFromCode(t)],n||=e.default,n||[]}toResolveHierarchy(e,t){let n=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),r=[],i=e=>{e&&(this.isSupportedCode(e)?r.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return U(e)&&(e.indexOf(`-`)>-1||e.indexOf(`_`)>-1)?(this.options.load!==`languageOnly`&&i(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&i(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&i(this.getLanguagePartFromCode(e))):U(e)&&i(this.formatLanguageCode(e)),n.forEach(e=>{r.indexOf(e)<0&&i(this.formatLanguageCode(e))}),r}},rn={zero:0,one:1,two:2,few:3,many:4,other:5},an={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},on=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=Y.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=J(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),an;if(!e.match(/-|_/))return an;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>rn[e]-rn[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},sn=(e,t,n,r=`.`,i=!0)=>{let a=zt(e,t,n);return!a&&i&&U(n)&&(a=qt(e,n,r),a===void 0&&(a=qt(t,n,r))),a},cn=e=>e.replace(/\$/g,`$$$$`),ln=class{constructor(e={}){this.logger=Y.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:m,nestingOptionsSeparator:h,maxReplaces:g,alwaysFormat:_}=e.interpolation;this.escape=t===void 0?Ht:t,this.escapeValue=n===void 0||n,this.useRawValueToEscape=r!==void 0&&r,this.prefix=i?q(i):a||`{{`,this.suffix=o?q(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u||`-`,this.unescapeSuffix=this.unescapePrefix?``:l||``,this.nestingPrefix=d?q(d):f||q(`$t(`),this.nestingSuffix=p?q(p):m||q(`)`),this.nestingOptionsSeparator=h||`,`,this.maxReplaces=g||1e3,this.alwaysFormat=_!==void 0&&_,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,n,r){let i,a,o,s=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=e=>{if(e.indexOf(this.formatSeparator)<0){let i=sn(t,s,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(i,void 0,n,{...r,...t,interpolationkey:e}):i}let i=e.split(this.formatSeparator),a=i.shift().trim(),o=i.join(this.formatSeparator).trim();return this.format(sn(t,s,a,this.options.keySeparator,this.options.ignoreJSONStructure),o,n,{...r,...t,interpolationkey:a})};this.resetRegExp();let l=r?.missingInterpolationHandler||this.options.missingInterpolationHandler,u=r?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:r.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>cn(e)},{regex:this.regexp,safeValue:e=>this.escapeValue?cn(this.escape(e)):cn(e)}].forEach(t=>{for(o=0;i=t.regex.exec(e);){let n=i[1].trim();if(a=c(n),a===void 0)if(typeof l==`function`){let t=l(e,i,r);a=U(t)?t:``}else if(r&&Object.prototype.hasOwnProperty.call(r,n))a=``;else if(u){a=i[0];continue}else this.logger.warn(`missed to pass in variable ${n} for interpolating ${e}`),a=``;else!U(a)&&!this.useRawValueToEscape&&(a=Mt(a));let s=t.safeValue(a);if(e=e.replace(i[0],s),u?(t.regex.lastIndex+=a.length,t.regex.lastIndex-=i[0].length):t.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,t,n={}){let r,i,a,o=(e,t)=>{let n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;let r=e.split(RegExp(`${q(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,a);let o=i.match(/'/g),s=i.match(/"/g);((o?.length??0)%2==0&&!s||(s?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{a=JSON.parse(i),t&&(a={...t,...a})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,e};for(;r=this.nestingRegexp.exec(e);){let s=[];a={...n},a=a.replace&&!U(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let c=/{.*}/.test(r[1])?r[1].lastIndexOf(`}`)+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(s=r[1].slice(c).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),i=t(o.call(this,r[1].trim(),a),a),i&&r[0]===e&&!U(i))return i;U(i)||(i=Mt(i)),i||=(this.logger.warn(`missed to resolve ${r[1]} for nesting ${e}`),``),s.length&&(i=s.reduce((e,t)=>this.format(e,t,n.lng,{...n,interpolationkey:r[1].trim()}),i.trim())),e=e.replace(r[0],i),this.regexp.lastIndex=0}return e}},un=e=>{let t=e.toLowerCase().trim(),n={};if(e.indexOf(`(`)>-1){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].substring(0,r[1].length-1);t===`currency`&&i.indexOf(`:`)<0?n.currency||=i.trim():t===`relativetime`&&i.indexOf(`:`)<0?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},dn=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(J(r),i),t[o]=s),s(n)}},fn=e=>(t,n,r)=>e(J(n),r)(t),pn=class{constructor(e={}){this.logger=Y.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?dn:fn;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=dn(t)}format(e,t,n,r={}){let i=t.split(this.formatSeparator);if(i.length>1&&i[0].indexOf(`(`)>1&&i[0].indexOf(`)`)<0&&i.find(e=>e.indexOf(`)`)>-1)){let e=i.findIndex(e=>e.indexOf(`)`)>-1);i[0]=[i[0],...i.splice(1,e)].join(this.formatSeparator)}return i.reduce((e,t)=>{let{formatName:i,formatOptions:a}=un(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}else this.logger.warn(`there was no format function for ${i}`);return e},e)}},mn=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},hn=class extends X{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=Y.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{Rt(n.loaded,[i],a),mn(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r{this.read.call(this,e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,t,n={},r){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),r&&r();U(e)&&(e=this.languageUtils.toResolveHierarchy(e)),U(t)&&(t=[t]);let i=this.queueLoad(e,t,n,r);if(!i.toLoad.length)return i.pending.length||r(),null;i.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(!(n==null||n===``)){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},gn=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,simplifyPluralSuffix:!0,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]==`object`&&(t=e[1]),U(e[1])&&(t.defaultValue=e[1]),U(e[2])&&(t.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let n=e[3]||e[2];Object.keys(n).forEach(e=>{t[e]=n[e]})}return t},interpolation:{escapeValue:!0,format:e=>e,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),_n=e=>(U(e.ns)&&(e.ns=[e.ns]),U(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),U(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs?.indexOf?.(`cimode`)<0&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),typeof e.initImmediate==`boolean`&&(e.initAsync=e.initImmediate),e),Q=()=>{},vn=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},yn=`__i18next_supportNoticeShown`,bn=()=>!!(typeof globalThis<`u`&&globalThis[yn]||typeof process<`u`&&{}.I18NEXT_NO_SUPPORT_NOTICE||typeof process<`u`),xn=()=>{typeof globalThis<`u`&&(globalThis[yn]=!0)},Sn=e=>!!(e?.modules?.backend?.name?.indexOf(`Locize`)>0||e?.modules?.backend?.constructor?.name?.indexOf(`Locize`)>0||e?.options?.backend?.backends&&e.options.backend.backends.some(e=>e?.name?.indexOf(`Locize`)>0||e?.constructor?.name?.indexOf(`Locize`)>0)||e?.options?.backend?.projectId||e?.options?.backend?.backendOptions&&e.options.backend.backendOptions.some(e=>e?.projectId)),$=class e extends X{constructor(e={},t){if(super(),this.options=_n(e),this.services={},this.logger=Y,this.modules={external:[]},vn(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e==`function`&&(t=e,e={}),e.defaultNS==null&&e.ns&&(U(e.ns)?e.defaultNS=e.ns:e.ns.indexOf(`translation`)<0&&(e.defaultNS=e.ns[0]));let n=gn();this.options={...n,...this.options,..._n(e)},this.options.interpolation={...n.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!Sn(this)&&!bn()&&(typeof console<`u`&&console.info!==void 0&&console.info(`🌐 i18next is made possible by our own product, Locize — consider powering your project with managed localization (AI, CDN, integrations): https://locize.com 💙`),xn());let r=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?Y.init(r(this.modules.logger),this.options):Y.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:pn;let t=new nn(this.options);this.store=new Yt(this.options.resources,this.options);let i=this.services;i.logger=Y,i.resourceStore=this.store,i.languageUtils=t,i.pluralResolver=new on(t,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==n.interpolation.format&&this.logger.deprecate(`init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting`),e&&(!this.options.interpolation.format||this.options.interpolation.format===n.interpolation.format)&&(i.formatter=r(e),i.formatter.init&&i.formatter.init(i,this.options),this.options.interpolation.format=i.formatter.format.bind(i.formatter)),i.interpolator=new ln(this.options),i.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},i.backendConnector=new hn(r(this.modules.backend),i.resourceStore,i,this.options),i.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(i.languageDetector=r(this.modules.languageDetector),i.languageDetector.init&&i.languageDetector.init(i,this.options.detection,this.options)),this.modules.i18nFormat&&(i.i18nFormat=r(this.modules.i18nFormat),i.i18nFormat.init&&i.i18nFormat.init(this)),this.translator=new tn(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,t||=Q,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let i=W(),a=()=>{let e=(e,n)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),i.resolve(n),t(e,n)};if(this.languages&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?a():setTimeout(a,0),i}loadResources(e,t=Q){let n=t,r=U(e)?e:this.language;if(typeof e==`function`&&(n=e),!this.options.resources||this.options.partialBundledLanguages){if(r?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return n();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&e.indexOf(t)<0&&e.push(t)})};r?t(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(e)})}else n(null)}reloadResources(e,t,n){let r=W();return typeof e==`function`&&(n=e,e=void 0),typeof t==`function`&&(n=t,t=void 0),e||=this.languages,t||=this.options.ns,n||=Q,this.services.backendConnector.reload(e,t,e=>{r.resolve(),n(e)}),r}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&Xt.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!([`cimode`,`dev`].indexOf(e)>-1)){for(let e=0;e-1)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;let n=W();this.emit(`languageChanging`,e);let r=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},i=(i,a)=>{a?this.isLanguageChangingTo===e&&(r(a),this.translator.changeLanguage(a),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,a),this.logger.log(`languageChanged`,a)):this.isLanguageChangingTo=void 0,n.resolve((...e)=>this.t(...e)),t&&t(i,(...e)=>this.t(...e))},a=t=>{!e&&!t&&this.services.languageDetector&&(t=[]);let n=U(t)?t:t&&t[0],a=this.store.hasLanguageSomeTranslations(n)?n:this.services.languageUtils.getBestMatchFromCodes(U(t)?[t]:t);a&&(this.language||r(a),this.translator.language||this.translator.changeLanguage(a),this.services.languageDetector?.cacheUserLanguage?.(a)),this.loadResources(a,e=>{i(e,a)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(e),n}getFixedT(e,t,n){let r=(e,t,...i)=>{let a;a=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(i)),a.lng=a.lng||r.lng,a.lngs=a.lngs||r.lngs,a.ns=a.ns||r.ns,a.keyPrefix!==``&&(a.keyPrefix=a.keyPrefix||n||r.keyPrefix);let o={...this.options,...a};typeof a.keyPrefix==`function`&&(a.keyPrefix=Z(a.keyPrefix,o));let s=this.options.keySeparator||`.`,c;return a.keyPrefix&&Array.isArray(e)?c=e.map(e=>(typeof e==`function`&&(e=Z(e,o)),`${a.keyPrefix}${s}${e}`)):(typeof e==`function`&&(e=Z(e,o)),c=a.keyPrefix?`${a.keyPrefix}${s}${e}`:e),this.t(c,a)};return U(e)?r.lng=e:r.lngs=e,r.ns=t,r.keyPrefix=n,r}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,t){let n=W();return this.options.ns?(U(e)&&(e=[e]),e.forEach(e=>{this.options.ns.indexOf(e)<0&&this.options.ns.push(e)}),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}loadLanguages(e,t){let n=W();U(e)&&(e=[e]);let r=this.options.preload||[],i=e.filter(e=>r.indexOf(e)<0&&this.services.languageUtils.isSupportedCode(e));return i.length?(this.options.preload=r.concat(i),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new nn(gn());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.indexOf(n.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=Q){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new Yt(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...gn().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new ln(n)}return a.translator=new tn(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();$.createInstance,$.dir,$.init,$.loadResources,$.reloadResources,$.use,$.changeLanguage,$.getFixedT,$.t,$.exists,$.setDefaultNamespace,$.hasLoadedNamespace,$.loadNamespaces,$.loadLanguages;var Cn={"menu.dashboard":`Dashboard`,"menu.analysis":`Analysis`,"menu.monitor":`Monitor`,"menu.workplace":`Workplace`,"menu.result":`Results`,"menu.result.success":`Success`,"menu.result.fail":`Failure`,"menu.result.warning":`Warning`,"menu.result.info":`Information`,"menu.exception":`Exceptions`,"menu.exception.403":`403`,"menu.exception.404":`404`,"menu.exception.500":`500`,"menu.multi-menu":`Multi-level Menu`,"menu.multi-menu.two":`Level 2`,"menu.multi-menu.first":`Level 2 Page`,"menu.multi-menu.two.three":`Level 3`,"menu.multi-menu.two.second":`Level 3 Page`,"menu.multi-menu.two.three.third":`Level 4`,"menu.page-layout":`Layouts`,"menu.page-layout.base-layout":`Basic Layout`,"menu.page-layout.fix-header":`Fixed Header`,"menu.page-layout.descriptions":`Descriptions`,"menu.example":`Examples`,"menu.example.user-selector":`User Selector`,"menu.example.icon-selector":`Icon Selector`,"menu.example.image-uploader":`Image Upload`,"menu.example.xin-form":`Xin Form`,"menu.example.xin-table":`Xin Table`,"menu.ai":`AI`,"menu.ai.chat":`Chat`,"menu.ai.agent":`Agents`,"menu.ai.conversation":`Conversations`,"menu.system":`System`,"menu.system.user":`Users`,"menu.system.dept":`Departments`,"menu.system.role":`Roles`,"menu.system.rule":`Menus`,"menu.system.info":`System Information`,"menu.system.file":`Files`,"menu.system.dict":`Dictionaries`,"menu.system.mail":`Mail`,"menu.system.storage":`Storage`,"menu.system.config":`Site Config`,"menu.system.ai":`AI`,"menu.xin-admin":`XinAdmin`},wn={"login.username":`Username`,"login.password":`Password`,"login.usernamePlaceholder":`admin`,"login.passwordPlaceholder":`123456`,"login.usernameRequired":`Please enter your username!`,"login.passwordRequired":`Please enter your password!`,"login.remember":`Remember me`,"login.forgotPassword":`Forgot password`,"login.otherLogin":`Other login methods`,"login.success":`Login successful!`,"login.alreadyLoggedIn":`Already logged in, redirecting!`},Tn={"dashboard.analysis.salesAmount":`Sales`,"dashboard.analysis.orderCount":`Orders`,"dashboard.analysis.purchaseAmount":`Purchases`,"dashboard.analysis.receivable":`Receivable`,"dashboard.analysis.today":`Today`,"dashboard.analysis.thisWeek":`Last 7 days`,"dashboard.analysis.vsLastWeek":`vs last week`,"dashboard.analysis.totalBillAmount":`Total billed`,"dashboard.analysis.receivedAmount":`Received`,"dashboard.analysis.salesTrend":`Sales Trend (Last 30 Days)`,"dashboard.analysis.amountAxis":`Amount`,"dashboard.analysis.ordersAxis":`Orders`,"dashboard.analysis.emptyTrend":`No orders in the last 30 days`,"dashboard.analysis.orderStatusDistribution":`Order Status`,"dashboard.analysis.orderUnit":``,"dashboard.analysis.categorySales":`Sales by Category`,"dashboard.analysis.emptyCategory":`No sales data`,"dashboard.analysis.topProducts":`Top 10 Products`,"dashboard.analysis.rank":`Rank`,"dashboard.analysis.productName":`Product`,"dashboard.analysis.quantity":`Qty`,"dashboard.analysis.amount":`Amount`,"dashboard.analysis.topStores":`Top 10 Stores`,"dashboard.analysis.storeName":`Store`,"dashboard.analysis.reconOverview":`Reconciliation & Payment`,"dashboard.analysis.billProgress":`Bill Payment Progress`,"dashboard.analysis.pendingPaymentReview":`Payments to Review`,"dashboard.analysis.pendingPaymentTip":`Payment vouchers submitted by stores, pending review`,"dashboard.analysis.billUnit":``,"dashboard.analysis.latestOrders":`Latest Orders`,"dashboard.analysis.orderNo":`Order No.`,"dashboard.analysis.store":`Store`,"dashboard.analysis.orderDate":`Date`,"dashboard.analysis.status":`Status`,"dashboard.analysis.archivesStores":`Active Stores`,"dashboard.analysis.archivesProducts":`On-sale Products`,"dashboard.analysis.archivesSuppliers":`Suppliers`},En={"dashboard.completion":`Completion`,"dashboard.vs.lastWeek":`vs last week`,"dashboard.monitor.helpService":`Help Service`,"dashboard.monitor.propertyFee":`Property Fee`,"dashboard.monitor.alarmEvents":`Alarm Events`,"dashboard.monitor.otherEvents":`Other Events`,"dashboard.monitor.todoList":`To-Do List`,"dashboard.monitor.myFocus":`My Focus`,"dashboard.monitor.all":`All`,"dashboard.monitor.propertyOrder":`Property Orders`,"dashboard.monitor.repairOrder":`Repair Orders`,"dashboard.monitor.fireSafety":`Fire Safety`,"dashboard.monitor.paidService":`Paid Services`,"dashboard.monitor.publicService":`Public Services`},Dn={"dashboard.workplace.greeting.morning":`Good Morning`,"dashboard.workplace.greeting.afternoon":`Good Afternoon`,"dashboard.workplace.greeting.evening":`Good Evening`,"dashboard.workplace.welcome":`Welcome back!`,"dashboard.workplace.today":`Today is`,"dashboard.workplace.myProjects":`My Projects`,"dashboard.workplace.myTeams":`My Teams`,"dashboard.workplace.latestActivities":`Latest Activities`,"dashboard.workplace.notifications":`Notifications`,"dashboard.workplace.appStore":`App Store`,"dashboard.workplace.appStore.desc":`Application distribution and management platform`,"dashboard.workplace.mallSystem":`Mall System`,"dashboard.workplace.mallSystem.desc":`Enterprise e-commerce solution`,"dashboard.workplace.collaboration":`Collaboration`,"dashboard.workplace.collaboration.desc":`Team collaboration and communication tools`,"dashboard.workplace.docCenter":`Document Center`,"dashboard.workplace.docCenter.desc":`Enterprise knowledge management and document collaboration`,"dashboard.workplace.badge.new":`New`,"dashboard.workplace.status.inProgress":`In Progress`,"dashboard.workplace.status.completed":`Completed`,"dashboard.workplace.status.planning":`Planning`,"dashboard.workplace.progress":`Progress`,"dashboard.workplace.members":`Members`,"dashboard.workplace.people":`people`,"dashboard.workplace.recentVisits":`Recent Visits`,"dashboard.workplace.location":`Local`,"dashboard.workplace.project1.name":`Enterprise Management System`,"dashboard.workplace.project1.desc":`Enterprise backend management system based on React and AntDesign`,"dashboard.workplace.project2.name":`Mobile H5 Application`,"dashboard.workplace.project2.desc":`Mobile e-commerce application developed with Vue3`,"dashboard.workplace.project3.name":`Data Visualization Platform`,"dashboard.workplace.project3.desc":`Big data visualization and analysis platform based on ECharts`,"dashboard.workplace.project4.name":`System Upgrade Notice`,"dashboard.workplace.project4.desc":`System will be upgraded and maintained from 2:00-4:00 AM this Friday`,"dashboard.workplace.project5.name":`Team Invitation`,"dashboard.workplace.project5.desc":`You have been invited to join the "New Product R&D" project team`,"dashboard.workplace.project6.name":`Task Reminder`,"dashboard.workplace.project6.desc":`You have 3 tasks that are about to expire, please handle them in time`},On={"system.info.title":`System Info`,"system.info.basic.title":`System Basic Info`,"system.info.project.title":`Project Address`,"system.info.changelog.title":`Changelog`,"system.info.author.title":`Author Introduction`,"system.info.desc.title":`System Description`,"system.info.join":`Join the community for updates and support`,"system.info.label.name":`System Name`,"system.info.label.version":`Version`,"system.info.label.build":`Build Tool`,"system.info.label.frontend":`Frontend Framework`,"system.info.label.ui":`UI Framework`,"system.info.label.css":`CSS Framework`,"system.info.label.router":`Router Management`,"system.info.label.state":`State Management`,"system.info.label.ts":`TypeScript`,"system.info.link.github":`GitHub Repository`,"system.info.link.docs":`Online Documentation`,"system.info.link.demo":`Demo Address`,"system.info.link.issues":`Issues & Feedback`,"system.info.log.content":`Refactored project modules based on React 19, Vite 7, ReactRouter 7, zustand 5, and TypeScript`,"system.info.author.name":`XinAdmin Team`,"system.info.author.role":`Enterprise-level Admin Solution Provider`,"system.info.contact.github":`GitHub`,"system.info.contact.group":`QQ Group`,"system.info.contact.discuss":`Discussions`,"system.info.desc.content":`XinAdmin is an enterprise-level admin template based on Ant Design design specifications, adopting the latest frontend tech stack including React 19, Vite 7, ReactRouter 7, zustand 5, and TypeScript. + +Core Features: +✨ Cutting-edge Stack - React 19 + Vite 7 + TypeScript 5.8 +👑 Ant Design Specs - Modular solution, reducing redundant development +🎢 Clear Structure - Semantic directory naming, independent namespaces +🎡 ReactRouter v7 - Supports backend dynamic routing, auto menu generation +🧩 TailwindCSS - Atomic CSS, perfect match with Ant Design +🎡 Built-in i18n - Supports 5 languages including English, Chinese, etc. +⛳ Complete Page Components - Includes error pages, layout components, etc.`,"system.info.tag.enterprise":`Enterprise`,"system.info.tag.ready":`Out of Box`,"system.info.tag.scalable":`Scalable`,"system.info.tag.modern":`Modern`,"system.info.tag.i18n":`Internationalization`,"system.info.tag.auth":`Access Control`},kn={"system.config.page.title":`Site Configs`,"system.config.page.description":`Manage site configuration items, support dynamic configuration of site parameters`,"system.config.group.title":`Config Groups`,"system.config.group.add":`Add`,"system.config.group.create":`Create Config Group`,"system.config.group.edit":`Edit Config Group`,"system.config.group.delete":`Delete`,"system.config.group.deleteConfirm":`Confirm deletion?`,"system.config.group.deleteWarning":`Deleting a setting group will also delete all settings in that group`,"system.config.group.field.title":`Title`,"system.config.group.field.title.required":`Please enter title`,"system.config.group.field.key":`Key`,"system.config.group.field.key.required":`Please enter key`,"system.config.group.field.remark":`Description`,"system.config.group.createSuccess":`Config group created successfully`,"system.config.group.updateSuccess":`Config group updated successfully`,"system.config.group.deleteSuccess":`Config group deleted successfully`,"system.config.item.title":`Config Items`,"system.config.item.add":`Add Config Item`,"system.config.item.create":`Create Config Item`,"system.config.item.edit":`Edit Config Item`,"system.config.item.delete":`Delete`,"system.config.item.deleteConfirm":`Confirm deletion?`,"system.config.item.selectGroup":`Please select a setting group first`,"system.config.item.empty":`No setting items, please click "Add Config Item" button to add`,"system.config.item.field.key":`Key`,"system.config.item.field.key.required":`Please enter key`,"system.config.item.field.title":`Title`,"system.config.item.field.title.required":`Please enter title`,"system.config.item.field.type":`Component Type`,"system.config.item.field.type.required":`Please select component type`,"system.config.item.field.describe":`Description`,"system.config.item.field.options":`Options`,"system.config.item.field.options.tooltip":`Options for components such as radio buttons and checkboxes, e.g.: 1=Option 1 /n 2=Option 2`,"system.config.item.field.props":`Properties`,"system.config.item.field.props.tooltip":`Component configuration, supporting simple settings, e.g.: placeholder=Please enter /n maxLength=100`,"system.config.item.field.values":`Default Value`,"system.config.item.field.sort":`Sort`,"system.config.item.createSuccess":`Config item created successfully`,"system.config.item.updateSuccess":`Config item updated successfully`,"system.config.item.deleteSuccess":`Config item deleted successfully`,"system.config.item.refreshCacheSuccess":`refresh cache successfully`,"system.config.component.Input":`Input`,"system.config.component.TextArea":`Text Area`,"system.config.component.InputNumber":`Number Input`,"system.config.component.Switch":`Switch`,"system.config.component.Radio":`Radio`,"system.config.component.Checkbox":`Checkbox`,"system.config.form.placeholder.input":`Please input`,"system.config.form.placeholder.select":`Please select`,"system.config.form.placeholder.date":`Please select date`,"system.config.save.button":`Save`,"system.config.refresh.button":`Refresh Cache`,"system.config.confirm.ok":`Confirm`,"system.config.confirm.cancel":`Cancel`},An={"system.dept.page.title":`Department Management`,"system.dept.page.description":`Manage system departments, configure department hierarchy, manage department users`,"system.dept.tab.info":`Basic Information`,"system.dept.tab.users":`User List`,"system.dept.unnamed":`Unnamed Department`,"system.dept.createSuccess":`Department added successfully!`,"system.dept.updateSuccess":`Department updated successfully!`,"system.dept.deleteSuccess":`Batch department deletion successful!`,"system.dept.column.name":`Department Name`,"system.dept.column.name.required":`Department name is required!`,"system.dept.column.code":`Department Code`,"system.dept.column.code.required":`Department code is required!`,"system.dept.column.type":`Department Type`,"system.dept.column.type.0":`Company`,"system.dept.column.type.1":`Department`,"system.dept.column.type.2":`Position`,"system.dept.column.type.required":`Department type is required!`,"system.dept.column.parent":`Parent Department`,"system.dept.column.parent.0":`Top Level`,"system.dept.column.parent.required":`Parent department is required!`,"system.dept.column.email":`Email`,"system.dept.column.address":`Address`,"system.dept.column.phone":`Phone`,"system.dept.column.sort":`Sort Order`,"system.dept.column.sort.required":`Sort order is required!`,"system.dept.column.status":`Status`,"system.dept.column.status.0":`Normal`,"system.dept.column.status.1":`Disabled`,"system.dept.column.status.required":`Status is required!`,"system.dept.column.remark":`Remarks`,"system.dept.users.column.id":`User ID`,"system.dept.users.column.username":`Username`,"system.dept.users.column.nickname":`Nickname`,"system.dept.users.column.email":`Email`,"system.dept.users.column.mobile":`Mobile Number`,"system.dept.users.column.status":`Status`,"system.dept.users.column.status.0":`Enabled`,"system.dept.users.column.status.1":`Disabled`,"system.dept.createButton":`Add Department`,"system.dept.createModalTitle":`Add Department Form`,"system.dept.createChildrenButton":`Add Subordinate`,"system.dept.checkedMessage":`{{checked}} records selected`,"system.dept.unselect":`Deselect`,"system.dept.delete.ok":`Delete`,"system.dept.delete.cancel":`Cancel Delete`,"system.dept.delete.title":`Delete Department`,"system.dept.delete.description":`Are you sure you want to delete these departments?`,"system.dept.saveInfo":`Save Information`},jn={"system.dict.page.title":`Dictionary Management`,"system.dict.page.description":`Manage system dictionary types, configure data dictionary items`,"system.dict.id":`ID`,"system.dict.name":`Dict Name`,"dict.name.required":`Dict name is required`,"system.dict.code":`Dict Code`,"dict.code.required":`Dict code is required`,"system.dict.renderType":`Render Type`,"system.dict.renderType.required":`Render type is required`,"system.dict.renderType.text":`Text`,"system.dict.renderType.tag":`Tag`,"system.dict.renderType.badge":`Badge`,"system.dict.renderType.switch":`Switch`,"system.dict.status":`Status`,"system.dict.status.required":`Status is required`,"system.dict.status.normal":`Normal`,"system.dict.status.disabled":`Disabled`,"system.dict.sort":`Sort`,"system.dict.describe":`Description`,"system.dict.createdAt":`Created At`,"system.dict.updatedAt":`Updated At`,"system.dict.item.id":`ID`,"system.dict.item.label":`Label`,"system.dict.item.label.required":`Label is required`,"system.dict.item.value":`Value`,"system.dict.item.value.required":`Value is required`,"system.dict.item.color":`Color`,"system.dict.item.isDefault":`Default`,"system.dict.item.isDefault.required":`Default is required`,"system.dict.item.isDefault.yes":`Yes`,"system.dict.item.isDefault.no":`No`,"system.dict.item.status":`Status`,"system.dict.item.status.required":`Status is required`,"system.dict.item.status.normal":`Normal`,"system.dict.item.status.disabled":`Disabled`,"system.dict.item.sort":`Sort`,"system.dict.item.createTime":`Created At`,"system.dict.item.updateTime":`Updated At`,"system.dict.refreshCache":`Refresh Cache`,"system.dict.refreshSuccess":`Dictionary cache refreshed successfully`,"system.dict.manageItems":`Dict Data`,"system.dict.itemManagement":`Dictionary Data Management`,"system.dict.item.createSuccess":`Dictionary data created successfully`,"system.dict.item.updateSuccess":`Dictionary data updated successfully`,"system.dict.backToList":`Back to List`,"system.dict.selectDictFirst":`Please select a dictionary from the list to manage`},Mn={"system.file.page.title":`File Management`,"system.file.page.description":`Manage system files, support upload, download, delete, rename, etc.`,"system.file.fileFolder":`Folders`,"system.file.fileName":`File Name`,"system.file.fileType":`Type`,"system.file.fileSize":`Size`,"system.file.preview":`Preview`,"system.file.createdAt":`Created At`,"system.file.updatedAt":`Updated At`,"system.file.deletedAt":`Deleted At`,"system.file.action":`Action`,"system.file.download":`Download`,"system.file.delete":`Delete`,"system.file.forceDelete":`Force Delete`,"system.file.restore":`Restore`,"system.file.rename":`Rename`,"system.file.move":`Move`,"system.file.copy":`Copy`,"system.file.confirmDelete":`Are you sure to delete this file?`,"system.file.confirmForceDelete":`Are you sure to permanently delete this file? This action cannot be undone!`,"system.file.confirmDeleteFolder":`Are you sure to delete this folder?`,"system.file.confirmRestore":`Are you sure to restore this file?`,"system.file.confirmBatchDelete":`Are you sure to delete {{count}} selected files?`,"system.file.confirmBatchForceDelete":`Are you sure to permanently delete {{count}} selected files? This action cannot be undone!`,"system.file.confirmBatchRestore":`Are you sure to restore {{count}} selected files?`,"system.file.ok":`OK`,"system.file.cancel":`Cancel`,"system.file.upload":`Upload File`,"system.file.uploadTitle":`Upload File`,"system.file.uploadFileType":`File Type`,"system.file.selectFile":`Select File`,"system.file.uploadProgress":`Upload Progress`,"system.file.uploadDragText":`Click or drag files to this area to upload`,"system.file.uploadHint":`Support for single or batch upload`,"system.file.selectFileWarning":`Please select files to upload`,"system.file.uploadSuccess":`Upload successful`,"system.file.deleteSuccess":`File deleted successfully`,"system.file.forceDeleteSuccess":`File permanently deleted`,"system.file.restoreSuccess":`File restored successfully`,"system.file.renameSuccess":`File renamed successfully`,"system.file.moveSuccess":`File moved successfully`,"system.file.copySuccess":`File copied successfully`,"system.file.batchDeleteSuccess":`Files deleted successfully`,"system.file.batchForceDeleteSuccess":`Files permanently deleted`,"system.file.batchRestoreSuccess":`Files restored successfully`,"system.file.deleteFolderSuccess":`Folder deleted successfully`,"system.file.deleteFolderHint":`Please delete all files in the folder before deleting the folder`,"system.file.addFolder":`Add Subfolder`,"system.file.editFolder":`Edit Folder`,"system.file.deleteFolder":`Delete Folder`,"system.file.addFolderTitle":`Add Folder`,"system.file.editFolderTitle":`Edit Folder`,"system.file.saveFolderSuccess":`{{action}} folder successfully`,"system.file.actionAdd":`Add`,"system.file.actionEdit":`Edit`,"system.file.folderName":`Folder Name`,"system.file.folderNameRequired":`Please enter folder name`,"system.file.folderSearchPlaceholder":`Search folder by name`,"system.file.parentFolder":`Parent Folder`,"system.file.sort":`Sort`,"system.file.sortRequired":`Sort is required`,"system.file.describe":`Description`,"system.file.root":`Root`,"system.file.type.image":`Image`,"system.file.type.audio":`Audio`,"system.file.type.video":`Video`,"system.file.type.archive":`Archive`,"system.file.type.other":`Other`,"system.file.type.document":`Document`,"system.file.trash":`Trash`,"system.file.emptyTrash":`Empty Trash`,"system.file.confirmEmptyTrash":`Are you sure to empty the trash? This action cannot be undone!`,"system.file.emptyTrashSuccess":`Trash emptied, {{count}} files deleted`,"system.file.batchDelete":`Batch Delete`,"system.file.batchForceDelete":`Batch Force Delete`,"system.file.batchRestore":`Batch Restore`,"system.file.batchMove":`Batch Move`,"system.file.batchCopy":`Batch Copy`,"system.file.noSelected":`Please select files first`,"system.file.renameTitle":`Rename File`,"system.file.renameDescription":`You are renaming the file, please enter a new file name!`,"system.file.moveTitle":`Move File`,"system.file.moveDescription":`You are moving the file, please select the target folder`,"system.file.copyTitle":`Copy File`,"system.file.copyDescription":`You are copying the file, please select the target folder!`,"system.file.newFileNameRequired":`Please enter new file name`,"system.file.disk":`Storage Disk`,"system.file.loading":`Loading...`,"system.file.refresh":`Refresh`,"system.file.totalFiles":`Total {{total}} files`,"system.file.fileDetail":`File Details`,"system.file.basicInfo":`Basic Information`,"system.file.fileExt":`Extension`,"system.file.filePath":`File Path`,"system.file.fileGroup":`File Group`,"system.file.ungrouped":`Ungrouped`,"system.file.accessUrl":`Access URL`,"system.file.storageMethod":`Storage Method`},Nn={"system.mail.page.title":`Mail Settings`,"system.mail.page.description":`Mail configuration for sending emails, supports failover and round-robin switching`,"system.mail.mode":`Mode`,"system.mail.mode.single":`Single`,"system.mail.mode.failover":`Failover`,"system.mail.mode.roundrobin":`Round Robin`,"system.mail.driver":`Mail Driver`,"system.mail.driver.smtp":`SMTP`,"system.mail.driver.ses":`Amazon SES`,"system.mail.driver.mailgun":`Mailgun`,"system.mail.driver.postmark":`Postmark`,"system.mail.driver.resend":`Resend`,"system.mail.driver.log":`Log`,"system.mail.driver.array":`Array (Debug)`,"system.mail.smtp.title":`SMTP Configuration`,"system.mail.host":`Host`,"system.mail.host.placeholder":`smtp.example.com`,"system.mail.port":`Port`,"system.mail.port.placeholder":`587`,"system.mail.username":`Username`,"system.mail.username.placeholder":`your-email@example.com`,"system.mail.password":`Password`,"system.mail.password.placeholder":`Your email password or app password`,"system.mail.log.title":`Log Configuration`,"system.mail.log.channel":`Log Channel`,"system.mail.log.channel.placeholder":`mail`,"system.mail.postmark.title":`Postmark Configuration`,"system.mail.postmark.token":`Postmark Token`,"system.mail.postmark.token.placeholder":`Your Postmark API token`,"system.mail.resend.title":`Resend Configuration`,"system.mail.resend.key":`Resend API Key`,"system.mail.resend.key.placeholder":`Your Resend API key`,"system.mail.mailgun.title":`Mailgun Configuration`,"system.mail.mailgun.domain":`Mailgun Domain`,"system.mail.mailgun.domain.placeholder":`mg.yourdomain.com`,"system.mail.mailgun.secret":`Mailgun Secret`,"system.mail.mailgun.secret.placeholder":`Your Mailgun API key`,"system.mail.mailgun.endpoint":`Mailgun Endpoint`,"system.mail.mailgun.endpoint.placeholder":`api.mailgun.net`,"system.mail.ses.title":`SES (Amazon) Configuration`,"system.mail.ses.key":`AWS Access Key`,"system.mail.ses.key.placeholder":`AKIA...`,"system.mail.ses.secret":`AWS Secret Key`,"system.mail.ses.secret.placeholder":`Your AWS secret key`,"system.mail.ses.region":`AWS Region`,"system.mail.ses.region.placeholder":`us-east-1`,"system.mail.ses.token":`AWS Session Token`,"system.mail.ses.token.placeholder":`Optional session token`,"system.mail.from_address":`From Address`,"system.mail.from_address.placeholder":`noreply@example.com`,"system.mail.from_name":`From Name`,"system.mail.from_name.placeholder":`Your Application Name`,"system.mail.test.title":`Send Test Email`,"system.mail.test.to":`Recipient Email`,"system.mail.test.to.placeholder":`receiver@example.com`,"system.mail.test.send":`Send Test`,"system.mail.test.success":`Test email sent successfully`,"system.mail.test.failed":`Failed to send test email`,"system.mail.save.success":`Configuration saved successfully`,"system.mail.save.failed":`Failed to save configuration`},Pn={"system.storage.page.title":`Storage Configuration`,"system.storage.page.description":`Configure system file storage, supports local storage, S3 object storage, FTP and SFTP`,"system.storage.driver":`Default Storage Driver`,"system.storage.driver.local":`Local Storage`,"system.storage.driver.s3":`Amazon S3 / Object Storage`,"system.storage.driver.ftp":`FTP Server`,"system.storage.driver.sftp":`SFTP Server`,"system.storage.local.title":`Local Storage Configuration`,"system.storage.local.url":`Access URL`,"system.storage.local.url.placeholder":`e.g., https://example.com/storage`,"system.storage.local.url.tooltip":`Public URL prefix for file access`,"system.storage.s3.title":`S3 / Object Storage Configuration`,"system.storage.s3.key":`Access Key ID`,"system.storage.s3.key.placeholder":`Enter Access Key ID`,"system.storage.s3.secret":`Secret Access Key`,"system.storage.s3.secret.placeholder":`Enter Secret Access Key`,"system.storage.s3.region":`Region`,"system.storage.s3.region.placeholder":`e.g., us-east-1 or cn-hangzhou`,"system.storage.s3.bucket":`Bucket`,"system.storage.s3.bucket.placeholder":`Enter bucket name`,"system.storage.s3.endpoint":`Endpoint`,"system.storage.s3.endpoint.placeholder":`Custom endpoint, e.g., Aliyun OSS: oss-cn-hangzhou.aliyuncs.com`,"system.storage.s3.endpoint.tooltip":`Leave empty for AWS S3, required for Aliyun OSS, Tencent COS, etc.`,"system.storage.s3.url":`Custom URL`,"system.storage.s3.url.placeholder":`Custom file access URL prefix (optional)`,"system.storage.s3.url.tooltip":`Configure CDN domain if using CDN`,"system.storage.s3.path_style":`Path Style Endpoint`,"system.storage.s3.path_style.tooltip":`Some S3-compatible services (like MinIO) require this option`,"system.storage.ftp.title":`FTP Server Configuration`,"system.storage.ftp.host":`Host`,"system.storage.ftp.host.placeholder":`e.g., ftp.example.com`,"system.storage.ftp.port":`Port`,"system.storage.ftp.port.placeholder":`21`,"system.storage.ftp.username":`Username`,"system.storage.ftp.username.placeholder":`Enter FTP username`,"system.storage.ftp.password":`Password`,"system.storage.ftp.password.placeholder":`Enter FTP password`,"system.storage.ftp.root":`Root Directory`,"system.storage.ftp.root.placeholder":`e.g., /public_html/uploads`,"system.storage.ftp.root.tooltip":`Storage root directory on FTP server`,"system.storage.ftp.timeout":`Timeout`,"system.storage.ftp.timeout.placeholder":`30`,"system.storage.ftp.timeout.suffix":`seconds`,"system.storage.ftp.passive":`Passive Mode`,"system.storage.ftp.passive.tooltip":`Recommended for most network environments`,"system.storage.ftp.ssl":`SSL/TLS`,"system.storage.ftp.ssl.tooltip":`Enable FTPS secure connection`,"system.storage.sftp.title":`SFTP Server Configuration`,"system.storage.sftp.host":`Host`,"system.storage.sftp.host.placeholder":`e.g., sftp.example.com`,"system.storage.sftp.port":`Port`,"system.storage.sftp.port.placeholder":`22`,"system.storage.sftp.username":`Username`,"system.storage.sftp.username.placeholder":`Enter SFTP username`,"system.storage.sftp.password":`Password`,"system.storage.sftp.password.placeholder":`Enter SFTP password`,"system.storage.sftp.password.tooltip":`Leave empty if using key authentication`,"system.storage.sftp.root":`Root Directory`,"system.storage.sftp.root.placeholder":`e.g., /var/www/uploads`,"system.storage.sftp.root.tooltip":`Storage root directory on SFTP server`,"system.storage.sftp.timeout":`Timeout`,"system.storage.sftp.timeout.placeholder":`30`,"system.storage.sftp.timeout.suffix":`seconds`,"system.storage.sftp.private_key":`Private Key`,"system.storage.sftp.private_key.placeholder":`Paste SSH private key content (optional)`,"system.storage.sftp.private_key.tooltip":`Paste private key content for key authentication`,"system.storage.sftp.passphrase":`Passphrase`,"system.storage.sftp.passphrase.placeholder":`Enter if private key is password protected`,"system.storage.sftp.passphrase.tooltip":`Private key passphrase (if any)`,"system.storage.test.title":`Connection Test`,"system.storage.test.current_driver":`Current Storage Driver`,"system.storage.test.button":`Test Connection`,"system.storage.test.success":`Connection test successful`,"system.storage.test.failed":`Connection test failed`,"system.storage.help.title":`Storage Driver Guide`,"system.storage.help.local":`Local Storage:`,"system.storage.help.local.desc":`Files stored on server local disk, suitable for small projects.`,"system.storage.help.s3":`S3 / Object Storage:`,"system.storage.help.s3.desc":`Compatible with AWS S3, Aliyun OSS, Tencent COS, Qiniu, suitable for large-scale storage.`,"system.storage.help.ftp":`FTP:`,"system.storage.help.ftp.desc":`Connect to remote server via FTP protocol.`,"system.storage.help.sftp":`SFTP:`,"system.storage.help.sftp.desc":`Secure connection via SSH, more secure and reliable.`,"system.storage.save.success":`Configuration saved successfully`,"system.storage.save.failed":`Failed to save configuration`},Fn={"system.user.page.title":`User List`,"system.user.page.description":`Manage system users through the admin list, assign departments and roles to users.`,"system.user.id":`User ID`,"system.user.username":`Username`,"system.user.username.required":`Username is required`,"system.user.nickname":`Nickname`,"system.user.nickname.required":`Nickname is required`,"system.user.sex":`Gender`,"system.user.sex.0":`Male`,"system.user.sex.1":`Female`,"system.user.email":`Email`,"system.user.email.required":`Email is required`,"system.user.role":`User Role`,"system.user.role.required":`User role is required`,"system.user.dept":`User Department`,"system.user.dept.required":`User department is required`,"system.user.status":`Status`,"system.user.status.0":`Disabled`,"system.user.status.1":`Enabled`,"system.user.status.required":`Status is required`,"system.user.mobile":`Mobile Number`,"system.user.mobile.required":`Mobile number is required`,"system.user.avatar":`Avatar`,"system.user.password":`Password`,"system.user.password.required":`Password is required`,"system.user.rePassword":`Confirm Password`,"system.user.rePassword.required":`Confirm password is required`,"system.user.created_at":`Created At`,"system.user.updated_at":`Updated At`,"system.user.searchPlaceholder":`Please enter nickname, username, or mobile number to search`,"system.user.resetSuccess":`Reset successful!`,"system.user.resetPassword":`Reset Password`,"system.user.resetButton":`Submit Reset`},In={"system.role.page.title":`Role Management`,"system.role.page.description":`Manage system roles, configure role permissions, assign roles to users`,"system.role.title":`Role Management`,"system.role.tab.users":`User List`,"system.role.tab.rules":`Permission Settings`,"system.role.table.roleName":`Role Name`,"system.role.table.roleName.required":`Please enter role name`,"system.role.table.sort":`Sort Order`,"system.role.table.sort.required":`Please enter sort value`,"system.role.table.userCount":`User Count`,"system.role.table.status":`Status`,"system.role.table.status.required":`Please select status`,"system.role.table.status.enable":`Enable`,"system.role.table.status.disable":`Disable`,"system.role.table.status.enabled":`Enabled`,"system.role.table.status.disabled":`Disabled`,"system.role.table.description":`Role Description`,"system.role.table.createdAt":`Created At`,"system.role.table.updatedAt":`Updated At`,"system.role.table.headerTitle":`Role List`,"system.role.userTable.userId":`User ID`,"system.role.userTable.username":`Username`,"system.role.userTable.nickname":`Nickname`,"system.role.userTable.email":`Email`,"system.role.userTable.mobile":`Mobile Number`,"system.role.userTable.status":`Status`,"system.role.userTable.status.normal":`Normal`,"system.role.userTable.status.banned":`Banned`,"system.role.userTable.person":`users`,"system.role.button.expandAll":`Expand All`,"system.role.button.collapseAll":`Collapse All`,"system.role.button.selectAll":`Select All`,"system.role.button.clearAll":`Clear Selection`,"system.role.button.invertSelection":`Invert Selection`,"system.role.button.saveRules":`Save Permissions`,"system.role.message.selectRoleFirst":`Please select a role first`,"system.role.message.statusUpdateSuccess":`Status updated successfully`,"system.role.message.statusUpdateFailed":`Status update failed`,"system.role.message.rulesSaveSuccess":`Permissions saved successfully`,"system.role.permission.selectedCount":`Selected {{count}} permissions`,"system.role.placeholder.selectRole":`Please select a role first`},Ln={"system.rule.description":`Manage system menus and permissions, configure routes and permission items`,"system.rule.routePath":`Route Path`,"system.rule.routePath.required":`Route path is required`,"system.rule.routePath.tooltip":`Access path for the route page. For external links, please provide the complete URL`,"system.rule.routePath.showTooltip":`Route Path: {{path}}`,"system.rule.icon":`Menu Icon`,"system.rule.local":`i18n Key`,"system.rule.local.show":`Display Name`,"system.rule.link":`External Link`,"system.rule.link.1":`Yes`,"system.rule.link.0":`No`,"system.rule.type":`Menu Type`,"system.rule.type.menu":`Menu Item`,"system.rule.type.route":`Route Page`,"system.rule.type.rule":`Permission Item`,"system.rule.type.required":`Menu type is required`,"system.rule.parent":`Parent Menu`,"system.rule.parent.0":`Root Menu`,"system.rule.parent.required":`Parent menu is required`,"system.rule.order":`Sort Order`,"system.rule.order.required":`Sort order is required`,"system.rule.name":`Rule Name`,"system.rule.name.required":`Rule name is required`,"system.rule.key":`Permission Key`,"system.rule.key.required":`Permission key is required`,"system.rule.hidden":`Visibility`,"system.rule.hidden.tooltip":`Controls menu display in navigation (route and permission functions remain active)`,"system.rule.hidden.0":`Hidden`,"system.rule.hidden.1":`Visible`,"system.rule.hidden.updateSuccess":`Visibility updated successfully`,"system.rule.status":`Status`,"system.rule.status.tooltip":`Permission status (disabled permissions will not participate in system permission verification)`,"system.rule.status.0":`Disabled`,"system.rule.status.1":`Enabled`,"system.rule.status.updateSuccess":`Status updated successfully`,"system.rule.created_at":`Created At`,"system.rule.updated_at":`Updated At`,"system.rule.title":`Permission Management`,"system.rule.addChildButton":`Add Child Item`},Rn={"system.ai.page.title":`AI Settings`,"system.ai.page.description":`Manage AI provider and model configurations, supports multiple providers and default model assignment`,"system.ai.default":`Default Model`,"system.ai.default.tooltip":`Default model for general AI chat, analysis and other tasks`,"system.ai.provider.api_key":`{{lab}} API Key`,"system.ai.provider.api_key.placeholder":`Please enter API Key`,"system.ai.provider.url":`{{lab}} API URL`,"system.ai.provider.url.placeholder":`Example: {{url}}`,"system.ai.azure.api_version":`API Version`,"system.ai.azure.deployment":`Deployment Name`,"system.ai.azure.embedding_deployment":`Embedding Deployment Name`,"system.ai.azure.image_deployment":`Image Deployment Name`,"system.ai.bedrock.region":`AWS Region`,"system.ai.bedrock.access_key_id":`Access Key ID`,"system.ai.bedrock.secret_access_key":`Secret Access Key`,"system.ai.bedrock.session_token":`Session Token (optional)`,"system.ai.test.title":`Connection Test`,"system.ai.test.hint":`Click the button below to test the current AI provider connection`,"system.ai.test.button":`Test Connection`,"system.ai.test.testing":`Testing connection...`,"system.ai.test.success":`Connection test successful!`,"system.ai.test.error":`Connection test failed`,"system.ai.save.success":`AI settings saved successfully`},zn={"ai.chat.title":`AI Chat`,"ai.chat.newChat":`New Chat`,"ai.chat.placeholder":`Type your question, press Enter to send...`,"ai.chat.welcome.title":`How can I help you?`,"ai.chat.welcome.description":`I am your AI assistant. I can answer questions, write code, analyze data, and more.`,"ai.chat.loading":`Thinking...`,"ai.chat.error.send":`Failed to send, please retry`,"ai.chat.delete.confirm":`Are you sure you want to delete this conversation?`,"ai.chat.delete.success":`Conversation deleted`,"ai.chat.empty":`No conversations yet, start a new chat`,"ai.chat.copy":`Copy`,"ai.chat.copy.success":`Copied to clipboard`,"ai.chat.retry":`Retry`,"ai.chat.thinking":`Deep thinking...`,"ai.chat.thinking.done":`Thinking completed`,"ai.chat.attachment.upload":`Upload file`,"ai.chat.attachment.maxCount":`Maximum {count} files`,"ai.chat.attachment.error":`File upload failed`,"ai.chat.switchAgent":`Switch Agent`,"ai.chat.defaultTitle":`AI Chat`},Bn={"ai.conversation.page.title":`AI Conversation Management`,"ai.conversation.page.description":`Manage AI chat conversations and message records`,"ai.conversation.id":`Conversation ID`,"ai.conversation.username":`User`,"ai.conversation.title":`Title`,"ai.conversation.messageCount":`Messages`,"ai.conversation.createdAt":`Created At`,"ai.conversation.updatedAt":`Updated At`,"ai.conversation.deleteConfirm":`Are you sure you want to delete this conversation? All messages will be removed.`,"ai.conversation.deleteSuccess":`Conversation deleted`,"ai.conversation.viewMessages":`View Messages`,"ai.conversation.messageTitle":`Conversation Messages`,"ai.conversation.noUser":`Anonymous`,"ai.conversation.message.id":`Message ID`,"ai.conversation.message.role":`Role`,"ai.conversation.message.role.user":`User`,"ai.conversation.message.role.assistant":`Assistant`,"ai.conversation.message.role.system":`System`,"ai.conversation.message.agent":`AI Model`,"ai.conversation.message.content":`Content`,"ai.conversation.message.createdAt":`Sent At`,"ai.conversation.message.toolCalls":`Tool Calls`,"ai.conversation.message.usage":`Usage`},Vn={"ai.agent.page.title":`Agent Management`,"ai.agent.page.description":`Manage AI Agent registration and status. Agents are registered via database seeder.`,"ai.agent.update.success":`Updated successfully`,"ai.agent.update.failed":`Failed to update`,"ai.agent.empty":`No agents registered.`,"ai.agent.goChat":`Chat`},Hn={"user.profile.title":`User Settings`,"user.profile.baseInfo":`Basic Information`,"user.profile.changePassword":`Change Password`,"user.profile.loginLog":`Login Log`,"user.profile.baseInfo.updateAvatar":`Update Avatar`,"user.profile.baseInfo.updateAvatarDesc":`Supports JPG/PNG format, maximum 2MB`,"user.profile.baseInfo.avatarSuccess":`Avatar uploaded successfully`,"user.profile.baseInfo.success":`User information updated successfully`,"user.profile.baseInfo.username":`Username`,"user.profile.baseInfo.username.message":`Please enter username!`,"user.profile.baseInfo.nickname":`Nickname`,"user.profile.baseInfo.nickname.message":`Please enter nickname!`,"user.profile.baseInfo.sex":`Gender`,"user.profile.baseInfo.sex.0":`Male`,"user.profile.baseInfo.sex.1":`Female`,"user.profile.baseInfo.bio":`Bio`,"user.profile.baseInfo.email":`Email`,"user.profile.baseInfo.email.typeMessage":`Please enter a valid email address!`,"user.profile.baseInfo.email.requiredMessage":`Please enter email!`,"user.profile.baseInfo.mobile":`Mobile Number`,"user.profile.baseInfo.mobile.message":`Please enter mobile number!`,"user.profile.baseInfo.submit":`Save User Information`,"user.profile.changePassword.oldPassword":`Current Password`,"user.profile.changePassword.oldPassword.message":`Please enter current password!`,"user.profile.changePassword.newPassword":`New Password`,"user.profile.changePassword.rePassword":`Confirm New Password`,"user.profile.changePassword.requiredMessage":`Please enter new password!`,"user.profile.changePassword.minMessage":`Password must be at least 8 characters!`,"user.profile.changePassword.rePassword.message":`Passwords do not match!`,"user.profile.changePassword.submit":`Change Password`,"user.profile.changePassword.success":`Update Successful`,"user.profile.loginLog.success":`Login Successful`,"user.profile.loginLog.error":`Login Failed`,"user.profile.loginLog.empty":`No login logs available`},Un={"xin.form.submit":`Submit`,"xin.form.reset":`Reset`,"xin.form.cancel":`Cancel`,"xin.form.formList.add":`Add Item`,"xin.form.upload.button":`Click to Upload`,"xin.form.userSelector.placeholder":`Please select user`,"xin.form.userSelector.modal.title":`Select User`,"xin.form.userSelector.modal.okText":`OK`,"xin.form.userSelector.modal.cancelText":`Cancel`,"xin.form.iconSelector.placeholder":`Please select icon`,"xin.form.iconSelector.modal.title":`Select Icon`,"xin.form.iconSelector.tabs.use":`Custom Icons`,"xin.form.iconSelector.tabs.suggestion":`Website General Icons`,"xin.form.iconSelector.tabs.direction":`Directional Icons`,"xin.form.iconSelector.tabs.editor":`Editor Icons`,"xin.form.iconSelector.tabs.data":`Data Icons`,"xin.form.iconSelector.tabs.logo":`Brands and Logos`,"xin.form.iconSelector.tabs.other":`Other Icons`,"xin.form.imageUploader.uploadText":`Upload Image`,"xin.form.imageUploader.error.notImage":`Only image files can be uploaded!`,"xin.form.imageUploader.error.sizeExceeded":`Image size cannot exceed {{maxSize}}MB!`,"xin.form.imageUploader.error.dimensionExceeded":`Image dimensions cannot exceed {{maxWidth}}x{{maxHeight}}px!`,"xin.form.imageUploader.error.loadFailed":`Failed to load image!`,"xin.form.imageUploader.error.readFailed":`Failed to read image!`,"xin.form.richText.error.notImage":`Only image files can be uploaded!`,"xin.form.richText.error.sizeExceeded":`Image size cannot exceed {{maxSize}}MB!`,"xin.form.richText.error.uploadFailed":`Image upload failed!`},Wn={"xin.table.queryTable":`Query Table`,"xin.table.keywordPlaceholder":`Enter keyword`,"xin.table.keywordEmpty":`Please enter search content`,"xin.table.add":`Add`,"xin.table.refresh":`Refresh`,"xin.table.columnSettings":`Column Settings`,"xin.table.showBorder":`Show Border`,"xin.table.hideBorder":`Hide Border`,"xin.table.density.default":`Default`,"xin.table.density.middle":`Middle`,"xin.table.density.compact":`Compact`,"xin.table.total":`Total {{total}} items`,"xin.table.operate":`Actions`,"xin.table.edit":`Edit`,"xin.table.delete":`Delete`,"xin.table.deleteConfirm":`Are you sure to delete record {{id}}?`,"xin.table.deleteOk":`Confirm Delete`,"xin.table.deleteCancel":`Cancel`,"xin.table.deleteSuccess":`Deleted successfully`,"xin.table.form.createTitle":`Create`,"xin.table.form.editTitle":`Edit`,"xin.table.form.close":`Close`,"xin.table.form.createSuccess":`Created successfully!`,"xin.table.form.updateSuccess":`Updated successfully!`,"xin.table.form.updateKeyUndefined":`Primary key for update is undefined!`,"xin.table.search.search":`Search`,"xin.table.search.reset":`Reset`,"xin.table.search.expand":`Expand`,"xin.table.search.collapse":`Collapse`},Gn={"xin.crud.operate":`Actions`,"xin.crud.edit":`Edit`,"xin.crud.delete":`Delete`,"xin.crud.add":`Add`,"xin.crud.batchDelete":`Batch Delete`,"xin.crud.confirm":`Confirm`,"xin.crud.cancel":`Cancel`,"xin.crud.deleteConfirm":`Confirm Delete`,"xin.crud.deleteConfirmDesc":`Data cannot be recovered after deletion. Are you sure to delete?`,"xin.crud.batchDeleteConfirm":`Confirm Batch Delete`,"xin.crud.batchDeleteConfirmDesc":`Are you sure to delete {{count}} selected items?`,"xin.crud.selectAtLeastOne":`Please select at least one item`,"xin.crud.createSuccess":`Created successfully`,"xin.crud.updateSuccess":`Updated successfully`,"xin.crud.deleteSuccess":`Deleted successfully`,"xin.crud.batchDeleteSuccess":`Batch deleted successfully`,"xin.crud.createTitle":`Create`,"xin.crud.editTitle":`Edit`,"xin.crud.total":`Total {{total}} items`,"xin.crud.yes":`Yes`,"xin.crud.no":`No`},Kn={"layout.resetTheme":`Reset Theme`,"layout.saveTheme":`Save Theme`,"layout.layoutStyle":`Layout Style`,"layout.layoutSide":`Side Navigation`,"layout.layoutTop":`Top Navigation`,"layout.layoutMix":`Mix Navigation`,"layout.layoutColumns":`Columns Navigation`,"layout.presetTheme":`Preset Theme`,"layout.themeLight":`Light`,"layout.themeDark":`Dark`,"layout.themePink":`Pink`,"layout.themeGreen":`Green`,"layout.themeAlgorithm":`Theme Algorithm`,"layout.algorithmDefault":`Default`,"layout.algorithmDark":`Dark`,"layout.algorithmDefaultCompact":`Default + Compact`,"layout.algorithmDarkCompact":`Dark + Compact`,"layout.themeColor":`Theme Color`,"layout.colorPrimary":`Primary Color`,"layout.colorText":`Text Color`,"layout.colorBg":`Background Color`,"layout.colorSuccess":`Success Color`,"layout.colorWarning":`Warning Color`,"layout.colorError":`Error Color`,"layout.bodyBg":`Body Background`,"layout.footerBg":`Footer Background`,"layout.headerBg":`Header Background`,"layout.headerColor":`Header Text Color`,"layout.siderBg":`Sider Background`,"layout.siderColor":`Sider Text Color`,"layout.colorBorder":`Border Color`,"layout.styleConfig":`Style Configuration`,"layout.fixedFooter":`Fixed Footer`,"layout.borderRadius":`Border Radius`,"layout.controlHeight":`Control Height`,"layout.headerPadding":`Header Padding`,"layout.headerHeight":`Header Height`,"layout.siderWeight":`Sider Width`,"layout.bodyPadding":`Body Padding`,"layout.systemConfig":`System Configuration`,"layout.localRoute":`Local Route`,"layout.profile":`User Settings`,"layout.logout":`Logout`,"layout.logoutSuccess":`Logout successful, redirecting`,"layout.logoutFailed":`Logout failed`,"layout.searchPlaceholder":`Please enter search content`,"layout.searchConfirm":`Confirm`,"layout.searchSwitch":`Switch`,"layout.searchClose":`Close`},qn={...Cn,...wn,...Tn,...En,...Dn,...On,...kn,...An,...jn,...Mn,...Nn,...Pn,...Fn,...In,...Ln,...Rn,...zn,...Bn,...Vn,...Hn,...Un,...Wn,...Gn,...Kn},Jn={"menu.dashboard":`仪表盘`,"menu.analysis":`分析页`,"menu.monitor":`监控页`,"menu.workplace":`工作台`,"menu.result":`结果页面`,"menu.result.success":`成功页`,"menu.result.fail":`失败页`,"menu.result.warning":`警告页`,"menu.result.info":`信息页`,"menu.exception":`异常页面`,"menu.exception.403":`403`,"menu.exception.404":`404`,"menu.exception.500":`500`,"menu.multi-menu":`多级菜单`,"menu.multi-menu.two":`二级菜单`,"menu.multi-menu.first":`二级页面`,"menu.multi-menu.two.three":`三级菜单`,"menu.multi-menu.two.second":`三级页面`,"menu.multi-menu.two.three.third":`四级页面`,"menu.page-layout":`页面布局`,"menu.page-layout.base-layout":`基础布局`,"menu.page-layout.fix-header":`固定头部`,"menu.page-layout.descriptions":`页面描述`,"menu.example":`组件示例`,"menu.example.user-selector":`用户选择器`,"menu.example.icon-selector":`图标`,"menu.example.image-uploader":`图片上传器`,"menu.example.xin-form":`XinForm 表单`,"menu.example.xin-table":`XinTable 表格`,"menu.ai":`AI`,"menu.ai.chat":`对话`,"menu.ai.agent":`智能体`,"menu.ai.conversation":`会话管理`,"menu.system":`系统管理`,"menu.system.user":`用户管理`,"menu.system.dept":`部门管理`,"menu.system.role":`角色管理`,"menu.system.rule":`菜单管理`,"menu.system.info":`系统信息`,"menu.system.file":`文件管理`,"menu.system.dict":`系统字典`,"menu.system.mail":`邮件配置`,"menu.system.storage":`存储配置`,"menu.system.config":`网站配置`,"menu.system.ai":`AI 配置`,"menu.xin-admin":`XinAdmin`},Yn={"login.username":`用户名`,"login.password":`密码`,"login.usernamePlaceholder":`admin`,"login.passwordPlaceholder":`123456`,"login.usernameRequired":`请输入用户名!`,"login.passwordRequired":`请输入密码!`,"login.remember":`保持登录`,"login.forgotPassword":`忘记密码`,"login.otherLogin":`其他登录方式`,"login.success":`登录成功,即将跳转到首页!`,"login.alreadyLoggedIn":`已登录,路由重定向!`},Xn={"dashboard.analysis.salesAmount":`销售额`,"dashboard.analysis.orderCount":`订单数`,"dashboard.analysis.purchaseAmount":`采购金额`,"dashboard.analysis.receivable":`应收余额`,"dashboard.analysis.today":`今日`,"dashboard.analysis.thisWeek":`近7天`,"dashboard.analysis.vsLastWeek":`较上周`,"dashboard.analysis.totalBillAmount":`账单总额`,"dashboard.analysis.receivedAmount":`已回款`,"dashboard.analysis.salesTrend":`销售趋势(近30天)`,"dashboard.analysis.amountAxis":`金额`,"dashboard.analysis.ordersAxis":`订单数`,"dashboard.analysis.emptyTrend":`近30天暂无订单数据`,"dashboard.analysis.orderStatusDistribution":`订单状态分布`,"dashboard.analysis.orderUnit":`单`,"dashboard.analysis.categorySales":`品类销售占比`,"dashboard.analysis.emptyCategory":`暂无销售数据`,"dashboard.analysis.topProducts":`热销商品 TOP10`,"dashboard.analysis.rank":`排名`,"dashboard.analysis.productName":`商品名称`,"dashboard.analysis.quantity":`销量`,"dashboard.analysis.amount":`金额`,"dashboard.analysis.topStores":`门店排行 TOP10`,"dashboard.analysis.storeName":`门店名称`,"dashboard.analysis.reconOverview":`对账与回款`,"dashboard.analysis.billProgress":`账单支付进度`,"dashboard.analysis.pendingPaymentReview":`待审核回款`,"dashboard.analysis.pendingPaymentTip":`门店已提交支付凭证,等待审核`,"dashboard.analysis.billUnit":`张`,"dashboard.analysis.latestOrders":`最新订单`,"dashboard.analysis.orderNo":`订单号`,"dashboard.analysis.store":`门店`,"dashboard.analysis.orderDate":`下单日期`,"dashboard.analysis.status":`状态`,"dashboard.analysis.archivesStores":`在营门店`,"dashboard.analysis.archivesProducts":`在售商品`,"dashboard.analysis.archivesSuppliers":`合作供应商`},Zn={"dashboard.completion":`完成度`,"dashboard.vs.lastWeek":`较上周`,"dashboard.monitor.helpService":`帮办代办`,"dashboard.monitor.propertyFee":`物业费`,"dashboard.monitor.alarmEvents":`报警事件`,"dashboard.monitor.otherEvents":`其它事件`,"dashboard.monitor.todoList":`待办事项`,"dashboard.monitor.myFocus":`我的关注`,"dashboard.monitor.all":`全部`,"dashboard.monitor.propertyOrder":`物业工单`,"dashboard.monitor.repairOrder":`维修工单`,"dashboard.monitor.fireSafety":`消防安全`,"dashboard.monitor.paidService":`有偿服务`,"dashboard.monitor.publicService":`公共服务`},Qn={"dashboard.workplace.greeting.morning":`上午好`,"dashboard.workplace.greeting.afternoon":`下午好`,"dashboard.workplace.greeting.evening":`晚上好`,"dashboard.workplace.welcome":`欢迎回来!`,"dashboard.workplace.today":`今天是`,"dashboard.workplace.myProjects":`我的项目`,"dashboard.workplace.myTeams":`我的团队`,"dashboard.workplace.latestActivities":`最新动态`,"dashboard.workplace.notifications":`站内通知`,"dashboard.workplace.appStore":`应用商店`,"dashboard.workplace.appStore.desc":`应用分发与管理平台`,"dashboard.workplace.mallSystem":`商城系统`,"dashboard.workplace.mallSystem.desc":`企业电商解决方案`,"dashboard.workplace.collaboration":`协作平台`,"dashboard.workplace.collaboration.desc":`团队协作与沟通工具`,"dashboard.workplace.docCenter":`文档中心`,"dashboard.workplace.docCenter.desc":`企业知识管理与文档协作`,"dashboard.workplace.badge.new":`New`,"dashboard.workplace.status.inProgress":`进行中`,"dashboard.workplace.status.completed":`已完成`,"dashboard.workplace.status.planning":`规划中`,"dashboard.workplace.progress":`进度`,"dashboard.workplace.members":`成员`,"dashboard.workplace.people":`人`,"dashboard.workplace.recentVisits":`最近访问`,"dashboard.workplace.location":`本地`,"dashboard.workplace.project1.name":`企业级管理系统`,"dashboard.workplace.project1.desc":`基于React和AntDesign构建的企业后台管理系统`,"dashboard.workplace.project2.name":`移动端H5应用`,"dashboard.workplace.project2.desc":`使用Vue3开发的移动端电商应用`,"dashboard.workplace.project3.name":`数据可视化平台`,"dashboard.workplace.project3.desc":`基于ECharts的大数据可视化分析平台`,"dashboard.workplace.project4.name":`系统升级通知`,"dashboard.workplace.project4.desc":`系统将于本周五凌晨2:00-4:00进行升级维护`,"dashboard.workplace.project5.name":`团队邀请`,"dashboard.workplace.project5.desc":`您已被邀请加入"新产品研发"项目组`,"dashboard.workplace.project6.name":`任务提醒`,"dashboard.workplace.project6.desc":`您有3个任务即将到期,请及时处理`},$n={"system.info.title":`系统信息`,"system.info.basic.title":`系统基本信息`,"system.info.project.title":`项目地址`,"system.info.changelog.title":`更新日志`,"system.info.author.title":`作者介绍`,"system.info.desc.title":`系统描述`,"system.info.join":`加入社区,获取最新动态和技术支持`,"system.info.label.name":`系统名称`,"system.info.label.version":`版本号`,"system.info.label.build":`构建工具`,"system.info.label.frontend":`前端框架`,"system.info.label.ui":`UI框架`,"system.info.label.css":`CSS框架`,"system.info.label.router":`路由管理`,"system.info.label.state":`状态管理`,"system.info.label.ts":`TypeScript`,"system.info.link.github":`GitHub 仓库`,"system.info.link.docs":`在线文档`,"system.info.link.demo":`演示地址`,"system.info.link.issues":`问题反馈`,"system.info.log.content":`基于React 19、Vite 7、ReactRouter 7、zustand 5 和 TypeScript,重构项目模块`,"system.info.author.name":`XinAdmin 团队`,"system.info.author.role":`企业级中后台解决方案提供者`,"system.info.contact.github":`GitHub`,"system.info.contact.group":`QQ群`,"system.info.contact.discuss":`讨论区`,"system.info.desc.content":`XinAdmin 是一个基于 Ant Design 设计规范的企业级中后台前端模板,采用最新的前端技术栈,包括 React 19、Vite 7、ReactRouter 7、zustand 5 和 TypeScript。 + +核心特性: +✨ 前沿技术栈 - React 19 + Vite 7 + TypeScript 5.8 +👑 Ant Design 规范 - 模块化解决方案,减少冗余开发 +🎢 清晰代码结构 - 语义化目录命名,独立命名空间 +🎡 ReactRouter v7 - 支持后端动态路由,自动生成菜单 +🧩 TailwindCSS - 原子化CSS,与 Ant Design 完美配合 +🎡 内置国际化 - 支持中英日法俄5种语言 +⛳ 完善的页面组件 - 包含错误页、布局组件等`,"system.info.tag.enterprise":`企业级`,"system.info.tag.ready":`开箱即用`,"system.info.tag.scalable":`可扩展`,"system.info.tag.modern":`现代化`,"system.info.tag.i18n":`国际化`,"system.info.tag.auth":`权限控制`},er={"system.config.page.title":`网站设置`,"system.config.page.description":`管理网站设置项,支持动态配置系统参数`,"system.config.group.title":`设置组`,"system.config.group.add":`新增`,"system.config.group.create":`新增设置组`,"system.config.group.edit":`编辑设置组`,"system.config.group.delete":`删除`,"system.config.group.deleteConfirm":`确认删除?`,"system.config.group.deleteWarning":`删除设置组将同时删除该组下的所有设置项`,"system.config.group.field.title":`标题`,"system.config.group.field.title.required":`请输入标题`,"system.config.group.field.key":`键`,"system.config.group.field.key.required":`请输入键`,"system.config.group.field.remark":`描述`,"system.config.group.createSuccess":`新增设置组成功`,"system.config.group.updateSuccess":`修改设置组成功`,"system.config.group.deleteSuccess":`删除设置组成功`,"system.config.item.title":`设置项`,"system.config.item.add":`新增设置项`,"system.config.item.create":`新增设置项`,"system.config.item.edit":`编辑设置项`,"system.config.item.delete":`删除`,"system.config.item.deleteConfirm":`确认删除?`,"system.config.item.selectGroup":`请先选择设置组`,"system.config.item.empty":`暂无设置项,请点击"新增设置项"按钮添加`,"system.config.item.field.key":`键`,"system.config.item.field.key.required":`请输入键`,"system.config.item.field.title":`标题`,"system.config.item.field.title.required":`请输入标题`,"system.config.item.field.type":`组件类型`,"system.config.item.field.type.required":`请选择组件类型`,"system.config.item.field.describe":`描述`,"system.config.item.field.options":`选项`,"system.config.item.field.options.tooltip":`单选、多选等组件的选项,例如: 1=选项1 /n 2=选项2`,"system.config.item.field.props":`属性`,"system.config.item.field.props.tooltip":`组件的配置,支持简单的配置,例如: placeholder=请输入 /n maxLength=100`,"system.config.item.field.values":`默认值`,"system.config.item.field.sort":`排序`,"system.config.item.createSuccess":`新增设置项成功`,"system.config.item.updateSuccess":`修改设置项成功`,"system.config.item.deleteSuccess":`删除设置项成功`,"system.config.item.refreshCacheSuccess":`配置缓存刷新成功`,"system.config.component.Input":`输入框`,"system.config.component.TextArea":`文本域`,"system.config.component.InputNumber":`数字输入框`,"system.config.component.Switch":`开关`,"system.config.component.Radio":`单选框`,"system.config.component.Checkbox":`复选框`,"system.config.form.placeholder.input":`请输入`,"system.config.form.placeholder.select":`请选择`,"system.config.form.placeholder.date":`请选择日期`,"system.config.save.button":`保存`,"system.config.refresh.button":`刷新缓存`,"system.config.confirm.ok":`确认`,"system.config.confirm.cancel":`取消`},tr={"system.dept.page.title":`部门管理`,"system.dept.page.description":`管理系统部门,配置部门层级,管理部门用户`,"system.dept.tab.info":`基本信息`,"system.dept.tab.users":`用户列表`,"system.dept.unnamed":`未命名部门`,"system.dept.createSuccess":`新增部门成功!`,"system.dept.updateSuccess":`编辑部门成功!`,"system.dept.deleteSuccess":`批量删除部门成功!`,"system.dept.column.name":`部门名称`,"system.dept.column.name.required":`部门名称必填!`,"system.dept.column.code":`部门编码`,"system.dept.column.code.required":`部门编码必填!`,"system.dept.column.type":`部门类型`,"system.dept.column.type.0":`公司`,"system.dept.column.type.1":`部门`,"system.dept.column.type.2":`岗位`,"system.dept.column.type.required":`部门类型必填!`,"system.dept.column.parent":`上级部门`,"system.dept.column.parent.0":`顶级`,"system.dept.column.parent.required":`上级部门必填!`,"system.dept.column.email":`邮箱`,"system.dept.column.address":`地址`,"system.dept.column.phone":`电话`,"system.dept.column.sort":`排序`,"system.dept.column.sort.required":`排序必填!`,"system.dept.column.status":`状态`,"system.dept.column.status.0":`正常`,"system.dept.column.status.1":`停用`,"system.dept.column.status.required":`状态必填!`,"system.dept.column.remark":`备注`,"system.dept.users.column.id":`用户ID`,"system.dept.users.column.username":`用户名`,"system.dept.users.column.nickname":`用户昵称`,"system.dept.users.column.email":`邮箱`,"system.dept.users.column.mobile":`手机号`,"system.dept.users.column.status":`状态`,"system.dept.users.column.status.0":`启用`,"system.dept.users.column.status.1":`禁用`,"system.dept.createButton":`新增部门`,"system.dept.createModalTitle":`新增部门表单`,"system.dept.createChildrenButton":`添加下级`,"system.dept.checkedMessage":`已选中 {{checked}} 条记录`,"system.dept.unselect":`取消选择`,"system.dept.delete.ok":`删除`,"system.dept.delete.cancel":`取消删除`,"system.dept.delete.title":`删除部门`,"system.dept.delete.description":`你是否要删除这些部门?`,"system.dept.saveInfo":`保存信息`},nr={"system.dict.page.title":`字典管理`,"system.dict.page.description":`管理系统字典类型,配置数据字典项`,"system.dict.id":`ID`,"system.dict.name":`字典名称`,"system.dict.name.required":`字典名称不能为空`,"system.dict.code":`字典编码`,"system.dict.code.required":`字典编码不能为空`,"system.dict.renderType":`渲染类型`,"system.dict.renderType.required":`渲染类型不能为空`,"system.dict.renderType.text":`纯文本`,"system.dict.renderType.tag":`标签`,"system.dict.renderType.badge":`徽标`,"system.dict.renderType.switch":`开关`,"system.dict.status":`状态`,"system.dict.status.required":`状态不能为空`,"system.dict.status.normal":`正常`,"system.dict.status.disabled":`停用`,"system.dict.sort":`排序`,"system.dict.describe":`描述`,"system.dict.createdAt":`创建时间`,"system.dict.updatedAt":`更新时间`,"system.dict.item.id":`ID`,"system.dict.item.label":`字典标签`,"system.dict.item.label.required":`字典标签不能为空`,"system.dict.item.value":`字典键值`,"system.dict.item.value.required":`字典键值不能为空`,"system.dict.item.color":`颜色`,"system.dict.item.isDefault":`是否默认`,"system.dict.item.isDefault.required":`是否默认不能为空`,"system.dict.item.isDefault.yes":`是`,"system.dict.item.isDefault.no":`否`,"system.dict.item.status":`状态`,"system.dict.item.status.required":`状态不能为空`,"system.dict.item.status.normal":`正常`,"system.dict.item.status.disabled":`停用`,"system.dict.item.sort":`排序`,"system.dict.item.createTime":`创建时间`,"system.dict.item.updateTime":`更新时间`,"system.dict.refreshCache":`刷新缓存`,"system.dict.refreshSuccess":`字典缓存刷新成功`,"system.dict.manageItems":`字典数据`,"system.dict.itemManagement":`字典数据管理`,"system.dict.item.createSuccess":`字典数据新增成功`,"system.dict.item.updateSuccess":`字典数据更新成功`,"system.dict.backToList":`返回列表`,"system.dict.selectDictFirst":`请从字典列表中选择要管理的字典`},rr={"system.file.page.title":`文件管理`,"system.file.page.description":`管理系统文件,支持文件的上传、下载、删除、重命名等操作`,"system.file.fileFolder":`文件夹`,"system.file.fileName":`文件名`,"system.file.fileType":`类型`,"system.file.fileSize":`大小`,"system.file.preview":`预览`,"system.file.createdAt":`创建时间`,"system.file.updatedAt":`修改时间`,"system.file.deletedAt":`删除时间`,"system.file.action":`操作`,"system.file.download":`下载`,"system.file.delete":`删除`,"system.file.forceDelete":`彻底删除`,"system.file.restore":`恢复`,"system.file.rename":`重命名`,"system.file.move":`移动`,"system.file.copy":`复制`,"system.file.confirmDelete":`确定删除该文件吗?`,"system.file.confirmForceDelete":`确定彻底删除该文件吗?此操作不可恢复!`,"system.file.confirmDeleteFolder":`确定删除该文件夹吗?`,"system.file.confirmRestore":`确定恢复该文件吗?`,"system.file.confirmBatchDelete":`确定删除选中的 {{count}} 个文件吗?`,"system.file.confirmBatchForceDelete":`确定彻底删除选中的 {{count}} 个文件吗?此操作不可恢复!`,"system.file.confirmBatchRestore":`确定恢复选中的 {{count}} 个文件吗?`,"system.file.ok":`确定`,"system.file.cancel":`取消`,"system.file.upload":`上传文件`,"system.file.uploadTitle":`上传文件`,"system.file.uploadFileType":`文件类型`,"system.file.selectFile":`选择文件`,"system.file.uploadProgress":`上传进度`,"system.file.uploadDragText":`点击或拖拽文件到此区域上传`,"system.file.uploadHint":`支持单个或批量上传`,"system.file.selectFileWarning":`请选择要上传的文件`,"system.file.uploadSuccess":`上传成功`,"system.file.deleteSuccess":`删除文件成功`,"system.file.forceDeleteSuccess":`彻底删除文件成功`,"system.file.restoreSuccess":`恢复文件成功`,"system.file.renameSuccess":`重命名成功`,"system.file.moveSuccess":`移动成功`,"system.file.copySuccess":`复制成功`,"system.file.batchDeleteSuccess":`批量删除成功`,"system.file.batchForceDeleteSuccess":`批量彻底删除成功`,"system.file.batchRestoreSuccess":`批量恢复成功`,"system.file.deleteFolderSuccess":`删除文件夹成功`,"system.file.deleteFolderHint":`删除文件夹前请删除文件夹下所有的文件`,"system.file.addFolder":`新增子文件夹`,"system.file.editFolder":`编辑文件夹`,"system.file.deleteFolder":`删除文件夹`,"system.file.addFolderTitle":`新增文件夹`,"system.file.editFolderTitle":`编辑文件夹`,"system.file.saveFolderSuccess":`{{action}}文件夹成功`,"system.file.actionAdd":`新增`,"system.file.actionEdit":`修改`,"system.file.folderName":`文件夹名称`,"system.file.folderNameRequired":`请输入文件夹名称`,"system.file.folderSearchPlaceholder":`输入文件夹名称搜索`,"system.file.parentFolder":`父级文件夹`,"system.file.sort":`排序`,"system.file.sortRequired":`排序必须`,"system.file.describe":`描述`,"system.file.root":`根目录`,"system.file.type.image":`图片`,"system.file.type.audio":`音频`,"system.file.type.video":`视频`,"system.file.type.archive":`压缩包`,"system.file.type.other":`其他`,"system.file.type.document":`文档`,"system.file.trash":`回收站`,"system.file.emptyTrash":`清空回收站`,"system.file.confirmEmptyTrash":`确定清空回收站吗?此操作不可恢复!`,"system.file.emptyTrashSuccess":`清空回收站成功,共删除 {{count}} 个文件`,"system.file.batchDelete":`批量删除`,"system.file.batchForceDelete":`批量彻底删除`,"system.file.batchRestore":`批量恢复`,"system.file.batchMove":`批量移动`,"system.file.batchCopy":`批量复制`,"system.file.noSelected":`请先选择文件`,"system.file.renameTitle":`重命名文件`,"system.file.renameDescription":`你正在重命名文件,请选择输入新的文件名称!`,"system.file.moveTitle":`移动文件`,"system.file.moveDescription":`你正在移动文件,请选择移动到的文件夹`,"system.file.copyTitle":`复制文件`,"system.file.copyDescription":`你正在复制文件,请选择复制到文件的文件夹!`,"system.file.newFileNameRequired":`请输入新文件名`,"system.file.disk":`存储磁盘`,"system.file.loading":`加载中...`,"system.file.refresh":`刷新`,"system.file.totalFiles":`共 {{total}} 个文件`,"system.file.fileDetail":`文件详情`,"system.file.basicInfo":`基本信息`,"system.file.fileExt":`扩展名`,"system.file.filePath":`文件路径`,"system.file.fileGroup":`文件分组`,"system.file.ungrouped":`未分组`,"system.file.accessUrl":`访问链接`,"system.file.storageMethod":`存储方式`},ir={"system.mail.page.title":`邮件设置`,"system.mail.page.description":`邮件配置用于发送邮件,支持故障切换与循环切换`,"system.mail.mode":`模式切换`,"system.mail.mode.single":`单驱动`,"system.mail.mode.failover":`故障切换`,"system.mail.mode.roundrobin":`循环切换`,"system.mail.driver":`邮件驱动`,"system.mail.driver.smtp":`SMTP`,"system.mail.driver.ses":`Amazon SES`,"system.mail.driver.mailgun":`Mailgun`,"system.mail.driver.postmark":`Postmark`,"system.mail.driver.resend":`Resend`,"system.mail.driver.log":`日志`,"system.mail.driver.array":`Array (调试)`,"system.mail.smtp.title":`SMTP 配置`,"system.mail.host":`服务器地址`,"system.mail.host.placeholder":`smtp.example.com`,"system.mail.port":`端口`,"system.mail.port.placeholder":`587`,"system.mail.username":`用户名`,"system.mail.username.placeholder":`your-email@example.com`,"system.mail.password":`密码`,"system.mail.password.placeholder":`邮箱密码或应用密码`,"system.mail.log.title":`日志配置`,"system.mail.log.channel":`日志驱动`,"system.mail.log.channel.placeholder":`mail`,"system.mail.postmark.title":`Postmark 配置`,"system.mail.postmark.token":`Postmark Token`,"system.mail.postmark.token.placeholder":`您的 Postmark API token`,"system.mail.resend.title":`Resend 配置`,"system.mail.resend.key":`Resend API Key`,"system.mail.resend.key.placeholder":`您的 Resend API key`,"system.mail.mailgun.title":`Mailgun 配置`,"system.mail.mailgun.domain":`Mailgun Domain`,"system.mail.mailgun.domain.placeholder":`mg.yourdomain.com`,"system.mail.mailgun.secret":`Mailgun Secret`,"system.mail.mailgun.secret.placeholder":`您的 Mailgun API key`,"system.mail.mailgun.endpoint":`Mailgun Endpoint`,"system.mail.mailgun.endpoint.placeholder":`api.mailgun.net`,"system.mail.ses.title":`SES (Amazon) 配置`,"system.mail.ses.key":`AWS Access Key`,"system.mail.ses.key.placeholder":`AKIA...`,"system.mail.ses.secret":`AWS Secret Key`,"system.mail.ses.secret.placeholder":`您的 AWS secret key`,"system.mail.ses.region":`AWS Region`,"system.mail.ses.region.placeholder":`us-east-1`,"system.mail.ses.token":`AWS Session Token`,"system.mail.ses.token.placeholder":`可选的会话 token`,"system.mail.from_address":`发件人邮箱`,"system.mail.from_address.placeholder":`noreply@example.com`,"system.mail.from_name":`发件人名称`,"system.mail.from_name.placeholder":`您的应用名称`,"system.mail.test.title":`发送测试邮件`,"system.mail.test.to":`收件人邮箱`,"system.mail.test.to.placeholder":`receiver@example.com`,"system.mail.test.send":`发送测试`,"system.mail.test.success":`测试邮件发送成功`,"system.mail.test.failed":`测试邮件发送失败`,"system.mail.save.success":`配置保存成功`,"system.mail.save.failed":`配置保存失败`},ar={"system.storage.page.title":`文件存储配置`,"system.storage.page.description":`配置系统文件存储方式,支持本地存储、S3 对象存储、FTP 及 SFTP 等多种存储方式`,"system.storage.driver":`默认存储驱动`,"system.storage.driver.local":`本地存储 (Local)`,"system.storage.driver.s3":`Amazon S3 / 对象存储`,"system.storage.driver.ftp":`FTP 服务器`,"system.storage.driver.sftp":`SFTP 服务器`,"system.storage.local.title":`本地存储配置`,"system.storage.local.url":`访问 URL`,"system.storage.local.url.placeholder":`例如: https://example.com/storage`,"system.storage.local.url.tooltip":`文件的公开访问 URL 前缀`,"system.storage.s3.title":`S3 / 对象存储配置`,"system.storage.s3.key":`Access Key ID`,"system.storage.s3.key.placeholder":`请输入 Access Key ID`,"system.storage.s3.secret":`Secret Access Key`,"system.storage.s3.secret.placeholder":`请输入 Secret Access Key`,"system.storage.s3.region":`区域 (Region)`,"system.storage.s3.region.placeholder":`例如: us-east-1 或 cn-hangzhou`,"system.storage.s3.bucket":`存储桶 (Bucket)`,"system.storage.s3.bucket.placeholder":`请输入存储桶名称`,"system.storage.s3.endpoint":`端点 (Endpoint)`,"system.storage.s3.endpoint.placeholder":`自定义端点,如阿里云 OSS: oss-cn-hangzhou.aliyuncs.com`,"system.storage.s3.endpoint.tooltip":`使用 AWS S3 时可留空,使用阿里云 OSS、腾讯云 COS 等需要填写`,"system.storage.s3.url":`自定义 URL`,"system.storage.s3.url.placeholder":`自定义文件访问 URL 前缀(可选)`,"system.storage.s3.url.tooltip":`如果使用 CDN,可以在此配置 CDN 域名`,"system.storage.s3.path_style":`路径风格端点`,"system.storage.s3.path_style.tooltip":`某些 S3 兼容服务(如 MinIO)需要启用此选项`,"system.storage.ftp.title":`FTP 服务器配置`,"system.storage.ftp.host":`主机地址`,"system.storage.ftp.host.placeholder":`例如: ftp.example.com`,"system.storage.ftp.port":`端口`,"system.storage.ftp.port.placeholder":`21`,"system.storage.ftp.username":`用户名`,"system.storage.ftp.username.placeholder":`请输入 FTP 用户名`,"system.storage.ftp.password":`密码`,"system.storage.ftp.password.placeholder":`请输入 FTP 密码`,"system.storage.ftp.root":`根目录`,"system.storage.ftp.root.placeholder":`例如: /public_html/uploads`,"system.storage.ftp.root.tooltip":`FTP 服务器上的存储根目录`,"system.storage.ftp.timeout":`超时时间`,"system.storage.ftp.timeout.placeholder":`30`,"system.storage.ftp.timeout.suffix":`秒`,"system.storage.ftp.passive":`被动模式`,"system.storage.ftp.passive.tooltip":`建议开启,适用于大多数网络环境`,"system.storage.ftp.ssl":`SSL/TLS`,"system.storage.ftp.ssl.tooltip":`启用 FTPS 安全连接`,"system.storage.sftp.title":`SFTP 服务器配置`,"system.storage.sftp.host":`主机地址`,"system.storage.sftp.host.placeholder":`例如: sftp.example.com`,"system.storage.sftp.port":`端口`,"system.storage.sftp.port.placeholder":`22`,"system.storage.sftp.username":`用户名`,"system.storage.sftp.username.placeholder":`请输入 SFTP 用户名`,"system.storage.sftp.password":`密码`,"system.storage.sftp.password.placeholder":`请输入 SFTP 密码`,"system.storage.sftp.password.tooltip":`如果使用密钥认证可留空`,"system.storage.sftp.root":`根目录`,"system.storage.sftp.root.placeholder":`例如: /var/www/uploads`,"system.storage.sftp.root.tooltip":`SFTP 服务器上的存储根目录`,"system.storage.sftp.timeout":`超时时间`,"system.storage.sftp.timeout.placeholder":`30`,"system.storage.sftp.timeout.suffix":`秒`,"system.storage.sftp.private_key":`私钥内容`,"system.storage.sftp.private_key.placeholder":`粘贴 SSH 私钥内容(可选)`,"system.storage.sftp.private_key.tooltip":`如果使用密钥认证,请粘贴私钥内容`,"system.storage.sftp.passphrase":`私钥密码`,"system.storage.sftp.passphrase.placeholder":`如果私钥有密码保护,请输入`,"system.storage.sftp.passphrase.tooltip":`私钥的密码短语(如果有)`,"system.storage.test.title":`连接测试`,"system.storage.test.current_driver":`当前存储驱动`,"system.storage.test.button":`测试连接`,"system.storage.test.success":`连接测试成功`,"system.storage.test.failed":`连接测试失败`,"system.storage.help.title":`存储驱动说明`,"system.storage.help.local":`本地存储:`,"system.storage.help.local.desc":`文件存储在服务器本地磁盘,适合小型项目。`,"system.storage.help.s3":`S3 / 对象存储:`,"system.storage.help.s3.desc":`兼容 AWS S3、阿里云 OSS、腾讯云 COS、七牛云等,适合大规模文件存储。`,"system.storage.help.ftp":`FTP:`,"system.storage.help.ftp.desc":`通过 FTP 协议连接远程服务器存储文件。`,"system.storage.help.sftp":`SFTP:`,"system.storage.help.sftp.desc":`通过 SSH 安全连接远程服务器,更安全可靠。`,"system.storage.save.success":`配置保存成功`,"system.storage.save.failed":`配置保存失败`},or={"system.user.page.title":`用户列表`,"system.user.page.description":`通过管理员列表,能够方便的管理系统用户,为用户分配部门与角色`,"system.user.id":`用户ID`,"system.user.username":`用户名`,"system.user.username.required":`用户名为必填项`,"system.user.nickname":`昵称`,"system.user.nickname.required":`昵称为必填项`,"system.user.sex":`性别`,"system.user.sex.0":`男`,"system.user.sex.1":`女`,"system.user.email":`邮箱`,"system.user.email.required":`邮箱为必填项`,"system.user.role":`用户角色`,"system.user.role.required":`用户角色为必填项`,"system.user.dept":`用户部门`,"system.user.dept.required":`用户部门为必填项`,"system.user.status":`状态`,"system.user.status.0":`禁用`,"system.user.status.1":`启用`,"system.user.status.required":`状态为必填项`,"system.user.mobile":`手机号`,"system.user.mobile.required":`手机号为必填项`,"system.user.avatar":`头像`,"system.user.password":`密码`,"system.user.password.required":`密码为必填项`,"system.user.rePassword":`确认密码`,"system.user.rePassword.required":`确认密码为必填项`,"system.user.created_at":`创建时间`,"system.user.updated_at":`更新时间`,"system.user.searchPlaceholder":`请输入昵称、账户、手机号搜索`,"system.user.resetSuccess":`重置成功!`,"system.user.resetPassword":`重置密码`,"system.user.resetButton":`提交重置`},sr={"system.role.page.title":`角色管理`,"system.role.page.description":`管理系统角色,配置角色权限,为用户分配角色`,"system.role.title":`角色管理`,"system.role.tab.users":`用户列表`,"system.role.tab.rules":`权限设置`,"system.role.table.roleName":`角色名称`,"system.role.table.roleName.required":`请输入角色名称`,"system.role.table.sort":`排序`,"system.role.table.sort.required":`请输入排序值`,"system.role.table.userCount":`用户数`,"system.role.table.status":`状态`,"system.role.table.status.required":`请选择状态`,"system.role.table.status.enable":`启用`,"system.role.table.status.disable":`停用`,"system.role.table.description":`角色描述`,"system.role.table.createdAt":`创建时间`,"system.role.table.updatedAt":`更新时间`,"system.role.table.headerTitle":`角色列表`,"system.role.userTable.userId":`用户ID`,"system.role.userTable.username":`用户名`,"system.role.userTable.nickname":`昵称`,"system.role.userTable.email":`邮箱`,"system.role.userTable.mobile":`手机号`,"system.role.userTable.status":`状态`,"system.role.userTable.status.normal":`正常`,"system.role.userTable.status.banned":`禁用`,"system.role.userTable.person":`人`,"system.role.button.expandAll":`展开全部`,"system.role.button.collapseAll":`折叠全部`,"system.role.button.selectAll":`选择全部`,"system.role.button.clearAll":`清空选择`,"system.role.button.invertSelection":`反选`,"system.role.button.saveRules":`保存权限`,"system.role.message.selectRoleFirst":`请先选择角色`,"system.role.message.statusUpdateSuccess":`状态更新成功`,"system.role.message.statusUpdateFailed":`状态更新失败`,"system.role.message.rulesSaveSuccess":`权限保存成功`,"system.role.permission.selectedCount":`已选择 {{count}} 项权限`,"system.role.placeholder.selectRole":`请先选择角色`},cr={"system.rule.description":`管理系统菜单和权限,配置路由、权限项`,"system.rule.routePath":`路由路径`,"system.rule.routePath.required":`路由路径为必填项`,"system.rule.routePath.tooltip":`路由页面访问地址,如为外部链接请直接填写完整URL`,"system.rule.routePath.showTooltip":`路由路径:{{path}}`,"system.rule.icon":`菜单图标`,"system.rule.local":`国际化键值`,"system.rule.local.show":`显示名称`,"system.rule.link":`外部链接`,"system.rule.link.1":`是`,"system.rule.link.0":`否`,"system.rule.type":`菜单类型`,"system.rule.type.menu":`菜单项`,"system.rule.type.route":`路由页面`,"system.rule.type.rule":`权限项`,"system.rule.type.required":`菜单类型为必选项`,"system.rule.parent":`上级菜单`,"system.rule.parent.0":`根级菜单`,"system.rule.parent.required":`上级菜单为必选项`,"system.rule.order":`排序序号`,"system.rule.order.required":`排序序号为必填项`,"system.rule.name":`规则名称`,"system.rule.name.required":`规则名称为必填项`,"system.rule.key":`权限标识`,"system.rule.key.required":`权限标识为必填项`,"system.rule.hidden":`可见状态`,"system.rule.hidden.tooltip":`控制菜单在导航栏中的显示状态(路由和权限功能仍正常生效)`,"system.rule.hidden.0":`隐藏`,"system.rule.hidden.1":`显示`,"system.rule.hidden.updateSuccess":`可见状态更新成功`,"system.rule.status":`启用状态`,"system.rule.status.tooltip":`权限启用状态(禁用后该权限将不参与系统权限验证)`,"system.rule.status.0":`禁用`,"system.rule.status.1":`启用`,"system.rule.status.updateSuccess":`启用状态更新成功`,"system.rule.created_at":`创建时间`,"system.rule.updated_at":`更新时间`,"system.rule.title":`权限管理`,"system.rule.addChildButton":`添加子项`},lr={"system.ai.page.title":`AI 设置`,"system.ai.page.description":`管理 AI 服务商和模型配置,支持多个服务商与默认模型分配`,"system.ai.default":`默认模型`,"system.ai.default.tooltip":`AI 对话、分析等通用任务的默认模型`,"system.ai.provider.api_key":`{{lab}} API Key`,"system.ai.provider.api_key.placeholder":`请输入 API Key`,"system.ai.provider.url":`{{lab}} API 地址`,"system.ai.provider.url.placeholder":`例如: {{url}}`,"system.ai.azure.api_version":`API 版本`,"system.ai.azure.deployment":`部署名`,"system.ai.azure.embedding_deployment":`嵌入部署名`,"system.ai.azure.image_deployment":`图片部署名`,"system.ai.bedrock.region":`AWS 区域`,"system.ai.bedrock.access_key_id":`Access Key ID`,"system.ai.bedrock.secret_access_key":`Secret Access Key`,"system.ai.bedrock.session_token":`Session Token(可选)`,"system.ai.test.title":`连接测试`,"system.ai.test.hint":`点击下方按钮测试当前 AI 服务商的连接状态`,"system.ai.test.button":`测试连接`,"system.ai.test.testing":`正在测试连接...`,"system.ai.test.success":`连接测试成功!`,"system.ai.test.error":`连接测试失败`,"system.ai.save.success":`AI 配置保存成功`},ur={"ai.chat.title":`AI 对话`,"ai.chat.newChat":`新建对话`,"ai.chat.placeholder":`输入您的问题,按 Enter 发送...`,"ai.chat.welcome.title":`有什么可以帮助您的?`,"ai.chat.welcome.description":`我是您的 AI 助手,可以帮您解答问题、编写代码、分析数据等`,"ai.chat.loading":`正在思考...`,"ai.chat.error.send":`发送失败,请重试`,"ai.chat.delete.confirm":`确定要删除这个会话吗?`,"ai.chat.delete.success":`会话已删除`,"ai.chat.empty":`暂无会话,开始一个新的对话吧`,"ai.chat.copy":`复制`,"ai.chat.copy.success":`已复制到剪贴板`,"ai.chat.retry":`重试`,"ai.chat.thinking":`深度思考中...`,"ai.chat.thinking.done":`思考完成`,"ai.chat.attachment.upload":`上传文件`,"ai.chat.attachment.maxCount":`最多上传 {count} 个文件`,"ai.chat.attachment.error":`文件上传失败`,"ai.chat.switchAgent":`切换智能体`,"ai.chat.defaultTitle":`AI 对话`},dr={"ai.conversation.page.title":`AI 会话管理`,"ai.conversation.page.description":`管理系统中的 AI 对话会话及其消息记录`,"ai.conversation.id":`会话 ID`,"ai.conversation.username":`所属用户`,"ai.conversation.title":`会话标题`,"ai.conversation.messageCount":`消息数`,"ai.conversation.createdAt":`创建时间`,"ai.conversation.updatedAt":`更新时间`,"ai.conversation.deleteConfirm":`确定要删除该会话吗?删除后所有消息将被清除。`,"ai.conversation.deleteSuccess":`会话已删除`,"ai.conversation.viewMessages":`查看消息`,"ai.conversation.messageTitle":`会话消息`,"ai.conversation.noUser":`匿名用户`,"ai.conversation.message.id":`消息 ID`,"ai.conversation.message.role":`角色`,"ai.conversation.message.role.user":`用户`,"ai.conversation.message.role.assistant":`助手`,"ai.conversation.message.role.system":`系统`,"ai.conversation.message.agent":`AI 模型`,"ai.conversation.message.content":`消息内容`,"ai.conversation.message.createdAt":`发送时间`,"ai.conversation.message.toolCalls":`工具调用`,"ai.conversation.message.usage":`用量统计`},fr={"ai.agent.page.title":`Agent 管理`,"ai.agent.page.description":`管理 AI Agent 的注册与启用状态。Agent 通过数据库 Seeder 注册。`,"ai.agent.update.success":`更新成功`,"ai.agent.update.failed":`更新失败`,"ai.agent.empty":`暂未注册 Agent。`,"ai.agent.goChat":`去对话`},pr={"user.profile.title":`用户设置`,"user.profile.baseInfo":`基本信息`,"user.profile.changePassword":`修改密码`,"user.profile.loginLog":`登录日志`,"user.profile.baseInfo.updateAvatar":`更换头像`,"user.profile.baseInfo.updateAvatarDesc":`支持 JPG/PNG 格式,大小不超过 2MB`,"user.profile.baseInfo.avatarSuccess":`头像上传成功`,"user.profile.baseInfo.success":`更新用户信息成功`,"user.profile.baseInfo.username":`用户名`,"user.profile.baseInfo.username.message":`请输入用户名!`,"user.profile.baseInfo.nickname":`昵称`,"user.profile.baseInfo.nickname.message":`请输入昵称!`,"user.profile.baseInfo.sex":`性别`,"user.profile.baseInfo.sex.0":`男`,"user.profile.baseInfo.sex.1":`女`,"user.profile.baseInfo.bio":`个人简介`,"user.profile.baseInfo.email":`邮箱`,"user.profile.baseInfo.email.typeMessage":`请输入有效的邮箱地址!`,"user.profile.baseInfo.email.requiredMessage":`请输入邮箱!`,"user.profile.baseInfo.mobile":`手机号`,"user.profile.baseInfo.mobile.message":`请输入手机号!`,"user.profile.baseInfo.submit":`保存用户信息`,"user.profile.changePassword.oldPassword":`当前密码`,"user.profile.changePassword.oldPassword.message":`请输入当前密码!`,"user.profile.changePassword.newPassword":`新密码`,"user.profile.changePassword.rePassword":`确认新密码`,"user.profile.changePassword.requiredMessage":`请输入新密码!`,"user.profile.changePassword.minMessage":`密码长度至少8位!`,"user.profile.changePassword.rePassword.message":`两次输入的密码不一致!`,"user.profile.changePassword.submit":`修改密码`,"user.profile.changePassword.success":`更新成功`,"user.profile.loginLog.success":`登录成功`,"user.profile.loginLog.error":`登录失败`,"user.profile.loginLog.empty":`暂无登录日志数据`},mr={"xin.form.submit":`提交`,"xin.form.reset":`重置`,"xin.form.cancel":`取消`,"xin.form.formList.add":`添加一项`,"xin.form.upload.button":`点击上传`,"xin.form.userSelector.placeholder":`请选择用户`,"xin.form.userSelector.modal.title":`选择用户`,"xin.form.userSelector.modal.okText":`确定`,"xin.form.userSelector.modal.cancelText":`取消`,"xin.form.iconSelector.placeholder":`请选择图标`,"xin.form.iconSelector.modal.title":`选择图标`,"xin.form.iconSelector.tabs.use":`自定义图标`,"xin.form.iconSelector.tabs.suggestion":`网站通用图标`,"xin.form.iconSelector.tabs.direction":`方向性图标`,"xin.form.iconSelector.tabs.editor":`编辑类图标`,"xin.form.iconSelector.tabs.data":`数据类图标`,"xin.form.iconSelector.tabs.logo":`品牌和标识`,"xin.form.iconSelector.tabs.other":`其它图标`,"xin.form.imageUploader.uploadText":`上传图片`,"xin.form.imageUploader.error.notImage":`只能上传图片文件!`,"xin.form.imageUploader.error.sizeExceeded":`图片大小不能超过 {{maxSize}}MB!`,"xin.form.imageUploader.error.dimensionExceeded":`图片尺寸不能超过 {{maxWidth}}x{{maxHeight}}px!`,"xin.form.imageUploader.error.loadFailed":`图片加载失败!`,"xin.form.imageUploader.error.readFailed":`图片读取失败!`,"xin.form.richText.error.notImage":`只能上传图片文件!`,"xin.form.richText.error.sizeExceeded":`图片大小不能超过 {{maxSize}}MB!`,"xin.form.richText.error.uploadFailed":`图片上传失败!`},hr={"xin.table.queryTable":`查询表格`,"xin.table.keywordPlaceholder":`请输入关键字`,"xin.table.keywordEmpty":`请输入搜索内容`,"xin.table.add":`新增`,"xin.table.refresh":`刷新`,"xin.table.columnSettings":`列设置`,"xin.table.showBorder":`显示边框`,"xin.table.hideBorder":`隐藏边框`,"xin.table.density.default":`默认`,"xin.table.density.middle":`适中`,"xin.table.density.compact":`紧凑`,"xin.table.total":`共 {{total}} 条`,"xin.table.operate":`操作栏`,"xin.table.edit":`编辑`,"xin.table.delete":`删除`,"xin.table.deleteConfirm":`你是否要删除 {{id}} 记录?`,"xin.table.deleteOk":`确认删除`,"xin.table.deleteCancel":`取消删除`,"xin.table.deleteSuccess":`删除成功`,"xin.table.form.createTitle":`新增`,"xin.table.form.editTitle":`编辑`,"xin.table.form.close":`关闭`,"xin.table.form.createSuccess":`创建成功!`,"xin.table.form.updateSuccess":`更新成功!`,"xin.table.form.updateKeyUndefined":`更新的主键未定义!`,"xin.table.search.search":`搜索`,"xin.table.search.reset":`重置`,"xin.table.search.expand":`展开`,"xin.table.search.collapse":`收起`},gr={"xin.crud.operate":`操作`,"xin.crud.edit":`编辑`,"xin.crud.delete":`删除`,"xin.crud.add":`新增`,"xin.crud.batchDelete":`批量删除`,"xin.crud.confirm":`确定`,"xin.crud.cancel":`取消`,"xin.crud.deleteConfirm":`确认删除`,"xin.crud.deleteConfirmDesc":`删除后数据将无法恢复,是否确认删除?`,"xin.crud.batchDeleteConfirm":`确认批量删除`,"xin.crud.batchDeleteConfirmDesc":`确定要删除选中的 {{count}} 条数据吗?`,"xin.crud.selectAtLeastOne":`请至少选择一条数据`,"xin.crud.createSuccess":`新增成功`,"xin.crud.updateSuccess":`更新成功`,"xin.crud.deleteSuccess":`删除成功`,"xin.crud.batchDeleteSuccess":`批量删除成功`,"xin.crud.createTitle":`新增`,"xin.crud.editTitle":`编辑`,"xin.crud.total":`共 {{total}} 条`,"xin.crud.yes":`是`,"xin.crud.no":`否`},_r={"layout.resetTheme":`重置主题`,"layout.saveTheme":`保存主题`,"layout.layoutStyle":`布局样式`,"layout.layoutSide":`左侧导航`,"layout.layoutTop":`顶部导航`,"layout.layoutMix":`混合导航`,"layout.layoutColumns":`双栏导航`,"layout.presetTheme":`预设主题`,"layout.themeLight":`默认`,"layout.themeDark":`暗黑`,"layout.themePink":`桃花缘`,"layout.themeGreen":`知识协作`,"layout.themeAlgorithm":`主题算法`,"layout.algorithmDefault":`默认`,"layout.algorithmDark":`暗黑`,"layout.algorithmDefaultCompact":`默认 + 紧凑`,"layout.algorithmDarkCompact":`暗黑 + 紧凑`,"layout.themeColor":`主题颜色`,"layout.colorPrimary":`主色`,"layout.colorText":`基础文字颜色`,"layout.colorBg":`基础背景颜色`,"layout.colorSuccess":`成功色`,"layout.colorWarning":`警告色`,"layout.colorError":`错误色`,"layout.bodyBg":`内容区域背景色`,"layout.footerBg":`页脚背景色`,"layout.headerBg":`头部背景色`,"layout.headerColor":`头部文字颜色`,"layout.siderBg":`侧边栏背景色`,"layout.siderColor":`侧边栏文字颜色`,"layout.colorBorder":`布局边框颜色`,"layout.styleConfig":`风格配置`,"layout.fixedFooter":`固定页脚`,"layout.borderRadius":`圆角大小`,"layout.controlHeight":`基础控件高度`,"layout.headerPadding":`头部两侧内边距`,"layout.headerHeight":`头部高度`,"layout.siderWeight":`侧边栏宽度`,"layout.bodyPadding":`内容区域内边距`,"layout.systemConfig":`系统配置`,"layout.localRoute":`本地菜单路由`,"layout.profile":`用户设置`,"layout.logout":`退出登录`,"layout.logoutSuccess":`退出成功,正在跳转`,"layout.logoutFailed":`退出登录失败`,"layout.searchPlaceholder":`请输入搜索内容`,"layout.searchConfirm":`确认`,"layout.searchSwitch":`切换`,"layout.searchClose":`关闭`},vr={...Jn,...Yn,...Xn,...Zn,...Qn,...$n,...er,...tr,...nr,...rr,...ir,...ar,...or,...sr,...cr,...lr,...ur,...dr,...fr,...pr,...mr,...hr,...gr,..._r},yr={en:{translation:qn},zh:{translation:vr}};$.use(Ke).init({resources:yr,lng:localStorage.getItem(`i18nextLng`)||`zh`,fallbackLng:`zh`,debug:!1,interpolation:{escapeValue:!1}});var br=e(ye(),1),xr=e(ze(),1);br.default.extend(xr.default);var Sr=document.getElementById(`root`);qe.createRoot(Sr).render((0,R.jsx)(jt,{})); \ No newline at end of file diff --git a/public/assets/order-9whwRixn.js b/public/assets/order-9whwRixn.js new file mode 100644 index 0000000..7cc7fb4 --- /dev/null +++ b/public/assets/order-9whwRixn.js @@ -0,0 +1 @@ +import{i as e}from"./rolldown-runtime-BgaNhQyE.js";import{Dr as t,t as n}from"./jsx-runtime-CRBytmvs.js";import{t as r}from"./typography-DRFhazK9.js";import{L as i,V as a,a as ee,k as te}from"./lodash-DzOfPy0f.js";import{t as ne}from"./PlusOutlined-B8K2rG8r.js";import{t as o}from"./table-BXi9q3AE.js";import{t as s}from"./space-Cu4QVMgQ.js";import{t as c}from"./button-BILozH6U.js";import{r as l}from"./DoubleRightOutlined-Blfli1UU.js";import{t as u}from"./empty-_1ZFK8yy.js";import{s as re}from"./XinForm-BPDYdeax.js";import{t as ie}from"./radio-CxFl70_7.js";import{n as ae}from"./card-DU2T2-YW.js";import{t as oe}from"./spin-CfJYIffX.js";import{t as d}from"./modal-g8Q5gNCx.js";import{t as f}from"./descriptions-BLF6MKiu.js";import{t as p}from"./form-B3R3kIqp.js";import{t as se}from"./image-CTRBNpBE.js";import{t as m}from"./input-CHcsaDtX.js";import{r as ce}from"./CopyOutlined-pYq9KfGb.js";import{r as h}from"./PictureOutlined-CB8Pr7jP.js";import{t as le}from"./popconfirm-DyseZgpU.js";import{t as g}from"./tag-DBV1bHre.js";import{t as ue}from"./DeleteOutlined-DwOvobSM.js";import{t as _}from"./DownloadOutlined-DJY9Mu8c.js";import{t as de}from"./XinTable-DOLiJ5rL.js";import{t as v}from"./AuthButton-DvrpreK4.js";import{n as fe}from"./iStoreOrder-CyyYoLoV.js";import{a as pe,c as me,d as he,f as ge,i as _e,l as ve,m as ye,n as be,p as xe,r as Se,s as Ce,t as we,u as Te}from"./order-DuGMZhv9.js";import{n as y,t as Ee}from"./iPurchaseOrder-Dn-laOqY.js";import{c as De,o as Oe}from"./goods-CYe5se2j.js";var b=e(t(),1),x=n(),{Title:ke,Text:S}=r,Ae=(e,t)=>{let n=parseFloat(t);return Number.isFinite(n)&&n>0?e/n:e},je=()=>{let e=(0,b.useRef)(null),[t,n]=(0,b.useState)(!1),[je,Me]=(0,b.useState)(1200),[C,Ne]=(0,b.useState)(null),[Pe,Fe]=(0,b.useState)(!1),[Ie,Le]=(0,b.useState)(!1),[w,T]=(0,b.useState)(null),[Re,ze]=(0,b.useState)(!1),[Be]=p.useForm(),[Ve,He]=(0,b.useState)([]),[Ue,We]=(0,b.useState)(!1),[Ge,Ke]=(0,b.useState)(!1),[E,qe]=(0,b.useState)(null),[D,Je]=(0,b.useState)(null),[Ye,O]=(0,b.useState)(!1),[k,A]=(0,b.useState)(null),[Xe,Ze]=(0,b.useState)(!1),[j]=p.useForm(),[M,Qe]=(0,b.useState)(`items`),[N,$e]=(0,b.useState)(0),[P,et]=(0,b.useState)(null),[tt,nt]=(0,b.useState)(!1),[rt,F]=(0,b.useState)(!1),[it,at]=(0,b.useState)(!1),[I]=p.useForm(),[ot,st]=(0,b.useState)([]),[L,R]=(0,b.useState)(null),[ct,lt]=(0,b.useState)(!1),[z]=p.useForm(),[B,V]=(0,b.useState)(0),[H,ut]=(0,b.useState)(``),[dt,U]=(0,b.useState)(!1),[W,ft]=(0,b.useState)(0),[pt,G]=(0,b.useState)(!1),[mt,ht]=(0,b.useState)(`current`),[gt,K]=(0,b.useState)(!1),[_t,vt]=(0,b.useState)(`current`),q=(0,b.useMemo)(()=>{let e=new Map;return(C?.items??[]).forEach(t=>{t.supplier_id>0&&t.supplier?.name&&e.set(t.supplier_id,t.supplier.name)}),Array.from(e,([e,t])=>({id:e,name:t}))},[C?.items]),yt=(0,b.useMemo)(()=>{let e=new Set;return(C?.items??[]).forEach(t=>{t.supplier_id===B&&t.market&&e.add(t.market)}),Array.from(e)},[C?.items,B]),J=(0,b.useMemo)(()=>!C||B<=0?[]:C.items.filter(e=>e.supplier_id===B).filter(e=>H===``||(e.market??``)===H).map(e=>({product_id:e.product_id,product_name:e.product_name,product_spec:e.product_spec,unit:e.unit,market:e.market,cost_price:String(e.cost_price),quantity:e.quantity,weight:String(e.weight),amount:(e.quantity*Number(e.cost_price)).toFixed(2)})),[C,B,H]),[bt,xt]=(0,b.useState)(!1),[Y,X]=(0,b.useState)(null),[St,Ct]=(0,b.useState)(!1),[wt,Tt]=(0,b.useState)(!1),[Z]=p.useForm(),Et=p.useWatch(`stores`,Z)??[],Dt=(Y?.stores??[]).map((e,t)=>{let n=Et[t]??{},r=Number(n.delivery_fee??0),i=Number(n.after_sale??0),a=Number(n.box_num??0)*Number(e.box_price)+Number(n.tray_num??0)*Number(e.tray_price);return{added:a,total:Number(e.product_amount)+r+a+i}}),Ot=(Y?.stores??[]).length>0&&Y.stores.every(e=>e.bill!==null);(0,b.useEffect)(()=>{De().then(e=>He(e.data.data??[]))},[]),(0,b.useEffect)(()=>{Ue&&D&&Lt()},[Ue,D]),(0,b.useEffect)(()=>{C&&C.stores.length>0&&$e(e=>C.stores.some(t=>t.id===e)?e:C.stores[0].id)},[C]),(0,b.useEffect)(()=>{q.length>0?V(e=>q.some(t=>t.id===e)?e:q[0].id):V(0)},[q]),(0,b.useEffect)(()=>{t&&M===`stores`&&C&&N>0&&At()},[t,M,N,C?.purchase.id]);let Q=async e=>{Fe(!0);try{let t=await ve(e);Ne(t.data.data??null)}finally{Fe(!1)}},kt=async e=>{Qe(`items`),et(null),n(!0),await Q(e)},At=async()=>{if(!(!C||N<=0)){nt(!0);try{let e=await Te(C.purchase.id,N);et(e.data.data??null)}finally{nt(!1)}}},$=async()=>{await At(),C&&await Q(C.purchase.id),await e.current?.reload()},jt=()=>{I.resetFields(),F(!0),ot.length===0&&Oe().then(e=>st(e.data.data??[]))},Mt=async e=>{if(!(!C||N<=0)){at(!0);try{await we(C.purchase.id,N,e),h.success(`已添加单品,订货单与采购单汇总已重算`),F(!1),await $()}finally{at(!1)}}},Nt=e=>{R(e),z.setFieldsValue({quantity:e.quantity,price:Number(e.price??0),weight:Number(e.weight??0)})},Pt=async e=>{if(!(!C||!L||N<=0)){lt(!0);try{await ye(C.purchase.id,N,L.product_id,e),h.success(`单品已更新,订货单与采购单汇总已重算`),R(null),await $()}finally{lt(!1)}}},Ft=async e=>{!C||N<=0||(await he(C.purchase.id,N,e.product_id),h.success(`已移除单品,订货单与采购单汇总已重算`),await $())},It=(e,t)=>{Je({productId:e.product_id,storeId:t.id}),qe(null),We(!0)},Lt=async()=>{if(!(!C||!D)){Ke(!0);try{let e=await me(C.purchase.id,D.productId,D.storeId);qe(e.data.data??null)}finally{Ke(!1)}}},Rt=async()=>{await Lt(),C&&await Q(C.purchase.id),await e.current?.reload()},zt=e=>{A(e),j.setFieldsValue({quantity:e.quantity,price:Number(e.price??0),weight:Number(e.weight??0)}),O(!0)},Bt=async e=>{if(k?.id){Ze(!0);try{await ge(k.id,e),h.success(`明细已更新,订货单与采购单汇总已重算`),O(!1),A(null),await Rt()}finally{Ze(!1)}}},Vt=e=>{T(e),Be.setFieldsValue({product_name:e.product_name,supplier_id:e.supplier_id>0?e.supplier_id:void 0,product_spec:e.product_spec,unit:e.unit,cost_price:Number(e.cost_price)})},Ht=async t=>{if(!(!C||!w)){ze(!0);try{let n=await xe(C.purchase.id,w.product_id,{...t,supplier_id:t.supplier_id??0});h.success(`已更新 ${n.data.data?.count??0} 条订货明细`),T(null),await Q(C.purchase.id),await e.current?.reload()}finally{ze(!1)}}},Ut=async e=>{xt(!0),Ct(!0),X(null);try{let t=(await Ce(e)).data.data??null;X(t),Z.setFieldsValue({stores:(t?.stores??[]).map(e=>({store_id:e.store_id,delivery_fee:e.bill?Number(e.bill.delivery_fee):0,box_num:e.bill?e.bill.box_num:0,tray_num:e.bill?e.bill.tray_num:0,after_sale:e.bill?Number(e.bill.after_sale):0,remark:e.bill?.remark??``}))})}finally{Ct(!1)}},Wt=async t=>{if(Y){Tt(!0);try{let n=await pe(Y.purchase.id,t.stores);h.success(`已生成 ${n.data.data?.count??0} 张门店账单,采购单订单已关联`),xt(!1),X(null),await e.current?.reload(),C&&C.purchase.id===Y.purchase.id&&await Q(C.purchase.id)}finally{Tt(!1)}}},Gt=async t=>{Le(!0);try{await re(`/purchase/order/${t}/finish`,{status:3}),h.success(`采购单已标记完成`),await e.current?.reload()}finally{Le(!1)}},Kt=()=>{let e=[{title:`品名`,dataIndex:`product_name`,width:160,align:`center`,fixed:`left`,ellipsis:!0},{title:`供应商`,dataIndex:`supplier`,width:110,align:`center`,fixed:`left`,render:(e,t)=>t.supplier?.name??`-`},{title:`市场`,fixed:`left`,dataIndex:`market`,width:90,align:`center`,render:e=>e||`-`},{title:`单价`,key:`retail_price`,width:100,align:`center`,render:(e,t)=>{let n=Number(t.quantity??0);return n<=0?(0,x.jsx)(S,{type:`secondary`,children:`-`}):`¥${Ae(Number(t.amount??0)/n,t.product_spec??``).toFixed(2)}`}},{title:`包规`,dataIndex:`product_spec`,align:`center`,width:90,render:e=>e||`-`},{title:`单位`,dataIndex:`unit`,width:70,align:`center`,render:e=>e||`-`},{title:`成本`,dataIndex:`cost_price`,width:90,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`合计数量`,key:`total_quantity`,width:90,align:`center`,render:(e,t)=>(0,x.jsx)(S,{strong:!0,children:t.quantity})}],t=(C?.stores??[]).map(e=>({title:(0,x.jsx)(`span`,{className:`text-[red]`,children:e.name}),key:`store-${e.id}`,width:100,align:`center`,render:(t,n)=>{let i=n.cells[e.id];return i===void 0?(0,x.jsx)(S,{type:`secondary`,children:`-`}):(0,x.jsx)(r.Link,{onClick:()=>It(n,e),children:i})}})),n=[{title:`操作`,key:`action`,width:90,fixed:`right`,align:`center`,render:(e,t)=>(0,x.jsx)(x.Fragment,{children:C?.purchase.status===0?(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(c,{size:`small`,type:`link`,icon:(0,x.jsx)(ce,{}),onClick:()=>Vt(t),children:`修改`})}):`-`})}];return[...e,...t,...n]},qt=()=>{let e=C?.stores??[],t=C?.items??[],n=e.map(e=>t.reduce((t,n)=>t+(n.cells[e.id]??0)*Number(n.cost_price),0)),r=t.reduce((e,t)=>e+Number(t.quantity),0),i=n.reduce((e,t)=>e+t,0);return(0,x.jsxs)(o.Summary.Row,{children:[(0,x.jsx)(o.Summary.Cell,{index:0,colSpan:7,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`成本统计(按门店)`})}),(0,x.jsx)(o.Summary.Cell,{index:8,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:r})}),n.map((t,n)=>(0,x.jsx)(o.Summary.Cell,{index:8+n,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,t.toFixed(2)]})},e[n].id)),(0,x.jsx)(o.Summary.Cell,{index:9+e.length,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,i.toFixed(2)]})})]})},Jt=[{title:`商品`,dataIndex:`product_name`,width:160,align:`center`},{title:`市场`,dataIndex:`market`,width:90,align:`center`,render:e=>e||`-`},{title:`单价`,key:`retail_price`,width:130,align:`center`,render:(e,t)=>`¥${Ae(Number(t.price),t.product_spec).toFixed(2)}`},{title:`包规`,dataIndex:`product_spec`,width:90,align:`center`,render:e=>e||`-`},{title:`单位`,dataIndex:`unit`,width:90,align:`center`,render:e=>e||`-`},{title:`单价`,dataIndex:`price`,width:100,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`数量`,dataIndex:`quantity`,width:90,align:`center`,render:e=>(0,x.jsx)(S,{strong:!0,children:e})},{title:`重量`,dataIndex:`weight`,width:90,align:`center`,render:e=>`${e||`-`}斤`},{title:`预计金额`,dataIndex:`amount`,width:110,align:`center`,render:e=>(0,x.jsxs)(S,{strong:!0,children:[`¥`,Number(e).toFixed(2)]})},{title:`操作`,key:`action`,width:130,align:`center`,render:(e,t)=>C?.purchase.status===0?(0,x.jsxs)(s,{size:0,children:[(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(c,{type:`link`,size:`small`,icon:(0,x.jsx)(ce,{}),onClick:()=>Nt(t),children:`编辑`})}),(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(le,{title:`移除该单品?`,description:`将从「${P?.store?.name??`该门店`}」采购明细中移除「${t.product_name}」`,onConfirm:()=>Ft(t),children:(0,x.jsx)(c,{type:`link`,size:`small`,danger:!0,icon:(0,x.jsx)(ue,{}),children:`移除`})})})]}):(0,x.jsx)(S,{type:`secondary`,children:`-`})}],Yt=()=>{let e=P?.items??[],t=e.reduce((e,t)=>e+Number(t.quantity),0),n=e.reduce((e,t)=>e+Number(t.amount),0),r=e.reduce((e,t)=>e+Number(t.weight),0);return(0,x.jsxs)(o.Summary.Row,{children:[(0,x.jsx)(o.Summary.Cell,{index:0,colSpan:6,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`合计`})}),(0,x.jsx)(o.Summary.Cell,{index:6,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:t})}),(0,x.jsx)(o.Summary.Cell,{index:7,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[r.toFixed(3),`斤`]})}),(0,x.jsx)(o.Summary.Cell,{index:8,align:`center`,children:(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,n.toFixed(2)]})}),(0,x.jsx)(o.Summary.Cell,{index:9,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`-`})})]})},Xt=[{title:`品名`,dataIndex:`product_name`,width:180,align:`center`},{title:`市场`,dataIndex:`market`,width:100,align:`center`,render:e=>e||`-`},{title:`包规`,dataIndex:`product_spec`,width:110,align:`center`,render:e=>e||`-`},{title:`单位`,dataIndex:`unit`,width:90,align:`center`,render:e=>e||`-`},{title:`成本价`,dataIndex:`cost_price`,width:110,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`数量`,dataIndex:`quantity`,width:100,align:`center`,render:e=>(0,x.jsx)(S,{strong:!0,children:e})},{title:`重量`,dataIndex:`weight`,width:110,align:`center`,render:e=>`${Number(e).toFixed(3)}斤`},{title:`金额`,dataIndex:`amount`,width:120,align:`center`,render:e=>(0,x.jsxs)(S,{strong:!0,children:[`¥`,Number(e).toFixed(2)]})}],Zt=()=>{let e=J.reduce((e,t)=>e+Number(t.quantity),0),t=J.reduce((e,t)=>e+Number(t.weight),0),n=J.reduce((e,t)=>e+Number(t.amount),0);return(0,x.jsxs)(o.Summary.Row,{children:[(0,x.jsx)(o.Summary.Cell,{index:0,colSpan:5,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`合计`})}),(0,x.jsx)(o.Summary.Cell,{index:5,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:e})}),(0,x.jsx)(o.Summary.Cell,{index:6,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[t.toFixed(3),`斤`]})}),(0,x.jsx)(o.Summary.Cell,{index:7,align:`center`,children:(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,n.toFixed(2)]})})]})},Qt=[{title:`门店`,dataIndex:`store_name`,width:140,align:`center`},{title:`账单号`,dataIndex:`bill_no`,width:180,align:`center`,render:e=>(0,x.jsx)(S,{copyable:{text:e},children:e})},{title:`账单日期`,dataIndex:`bill_date`,width:110,align:`center`},{title:`商品金额`,dataIndex:`product_amount`,width:110,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`配送费`,dataIndex:`delivery_fee`,width:100,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`周转筐`,key:`box`,width:110,align:`center`,render:(e,t)=>`${t.box_num} × ¥${Number(t.box_price).toFixed(2)}`},{title:`周转托盘`,key:`tray`,width:110,align:`center`,render:(e,t)=>`${t.tray_num} × ¥${Number(t.tray_price).toFixed(2)}`},{title:`附加金额`,dataIndex:`added_amount`,width:100,align:`center`,render:e=>`¥${Number(e).toFixed(2)}`},{title:`账单总金额`,dataIndex:`total_amount`,width:120,align:`center`,render:e=>(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,Number(e).toFixed(2)]})},{title:`支付状态`,dataIndex:`status`,width:100,align:`center`,render:e=>{let t=Ee[Number(e??0)];return(0,x.jsx)(g,{color:t?.color,children:t?.text})}}],$t=()=>{let e=C?.bills??[],t=e.reduce((e,t)=>e+Number(t.product_amount),0),n=e.reduce((e,t)=>e+Number(t.delivery_fee),0),r=e.reduce((e,t)=>e+Number(t.added_amount),0),i=e.reduce((e,t)=>e+Number(t.total_amount),0);return(0,x.jsxs)(o.Summary.Row,{children:[(0,x.jsx)(o.Summary.Cell,{index:0,colSpan:3,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`合计`})}),(0,x.jsx)(o.Summary.Cell,{index:3,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,t.toFixed(2)]})}),(0,x.jsx)(o.Summary.Cell,{index:4,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,n.toFixed(2)]})}),(0,x.jsx)(o.Summary.Cell,{index:5,colSpan:2,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`-`})}),(0,x.jsx)(o.Summary.Cell,{index:7,align:`center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,r.toFixed(2)]})}),(0,x.jsx)(o.Summary.Cell,{index:8,align:`center`,children:(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,i.toFixed(2)]})}),(0,x.jsx)(o.Summary.Cell,{index:9,align:`center`,children:(0,x.jsx)(S,{strong:!0,children:`-`})})]})},en=[{title:`采购单号`,dataIndex:`purchase_no`,valueType:`text`,hideInForm:!0,align:`center`,width:260,render:(e,t)=>(0,x.jsx)(S,{copyable:{text:t.purchase_no},children:t.purchase_no})},{title:`采购日期`,dataIndex:`purchase_date`,valueType:`date`,align:`center`,hideInForm:!0,render:(e,t)=>t.purchase_date},{title:`预估成本`,dataIndex:`estimate_amount`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>`¥${t.estimate_amount}`},{title:`实际成本`,dataIndex:`actual_amount`,hideInSearch:!0,valueType:`digit`,fieldProps:{min:0,precision:3,placeholder:`请输入单价`},align:`center`,render:(e,t)=>Number(t.actual_amount)>0?(0,x.jsxs)(S,{strong:!0,children:[`¥`,t.actual_amount]}):(0,x.jsx)(S,{type:`secondary`,children:`未录入`})},{title:`总件数`,dataIndex:`total_quantity`,hideInForm:!0,hideInSearch:!0,align:`center`},{title:`备注`,dataIndex:`remark`,valueType:`textarea`,hideInTable:!0,hideInSearch:!0},{title:`总重量`,dataIndex:`total_weight`,hideInForm:!0,hideInSearch:!0,align:`center`,render:(e,t)=>`${t.total_weight}斤`},{title:`状态`,dataIndex:`status`,valueType:`select`,hideInForm:!0,fieldProps:{options:Object.entries(y).map(([e,t])=>({value:Number(e),label:t.text}))},render:(e,t)=>{let n=y[t.status??0];return(0,x.jsx)(g,{color:n?.color,children:n?.text})},align:`center`},{title:`制单人`,dataIndex:`operator`,hideInForm:!0,hideInSearch:!0,render:(e,t)=>t.operator?.nickname??`-`,align:`center`}];return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`mb-5`,children:[(0,x.jsx)(ke,{level:3,children:`采购单`}),(0,x.jsx)(S,{type:`secondary`,children:`在「门店订单」页勾选已接单订单合并生成采购单;采购单支持修改订单信息。`})]}),(0,x.jsx)(de,{api:`/purchase/order`,columns:en,rowKey:`id`,accessName:`purchase.order`,tableRef:e,operateRender:(e,t)=>[e.status===0?t.edit:null,(0,x.jsx)(c,{size:`small`,icon:(0,x.jsx)(ee,{}),type:`primary`,onClick:()=>kt(e.id)},`detail`),e.status===0?(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(le,{title:`确认该采购单已完成?`,description:`已完成采购单将锁定,不能再修改订单信息`,onConfirm:()=>Gt(e.id),children:(0,x.jsx)(c,{type:`primary`,size:`small`,variant:`solid`,color:`green`,loading:Ie,children:`完成采购`})})}):(0,x.jsx)(v,{auth:`purchase.order.bill`,children:(0,x.jsx)(c,{type:`primary`,size:`small`,variant:`solid`,color:`orange`,icon:(0,x.jsx)(te,{}),onClick:()=>Ut(e.id),children:`生成账单`})})],operateProps:{width:300},formProps:!1}),(0,x.jsx)(i,{title:C?`采购单 ${C.purchase.purchase_no}`:`采购单详情`,open:t,onClose:()=>n(!1),size:je,resizable:{onResize:e=>Me(e)},loading:Pe,children:C&&(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(ke,{level:5,className:`mb-3!`,children:`采购单信息`}),(0,x.jsxs)(f,{column:3,size:`small`,bordered:!0,children:[(0,x.jsx)(f.Item,{label:`采购日期`,children:C.purchase.purchase_date}),(0,x.jsx)(f.Item,{label:`状态`,children:(0,x.jsx)(g,{color:y[C.purchase.status??0]?.color,children:y[C.purchase.status??0]?.text})}),(0,x.jsx)(f.Item,{label:`制单人`,children:C.purchase.operator?.nickname??`-`}),(0,x.jsxs)(f.Item,{label:`预估成本`,children:[`¥`,C.purchase.estimate_amount]}),(0,x.jsxs)(f.Item,{label:`实际成本`,children:[`¥`,C.purchase.actual_amount]}),(0,x.jsx)(f.Item,{label:`总件数`,children:C.purchase.total_quantity}),(0,x.jsx)(f.Item,{label:`总重量`,children:C.purchase.total_weight}),(0,x.jsx)(f.Item,{label:`创建时间`,span:2,children:C.purchase.created_at}),(0,x.jsx)(f.Item,{label:`备注`,span:3,children:C.purchase.remark})]}),(0,x.jsx)(ae,{activeKey:M,onChange:Qe,className:`mt-3!`,items:[{key:`items`,label:`商品明细`},{key:`stores`,label:`门店购买详情`},{key:`suppliers`,label:`供应商采购明细`},{key:`bills`,label:`门店账单`}]}),M===`stores`?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(S,{children:`选择门店:`}),(0,x.jsx)(l,{value:N||void 0,onChange:e=>$e(e),placeholder:`选择门店`,className:`w-60!`,showSearch:!0,optionFilterProp:`label`,options:C.stores.map(e=>({value:e.id,label:e.name}))})]}),(0,x.jsxs)(s,{children:[C.purchase.status===0&&(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(c,{icon:(0,x.jsx)(ne,{}),onClick:jt,children:`新增单品`})}),(0,x.jsx)(v,{auth:`purchase.order.export`,children:(0,x.jsx)(c,{type:`primary`,ghost:!0,icon:(0,x.jsx)(_,{}),onClick:()=>{ht(`current`),G(!0)},children:`导出`})})]})]}),(0,x.jsx)(oe,{spinning:tt,children:P&&P.items.length>0?(0,x.jsx)(o,{rowKey:`product_id`,size:`small`,bordered:!0,columns:Jt,dataSource:P.items,pagination:!1,scroll:{x:`max-content`},summary:Yt}):!tt&&(0,x.jsx)(u,{image:u.PRESENTED_IMAGE_SIMPLE,description:`该门店在此采购单中无采购商品`,className:`py-8!`})})]}):M===`suppliers`?(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(S,{children:`选择供应商:`}),(0,x.jsx)(l,{value:B||void 0,onChange:e=>{V(e),ut(``)},placeholder:`选择供应商`,className:`w-60!`,showSearch:!0,optionFilterProp:`label`,options:q.map(e=>({value:e.id,label:e.name}))}),(0,x.jsx)(S,{children:`市场:`}),(0,x.jsx)(l,{value:H,onChange:ut,className:`w-40!`,options:[{value:``,label:`全部市场`},...yt.map(e=>({value:e,label:e}))]})]}),(0,x.jsx)(v,{auth:`purchase.order.export`,children:(0,x.jsx)(c,{type:`primary`,ghost:!0,icon:(0,x.jsx)(_,{}),onClick:()=>{vt(`current`),K(!0)},children:`导出`})})]}),J.length>0?(0,x.jsx)(o,{rowKey:`product_id`,size:`small`,bordered:!0,columns:Xt,dataSource:J,pagination:!1,scroll:{x:`max-content`},summary:Zt}):(0,x.jsx)(u,{image:u.PRESENTED_IMAGE_SIMPLE,description:`该供应商在此采购单中无采购明细`,className:`py-8!`})]}):M===`bills`?C.bills.length>0?(0,x.jsx)(o,{rowKey:`id`,size:`small`,bordered:!0,columns:Qt,dataSource:C.bills,pagination:!1,scroll:{x:`max-content`},summary:$t}):(0,x.jsx)(u,{image:u.PRESENTED_IMAGE_SIMPLE,description:C.purchase.status===0?`采购单完成后可在列表操作列生成账单`:`该采购单暂未生成账单`,className:`py-8!`}):(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(s,{style:{marginBottom:20},children:(0,x.jsx)(v,{auth:`purchase.order.export`,children:(0,x.jsx)(c,{type:`primary`,ghost:!0,icon:(0,x.jsx)(_,{}),onClick:()=>{ft(0),U(!0)},children:`导出`})},`export`)}),(0,x.jsx)(o,{rowKey:`product_id`,size:`small`,bordered:!0,columns:Kt(),dataSource:C.items,pagination:!1,scroll:{x:1200,y:800},summary:qt})]})]})}),(0,x.jsxs)(d,{title:w?`修改「${w.product_name}」`:`修改明细行`,open:w!==null,onCancel:()=>T(null),destroyOnHidden:!0,footer:[(0,x.jsx)(c,{onClick:()=>T(null),children:`取消`},`cancel`),(0,x.jsx)(c,{type:`primary`,loading:Re,onClick:()=>Be.submit(),children:`保存`},`purchase`)],children:[(0,x.jsx)(`div`,{className:`py-2 text-gray-500`,children:`保存将同步修改本采购单中该商品的所有订单项,并同步保存到商品档案(商品列表);修改成本时,各门店单价按等级上浮比例自动重算。`}),(0,x.jsxs)(p,{form:Be,layout:`vertical`,onFinish:Ht,children:[(0,x.jsx)(p.Item,{label:`品名`,name:`product_name`,rules:[{required:!0,message:`请输入品名`},{max:100}],children:(0,x.jsx)(m,{maxLength:100})}),(0,x.jsx)(p.Item,{label:`供应商`,name:`supplier_id`,rules:[{required:!0,message:`请选择供应商`}],children:(0,x.jsx)(l,{allowClear:!0,showSearch:{optionFilterProp:`label`},placeholder:`选择供应商`,options:Ve.map(e=>({value:e.id,label:e.name}))})}),(0,x.jsx)(p.Item,{label:`包规`,name:`product_spec`,rules:[{required:!0,message:`请输入包规`},{max:100}],children:(0,x.jsx)(m,{maxLength:100,placeholder:`如:10斤/箱`})}),(0,x.jsx)(p.Item,{label:`单位`,name:`unit`,rules:[{required:!0,message:`请输入单位`},{max:20}],children:(0,x.jsx)(m,{maxLength:20,placeholder:`如:斤`})}),(0,x.jsx)(p.Item,{label:`成本`,name:`cost_price`,rules:[{required:!0,message:`请输入成本`}],children:(0,x.jsx)(a,{min:0,precision:2,prefix:`¥`,className:`w-full`})})]})]}),(0,x.jsx)(d,{title:E?`${E.store?.name??``} · ${E.product?.name??``}`:`门店商品明细`,open:Ue,onCancel:()=>We(!1),footer:null,width:1e3,destroyOnHidden:!0,styles:{body:{paddingTop:16}},children:(0,x.jsx)(oe,{spinning:Ge,children:E&&(0,x.jsxs)(x.Fragment,{children:[E.items.length===0?(0,x.jsx)(u,{image:u.PRESENTED_IMAGE_SIMPLE,description:`该门店无此商品明细`,className:`py-8!`}):(0,x.jsxs)(`div`,{className:`overflow-hidden rounded border border-gray-200`,children:[(0,x.jsxs)(`div`,{className:`flex bg-gray-50 px-4 py-2 text-sm text-gray-500`,children:[(0,x.jsx)(`div`,{className:`flex-1`,children:`商品信息`}),(0,x.jsx)(`div`,{className:`w-30 shrink-0 text-center`,children:`单价`}),(0,x.jsx)(`div`,{className:`w-26 shrink-0 text-center`,children:`订货量`}),(0,x.jsx)(`div`,{className:`w-33 shrink-0 text-center`,children:`订货金额`}),(0,x.jsx)(`div`,{className:`w-33 shrink-0 text-center`,children:`重量`}),(0,x.jsx)(`div`,{className:`w-40 shrink-0 text-center`,children:`操作`})]}),E.items.map(e=>(0,x.jsxs)(`div`,{className:`flex items-center border-t border-gray-100 px-4 py-3`,children:[(0,x.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center`,children:[(0,x.jsx)(se.PreviewGroup,{children:e.image?(0,x.jsx)(se,{src:e.image,width:48,height:48,style:{objectFit:`cover`,borderRadius:4}}):(0,x.jsx)(`div`,{className:`flex h-12 w-12 shrink-0 items-center justify-center rounded bg-gray-100 text-xs text-gray-400`,children:`暂无图片`})}),(0,x.jsxs)(`div`,{className:`ml-3 min-w-0`,children:[(0,x.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.product_name,(0,x.jsx)(g,{className:`ml-2!`,color:fe[e.order_status]?.color,children:fe[e.order_status]?.text})]}),(0,x.jsxs)(`div`,{className:`mt-0.5 text-xs text-gray-500`,children:[`订单:`,e.order_no]}),e.remark?(0,x.jsxs)(`div`,{className:`mt-0.5 truncate text-xs text-gray-500`,children:[`备注:`,e.remark]}):null]})]}),(0,x.jsxs)(`div`,{className:`w-30 shrink-0 text-center`,children:[`¥`,e.price]}),(0,x.jsx)(`div`,{className:`w-26 shrink-0 text-center`,children:e.quantity}),(0,x.jsx)(`div`,{className:`w-33 shrink-0 text-center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,e.amount]})}),(0,x.jsxs)(`div`,{className:`w-33 shrink-0 text-center`,children:[e.weight??`-`,` 斤`]}),(0,x.jsx)(`div`,{className:`w-40 shrink-0 text-center`,children:C?.purchase.status===0?(0,x.jsx)(s,{size:0,children:(0,x.jsx)(v,{auth:`purchase.order.update`,children:(0,x.jsx)(c,{type:`link`,size:`small`,icon:(0,x.jsx)(ce,{}),onClick:()=>zt(e),children:`编辑`})})}):(0,x.jsx)(S,{type:`secondary`,children:`-`})})]},e.id))]}),E.items.length>0&&(0,x.jsxs)(`div`,{className:`mt-3! flex justify-end gap-6 text-sm`,children:[(0,x.jsxs)(S,{type:`secondary`,children:[`合计数量:`,(0,x.jsx)(S,{strong:!0,children:E.items.reduce((e,t)=>e+t.quantity,0)})]}),(0,x.jsxs)(S,{type:`secondary`,children:[`合计订货金额:`,(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,E.items.reduce((e,t)=>e+Number(t.amount),0).toFixed(2)]})]})]})]})})}),(0,x.jsxs)(d,{title:k?`编辑「${k.product_name}」`:`编辑明细`,open:Ye,onCancel:()=>{O(!1),A(null)},onOk:()=>j.submit(),confirmLoading:Xe,okText:`保存`,destroyOnHidden:!0,children:[(0,x.jsxs)(`div`,{className:`py-2 text-gray-500`,children:[`订单 `,k?.order_no,`;修改保存后,系统将自动重算明细金额、订货单与采购单汇总。`]}),(0,x.jsxs)(p,{form:j,layout:`vertical`,onFinish:Bt,children:[(0,x.jsx)(p.Item,{label:`单价(元)`,name:`price`,rules:[{required:!0,message:`请输入单价`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:2,placeholder:`请输入单价`})}),(0,x.jsx)(p.Item,{label:`订货量`,name:`quantity`,rules:[{required:!0,message:`请输入订货量`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:0,placeholder:`请输入订货量`})}),(0,x.jsx)(p.Item,{label:`称重`,name:`weight`,rules:[{required:!0,message:`请输入称重`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:3,placeholder:`请输入称重`})})]})]}),(0,x.jsx)(d,{title:Y?`生成账单 · ${Y.purchase.purchase_no}`:`生成账单`,open:bt,onCancel:()=>{xt(!1),X(null)},onOk:()=>Z.submit(),confirmLoading:wt,okText:`确认生成`,okButtonProps:{disabled:Ot},width:1280,destroyOnHidden:!0,children:(0,x.jsx)(oe,{spinning:St,children:Y&&(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`py-2 text-gray-500`,children:[`每个门店单独生成一张账单;商品金额由订单汇总不可修改,请填写各门店的配送费、周转筐/托盘数量(正数=压筐附加金额,负数=回筐抵扣金额)、售后金额(可正负,计入总金额:正数=加收,负数=售后减免)与备注(可选,随账单存档)。`,Ot?`该采购单已全部生成账单,仅可查看。`:`生成后采购单中的全部订单将关联到对应门店账单。`]}),(0,x.jsx)(p,{form:Z,layout:`vertical`,onFinish:Wt,children:(0,x.jsx)(p.List,{name:`stores`,children:e=>(0,x.jsxs)(`div`,{className:`overflow-hidden rounded border border-gray-200`,children:[(0,x.jsxs)(`div`,{className:`flex bg-gray-50 px-4 py-2 text-sm text-gray-500`,children:[(0,x.jsx)(`div`,{className:`w-40 shrink-0`,children:`门店`}),(0,x.jsx)(`div`,{className:`w-28 shrink-0 text-center`,children:`商品金额`}),(0,x.jsx)(`div`,{className:`w-32 shrink-0 text-center`,children:`配送费(元)`}),(0,x.jsxs)(`div`,{className:`w-32 shrink-0 text-center`,children:[`周转筐(¥`,Y.stores[0]?.box_price??`0.00`,`/个)`]}),(0,x.jsxs)(`div`,{className:`w-32 shrink-0 text-center`,children:[`周转托盘(¥`,Y.stores[0]?.tray_price??`0.00`,`/个)`]}),(0,x.jsx)(`div`,{className:`w-36 shrink-0 text-center`,children:`售后金额(元)`}),(0,x.jsx)(`div`,{className:`w-36 shrink-0 text-center`,children:`备注`}),(0,x.jsx)(`div`,{className:`w-28 shrink-0 text-center`,children:`附加金额`}),(0,x.jsx)(`div`,{className:`flex-1 text-center`,children:`账单总金额`})]}),e.map(e=>{let t=Y.stores[e.name],n=t?.bill!=null;return(0,x.jsxs)(`div`,{className:`flex items-center border-t border-gray-100 px-4 py-2`,children:[(0,x.jsxs)(`div`,{className:`w-40 shrink-0 pr-2 text-sm`,children:[(0,x.jsx)(`div`,{children:t?.store_name??`-`}),(0,x.jsxs)(`div`,{className:`text-xs text-gray-400`,children:[t?.order_count??0,` 笔订单`,n&&(0,x.jsx)(g,{className:`ml-1!`,color:`success`,children:`已生成`})]})]}),(0,x.jsx)(`div`,{className:`w-28 shrink-0 text-center`,children:(0,x.jsxs)(S,{strong:!0,children:[`¥`,t?.product_amount??`0.00`]})}),(0,x.jsx)(p.Item,{name:[e.name,`store_id`],hidden:!0,children:(0,x.jsx)(m,{})}),(0,x.jsx)(p.Item,{className:`m-0! w-32 shrink-0 px-1!`,name:[e.name,`delivery_fee`],rules:[{required:!0,message:`请输入配送费`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:2,disabled:n,placeholder:`配送费`})}),(0,x.jsx)(p.Item,{className:`m-0! w-32 shrink-0 px-1!`,name:[e.name,`box_num`],rules:[{required:!0,message:`请输入周转筐数量`}],children:(0,x.jsx)(a,{className:`w-full`,precision:0,disabled:n,placeholder:`正压负回`})}),(0,x.jsx)(p.Item,{className:`m-0! w-32 shrink-0 px-1!`,name:[e.name,`tray_num`],rules:[{required:!0,message:`请输入周转托盘数量`}],children:(0,x.jsx)(a,{className:`w-full`,precision:0,disabled:n,placeholder:`正压负回`})}),(0,x.jsx)(p.Item,{className:`m-0! w-36 shrink-0 px-1!`,name:[e.name,`after_sale`],children:(0,x.jsx)(a,{className:`w-full`,precision:2,disabled:n,placeholder:`可正负,计入总额`})}),(0,x.jsx)(p.Item,{className:`m-0! w-36 shrink-0 px-1!`,name:[e.name,`remark`],children:(0,x.jsx)(m,{maxLength:255,disabled:n,placeholder:`备注(可选)`})}),(0,x.jsxs)(`div`,{className:`w-28 shrink-0 text-center`,children:[`¥`,(n?Number(t.bill.added_amount):Dt[e.name]?.added??0).toFixed(2)]}),(0,x.jsxs)(`div`,{className:`flex-1 text-center`,children:[(0,x.jsxs)(S,{strong:!0,type:`danger`,children:[`¥`,(n?Number(t.bill.total_amount):Dt[e.name]?.total??0).toFixed(2)]}),n&&(0,x.jsx)(`div`,{className:`text-xs text-gray-400`,children:t.bill.bill_no})]})]},e.key)})]})})})]})})}),(0,x.jsxs)(d,{title:`新增单品 · ${P?.store?.name??``}`,open:rt,onCancel:()=>F(!1),onOk:()=>I.submit(),confirmLoading:it,okText:`添加`,destroyOnHidden:!0,children:[(0,x.jsx)(`div`,{className:`py-2 text-gray-500`,children:`单品将挂靠到该门店在此采购单中的最新一笔订单;单价按门店等级上浮比例自动换算。`}),(0,x.jsxs)(p,{form:I,layout:`vertical`,onFinish:Mt,children:[(0,x.jsx)(p.Item,{label:`商品`,name:`product_id`,rules:[{required:!0,message:`请选择商品`}],children:(0,x.jsx)(l,{showSearch:{optionFilterProp:`label`},placeholder:`搜索并选择商品`,options:ot.map(e=>({value:e.id,label:`${e.name}${e.spec?`(${e.spec})`:``}`}))})}),(0,x.jsx)(p.Item,{label:`采购数量`,name:`quantity`,rules:[{required:!0,message:`请输入采购数量`}],children:(0,x.jsx)(a,{className:`w-full`,min:1,precision:0,placeholder:`请输入采购数量(包数)`})}),(0,x.jsx)(p.Item,{label:`称重(斤,可选)`,name:`weight`,children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:3,placeholder:`请输入称重`})})]})]}),(0,x.jsxs)(d,{title:L?`编辑「${L.product_name}」`:`编辑单品`,open:L!==null,onCancel:()=>R(null),onOk:()=>z.submit(),confirmLoading:ct,okText:`保存`,destroyOnHidden:!0,children:[(0,x.jsx)(`div`,{className:`py-2 text-gray-500`,children:`修改保存后,系统将自动重算明细金额、订货单与采购单汇总。`}),(0,x.jsxs)(p,{form:z,layout:`vertical`,onFinish:Pt,children:[(0,x.jsx)(p.Item,{label:`单价(元)`,name:`price`,rules:[{required:!0,message:`请输入单价`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:2,placeholder:`请输入单价`})}),(0,x.jsx)(p.Item,{label:`采购数量`,name:`quantity`,rules:[{required:!0,message:`请输入采购数量`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:0,placeholder:`请输入采购数量`})}),(0,x.jsx)(p.Item,{label:`称重(斤)`,name:`weight`,rules:[{required:!0,message:`请输入称重`}],children:(0,x.jsx)(a,{className:`w-full`,min:0,precision:3,placeholder:`请输入称重`})})]})]}),(0,x.jsxs)(d,{title:`导出商品明细`,open:dt,onCancel:()=>U(!1),onOk:()=>{C&&be(C.purchase.id,W>0?W:void 0),U(!1)},okText:`导出`,destroyOnHidden:!0,children:[(0,x.jsx)(`div`,{className:`py-2 text-gray-500`,children:`导出系统全部商品行(无订货的商品数量为 0),门店列附数量合计与突出颜色。`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2 py-2`,children:[(0,x.jsx)(S,{children:`供应商:`}),(0,x.jsx)(l,{value:W,onChange:ft,className:`flex-1`,options:[{value:0,label:`全部供应商`},...q.map(e=>({value:e.id,label:e.name}))]})]})]}),(0,x.jsx)(d,{title:`导出门店购买详情`,open:pt,onCancel:()=>G(!1),onOk:()=>{C&&Se(C.purchase.id,mt===`current`&&N>0?N:void 0),G(!1)},okText:`导出`,destroyOnHidden:!0,children:(0,x.jsx)(ie.Group,{className:`py-2`,value:mt,onChange:e=>ht(e.target.value),options:[{value:`current`,label:`当前门店(${C?.stores.find(e=>e.id===N)?.name??`-`})`},{value:`all`,label:`全部门店(合并为一个 XLSX,每门店一个工作表)`}]})}),(0,x.jsxs)(d,{title:`导出供应商采购明细`,open:gt,onCancel:()=>K(!1),onOk:()=>{C&&_e(C.purchase.id,_t===`current`&&B>0?B:void 0),K(!1)},okText:`导出`,destroyOnHidden:!0,children:[(0,x.jsx)(`div`,{className:`py-2 text-gray-500`,children:`导出 XLSX 按「供应商 × 市场」拆分工作表,列序:品名、汇总、市场、各门店明细,有数据的单元格突出显示。`}),(0,x.jsx)(ie.Group,{className:`py-2`,value:_t,onChange:e=>vt(e.target.value),options:[{value:`current`,label:`当前供应商(${q.find(e=>e.id===B)?.name??`-`})`},{value:`all`,label:`全部供应商(合并为一个 XLSX,每供应商×市场一个工作表)`}]})]})]})};export{je as default}; \ No newline at end of file diff --git a/public/index.html b/public/index.html index cde0a36..b231fa8 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ XinAdmin - + @@ -92,7 +92,7 @@ - +
diff --git a/tests/Feature/BillExportTest.php b/tests/Feature/BillExportTest.php index f614d8e..f2c0806 100644 --- a/tests/Feature/BillExportTest.php +++ b/tests/Feature/BillExportTest.php @@ -19,7 +19,7 @@ class BillExportTest extends ProcurementTestCase { private static int $billSeq = 0; - /** 造一张账单(默认配送费 10、筐 2×5 + 托盘 1×20 = 附加 30、总额 140,未支付) */ + /** 造一张账单(默认配送费 10、筐 2×5 + 托盘 1×20 = 附加 30、售后 0、总额 140,未支付) */ private function makeBill(StoreModel $store, array $attributes = []): BillModel { $seq = ++self::$billSeq; @@ -36,6 +36,7 @@ class BillExportTest extends ProcurementTestCase 'box_price' => '5.00', 'tray_price' => '20.00', 'added_amount' => '30.00', + 'after_sale' => '0.00', 'total_amount' => '140.00', 'status' => BillModel::STATUS_UNPAID, ], $attributes)); @@ -70,7 +71,7 @@ class BillExportTest extends ProcurementTestCase $productB = ProductModel::factory()->create(['category_id' => $root->id]); $bill1 = $this->makeBill($store); - $bill2 = $this->makeBill($store); + $bill2 = $this->makeBill($store, ['after_sale' => '-8.00']); // 同一商品跨账单:10×2.00 + 6×3.00 → 数量 16、金额 38.00、加权单价 2.37 $this->makeItem($bill1, $productA, 10, '2.00'); $this->makeItem($bill2, $productA, 6, '3.00'); @@ -84,8 +85,8 @@ class BillExportTest extends ProcurementTestCase '门店账单_' . now()->format('Ymd_His') . '.xlsx', static function (BillExport $export) use ($productA, $productB): bool { $rows = $export->collection()->values(); - // 标题1 + 范围2 + 空行1 + 列头1 + 明细2 + 合计4 = 11 行 - if ($rows->count() !== 11) { + // 标题1 + 范围2 + 空行1 + 列头1 + 明细2 + 合计5 = 12 行 + if ($rows->count() !== 12) { return false; } @@ -104,7 +105,7 @@ class BillExportTest extends ProcurementTestCase } $summary = $rows->slice(7)->values(); - // 合计:数量 20、商品金额 58.00;配送费 20.00;附加 60.00(筐 4 / 托盘 2);总金额 138.00 + // 合计:数量 20、商品金额 58.00;配送费 20.00;附加 60.00(筐 4 / 托盘 2);售后 -8.00;总金额 130.00 if ((int) $summary[0][5] !== 20 || (float) $summary[0][7] !== 58.0) { return false; } @@ -114,8 +115,11 @@ class BillExportTest extends ProcurementTestCase if (! str_contains((string) $summary[2][0], '筐 4 个 / 周转托盘 2 个') || (float) $summary[2][7] !== 60.0) { return false; } + if (! str_contains((string) $summary[3][0], '售后金额合计') || (float) $summary[3][7] !== -8.0) { + return false; + } - return (float) $summary[3][7] === 138.0; + return (float) $summary[4][7] === 130.0; } ); } @@ -156,15 +160,15 @@ class BillExportTest extends ProcurementTestCase } $summary = $rows->slice(6)->values(); - // 商品金额合计 20.00(仅蔬菜);配送费 10.00 / 附加 30.00 全额;总金额 60.00 + // 商品金额合计 20.00(仅蔬菜);配送费 10.00 / 附加 30.00 / 售后 0.00 全额;总金额 60.00 if ((float) $summary[0][7] !== 20.0) { return false; } - if ((float) $summary[1][7] !== 10.0 || (float) $summary[2][7] !== 30.0) { + if ((float) $summary[1][7] !== 10.0 || (float) $summary[2][7] !== 30.0 || (float) $summary[3][7] !== 0.0) { return false; } - return (float) $summary[3][7] === 60.0; + return (float) $summary[4][7] === 60.0; } ); } @@ -242,7 +246,7 @@ class BillExportTest extends ProcurementTestCase static function (BillExport $export): bool { $rows = $export->collection()->values(); // 明细仅本店账单的 1 行(他店账单未混入) - return $rows->count() === 10; + return $rows->count() === 11; } ); diff --git a/tests/Feature/BillPaymentTest.php b/tests/Feature/BillPaymentTest.php index af20eba..4a723fd 100644 --- a/tests/Feature/BillPaymentTest.php +++ b/tests/Feature/BillPaymentTest.php @@ -72,7 +72,7 @@ class BillPaymentTest extends ProcurementTestCase ], $attributes)); } - /** 生成账单:按门店保存售后说明与备注(可选,不参与金额计算) */ + /** 生成账单:按门店保存售后金额(可正负,计入总金额)与备注(仅存档不参与计算) */ public function test_generate_bill_saves_after_sale_and_remark(): void { $level = CustomerLevelModel::factory()->create(); @@ -97,17 +97,17 @@ class BillPaymentTest extends ProcurementTestCase 'delivery_fee' => 0, 'box_num' => 0, 'tray_num' => 0, - 'after_sale' => '白菜烂叶 2 斤已协商', - 'remark' => '下次配送顺带回收筐', + 'after_sale' => -5.5, + 'remark' => '白菜烂叶 2 斤已协商', ]], ])->assertJsonPath('success', true); $bill = BillModel::where('store_id', $store->id)->first(); - $this->assertSame('白菜烂叶 2 斤已协商', $bill->after_sale); - $this->assertSame('下次配送顺带回收筐', $bill->remark); - $this->assertSame('20.00', (string) $bill->total_amount, '售后/备注不影响金额'); + $this->assertSame('-5.50', (string) $bill->after_sale); + $this->assertSame('白菜烂叶 2 斤已协商', $bill->remark); + $this->assertSame('14.50', (string) $bill->total_amount, '总金额 = 商品 20.00 + 售后金额 -5.50'); - // 不传售后/备注时默认空字符串 + // 不传售后金额时按 0 计入,备注默认空字符串 $store2 = StoreModel::factory()->create(['level_id' => $level->id]); $this->actingAsMiniStore($store2); $this->postJson('/mini/order', ['items' => [['product_id' => $product->id, 'quantity' => 1]]]) @@ -125,8 +125,65 @@ class BillPaymentTest extends ProcurementTestCase ])->assertJsonPath('success', true); $bill2 = BillModel::where('store_id', $store2->id)->first(); - $this->assertSame('', (string) $bill2->after_sale); + $this->assertSame('0.00', (string) $bill2->after_sale); $this->assertSame('', (string) $bill2->remark); + $this->assertSame('5.00', (string) $bill2->total_amount, '未传售后金额不影响总金额'); + } + + /** 生成账单:售后金额为正数时加收计入总金额 */ + public function test_generate_bill_positive_after_sale_added_to_total(): void + { + [$store, , $bill] = $this->makeBillViaChain(); + $this->assertSame('20.00', (string) $bill->total_amount, '基线:无售后金额时总额=商品金额'); + + // 重新走一条链:售后金额 +8.00,配送费 2.00 → 总额 20 + 2 + 8 = 30.00 + $level = CustomerLevelModel::factory()->create(); + $store2 = StoreModel::factory()->create(['level_id' => $level->id]); + $product = ProductModel::factory()->create(['status' => ProductModel::STATUS_ON, 'cost_price' => '5.00']); + + $this->actingAsMiniStore($store2); + $this->postJson('/mini/order', ['items' => [['product_id' => $product->id, 'quantity' => 4]]]) + ->assertJsonPath('success', true); + $order2 = StoreOrderModel::where('store_id', $store2->id)->first(); + + $this->actingAsSysUser(); + $this->putJson("/order/store/{$order2->id}/status", ['status' => StoreOrderModel::STATUS_SUMMARIZED]); + $this->postJson('/purchase/order/generate', ['purchase_date' => now()->toDateString()]) + ->assertJsonPath('success', true); + $purchase2 = PurchaseOrderModel::latest('id')->first(); + $this->putJson("/purchase/order/{$purchase2->id}/finish")->assertJsonPath('success', true); + $this->postJson("/purchase/order/{$purchase2->id}/bill", [ + 'stores' => [[ + 'store_id' => $store2->id, + 'delivery_fee' => 2, + 'box_num' => 0, + 'tray_num' => 0, + 'after_sale' => 8, + ]], + ])->assertJsonPath('success', true); + + $bill2 = BillModel::where('store_id', $store2->id)->first(); + $this->assertSame('8.00', (string) $bill2->after_sale); + $this->assertSame('30.00', (string) $bill2->total_amount, '总金额 = 商品 20.00 + 配送费 2.00 + 售后金额 8.00'); + } + + /** 生成账单:售后金额非数值 → 拒绝 */ + public function test_generate_bill_rejects_non_numeric_after_sale(): void + { + $level = CustomerLevelModel::factory()->create(); + $store = StoreModel::factory()->create(['level_id' => $level->id]); + $this->actingAsSysUser(); + $purchase = PurchaseOrderModel::factory()->create(['status' => PurchaseOrderModel::STATUS_COMPLETED]); + + $this->postJson("/purchase/order/{$purchase->id}/bill", [ + 'stores' => [[ + 'store_id' => $store->id, + 'delivery_fee' => 0, + 'box_num' => 0, + 'tray_num' => 0, + 'after_sale' => '白菜烂叶 2 斤已协商', + ]], + ])->assertJsonPath('success', false); } /** 订单状态随业务链自动推进:接单→采购中→配送中→(生成账单)已完成 */ diff --git a/tests/Feature/MiniBillTest.php b/tests/Feature/MiniBillTest.php index f00c05b..7804810 100644 --- a/tests/Feature/MiniBillTest.php +++ b/tests/Feature/MiniBillTest.php @@ -156,7 +156,7 @@ class MiniBillTest extends ProcurementTestCase 'uploader_id' => 1, ]); - $bill = $this->makeBill($store); + $bill = $this->makeBill($store, ['after_sale' => '-3.00']); $product = ProductModel::factory()->create(['status' => ProductModel::STATUS_ON]); $order = StoreOrderModel::factory()->create([ 'store_id' => $store->id, @@ -182,6 +182,7 @@ class MiniBillTest extends ProcurementTestCase $data = $this->getJson("/mini/bill/{$bill->id}")->assertOk()->json('data'); $this->assertSame($bill->bill_no, $data['bill']['bill_no']); + $this->assertSame('-3.00', $data['bill']['after_sale'], '售后金额输出给门店(计入总金额构成)'); $this->assertSame('待支付', $data['bill']['pay_state_name']); $this->assertSame('2026-08-10', $data['bill']['settlement_date'], '回款周期 0 天,出账当天应结算'); $this->assertSame($bill->purchase->purchase_no, $data['bill']['purchase']['purchase_no']); diff --git a/web/api/purchase/order.ts b/web/api/purchase/order.ts index 6906e70..69850ac 100644 --- a/web/api/purchase/order.ts +++ b/web/api/purchase/order.ts @@ -25,14 +25,14 @@ export interface PurchaseCellUpdateParams { weight?: number; } -/** 生成账单:单个门店的配送费/周转筐/托盘数量与售后/备注 */ +/** 生成账单:单个门店的配送费/周转筐/托盘数量与售后金额/备注 */ export interface BillGenerateStoreParams { store_id: number; delivery_fee: number; box_num: number; tray_num: number; - /** 售后说明(文本,仅记录) */ - after_sale?: string; + /** 售后金额(可正负,计入总金额;正数=加收,负数=售后减免) */ + after_sale?: number; /** 备注 */ remark?: string; } diff --git a/web/domain/iPurchaseOrder.ts b/web/domain/iPurchaseOrder.ts index efa77d6..5359f32 100644 --- a/web/domain/iPurchaseOrder.ts +++ b/web/domain/iPurchaseOrder.ts @@ -109,7 +109,7 @@ export interface IBill { tray_price: string; /** 附加金额 = 周转筐×筐单价 + 托盘×托盘单价 */ added_amount: string; - /** 账单总金额 = 商品金额 + 配送费 + 附加金额 */ + /** 账单总金额 = 商品金额 + 配送费 + 附加金额 + 售后金额 */ total_amount: string; /** 支付状态:0未支付 1已支付 */ status?: number; @@ -122,7 +122,7 @@ export interface IBill { paid_operator_id?: number; order_count?: number; remark?: string; - /** 售后说明(生成账单时按门店填写) */ + /** 售后金额(生成账单时按门店填写,可正负,计入总金额) */ after_sale?: string; created_at?: string; /** 门店账单列表/详情接口附带 */ diff --git a/web/pages/purchase/order.tsx b/web/pages/purchase/order.tsx index 3bbfc19..9db67da 100644 --- a/web/pages/purchase/order.tsx +++ b/web/pages/purchase/order.tsx @@ -187,17 +187,18 @@ const PurchaseOrderPage: React.FC = () => { const [billSaving, setBillSaving] = useState(false); const [billForm] = Form.useForm<{ stores: BillGenerateStoreParams[] }>(); - // 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;总额 = 商品 + 配送费 + 附加 + // 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;总额 = 商品 + 配送费 + 附加 + 售后金额(可正负) const watchBillStores = Form.useWatch('stores', billForm) ?? []; const billPreview = (billPrepare?.stores ?? []).map((row, index) => { const input = watchBillStores[index] ?? {}; const deliveryFee = Number(input.delivery_fee ?? 0); + const afterSale = Number(input.after_sale ?? 0); const added = Number(input.box_num ?? 0) * Number(row.box_price) + Number(input.tray_num ?? 0) * Number(row.tray_price); return { added, - total: Number(row.product_amount) + deliveryFee + added, + total: Number(row.product_amount) + deliveryFee + added + afterSale, }; }); const billAllGenerated = @@ -441,7 +442,7 @@ const PurchaseOrderPage: React.FC = () => { delivery_fee: row.bill ? Number(row.bill.delivery_fee) : 0, box_num: row.bill ? row.bill.box_num : 0, tray_num: row.bill ? row.bill.tray_num : 0, - after_sale: row.bill?.after_sale ?? '', + after_sale: row.bill ? Number(row.bill.after_sale) : 0, remark: row.bill?.remark ?? '', })), }); @@ -1428,7 +1429,7 @@ const PurchaseOrderPage: React.FC = () => { - {/* 生成账单:按门店填写配送费/周转筐/托盘数量(商品金额只读,由订单汇总) */} + {/* 生成账单:按门店填写配送费/周转筐/托盘数量与售后金额(商品金额只读,由订单汇总) */} { {billPrepare && ( <>
- 每个门店单独生成一张账单;商品金额由订单汇总不可修改,请填写各门店的配送费、周转筐/托盘数量(正数=压筐附加金额,负数=回筐抵扣金额)与售后/备注(可选,随账单存档)。 + 每个门店单独生成一张账单;商品金额由订单汇总不可修改,请填写各门店的配送费、周转筐/托盘数量(正数=压筐附加金额,负数=回筐抵扣金额)、售后金额(可正负,计入总金额:正数=加收,负数=售后减免)与备注(可选,随账单存档)。 {billAllGenerated ? '该采购单已全部生成账单,仅可查看。' : '生成后采购单中的全部订单将关联到对应门店账单。'}
@@ -1460,7 +1461,7 @@ const PurchaseOrderPage: React.FC = () => {
配送费(元)
周转筐(¥{billPrepare.stores[0]?.box_price ?? '0.00'}/个)
周转托盘(¥{billPrepare.stores[0]?.tray_price ?? '0.00'}/个)
-
售后
+
售后金额(元)
备注
附加金额
账单总金额
@@ -1524,10 +1525,11 @@ const PurchaseOrderPage: React.FC = () => { className="m-0! w-36 shrink-0 px-1!" name={[field.name, 'after_sale']} > - { ), }, + { + title: '售后金额', + dataIndex: 'after_sale', + hideInForm: true, + hideInSearch: true, + align: 'center', + render: (_, record) => ( + + ¥{record.after_sale ?? '0.00'} + + ), + }, { title: '账单总金额', dataIndex: 'total_amount', @@ -361,7 +373,7 @@ const BillPage: React.FC = () => {
门店账单 - 采购单完成后在「采购单」页生成,每个门店单独一张;账单总金额 = 商品金额 + 配送费 + 附加金额(周转筐/托盘); + 采购单完成后在「采购单」页生成,每个门店单独一张;账单总金额 = 商品金额 + 配送费 + 附加金额(周转筐/托盘)+ 售后金额(可正负); 勾选多张账单可合并导出为一个 Excel(明细跨账单按商品合并,可按一级分类过滤)。
@@ -388,6 +400,12 @@ const BillPage: React.FC = () => { (筐 {detail.bill.box_num}×¥{detail.bill.box_price},托盘 {detail.bill.tray_num}×¥{detail.bill.tray_price}) + + + ¥{detail.bill.after_sale ?? '0.00'} + + (可正负,计入总金额) + ¥{detail.bill.total_amount} @@ -403,9 +421,6 @@ const BillPage: React.FC = () => { {detail.bill.pay_remark ? ( {detail.bill.pay_remark} ) : null} - {detail.bill.after_sale ? ( - {detail.bill.after_sale} - ) : null} {detail.bill.remark ? ( {detail.bill.remark} ) : null} @@ -453,7 +468,7 @@ const BillPage: React.FC = () => { >
应收金额 ¥{payTarget?.total_amount ?? '0.00'} - (商品 ¥{payTarget?.product_amount ?? '0.00'} + 配送费 ¥{payTarget?.delivery_fee ?? '0.00'} + 附加 ¥{payTarget?.added_amount ?? '0.00'}); + (商品 ¥{payTarget?.product_amount ?? '0.00'} + 配送费 ¥{payTarget?.delivery_fee ?? '0.00'} + 附加 ¥{payTarget?.added_amount ?? '0.00'} + 售后 ¥{payTarget?.after_sale ?? '0.00'}); 线下收款完成后登记付款信息,账单支付状态将置为「已支付」。