|
|
@ -1,16 +1,7 @@ |
|
|
<template> |
|
|
<template> |
|
|
<div class="mod-config"> |
|
|
<div class="mod-config"> |
|
|
<el-form :inline="true" label-position="top"> |
|
|
<el-form :inline="true" label-position="top"> |
|
|
<el-form-item label="工厂"> |
|
|
|
|
|
<el-select v-model="queryData.site" placeholder="请选择工厂" style="width: 130px;" clearable @change="onQuerySiteChange"> |
|
|
|
|
|
<el-option |
|
|
|
|
|
v-for="item in siteOptions" |
|
|
|
|
|
:key="item.site" |
|
|
|
|
|
:label="item.siteName || item.site" |
|
|
|
|
|
:value="item.site" |
|
|
|
|
|
/> |
|
|
|
|
|
</el-select> |
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
|
<!-- 栈板只归属主工厂,查询显式传当前工厂,不提供工厂选择或子site拆分 - rqrq --> |
|
|
<el-form-item label="托盘ID"> |
|
|
<el-form-item label="托盘ID"> |
|
|
<el-input v-model="queryData.palletId" placeholder="请输入托盘ID" style="width: 150px;" clearable @keyup.enter.native="getDataList" /> |
|
|
<el-input v-model="queryData.palletId" placeholder="请输入托盘ID" style="width: 150px;" clearable @keyup.enter.native="getDataList" /> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
@ -34,11 +25,11 @@ |
|
|
/> |
|
|
/> |
|
|
</el-select> |
|
|
</el-select> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="托盘状态"> |
|
|
|
|
|
<el-select v-model="queryData.status" placeholder="请选择" style="width: 120px;" clearable> |
|
|
|
|
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /> |
|
|
|
|
|
</el-select> |
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
|
<!-- <el-form-item label="托盘状态">--> |
|
|
|
|
|
<!-- <el-select v-model="queryData.status" placeholder="请选择" style="width: 120px;" clearable>--> |
|
|
|
|
|
<!-- <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />--> |
|
|
|
|
|
<!-- </el-select>--> |
|
|
|
|
|
<!-- </el-form-item>--> |
|
|
<el-form-item label="站点"> |
|
|
<el-form-item label="站点"> |
|
|
<el-input v-model="queryData.locationCode" placeholder="请输入站点编码" style="width: 140px;" clearable @keyup.enter.native="getDataList" /> |
|
|
<el-input v-model="queryData.locationCode" placeholder="请输入站点编码" style="width: 140px;" clearable @keyup.enter.native="getDataList" /> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
@ -47,8 +38,8 @@ |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
|
|
|
|
|
|
<el-form-item style="margin-top: 20px;"> |
|
|
<el-form-item style="margin-top: 20px;"> |
|
|
<el-button type="primary" :loading="queryLoading" @click="getDataList">查询</el-button> |
|
|
|
|
|
<el-button @click="resetQuery">重置</el-button> |
|
|
|
|
|
|
|
|
<el-button type="primary" :loading="queryLoading" :disabled="queryLoading" @click="getDataList">查询</el-button> |
|
|
|
|
|
<el-button :disabled="queryLoading" @click="resetQuery">重置</el-button> |
|
|
<!-- 导出字段与页面字段保持同口径,避免口径不一致 - rqrq --> |
|
|
<!-- 导出字段与页面字段保持同口径,避免口径不一致 - rqrq --> |
|
|
<download-excel |
|
|
<download-excel |
|
|
:fields="fields()" |
|
|
:fields="fields()" |
|
|
@ -60,6 +51,9 @@ |
|
|
:fetch="createExportData" |
|
|
:fetch="createExportData" |
|
|
:before-generate="startDownload" |
|
|
:before-generate="startDownload" |
|
|
:before-finish="finishDownload" |
|
|
:before-finish="finishDownload" |
|
|
|
|
|
:disabled="exportLoading" |
|
|
|
|
|
:class="{ 'is-disabled': exportLoading }" |
|
|
|
|
|
:style="{ pointerEvents: exportLoading ? 'none' : 'auto' }" |
|
|
worksheet="托盘" |
|
|
worksheet="托盘" |
|
|
class="el-button el-button--primary el-button--medium" |
|
|
class="el-button el-button--primary el-button--medium" |
|
|
> |
|
|
> |
|
|
@ -319,6 +313,9 @@ export default { |
|
|
data() { |
|
|
data() { |
|
|
return { |
|
|
return { |
|
|
queryLoading: false, |
|
|
queryLoading: false, |
|
|
|
|
|
// 查询序号隔离切换主工厂前的旧响应,导出加载标记阻止重复请求 - rqrq |
|
|
|
|
|
querySequence: 0, |
|
|
|
|
|
exportLoading: false, |
|
|
tableLoading: false, |
|
|
tableLoading: false, |
|
|
height: 450, |
|
|
height: 450, |
|
|
queryData: { |
|
|
queryData: { |
|
|
@ -348,11 +345,11 @@ export default { |
|
|
exportHeader: ['托盘信息'], |
|
|
exportHeader: ['托盘信息'], |
|
|
exportFooter: [], |
|
|
exportFooter: [], |
|
|
columnList: [ |
|
|
columnList: [ |
|
|
{ columnProp: 'site', columnLabel: '工厂', columnWidth: 90, align: 'center', headerAlign: 'center' }, |
|
|
|
|
|
|
|
|
// { columnProp: 'site', columnLabel: '工厂', columnWidth: 90, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'palletId', columnLabel: '托盘ID', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'palletId', columnLabel: '托盘ID', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'palletFamilyDesc', columnLabel: '托盘大分类', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'palletFamilyDesc', columnLabel: '托盘大分类', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'typeDesc', columnLabel: '托盘类型', columnWidth: 160, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'typeDesc', columnLabel: '托盘类型', columnWidth: 160, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'status', columnLabel: '托盘状态', columnWidth: 100, align: 'center', headerAlign: 'center', formatter: 'status' }, |
|
|
|
|
|
|
|
|
// { columnProp: 'status', columnLabel: '托盘状态', columnWidth: 100, align: 'center', headerAlign: 'center', formatter: 'status' }, |
|
|
{ columnProp: 'area', columnLabel: '区域', columnWidth: 90, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'area', columnLabel: '区域', columnWidth: 90, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'locationCode', columnLabel: '站点', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'locationCode', columnLabel: '站点', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'wcsLocation', columnLabel: 'WCS站点', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
{ columnProp: 'wcsLocation', columnLabel: 'WCS站点', columnWidth: 120, align: 'center', headerAlign: 'center' }, |
|
|
@ -388,6 +385,18 @@ export default { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
computed: { |
|
|
|
|
|
// 栈板查询使用当前主工厂;空值由查询入口拦截,不能退回旧工厂或扩展为全部工厂 - rqrq |
|
|
|
|
|
currentSite () { |
|
|
|
|
|
return String(this.$store.state.user.site || '').trim() |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
watch: { |
|
|
|
|
|
// 当前主工厂变化后重新初始化,清除原工厂筛选和结果,防止缓存页串厂 - rqrq |
|
|
|
|
|
currentSite () { |
|
|
|
|
|
this.initializePage() |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
mounted() { |
|
|
mounted() { |
|
|
this.$nextTick(() => { |
|
|
this.$nextTick(() => { |
|
|
this.height = window.innerHeight - 240 |
|
|
this.height = window.innerHeight - 240 |
|
|
@ -400,14 +409,31 @@ export default { |
|
|
this.initializePage() |
|
|
this.initializePage() |
|
|
}, |
|
|
}, |
|
|
methods: { |
|
|
methods: { |
|
|
// 页面初始化:先加载基础字典,再按当前查询条件拉取数据 - rqrq |
|
|
|
|
|
|
|
|
// 页面初始化先同步当前主工厂,再加载分类、类型及列表;查询不读取工厂或子site下拉 - rqrq |
|
|
initializePage() { |
|
|
initializePage() { |
|
|
|
|
|
this.syncQuerySite() |
|
|
this.getStatusOptions() |
|
|
this.getStatusOptions() |
|
|
this.getSiteOptions() |
|
|
|
|
|
this.getPalletFamilyOptions(this.queryData.site) |
|
|
this.getPalletFamilyOptions(this.queryData.site) |
|
|
this.getPalletTypeOptions(this.queryData.site, this.queryData.palletFamily) |
|
|
this.getPalletTypeOptions(this.queryData.site, this.queryData.palletFamily) |
|
|
this.getDataList() |
|
|
this.getDataList() |
|
|
}, |
|
|
}, |
|
|
|
|
|
// 主工厂变化时清空旧分类和结果并使旧请求失效;site始终显式写入查询参数,不拆分子工厂 - rqrq |
|
|
|
|
|
syncQuerySite () { |
|
|
|
|
|
if (this.queryData.site !== this.currentSite) { |
|
|
|
|
|
this.queryData.site = this.currentSite |
|
|
|
|
|
this.queryData.palletFamily = '' |
|
|
|
|
|
this.queryData.palletType = '' |
|
|
|
|
|
this.palletFamilyOptions = [] |
|
|
|
|
|
this.palletTypeOptions = [] |
|
|
|
|
|
this.pageIndex = 1 |
|
|
|
|
|
this.dataList = [] |
|
|
|
|
|
this.totalPage = 0 |
|
|
|
|
|
this.selectedRows = [] |
|
|
|
|
|
this.querySequence++ |
|
|
|
|
|
this.queryLoading = false |
|
|
|
|
|
this.tableLoading = false |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
// 构造表单默认值,确保新增场景字段初始化一致 - rqrq |
|
|
// 构造表单默认值,确保新增场景字段初始化一致 - rqrq |
|
|
createEmptyForm() { |
|
|
createEmptyForm() { |
|
|
return { |
|
|
return { |
|
|
@ -463,12 +489,15 @@ export default { |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
haiAnGetPalletFamilyList({ site }).then(({ data }) => { |
|
|
haiAnGetPalletFamilyList({ site }).then(({ data }) => { |
|
|
|
|
|
// 切换主工厂后的旧分类响应不再回填当前筛选 - rqrq |
|
|
|
|
|
if (site !== this.currentSite) return |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
this.palletFamilyOptions = data.rows || [] |
|
|
this.palletFamilyOptions = data.rows || [] |
|
|
} else { |
|
|
} else { |
|
|
this.palletFamilyOptions = [] |
|
|
this.palletFamilyOptions = [] |
|
|
} |
|
|
} |
|
|
}).catch(() => { |
|
|
}).catch(() => { |
|
|
|
|
|
if (site !== this.currentSite) return |
|
|
this.palletFamilyOptions = [] |
|
|
this.palletFamilyOptions = [] |
|
|
}) |
|
|
}) |
|
|
}, |
|
|
}, |
|
|
@ -480,12 +509,15 @@ export default { |
|
|
} |
|
|
} |
|
|
const inData = { site, palletFamily: palletFamily || '' } |
|
|
const inData = { site, palletFamily: palletFamily || '' } |
|
|
haiAnGetPalletTypeList(inData).then(({ data }) => { |
|
|
haiAnGetPalletTypeList(inData).then(({ data }) => { |
|
|
|
|
|
// 工厂或大分类已变化时忽略旧类型响应,避免跨厂或跨分类回填 - rqrq |
|
|
|
|
|
if (site !== this.currentSite || inData.palletFamily !== this.queryData.palletFamily) return |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
this.palletTypeOptions = data.rows || [] |
|
|
this.palletTypeOptions = data.rows || [] |
|
|
} else { |
|
|
} else { |
|
|
this.palletTypeOptions = [] |
|
|
this.palletTypeOptions = [] |
|
|
} |
|
|
} |
|
|
}).catch(() => { |
|
|
}).catch(() => { |
|
|
|
|
|
if (site !== this.currentSite || inData.palletFamily !== this.queryData.palletFamily) return |
|
|
this.palletTypeOptions = [] |
|
|
this.palletTypeOptions = [] |
|
|
}) |
|
|
}) |
|
|
}, |
|
|
}, |
|
|
@ -501,17 +533,22 @@ export default { |
|
|
this.queryData.palletType = '' |
|
|
this.queryData.palletType = '' |
|
|
this.getPalletTypeOptions(this.queryData.site, val) |
|
|
this.getPalletTypeOptions(this.queryData.site, val) |
|
|
}, |
|
|
}, |
|
|
// 核心查询:site必传,后端返回page结构并驱动分页 - rqrq |
|
|
|
|
|
|
|
|
// 列表与分页只按当前主工厂查询,缺失工厂拒绝请求;重复查询拦截,旧响应不覆盖切厂后的结果 - rqrq |
|
|
getDataList() { |
|
|
getDataList() { |
|
|
if (!this.queryData.site) { |
|
|
|
|
|
this.$message.warning('请先选择工厂') |
|
|
|
|
|
|
|
|
this.syncQuerySite() |
|
|
|
|
|
if (this.queryLoading) return |
|
|
|
|
|
if (!this.currentSite) { |
|
|
|
|
|
this.$alert('当前工厂不能为空,请先选择当前工厂', '提示', { confirmButtonText: '确定' }) |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
this.queryLoading = true |
|
|
this.queryLoading = true |
|
|
this.tableLoading = true |
|
|
this.tableLoading = true |
|
|
this.queryData.page = this.pageIndex |
|
|
this.queryData.page = this.pageIndex |
|
|
this.queryData.limit = this.pageSize |
|
|
this.queryData.limit = this.pageSize |
|
|
haiAnGetPalletList(this.queryData).then(({ data }) => { |
|
|
|
|
|
|
|
|
const sequence = ++this.querySequence |
|
|
|
|
|
const query = { ...this.queryData, site: this.currentSite } |
|
|
|
|
|
haiAnGetPalletList(query).then(({ data }) => { |
|
|
|
|
|
if (sequence !== this.querySequence || query.site !== this.currentSite) return |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
this.dataList = (data.page && data.page.list) || [] |
|
|
this.dataList = (data.page && data.page.list) || [] |
|
|
this.totalPage = (data.page && data.page.totalCount) || 0 |
|
|
this.totalPage = (data.page && data.page.totalCount) || 0 |
|
|
@ -521,12 +558,15 @@ export default { |
|
|
this.$alert((data && data.msg) || '查询失败', '提示', { confirmButtonText: '确定' }) |
|
|
this.$alert((data && data.msg) || '查询失败', '提示', { confirmButtonText: '确定' }) |
|
|
} |
|
|
} |
|
|
}).catch(() => { |
|
|
}).catch(() => { |
|
|
|
|
|
if (sequence !== this.querySequence || query.site !== this.currentSite) return |
|
|
this.dataList = [] |
|
|
this.dataList = [] |
|
|
this.totalPage = 0 |
|
|
this.totalPage = 0 |
|
|
this.$message.error('查询失败') |
|
|
this.$message.error('查询失败') |
|
|
}).finally(() => { |
|
|
}).finally(() => { |
|
|
this.queryLoading = false |
|
|
|
|
|
this.tableLoading = false |
|
|
|
|
|
|
|
|
if (sequence === this.querySequence) { |
|
|
|
|
|
this.queryLoading = false |
|
|
|
|
|
this.tableLoading = false |
|
|
|
|
|
} |
|
|
}) |
|
|
}) |
|
|
}, |
|
|
}, |
|
|
// 查询重置:保留当前登录site作为默认工厂 - rqrq |
|
|
// 查询重置:保留当前登录site作为默认工厂 - rqrq |
|
|
@ -566,6 +606,8 @@ export default { |
|
|
}, |
|
|
}, |
|
|
// 打开新增弹窗:清空表单并按site加载下拉 - rqrq |
|
|
// 打开新增弹窗:清空表单并按site加载下拉 - rqrq |
|
|
openCreateDialog() { |
|
|
openCreateDialog() { |
|
|
|
|
|
// 既有新增表单仍使用授权工厂选项,仅打开新增时加载,不影响主工厂查询口径 - rqrq |
|
|
|
|
|
this.getSiteOptions() |
|
|
this.editDialog.title = '新增托盘' |
|
|
this.editDialog.title = '新增托盘' |
|
|
this.editDialog.visible = true |
|
|
this.editDialog.visible = true |
|
|
this.editDialog.readonlySite = false |
|
|
this.editDialog.readonlySite = false |
|
|
@ -816,18 +858,35 @@ export default { |
|
|
} |
|
|
} |
|
|
}) |
|
|
}) |
|
|
}, |
|
|
}, |
|
|
// 导出与查询同口径:仅放大limit,不另起一套筛选逻辑 - rqrq |
|
|
|
|
|
|
|
|
// 导出显式使用当前主工厂且不拆子site;切厂时丢弃旧导出,失败提示并在finally复位加载状态 - rqrq |
|
|
async createExportData() { |
|
|
async createExportData() { |
|
|
|
|
|
if (this.exportLoading) return [] |
|
|
|
|
|
this.syncQuerySite() |
|
|
|
|
|
if (!this.currentSite) { |
|
|
|
|
|
this.$alert('当前工厂不能为空,请先选择当前工厂', '提示', { confirmButtonText: '确定' }) |
|
|
|
|
|
return [] |
|
|
|
|
|
} |
|
|
const exportQuery = { |
|
|
const exportQuery = { |
|
|
...this.queryData, |
|
|
...this.queryData, |
|
|
|
|
|
site: this.currentSite, |
|
|
page: 1, |
|
|
page: 1, |
|
|
limit: 999999 |
|
|
limit: 999999 |
|
|
} |
|
|
} |
|
|
const { data } = await haiAnGetPalletList(exportQuery) |
|
|
|
|
|
if (data && data.code === 0 && data.page && data.page.list) { |
|
|
|
|
|
return data.page.list |
|
|
|
|
|
|
|
|
this.exportLoading = true |
|
|
|
|
|
try { |
|
|
|
|
|
const { data } = await haiAnGetPalletList(exportQuery) |
|
|
|
|
|
if (exportQuery.site !== this.currentSite) return [] |
|
|
|
|
|
if (data && data.code === 0 && data.page && data.page.list) { |
|
|
|
|
|
return data.page.list |
|
|
|
|
|
} |
|
|
|
|
|
this.$alert((data && data.msg) || '导出失败', '提示', { confirmButtonText: '确定' }) |
|
|
|
|
|
return [] |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
this.$message.error('导出失败,请稍后重试') |
|
|
|
|
|
return [] |
|
|
|
|
|
} finally { |
|
|
|
|
|
this.exportLoading = false |
|
|
} |
|
|
} |
|
|
return [] |
|
|
|
|
|
}, |
|
|
}, |
|
|
// 导出开始钩子预留 - rqrq |
|
|
// 导出开始钩子预留 - rqrq |
|
|
startDownload() {}, |
|
|
startDownload() {}, |
|
|
|