You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

625 lines
18 KiB

<template>
<div class="mod-config">
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" :model="searchData">
<el-form-item label="Customer">
<el-input v-model="searchData.customer" clearable style="width: 120px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" clearable style="width: 140px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="物料编号">
<el-input v-model="searchData.partNo" clearable style="width: 120px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="Buyer">
<el-input v-model="searchData.buyer" clearable style="width: 120px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="PO No">
<el-input v-model="searchData.poNo" clearable style="width: 140px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="SKU">
<el-input v-model="searchData.sku" clearable style="width: 120px" @keyup.enter.native="getDataList"></el-input>
</el-form-item>
<el-form-item label="Status">
<el-select v-model="searchData.status" placeholder="请选择" style="width:100px" clearable>
<el-option label="全部" value=""></el-option>
<el-option label="已下达" value="已下达"></el-option>
<el-option label="已取消" value="已取消"></el-option>
</el-select>
</el-form-item>
</el-form>
<el-form :inline="true" label-position="top" style="margin-top:10px">
<el-form-item>
<el-button type="primary" @click="getDataList">查询</el-button>
<el-button type="primary" @click="exportExcel" style="margin-left: 2px">导出</el-button>
<el-button @click="resetSearch">重置</el-button>
</el-form-item>
</el-form>
<!-- 数据表格 -->
<el-table
ref="poTable"
:height="height"
:data="dataList"
border
highlight-current-row
v-loading="loading"
@row-click="changeData"
style="width: 100%;">
<el-table-column
v-for="(item, index) in visibleColumns"
:key="item.serialNumber || index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed === '' ? false : item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span>{{ scope.row[item.columnProp] }}</span>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[20, 50, 100, 200, 500]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 详情页签 -->
<el-tabs v-model="activeTab" style="margin-top: 0px; width: 99%;" @tab-click="handleTabClick" class="customer-tab" type="border-card">
<!-- 物流信息 -->
<el-tab-pane label="物流" name="logistics">
<logistics-po-list ref="logisticsPoList" />
</el-tab-pane>
<!-- 验货明细 -->
<el-tab-pane label="验货明细" name="inspectionDetail">
<inspection-detail-list ref="inspectionDetailList" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { searchPoDetailPage } from '@/api/order/poOrder.js'
import excel from '@/utils/excel-util.js'
import LogisticsPoList from './com_logisticsPoList.vue'
import InspectionDetailList from './com_inspectionDetailList.vue'
export default {
components: {
LogisticsPoList,
InspectionDetailList
},
name: 'PoOrderQuery',
data() {
return {
loading: false,
exportLoading: false,
height: 400,
activeTab: 'logistics',
pageIndex: 1,
pageSize: 20,
totalPage: 0,
dataList: [],
currentRow: {},
searchData: {
site: this.$store.state.user.site,
customer: '',
buyer: '',
poNo: '',
sku: '',
status: '',
supplierName: '',
partNo: '',
feeDateStart: '',
feeDateEnd: ''
},
// 列配置(与原始页面保持一致,但隐藏编辑相关列)
columnList: [
{
columnProp: 'customer',
columnLabel: 'Customer',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'buyer',
columnLabel: 'Buyer',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'supplierName',
columnLabel: 'Vendor Name',
align: 'center',
columnWidth: 120,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'shortOffice',
columnLabel: 'V_Short_Office',
align: 'center',
columnWidth: 110,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'shortNpc',
columnLabel: 'V_Short_NPC',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'poNo',
columnLabel: 'PO_No',
align: 'center',
columnWidth: 120,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'partNo',
columnLabel: 'Item',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'category',
columnLabel: 'Category',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'sku',
columnLabel: 'SKU',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'price',
columnLabel: 'Unit Price',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'qty',
columnLabel: 'PO Qty',
align: 'center',
columnWidth: 80,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'value',
columnLabel: 'PO Value',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'shipQty',
columnLabel: 'A-Qty',
align: 'center',
columnWidth: 80,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'sumPrice',
columnLabel: 'A-Value',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'departure',
columnLabel: 'Departure Port',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'destination',
columnLabel: 'Destination Port',
align: 'center',
columnWidth: 110,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'shipVia',
columnLabel: 'Method',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'orderDate',
columnLabel: 'Buyer Release Date',
align: 'center',
columnWidth: 130,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'enquiry',
columnLabel: 'Planner Release Date',
align: 'center',
columnWidth: 140,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'status',
columnLabel: 'Status',
align: 'center',
columnWidth: 80,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'confirmed',
columnLabel: 'PI Confirmed Date',
align: 'center',
columnWidth: 120,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'wantReceiveDate',
columnLabel: 'Original Arrival Date',
align: 'center',
columnWidth: 130,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'narrival',
columnLabel: 'Final Confirmed Arrival Date',
align: 'center',
columnWidth: 110,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'crd',
columnLabel: 'PI Confirmed CRD',
align: 'center',
columnWidth: 120,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'inspection',
columnLabel: 'Inspection Date',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'realCrd',
columnLabel: 'Actual Completion Date',
align: 'center',
columnWidth: 150,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'eta',
columnLabel: 'ETA',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'flexid',
columnLabel: 'Flexport Id',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'obd',
columnLabel: 'On Board Date',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'docSent',
columnLabel: 'Doc Sent',
align: 'center',
columnWidth: 90,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'telexRelease',
columnLabel: 'Telex Release',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'advancePayment',
columnLabel: 'Advance Payment',
align: 'center',
columnWidth: 120,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'advancePaid',
columnLabel: 'Advanc Paid',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'createTime',
columnLabel: 'Create Date',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'planner',
columnLabel: 'M-Planner',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'edit',
columnLabel: 'Edit Date',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'endPlanner',
columnLabel: 'Last Editor',
align: 'center',
columnWidth: 100,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'remarkDelay',
columnLabel: 'Remark Delay',
align: 'center',
columnWidth: 110,
showOverflowTooltip: true,
headerAlign: 'center'
},
{
columnProp: 'remark',
columnLabel: 'Comments',
align: 'center',
columnWidth: 140,
showOverflowTooltip: true,
headerAlign: 'center'
}
]
}
},
computed: {
visibleColumns() {
return this.columnList.filter(c => !c.columnHidden)
}
},
created() {
this.getDataList()
},
mounted() {
this.$nextTick(() => {
// 模仿 supplierList.vue 的高度分配方式
this.height = (window.innerHeight - 220) / 2
})
},
methods: {
// 查询数据
getDataList() {
this.loading = true
const params = {
...this.searchData,
page: this.pageIndex,
limit: this.pageSize
}
searchPoDetailPage(params).then(({ data }) => {
if (data.code === 0) {
this.dataList = data.page.list || []
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
// 如果有数据,默认选中第一行并触发页签查询
if (this.dataList.length > 0) {
this.$nextTick(() => {
if (this.$refs.poTable) {
this.$refs.poTable.setCurrentRow(this.dataList[0])
}
this.changeData(this.dataList[0])
})
}
} else {
this.$message.error((data && data.msg) || '获取列表失败')
}
this.loading = false
}).catch(() => {
this.loading = false
this.$message.error('请求失败')
})
},
// 重置查询条件
resetSearch() {
this.searchData = {
site: this.$store.state.user.site,
customer: '',
buyer: '',
poNo: '',
sku: '',
status: '',
supplierName: '',
partNo: '',
feeDateStart: '',
feeDateEnd: ''
}
this.pageIndex = 1
this.getDataList()
},
// 导出
exportExcel () {
console.log('开始导出...')
// 生成文件名
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 = `PO订单列表${year}${month}${day}${hour}${minute}${second}`
// 获取当前查询条件
const exportParams = {
...this.searchData,
limit: 99999,
page: 1
}
console.log('导出参数:', exportParams)
try {
excel.exportTable({
url: 'pODetail/page',
columnMapping: this.visibleColumns,
mergeSetting: [],
params: exportParams,
fileName: exportName + '.xlsx',
rowFetcher: res => {
console.log('导出接口响应:', res)
// 接口返回 {code, msg, rows} 结构
return { rows: (res.data && res.data.rows) || [] }
},
columnFormatter: [],
dropColumns: []
})
console.log('导出请求已发送')
} catch (error) {
console.error('导出失败:', error)
this.$message.error('导出失败: ' + error.message)
}
},
// 每页数
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
// 行点击事件(模仿 supplierList.vue 的 changeData 模式)
changeData(row) {
this.currentRow = JSON.parse(JSON.stringify(row))
this.refreshCurrentTabTable()
},
// 刷新当前页签的表格数据(模仿 supplierList.vue 的 refreshCurrentTabTable)
refreshCurrentTabTable() {
if (this.currentRow === '' || this.currentRow === null) {
this.currentRow = { flexid: '', supplierNo: '' }
}
if (this.activeTab === 'logistics') {
this.refreshLogisticsTable()
}
if (this.activeTab === 'inspectionDetail') {
this.refreshInspectionTable()
}
},
// 刷新物流页签表格(模仿 supplierList.vue 的 refreshShareTable)
refreshLogisticsTable() {
let inData = {
flexId: this.currentRow.flexid,
supplierNo: this.currentRow.supplierNo,
site: this.$store.state.user.site,
height: Number(this.height) - 20
}
this.$refs.logisticsPoList.init(inData)
},
// 刷新验货明细页签表格
refreshInspectionTable() {
let inData = {
site: this.$store.state.user.site,
orderRef1: this.currentRow.poNo || '',
height: Number(this.height) - 20
}
this.$refs.inspectionDetailList.init(inData)
},
// 页签点击事件(模仿 supplierList.vue 的 tabClick)
handleTabClick(tab, event) {
this.refreshCurrentTabTable()
}
}
}
</script>
<style scoped lang="scss">
.el-table /deep/ .cell {
height: auto;
line-height: 1.5;
}
/deep/ .customer-tab .el-tabs__content {
padding: 5px !important;
}
</style>