fix(profit-caliber): 博海口径 §4-1/§4-2/§4-5 落地 —— 固定成本仅借方 + 6403 进变动 + 财务收益单列 + 批次备注
ci/woodpecker/push/main Pipeline was successful

ASK-20261014-04(任总 2026-10-14 11:20「放行4」)批后口径:
- §4-1 博海固定成本弃净额:6601/6602/6603 仅借方(133.98 万,2026-01..09);2026-03 单月由 -9.02 万转正;
  6603 贷方(现金折扣收益 64.40 万)改 finance_income_terms 单列备查,不进固定成本/末行/勾稽。
- §4-2 博海变动成本追加 6403 营业税金及附加(530.17 万)。
- §4-3/§4-4 维持现行(酣客收入/边际贡献基数不动)。
- §4-5 管理利润表页加「数据批次/导入时刻」纯展示备注(import_logs)。
- 口径唯一源仍为 bep_caliber.ENTITY_CALIBERS;报表/卡面/派生器一律经 fixed_cost_spec() 解析(读口写口一致)。
This commit is contained in:
Hermes CI Fix
2026-10-16 12:32:52 +08:00
parent ff2d92ba54
commit 289cc8f2cc
7 changed files with 228 additions and 50 deletions
+39 -3
View File
@@ -27,7 +27,7 @@
<!-- ════ 报表1:管理利润表 ════ -->
<el-tab-pane label="💰 管理利润表" name="profit">
<div v-loading="loading">
<div class="report-desc">基于管理会计视角的利润结构分析:收入 → 变动成本 → 边际贡献 → 固定成本 → 息税前利润</div>
<div class="report-desc">{{ profitDesc || '基于管理会计视角的利润结构分析:营业收入 → 变动成本 → 边际贡献 → 固定成本 → 营业利润(真实科目取数)' }}</div>
<el-table :data="profitItems" border stripe size="small" style="width:100%;margin-top:12px;" :summary-method="profitSummary" show-summary>
<el-table-column prop="name" label="项目" width="200">
<template #default="{ row }">
@@ -61,6 +61,25 @@
</template>
</el-table-column>
</el-table>
<!-- 4-5 备注(纯展示,不参与任何计算):数据批次 / 导入时刻 -->
<div v-if="profitBatches.length" style="margin-top:10px;font-size:12px;color:#909399;line-height:1.8;">
<span>数据批次 / 导入时刻:</span>
<span v-for="(b, i) in profitBatches" :key="(b.batch || 'b') + '-' + i">
<span style="display:inline-block;margin-left:8px;padding:0 6px;border:1px solid #e4e7ed;border-radius:3px;">
{{ b.batch }} | {{ b.rows }} 行 | 导入 {{ b.imported_at }}
</span>
</span>
</div>
<!-- 财务收益(单列备查,不进固定成本、不参与勾稽)—— 仅口径注册了该项时展示 -->
<div v-if="profitFinanceIncome && profitFinanceIncome.value != null"
style="margin-top:6px;font-size:12px;color:#909399;line-height:1.8;">
{{ profitFinanceIncome.name }}(备查,不计入上行):¥ {{ Number(profitFinanceIncome.value).toLocaleString() }} 万元
</div>
<!-- 勾稽自检:不平/取数缺行 ⇒ 显式标红,不静默 -->
<div v-if="profitChecks && profitChecks.balanced === false"
style="margin-top:10px;padding:8px 12px;border:1px solid #f56c6c;border-radius:4px;background:#fef0f0;color:#f56c6c;font-size:12px;line-height:1.8;">
<div>{{ profitChecks.note || '⚠️ 勾稽自检未通过:收入 − 变动成本 − 固定成本 ≠ 末行' }}</div>
</div>
</div>
</el-tab-pane>
@@ -649,6 +668,10 @@ function getEntityId() {
// ── 报表1:管理利润表 ──
const profitItems = ref<any[]>([])
const profitDesc = ref('')
const profitBatches = ref<any[]>([]) // 4-5 备注(纯展示:数据批次/导入时刻)
const profitChecks = ref<any>(null) // 勾稽自检(reconciliation:balanced/diff/note)
const profitFinanceIncome = ref<any>(null) // 财务收益(§4-1 单列备查)
function profitSummary(param: any) {
const sums: string[] = ['合计']
@@ -859,8 +882,21 @@ function onPeriodChange() {
async function loadProfit() {
try {
const r = await api.get('/reports/profit-summary', { params: { period: reportPeriod.value, entity_id: getEntityId() } })
profitItems.value = (r as any)?.items || []
} catch { profitItems.value = [] }
const d: any = (r as any) || {}
profitItems.value = d.items || []
profitDesc.value = d.desc || ''
// 以下三项均**纯展示**,不参与任何计算:
// 4-5 数据批次 / 导入时刻备注 · 勾稽自检(不平显式标红)· 财务收益单列备查
profitBatches.value = d.data_batches || []
profitChecks.value = d.reconciliation || null
profitFinanceIncome.value = d.finance_income || null
} catch {
profitItems.value = []
profitDesc.value = ''
profitBatches.value = []
profitChecks.value = null
profitFinanceIncome.value = null
}
}
async function loadBudget() {