|
|
|
@ -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 || '' // CRD日期默认为PO中的CRD日期 |
|
|
|
})) |
|
|
|
|
|
|
|
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> |