diff --git a/src/views/modules/npcIqc/logisticsManagement.vue b/src/views/modules/npcIqc/logisticsManagement.vue index be9a704..5f78e34 100644 --- a/src/views/modules/npcIqc/logisticsManagement.vue +++ b/src/views/modules/npcIqc/logisticsManagement.vue @@ -15,6 +15,7 @@ 查询 + 导出 @@ -138,6 +139,7 @@ import LogisticsAttachmentTab from './com_logisticsAttachmentTab.vue' import { searchLogistics, getPoList } from '@/api/npcIqc/npcIqc.js' import Chooselist from '@/views/modules/common/Chooselist_eam' +import excel from '@/utils/excel-util.js' export default { components: { @@ -321,6 +323,167 @@ export default { const month = String(d.getMonth() + 1).padStart(2, '0') const day = String(d.getDate()).padStart(2, '0') 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 () {