Browse Source

feat(logistics): 添加物流管理页面导出功能

- 在搜索栏添加导出按钮
- 实现物流管理主表数据导出逻辑
- 集成PO清单数据与主表数据合并导出
- 添加导出进度提示和加载状态
- 实现Excel文件生成和下载功能
- 定义导出列映射配置支持中文表头
- 处理无PO清单数据情况下的空值导出
master
qiankanghui 2 weeks ago
parent
commit
c428d61be2
  1. 163
      src/views/modules/npcIqc/logisticsManagement.vue

163
src/views/modules/npcIqc/logisticsManagement.vue

@ -15,6 +15,7 @@
</el-form-item> </el-form-item>
<el-form-item label=" " class="search-item search-btn-item"> <el-form-item label=" " class="search-item search-btn-item">
<el-button type="primary" @click="getMainData">查询</el-button> <el-button type="primary" @click="getMainData">查询</el-button>
<el-button type="primary" @click="exportExcel" style="margin-left: 2px">导出</el-button>
</el-form-item> </el-form-item>
</div> </div>
</el-form> </el-form>
@ -138,6 +139,7 @@
import LogisticsAttachmentTab from './com_logisticsAttachmentTab.vue' import LogisticsAttachmentTab from './com_logisticsAttachmentTab.vue'
import { searchLogistics, getPoList } from '@/api/npcIqc/npcIqc.js' import { searchLogistics, getPoList } from '@/api/npcIqc/npcIqc.js'
import Chooselist from '@/views/modules/common/Chooselist_eam' import Chooselist from '@/views/modules/common/Chooselist_eam'
import excel from '@/utils/excel-util.js'
export default { export default {
components: { components: {
@ -321,6 +323,167 @@ export default {
const month = String(d.getMonth() + 1).padStart(2, '0') const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0') const day = String(d.getDate()).padStart(2, '0')
return `${year}-${month}-${day}` return `${year}-${month}-${day}`
},
// - +PO
async exportExcel () {
console.log('开始导出物流管理数据...')
try {
//
const loading = this.$loading({
lock: true,
text: '正在准备导出数据...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
// 1. ()
const mainParams = {
...this.searchData,
limit: -1,
page: 1
}
const { data: mainResp } = await searchLogistics(mainParams)
if (!mainResp || mainResp.code !== 0 || !mainResp.page || !mainResp.page.list) {
loading.close()
this.$message.warning('没有可导出的数据')
return
}
const mainList = mainResp.page.list
console.log(`获取到 ${mainList.length} 条主表数据`)
// 2. PO
const exportData = []
for (let i = 0; i < mainList.length; i++) {
const mainRow = mainList[i]
// PO
const poParams = {
flexId: mainRow.flexId,
supplierNo: mainRow.supplierNo || '',
site: this.$store.state.user.site,
page: 1,
limit: 1000
}
try {
const { data: poResp } = await getPoList(poParams)
const poList = (poResp && poResp.code === 0 && poResp.page) ? (poResp.page.list || []) : []
// PO,(PO)
if (poList.length === 0) {
exportData.push({
//
flexId: mainRow.flexId,
supplierNo: mainRow.supplierNo,
supplierName: mainRow.supplierName,
poCount: mainRow.poCount,
shippedQty: mainRow.shippedQty,
// PO()
ccustomer: '',
orderRef1: '',
orderDate: '',
partNo: '',
sku: '',
qty: '',
shippedQtyPo: ''
})
} else {
// PO,PO
poList.forEach(po => {
exportData.push({
//
flexId: mainRow.flexId,
supplierNo: mainRow.supplierNo,
supplierName: mainRow.supplierName,
poCount: mainRow.poCount,
shippedQty: mainRow.shippedQty,
// PO
ccustomer: po.ccustomer || '',
orderRef1: po.orderRef1 || '',
orderDate: this.formatDate(po.orderDate),
partNo: po.partNo || '',
sku: po.sku || '',
qty: po.qty || '',
shippedQtyPo: po.shippedQty || ''
})
})
}
} catch (error) {
console.error(`获取 ${mainRow.flexId} 的PO清单失败:`, error)
// 使PO,
}
//
loading.text = `正在处理 ${i + 1}/${mainList.length} 条数据...`
}
loading.close()
console.log(`共生成 ${exportData.length} 条导出数据`)
// 3. 使
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hour = String(now.getHours()).padStart(2, '0')
const minute = String(now.getMinutes()).padStart(2, '0')
const second = String(now.getSeconds()).padStart(2, '0')
const exportName = `物流管理_${year}${month}${day}${hour}${minute}${second}`
//
const columnMapping = [
{ columnProp: 'flexId', columnLabel: '进仓编号' },
{ columnProp: 'supplierNo', columnLabel: '供应商编码' },
{ columnProp: 'supplierName', columnLabel: '供应商名称' },
{ columnProp: 'poCount', columnLabel: 'PO数量' },
{ columnProp: 'shippedQty', columnLabel: '已出货数量' },
{ columnProp: 'ccustomer', columnLabel: 'Customer' },
{ columnProp: 'orderRef1', columnLabel: 'PO' },
{ columnProp: 'orderDate', columnLabel: 'PO日期' },
{ columnProp: 'partNo', columnLabel: 'Item' },
{ columnProp: 'sku', columnLabel: 'SKU' },
{ columnProp: 'qty', columnLabel: 'Qty' },
{ columnProp: 'shippedQtyPo', columnLabel: 'Qty Shipped' }
]
// ()
this.downloadExcelFile(exportData, columnMapping, exportName)
} catch (error) {
console.error('导出失败:', error)
this.$message.error('导出失败: ' + error.message)
}
},
// Excel
downloadExcelFile (data, columns, fileName) {
const XLSX = require('xlsx')
//
const headerRow = columns.map(col => col.columnLabel)
const dataRows = data.map(row => columns.map(col => row[col.columnProp] || ''))
//
const wsData = [headerRow, ...dataRows]
//
const ws = XLSX.utils.aoa_to_sheet(wsData)
//
ws['!cols'] = columns.map(() => ({ wch: 15 }))
// 簿
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
//
XLSX.writeFile(wb, `${fileName}.xlsx`)
this.$message.success('导出成功')
} }
}, },
created () { created () {

Loading…
Cancel
Save