feat(物料管理): 新增入库和出库报表功能并优化界面

重构报表页面结构,新增API接口文件
添加日期范围快速选择功能
实现数据导出Excel功能
更新README项目描述
This commit is contained in:
赵正易 2025-08-15 15:57:26 +08:00
parent e4d0aecb80
commit ebe3b4681b
7 changed files with 663 additions and 235 deletions

View File

@ -1,3 +1,20 @@
# 涂装车间MES系统前端
本项目是干巷车镜涂装车间MES系统的前端部分基于Vue.js开发用于管理生产过程中的各种数据和流程。
## 项目描述
该系统主要用于涂装车间的生产管理,包括物料管理、生产计划、质量管理、设备管理等功能模块,旨在提高生产效率和产品质量。
## 已有功能
- 基础管理BOM管理、设备工位管理、产品定义、SOP管理等
- 物料管理AGV货位管理、配料任务管理、每日入库报表、每日出库报表等
- 生产管理:生产计划、工单管理、完工统计等
- 质量管理IQC、IPQC、FQC、OQC等质量管理模块
- 看板管理:各类生产数据看板
- 系统管理:用户管理、角色管理、菜单管理、字典管理等
## 开发
```bash
@ -27,21 +44,4 @@ npm run build:stage
# 构建生产环境
npm run build:prod
```
# 插件说明
### Autoprefixer (已删除)
浏览器自动补全前缀
例如:
```
a{
transition :transform 1s
}
将会补全如下
a{
-webkit-transition :-webkit-transform 1s;
transition :-ms-transform 1s;
transition :transform 1s
}
```

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 获取每日入库报表数据
export function getInventoryReportByPage(data) {
return request({
url: '/mes/mm/mmInventoryReport/GetInventoryReportByPage',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 获取每日出库报表数据
export function getOutboundReportByPage(data) {
return request({
url: '/mes/mm/mmOutboundReport/GetOutboundReportByPage',
method: 'post',
data: data
})
}

View File

@ -1,109 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="日期范围" prop="dateRange">
<el-date-picker
v-model="queryParams.dateRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]">
</el-date-picker>
</el-form-item>
<el-form-item label="物料编号" prop="materialCode">
<el-input v-model="queryParams.materialCode" placeholder="请输入物料编号" clearable />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入物料名称" clearable />
</el-form-item>
<el-form-item label="操作人" prop="operator">
<el-input v-model="queryParams.operator" placeholder="请输入操作人" clearable />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="15" class="mb10">
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table :data="dataList" v-loading="loading" ref="table" border header-cell-class-name="el-table-header-cell" highlight-current-row>
<el-table-column type="index" width="50" align="center" />
<el-table-column prop="materialCode" label="物料编号" align="center" />
<el-table-column prop="materialName" label="物料名称" align="center" />
<el-table-column prop="quantity" label="入库数量" align="center" />
<el-table-column prop="inventoryTime" label="入库时间" align="center" />
<el-table-column prop="operator" label="操作人" align="center" />
</el-table>
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</template>
<script>
export default {
name: 'mmDailyInventoryReport',
data() {
// 00:00:0023:59:59
const startOfDay = this.$dayjs().startOf('day').toDate()
const endOfDay = this.$dayjs().endOf('day').toDate()
return {
loading: false,
showSearch: true,
queryParams: {
pageNum: 1,
pageSize: 10,
dateRange: [startOfDay, endOfDay],
materialCode: '',
materialName: '',
operator: ''
},
columns: [],
total: 0,
dataList: [],
queryRef: null
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
// API
//
setTimeout(() => {
this.dataList = [
{ materialCode: 'MAT001', materialName: '物料1', quantity: 150, inventoryTime: '2023-05-01 09:15:00', operator: '王五' },
{ materialCode: 'MAT003', materialName: '物料3', quantity: 300, inventoryTime: '2023-05-01 16:20:00', operator: '赵六' }
]
this.total = this.dataList.length
this.loading = false
}, 500)
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
//
resetQuery() {
this.resetForm("queryRef")
//
const startOfDay = this.$dayjs().startOf('day').toDate()
const endOfDay = this.$dayjs().endOf('day').toDate()
this.queryParams.dateRange = [startOfDay, endOfDay]
this.handleQuery()
}
}
}
</script>
<style scoped>
/* 可以添加一些自定义样式 */
</style>

View File

@ -1,109 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="日期范围" prop="dateRange">
<el-date-picker
v-model="queryParams.dateRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]">
</el-date-picker>
</el-form-item>
<el-form-item label="物料编号" prop="materialCode">
<el-input v-model="queryParams.materialCode" placeholder="请输入物料编号" clearable />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入物料名称" clearable />
</el-form-item>
<el-form-item label="操作人" prop="operator">
<el-input v-model="queryParams.operator" placeholder="请输入操作人" clearable />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="15" class="mb10">
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table :data="dataList" v-loading="loading" ref="table" border header-cell-class-name="el-table-header-cell" highlight-current-row>
<el-table-column type="index" width="50" align="center" />
<el-table-column prop="materialCode" label="物料编号" align="center" />
<el-table-column prop="materialName" label="物料名称" align="center" />
<el-table-column prop="quantity" label="出库数量" align="center" />
<el-table-column prop="outboundTime" label="出库时间" align="center" />
<el-table-column prop="operator" label="操作人" align="center" />
</el-table>
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</template>
<script>
export default {
name: 'mmDailyOutboundReport',
data() {
// 00:00:0023:59:59
const startOfDay = this.$dayjs().startOf('day').toDate()
const endOfDay = this.$dayjs().endOf('day').toDate()
return {
loading: false,
showSearch: true,
queryParams: {
pageNum: 1,
pageSize: 10,
dateRange: [startOfDay, endOfDay],
materialCode: '',
materialName: '',
operator: ''
},
columns: [],
total: 0,
dataList: [],
queryRef: null
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
// API
//
setTimeout(() => {
this.dataList = [
{ materialCode: 'MAT001', materialName: '物料1', quantity: 100, outboundTime: '2023-05-01 10:30:00', operator: '张三' },
{ materialCode: 'MAT002', materialName: '物料2', quantity: 200, outboundTime: '2023-05-01 14:45:00', operator: '李四' }
]
this.total = this.dataList.length
this.loading = false
}, 500)
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
//
resetQuery() {
this.resetForm("queryRef")
//
const startOfDay = this.$dayjs().startOf('day').toDate()
const endOfDay = this.$dayjs().endOf('day').toDate()
this.queryParams.dateRange = [startOfDay, endOfDay]
this.handleQuery()
}
}
}
</script>
<style scoped>
/* 可以添加一些自定义样式 */
</style>

View File

@ -0,0 +1,313 @@
<template>
<div class="app-container">
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="日期范围" prop="dateRange">
<div style="display: flex; align-items: center">
<el-date-picker v-model="queryParams.dateRange" type="datetimerange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]">
</el-date-picker>
<div style="margin-left: 10px">
<el-button size="mini" @click="setDateRange('today')">今日</el-button>
<el-button size="mini" @click="setDateRange('yesterday')">昨日</el-button>
<el-button size="mini" @click="setDateRange('week')">本周</el-button>
<el-button size="mini" @click="setDateRange('month')">本月</el-button>
</div>
</div>
</el-form-item>
<el-form-item label="物料编号" prop="materialCode">
<el-input v-model="queryParams.materialCode" placeholder="请输入物料编号" clearable />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入物料名称" clearable />
</el-form-item>
<el-form-item label="操作人" prop="operator">
<el-input v-model="queryParams.operator" placeholder="请输入操作人" clearable />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="15" class="mb10">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table :data="dataList" v-loading="loading" ref="table" border header-cell-class-name="el-table-header-cell"
highlight-current-row>
<el-table-column type="index" width="50" align="center" />
<el-table-column prop="partnumber" label="物料编号" align="center" />
<el-table-column prop="description" label="物料名称" align="center" />
<el-table-column prop="changePackage" label="箱数" align="center" />
<el-table-column prop="changeQuantity" label="产品数" align="center" />
<el-table-column prop="createdBy" label="操作人" align="center" />
</el-table>
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
</template>
<script>
import { getInventoryReportByPage } from '@/api/materialManagement/mmInventoryReport'
import * as ExcelJS from 'exceljs'
import { saveAs } from 'file-saver'
export default {
name: 'mmDailyInventoryReport',
data() {
// 2525
const startOfMonth = this.$dayjs().subtract(1, 'month').date(25).toDate()
const endOfMonth = this.$dayjs().date(25).toDate()
return {
loading: false,
showSearch: true,
queryParams: {
pageNum: 1,
pageSize: 10,
dateRange: [startOfMonth, endOfMonth],
partNumber: '',
materialName: '',
operator: '',
source: '',
},
columns: [],
total: 0,
dataList: [],
queryRef: null,
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
//
const params = {
...this.queryParams,
startTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD HH:mm:ss') : undefined,
endTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD HH:mm:ss') : undefined,
partNumber: this.queryParams.partNumber,
materialName: this.queryParams.materialName,
operator: this.queryParams.operator,
source: this.queryParams.source,
}
//
delete params.dateRange
// API
getInventoryReportByPage(params)
.then((res) => {
if (res.code == 200) {
this.dataList = res.data.result || []
this.total = res.data.totalNum || 0
this.loading = false
} else {
this.dataList = []
this.total = 0
this.loading = false
}
})
.catch(() => {
this.dataList = []
this.total = 0
this.loading = false
})
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
//
resetQuery() {
this.resetForm('queryRef')
// 2525
const startOfMonth = this.$dayjs().subtract(1, 'month').date(25).toDate()
const endOfMonth = this.$dayjs().date(25).toDate()
this.queryParams.dateRange = [startOfMonth, endOfMonth]
this.queryParams.partNumber = ''
this.queryParams.materialName = ''
this.queryParams.operator = ''
this.handleQuery()
},
//
setDateRange(type) {
let start, end
switch (type) {
case 'today':
//
start = this.$dayjs().startOf('day').toDate()
end = this.$dayjs().endOf('day').toDate()
break
case 'yesterday':
//
start = this.$dayjs().subtract(1, 'day').startOf('day').toDate()
end = this.$dayjs().subtract(1, 'day').endOf('day').toDate()
break
case 'week':
//
start = this.$dayjs().startOf('week').toDate()
end = this.$dayjs().endOf('week').toDate()
break
case 'month':
// (2525)
start = this.$dayjs().subtract(1, 'month').date(25).toDate()
end = this.$dayjs().date(25).toDate()
break
default:
//
start = this.$dayjs().subtract(1, 'month').date(25).toDate()
end = this.$dayjs().date(25).toDate()
}
this.queryParams.dateRange = [start, end]
this.handleQuery()
},
//
async handleExport() {
try {
//
if (!this.queryParams.dateRange || this.queryParams.dateRange.length !== 2 || !this.queryParams.dateRange[0] || !this.queryParams.dateRange[1]) {
this.$modal.msgError('请选择日期范围')
return
}
//
this.$modal.loading('正在导出数据,请稍候...')
//
const allData = await this.getAllData()
//
const startDate = this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD')
const endDate = this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD')
const fileName = `库存报表_${startDate}_${endDate}.xlsx`
// 簿
const workbook = new ExcelJS.Workbook()
const worksheet = workbook.addWorksheet('库存报表')
//
const columns = [
{ header: '物料编号', key: 'partnumber', width: 20 },
{ header: '物料名称', key: 'description', width: 30 },
{ header: '数量', key: 'changeQuantity', width: 15 },
{ header: '操作人', key: 'createdBy', width: 15 },
]
worksheet.columns = columns
//
const headerRow = worksheet.getRow(1)
headerRow.font = { bold: true }
headerRow.alignment = { horizontal: 'center' }
//
const dateRangeRow = worksheet.addRow([`日期范围: ${startDate}${endDate}`])
dateRangeRow.font = { bold: true }
dateRangeRow.alignment = { horizontal: 'left' }
worksheet.addRow([]) //
//
allData.forEach((item) => {
worksheet.addRow({
partnumber: item.partnumber,
description: item.description,
changeQuantity: item.changeQuantity,
createdBy: item.createdBy,
})
})
// Excel
const buffer = await workbook.xlsx.writeBuffer()
const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
//
saveAs(blob, fileName)
//
this.$modal.closeLoading()
} catch (error) {
//
this.$modal.closeLoading()
this.$modal.msgError('导出失败: ' + error.message)
}
},
//
async getAllData() {
return new Promise((resolve) => {
//
this.$message({
message: '正在准备导出数据,请稍候...',
type: 'info',
duration: 0, //
})
//
const params = {
...this.queryParams,
startTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD HH:mm:ss') : undefined,
endTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD HH:mm:ss') : undefined,
partNumber: this.queryParams.partNumber,
materialName: this.queryParams.materialName,
operator: this.queryParams.operator,
source: this.queryParams.source,
}
delete params.dateRange
//
const allResults = []
const fetchPage = (pageNum) => {
getInventoryReportByPage({ ...params, pageNum, pageSize: 1000 })
.then((res) => {
if (res.code == 200) {
const results = res.data.result || []
allResults.push(...results)
//
if (allResults.length < res.data.totalNum) {
fetchPage(pageNum + 1)
} else {
//
this.$message.closeAll()
resolve(allResults)
}
} else {
//
this.$message.closeAll()
this.$message({
message: '获取导出数据失败',
type: 'error',
})
resolve([])
}
})
.catch(() => {
//
this.$message.closeAll()
this.$message({
message: '获取导出数据失败',
type: 'error',
})
resolve([])
})
}
//
fetchPage(1)
})
},
},
}
</script>
<style scoped>
/* 可以添加一些自定义样式 */
</style>

View File

@ -0,0 +1,313 @@
<template>
<div class="app-container">
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
<el-form-item label="日期范围" prop="dateRange">
<div style="display: flex; align-items: center;">
<el-date-picker v-model="queryParams.dateRange" type="datetimerange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]">
</el-date-picker>
<div style="margin-left: 10px;">
<el-button size="mini" @click="setDateRange('today')">今日</el-button>
<el-button size="mini" @click="setDateRange('yesterday')">昨日</el-button>
<el-button size="mini" @click="setDateRange('week')">本周</el-button>
<el-button size="mini" @click="setDateRange('month')">本月</el-button>
</div>
</div>
</el-form-item>
<el-form-item label="物料编号" prop="partNumber">
<el-input v-model="queryParams.partNumber" placeholder="请输入物料编号" clearable />
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入物料名称" clearable />
</el-form-item>
<el-form-item label="操作人" prop="operator">
<el-input v-model="queryParams.operator" placeholder="请输入操作人" clearable />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="15" class="mb10">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table :data="dataList" v-loading="loading" ref="table" border header-cell-class-name="el-table-header-cell"
highlight-current-row>
<el-table-column type="index" width="50" align="center" />
<el-table-column prop="partnumber" label="物料编号" align="center" />
<el-table-column prop="description" label="物料名称" align="center" />
<el-table-column prop="changePackage" label="箱数" align="center" />
<el-table-column prop="changeQuantity" label="产品数" align="center" />
<el-table-column prop="createdBy" label="操作人" align="center" />
</el-table>
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
</template>
<script>
import { getOutboundReportByPage } from '@/api/materialManagement/mmOutboundReport'
import * as ExcelJS from 'exceljs'
import { saveAs } from 'file-saver'
export default {
name: 'mmDailyOutboundReport',
data() {
// 2525
const startOfMonth = this.$dayjs().subtract(1, 'month').date(25).toDate()
const endOfMonth = this.$dayjs().date(25).toDate()
return {
loading: false,
showSearch: true,
queryParams: {
pageNum: 1,
pageSize: 10,
dateRange: [startOfMonth, endOfMonth],
partNumber: '',
materialName: '',
operator: '',
source: ''
},
columns: [],
total: 0,
dataList: [],
queryRef: null
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
//
const params = {
...this.queryParams,
startTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD HH:mm:ss') : undefined,
endTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD HH:mm:ss') : undefined,
partNumber: this.queryParams.partNumber,
materialName: this.queryParams.materialName,
operator: this.queryParams.operator,
source: this.queryParams.source
}
//
delete params.dateRange
// API
getOutboundReportByPage(params).then((res) => {
if (res.code == 200) {
this.dataList = res.data.result || []
this.total = res.data.totalNum || 0
this.loading = false
} else {
this.dataList = []
this.total = 0
this.loading = false
}
}).catch(() => {
this.dataList = []
this.total = 0
this.loading = false
})
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
//
resetQuery() {
this.resetForm("queryRef")
// 2525
const startOfMonth = this.$dayjs().subtract(1, 'month').date(25).toDate()
const endOfMonth = this.$dayjs().date(25).toDate()
this.queryParams.dateRange = [startOfMonth, endOfMonth]
this.queryParams.partNumber = ''
this.queryParams.materialName = ''
this.queryParams.operator = ''
this.queryParams.source = ''
this.handleQuery()
},
//
setDateRange(type) {
let start, end
switch (type) {
case 'today':
//
start = this.$dayjs().startOf('day').toDate()
end = this.$dayjs().endOf('day').toDate()
break
case 'yesterday':
//
start = this.$dayjs().subtract(1, 'day').startOf('day').toDate()
end = this.$dayjs().subtract(1, 'day').endOf('day').toDate()
break
case 'week':
//
start = this.$dayjs().startOf('week').toDate()
end = this.$dayjs().endOf('week').toDate()
break
case 'month':
// (2525)
start = this.$dayjs().subtract(1, 'month').date(25).toDate()
end = this.$dayjs().date(25).toDate()
break
default:
//
start = this.$dayjs().subtract(1, 'month').date(25).toDate()
end = this.$dayjs().date(25).toDate()
}
this.queryParams.dateRange = [start, end]
this.handleQuery()
},
//
async handleExport() {
try {
//
if (!this.queryParams.dateRange || this.queryParams.dateRange.length !== 2 ||
!this.queryParams.dateRange[0] || !this.queryParams.dateRange[1]) {
this.$modal.msgError('请选择日期范围')
return
}
//
this.$modal.loading('正在导出数据,请稍候...')
//
const allData = await this.getAllData()
//
const startDate = this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD')
const endDate = this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD')
const fileName = `出库报表_${startDate}_${endDate}.xlsx`
// 簿
const workbook = new ExcelJS.Workbook()
const worksheet = workbook.addWorksheet('出库报表')
//
const columns = [
{ header: '物料编号', key: 'partnumber', width: 20 },
{ header: '物料名称', key: 'description', width: 30 },
{ header: '数量', key: 'changeQuantity', width: 15 },
{ header: '操作人', key: 'createdBy', width: 15 },
{ header: '操作时间', key: 'createdTime', width: 20 }
]
worksheet.columns = columns
//
const headerRow = worksheet.getRow(1)
headerRow.font = { bold: true }
headerRow.alignment = { horizontal: 'center' }
//
const dateRangeRow = worksheet.addRow([`日期范围: ${startDate}${endDate}`])
dateRangeRow.font = { bold: true }
dateRangeRow.alignment = { horizontal: 'left' }
worksheet.addRow([]) //
//
allData.forEach(item => {
worksheet.addRow({
partnumber: item.partnumber,
description: item.description,
changeQuantity: item.changeQuantity,
createdBy: item.createdBy,
createdTime: item.createdTime
})
})
// Excel
const buffer = await workbook.xlsx.writeBuffer()
const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
//
saveAs(blob, fileName)
//
this.$modal.closeLoading()
} catch (error) {
//
this.$modal.closeLoading()
this.$modal.msgError('导出失败: ' + error.message)
}
},
//
async getAllData() {
return new Promise((resolve) => {
//
this.$message({
message: '正在准备导出数据,请稍候...',
type: 'info',
duration: 0 //
})
//
const params = {
...this.queryParams,
startTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[0]).format('YYYY-MM-DD HH:mm:ss') : undefined,
endTime: this.queryParams.dateRange ? this.$dayjs(this.queryParams.dateRange[1]).format('YYYY-MM-DD HH:mm:ss') : undefined,
partNumber: this.queryParams.partNumber,
materialName: this.queryParams.materialName,
operator: this.queryParams.operator,
source: this.queryParams.source
}
delete params.dateRange
//
const allResults = []
const fetchPage = (pageNum) => {
getOutboundReportByPage({ ...params, pageNum, pageSize: 1000 }).then((res) => {
if (res.code == 200) {
const results = res.data.result || []
allResults.push(...results)
//
if (allResults.length < res.data.totalNum) {
fetchPage(pageNum + 1)
} else {
//
this.$message.closeAll()
resolve(allResults)
}
} else {
//
this.$message.closeAll()
this.$message({
message: '获取导出数据失败',
type: 'error'
})
resolve([])
}
}).catch(() => {
//
this.$message.closeAll()
this.$message({
message: '获取导出数据失败',
type: 'error'
})
resolve([])
})
}
//
fetchPage(1)
})
}
}
}
</script>
<style scoped>
/* 可以添加一些自定义样式 */
</style>