Browse Source

refactor(supplier): 优化供应商地址和零件信息管理功能

- 移除供应商地址默认值设置,清空地址类型初始值
- 为零件信息表单添加条件验证规则,新增和编辑模式下必填字段动态控制
- 删除零件规格必填验证规则,调整表单验证逻辑
- 在采购订单中添加运输方式默认填充功能,自动设置为海运
- 修复属性项目表格固定列错位问题,添加数据变化后重新布局逻辑
- 重构供应商零件MOQ价格维护界面,将MOQ维护整合到现有表单中
- 删除独立的MOQ维护弹窗组件,简化用户操作流程
- 优化MOQ数据保存逻辑,与阶梯价格合并提交并增强错误处理
- 添加复制操作后的数据同步机制,确保列表及时更新显示最新信息
master
qiankanghui 2 weeks ago
parent
commit
de0e6538a6
  1. 9
      src/views/modules/base/propertiesItem/propertiesModel.vue
  2. 21
      src/views/modules/order/poOrder.vue
  3. 9
      src/views/modules/srmPart/partInfoList.vue
  4. 10
      src/views/modules/srmSupplier/com_srmSupplier_Address.vue
  5. 188
      src/views/modules/supplier/supplierPartMoqPrice.vue

9
src/views/modules/base/propertiesItem/propertiesModel.vue

