|
|
@ -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 () { |
|
|
|