diff --git a/apps/l2/src/views/l2/report/components/body.vue b/apps/l2/src/views/l2/report/components/body.vue index 2ec3c60..09a5e12 100644 --- a/apps/l2/src/views/l2/report/components/body.vue +++ b/apps/l2/src/views/l2/report/components/body.vue @@ -1,22 +1,50 @@ @@ -41,9 +69,22 @@ export default { columns: { type: Array, required: true + }, + overviewInfo: { + type: Object, + default: () => ({ + reportLabel: '', + rangeText: '' + }) } }, methods: { + formatCell(value) { + if (value === null || value === undefined || value === '') { + return '-' + } + return value + }, exportReport() { // 创建工作簿 const workbook = XLSX.utils.book_new(); @@ -83,30 +124,161 @@ export default { } - \ No newline at end of file diff --git a/apps/l2/src/views/l2/report/index.vue b/apps/l2/src/views/l2/report/index.vue deleted file mode 100644 index ca86974..0000000 --- a/apps/l2/src/views/l2/report/index.vue +++ /dev/null @@ -1,341 +0,0 @@ - - - - - diff --git a/apps/l2/src/views/l2/report/pdo.vue b/apps/l2/src/views/l2/report/pdo.vue index 09d43cd..09342dd 100644 --- a/apps/l2/src/views/l2/report/pdo.vue +++ b/apps/l2/src/views/l2/report/pdo.vue @@ -1,21 +1,74 @@ @@ -25,64 +78,219 @@ import { getReportSummary, getReportDetail } from '@/api/l2/report' export default { name: 'PdoReport', - components: { - ReportBody - }, + components: { ReportBody }, data() { return { - queryParams: { - // startTime: new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(2, '0') + '-01 00:00:00', - // endTime: new Date().getFullYear() + '-' + (new Date().getMonth() + 2).toString().padStart(2, '0') + '-01 00:00:00', - startTime: undefined, - endTime: undefined, - pageNum: 1, - pageSize: 1000 - }, loading: false, + hasSelectedTime: false, + timeRange: { + startTime: '', + endTime: '' + }, reportSummary: [], reportDetail: [], columns: [] } }, - methods: { - async fetchReportData() { - this.loading = true - const res = await getReportSummary(this.queryParams) - this.reportSummary = [ - { label: '成品卷数', value: res.coilCount }, // coilCount=总卷数,结合“成品总重/原料总重”场景,推测为成品卷数 - { label: '平均出口厚度[mm]', value: res.avgExitThickness }, // avgExitThickness=平均出口厚度,厚度用“平均”更符合实际(单卷厚度均匀,无“总厚度”概念) - { label: '原料总重[t]', value: res.totalEntryWeight }, // totalEntryWeight=总入口重量,入口重量即原料重量 - { label: '总出口长度[mm]', value: res.totalExitLength }, // totalExitLength=总出口长度,补充原“去锌总重”(无对应字段)的空缺,符合卷材加工的核心维度 - { label: '平均出口宽度[mm]', value: res.avgExitWidth }, // avgExitWidth=平均出口宽度,宽度用“平均”更合理(单卷宽度固定,“总宽度”无业务意义) - { label: '成品总重[t]', value: res.totalActualWeight }, // totalActualWeight=总实际重量,实际重量即成品最终重量 - { label: '总理论重量[t]', value: res.totalTheoryWeight }, // totalTheoryWeight=总理论重量,工业场景中常用“理论重量vs实际重量”对比 - { label: '成材率', value: (res.yieldRate * 100).toFixed(2) + '%' } // yieldRate=成材率,原配置正确,保留 - ]; - const res2 = await getReportDetail() - this.reportDetail = res2.map(item => { - return { - ...item, - onlineTime: item.onlineTime.replace('T', ' ') - } - }) - this.columns = [ - { label: '出口物料ID', prop: 'exitMatId' }, - { label: '入口物料ID', prop: 'entryMatId' }, - { label: '机组号', prop: 'groupNo' }, - { label: '班次号', prop: 'shiftNo' }, - { label: '钢种', prop: 'steelGrade' }, - { label: '出口厚度(mm)', prop: 'exitThickness' }, - { label: '出口宽度(mm)', prop: 'exitWidth' }, - { label: '出口长度(m)', prop: 'exitLength' }, - { label: '理论重量(kg)', prop: 'theoryWeight' }, - { label: '实际重量(kg)', prop: 'actualWeight' }, - { label: '上线时间', prop: 'onlineTime' }, - ] - this.loading = false + computed: { + canQuery() { + return this.timeRange.startTime && this.timeRange.endTime + }, + displayTimeRange() { + if (!this.canQuery) return '-' + return `${this.timeRange.startTime} 至 ${this.timeRange.endTime}` + }, + overviewInfo() { + return { + reportLabel: '实绩报表', + rangeText: this.displayTimeRange + } } }, - mounted() { - this.fetchReportData() + methods: { + handleTimeReset() { + this.timeRange = { + startTime: '', + endTime: '' + } + }, + async handleTimeConfirm() { + if (!this.canQuery) { + this.$message.warning('请选择完整的时间范围') + return + } + const start = new Date(this.timeRange.startTime) + const end = new Date(this.timeRange.endTime) + if (start > end) { + this.$message.warning('开始时间不能晚于结束时间') + return + } + this.hasSelectedTime = true + await this.fetchReportData() + }, + handleReturn() { + this.hasSelectedTime = false + this.handleTimeReset() + this.reportSummary = [] + this.reportDetail = [] + }, + async fetchReportData() { + this.loading = true + try { + const queryParams = { + startTime: this.timeRange.startTime, + endTime: this.timeRange.endTime, + pageNum: 1, + pageSize: 1000 + } + const res = await getReportSummary(queryParams) + this.reportSummary = [ + { label: '成品卷数', value: res.coilCount }, + { label: '平均出口厚度[mm]', value: res.avgExitThickness }, + { label: '原料总重[t]', value: res.totalEntryWeight }, + { label: '总出口长度[mm]', value: res.totalExitLength }, + { label: '平均出口宽度[mm]', value: res.avgExitWidth }, + { label: '成品总重[t]', value: res.totalActualWeight }, + { label: '总理论重量[t]', value: res.totalTheoryWeight }, + { label: '成材率', value: (res.yieldRate * 100).toFixed(2) + '%' } + ] + const res2 = await getReportDetail(queryParams) + this.reportDetail = (res2 || []).map(item => ({ + ...item, + onlineTime: item.onlineTime ? item.onlineTime.replace('T', ' ') : '' + })) + this.columns = [ + { label: '出口物料ID', prop: 'exitMatId' }, + { label: '入口物料ID', prop: 'entryMatId' }, + { label: '机组号', prop: 'groupNo' }, + { label: '班次号', prop: 'shiftNo' }, + { label: '钢种', prop: 'steelGrade' }, + { label: '出口厚度(mm)', prop: 'exitThickness' }, + { label: '出口宽度(mm)', prop: 'exitWidth' }, + { label: '出口长度(m)', prop: 'exitLength' }, + { label: '理论重量(t)', prop: 'theoryWeight' }, + { label: '实际重量(t)', prop: 'actualWeight' }, + { label: '上线时间', prop: 'onlineTime' } + ] + } catch (error) { + console.error(error) + this.$message.error('获取报表数据失败') + } finally { + this.loading = false + } + } } } - \ No newline at end of file + + + \ No newline at end of file diff --git a/apps/l2/src/views/l2/report/roller.vue b/apps/l2/src/views/l2/report/roller.vue index 0f7b3aa..981a11f 100644 --- a/apps/l2/src/views/l2/report/roller.vue +++ b/apps/l2/src/views/l2/report/roller.vue @@ -1,21 +1,74 @@ @@ -25,50 +78,210 @@ import { getRollHistorytList } from '@/api/l2/roller' export default { name: 'RollerReport', - components: { - ReportBody - }, + components: { ReportBody }, data() { return { - queryParams: { - // startTime: new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(2, '0') + '-01 00:00:00', - // endTime: new Date().getFullYear() + '-' + (new Date().getMonth() + 2).toString().padStart(2, '0') + '-01 00:00:00', - startTime: undefined, - endTime: undefined, - endTime: '', - pageNum: 1, - pageSize: 1000 + loading: false, + hasSelectedTime: false, + timeRange: { + startTime: '', + endTime: '' }, reportSummary: [], reportDetail: [], - columns: [], - loading: false + columns: [] } }, - mounted() { - this.fetchReportData() + computed: { + canQuery() { + return this.timeRange.startTime && this.timeRange.endTime + }, + displayTimeRange() { + if (!this.canQuery) return '-' + return `${this.timeRange.startTime} 至 ${this.timeRange.endTime}` + }, + overviewInfo() { + return { + reportLabel: '换辊报表', + rangeText: this.displayTimeRange + } + } }, methods: { + handleTimeReset() { + this.timeRange = { + startTime: '', + endTime: '' + } + }, + async handleTimeConfirm() { + if (!this.canQuery) { + this.$message.warning('请选择完整的时间范围') + return + } + if (new Date(this.timeRange.startTime) > new Date(this.timeRange.endTime)) { + this.$message.warning('开始时间不能晚于结束时间') + return + } + this.hasSelectedTime = true + await this.fetchReportData() + }, + handleReturn() { + this.hasSelectedTime = false + this.handleTimeReset() + this.reportSummary = [] + this.reportDetail = [] + }, async fetchReportData() { this.loading = true - const res = await getRollHistorytList(this.queryParams) - this.reportDetail = res.data.list - this.columns = [ - { label: '换辊号', prop: 'changeid' }, - { label: '轧辊号', prop: 'rollid' }, - { label: '类型', prop: 'type' }, - { label: '位置', prop: 'position' }, - { label: '直径', prop: 'diameter' }, - { label: '粗糙度', prop: 'rough' }, - { label: '凸度', prop: 'crown' }, - { label: '轧制长度', prop: 'rolledLength' }, - { label: '轧制重量', prop: 'rolledWeight' }, - { label: '轧制次数', prop: 'rolledCount' }, - { label: '上线时间', prop: 'instalTime' }, - { label: '下线时间', prop: 'deinstalTime' }, - ] - this.loading = false + try { + const queryParams = { + startTime: this.timeRange.startTime, + endTime: this.timeRange.endTime, + pageNum: 1, + pageSize: 1000 + } + const res = await getRollHistorytList(queryParams) + this.reportDetail = (res.data?.list || []).map(item => ({ + ...item + })) + this.columns = [ + { label: '换辊号', prop: 'changeid' }, + { label: '轧辊号', prop: 'rollid' }, + { label: '类型', prop: 'type' }, + { label: '位置', prop: 'position' }, + { label: '直径', prop: 'diameter' }, + { label: '粗糙度', prop: 'rough' }, + { label: '凸度', prop: 'crown' }, + { label: '轧制长度', prop: 'rolledLength' }, + { label: '轧制重量', prop: 'rolledWeight' }, + { label: '轧制次数', prop: 'rolledCount' }, + { label: '上线时间', prop: 'instalTime' }, + { label: '下线时间', prop: 'deinstalTime' } + ] + this.reportSummary = [ + { label: '数据条数', value: this.reportDetail.length }, + { label: '时间范围', value: this.displayTimeRange } + ] + } catch (error) { + console.error(error) + this.$message.error('获取报表数据失败') + } finally { + this.loading = false + } } } } - \ No newline at end of file + + + \ No newline at end of file diff --git a/apps/l2/src/views/l2/report/stop.vue b/apps/l2/src/views/l2/report/stop.vue index 7a79e3a..2ef7a9b 100644 --- a/apps/l2/src/views/l2/report/stop.vue +++ b/apps/l2/src/views/l2/report/stop.vue @@ -1,47 +1,92 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/apps/l2/src/views/l2/stop/index.vue b/apps/l2/src/views/l2/stop/index.vue index 89b1b9c..86770c3 100644 --- a/apps/l2/src/views/l2/stop/index.vue +++ b/apps/l2/src/views/l2/stop/index.vue @@ -1,8 +1,8 @@