制造成本分析修改

This commit is contained in:
2026-03-25 14:10:27 +08:00
parent bb66f97b95
commit 4f7466bb29
59 changed files with 3909 additions and 1779 deletions

View File

@@ -1,42 +1,21 @@
<template>
<div style="flex: 1">
<Container :name="title" icon="cockpitItemIcon" size="operatingRevenueBg" topSize="middle">
<!-- 1. 移除 .kpi-content 的固定高度改为自适应 -->
<div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;">
<!-- 新增topItem 专属包裹容器统一控制样式和布局 -->
<div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left">
<div class="topItem-container" style="display: flex; gap: 8px">
<div
v-for="item in sortedIndicators"
:key="item.key"
class="dashboard"
>
<div class="title">
双镀成本·/
{{ item.name }}·{{ item.unit }}
</div>
<div class="line">
<operatingSingleBar :detailData="{
...(relatedMon.双镀成本 || defaultData),
flag: getRateFlag((relatedMon.双镀成本 || defaultData).completeRate, (relatedMon.双镀成本 || defaultData).real, (relatedMon.双镀成本 || defaultData).target)
}" />
</div>
</div>
<div class="dashboard right">
<div class="title">
双镀均价·/
</div>
<div class="line">
<operatingSingleBar :detailData="{
...(relatedMon.双镀均价 || defaultData),
flag: getRateFlag((relatedMon.双镀均价 || defaultData).completeRate, (relatedMon.双镀均价 || defaultData).real, (relatedMon.双镀均价 || defaultData).target)
}" />
</div>
</div>
<div class="dashboard right">
<div class="title">
双镀毛利·万元
</div>
<div class="line">
<operatingSingleBar :detailData="{
...(relatedMon.双镀毛利 || defaultData),
flag: getRateFlag((relatedMon.双镀毛利 || defaultData).completeRate, (relatedMon.双镀毛利 || defaultData).real, (relatedMon.双镀毛利 || defaultData).target)
}" />
<div style='font-size: 16px;text-align: right;padding-right: 5px;'>
<span>完成率:<span style='color: #0B58FF;'>{{item.detailData.completeRate}}%</span></span>
<span style='display: inline-block;margin-left: 10px;'>差值:<span :style="{color:item.detailData.flag>0?'#30B590':'#FF9423'}" >{{item.detailData.diff}}</span></span>
</div>
<operatingSingleBar :detailData="item.detailData"></operatingSingleBar>
</div>
</div>
</div>
@@ -46,8 +25,6 @@
<script>
import Container from './container.vue'
import operatingSingleBar from './operatingSingleBar.vue'
import verticalBarChart from './verticalBarChart.vue'
// import * as echarts from 'echarts'
// import rawItem from './raw-Item.vue'
@@ -81,6 +58,55 @@ export default {
}
}
},
computed: {
indicatorDefs() {
return [
{ key: 'financialCost', name: '双镀成本', unit: '元/㎡'},
{ key: 'financialPrice', name: '双镀均价', unit: '元/㎡'},
{ key: 'financialProfit', name: '双镀毛利', unit: '万元'},
]
},
indicators() {
let _this = this
const fallback = { target: 0, real: 0, completeRate: 0, diff: 0, flag: 0 }
const list = Object.entries(_this.relatedMon).map(([title, data]) => {
return {
title: title,
target: data.target,
real: data.real,
completeRate: data.completeRate,
diff: data.diff
};
});
return _this.indicatorDefs.map(def => {
const data = list.find(item => item && item.title === def.name) || fallback
const detailData = {
...data,
flag: _this.getRateFlag((data || _this.defaultData).completeRate, (data || _this.defaultData).real, (data || _this.defaultData).target),
}
return {
...def,
detailData,
sortValue: Number((data && data.real) ?? 0)
}
})
},
sortedIndicators() {
const unitOrder = ['元/㎡','万元']
const unitRank = (u) => {
const idx = unitOrder.indexOf(u)
return idx === -1 ? 999 : idx
}
return this.indicators.slice().sort((a, b) => {
const ur = unitRank(a.unit) - unitRank(b.unit)
if (ur !== 0) return ur
const vr = (b.sortValue ?? -Infinity) - (a.sortValue ?? -Infinity)
if (vr !== 0) return vr
return String(a.key).localeCompare(String(b.key))
})
},
},
watch: {
relatedMon: {
handler(newValue) {