Browse Source

物料大更新

master
常熟吴彦祖 4 weeks ago
parent
commit
7e74bf1754
  1. 15
      src/api/supplier/supplierPartMoqPrice.js
  2. 1068
      src/views/modules/supplier/supplierPartMoqPrice.vue
  3. 352
      src/views/modules/supplier/supplierPartTierPriceHistory.vue

15
src/api/supplier/supplierPartMoqPrice.js

@ -0,0 +1,15 @@
import { createAPI } from '@/utils/httpRequest.js'
// 供应商可供物料与MOQ接口 - rqrq
export const listSupplierPartMoq = data => createAPI('/supplier/supplierPartMoqPrice/listSupplierPart', 'post', data)
export const saveSupplierPartMoq = data => createAPI('/supplier/supplierPartMoqPrice/saveSupplierPart', 'post', data)
export const addSupplierPartMoq = data => createAPI('/supplier/supplierPartMoqPrice/addSupplierPart', 'post', data)
// 阶梯价接口 - rqrq
export const listCurrentTierPrice = data => createAPI('/supplier/supplierPartMoqPrice/listCurrentTierPrice', 'post', data)
export const saveTierPrice = data => createAPI('/supplier/supplierPartMoqPrice/saveTierPrice', 'post', data)
export const uploadTierPricePreview = data => createAPI('/supplier/supplierPartMoqPrice/uploadPreview', 'post', data)
export const uploadTierPriceConfirm = data => createAPI('/supplier/supplierPartMoqPrice/uploadConfirm', 'post', data)
export const listTierPriceHistory = data => createAPI('/supplier/supplierPartMoqPrice/listTierPriceHistory', 'post', data)
export const listTierPriceHistoryMain = data => createAPI('/supplier/supplierPartMoqPrice/listTierPriceHistoryMain', 'post', data)
export const listTierPriceHistoryDetail = data => createAPI('/supplier/supplierPartMoqPrice/listTierPriceHistoryDetail', 'post', data)

1068
src/views/modules/supplier/supplierPartMoqPrice.vue
File diff suppressed because it is too large
View File

352
src/views/modules/supplier/supplierPartTierPriceHistory.vue

