This commit is contained in:
‘937886381’
2026-01-09 17:53:34 +08:00
parent b76f3bfd37
commit b491f24126
50 changed files with 256 additions and 149 deletions

View File

@@ -5,11 +5,11 @@ ENV = 'development'
VUE_APP_TITLE = 洛玻集团驾驶舱 VUE_APP_TITLE = 洛玻集团驾驶舱
# 芋道管理系统/开发环境 # 芋道管理系统/开发环境
# VUE_APP_BASE_API = 'http://172.16.32.18:7070' VUE_APP_BASE_API = 'http://172.16.32.18:7070'
# VUE_APP_BASE_API = 'http://172.16.32.95:7070' # VUE_APP_BASE_API = 'http://172.16.32.95:7070'
# VUE_APP_BASE_API = 'http://172.16.33.83:7070' # VUE_APP_BASE_API = 'http://172.16.33.83:7070'
VUE_APP_BASE_API = 'http://192.168.0.35:7070' # VUE_APP_BASE_API = 'http://192.168.0.35:7070'
# 路由懒加载 # 路由懒加载

View File

@@ -64,7 +64,7 @@ export default {
selectedProfit: null, // 选中的名称初始为null selectedProfit: null, // 选中的名称初始为null
profitOptions: [ profitOptions: [
'毛利率', '毛利率',
'收入', '营业收入',
'全成本', '全成本',
] ]
}; };

View File

