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.
 
 
 
 
 

445 lines
11 KiB

<template>
<div class="customer-css">
<!-- 操作按钮 -->
<el-form :inline="true" style="margin-bottom: 2px;">
<el-button type="primary" icon="el-icon-plus" size="mini" @click="showSelectPoDialog" :disabled="!supplierNo">选择PO</el-button>
</el-form>
<!-- 已关联PO列表表格 -->
<el-table
:data="issuePoList"
border
v-loading="loading"
style="width: 100%;"
:height="tableHeight"
:header-cell-style="{ textAlign: 'center' }">
<el-table-column
prop="poNo"
label="PO"
width="180"
align="center"/>
<el-table-column
prop="poDate"
label="PO Date"
width="180"
align="center"/>
<el-table-column
prop="sku"
label="SKU"
min-width="250"
show-overflow-tooltip/>
<el-table-column
prop="poQty"
label="Qty"
width="120"
align="right"/>
<el-table-column
prop="shippedQty"
label="Qty Shipped"
width="110"
align="right"/>
<el-table-column
label="操作"
width="80"
align="center"
fixed="right">
<template slot-scope="scope">
<el-link type="danger" @click="handleDeletePo(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 选择PO对话框 -->
<el-dialog
title="选择PO"
:visible.sync="selectPoDialogVisible"
width="50%"
top="10vh"
:close-on-click-modal="false"
append-to-body>
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="search-form-inline">
<div class="search-row">
<el-form-item label="PO" class="search-item">
<el-input
v-model="poSearchData.poNo"
placeholder="PO号"
style="width:120px"
@keyup.enter.native="loadAvailablePoList"/>
</el-form-item>
<el-form-item label="Part No" class="search-item">
<el-input
v-model="poSearchData.partNo"
placeholder="料号"
style="width:120px"
@keyup.enter.native="loadAvailablePoList"/>
</el-form-item>
<el-form-item label="开始日期" class="search-item">
<el-date-picker
v-model="poSearchData.beginDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="开始日期"
style="width:120px"
clearable>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期" class="search-item">
<el-date-picker
v-model="poSearchData.endDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="结束日期"
style="width:120px"
clearable>
</el-date-picker>
</el-form-item>
<el-form-item label=" " class="search-item search-btn-item">
<el-button
type="primary"
size="small"
@click="loadAvailablePoList">
查询
</el-button>
</el-form-item>
</div>
</el-form>
<!-- 可用PO列表 -->
<el-table
ref="availablePoTable"
:data="availablePoList"
border
size="mini"
style="width: 100%; margin-top: 10px;"
height="300"
@selection-change="handleSelectionChange"
:header-cell-style="{ textAlign: 'center' }">
<el-table-column type="selection" width="50" />
<el-table-column prop="poNo" label="PO" width="120" />
<el-table-column prop="poDate" label="PO Date" width="160" />
<el-table-column prop="sku" label="SKU" />
<el-table-column prop="qty" label="Qty" width="100" align="right" />
<el-table-column prop="shippedQty" label="Qty Shipped" width="120" align="right" />
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary" :loading="saveLoading" @click="handleSavePo">保存</el-button>
<el-button @click="selectPoDialogVisible = false">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getIssuePoList, getAvailablePoList, saveIssuePo, deleteIssuePo } from '@/api/quality/qualityIssue.js'
export default {
name: 'QualityIssuePoList',
props: {
issueNo: {
type: String,
default: ''
},
site: {
type: String,
default: ''
},
supplierNo: {
type: String,
default: ''
},
tableHeight: {
type: Number,
default: 400
}
},
data() {
return {
issuePoList: [],
loading: false,
saveLoading: false,
selectPoDialogVisible: false,
availablePoList: [],
selectedPoRows: [],
poSearchData: {
poNo: '',
partNo: '',
beginDate: '',
endDate: ''
}
}
},
watch: {
issueNo: {
immediate: true,
handler(newVal) {
if (newVal) {
this.loadIssuePoList()
} else {
this.issuePoList = []
}
}
}
},
mounted() {
// 组件加载时默认执行一次查询
if (this.issueNo) {
this.loadIssuePoList()
}
},
methods: {
// 供父组件调用的加载数据方法
loadData() {
this.loadIssuePoList()
},
// 加载已关联的PO列表
loadIssuePoList() {
if (!this.issueNo) {
this.issuePoList = []
return
}
this.loading = true
getIssuePoList({
site: this.site,
issueNo: this.issueNo
}).then(({ data }) => {
if (data.code === 0) {
this.issuePoList = data.data || []
} else {
this.issuePoList = []
}
this.loading = false
}).catch(error => {
console.error('加载PO列表失败:', error)
this.loading = false
})
},
// 显示选择PO对话框
showSelectPoDialog() {
if (!this.supplierNo) {
this.$message.warning('请先选择有供应商的质量问题记录')
return
}
this.selectPoDialogVisible = true
// 重置搜索条件
this.poSearchData = {
poNo: '',
partNo: '',
beginDate: '',
endDate: ''
}
this.loadAvailablePoList()
},
// 加载可用PO列表
loadAvailablePoList() {
const params = {
site: this.site,
supplierNo: this.supplierNo,
poNo: this.poSearchData.poNo || undefined,
partNo: this.poSearchData.partNo || undefined,
beginDate: this.poSearchData.beginDate || undefined,
endDate: this.poSearchData.endDate || undefined
}
getAvailablePoList(params).then(({ data }) => {
if (data.code === 0) {
this.availablePoList = (data.page && data.page.list) || []
this.$nextTick(() => {
if (this.$refs.availablePoTable) {
this.$refs.availablePoTable.clearSelection()
}
})
} else {
this.availablePoList = []
}
}).catch(error => {
console.error('加载可用PO列表失败:', error)
this.availablePoList = []
})
},
// 选择行变化
handleSelectionChange(selection) {
this.selectedPoRows = selection
},
// 保存选中的PO
handleSavePo() {
if (this.selectedPoRows.length === 0) {
this.$message.warning('请至少选择一条PO记录')
return
}
// 检查 site 和 issueNo 是否有效
if (!this.site || !this.issueNo) {
this.$message.error('缺少必要参数:site或issueNo为空')
console.error('保存失败:site=', this.site, 'issueNo=', this.issueNo)
return
}
const poList = this.selectedPoRows.map(row => ({
poNo: row.poNo,
itemNo: row.itemNo,
partNo: row.partNo,
sku: row.sku,
qty: row.qty,
shippedQty: row.shippedQty
}))
const params = {
site: this.site,
issueNo: this.issueNo,
poList: poList
}
console.log('保存PO数据:', params)
this.saveLoading = true
saveIssuePo(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('保存成功')
this.selectPoDialogVisible = false
this.loadIssuePoList()
} else {
this.$message.error(data.msg || '保存失败')
}
this.saveLoading = false
}).catch(error => {
console.error('保存PO失败:', error)
this.$message.error('保存失败,请稍后重试')
this.saveLoading = false
})
},
// 删除PO
handleDeletePo(row) {
this.$confirm('确定要删除该PO吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
site: this.site,
issueNo: this.issueNo,
poNo: row.poNo,
itemNo: row.itemNo
}
deleteIssuePo(params).then(({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.loadIssuePoList()
} else {
this.$message.error(data.msg || '删除失败')
}
}).catch(error => {
console.error('删除PO失败:', error)
this.$message.error('删除失败,请稍后重试')
})
}).catch(() => {})
}
}
}
</script>
<style scoped lang="scss">
.customer-css {
padding: 0;
margin: 0;
background: #fff;
height: 100%;
}
.search-form-inline {
background: #fff;
padding: 0;
margin-bottom: 10px;
}
.search-row {
display: flex;
align-items: flex-end;
flex-wrap: wrap;
gap: 0;
}
.search-item {
flex: none;
margin-bottom: 0;
margin-right: 12px;
}
.search-item /deep/ .el-form-item__label {
padding-bottom: 5px;
line-height: 1;
height: auto;
}
.search-item /deep/ .el-form-item__content {
line-height: normal;
}
.search-btn-item {
margin-right: 0;
}
.date-range {
display: flex;
align-items: center;
}
.split {
padding: 0 6px;
color: #606266;
font-size: 13px;
}
.dialog-footer {
text-align: center;
}
// 表格样式统一 - 表头背景色改为青绿色
/deep/ .el-table {
font-size: 12px;
}
/deep/ .el-table th {
background-color: #17B3A3;
color: #fff;
font-weight: 500;
text-align: center;
}
/deep/ .el-table tr {
background-color: #fff;
}
/deep/ .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #f5f7fa;
}
/deep/ .el-link {
font-size: 12px;
}
</style>