@ -176,6 +176,7 @@
:height="300"
:data="detailList"
border
ref="detailTable"
v-loading="dataListLoading"
style="width: 100%;">
<el-table-column
@ -423,6 +424,14 @@ export default {
this.detailData.itemNo = this.detailData.itemNo.toUpperCase()
}
},
// 属性项目清单数据变化后重排表格,修正固定列(上移/下移、操作)被滚动条遮挡的错位
detailList() {
this.$nextTick(() => {
if (this.$refs.detailTable) {
this.$refs.detailTable.doLayout()
}
})
},
},
data() {
return {

21
src/views/modules/order/poOrder.vue

@ -3889,6 +3889,7 @@ export default {
if (data && data.code === 0 && data.data) {
this.addFormSchemaFields = data.data.fields || []
this.applyAddDefaultDateBySchema()
this.applyAddDefaultShipViaBySchema(this.addForm)
return this.preloadAddDictSelectOptions(this.addFormSchemaFields).then(() => true)
} else {
this.addFormSchemaFields = []
@ -3933,6 +3934,25 @@ export default {
})
},
// 新增 schema 中若展示运输方式(ship_via / S_Method),则默认填充为海运
applyAddDefaultShipViaBySchema (targetForm) {
if (!targetForm || !Array.isArray(this.addFormSchemaFields) || !this.addFormSchemaFields.length) {
return
}
const field = this.getSchemaFieldByCode('ship_via')
if (!field || String(field.visibleFlag || '').trim().toUpperCase() !== 'Y') {
return
}
const prop = this.getAddFieldProp(field)
if (!prop) {
return
}
const current = targetForm[prop]
if (current === undefined || current === null || String(current).trim() === '') {
this.$set(targetForm, prop, '海运')
}
},
getFormExtValue (targetForm, fieldCode) {
if (!targetForm || !targetForm.extValues) {
return ''
@ -4023,6 +4043,7 @@ export default {
form.customer = this.searchData.customer || form.customer
form.site = this.searchData.site || this.$store.state.user.site
this.applyDefaultDateBySchemaToForm(form)
this.applyAddDefaultShipViaBySchema(form)
return form
},

9
src/views/modules/srmPart/partInfoList.vue

@ -145,12 +145,12 @@
<div class="form-section">
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="基准料号" prop="basePartNo">
<el-form-item label="基准料号" prop="basePartNo" :required="isAdd">
<el-input v-model="currentpart.basePartNo" :disabled="!isAdd" @input="syncGeneratedPartNo"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="物料后缀" prop="partSuffix">
<el-form-item label="物料后缀" prop="partSuffix" :required="isAdd">
<el-input v-model="currentpart.partSuffix" :disabled="!isAdd" @input="syncGeneratedPartNo"></el-input>
</el-form-item>
</el-col>
@ -173,7 +173,7 @@
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="defaultSupplierNo">
<el-form-item prop="defaultSupplierNo" :required="isAdd">
<span style="cursor: pointer" slot="label" @click="getBaseList(520)"><a href="#">默认供应商</a></span>
<el-input v-model="currentpart.defaultSupplierNo" ></el-input>
</el-form-item>
@ -915,9 +915,6 @@ export default {
],
npc: [
{ required: true, message: ' ', trigger: 'blur' }
],
partSpec: [
{ required: true, message: ' ', trigger: 'blur' }
],
codeNo: [
{ required: true, message: ' ', trigger: 'blur' }

10
src/views/modules/srmSupplier/com_srmSupplier_Address.vue

@ -612,7 +612,7 @@ export default {
contact: '',
phoneNo: '',
address: '',
addressType: '验货地址',
addressType: '',
active: 'Y',
email: '',
originCountry: '',
@ -628,7 +628,7 @@ export default {
if (this.$refs.modalForm) {
this.$refs.modalForm.clearValidate();
}
// 根据供应商ID自动查询公司名称等信息
if (this.modalData.supplierId) {
this.fetchSupplierInfo(this.modalData.supplierId);
@ -663,7 +663,7 @@ export default {
if (this.$refs.modalForm) {
this.$refs.modalForm.clearValidate();
}
// 编辑模式下,如果已有公司名称则直接使用,否则根据供应商ID查询
if (!this.modalData.companyName && this.modalData.supplierId) {
this.fetchSupplierInfo(this.modalData.supplierId);
@ -787,12 +787,12 @@ export default {
page: 1,
limit: 1
}
searchSrmSupplierList(params).then(({data}) => {
if (data && data.code === 0) {
const pageData = data.data || data.page
const supplierList = pageData && pageData.list ? pageData.list : pageData || []
if (supplierList && supplierList.length > 0) {
const supplierData = supplierList[0]
// 填充公司名称

188
src/views/modules/supplier/supplierPartMoqPrice.vue

@ -78,11 +78,6 @@
empty-text="点击查询查看数据"
@row-click="handleTopRowClick"
>
<el-table-column fixed="right" label="操作" width="130" header-align="center" align="center">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click.stop="openMoqDialog(scope.row)">维护MOQ</el-link>
</template>
</el-table-column>
<el-table-column prop="supplierCode" label="供应商编号" min-width="120" header-align="center" align="center" />
<el-table-column prop="supplierName" label="供应商名称" min-width="180" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="currency" label="币种" min-width="90" header-align="center" align="center" />
@ -138,62 +133,6 @@
<el-table-column prop="remark" label="备注" min-width="180" header-align="center" align="left" show-overflow-tooltip />
</el-table>
<el-dialog
title="维护MOQ"
:visible.sync="moqDialogVisible"
width="640px"
:close-on-click-modal="false"
v-drag
>
<el-form label-position="top" :model="moqForm">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="供应商编号">
<el-input v-model="moqForm.supplierCode" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品编码">
<el-input v-model="moqForm.partNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="MOQ/COLOR" required>
<el-input-number v-model="moqForm.moqColor" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="QTY/PO" required>
<el-input-number v-model="moqForm.moq" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="QTY/CARTON" required>
<el-input-number v-model="moqForm.qtyCarton" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="是否在用">
<el-select v-model="moqForm.active" style="width: 100%">
<el-option label="是" value="Y" />
<el-option label="否" value="N" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :disabled="moqSaveLoading" @click="saveMoq">
{{ moqSaveLoading ? '保存中...' : '保存' }}
</el-button>
<el-button :disabled="moqSaveLoading" @click="moqDialogVisible = false">取消</el-button>
</div>
</el-dialog>
<el-dialog
title="新增供应商物料"
:visible.sync="addDialogVisible"
@ -371,6 +310,39 @@
</el-col>
</el-row>
</el-form>
<div class="attachment-header">
<span>维护MOQ</span>
</div>
<el-form label-position="top" :model="tierForm">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="MOQ/COLOR" required>
<el-input-number v-model="tierForm.moqColor" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="QTY/PO" required>
<el-input-number v-model="tierForm.moq" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="QTY/CARTON" required>
<el-input-number v-model="tierForm.qtyCarton" :min="0" :controls="false" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否在用">
<el-select v-model="tierForm.active" style="width: 100%">
<el-option label="是" value="Y" />
<el-option label="否" value="N" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="attachment-header">
<span>阶梯价格</span>
</div>
<div class="rq ">
<el-table :height="300" :data="tierForm.tierPriceList" border stripe style="width: 100%; margin-top: 5px;">
<el-table-column type="index" label="#" width="50" header-align="center" align="center" />
@ -521,17 +493,6 @@ export default {
supplierPartList: [],
selectedSupplierPart: null,
currentTierPriceList: [],
moqDialogVisible: false,
moqSaveLoading: false,
moqForm: {
site: '',
supplierCode: '',
partNo: '',
moq: 0,
moqColor: 0,
qtyCarton: 0,
active: 'Y'
},
addDialogVisible: false,
addSaveLoading: false,
addForm: {
@ -570,6 +531,10 @@ export default {
sku: '',
partDesc: '',
priceDate: '',
moq: 0,
moqColor: 0,
qtyCarton: 0,
active: 'Y',
tierPriceList: []
},
attachmentLoading: false,
@ -764,52 +729,6 @@ export default {
this.bottomLoading = false
})
},
/**
* 打开维护弹窗。三个数量顺序为 MOQ/COLOR、QTY/PO、QTY/CARTON,空值按 0。
*/
openMoqDialog (row) {
this.moqForm = {
site: this.$store.state.user.site,
supplierCode: row.supplierCode,
partNo: row.partNo,
moq: this.normalizeNumberValue(row.moq, 0),
moqColor: this.normalizeNumberValue(row.moqColor, 0),
qtyCarton: this.normalizeNumberValue(row.qtyCarton, 0),
active: row.active || 'Y'
}
this.moqDialogVisible = true
},
/**
* 保存维护弹窗。三个数量都不能为空且不能小于 0,site 取当前登录站点。
*/
saveMoq () {
if (!this.validateQtyFields(this.moqForm)) {
return
}
this.moqSaveLoading = true
const inData = {
site: this.$store.state.user.site,
supplierCode: this.moqForm.supplierCode,
partNo: this.moqForm.partNo,
moq: this.moqForm.moq,
moqColor: this.moqForm.moqColor,
qtyCarton: this.moqForm.qtyCarton,
active: this.moqForm.active
}
saveSupplierPartMoq(inData).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('保存成功')
this.moqDialogVisible = false
this.searchSupplierPartList()
} else {
this.$alert((data && data.msg) || '保存失败', '错误', { confirmButtonText: '确定' })
}
}).catch(() => {
this.$message.error('保存失败')
}).finally(() => {
this.moqSaveLoading = false
})
},
openAddDialog () {
this.addForm = {
site: this.$store.state.user.site,
@ -931,6 +850,8 @@ export default {
if (data && data.code === 0) {
this.$message.success('复制成功')
this.copyDialogVisible = false
// 复制会同步价格与 MOQ,成功后刷新列表以展示最新数据
this.searchSupplierPartList()
return
}
this.$message.error((data && data.msg) || '复制失败')
@ -954,6 +875,11 @@ export default {
sku: this.selectedSupplierPart.sku || '',
partDesc: this.selectedSupplierPart.partDesc || '',
priceDate: this.getTodayDate(),
// MOQ 页签回显当前选中行的起订量与在用状态
moq: this.normalizeNumberValue(this.selectedSupplierPart.moq, 0),
moqColor: this.normalizeNumberValue(this.selectedSupplierPart.moqColor, 0),
qtyCarton: this.normalizeNumberValue(this.selectedSupplierPart.qtyCarton, 0),
active: this.selectedSupplierPart.active || 'Y',
tierPriceList: (this.currentTierPriceList || []).map(item => ({
qtyStart: this.normalizeNumberValue(item.qtyStart, 0),
qtyEnd: this.normalizeNumberValue(item.qtyEnd, 0),
@ -1067,8 +993,12 @@ export default {
if (!this.validateTierRows()) {
return
}
// MOQ 页签与阶梯价一起提交,三个起订量需校验
if (!this.validateQtyFields(this.tierForm)) {
return
}
this.tierSaveLoading = true
const inData = {
const priceInData = {
site: this.$store.state.user.site,
supplierCode: this.tierForm.supplierCode,
partNo: this.tierForm.partNo,
@ -1082,13 +1012,25 @@ export default {
remark: item.remark || ''
}))
}
saveTierPrice(inData).then(({ data }) => {
if (data && data.code === 0) {
const moqInData = {
site: this.$store.state.user.site,
supplierCode: this.tierForm.supplierCode,
partNo: this.tierForm.partNo,
moq: this.tierForm.moq,
moqColor: this.tierForm.moqColor,
qtyCarton: this.tierForm.qtyCarton,
active: this.tierForm.active
}
Promise.all([saveTierPrice(priceInData), saveSupplierPartMoq(moqInData)]).then(([priceRes, moqRes]) => {
const priceData = priceRes && priceRes.data
const moqData = moqRes && moqRes.data
if (priceData && priceData.code === 0 && moqData && moqData.code === 0) {
this.$message.success('保存成功')
this.tierDialogVisible = false
this.loadCurrentTierPrice()
// 刷新上表以同步 MOQ 列,并重载当前阶梯价
this.searchSupplierPartList()
} else {
this.$alert((data && data.msg) || '保存失败', '错误', { confirmButtonText: '确定' })
this.$alert((priceData && priceData.msg) || (moqData && moqData.msg) || '保存失败', '错误', { confirmButtonText: '确定' })
}
}).catch(() => {
this.$message.error('保存失败')

Loading…
Cancel
Save