Browse Source

feat(inspection): 添加可点击查询标签并新增PO订单查询功能

- 在检验模块多个页面添加供应商编码和申请人员的可点击标签功能
- 实现点击标签调用getBaseList方法进行基础数据查询
- 新增PO订单查询页面(poOrder_search.vue),包含完整的查询、分页和导出功能
- 优化检验计划列表中的QC人员和申请单号查询组件
- 添加申请单号选择弹窗功能,支持双击选择和搜索过滤
- 完善费用列表中的申请人选择逻辑,支持不同字段的目标赋值
master
qiankanghui 4 days ago
parent
commit
40210e274a
  1. 6
      src/views/modules/inspection/inspectionPendingList.vue
  2. 6
      src/views/modules/inspection/inspectionRequestAudit.vue
  3. 27
      src/views/modules/inspection/inspectionRequestList.vue
  4. 77
      src/views/modules/inspection/inspectionScheduleList.vue
  5. 29
      src/views/modules/inspection/srmFeeList.vue
  6. 543
      src/views/modules/order/poOrder_search.vue

6
src/views/modules/inspection/inspectionPendingList.vue

@ -3,7 +3,8 @@
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="供应商编码" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="供应商名称" class="search-item">
@ -24,7 +25,8 @@
</div>
<div class="search-row">
<el-form-item label="申请人员" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="申请单号" class="search-item">

6
src/views/modules/inspection/inspectionRequestAudit.vue

@ -3,7 +3,8 @@
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="供应商编码" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="供应商名称" class="search-item">
@ -27,7 +28,8 @@
<el-form-item label="申请单号" class="search-item">
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="申请人员" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="建议验货日期" class="search-item">

27
src/views/modules/inspection/inspectionRequestList.vue