@@ -6,7 +6,7 @@
<!-- 累计指标1 --> <!-- 累计指标1 -->
<div class="dashboard left" @click="handleDashboardClick('/operatingRevenue/operatingRevenueBase')"> <div class="dashboard left" @click="handleDashboardClick('/operatingRevenue/operatingRevenueBase')">
<div class="title"> <div class="title">
收入·万元 营业收入·万元
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="ytdIncomeData"></operatingSingleBar> <operatingSingleBar :detailData="ytdIncomeData"></operatingSingleBar>
@@ -39,7 +39,7 @@ export default {
type: Array, type: Array,
// 正确写法:默认值通过 factory 函数返回(才能调用 default() // 正确写法:默认值通过 factory 函数返回(才能调用 default()
default: () => [ default: () => [
{ title: "收入", budget: 0, real: 0, rate: 0, diff: 0 }, { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0 },
{ title: "累计全成本", budget: 0, real: 0, rate: 0, diff: 0 } { title: "累计全成本", budget: 0, real: 0, rate: 0, diff: 0 }
] ]
}, },
@@ -58,7 +58,7 @@ export default {
}, },
data() { data() {
return { return {
ytdIncomeData: { title: "收入", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 }, ytdIncomeData: { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 },
ytdCostData: { title: "累计全成本", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 } ytdCostData: { title: "累计全成本", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 }
} }
}, },
@@ -106,7 +106,7 @@ getRateFlag(rate, real, target) {
: this.$props.monthAnalysis; // 直接取 props 默认值 : this.$props.monthAnalysis; // 直接取 props 默认值
// 提取累计收入第0项、累计全成本第1项数据 // 提取累计收入第0项、累计全成本第1项数据
const incomeItem = validData[0] || { title: "收入", budget: 0, real: 0, rate: 0, diff: 0 }; const incomeItem = validData[0] || { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0 };
const costItem = validData[1] || { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 }; const costItem = validData[1] || { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 };
// 整合flag字段 // 整合flag字段

View File

@@ -6,7 +6,7 @@
<!-- 收入模块传递整合了flag的incomeData --> <!-- 收入模块传递整合了flag的incomeData -->
<div class="dashboard left" @click="handleDashboardClick('/operatingRevenue/operatingRevenueBase')"> <div class="dashboard left" @click="handleDashboardClick('/operatingRevenue/operatingRevenueBase')">
<div class="title"> <div class="title">
收入·万元 营业收入·万元
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="incomeData"></operatingSingleBar> <operatingSingleBar :detailData="incomeData"></operatingSingleBar>
@@ -15,7 +15,7 @@
<!-- 全成本模块传递整合了flag的totalCostData --> <!-- 全成本模块传递整合了flag的totalCostData -->
<div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')"> <div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')">
<div class="title"> <div class="title">
全成本· 全成本·/
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="totalCostData"></operatingSingleBar> <operatingSingleBar :detailData="totalCostData"></operatingSingleBar>
@@ -40,7 +40,7 @@ export default {
type: Array, type: Array,
// 默认值:收入、全成本两个对象,结构与原数据一致 // 默认值:收入、全成本两个对象,结构与原数据一致
default: () => [ default: () => [
{ title: "收入", budget: 0, real: 0, rate: 0, diff: 0 }, { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0 },
{ title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 } { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 }
] ]
}, },
@@ -61,7 +61,7 @@ export default {
return { return {
chart: null, chart: null,
// 初始化收入/全成本数据包含flag字段 // 初始化收入/全成本数据包含flag字段
incomeData: { title: "收入", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 }, incomeData: { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 },
totalCostData: { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 } totalCostData: { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0, flag: 0 }
} }
}, },
@@ -90,18 +90,18 @@ export default {
}) })
}, },
// 保留原flag判断逻辑≥100返回1<100返回0 // 保留原flag判断逻辑≥100返回1<100返回0
getRateFlag(rate, real, target) { getRateFlag(rate, real, target) {
if (isNaN(rate) || rate === null || rate === undefined) return 0; if (isNaN(rate) || rate === null || rate === undefined) return 0;
// 1. 完成率 >= 100 => 达标 // 1. 完成率 >= 100 => 达标
if (rate >= 100) return 1; if (rate >= 100) return 1;
// 2. 完成率 = 0 且 (目标值=0 或 实际值=目标值=0) => 达标 // 2. 完成率 = 0 且 (目标值=0 或 实际值=目标值=0) => 达标
if (rate === 0 && target === 0) return 1; if (rate === 0 && target === 0) return 1;
// 其他情况 => 未达标 // 其他情况 => 未达标
return 0; return 0;
}, },
updateChart(data) { updateChart(data) {
// 数据兜底确保是数组且长度≥2 // 数据兜底确保是数组且长度≥2
@@ -110,7 +110,7 @@ getRateFlag(rate, real, target) {
: this.$props.ytdAnalysis.default(); : this.$props.ytdAnalysis.default();
// 提取收入第0项、全成本第1项数据 // 提取收入第0项、全成本第1项数据
const incomeItem = validData[0] || { title: "收入", budget: 0, real: 0, rate: 0, diff: 0 }; const incomeItem = validData[0] || { title: "营业收入", budget: 0, real: 0, rate: 0, diff: 0 };
const totalCostItem = validData[1] || { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 }; const totalCostItem = validData[1] || { title: "全成本", budget: 0, real: 0, rate: 0, diff: 0 };
// 整合flag字段到收入/全成本数据中 // 整合flag字段到收入/全成本数据中

View File

@@ -6,7 +6,7 @@
<!-- 领用量模块传递整合了flag的useData --> <!-- 领用量模块传递整合了flag的useData -->
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
领用量· 领用量·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="useData"></operatingSingleBar> <operatingSingleBar :detailData="useData"></operatingSingleBar>
@@ -15,7 +15,7 @@
<!-- 加工产量模块传递整合了flag的processData --> <!-- 加工产量模块传递整合了flag的processData -->
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
加工产量· 加工产量·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="processData"></operatingSingleBar> <operatingSingleBar :detailData="processData"></operatingSingleBar>

View File

@@ -6,7 +6,7 @@
<!-- 领用量模块传递整合了flag的useData --> <!-- 领用量模块传递整合了flag的useData -->
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
领用量· 领用量·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="useData"></operatingSingleBar> <operatingSingleBar :detailData="useData"></operatingSingleBar>
@@ -15,7 +15,7 @@
<!-- 加工产量模块传递整合了flag的processData --> <!-- 加工产量模块传递整合了flag的processData -->
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
加工产量· 加工产量·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="processData"></operatingSingleBar> <operatingSingleBar :detailData="processData"></operatingSingleBar>

View File

@@ -18,7 +18,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
运费· 运费·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -18,7 +18,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
运费· 运费·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -15,7 +15,7 @@
<!-- 单价模块直接传递整合了flag的unitPriceData --> <!-- 单价模块直接传递整合了flag的unitPriceData -->
<div class="dashboard right" @click="handleDashboardClick('/unitPriceAnalysis/unitPriceAnalysisBase')"> <div class="dashboard right" @click="handleDashboardClick('/unitPriceAnalysis/unitPriceAnalysisBase')">
<div class="title"> <div class="title">
单价· 单价·/
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="unitPriceData"></operatingSingleBar> <operatingSingleBar :detailData="unitPriceData"></operatingSingleBar>

View File

@@ -15,7 +15,7 @@
<!-- 单价模块直接传递整合了flag的unitPriceData --> <!-- 单价模块直接传递整合了flag的unitPriceData -->
<div class="dashboard right" @click="handleDashboardClick('/unitPriceAnalysis/unitPriceAnalysisBase')"> <div class="dashboard right" @click="handleDashboardClick('/unitPriceAnalysis/unitPriceAnalysisBase')">
<div class="title"> <div class="title">
单价· 单价·/
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="unitPriceData"></operatingSingleBar> <operatingSingleBar :detailData="unitPriceData"></operatingSingleBar>

View File

@@ -37,7 +37,7 @@
gap: 12px; gap: 12px;
grid-template-columns: 1624px; grid-template-columns: 1624px;
"> ">
<relatedIndicatorsAnalysis :dateData="dateData" :factory="factory" :relatedData="relatedData" :title="'相关指标分析·万元'" /> <relatedIndicatorsAnalysis :dateData="dateData" :factory="factory" :relatedData="relatedData" :title="'相关指标分析'" />
</div> </div>
</div> </div>

View File

@@ -65,7 +65,7 @@ export default {
'经营性利润', '经营性利润',
'销量', '销量',
'单价', '单价',
'成本', '制造成本',
'管理费用', '管理费用',
'销售费用', '销售费用',
'财务费用', '财务费用',

View File

@@ -66,7 +66,7 @@ export default {
*/ */
factoryData() { // 整合原始数据 + 计算flag factoryData() { // 整合原始数据 + 计算flag
return { return {
completeRate: this.monData.proportion ? Number(this.monData.proportion).toFixed(2) : 0, completeRate: this.monData.proportion ? Number(this.monData.proportion) : 0,
diff: this.monData.diffValue, diff: this.monData.diffValue,
real: this.monData.value, real: this.monData.value,
target: this.monData.targetValue, target: this.monData.targetValue,

View File

@@ -61,8 +61,8 @@ export default {
default: () => [], default: () => [],
}, },
dateData: { dateData: {
type: Array, type: Object,
default: () => [], default: () => {},
}, },
}, },
data() { data() {

View File

@@ -61,8 +61,8 @@ export default {
default: () => [], default: () => [],
}, },
dateData: { dateData: {
type: Array, type: Object,
default: () => [], default: () => {},
}, },
}, },
data() { data() {

View File

@@ -23,7 +23,7 @@ export default {
chartD() { chartD() {
// 背景图片路径(若不需要可注释) // 背景图片路径(若不需要可注释)
// const bgImageUrl = require('@/assets/img/labelBg.png'); // const bgImageUrl = require('@/assets/img/labelBg.png');
const rate = this.detailData?.proportion ? Number(this.detailData?.proportion).toFixed(2) : 0 const rate = this.detailData?.proportion ? Number(this.detailData?.proportion) : 0
const diff = this.detailData?.diffValue || 0 const diff = this.detailData?.diffValue || 0
console.log('diff', diff); console.log('diff', diff);

View File

@@ -124,7 +124,7 @@ export default {
}, },
// 3. 成本数据:从当前激活数据集中筛选 // 3. 成本数据:从当前激活数据集中筛选
costData() { costData() {
return (this.activeData.find(item => item.name === "成本")) || { return (this.activeData.find(item => item.name === "制造成本")) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,

View File

@@ -69,7 +69,7 @@ export default {
*/ */
factoryData() { // 整合原始数据 + 计算flag factoryData() { // 整合原始数据 + 计算flag
return { return {
completeRate: Number(this.totalData.proportion).toFixed(2), completeRate: Number(this.totalData.proportion),
diff: this.totalData.diffValue, diff: this.totalData.diffValue,
real: this.totalData.value, real: this.totalData.value,
target: this.totalData.targetValue, target: this.totalData.targetValue,

View File

@@ -6,7 +6,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
大宗类· 大宗类·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -17,7 +17,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
石料类·/ 石料类·万元
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -28,7 +28,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
材料类· 材料类·万元
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -39,7 +39,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
动力类· 动力类·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -50,7 +50,7 @@
</div> </div>
<div class="dashboard right" @click="handleRoute('/salesVolumeAnalysis/doublePlatedBase')"> <div class="dashboard right" @click="handleRoute('/salesVolumeAnalysis/doublePlatedBase')">
<div class="title"> <div class="title">
技术服务类· 技术服务类·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -199,9 +199,10 @@ export default {
endTime: this.dateData.endTime, endTime: this.dateData.endTime,
// index: this.index, // index: this.index,
// sort: 1, // sort: 1,
trendName: this.trendName,
trendName: this.$route.query.name ? '原料' + this.$route.query.name + this.trendName : '原料硅砂采购单价',
analysisObject: [ analysisObject: [
this.$route.query.name ? this.$route.query.name + '成本' : '硅砂成本' this.$route.query.name ? '原料' + this.$route.query.name : '原料硅砂'
], ],
// paramList: ['制造成本', '财务费用', '销售费用', '管理费用', '运费'], // paramList: ['制造成本', '财务费用', '销售费用', '管理费用', '运费'],
levelId: this.factory, levelId: this.factory,
@@ -210,20 +211,44 @@ export default {
// 调用接口 // 调用接口
getSingleMaterialAnalysis(requestParams).then((res) => { getSingleMaterialAnalysis(requestParams).then((res) => {
this.monData = res.data.currentMonthData.find(item => { this.monData = res.data.currentMonthData.find(item => {
return item.name === "硅砂成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === '原料' + this.$route.query.name;
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '原料硅砂';
}
}); });
console.log('this.monData', this.monData); console.log('this.monData', this.monData, this.$route.query.name ? '原料' + this.$route.query.name : '原料硅砂');
this.totalData = res.data.totalMonthData.find(item => { this.totalData = res.data.totalMonthData.find(item => {
return item.name === "硅砂成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === '原料' + this.$route.query.name;
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '原料硅砂';
}
}); });
// this.relatedMon = res.data.relatedMon // this.relatedMon = res.data.relatedMon
this.relatedData = { this.relatedData = {
relatedMon: res.data.currentMonthData.filter(item => { relatedMon: res.data.currentMonthData.filter(item => {
return item.name !== "硅砂成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== '原料' + this.$route.query.name;
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name !== '原料硅砂';
}
}), // 兜底月度数据 }), // 兜底月度数据
relatedTotal: res.data.totalMonthData.filter(item => { relatedTotal: res.data.totalMonthData.filter(item => {
return item.name !== "硅砂成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== '原料' + this.$route.query.name;
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name !== '原料硅砂';
}
}) // 兜底累计数据 }) // 兜底累计数据
} }

View File

@@ -199,7 +199,7 @@ export default {
endTime: this.dateData.endTime, endTime: this.dateData.endTime,
// index: this.index, // index: this.index,
// sort: 1, // sort: 1,
trendName: this.trendName, trendName: this.trendName +'成本',
analysisObject: [ analysisObject: [
"原片燃料成本", "原片燃料成本",
], ],

View File

@@ -189,7 +189,7 @@ export default {
changeItem(item) { changeItem(item) {
console.log('item', item); console.log('item', item);
this.trendName = item this.trendName = item
this.getData() this.getData()
}, },
getData() { getData() {

View File

@@ -96,7 +96,7 @@ export default {
totalData: {}, totalData: {},
trend: [], trend: [],
relatedData: {}, relatedData: {},
trendName: '加工包材成本', trendName: '包材成本',
}; };
}, },
@@ -186,7 +186,7 @@ export default {
// sort: 1, // sort: 1,
trendName: this.trendName, trendName: this.trendName,
analysisObject: [ analysisObject: [
'加工包材成本' '包材成本'
], ],
// paramList: ['制造成本', '财务费用', '销售费用', '管理费用', '运费'], // paramList: ['制造成本', '财务费用', '销售费用', '管理费用', '运费'],
levelId: this.factory, levelId: this.factory,

View File

@@ -209,20 +209,44 @@ export default {
// 调用接口 // 调用接口
getSingleMaterialAnalysis(requestParams).then((res) => { getSingleMaterialAnalysis(requestParams).then((res) => {
this.monData = res.data.currentMonthData.find(item => { this.monData = res.data.currentMonthData.find(item => {
return item.name === "天然气成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === this.$route.query.name + '成本';
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '天然气成本';
}
}); });
console.log('this.monData', this.monData); console.log('this.monData', this.monData);
this.totalData = res.data.totalMonthData.find(item => { this.totalData = res.data.totalMonthData.find(item => {
return item.name === "天然气成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === this.$route.query.name + '成本';
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '天然气成本';
}
}); });
// this.relatedMon = res.data.relatedMon // this.relatedMon = res.data.relatedMon
this.relatedData = { this.relatedData = {
relatedMon: res.data.currentMonthData.filter(item => { relatedMon: res.data.currentMonthData.filter(item => {
return item.name !== "天然气成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== this.$route.query.name + '成本';
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name !== '天然气成本';
}
}), // 兜底月度数据 }), // 兜底月度数据
relatedTotal: res.data.totalMonthData.filter(item => { relatedTotal: res.data.totalMonthData.filter(item => {
return item.name !== "天然气成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== this.$route.query.name + '成本';
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name !== '天然气成本';
}
}) // 兜底累计数据 }) // 兜底累计数据
} }

View File

@@ -198,7 +198,7 @@ export default {
endTime: this.dateData.endTime, endTime: this.dateData.endTime,
// index: this.index, // index: this.index,
// sort: 1, // sort: 1,
trendName: this.trendName, trendName: this.$route.query.name ? this.$route.query.name + '成本' + this.trendName : '镀膜液成本' + this.trendName,
analysisObject: [ analysisObject: [
this.$route.query.name ? this.$route.query.name + '成本' : '镀膜液成本' this.$route.query.name ? this.$route.query.name + '成本' : '镀膜液成本'
], ],
@@ -209,20 +209,44 @@ export default {
// 调用接口 // 调用接口
getSingleMaterialAnalysis(requestParams).then((res) => { getSingleMaterialAnalysis(requestParams).then((res) => {
this.monData = res.data.currentMonthData.find(item => { this.monData = res.data.currentMonthData.find(item => {
return item.name === "镀膜液成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === this.$route.query.name + '成本'
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '镀膜液成本';
}
}); });
console.log('this.monData', this.monData); console.log('this.monData', this.monData);
this.totalData = res.data.totalMonthData.find(item => { this.totalData = res.data.totalMonthData.find(item => {
return item.name === "镀膜液成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name === this.$route.query.name + '成本'
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '镀膜液成本';
}
}); });
// this.relatedMon = res.data.relatedMon // this.relatedMon = res.data.relatedMon
this.relatedData = { this.relatedData = {
relatedMon: res.data.currentMonthData.filter(item => { relatedMon: res.data.currentMonthData.filter(item => {
return item.name !== "镀膜液成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== this.$route.query.name + '成本'
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name === '镀膜液成本';
}
}), // 兜底月度数据 }), // 兜底月度数据
relatedTotal: res.data.totalMonthData.filter(item => { relatedTotal: res.data.totalMonthData.filter(item => {
return item.name !== "镀膜液成本"; if (this.$route.query.name) {
// 如果有查询参数,查找 "原料" + 查询参数 的项
return item.name !== this.$route.query.name + '成本'
} else {
// 如果没有查询参数,查找 name 为 "原料硅砂" 的项
return item.name !== '镀膜液成本';
}
}) // 兜底累计数据 }) // 兜底累计数据
} }

View File

@@ -94,7 +94,7 @@ export default {
totalData: {}, totalData: {},
trend: [], trend: [],
relatedData: {}, relatedData: {},
trendName: '备品机物料', trendName: '备品机物料',
}; };
}, },

View File

@@ -67,7 +67,7 @@ export default {
'燃料成本', '燃料成本',
'电成本', '电成本',
'人工成本', '人工成本',
'制造成本', '制造费用',
] ]
}; };
}, },

View File

@@ -64,7 +64,7 @@ export default {
profitOptions: [ profitOptions: [
'原片制造费用成本', '原片制造费用成本',
'包材', '包材',
'备品机物料', '备品机物料',
'折旧', '折旧',
'其他', '其他',
] ]

View File

@@ -63,7 +63,7 @@ export default {
selectedProfit: '制造费用', // 选中的名称初始为null selectedProfit: '制造费用', // 选中的名称初始为null
profitOptions: [ profitOptions: [
'制造费用', '制造费用',
'备品机物料', '备品机物料',
'折旧', '折旧',
'其他', '其他',
] ]

View File

@@ -64,9 +64,11 @@ export default {
/** /**
* 自动提取monData中的工厂数据并新增flag字段 * 自动提取monData中的工厂数据并新增flag字段
*/ */
factoryData() { // 整合原始数据 + 计算flag factoryData() {
console.log(this.monData,'monData');
// 整合原始数据 + 计算flag
return { return {
completeRate: this.monData.proportion ? Number(this.monData.proportion).toFixed(2) : 0, completeRate: this.monData.proportion ? Number(this.monData.proportion) : 0,
diff: this.monData.diffValue, diff: this.monData.diffValue,
real: this.monData.value, real: this.monData.value,
target: this.monData.targetValue, target: this.monData.targetValue,

View File

@@ -5,9 +5,9 @@
<div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;"> <div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;">
<!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 --> <!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 -->
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left" @click="handleDashboardClick('备品机物料')"> <div class="dashboard left" @click="handleDashboardClick('备品机物料')">
<div class="title"> <div class="title">
备品机物料·/ 备品机物料·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定备件丶机物料对应数据新增数据绑定样式不变 --> <!-- 绑定备件丶机物料对应数据新增数据绑定样式不变 -->
@@ -76,7 +76,7 @@ export default {
computed: { computed: {
// 1. 备件丶机物料数据:精准筛选对应名称数据,兜底值统一 // 1. 备件丶机物料数据:精准筛选对应名称数据,兜底值统一
sparePartsData() { sparePartsData() {
return this.relatedData.find(item => (item.name || '').includes('备品机物料')) || { return this.relatedData.find(item => (item.name || '').includes('备品机物料')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,

View File

@@ -23,9 +23,11 @@ export default {
return ['预算', '实际']; return ['预算', '实际'];
}, },
chartD() { chartD() {
console.log(this.detailData,'detailData');
// 背景图片路径(若不需要可注释) // 背景图片路径(若不需要可注释)
// const bgImageUrl = require('@/assets/img/labelBg.png'); // const bgImageUrl = require('@/assets/img/labelBg.png');
const rate = this.detailData?.proportion ? Number(this.detailData?.proportion).toFixed(2) : 0 const rate = this.detailData?.proportion ? Number(this.detailData?.proportion) : 0
const diff = this.detailData?.diffValue || 0 const diff = this.detailData?.diffValue || 0
console.log('diff', diff); console.log('diff', diff);

View File

@@ -7,28 +7,28 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<!-- 天然气组件绑定对应筛选数据点击传递物料名和路由 --> <!-- 天然气组件绑定对应筛选数据点击传递物料名和路由 -->
<div class="dashboard left" @click="handleDashboardClick('天然气', 'singleCombustible')"> <div class="dashboard left" @click="handleDashboardClick('天然气', 'singleCombustible')">
<div class="title">天然气·/</div> <div class="title">天然气·/</div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="naturalGasData"></operatingSingleBar> <operatingSingleBar :detailData="naturalGasData"></operatingSingleBar>
</div> </div>
</div> </div>
<!-- LNG液化天然气组件绑定对应筛选数据 --> <!-- LNG液化天然气组件绑定对应筛选数据 -->
<div class="dashboard right" @click="handleDashboardClick('LNG液化天然气', 'singleCombustible')"> <div class="dashboard right" @click="handleDashboardClick('LNG液化天然气', 'singleCombustible')">
<div class="title">LNG液化天然气·/</div> <div class="title">LNG液化天然气·/</div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="lngData"></operatingSingleBar> <operatingSingleBar :detailData="lngData"></operatingSingleBar>
</div> </div>
</div> </div>
<!-- 重油组件绑定对应筛选数据 --> <!-- 重油组件绑定对应筛选数据 -->
<div class="dashboard right" @click="handleDashboardClick('重油', 'singleCombustible')"> <div class="dashboard right" @click="handleDashboardClick('重油', 'singleCombustible')">
<div class="title">重油·/</div> <div class="title">重油·/</div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="heavyOilData"></operatingSingleBar> <operatingSingleBar :detailData="heavyOilData"></operatingSingleBar>
</div> </div>
</div> </div>
<!-- 水组件绑定对应筛选数据 --> <!-- 水组件绑定对应筛选数据 -->
<div class="dashboard right" @click="handleDashboardClick('水', 'singleCombustible')"> <div class="dashboard right" @click="handleDashboardClick('水', 'singleCombustible')">
<div class="title">·/</div> <div class="title">·/</div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="waterData"></operatingSingleBar> <operatingSingleBar :detailData="waterData"></operatingSingleBar>
</div> </div>

View File

@@ -1,22 +1,23 @@
<template> <template>
<div style="flex: 1"> <div style="flex: 1">
<Container :name="title" icon="cockpitItemIcon" size="opLargeBg" topSize="large"> <Container :isShowTab="true" :name="title" icon="cockpitItemIcon" size="opLargeBg" topSize="large"
@tabChange="handleChange">
<!-- 1. 移除 .kpi-content 的固定高度改为自适应样式不变仅保留原有结构 --> <!-- 1. 移除 .kpi-content 的固定高度改为自适应样式不变仅保留原有结构 -->
<div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;"> <div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;">
<!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 --> <!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 -->
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left" @click="handleDashboardClick('包材')"> <div class="dashboard left" @click="handleDashboardClick('包材')">
<div class="title"> <div class="title">
包材·/ 包材·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
<operatingSingleBar :detailData="packagingData"></operatingSingleBar> <operatingSingleBar :detailData="packagingData"></operatingSingleBar>
</div> </div>
</div> </div>
<div class="dashboard right" @click="handleDashboardClick('备品机物料')"> <div class="dashboard right" @click="handleDashboardClick('备品机物料')">
<div class="title"> <div class="title">
备品机物料·/ 备品机物料·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
@@ -25,7 +26,7 @@
</div> </div>
<div class="dashboard right" @click="handleDashboardClick('折旧')"> <div class="dashboard right" @click="handleDashboardClick('折旧')">
<div class="title"> <div class="title">
折旧·/ 折旧·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
@@ -34,7 +35,7 @@
</div> </div>
<div class="dashboard right" @click="handleDashboardClick('其他')"> <div class="dashboard right" @click="handleDashboardClick('其他')">
<div class="title"> <div class="title">
其他·/ 其他·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
@@ -58,9 +59,9 @@ export default {
components: { Container, operatingSingleBar }, components: { Container, operatingSingleBar },
// mixins: [resize], // mixins: [resize],
props: { props: {
itemData: { // 接收父组件传递的设备数据数组 relatedData: { // 接收父组件传递的设备数据数组
type: Array, type: Object,
default: () => [] // 默认空数组,避免报错 default: () => { } // 默认空数组,避免报错
}, },
dateData: { dateData: {
type: Object, type: Object,
@@ -82,22 +83,25 @@ export default {
data() { data() {
return { return {
chart: null, chart: null,
activeMaterial: '' // 新增:记录选中物料状态,和第二个组件逻辑对齐,样式不变 activeData: this.relatedData.relatedMon || [], // 核心激活数据集(默认月度,与第二个组件一致)
activeMaterial: '' // 记录选中物料状态,与第二个组件统一
} }
}, },
watch: { watch: {
itemData: { // 对齐第二个组件深度监听relatedData变化,同步更新激活数据集
handler(newValue, oldValue) { relatedData: {
// this.updateChart() handler(newVal) {
this.activeData = newVal.relatedMon || [];
}, },
deep: true // 若对象内属性变化需触发,需加 deep: true原有逻辑保留样式不变 immediate: true, // 挂载时立即执行
deep: true // 深度监听对象内部变化
} }
}, },
// 新增4个指标对应的计算属性精准筛选itemData中的数据仅数据逻辑样式不变 // 新增4个指标对应的计算属性精准筛选itemData中的数据仅数据逻辑样式不变
computed: { computed: {
// 1. 包材数据从itemData中筛选兜底值统一 // 1. 包材数据从itemData中筛选兜底值统一
packagingData() { packagingData() {
return this.itemData.find(item => (item.name || '').includes('包材')) || { return this.activeData.find(item => (item.name || '').includes('包材')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,
@@ -106,7 +110,7 @@ export default {
}, },
// 2. 备件丶机物料数据:精准筛选 // 2. 备件丶机物料数据:精准筛选
sparePartsData() { sparePartsData() {
return this.itemData.find(item => (item.name || '').includes('备品机物料')) || { return this.activeData.find(item => (item.name || '').includes('备品机物料')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,
@@ -115,7 +119,7 @@ export default {
}, },
// 3. 折旧数据:精准筛选 // 3. 折旧数据:精准筛选
depreciationData() { depreciationData() {
return this.itemData.find(item => (item.name || '').includes('折旧')) || { return this.activeData.find(item => (item.name || '').includes('折旧')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,
@@ -124,7 +128,7 @@ export default {
}, },
// 4. 其他数据:精准筛选 // 4. 其他数据:精准筛选
otherData() { otherData() {
return this.itemData.find(item => (item.name || '').includes('其他')) || { return this.activeData.find(item => (item.name || '').includes('其他')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,
@@ -137,6 +141,17 @@ export default {
// this.$nextTick(() => this.updateChart()) // this.$nextTick(() => this.updateChart())
}, },
methods: { methods: {
handleChange(value) {
console.log('Tab 切换值:', value);
// 根据tab值更新激活数据集
if (value === 'month') {
this.activeData = this.relatedData.relatedMon || [];
} else {
this.activeData = this.relatedData.relatedTotal || [];
}
console.log('当前激活数据集:', this.activeData);
},
handleDashboardClick(material) { handleDashboardClick(material) {
// 1. 记录选中状态(新增,和第二个组件逻辑对齐,样式不变) // 1. 记录选中状态(新增,和第二个组件逻辑对齐,样式不变)
this.activeMaterial = material; this.activeMaterial = material;

View File

@@ -8,7 +8,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
采购单价·/ 采购单价·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
@@ -17,7 +17,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
产量· 产量·
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->
@@ -26,7 +26,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
单耗·/ 单耗·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定对应数据新增数据绑定样式不变 --> <!-- 绑定对应数据新增数据绑定样式不变 -->

View File

@@ -8,7 +8,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
采购单价·/ 采购单价·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="unitPriceData"></operatingSingleBar> <operatingSingleBar :detailData="unitPriceData"></operatingSingleBar>
@@ -16,7 +16,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
产量· 产量·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="productData"></operatingSingleBar> <operatingSingleBar :detailData="productData"></operatingSingleBar>
@@ -24,7 +24,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
单耗·/ 单耗·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="unitHaoData"></operatingSingleBar> <operatingSingleBar :detailData="unitHaoData"></operatingSingleBar>
@@ -87,12 +87,21 @@ export default {
computed: { computed: {
// 1. 硅砂数据:从激活数据集中筛选,兜底值与第二个组件统一 // 1. 硅砂数据:从激活数据集中筛选,兜底值与第二个组件统一
unitPriceData() { unitPriceData() {
console.log('');
console.log(this.activeData.find(item => (item.name || '').includes('采购单价')) || {
targetValue: 0,
value: 0,
completed: 0,
diffValue: 0
},'yyyy')
return this.activeData.find(item => (item.name || '').includes('采购单价')) || { return this.activeData.find(item => (item.name || '').includes('采购单价')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,
diffValue: 0 diffValue: 0
}; };
}, },
// 2. 海砂数据:精准筛选 // 2. 海砂数据:精准筛选
productData() { productData() {
@@ -126,6 +135,8 @@ export default {
// 对齐第二个组件:监听物料数据变化,同步更新激活数据集 // 对齐第二个组件:监听物料数据变化,同步更新激活数据集
relatedData: { relatedData: {
handler(newVal) { handler(newVal) {
console.log(this.relatedData,'relatedData');
this.activeData = newVal.relatedMon || []; this.activeData = newVal.relatedMon || [];
}, },
immediate: true, // 组件挂载时立即执行 immediate: true, // 组件挂载时立即执行

View File

@@ -8,7 +8,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
采购单价·/ 采购单价·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="unitPriceData"></operatingSingleBar> <operatingSingleBar :detailData="unitPriceData"></operatingSingleBar>
@@ -16,7 +16,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
产量· 产量·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="productData"></operatingSingleBar> <operatingSingleBar :detailData="productData"></operatingSingleBar>
@@ -24,7 +24,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
单耗·/ 单耗·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="unitHaoData"></operatingSingleBar> <operatingSingleBar :detailData="unitHaoData"></operatingSingleBar>

View File

@@ -45,7 +45,7 @@
<div class="dashboard right" <div class="dashboard right"
@click="handleDashboardClick('制造成本','mfgOverheadCostAnalysis/mfgOverheadCostAnalysis')"> @click="handleDashboardClick('制造成本','mfgOverheadCostAnalysis/mfgOverheadCostAnalysis')">
<div class="title"> <div class="title">
制造成本·/ 制造费用·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="manufacturingCostData"></operatingSingleBar> <operatingSingleBar :detailData="manufacturingCostData"></operatingSingleBar>
@@ -137,7 +137,7 @@ export default {
}, },
// 5. 制造成本数据:精准筛选 // 5. 制造成本数据:精准筛选
manufacturingCostData() { manufacturingCostData() {
return this.activeData.find(item => item.name === "制造成本") || { return this.activeData.find(item => item.name === "制造费用") || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,

View File

@@ -5,9 +5,9 @@
<div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;"> <div class="kpi-content" style="padding: 14px 16px; display: flex; width: 100%;">
<!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 --> <!-- 新增topItem 专属包裹容器统一控制样式和布局原有行内样式不变 -->
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left" @click="handleDashboardClick('备品机物料')"> <div class="dashboard left" @click="handleDashboardClick('备品机物料')">
<div class="title"> <div class="title">
备品机物料·/ 备品机物料·/
</div> </div>
<div class="line"> <div class="line">
<!-- 绑定备件丶机物料对应数据新增数据绑定样式不变 --> <!-- 绑定备件丶机物料对应数据新增数据绑定样式不变 -->
@@ -76,7 +76,7 @@ export default {
computed: { computed: {
// 1. 备件丶机物料数据:精准筛选对应名称数据,兜底值统一 // 1. 备件丶机物料数据:精准筛选对应名称数据,兜底值统一
sparePartsData() { sparePartsData() {
return this.relatedData.find(item => (item.name || '').includes('备品机物料')) || { return this.relatedData.find(item => (item.name || '').includes('备品机物料')) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,

View File

@@ -7,7 +7,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
双镀成本· 双镀成本·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -18,7 +18,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
双镀均价· 双镀均价·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -29,7 +29,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
双镀毛利· 双镀毛利·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -7,7 +7,7 @@
<div class="topItem-container" style="display: flex; gap: 8px;"> <div class="topItem-container" style="display: flex; gap: 8px;">
<div class="dashboard left"> <div class="dashboard left">
<div class="title"> <div class="title">
双镀成本· 双镀成本·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -18,7 +18,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
双镀均价· 双镀均价·/
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -29,7 +29,7 @@
</div> </div>
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
双镀毛利· 双镀毛利·
</div> </div>
<div class="line"> <div class="line">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -65,7 +65,7 @@ export default {
'利润总额', '利润总额',
'销量', '销量',
'单价', '单价',
'成本', '制造成本',
'管理费用', '管理费用',
'销售费用', '销售费用',
'财务费用', '财务费用',

View File

@@ -66,7 +66,7 @@ export default {
*/ */
factoryData() { // 整合原始数据 + 计算flag factoryData() { // 整合原始数据 + 计算flag
return { return {
completeRate: this.monData.proportion ? Number(this.monData.proportion).toFixed(2) : 0, completeRate: this.monData.proportion ? Number(this.monData.proportion) : 0,
diff: this.monData.diffValue, diff: this.monData.diffValue,
real: this.monData.value, real: this.monData.value,
target: this.monData.targetValue, target: this.monData.targetValue,

View File

@@ -23,7 +23,7 @@ export default {
chartD() { chartD() {
// 背景图片路径(若不需要可注释) // 背景图片路径(若不需要可注释)
// const bgImageUrl = require('@/assets/img/labelBg.png'); // const bgImageUrl = require('@/assets/img/labelBg.png');
const rate = this.detailData?.proportion? Number(this.detailData?.proportion).toFixed(2) : 0 const rate = this.detailData?.proportion? Number(this.detailData?.proportion) : 0
const diff = this.detailData?.diffValue || 0 const diff = this.detailData?.diffValue || 0
console.log('diff', diff); console.log('diff', diff);

View File

@@ -135,7 +135,7 @@ export default {
}, },
// 3. 成本数据:从当前激活数据集中筛选 // 3. 成本数据:从当前激活数据集中筛选
costData() { costData() {
return (this.activeData.find(item => item.name === "成本")) || { return (this.activeData.find(item => item.name === "制造成本")) || {
targetValue: 0, targetValue: 0,
value: 0, value: 0,
completed: 0, completed: 0,

View File

@@ -69,7 +69,7 @@ export default {
*/ */
factoryData() { // 整合原始数据 + 计算flag factoryData() { // 整合原始数据 + 计算flag
return { return {
completeRate: this.totalData.proportion ? Number(this.monData.proportion).toFixed(2) : 0, completeRate: this.totalData.proportion ? Number(this.totalData.proportion) : 0,
diff: this.totalData.diffValue, diff: this.totalData.diffValue,
real: this.totalData.value, real: this.totalData.value,
target: this.totalData.targetValue, target: this.totalData.targetValue,

View File

@@ -6,6 +6,7 @@
:style="{ opacity: isLeftTransparent ? 1 : 0.3 }" ref="leftTitleWrapper"> :style="{ opacity: isLeftTransparent ? 1 : 0.3 }" ref="leftTitleWrapper">
<svg-icon class="title-icon" style="font-size: 32px; margin-left: 16px" :icon-class="icon" /> <svg-icon class="title-icon" style="font-size: 32px; margin-left: 16px" :icon-class="icon" />
<span class="title-text" ref="leftTitleText">{{ name }}</span> <span class="title-text" ref="leftTitleText">{{ name }}</span>
<span class="change-text left-change-text" v-if="!isLeftTransparent" ref="leftChangeText">点击切换</span>
</div> </div>
<!-- 右侧标题 --> <!-- 右侧标题 -->
@@ -13,14 +14,15 @@
:style="{ opacity: isRightTransparent ? 1 : 0.3 }" ref="rightTitleWrapper"> :style="{ opacity: isRightTransparent ? 1 : 0.3 }" ref="rightTitleWrapper">
<svg-icon class="title-icon" style="font-size: 32px; margin-left: 16px" :icon-class="iconTwo || icon" /> <svg-icon class="title-icon" style="font-size: 32px; margin-left: 16px" :icon-class="iconTwo || icon" />
<span class="title-text" ref="rightTitleText">{{ nameTwo }}</span> <span class="title-text" ref="rightTitleText">{{ nameTwo }}</span>
<span class="change-text right-change-text" v-if="!isRightTransparent" ref="rightChangeText">点击切换</span>
</div> </div>
<!-- 左侧切换文字动态定位 -->
<span class="change-text left-change-text" v-if="!isLeftTransparent" ref="leftChangeText">点击切换</span>
<!-- 右侧切换文字动态定位 -->
<span class="change-text right-change-text" v-if="!isRightTransparent" ref="rightChangeText">点击切换</span>
</div> </div>
<!-- 左侧切换文字动态定位 -->
<!-- 右侧切换文字动态定位 -->
<!-- Tab组动态样式 + 点击事件 --> <!-- Tab组动态样式 + 点击事件 -->
<div class="tab-group"> <div class="tab-group">
<!-- 月度Tab点击切换状态动态绑定样式 --> <!-- 月度Tab点击切换状态动态绑定样式 -->
@@ -65,17 +67,17 @@ export default {
}, },
mounted() { mounted() {
// 初始化定位 // 初始化定位
this.positionChangeText(); // this.positionChangeText();
// 监听窗口大小变化,重新定位 // // 监听窗口大小变化,重新定位
window.addEventListener('resize', this.positionChangeText); // window.addEventListener('resize', this.positionChangeText);
},
updated() {
// 数据更新后重新定位(如标题文字变化)
this.positionChangeText();
}, },
// updated() {
// // 数据更新后重新定位(如标题文字变化)
// this.positionChangeText();
// },
beforeDestroy() { beforeDestroy() {
// 移除监听 // 移除监听
window.removeEventListener('resize', this.positionChangeText); // window.removeEventListener('resize', this.positionChangeText);
}, },
methods: { methods: {
handleLeftClick() { handleLeftClick() {
@@ -83,14 +85,14 @@ export default {
this.isRightTransparent = false; this.isRightTransparent = false;
this.$emit('switchTab', 'cus'); this.$emit('switchTab', 'cus');
// 切换后重新定位 // 切换后重新定位
this.$nextTick(() => this.positionChangeText()); // this.$nextTick(() => this.positionChangeText());
}, },
handleRightClick() { handleRightClick() {
this.isLeftTransparent = false; this.isLeftTransparent = false;
this.isRightTransparent = true; this.isRightTransparent = true;
this.$emit('switchTab', 'pro'); this.$emit('switchTab', 'pro');
// 切换后重新定位 // 切换后重新定位
this.$nextTick(() => this.positionChangeText()); // this.$nextTick(() => this.positionChangeText());
}, },
/** /**
* Tab点击事件切换状态 + 向父组件传值 * Tab点击事件切换状态 + 向父组件传值
@@ -301,11 +303,13 @@ export default {
// 左侧切换文字(可选:单独样式调整) // 左侧切换文字(可选:单独样式调整)
.left-change-text { .left-change-text {
left: 70%;
/* 若需要可添加单独样式 */ /* 若需要可添加单独样式 */
} }
// 右侧切换文字(可选:单独样式调整) // 右侧切换文字(可选:单独样式调整)
.right-change-text { .right-change-text {
left: 18%;
/* 若需要可添加单独样式 */ /* 若需要可添加单独样式 */
} }

View File

@@ -18,7 +18,7 @@
<!-- 成本图表传递全成本数据 + 完成率flag --> <!-- 成本图表传递全成本数据 + 完成率flag -->
<div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')"> <div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')">
<div class="title"> <div class="title">
成本· 成本·/
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -31,7 +31,7 @@
<!-- 运费图表传递单价数据 + 完成率flag --> <!-- 运费图表传递单价数据 + 完成率flag -->
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
运费· 运费·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{

View File

@@ -109,18 +109,18 @@ export default {
* @param {number} rate 完成率原始值如89代表89% * @param {number} rate 完成率原始值如89代表89%
* @returns {0|1} flag值 * @returns {0|1} flag值
*/ */
getRateFlag(rate, real, target) { getRateFlag(rate, real, target) {
if (isNaN(rate) || rate === null || rate === undefined) return 0; if (isNaN(rate) || rate === null || rate === undefined) return 0;
// 1. 完成率 >= 100 => 达标 // 1. 完成率 >= 100 => 达标
if (rate >= 100) return 1; if (rate >= 100) return 1;
// 2. 完成率 = 0 且 (目标值=0 或 实际值=目标值=0) => 达标 // 2. 完成率 = 0 且 (目标值=0 或 实际值=目标值=0) => 达标
if (rate === 0 && target === 0) return 1; if (rate === 0 && target === 0) return 1;
// 其他情况 => 未达标 // 其他情况 => 未达标
return 0; return 0;
}, },
} }
} }
</script> </script>

View File

@@ -18,7 +18,7 @@
<!-- 成本图表传递全成本数据 + 完成率flag --> <!-- 成本图表传递全成本数据 + 完成率flag -->
<div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')"> <div class="dashboard right" @click="handleDashboardClick('/fullCostAnalysis/fullCostAnalysisBase')">
<div class="title"> <div class="title">
成本· 成本·/
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{
@@ -30,7 +30,7 @@
<!-- 运费图表传递单价数据 + 完成率flag --> <!-- 运费图表传递单价数据 + 完成率flag -->
<div class="dashboard right"> <div class="dashboard right">
<div class="title"> <div class="title">
运费· 运费·
</div> </div>
<div class="chart-wrap"> <div class="chart-wrap">
<operatingSingleBar :detailData="{ <operatingSingleBar :detailData="{