Browse Source

feat(inspection): 增加验货申请明细管理和供应商地址编辑功能

- 新增 addInspectionDetails 和 editInspectionDetails API 接口
- 实现 PO 明细的编辑模式,支持在线修改验货数量、运输方式和 CRD 日期
- 添加新增 PO 明细弹窗功能,支持批量选择和添加 PO 记录
- 实现供应商地址编辑权限控制和地址编辑弹窗
- 在 PO 明细表格中添加操作按钮列,支持编辑和新增功能
- 优化表格列显示,将验货数量改为可编辑的数字输入框
- 添加运输方式和 CRD 日期的选择控件
- 实现未验货数量的实时计算和显示
- 添加新增 PO 明细的搜索和筛选功能
- 完善地址编辑表单验证和数据提交流程
master
qiankanghui 4 days ago
parent
commit
935c717cbc
  1. 6
      src/api/inspection/inspectionRequestHeader.js
  2. 781
      src/views/modules/inspection/inspectionRequestList.vue

6
src/api/inspection/inspectionRequestHeader.js

@ -84,3 +84,9 @@ export const startInspection = (data) => createAPI(`/inspection/startInspection`
// 导出验货申请单(后端生成带边框样式的Excel)
export const exportInspectionRequest = (requestNo, site) => createAPI(`/inspection/export/${requestNo}`, 'get', { site: site }, 'download')
// 新增验货申请明细
export const addInspectionDetails = (data) => createAPI(`/inspection/addDetails`, 'post', data)
// 编辑验货申请明细
export const editInspectionDetails = (data) => createAPI(`/inspection/editDetails`, 'post', data)

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

@ -304,7 +304,13 @@
<!-- 步骤2批量选择PO / 编辑态PO明细 -->
<div class="po-section">
<div class="section-title">{{ isEditDialogMode ? 'PO明细' : '批量选择PO' }}</div>
<div class="section-title">
<span>{{ isEditDialogMode ? 'PO明细' : '批量选择PO' }}</span>
<el-button v-if="isEditDialogMode && !editPoEditMode" type="primary" style="margin-left: 10px" @click="enableEditPoEdit">编辑</el-button>
<el-button v-if="isEditDialogMode && !editPoEditMode" type="success" style="margin-left: 5px" @click="openAddPoDialog">新增</el-button>
<el-button v-if="isEditDialogMode && editPoEditMode" type="primary" style="margin-left: 10px" @click="saveEditPoChanges">保存</el-button>
<el-button v-if="isEditDialogMode && editPoEditMode" style="margin-left: 5px" @click="cancelEditPoEdit">取消</el-button>
</div>
<!-- PO号筛选和排序工具栏 -->
<div v-if="!isEditDialogMode" class="po-toolbar">
@ -447,9 +453,46 @@
<el-table-column prop="item" label="Item" header-align="center" align="left" min-width="100" show-overflow-tooltip/>
<el-table-column prop="sku" label="SKU" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
<el-table-column prop="partDesc" label="物料名称" header-align="center" align="left" min-width="150" show-overflow-tooltip/>
<el-table-column prop="qty" label="验货数量" header-align="center" align="right" width="110"/>
<el-table-column prop="shipMothod" label="运输方式" header-align="center" align="center" width="100"/>
<el-table-column prop="crd" label="CRD日期" header-align="center" align="center" width="120"/>
<el-table-column prop="waitInspectQty" label="未验货数量" header-align="center" align="right" width="90"/>
<el-table-column label="验货数量" header-align="center" align="center" width="150">
<template slot-scope="scope">
<el-input-number
v-if="editPoEditMode"
v-model="scope.row.qty"
:min="0"
:max="scope.row.waitInspectQty || 999999"
size="mini"
:controls="false"
style="width: 100%;">
</el-input-number>
<span v-else>{{ scope.row.qty }}</span>
</template>
</el-table-column>
<el-table-column label="运输方式" header-align="center" align="center" width="120">
<template slot-scope="scope">
<el-select v-if="editPoEditMode" v-model="scope.row.shipMothod" placeholder="请选择" size="mini" style="width: 100%;">
<el-option label="空运" value="空运"></el-option>
<el-option label="海运" value="海运"></el-option>
<el-option label="陆运" value="陆运"></el-option>
</el-select>
<span v-else>{{ scope.row.shipMothod }}</span>
</template>
</el-table-column>
<el-table-column label="CRD日期" header-align="center" align="center" width="160">
<template slot-scope="scope">
<el-date-picker
v-if="editPoEditMode"
v-model="scope.row.crd"
type="date"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
placeholder="选择日期"
size="mini"
style="width: 100%;">
</el-date-picker>
<span v-else>{{ scope.row.crd }}</span>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
@ -568,6 +611,11 @@
<el-table-column prop="contact" label="联系人" header-align="center" align="left" min-width="120" show-overflow-tooltip />
<el-table-column prop="phoneNo" label="联系电话" header-align="center" align="left" min-width="140" show-overflow-tooltip />
<el-table-column prop="email" label="邮箱" header-align="center" align="left" min-width="180" show-overflow-tooltip />
<el-table-column v-if="hasAddressEditPermission" fixed="right" header-align="center" align="center" width="100" label="操作">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click="editAddress(scope.row)">编辑</el-link>
</template>
</el-table-column>
</el-table>
<el-pagination
@ -706,6 +754,207 @@
</span>
</el-dialog>
<!-- 编辑供应商地址与com_srmSupplier_Address.vue的修改弹窗保持一致 -->
<el-dialog
title="供应商地址"
:close-on-click-modal="false"
v-drag
:visible.sync="addressEditDialogVisible"
@closed="handleAddressEditDialogClosed"
width="600px"
append-to-body>
<el-form
ref="addressEditFormRef"
:model="addressEditForm"
:rules="addressCreateRules"
label-position="top"
label-width="100px">
<!-- 供应商ID / 城市简称 / 是否在用 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="供应商ID" prop="supplierId">
<el-input v-model="addressEditForm.supplierId" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在城市简称" prop="cityShort">
<el-input v-model="addressEditForm.cityShort" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否在用" prop="active">
<el-select v-model="addressEditForm.active" style="width: 100%">
<el-option label="Y" value="Y" />
<el-option label="N" value="N" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 公司名称 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="addressEditForm.companyName" />
</el-form-item>
</el-col>
</el-row>
<!-- 联系人 / 电话 / 地址类型 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="联系人" prop="contact">
<el-input v-model="addressEditForm.contact" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="phoneNo">
<el-input v-model="addressEditForm.phoneNo" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="地址类型" prop="addressType">
<sys-dict-select
v-model="addressEditForm.addressType"
dict-type="address_type"
placeholder="请选择地址类型"
width="100%"
filterable
/>
</el-form-item>
</el-col>
</el-row>
<!-- 邮箱 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="邮箱" prop="email">
<el-input v-model="addressEditForm.email" />
</el-form-item>
</el-col>
</el-row>
<!-- 原产国 / 装运港 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原产国" prop="originCountry">
<el-input v-model="addressEditForm.originCountry" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="portOfLoading">
<span slot="label" style="cursor: pointer" @click="getBaseList(2018, 'addressEditPortOfLoading')"><a href="#">装运港</a></span>
<el-input v-model="addressEditForm.portOfLoading" readonly />
</el-form-item>
</el-col>
</el-row>
<!-- 地址 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="地址" prop="address">
<el-input v-model="addressEditForm.address" />
</el-form-item>
</el-col>
</el-row>
<!-- 备注 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="memo">
<el-input v-model="addressEditForm.memo" type="textarea" :rows="1" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer" style="margin-top: 10px; display: block">
<el-button type="primary" :loading="addressEditSaving" @click="saveEditedAddress">保存</el-button>
<el-button :disabled="addressEditSaving" @click="addressEditDialogVisible = false">关闭</el-button>
</span>
</el-dialog>
<!-- 新增PO明细弹窗 -->
<el-dialog
title="选择PO明细"
:visible.sync="addPoDialogVisible"
width="80%"
append-to-body
:close-on-click-modal="false">
<div class="rq">
<el-table
class="po-edit-table"
ref="addPoSelectTable"
:data="addPoSelectList"
border
size="small"
table-layout="fixed"
height="450px"
v-loading="addPoSelectLoading"
style="width: 100%; margin-top: -10px;"
@selection-change="handleAddPoSelectionChange">
<el-table-column type="selection" width="40" align="center" fixed="left" />
<el-table-column prop="orderRef1" label="PO号" header-align="center" align="center" width="120"/>
<el-table-column prop="orderRef2" label="PO行号" header-align="center" align="center" width="80"/>
<el-table-column prop="partNo" label="产品编码" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
<el-table-column prop="item" label="Item" header-align="center" align="left" min-width="100" show-overflow-tooltip/>
<el-table-column prop="sku" label="SKU" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
<el-table-column prop="partDesc" label="物料名称" header-align="center" align="left" min-width="150" show-overflow-tooltip/>
<el-table-column prop="planner" label="Planner" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
<el-table-column prop="qty" label="订单数量" header-align="center" align="right" width="90"/>
<el-table-column prop="waitInspectQty" label="未验货数量" header-align="center" align="right" width="90"/>
<el-table-column label="此次验货数量" header-align="center" align="center" width="150">
<template slot-scope="scope">
<el-input-number
v-model="scope.row.inspectQty"
:min="0"
:max="scope.row.waitInspectQty || 999999"
size="mini"
:controls="false"
style="width: 100%;">
</el-input-number>
</template>
</el-table-column>
<el-table-column label="运输方式" header-align="center" align="center" width="120">
<template slot-scope="scope">
<el-select v-model="scope.row.shipMethod" placeholder="请选择" size="mini" style="width: 100%;">
<el-option label="空运" value="空运"></el-option>
<el-option label="海运" value="海运"></el-option>
<el-option label="陆运" value="陆运"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="CRD日期" header-align="center" align="center" width="160">
<template slot-scope="scope">
<el-date-picker
v-model="scope.row.crd"
type="date"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
placeholder="选择日期"
size="mini"
style="width: 80%;">
</el-date-picker>
</template>
</el-table-column>
</el-table>
</div>
<el-pagination
style="margin-top: 10px; text-align: right"
@size-change="onAddPoPageSizeChange"
@current-change="onAddPoPageCurrentChange"
:current-page="addPoSelectPageIndex"
:page-sizes="[20, 50, 100, 200]"
:page-size="addPoSelectPageSize"
:total="addPoSelectTotal"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirmAddPoSelect">确认添加</el-button>
<el-button @click="addPoDialogVisible = false">取消</el-button>
</div>
</el-dialog>
<el-dialog
title="从订单选择供应商"
:visible.sync="orderSupplierDialogVisible"
@ -860,8 +1109,9 @@
</template>
<script>
import { searchInspectionRequestHeaderList, queryPoPage, queryPoSupplierPage, queryPoSupplierOrderPage, saveInspectionRequest, deleteInspectionRequest, confirmInspectionRequest, applyChangeInspectionRequest, getInspectionRequestDetailSubList, updateInspectionRequest, downloadTemplate, previewUpload, batchSave } from '@/api/inspection/inspectionRequestHeader.js'
import { searchSrmSupplierAddressList, createSrmSupplierAddress, searchSrmSupplierList } from '@/api/srm/srmSupplier.js'
import { searchInspectionRequestHeaderList, queryPoPage, queryPoSupplierPage, queryPoSupplierOrderPage, saveInspectionRequest, deleteInspectionRequest, confirmInspectionRequest, applyChangeInspectionRequest, getInspectionRequestDetailSubList, updateInspectionRequest, downloadTemplate, previewUpload, batchSave, addInspectionDetails, editInspectionDetails } from '@/api/inspection/inspectionRequestHeader.js'
import { searchSrmSupplierAddressList, createSrmSupplierAddress, updateSrmSupplierAddress, searchSrmSupplierList } from '@/api/srm/srmSupplier.js'
import { getPermissionValue } from '@/api/sys/specialSecurity.js'
import Chooselist from '@/views/modules/common/Chooselist_eam'
import SysDictSelect from '@/components/dict/SysDictSelect.vue'
import ComInspectionRequestDetail from './com_inspectionRequestDetail.vue'
@ -945,6 +1195,20 @@ export default {
filteredPoList: [],
editPoDetailList: [],
editPoDetailLoading: false,
editPoEditMode: false, // PO
addPoDialogVisible: false, // PO
addPoSelectList: [], // PO
addPoSelectLoading: false, // PO
addPoSelectPageIndex: 1, // PO
addPoSelectPageSize: 20, // PO
addPoSelectTotal: 0, // PO
addPoSelectedRows: [], // PO
addPoSearch: {
orderRef1: '',
partNo: '',
sku: '',
partDesc: ''
},
addPoFilter: {
orderNo: '',
partNo: '',
@ -978,6 +1242,8 @@ export default {
addressSearch: {
keyword: ''
},
// SRM0002 -
hasAddressEditPermission: false,
//
addressCreateDialogVisible: false,
addressCreateSaving: false,
@ -999,6 +1265,27 @@ export default {
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
},
//
addressEditDialogVisible: false,
addressEditSaving: false,
addressEditForm: {
supplierId: '',
site: this.$store.state.user.site || this.$store.state.user.currentSite || '',
addressId: '',
companyName: '',
cityShort: '',
contact: '',
phoneNo: '',
address: '',
addressType: '验货地址',
active: 'Y',
email: '',
originCountry: '',
portOfLoading: '',
memo: '',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
},
addressCreateRules: {
supplierId: [
{ required: true, validator: this.validateAddressCreateField, trigger: 'blur' }
@ -1770,6 +2057,20 @@ export default {
this.filteredPoList = []
this.editPoDetailList = []
this.editPoDetailLoading = false
this.editPoEditMode = false
this.addPoDialogVisible = false
this.addPoSelectList = []
this.addPoSelectLoading = false
this.addPoSelectPageIndex = 1
this.addPoSelectPageSize = 20
this.addPoSelectTotal = 0
this.addPoSelectedRows = []
this.addPoSearch = {
orderRef1: '',
partNo: '',
sku: '',
partDesc: ''
}
this.selectedPoList = []
this.addPoFilter = {
orderNo: '',
@ -1806,6 +2107,26 @@ export default {
this.addressCreateDialogVisible = false
this.addressCreateSaving = false
this.addressCreateForm = this.buildAddressCreateFormBySupplier('')
this.addressEditDialogVisible = false
this.addressEditSaving = false
this.addressEditForm = {
supplierId: '',
site: this.$store.state.user.site || this.$store.state.user.currentSite || '',
addressId: '',
companyName: '',
cityShort: '',
contact: '',
phoneNo: '',
address: '',
addressType: '验货地址',
active: 'Y',
email: '',
originCountry: '',
portOfLoading: '',
memo: '',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
}
this.orderSupplierDialogVisible = false
this.orderSupplierLoading = false
this.orderSupplierList = []
@ -1873,22 +2194,113 @@ export default {
}
this.editPoDetailLoading = true
try {
//
const { data } = await getInspectionRequestDetailSubList({
requestNo,
site: site || this.$store.state.user.site,
page: 1,
limit: 1000
})
if (data && data.code === 0) {
const rawList = (data.page && data.page.list) || []
const exactList = rawList.filter(item => {
const itemRequestNo = item.requestNo || item.request_no || ''
return !itemRequestNo || String(itemRequestNo) === String(requestNo)
})
this.editPoDetailList = exactList.map(item => ({
...item,
crd: this.formatToDateOnly(item.crd)
}))
// PO queryPoPage waitInspectQty
// PO + PO
const poKeys = new Set()
const poMap = new Map() // key -> originalItem
exactList.forEach(item => {
const orderRef1 = item.orderRef1 || item.order_ref1 || ''
const orderRef2 = item.orderRef2 || item.order_ref2 || ''
if (orderRef1 && orderRef2) {
const key = `${orderRef1}_${orderRef2}`
poKeys.add(key)
poMap.set(key, item)
}
})
// PO queryPoPage PO waitInspectQty
if (poKeys.size > 0) {
// PO
const firstItem = exactList[0] || {}
const supplierNo = firstItem.supplierNo || firstItem.supplier_no || this.addFormData.supplierNo
if (supplierNo) {
// queryPoPage PO
const poParams = {
site: site || this.$store.state.user.site,
supplierNo: supplierNo,
page: 1,
limit: 1000
}
try {
const { data: poData } = await queryPoPage(poParams)
if (poData && poData.code === 0) {
const poList = (poData.page && poData.page.list) || []
// PO key = orderRef1_orderRef2
const poWaitQtyMap = new Map()
poList.forEach(po => {
const orderRef1 = po.orderRef1 || po.order_ref1 || ''
const orderRef2 = po.orderRef2 || po.order_ref2 || ''
if (orderRef1 && orderRef2) {
const key = `${orderRef1}_${orderRef2}`
poWaitQtyMap.set(key, po.waitInspectQty || 0)
}
})
// waitInspectQty editPoDetailList
this.editPoDetailList = exactList.map(item => {
const orderRef1 = item.orderRef1 || item.order_ref1 || ''
const orderRef2 = item.orderRef2 || item.order_ref2 || ''
const key = `${orderRef1}_${orderRef2}`
const waitInspectQty = poWaitQtyMap.get(key) || 0
return {
...item,
waitInspectQty: waitInspectQty, //
crd: this.formatToDateOnly(item.crd)
}
})
} else {
// queryPoPage 使
this.editPoDetailList = exactList.map(item => ({
...item,
waitInspectQty: item.waitInspectQty || 0,
crd: this.formatToDateOnly(item.crd)
}))
}
} catch (error) {
console.error('查询PO明细失败:', error)
// queryPoPage 使
this.editPoDetailList = exactList.map(item => ({
...item,
waitInspectQty: item.waitInspectQty || 0,
crd: this.formatToDateOnly(item.crd)
}))
}
} else {
// 使
this.editPoDetailList = exactList.map(item => ({
...item,
waitInspectQty: item.waitInspectQty || 0,
crd: this.formatToDateOnly(item.crd)
}))
}
} else {
// PO使
this.editPoDetailList = exactList.map(item => ({
...item,
waitInspectQty: item.waitInspectQty || 0,
crd: this.formatToDateOnly(item.crd)
}))
}
} else {
this.editPoDetailList = []
this.$message.warning(data.msg || '加载PO明细失败')
@ -1902,6 +2314,226 @@ export default {
}
},
// PO
enableEditPoEdit () {
this.editPoEditMode = true
},
// PO
cancelEditPoEdit () {
this.editPoEditMode = false
//
if (this.addFormData.requestNo) {
this.loadEditPoDetailList(this.addFormData.requestNo, this.$store.state.user.site)
}
},
// PO
saveEditPoChanges () {
if (!this.editPoDetailList || this.editPoDetailList.length === 0) {
this.$message.warning('没有可保存的PO明细')
return
}
//
for (let i = 0; i < this.editPoDetailList.length; i++) {
const row = this.editPoDetailList[i]
if (!row.qty || row.qty <= 0) {
this.$message.warning(`${i + 1}行的验货数量必须大于0`)
return
}
}
//
const items = this.editPoDetailList.map(row => ({
orderNo: row.poNo || row.orderNo || row.order_ref1 || row.orderRef1 || '', // PO使
orderRef1: row.orderRef1 || row.order_ref1 || '', // 1
orderRef2: row.orderRef2 || row.order_ref2 || '', // 2
poItemNo: row.poItemNo || row.po_item_no || row.itemNo || row.item_no || row.orderRef2 || row.order_ref2 || '', // PO使poItemNo
partNo: row.partNo || '', //
qty: row.inspectQty || row.waitInspectQty || row.qty || 0, // 使
shipMethod: row.shipMethod || row.shipMothod || '', // 使
crd: row.crd || '' // CRD使
}))
const params = {
requestNo: this.addFormData.requestNo,
site: this.$store.state.user.site,
items: items
}
//
editInspectionDetails(params).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success(`成功保存${items.length}条PO明细`)
this.editPoEditMode = false
// PO
this.loadEditPoDetailList(this.addFormData.requestNo, this.$store.state.user.site)
} else {
this.$message.error(data.msg || '保存PO明细失败')
}
}).catch(error => {
console.error('保存PO明细失败:', error)
this.$message.error('保存PO明细失败: ' + (error.message || '网络错误'))
})
},
// PO
deleteEditPoRow (index) {
this.$confirm('确定要删除这条PO明细吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.editPoDetailList.splice(index, 1)
this.$message.success('删除成功')
}).catch(() => {
//
})
},
// PO
openAddPoDialog () {
if (!this.addFormData.supplierNo) {
this.$message.warning('请先选择供应商')
return
}
this.addPoDialogVisible = true
this.addPoSelectPageIndex = 1
this.addPoSelectedRows = []
this.resetAddPoSearch()
this.loadAddPoSelectList()
},
// PO
loadAddPoSelectList () {
const params = {
site: this.$store.state.user.site,
supplierNo: this.addFormData.supplierNo,
orderRef1: this.addPoSearch.orderRef1 || '',
partNo: this.addPoSearch.partNo || '',
sku: this.addPoSearch.sku || '',
partDesc: this.addPoSearch.partDesc || '',
page: this.addPoSelectPageIndex,
limit: this.addPoSelectPageSize
}
this.addPoSelectLoading = true
queryPoPage(params).then(({ data }) => {
if (data && data.code === 0) {
const pageData = data.page || {}
let list = pageData.list || []
//
list = list.map(row => ({
...row,
inspectQty: row.waitInspectQty || row.qty || 0, //
shipMethod: row.shipMethod || row.shipMothod || '', // PO
crd: row.crd || '' // CRDPOCRD
}))
this.addPoSelectList = list
this.addPoSelectTotal = pageData.totalCount || 0
this.addPoSelectPageIndex = pageData.currPage || this.addPoSelectPageIndex
this.addPoSelectPageSize = pageData.pageSize || this.addPoSelectPageSize
} else {
this.addPoSelectList = []
this.addPoSelectTotal = 0
this.$message.warning(data.msg || '加载PO列表失败')
}
}).catch(error => {
console.error('加载PO列表失败:', error)
this.addPoSelectList = []
this.addPoSelectTotal = 0
this.$message.error('加载PO列表失败')
}).finally(() => {
this.addPoSelectLoading = false
})
},
// PO
searchAddPoList () {
this.addPoSelectPageIndex = 1
this.loadAddPoSelectList()
},
// PO
resetAddPoSearch () {
this.addPoSearch = {
orderRef1: '',
partNo: '',
sku: '',
partDesc: ''
}
this.addPoSelectPageIndex = 1
this.loadAddPoSelectList()
},
// PO
onAddPoPageSizeChange (val) {
this.addPoSelectPageSize = val
this.addPoSelectPageIndex = 1
this.loadAddPoSelectList()
},
// PO
onAddPoPageCurrentChange (val) {
this.addPoSelectPageIndex = val
this.loadAddPoSelectList()
},
// PO
handleAddPoSelectionChange (rows) {
this.addPoSelectedRows = rows
},
// PO
confirmAddPoSelect () {
if (!this.addPoSelectedRows || this.addPoSelectedRows.length === 0) {
this.$message.warning('请至少选择一条PO明细')
return
}
if (!this.addFormData.requestNo) {
this.$message.warning('申请单号为空,无法添加PO明细')
return
}
// 使
const items = this.addPoSelectedRows.map(row => ({
orderNo: row.poNo || row.orderNo || row.order_ref1 || row.orderRef1 || '', // PO使
orderRef1: row.orderRef1 || row.order_ref1 || '', // 1
orderRef2: row.orderRef2 || row.order_ref2 || '', // 2
poItemNo: row.poItemNo || row.po_item_no || row.itemNo || row.item_no || row.orderRef2 || row.order_ref2 || '', // PO使poItemNo
partNo: row.partNo || '', //
qty: row.inspectQty || row.waitInspectQty || row.qty || 0, // 使
shipMethod: row.shipMethod || row.shipMothod || '', // 使
crd: row.crd || '' // CRD使
}))
const params = {
requestNo: this.addFormData.requestNo,
site: this.$store.state.user.site,
items: items
}
//
addInspectionDetails(params).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success(`成功添加${items.length}条PO明细`)
this.addPoDialogVisible = false
this.addPoSelectedRows = []
// PO
this.loadEditPoDetailList(this.addFormData.requestNo, this.$store.state.user.site)
} else {
this.$message.error(data.msg || '添加PO明细失败')
}
}).catch(error => {
console.error('添加PO明细失败:', error)
this.$message.error('添加PO明细失败: ' + (error.message || '网络错误'))
})
},
//
selectSupplier () {
this.tagNo = 520 // tagNo
@ -2052,7 +2684,7 @@ export default {
this.addressCreateSaving = false
},
//
//
openAddressDialog () {
if (!this.addFormData.supplierNo) {
this.$message.warning('请先选择供应商')
@ -2063,9 +2695,119 @@ export default {
this.addressSearch.keyword = ''
this.addressCurrentRow = null
this.addressCreateForm = this.buildAddressCreateFormBySupplier(this.addFormData.supplierNo || '')
//
this.checkAddressEditPermission()
this.loadAddressList()
},
//
checkAddressEditPermission () {
const username = this.$store.state.user.name || ''
if (!username) {
this.hasAddressEditPermission = false
return
}
getPermissionValue(username, 'SRM0002').then(({ data }) => {
if (data && data.code === 0) {
// value 'Y'
this.hasAddressEditPermission = String(data.value).trim() === 'Y'
} else {
this.hasAddressEditPermission = false
}
}).catch(error => {
console.error('查询权限失败:', error)
this.hasAddressEditPermission = false
})
},
//
editAddress (row) {
if (!row || !row.addressId) {
this.$message.warning('请选择要编辑的地址')
return
}
//
this.addressEditForm = {
supplierId: row.supplierId || row.supplier_id || '',
site: row.site || this.$store.state.user.site || '',
addressId: row.addressId || row.address_id || '',
companyName: row.companyName || row.company_name || '',
cityShort: row.cityShort || row.city_short || '',
contact: row.contact || '',
phoneNo: row.phoneNo || row.phone_no || '',
address: row.address || '',
addressType: row.addressType || row.address_type || '验货地址',
active: row.active || 'Y',
email: row.email || '',
originCountry: row.originCountry || row.origin_country || '',
portOfLoading: row.portOfLoading || row.port_of_loading || '',
memo: row.memo || '',
createBy: row.createBy || row.create_by || '',
updateBy: this.$store.state.user.name
}
this.addressEditDialogVisible = true
this.$nextTick(() => {
if (this.$refs.addressEditFormRef) {
this.$refs.addressEditFormRef.clearValidate()
}
})
},
//
saveEditedAddress () {
if (!this.$refs.addressEditFormRef) {
return
}
this.$refs.addressEditFormRef.validate((valid) => {
if (!valid) {
return
}
this.addressEditSaving = true
this.addressEditForm.updateBy = this.$store.state.user.name
updateSrmSupplierAddress(this.addressEditForm).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('更新供应商地址成功')
this.addressEditDialogVisible = false
//
this.loadAddressList()
} else {
this.$alert(data.msg || '更新供应商地址失败', '错误', { confirmButtonText: '确定' })
}
}).catch((error) => {
console.error('更新供应商地址失败:', error)
this.$message.error('更新失败: ' + (error.message || '网络错误'))
}).finally(() => {
this.addressEditSaving = false
})
})
},
//
handleAddressEditDialogClosed () {
if (this.$refs.addressEditFormRef) {
this.$refs.addressEditFormRef.clearValidate()
}
this.addressEditForm = {
supplierId: '',
site: this.$store.state.user.site || this.$store.state.user.currentSite || '',
addressId: '',
companyName: '',
cityShort: '',
contact: '',
phoneNo: '',
address: '',
addressType: '验货地址',
active: 'Y',
email: '',
originCountry: '',
portOfLoading: '',
memo: '',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name
}
this.addressEditSaving = false
},
// 线
normalizeAddressRows (list) {
return (list || []).map(item => ({
@ -3411,4 +4153,21 @@ export default {
.add-po-search-form {
margin-bottom: 8px;
}
/* 新增PO明细弹窗表格单元格高度调整 */
/deep/ .el-dialog__body .el-table--small .el-table__row td {
padding: 8px 0;
}
/deep/ .el-dialog__body .el-table--small .cell {
line-height: 24px;
min-height: 36px;
}
/deep/ .el-dialog__body .el-table--small .el-input-number,
/deep/ .el-dialog__body .el-table--small .el-select,
/deep/ .el-dialog__body .el-table--small .el-date-editor {
height: 28px;
}
</style>
Loading…
Cancel
Save