合并业绩明细万元显示与口径说明整理

This commit is contained in:
yueyang 2026-10-20 09:32:52 +08:00
commit dd9cab671b

View File

@ -739,6 +739,86 @@
display: none;
}
/* 业绩明细:把长口径说明拆成可扫描的规则分组,完整原文默认折叠 */
.receipt-method-guide {
margin: 0 0 1rem;
padding: .9rem 1rem;
border: 1px solid var(--vip-border, #d8d2c7);
border-radius: .75rem;
background: #fff;
}
.receipt-method-guide__grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
gap: .7rem 1.5rem;
}
.receipt-method-guide__section {
min-width: 0;
}
.receipt-method-guide__section h3 {
margin: 0 0 .3rem;
color: var(--vip-text, #171717);
font-size: .75rem;
font-weight: 600;
line-height: 1.4;
}
.receipt-method-guide__section ul {
display: grid;
gap: .12rem;
margin: 0;
padding-left: 1rem;
color: var(--vip-text-muted, #595959);
font-size: .75rem;
line-height: 1.55;
}
.receipt-method-guide__formula {
color: var(--vip-text, #171717);
font-weight: 600;
}
.receipt-method-guide__chips {
display: flex;
flex-wrap: wrap;
gap: .3rem;
}
.receipt-method-guide__chip {
display: inline-flex;
align-items: center;
padding: .08rem .4rem;
border: 1px solid #e8dfcd;
border-radius: .3rem;
background: #fffdf8;
color: var(--vip-text-muted, #595959);
font-size: .6875rem;
line-height: 1.5;
}
.receipt-method-guide__details {
margin-top: .7rem;
padding-top: .65rem;
border-top: 1px solid #eee7da;
}
.receipt-method-guide__details summary {
color: var(--vip-content-accent-dark, #856632);
cursor: pointer;
font-size: .75rem;
font-weight: 600;
}
.receipt-method-guide__details p {
margin: .55rem 0 0;
color: var(--vip-text-muted, #595959);
font-size: .75rem;
line-height: 1.7;
}
/* 业绩明细:店铺收款匹配统计条 */
.receipt-match-summary {
display: flex;
@ -774,6 +854,18 @@
gap: .35rem 1.25rem;
}
.receipt-match-summary__items--amounts {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: .4rem 1.75rem;
}
@media (max-width: 900px) {
.receipt-match-summary__items--amounts {
grid-template-columns: 1fr;
}
}
.receipt-match-summary__item--lead strong {
font-size: 1.25rem;
color: #b80000;
@ -797,6 +889,25 @@
color: var(--vip-text, #1f2937);
}
.receipt-match-summary__item--amount {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: baseline;
gap: .75rem;
}
.receipt-match-summary__item--amount strong {
text-align: right;
white-space: nowrap;
}
.receipt-match-summary__value-unit {
margin-left: .15em;
color: #8a8377;
font-size: .75rem;
font-weight: 500;
}
.receipt-match-summary__item.is-ok strong {
color: var(--vip-success, #137a3c);
}
@ -1076,7 +1187,7 @@
<span class="material-icons-outlined" aria-hidden="true">{{ $directory['icon'] ?? 'table_view' }}</span>
<div>
<strong>{{ $page['title'] ?? $section['title'] }} · 字段结构</strong>
@if (!empty($directory['description']))
@if (!empty($directory['description']) && ($page['slug'] ?? '') !== 'performance-details')
<p class="directory-table-description">{{ $directory['description'] }}</p>
@endif
</div>
@ -1118,6 +1229,57 @@
@endif
@endif
@if (($page['slug'] ?? '') === 'performance-details' && !empty($directory['description']))
<section class="receipt-method-guide" aria-label="业绩明细指标口径">
<div class="receipt-method-guide__grid">
<div class="receipt-method-guide__section">
<h3>匹配口径</h3>
<ul>
<li>一行 = 一个店铺 + 一个线上订单号</li>
<li>商品金额:主单 → 原单行 → 全部行</li>
<li>合单/拆单只挂一次,排除 X0000x 虚拟条码</li>
<li>订单实付取订单级实付,再扣虚拟条码行实付</li>
</ul>
</div>
<div class="receipt-method-guide__section">
<h3>金额字段</h3>
<ul>
<li>收入:总账备注 = 订单收入</li>
<li>优惠/冲减:分别取优惠收入、冲减收入,不计入收入</li>
<li>退款:单独列示,不参与收入和差额</li>
<li>种菜:种菜订单的收入子集,不参与差额</li>
</ul>
</div>
<div class="receipt-method-guide__section">
<h3>差额判定</h3>
<ul>
<li><span class="receipt-method-guide__formula">差额 = 收入 + 优惠 + 冲减 − 订单实付</span></li>
<li>未匹配时按订单实付 = 0 计入差额</li>
<li>原因按顺序命中;无明确原因时标「差额待核实」</li>
<li>卖家实收 / 应付已付能对平的行,差额按 0 计</li>
</ul>
</div>
<div class="receipt-method-guide__section">
<h3>匹配原因</h3>
<div class="receipt-method-guide__chips">
<span class="receipt-method-guide__chip">账单无单号</span>
<span class="receipt-method-guide__chip">单号格式异常</span>
<span class="receipt-method-guide__chip">订单表无此单</span>
<span class="receipt-method-guide__chip">订单无实付金额</span>
<span class="receipt-method-guide__chip">无收款账单</span>
<span class="receipt-method-guide__chip">1688 采销收款</span>
<span class="receipt-method-guide__chip">店铺名不一致</span>
<span class="receipt-method-guide__chip">同单多笔收款</span>
</div>
</div>
</div>
<details class="receipt-method-guide__details">
<summary>查看完整字段与差额判定规则</summary>
<p>{{ $directory['description'] }}</p>
</details>
</section>
@endif
@if (($page['slug'] ?? '') === 'performance-details' && !empty($receiptStats))
{{-- 匹配统计:账单笔数、成功/未匹配笔数、双方收入合计核对结果 --}}
<div class="receipt-match-summary" role="status" aria-label="店铺收款匹配统计">
@ -1134,15 +1296,15 @@
</div>
<div class="receipt-match-summary__group">
<div class="receipt-match-summary__title">金额构成</div>
<div class="receipt-match-summary__items">
<span class="receipt-match-summary__item"><em>账单收入合计</em><strong>{{ number_format((float) $receiptStats['income_total'], 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>优惠金额合计</em><strong>{{ number_format((float) ($receiptStats['discount_total'] ?? 0), 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>冲减金额合计</em><strong>{{ number_format((float) ($receiptStats['offset_total'] ?? 0), 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>退款金额合计</em><strong>{{ number_format((float) ($receiptStats['refund_total'] ?? 0), 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>种菜金额合计</em><strong>{{ number_format((float) ($receiptStats['planting_total'] ?? 0), 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>订单商品金额合计</em><strong>{{ number_format((float) $receiptStats['goods_total'], 2) }}</strong></span>
<span class="receipt-match-summary__item"><em>订单实付金额合计</em><strong>{{ number_format((float) ($receiptStats['paid_total'] ?? 0), 2) }}</strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--lead"><em>差额合计</em><strong>{{ number_format((float) $receiptStats['difference_total'], 2) }}</strong></span>
<div class="receipt-match-summary__items receipt-match-summary__items--amounts">
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>账单收入合计</em><strong>{{ number_format((float) $receiptStats['income_total'] / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>订单商品金额合计</em><strong>{{ number_format((float) $receiptStats['goods_total'] / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>订单实付金额合计</em><strong>{{ number_format((float) ($receiptStats['paid_total'] ?? 0) / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>优惠金额合计</em><strong>{{ number_format((float) ($receiptStats['discount_total'] ?? 0) / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>冲减金额合计</em><strong>{{ number_format((float) ($receiptStats['offset_total'] ?? 0) / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>退款金额合计</em><strong>{{ number_format((float) ($receiptStats['refund_total'] ?? 0) / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount"><em>种菜金额合计</em><strong>{{ number_format((float) ($receiptStats['planting_total'] ?? 0) / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
<span class="receipt-match-summary__item receipt-match-summary__item--amount receipt-match-summary__item--lead"><em>差额合计</em><strong>{{ number_format((float) $receiptStats['difference_total'] / 10000, 2) }}<span class="receipt-match-summary__value-unit">万</span></strong></span>
</div>
</div>
</div>