@ -3,7 +3,8 @@
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="供应商编码" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="供应商名称" class="search-item">
@ -33,7 +34,8 @@
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="QC人员" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'qcOperator')"><a href="#">QC人员</a></span>
<el-input v-model="searchData.qcOperator" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="建议验货日期" class="search-item">
@ -1097,23 +1099,28 @@ export default {
//
const exportParams = {
...this.searchData,
limit: -1, //
limit: 99999,
page: 1
}
try {
excel.exportTable({
url: '/inspection/searchInspectionRequestHeaderList',
columnMapping: this.columnArray1, // 使
mergeSetting: [], //
url: 'inspection/searchInspectionRequestHeaderList',
columnMapping: this.columnArray1,
mergeSetting: [],
params: exportParams,
fileName: exportName + '.xlsx',
rowFetcher: res => {
console.log('导出数据响应:', res)
return res.data.page.list
}, //
columnFormatter: [], //
dropColumns: [] //
if (res.data && res.data.page && res.data.page.list) {
return res.data.page.list
}
console.error('响应数据结构异常:', res.data)
this.$message.error('导出数据格式异常,请查看控制台')
return []
},
columnFormatter: [],
dropColumns: []
})
console.log('导出请求已发送')
} catch (error) {

77
src/views/modules/inspection/inspectionScheduleList.vue

@ -3,7 +3,8 @@
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="供应商编码" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(1100)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="供应商名称" class="search-item">
@ -28,7 +29,8 @@
<el-form-item label="申请人员" class="search-item">
<el-input v-model="searchData.createBy" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="QC人员" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'qcOperator')"><a href="#">QC人员</a></span>
<el-input v-model="searchData.qcOperator" style="width: 200px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="建议验货日期" class="search-item">
@ -38,7 +40,8 @@
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 100px"/>
</div>
</el-form-item>
<el-form-item label="申请单号" class="search-item">
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="openRequestNoChooser"><a href="#">申请单号</a></span>
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="计划验货日期" class="search-item">
@ -60,6 +63,28 @@
<Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
<!-- 申请单号选择弹窗 -->
<el-dialog title="选择申请单号" :visible.sync="requestNoDialogVisible" width="800px" append-to-body :close-on-click-modal="false" @close="closeRequestNoChooser">
<el-form :inline="true" size="mini" label-position="top">
<el-form-item label="申请单号">
<el-input v-model="requestNoSearchParam" style="width: 150px" @keyup.enter.native="loadRequestNoList"/>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="loadRequestNoList">查询</el-button>
</el-form-item>
</el-form>
<el-table :data="requestNoList" border height="300" @row-dblclick="selectRequestNo" v-loading="requestNoListLoading" highlight-current-row style="width: 100%">
<el-table-column prop="requestNo" label="申请单号" header-align="center" align="left" min-width="150"/>
<el-table-column prop="requestDate" label="申请日期" header-align="center" align="center" width="120"/>
<el-table-column prop="supplierNo" label="供应商编码" header-align="center" align="left" width="120"/>
<el-table-column prop="supplierName" label="供应商名称" header-align="center" align="left" min-width="150" show-overflow-tooltip/>
<el-table-column prop="status" label="状态" header-align="center" align="center" width="100"/>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button @click="requestNoDialogVisible = false">关闭</el-button>
</span>
</el-dialog>
<el-table
:height="height"
:data="mainDataList"
@ -162,6 +187,10 @@ export default {
currentRow: {},
tagNo: '',
searchType: '',
requestNoDialogVisible: false,
requestNoList: [],
requestNoListLoading: false,
requestNoSearchParam: '',
activeTab: 'schedule',
selectedRequestNos: [],
searchData: {
@ -549,6 +578,48 @@ export default {
return ''
},
//
openRequestNoChooser () {
this.requestNoDialogVisible = true
this.requestNoSearchParam = this.searchData.requestNo || ''
this.$nextTick(() => {
this.loadRequestNoList()
})
},
//
loadRequestNoList () {
this.requestNoListLoading = true
const params = {
requestNo: this.requestNoSearchParam,
page: 1,
limit: 200
}
searchInspectionRequestHeaderList(params).then(({ data }) => {
if (data.code === 0 && data.page) {
this.requestNoList = data.page.list || []
} else {
this.requestNoList = []
}
this.requestNoListLoading = false
}).catch(() => {
this.requestNoList = []
this.requestNoListLoading = false
})
},
//
selectRequestNo (row) {
this.searchData.requestNo = row.requestNo || ''
this.requestNoDialogVisible = false
},
//
closeRequestNoChooser () {
this.requestNoList = []
this.requestNoSearchParam = ''
},
},
created () {

29
src/views/modules/inspection/srmFeeList.vue

@ -7,7 +7,8 @@
<el-input v-model="searchData.feeNo" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
<el-form-item label="申请人" class="search-item" >
<el-form-item class="search-item">
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
<el-input v-model="searchData.applyUser" style="width: 120px" @keyup.enter.native="getMainData"/>
</el-form-item>
@ -362,15 +363,21 @@ export default {
console.log('异常处理,设置 loading 为 false')
})
},
//
getBaseList(val) {
//
getBaseList(val, targetField) {
this.tagNo = val
this.targetField = targetField //
this.$nextTick(() => {
let strVal = ''
if (val === 2016) {
strVal = this.addFormData.applyUser || ''
// targetField
if (targetField === 'createBy') {
strVal = this.searchData.applyUser || ''
} else {
strVal = this.addFormData.applyUser || ''
}
}
this.$refs.baseList.init(val, strVal, '')
@ -379,13 +386,15 @@ export default {
//
getBaseData(val) {
if (this.tagNo === 2016) {
this.addFormData.applyUser = val.username
this.addFormData.applyUserName = val.user_display
this.$forceUpdate()
if (this.targetField === 'createBy') {
//
this.searchData.applyUser = val.user_display || val.username
} else {
//
this.$set(this.addFormData, 'applyUser', val.username)
this.$set(this.addFormData, 'applyUserName', val.user_display)
}
}
},
//

543
src/views/modules/order/poOrder_search.vue

@ -0,0 +1,543 @@
<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
v-loading="loading"
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>
</div>
</template>
<script>
import { searchPoDetailPage } from '@/api/order/poOrder.js'
import excel from '@/utils/excel-util.js'
export default {
name: 'PoOrderQuery',
data() {
return {
loading: false,
exportLoading: false,
height: 400,
pageIndex: 1,
pageSize: 20,
totalPage: 0,
dataList: [],
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(() => {
this.height = window.innerHeight - 220
})
},
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
} 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()
}
}
}
</script>
<style scoped lang="scss">
.el-table /deep/ .cell {
height: auto;
line-height: 1.5;
}
</style>
Loading…
Cancel
Save