@ -0,0 +1,352 @@
<template>
<div class="customer-css supplier-part-tier-price-history">
<el-form :inline="true" label-position="top" class="pi-search-form">
<el-form-item>
<span slot="label" style="" @click="getBaseList(520, 'search')"><a href="javascript:void(0)">供应商编号</a></span>
<el-input
v-model="searchData.supplierNo"
placeholder="选择或输入编号"
style="width: 180px"
clearable
@keyup.enter.native="searchMainList"
/>
</el-form-item>
<el-form-item>
<span slot="label" style="" @click="getBaseList(507, 'search')"><a href="javascript:void(0)">物料编码</a></span>
<el-input
v-model="searchData.partNo"
placeholder="选择或输入物料编码"
style="width: 180px"
clearable
@keyup.enter.native="searchMainList"
/>
</el-form-item>
<el-form-item label="价格日期">
<el-date-picker
v-model="searchData.priceDate"
type="date"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
placeholder="价格日期"
style="width: 150px"
clearable
/>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" class="customer-bun-min" :loading="mainLoading" @click="searchMainList">查询</el-button>
<el-button class="customer-bun-min" @click="resetSearch">重置</el-button>
</el-form-item>
</el-form>
<el-table
ref="mainTable"
:data="historyMainList"
:height="mainTableHeight"
border
stripe
highlight-current-row
v-loading="mainLoading"
style="width: 100%"
@row-click="handleMainRowClick"
>
<el-table-column fixed="right" label="操作" width="90" header-align="center" align="center">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click.stop="openAttachmentDialog(scope.row)">查看附件</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="currencyDesc" label="币种描述" min-width="120" header-align="center" align="center" :formatter="formatCurrencyDesc" />
<el-table-column prop="partNo" label="物料编码" min-width="140" header-align="center" align="center" />
<el-table-column prop="partDesc" label="物料名称" min-width="180" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="versionNo" label="价格版本号" min-width="180" header-align="center" align="center" />
<el-table-column prop="submitDateOnly" label="上传日期" min-width="120" header-align="center" align="center" />
<el-table-column prop="priceDate" label="价格日期" min-width="120" header-align="center" align="center" />
<el-table-column prop="submitBy" label="提交人" min-width="100" header-align="center" align="center" />
</el-table>
<div class="table-toolbar">
<span class="selected-text">
当前选择
{{ selectedMain ? `${selectedMain.supplierCode} / ${selectedMain.partNo} ` : '未选择历史主记录' }}
</span>
</div>
<el-table
:data="historyDetailList"
:height="detailTableHeight"
border
stripe
v-loading="detailLoading"
style="width: 100%"
>
<el-table-column prop="qtyStart" label="开始数量" min-width="110" header-align="center" align="right" :formatter="formatNumberCell" />
<el-table-column prop="qtyEnd" label="结束数量" min-width="110" header-align="center" align="right" :formatter="formatNumberCell" />
<el-table-column prop="unitPrice" label="单价" min-width="120" header-align="center" align="right" :formatter="formatNumberCell" />
<el-table-column prop="remark" label="备注" min-width="200" header-align="center" align="left" show-overflow-tooltip />
</el-table>
<el-dialog
title="历史附件"
:visible.sync="attachmentDialogVisible"
width="900px"
:close-on-click-modal="false"
v-drag
>
<el-table :data="attachmentList" :height="360" border stripe v-loading="attachmentLoading" style="width: 100%">
<el-table-column prop="fileName" label="文件名" min-width="260" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="createdBy" label="上传人" min-width="120" header-align="center" align="center" />
<el-table-column prop="createDate" label="上传时间" min-width="160" header-align="center" align="center" />
<el-table-column label="操作" width="90" header-align="center" align="center" fixed="right">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click="downloadAttachment(scope.row)">下载</el-link>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="attachmentDialogVisible = false">关闭</el-button>
</div>
</el-dialog>
<Chooselist ref="baseList" @getBaseData="getBaseData" />
</div>
</template>
<script>
import Chooselist from '@/views/modules/common/Chooselist_eam'
import {
listTierPriceHistoryMain,
listTierPriceHistoryDetail
} from '@/api/supplier/supplierPartMoqPrice'
import { queryOssFilePlus, downLoadObjectFile } from '@/api/oss/oss'
export default {
name: 'SupplierPartTierPriceHistory',
components: { Chooselist },
data () {
return {
mainTableHeight: 260,
detailTableHeight: 260,
tagNo: '',
tagType: 'search',
searchData: {
site: this.$store.state.user.site,
supplierNo: '',
partNo: '',
priceDate: ''
},
mainLoading: false,
detailLoading: false,
historyMainList: [],
selectedMain: null,
historyDetailList: [],
attachmentDialogVisible: false,
attachmentLoading: false,
attachmentList: [],
attachmentRefIds: []
}
},
mounted () {
this.handleResize()
window.addEventListener('resize', this.handleResize)
},
beforeDestroy () {
window.removeEventListener('resize', this.handleResize)
},
methods: {
handleResize () {
const availableHeight = window.innerHeight - 260
this.mainTableHeight = Math.max(220, Math.floor(availableHeight * 0.45))
this.detailTableHeight = Math.max(220, Math.floor(availableHeight * 0.45))
},
getBaseList (val, type) {
this.tagNo = val
this.tagType = type || 'search'
this.$nextTick(() => {
let strVal = ''
let conSql = ''
if (val === 520) {
strVal = this.searchData.supplierNo || ''
conSql = " and site = '" + this.$store.state.user.site + "'"
}
if (val === 507) {
strVal = this.searchData.partNo || ''
conSql = " and site = '" + this.$store.state.user.site + "'"
}
this.$refs.baseList.init(val, strVal, conSql)
})
},
getBaseData (val) {
if (this.tagNo === 520) {
this.searchData.supplierNo = val.supplier_no || ''
}
if (this.tagNo === 507) {
this.searchData.partNo = val.part_no || ''
}
},
resetSearch () {
this.searchData = {
site: this.$store.state.user.site,
supplierNo: '',
partNo: '',
priceDate: ''
}
this.historyMainList = []
this.selectedMain = null
this.historyDetailList = []
},
searchMainList () {
this.mainLoading = true
const inData = {
site: this.$store.state.user.site,
supplierCode: (this.searchData.supplierNo || '').trim(),
partNo: (this.searchData.partNo || '').trim(),
priceDate: this.searchData.priceDate || ''
}
listTierPriceHistoryMain(inData).then(({ data }) => {
if (data && data.code === 0) {
this.historyMainList = data.rows || []
this.selectedMain = null
this.historyDetailList = []
if (this.historyMainList.length > 0) {
this.$refs.mainTable.setCurrentRow(this.historyMainList[0])
this.handleMainRowClick(this.historyMainList[0])
}
} else {
this.historyMainList = []
this.$alert((data && data.msg) || '查询失败', '错误', { confirmButtonText: '确定' })
}
}).catch(() => {
this.historyMainList = []
this.$message.error('查询失败')
}).finally(() => {
this.mainLoading = false
})
},
handleMainRowClick (row) {
this.selectedMain = row ? JSON.parse(JSON.stringify(row)) : null
this.loadDetailList()
},
loadDetailList () {
if (!this.selectedMain || !this.selectedMain.id) {
this.historyDetailList = []
return
}
this.detailLoading = true
const inData = {
site: this.$store.state.user.site,
historyMainId: this.selectedMain.id
}
listTierPriceHistoryDetail(inData).then(({ data }) => {
if (data && data.code === 0) {
this.historyDetailList = data.rows || []
} else {
this.historyDetailList = []
this.$alert((data && data.msg) || '明细查询失败', '错误', { confirmButtonText: '确定' })
}
}).catch(() => {
this.historyDetailList = []
this.$message.error('明细查询失败')
}).finally(() => {
this.detailLoading = false
})
},
openAttachmentDialog (row) {
this.attachmentDialogVisible = true
this.attachmentRefIds = this.parseAttachmentRefs((row && row.attachmentRefs) || '')
this.fetchAttachmentList(row)
},
buildAttachmentQueryParams (row) {
return {
orderRef1: row.site || this.$store.state.user.site,
orderRef2: row.supplierCode || '',
orderRef3: row.partNo || '',
orderRef4: this.toDateStr(row.priceDate),
orderReftype: 'SUPPLIER_PART_PRICE'
}
},
toDateStr (val) {
if (!val) return ''
if (typeof val === 'string') {
return val.length >= 10 ? val.slice(0, 10) : val
}
if (this.dayjs) {
return this.dayjs(val).format('YYYY-MM-DD')
}
const date = new Date(val)
if (Number.isNaN(date.getTime())) return ''
const pad = num => String(num).padStart(2, '0')
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`
},
normalizeNumberValue (value, defaultValue = 0) {
if (value === null || value === undefined || value === '') return defaultValue
const num = Number(value)
if (Number.isNaN(num)) return defaultValue
return Object.is(num, -0) ? 0 : num
},
formatNumberCell (row, column, cellValue) {
return String(this.normalizeNumberValue(cellValue, 0))
},
formatCurrencyDesc (row) {
if (!row) return ''
return row.currencyDesc || row.currency || ''
},
fetchAttachmentList (row) {
const params = this.buildAttachmentQueryParams(row || {})
const refIdSet = new Set((this.attachmentRefIds || []).map(item => String(item)))
this.attachmentLoading = true
queryOssFilePlus(params).then(({ data }) => {
if (data && data.code === 0) {
const allRows = data.rows || []
this.attachmentList = refIdSet.size > 0
? allRows.filter(item => refIdSet.has(String(item.id)))
: []
} else {
this.attachmentList = []
}
}).catch(() => {
this.attachmentList = []
}).finally(() => {
this.attachmentLoading = false
})
},
downloadAttachment (row) {
downLoadObjectFile(row).then(({ data }) => {
const blob = new Blob([data], { type: 'application/octet-stream;charset=utf-8' })
const linkNode = document.createElement('a')
linkNode.download = row.fileName || 'download'
linkNode.style.display = 'none'
linkNode.href = URL.createObjectURL(blob)
document.body.appendChild(linkNode)
linkNode.click()
URL.revokeObjectURL(linkNode.href)
document.body.removeChild(linkNode)
}).catch(() => {
this.$message.error('下载失败')
})
},
parseAttachmentRefs (refs) {
if (!refs) return []
return String(refs)
.split(',')
.map(item => item.trim())
.filter(item => item !== '')
}
}
}
</script>
<style scoped>
.supplier-part-tier-price-history .table-toolbar {
margin: 8px 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.supplier-part-tier-price-history .selected-text {
font-size: 13px;
color: #606266;
}
</style>
Loading…
Cancel
Save