feat: integrate finance prototype navigation pages

This commit is contained in:
WuYongJie 2026-08-31 14:59:24 +08:00
parent fdc42dd84d
commit c55dcf4f63
14 changed files with 105 additions and 343 deletions

View File

@ -85,6 +85,10 @@ class Pages extends Controller
abort_if(empty($section), 403, '当前账号没有已授权的侧边栏功能。');
if (! empty($section['external_url'])) {
return redirect()->away($section['external_url']);
}
$page = collect($section['pages'] ?? [])->first();
$parameters = ['section' => $section['slug']];
@ -105,6 +109,12 @@ class Pages extends Controller
abort_if(empty($sectionConfig), 403, '当前账号没有该页面权限。');
if (! empty($sectionConfig['external_url'])) {
abort_if($page !== null || $tab !== null, 404);
return redirect()->away($sectionConfig['external_url']);
}
$pages = collect($sectionConfig['pages'] ?? []);
if ($pages->isEmpty()) {

View File

@ -15,10 +15,22 @@ class ShowInAdmin
$menu = $event->menu;
foreach (SidebarPermissions::navigationFor(user()) as $sectionIndex => $section) {
// 订单数据按配置顺序展示,让“原始数据”保持在新增子页面之前。
$pages = $section['slug'] === 'order-data'
? array_values($section['pages'] ?? [])
: $this->sortByTitleLength($section['pages'] ?? []);
if (! empty($section['external_url'])) {
$menu->url(
$section['external_url'],
$section['title'],
($sectionIndex + 1) * 10,
[
'icon' => $section['icon'] ?? '',
'target' => '_blank',
'rel' => 'noopener noreferrer',
]
);
continue;
}
$pages = $this->sortByTitleLength($section['pages'] ?? []);
$order = ($sectionIndex + 1) * 10;
if (empty($pages)) {

View File

@ -6,99 +6,10 @@ return [
'title' => '公司管理',
'icon' => 'business',
'pages' => [
[
'slug' => 'subject-operating-report',
'title' => '主体维度经营报表',
'directory' => [
'icon' => 'query_stats',
'status' => '尚未同步',
'description' => '按店铺唯一 ID 和主体生效、失效日期归属销量;自动汇总前,先固定 Excel 中的报表字段。',
'empty' => '经营报表尚未同步。完成店铺主体和销量镜像接入后,这里会显示可追溯的主体数据。',
'fields' => [
['name' => 'city', 'label' => '市'],
['name' => 'entity', 'label' => '主体'],
['name' => 'company_type', 'label' => '公司类型'],
['name' => 'erp_store_name', 'label' => 'ERP系统店铺名称'],
['name' => 'profit_center', 'label' => '店铺所属利润中心'],
['name' => 'store_manager', 'label' => '店铺负责人'],
['name' => 'closing_manager', 'label' => '闭门负责人'],
['name' => 'opened_at', 'label' => '开店时间', 'kind' => 'date'],
['name' => 'status', 'label' => '状态'],
['name' => 'recent_three_month_sales', 'label' => '展示近3个月月度销量', 'kind' => 'number'],
['name' => 'store_sales_12m', 'label' => '连续12个月店铺累计销量', 'kind' => 'number'],
['name' => 'entity_sales_12m', 'label' => '连续12个月主体累计销量', 'kind' => 'number'],
['name' => 'can_change_entity', 'label' => '能否变更主体'],
['name' => 'plan', 'label' => '规划'],
['name' => 'new_entity', 'label' => '新主体(变更流程同步新主体)'],
],
],
],
[
'slug' => 'basic-information',
'title' => '公司基础信息',
'directory' => [
'icon' => 'business',
'status' => '既有只读上游',
'description' => '沿用现有公司基础资料只读链路;Excel 中暂未匹配到的城市、认缴时间等字段保留为空。',
'empty' => '尚未读取到公司基础资料。请检查共享镜像或上游同步状态。',
'fields' => [
['name' => 'unified_social_credit_code', 'label' => '统一社会信用代码'],
['name' => 'company_name', 'label' => '公司名称'],
['name' => 'taxpayer_type', 'label' => '纳税人类型', 'source' => 'taxpayer_category'],
['name' => 'company_status', 'label' => '公司状态'],
['name' => 'subscribed_capital', 'label' => '认缴注册资本(万元)', 'kind' => 'number'],
['name' => 'registered_at', 'label' => '注册时间', 'kind' => 'date', 'source' => 'establishment_date'],
['name' => 'legal_representative', 'label' => '法人'],
['name' => 'shareholders', 'label' => '股东'],
['name' => 'supervisor', 'label' => '监事'],
['name' => 'billing_officer', 'label' => '开票员', 'source' => 'financial_officer'],
['name' => 'city', 'label' => '城市'],
['name' => 'registered_address', 'label' => '注册地址'],
['name' => 'business_scope', 'label' => '经营范围'],
['name' => 'basic_deposit_account', 'label' => '基本存款账户信息', 'source' => 'basic_deposit_account_number', 'kind' => 'secret'],
['name' => 'subscribed_at', 'label' => '认缴时间'],
],
],
],
[
'slug' => 'personnel-inventory',
'title' => '人员盘点表',
'directory' => [
'icon' => 'group',
'status' => '尚未同步',
'description' => '固定人员、任职和公司承载量盘点字段;身份证、税务账号和密码只保留字段契约,不在空页面填充。',
'empty' => '人员盘点数据尚未同步。接入人员和任职关系后,这里会显示盘点结果。',
'fields' => [
['name' => 'person_name', 'label' => '人员名称'],
['name' => 'alias', 'label' => '花名'],
['name' => 'position', 'label' => '职位'],
['name' => 'tag', 'label' => '标签'],
['name' => 'tax_account', 'label' => '税务局账号'],
['name' => 'tax_password', 'label' => '税务局密码', 'kind' => 'secret'],
['name' => 'department', 'label' => '部门'],
['name' => 'department_manager', 'label' => '部门负责人'],
['name' => 'id_number', 'label' => '身份证号码', 'kind' => 'secret'],
['name' => 'verified_mobile', 'label' => '实名手机号', 'kind' => 'secret'],
['name' => 'sim_card_keeper', 'label' => '电话卡保管人'],
['name' => 'id_address', 'label' => '身份证地址', 'kind' => 'secret'],
['name' => 'company_type', 'label' => '公司类型'],
['name' => 'total_company_count', 'label' => '合计担任公司数量', 'kind' => 'number'],
['name' => 'retained_company_count', 'label' => '保留担任公司数量', 'kind' => 'number'],
['name' => 'available_company_count', 'label' => '可担任公司数量', 'kind' => 'number'],
],
],
],
[
'slug' => 'company-progress',
'title' => '公司进度表',
'directory' => [
'icon' => 'timeline',
'status' => '字段待定义',
'description' => 'Excel 目录包含该页面,但未提供对应子表或表头。当前只建立页面位置,不猜测公司流程字段。',
'empty' => '公司进度表字段尚未定义,补充子表表头后再接入流程数据。',
'fields' => [],
],
],
['slug' => 'people-inventory', 'title' => '人员盘点表'],
['slug' => 'company-progress', 'title' => '公司进度表'],
['slug' => 'company-information', 'title' => '公司基础信息'],
['slug' => 'entity-report', 'title' => '主体维度经营报表'],
],
],
[
@ -106,47 +17,8 @@ return [
'title' => '商标管理',
'icon' => 'verified',
'pages' => [
[
'slug' => 'information',
'title' => '商标基础信息',
'directory' => [
'icon' => 'verified',
'status' => '既有只读上游',
'description' => '沿用现有商标资料只读链路;当前已匹配名称、状态、注册时间和有效期,其余 Excel 字段待接入。',
'empty' => '尚未读取到商标基础资料。请检查共享镜像或上游同步状态。',
'fields' => [
['name' => 'trademark_name', 'label' => '商标名称'],
['name' => 'trademark_number', 'label' => '商标号'],
['name' => 'trademark_status', 'label' => '商标状态'],
['name' => 'registration_date', 'label' => '注册时间', 'kind' => 'date'],
['name' => 'expiry_date', 'label' => '有效期', 'kind' => 'date'],
['name' => 'international_classification', 'label' => '国际分类', 'source' => 'trademark_type'],
['name' => 'approved_goods', 'label' => '核定使用商品'],
['name' => 'final_holder', 'label' => '最终持有人'],
['name' => 'registered_address', 'label' => '注册地址'],
['name' => 'custody_department', 'label' => '保管部门'],
],
],
],
[
'slug' => 'trademark-progress',
'title' => '商标进度表',
'directory' => [
'icon' => 'timeline',
'status' => '尚未同步',
'description' => '按 Excel 固定注册、变更、续展等业务的办理进度字段;流程数据接入前不显示伪造记录。',
'empty' => '商标进度数据尚未同步。',
'fields' => [
['name' => 'trademark_name', 'label' => '商标名称'],
['name' => 'trademark_number', 'label' => '商标号'],
['name' => 'business', 'label' => '业务'],
['name' => 'progress', 'label' => '进度'],
['name' => 'completed', 'label' => '是否完成'],
['name' => 'completed_at', 'label' => '完成时间', 'kind' => 'date'],
['name' => 'handler', 'label' => '办理人'],
],
],
],
['slug' => 'trademark-progress', 'title' => '商标进度表'],
['slug' => 'trademark-information', 'title' => '商标基础信息'],
],
],
[
@ -154,93 +26,9 @@ return [
'title' => '店铺管理',
'icon' => 'storefront',
'pages' => [
[
'slug' => 'store-report',
'title' => '店铺维度报表',
'directory' => [
'icon' => 'query_stats',
'status' => '尚未同步',
'description' => '以店铺 ID 和主体生效、失效时间为基础,固定期间销量及 2026 年月度销量字段。',
'empty' => '店铺维度报表尚未同步。完成销量镜像接入后,这里会显示可核对的期间数据。',
'fields' => [
['name' => 'erp_store_name', 'label' => 'ERP系统店铺名称'],
['name' => 'store_id', 'label' => '店铺ID(唯一值)'],
['name' => 'profit_center', 'label' => '店铺所属利润中心'],
['name' => 'store_manager', 'label' => '店铺负责人'],
['name' => 'department_manager', 'label' => '部门负责人'],
['name' => 'opened_at', 'label' => '开店时间', 'kind' => 'date'],
['name' => 'status', 'label' => '状态'],
['name' => 'can_change', 'label' => '能否变更'],
['name' => 'entity', 'label' => '主体'],
['name' => 'company_type', 'label' => '公司类型'],
['name' => 'effective_at', 'label' => '生效时间', 'kind' => 'date'],
['name' => 'invalid_at', 'label' => '失效时间', 'kind' => 'date'],
['name' => 'period_sales', 'label' => '期间销量', 'kind' => 'number'],
...array_map(static fn (int $month): array => [
'name' => sprintf('sales_%02d', $month),
'label' => sprintf('%d月销量', $month),
'kind' => 'number',
], range(1, 12)),
],
],
],
[
'slug' => 'basic-information',
'title' => '店铺基础信息',
'directory' => [
'icon' => 'storefront',
'status' => '既有只读上游',
'description' => '沿用现有店铺资料只读链路;Excel 中的店铺 ID、续签时间和提现账户待字段映射后补充。',
'empty' => '尚未读取到店铺基础资料。请检查共享镜像或上游同步状态。',
'fields' => [
['name' => 'platform', 'label' => '平台'],
['name' => 'store_id', 'label' => '店铺ID'],
['name' => 'store_name', 'label' => '店铺名称', 'source' => 'erp_store_name'],
['name' => 'store_entity', 'label' => '店铺主体', 'source' => 'company_name'],
['name' => 'store_status', 'label' => '店铺状态'],
['name' => 'trademark', 'label' => '商标', 'source' => 'trademark_name'],
['name' => 'trademark_number', 'label' => '商标号'],
['name' => 'business_department', 'label' => '业务部门', 'source' => 'profit_center'],
['name' => 'store_manager', 'label' => '店铺负责人'],
['name' => 'department_manager', 'label' => '部门负责人'],
['name' => 'opened_at', 'label' => '开店时间', 'kind' => 'date'],
['name' => 'renewed_at', 'label' => '续签时间'],
['name' => 'withdrawal_account', 'label' => '提现账户', 'kind' => 'secret'],
],
],
],
[
'slug' => 'change-progress',
'title' => '店铺变更进度表',
'directory' => [
'icon' => 'sync_alt',
'status' => '尚未同步',
'description' => '按 Excel 固定店铺主体变更的账号、接替公司、进度和办理留痕字段。',
'empty' => '店铺变更进度数据尚未同步。',
'fields' => [
['name' => 'company_name', 'label' => '公司名称'],
['name' => 'erp_store_name', 'label' => 'ERP系统店铺名称'],
['name' => 'department', 'label' => '部门'],
['name' => 'store_manager', 'label' => '店铺负责人'],
['name' => 'department_manager', 'label' => '部门负责人'],
['name' => 'account', 'label' => '账号'],
['name' => 'password', 'label' => '密码', 'kind' => 'secret'],
['name' => 'successor_company', 'label' => '接替公司'],
['name' => 'progress', 'label' => '进度'],
['name' => 'completed', 'label' => '是否完成'],
['name' => 'completed_at', 'label' => '完成时间', 'kind' => 'date'],
['name' => 'handler', 'label' => '办理人'],
],
],
],
],
],
[
'slug' => 'product-inventory',
'title' => '商品及库存管理',
'icon' => 'inventory_2',
'pages' => [
['slug' => 'normal-products', 'title' => '普通商品资料'],
['slug' => 'store-report', 'title' => '店铺维度经营报表'],
['slug' => 'store-information', 'title' => '店铺基础信息'],
['slug' => 'store-change-progress', 'title' => '店铺变更进度表'],
],
],
[
@ -311,16 +99,6 @@ return [
['slug' => 'vipshop', 'title' => '唯品会账户'],
],
],
[
'slug' => 'platform-promotion-accounts',
'title' => '平台推广账户流水',
'tabs' => [
['slug' => 'jd', 'title' => '京东京准通'],
['slug' => 'douyin', 'title' => '抖音千川'],
['slug' => 'dewu', 'title' => '得物推广账户'],
['slug' => 'vip', 'title' => 'VIP(唯品会)'],
],
],
['slug' => 'deposit-account-balance', 'title' => '店铺保证金账户余额'],
[
'slug' => 'deposit-account-bills',
@ -362,15 +140,8 @@ return [
'title' => '订单数据',
'icon' => 'receipt_long',
'pages' => [
[
'slug' => 'raw-data',
'title' => '原始数据',
'tabs' => [
['slug' => 'after-sales-expenses', 'title' => '订单售后费用明细'],
['slug' => 'promotion-expenses', 'title' => '商品推广费用明细'],
],
],
['slug' => 'bill-offset', 'title' => '账单冲减'],
['slug' => 'after-sales-expenses', 'title' => '订单售后费用明细'],
['slug' => 'promotion-expenses', 'title' => '商品推广费用明细'],
],
],
[
@ -379,7 +150,7 @@ return [
'icon' => 'assignment_return',
'pages' => [
['slug' => 'jingxi-refund-data', 'title' => '京喜退款数据'],
['slug' => 'non-jingxi-refund-data', 'title' => '售后(退货退款)'],
['slug' => 'non-jingxi-refund-data', 'title' => '非京喜退款数据'],
],
],
[
@ -426,14 +197,11 @@ return [
'icon' => 'local_shipping',
'pages' => [
['slug' => 'quote-management', 'title' => '报价管理'],
['slug' => 'courier-information', 'title' => '快递资料'],
['slug' => 'agreement-signing', 'title' => '协议签署'],
['slug' => 'freight-reconciliation', 'title' => '运费对账'],
['slug' => 'bookkeeping-details', 'title' => '记账明细'],
['slug' => 'compensation-details', 'title' => '赔偿明细'],
['slug' => 'advance-details', 'title' => '借支明细'],
['slug' => 'other-adjustments', 'title' => '其他扣款补款'],
['slug' => 'payable-cloud-warehouse-vehicle-fee', 'title' => '应付云仓车费'],
['slug' => 'courier-payables-report', 'title' => '快递应付表'],
],
],
@ -537,64 +305,9 @@ return [
],
],
[
'slug' => 'other',
'title' => '其他',
'icon' => 'more_horiz',
'pages' => [
[
'slug' => 'todos',
'title' => '待办事项',
'directory' => [
'icon' => 'task_alt',
'status' => '尚未同步',
'description' => '预警、审批、定时任务和人工创建事项共用一套待办字段,形成责任分派与处理留痕。',
'empty' => '待办事项尚未同步。完成任务来源和处理流程接入后,这里会显示待办记录。',
'fields' => [
['name' => 'todo_number', 'label' => '待办编号'],
['name' => 'source_type', 'label' => '来源类型'],
['name' => 'business_type', 'label' => '业务类型'],
['name' => 'related_object', 'label' => '关联店铺/主体'],
['name' => 'task_content', 'label' => '任务内容'],
['name' => 'owner', 'label' => '责任人'],
['name' => 'collaborator', 'label' => '协同人'],
['name' => 'due_at', 'label' => '截止日期', 'kind' => 'date'],
['name' => 'priority', 'label' => '优先级'],
['name' => 'current_node', 'label' => '当前节点'],
['name' => 'result', 'label' => '处理结果'],
['name' => 'attachment', 'label' => '附件'],
['name' => 'overdue', 'label' => '是否逾期'],
['name' => 'closed_by', 'label' => '关闭人'],
['name' => 'closed_at', 'label' => '关闭日期', 'kind' => 'date'],
],
],
],
[
'slug' => 'warnings',
'title' => '预警页面',
'directory' => [
'icon' => 'warning',
'status' => '尚未同步',
'description' => '集中展示销量、税务、主体、人员、商标和续签风险,并可关联待办编号追踪处理结果。',
'empty' => '预警数据尚未同步。完成规则引擎和预警来源接入后,这里会显示风险记录。',
'fields' => [
['name' => 'warning_number', 'label' => '预警编号'],
['name' => 'warning_type', 'label' => '预警类型'],
['name' => 'risk_level', 'label' => '风险等级'],
['name' => 'related_object', 'label' => '关联对象'],
['name' => 'risk_description', 'label' => '风险描述'],
['name' => 'impact_amount', 'label' => '影响金额', 'kind' => 'number'],
['name' => 'trigger_rule', 'label' => '触发规则'],
['name' => 'triggered_at', 'label' => '触发时间', 'kind' => 'date'],
['name' => 'owner', 'label' => '责任人'],
['name' => 'collaborator', 'label' => '协同人'],
['name' => 'due_at', 'label' => '截止时间', 'kind' => 'date'],
['name' => 'todo_number', 'label' => '待办编号'],
['name' => 'status', 'label' => '处理状态'],
['name' => 'evidence', 'label' => '处理证据'],
['name' => 'closed_by_date', 'label' => '关闭人/日期'],
],
],
],
],
'slug' => 'todos',
'title' => '待办事项',
'icon' => 'task_alt',
'pages' => [],
],
];

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['统一社会信用代码', '公司名称', '纳税人类型', '公司状态', '认缴注册资本(万元)', '注册时间', '法人', '股东', '监事', '开票员', '城市', '注册地址', '经营范围', '基本存款账户信息', '认缴时间']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['公司名称', '公司类型', '当前进度', '是否完成', '完成时间', '办理人']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['市', '主体', '公司类型', 'ERP系统店铺名称', '店铺所属利润中心', '店铺负责人', '部门负责人', '开店时间', '状态', '展示近3个月月度销量', '连续12个月店铺累计销量', '连续12个月主体累计销量', '能否变更主体', '规划', '新主体']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['人员名称', '花名', '职位', '标签', '税务局账号', '税务局密码', '部门', '部门负责人', '身份证号码', '实名手机号', '电话卡保管人', '身份证地址', '公司类型', '合计担任公司数量', '保留担任公司数量', '可担任公司数量']])

View File

@ -0,0 +1,34 @@
@php
$columns = $prototypeColumns ?? [];
@endphp
<div class="biz-card mt-6">
<div class="biz-card-head">
<div class="biz-card-title">
<span class="material-icons-outlined" aria-hidden="true">table_view</span>
<span>{{ $page['title'] ?? '业务页面' }} · 数据列表</span>
</div>
</div>
<div class="biz-table-wrap">
<table class="biz-table">
<thead>
<tr>
<th>#</th>
@foreach ($columns as $column)
<th>{{ $column }}</th>
@endforeach
</tr>
</thead>
<tbody>
<tr>
<td colspan="{{ count($columns) + 1 }}">
<div class="biz-empty">
<span class="material-icons-outlined" aria-hidden="true">inbox</span>
<div>页面结构已接入,业务数据尚未接入。</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['公司名称', 'ERP系统店铺名称', '部门', '店铺负责人', '部门负责人', '账号', '密码', '接替公司', '进度', '是否完成', '完成时间', '办理人']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['平台', '店铺ID', '店铺名称', '店铺主体', '店铺状态', '商标', '商标号', '业务部门', '店铺负责人', '部门负责人', '开店时间', '续签时间', '提现账户']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['ERP系统店铺名称', '店铺ID(唯一值)', '店铺所属利润中心', '店铺负责人', '部门负责人', '开店时间', '状态', '能否变更', '主体', '公司类型', '生效时间', '失效时间', '期间销量', '1月销量', '2月销量', '3月销量', '4月销量', '5月销量', '6月销量', '7月销量', '8月销量', '9月销量', '10月销量', '11月销量', '12月销量']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['商标名称', '商标号', '商标状态', '注册时间', '有效期', '国际分类', '核定使用商品', '最终持有人', '注册地址', '保管部门']])

View File

@ -0,0 +1 @@
@include('business.pages.partials.prototype-table', ['prototypeColumns' => ['商标名称', '商标号', '业务', '进度', '是否完成', '完成时间', '办理人']])

View File

@ -9,7 +9,7 @@ use Tests\Feature\FeatureTestCase;
class NavigationTest extends FeatureTestCase
{
public function testAdminCanUpdateSidebarLabels()
public function testAdminSeesReferenceBusinessNavigation()
{
$this->user->roles()->sync([
Role::where('name', 'admin')->firstOrFail()->id,
@ -24,22 +24,23 @@ class NavigationTest extends FeatureTestCase
->assertOk()
->assertSeeText('侧边栏功能名称');
$this->patch(route('settings.navigation.save'), [
'section_titles' => [
'company-management' => '企业档案',
],
'page_titles' => [
'company-management' => [
'subject-operating-report' => '主体经营',
],
],
])->assertOk();
$navigation = BusinessNavigation::all();
$companyRegistration = collect($navigation[0]['pages'])->firstWhere('slug', 'subject-operating-report');
$this->assertSame('企业档案', $navigation[0]['title']);
$this->assertSame('主体经营', $companyRegistration['title']);
$this->assertSame(
['company-management', 'trademark-management', 'store-management'],
array_slice(array_column($navigation, 'slug'), 0, 3)
);
$this->assertSame(
['people-inventory', 'company-progress', 'company-information', 'entity-report'],
array_column($navigation[0]['pages'], 'slug')
);
$this->assertSame(
['trademark-progress', 'trademark-information'],
array_column($navigation[1]['pages'], 'slug')
);
$this->assertSame(
['store-report', 'store-information', 'store-change-progress'],
array_column($navigation[2]['pages'], 'slug')
);
}
public function testOrderDataAndRefundAreConfiguredBetweenInvoiceAndReceivablesMenus()
@ -63,29 +64,12 @@ class NavigationTest extends FeatureTestCase
$this->assertLessThan($receivablesIndex, $refundIndex);
$this->assertSame('订单数据', $orderData['title']);
$this->assertSame(
['raw-data', 'bill-offset'],
['after-sales-expenses', 'promotion-expenses'],
array_column($orderData['pages'], 'slug')
);
$this->assertSame(
['原始数据', '账单冲减'],
array_column($orderData['pages'], 'title')
);
$this->assertSame(
['after-sales-expenses', 'promotion-expenses'],
array_column($orderData['pages'][0]['tabs'], 'slug')
);
$this->assertSame(
['订单售后费用明细', '商品推广费用明细'],
array_column($orderData['pages'][0]['tabs'], 'title')
);
$this->assertArrayNotHasKey('children', $orderData['pages'][0]);
$this->assertSame(
['bill-offset'],
array_column(array_slice($orderData['pages'], 1), 'slug')
);
$this->assertSame(
['账单冲减'],
array_column(array_slice($orderData['pages'], 1), 'title')
array_column($orderData['pages'], 'title')
);
$this->assertSame('退款', $refund['title']);
$this->assertSame('assignment_return', $refund['icon']);
@ -94,7 +78,7 @@ class NavigationTest extends FeatureTestCase
array_column($refund['pages'], 'slug')
);
$this->assertSame(
['京喜退款数据', '售后(退货退款)'],
['京喜退款数据', '非京喜退款数据'],
array_column($refund['pages'], 'title')
);
}