|
|
|
@ -1,7 +1,7 @@ |
|
|
|
<template> |
|
|
|
<div class="mod-config"> |
|
|
|
<!-- 查询区:site 来自登录工厂,禁止手改 - rqrq --> |
|
|
|
<el-form :inline="true" label-position="top" style="margin-top: 1px; margin-left: 0px;"> |
|
|
|
<el-form ref="queryForm" :inline="true" label-position="top" style="margin-top: 1px; margin-left: 0px;"> |
|
|
|
<el-form-item label="工厂编码"> |
|
|
|
<el-input v-model="queryData.site" style="width: 100px" disabled></el-input> |
|
|
|
</el-form-item> |
|
|
|
@ -43,6 +43,7 @@ |
|
|
|
</el-form> |
|
|
|
|
|
|
|
<el-table |
|
|
|
ref="mainTable" |
|
|
|
:data="dataList" |
|
|
|
:height="height" |
|
|
|
border |
|
|
|
@ -87,6 +88,7 @@ |
|
|
|
</el-table> |
|
|
|
|
|
|
|
<el-pagination |
|
|
|
ref="pagination" |
|
|
|
@size-change="sizeChangeHandle" |
|
|
|
@current-change="currentChangeHandle" |
|
|
|
:current-page="pageIndex" |
|
|
|
@ -96,57 +98,58 @@ |
|
|
|
layout="total, sizes, prev, pager, next, jumper"> |
|
|
|
</el-pagination> |
|
|
|
|
|
|
|
<div class="detail-panel"> |
|
|
|
<div v-if="!currentTask.id" class="detail-empty">请选择一条任务</div> |
|
|
|
<div v-else> |
|
|
|
<div class="detail-header"> |
|
|
|
选中任务 #{{ currentTask.id }} 托盘 {{ currentTask.palletId || '-' }} 状态 {{ currentTask.status || '-' }} 失败码 {{ currentTask.errorCode || '-' }} |
|
|
|
RFID明细ID {{ currentTask.transportDetailId || '-' }} 完结 {{ formatDateTime(currentTask.processedTime) || '-' }} |
|
|
|
</div> |
|
|
|
<div v-if="currentTask.errorMsg" class="detail-error">错误说明:{{ currentTask.errorMsg }}</div> |
|
|
|
<el-tabs v-model="activeTab"> |
|
|
|
<el-tab-pane label="标签明细" name="label"> |
|
|
|
<el-table :data="labelList" border v-loading="labelListLoading" max-height="260" style="width: 100%;"> |
|
|
|
<el-table-column prop="serialNo" label="标签号" min-width="140" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="partNo" label="物料号" min-width="120" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="notifyNo" label="申请单号" min-width="140" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="issueFlag" label="发料" min-width="120" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope"> |
|
|
|
<!-- 主表与详情页签平分可用高度;未选任务也保留固定页签区域,长错误仅在表格提示中展示 - rqrq --> |
|
|
|
<div ref="detailPanel" class="detail-panel" :style="{ height: height + 'px' }"> |
|
|
|
<el-tabs ref="detailTabs" v-model="activeTab" @tab-click="updateTableHeights"> |
|
|
|
<el-tab-pane label="标签明细" name="label"> |
|
|
|
<el-table ref="labelTable" :data="labelList" border v-loading="labelListLoading" :height="detailHeight" :empty-text="currentTask.id ? '暂无标签明细' : '请选择一条任务'" style="width: 100%;"> |
|
|
|
<el-table-column prop="serialNo" label="标签号" min-width="140" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="partNo" label="物料号" min-width="120" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="notifyNo" label="申请单号" min-width="140" header-align="center" align="center"></el-table-column> |
|
|
|
<!-- 工单三字段取定时建单已保存的标签快照,空来源保持空白,避免实时关联改变历史任务展示 - rqrq --> |
|
|
|
<el-table-column prop="orderNo" label="order_no" min-width="140" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="releaseNo" label="release_no" min-width="110" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="sequenceNo" label="sequence_no" min-width="110" header-align="center" align="center"></el-table-column> |
|
|
|
<!-- 移库结果在全部队列结束进入下一阶段时保存;等待时显示-,不根据主任务失败码把所有标签判成失败 - rqrq --> |
|
|
|
<el-table-column prop="moveFlag" label="移库" min-width="80" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope"> |
|
|
|
<el-tag :type="getIssueFlagTag(scope.row.moveFlag)" size="small">{{ getMoveResultLabel(scope.row.moveFlag) }}</el-tag> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="issueFlag" label="发料" min-width="120" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope"> |
|
|
|
<!-- U仍保留后台待核实保护,页面归为处理中并明确提示,禁止现场误当未发料再次发送 - rqrq --> |
|
|
|
<el-tooltip :disabled="scope.row.issueFlag !== 'U'" content="发料结果待核实,禁止自动重发" placement="top"> |
|
|
|
<el-tag :type="getIssueFlagTag(scope.row.issueFlag)" size="small">{{ getIssueFlagLabel(scope.row.issueFlag) }}</el-tag> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="unbindFlag" label="解绑" min-width="80" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ scope.row.unbindFlag === 'Y' ? '已解绑' : '仍在托' }}</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="留盘" min-width="70" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ isRemainOnPallet(scope.row) ? '是' : '否' }}</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="errorMsg" label="失败原因" min-width="180" header-align="center" align="left" show-overflow-tooltip></el-table-column> |
|
|
|
<el-table-column prop="updatedTime" label="更新时间" min-width="160" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ formatDateTime(scope.row.updatedTime) }}</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
<!-- 请求已开始和待核实不能当作未发,必须先核对 IFS 后再人工处理 - rqrq --> |
|
|
|
<div class="detail-tip">发料成功才会解绑;请求已开始或待核实的标签禁止直接补发、解绑,请先核对 IFS 发料记录。任务已完成仅表示自动处理结束。</div> |
|
|
|
</el-tab-pane> |
|
|
|
<el-tab-pane label="移库队列" name="move"> |
|
|
|
<el-table :data="moveList" border v-loading="moveListLoading" max-height="260" style="width: 100%;"> |
|
|
|
<el-table-column prop="moveQueueId" label="队列ID" min-width="90" header-align="center" align="center"></el-table-column> |
|
|
|
<el-table-column prop="queueStatus" label="队列状态" min-width="90" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ scope.row.queueStatus || '-' }}</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="resultFlag" label="结果" min-width="80" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ getMoveResultLabel(scope.row.resultFlag) }}</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="resultMsg" label="结果说明" min-width="220" header-align="center" align="left" show-overflow-tooltip></el-table-column> |
|
|
|
<el-table-column prop="createdTime" label="入队时间" min-width="160" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ formatDateTime(scope.row.createdTime) }}</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
<div v-if="!moveListLoading && moveList.length === 0" class="detail-tip">无需搬库,视为 IFS 已完成。</div> |
|
|
|
</el-tab-pane> |
|
|
|
</el-tabs> |
|
|
|
</div> |
|
|
|
</el-tooltip> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="unbindFlag" label="解绑" min-width="80" header-align="center" align="center"> |
|
|
|
<!-- 解绑只展示是/否,与移库、发料结果独立,不再显示重复的留盘列 - rqrq --> |
|
|
|
<template slot-scope="scope">{{ scope.row.unbindFlag === 'Y' ? '是' : '否' }}</template> |
|
|
|
</el-table-column> |
|
|
|
<!-- <el-table-column prop="errorMsg" label="失败原因" min-width="180" header-align="center" align="left" show-overflow-tooltip></el-table-column>--> |
|
|
|
<el-table-column prop="updatedTime" label="更新时间" min-width="160" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ formatDateTime(scope.row.updatedTime) }}</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
</el-tab-pane> |
|
|
|
<el-tab-pane label="移库队列" name="move"> |
|
|
|
<!-- 无关联记录只表示本任务没有队列关联,不据此断言 IFS 已完成 - rqrq --> |
|
|
|
<el-table ref="moveTable" :data="moveList" border v-loading="moveListLoading" :height="detailHeight" :empty-text="currentTask.id ? '暂无关联移库队列' : '请选择一条任务'" style="width: 100%;"> |
|
|
|
<!-- 五列均取关联haian_ifs_pallet_move_queue;长标签串/JSON/说明悬浮查看,移库时间只取队列updated_time - rqrq --> |
|
|
|
<el-table-column prop="serialNoStr" label="标签串" min-width="220" header-align="center" align="left" show-overflow-tooltip></el-table-column> |
|
|
|
<el-table-column prop="resultFlag" label="结果" min-width="80" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ getMoveResultLabel(scope.row.resultFlag) }}</template> |
|
|
|
</el-table-column> |
|
|
|
<!-- <el-table-column prop="moveGroupJson" label="移库JSON" min-width="300" header-align="center" align="left" show-overflow-tooltip></el-table-column>--> |
|
|
|
<el-table-column prop="resultMsg" label="结果说明" min-width="220" header-align="center" align="left" show-overflow-tooltip></el-table-column> |
|
|
|
<el-table-column prop="updatedTime" label="移库时间" min-width="160" header-align="center" align="center"> |
|
|
|
<template slot-scope="scope">{{ formatDateTime(scope.row.updatedTime) }}</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
</el-tab-pane> |
|
|
|
</el-tabs> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
@ -179,6 +182,7 @@ export default { |
|
|
|
totalPage: 0, |
|
|
|
dataListLoading: false, |
|
|
|
height: 280, |
|
|
|
detailHeight: 220, |
|
|
|
currentTask: {}, |
|
|
|
activeTab: 'label', |
|
|
|
labelList: [], |
|
|
|
@ -188,15 +192,56 @@ export default { |
|
|
|
} |
|
|
|
}, |
|
|
|
mounted () { |
|
|
|
this.$nextTick(() => { |
|
|
|
this.height = Math.max(220, window.innerHeight - 460) |
|
|
|
}) |
|
|
|
// 跟随窗口与查询区换行重算高度;观察查询区避免表格自身高度变化触发循环 - rqrq |
|
|
|
window.addEventListener('resize', this.updateTableHeights) |
|
|
|
if (window.ResizeObserver) { |
|
|
|
this.queryResizeObserver = new window.ResizeObserver(this.updateTableHeights) |
|
|
|
this.queryResizeObserver.observe(this.$refs.queryForm.$el) |
|
|
|
} |
|
|
|
this.updateTableHeights() |
|
|
|
}, |
|
|
|
activated () { |
|
|
|
// keep-alive 页面重新显示时恢复真实尺寸,再按当前工厂查询 - rqrq |
|
|
|
this.updateTableHeights() |
|
|
|
this.queryData.site = this.$store.state.user.site |
|
|
|
this.getDataList() |
|
|
|
}, |
|
|
|
beforeDestroy () { |
|
|
|
// 释放窗口与尺寸观察监听,避免关闭页签后继续访问已销毁表格 - rqrq |
|
|
|
window.removeEventListener('resize', this.updateTableHeights) |
|
|
|
if (this.queryResizeObserver) { |
|
|
|
this.queryResizeObserver.disconnect() |
|
|
|
} |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
// 扣除查询区、分页、边距后,主表与下方页签各占一半;详情表扣除页签头,数据在表内滚动 - rqrq |
|
|
|
updateTableHeights () { |
|
|
|
this.$nextTick(() => { |
|
|
|
if (this._isDestroyed || !this.$el.offsetWidth || !this.$refs.mainTable) { |
|
|
|
return |
|
|
|
} |
|
|
|
const pagination = this.$refs.pagination.$el |
|
|
|
const paginationStyle = window.getComputedStyle(pagination) |
|
|
|
const panelStyle = window.getComputedStyle(this.$refs.detailPanel) |
|
|
|
const tabHeader = this.$refs.detailTabs.$el.querySelector('.el-tabs__header') |
|
|
|
const headerStyle = window.getComputedStyle(tabHeader) |
|
|
|
const number = value => parseFloat(value) || 0 |
|
|
|
const paginationHeight = pagination.offsetHeight + number(paginationStyle.marginTop) + number(paginationStyle.marginBottom) |
|
|
|
const panelSpacing = number(panelStyle.marginTop) + number(panelStyle.marginBottom) |
|
|
|
const availableHeight = window.innerHeight - this.$refs.mainTable.$el.getBoundingClientRect().top - paginationHeight - panelSpacing - 20 |
|
|
|
this.height = Math.max(140, Math.floor(availableHeight / 2)) |
|
|
|
const panelPadding = number(panelStyle.paddingTop) + number(panelStyle.paddingBottom) + number(panelStyle.borderTopWidth) + number(panelStyle.borderBottomWidth) |
|
|
|
const headerHeight = tabHeader.offsetHeight + number(headerStyle.marginTop) + number(headerStyle.marginBottom) |
|
|
|
this.detailHeight = Math.max(60, this.height - panelPadding - headerHeight) |
|
|
|
// 切换页签后重排当前表格,防止隐藏页签首次显示时列宽或滚动条错位 - rqrq |
|
|
|
this.$nextTick(() => { |
|
|
|
if (this._isDestroyed) return |
|
|
|
this.$refs.mainTable.doLayout() |
|
|
|
const detailTable = this.activeTab === 'move' ? this.$refs.moveTable : this.$refs.labelTable |
|
|
|
if (detailTable) detailTable.doLayout() |
|
|
|
}) |
|
|
|
}) |
|
|
|
}, |
|
|
|
// 查询主表:先写 site 再请求,失败清空列表避免展示过期数据 - rqrq |
|
|
|
getDataList () { |
|
|
|
if (this.dataListLoading) { |
|
|
|
@ -324,9 +369,12 @@ export default { |
|
|
|
}) |
|
|
|
}, |
|
|
|
clearDetail () { |
|
|
|
// 清空选择后旧请求会被任务ID校验忽略,固定详情区的 loading 必须同步复位 - rqrq |
|
|
|
this.currentTask = {} |
|
|
|
this.labelList = [] |
|
|
|
this.moveList = [] |
|
|
|
this.labelListLoading = false |
|
|
|
this.moveListLoading = false |
|
|
|
}, |
|
|
|
formatCount (value) { |
|
|
|
if (value === null || value === undefined || value === '') { |
|
|
|
@ -367,13 +415,13 @@ export default { |
|
|
|
} |
|
|
|
return '' |
|
|
|
}, |
|
|
|
// 发料状态来自任务标签:P 已开始请求、U 待核实,均不能显示成未发料 - rqrq |
|
|
|
// 发料展示统一四态;P请求已开始、U结果待核实均为处理中,U另有悬浮提示,后台防重语义保留 - rqrq |
|
|
|
getIssueFlagLabel (flag) { |
|
|
|
if (flag === 'P') { |
|
|
|
return '请求已开始' |
|
|
|
return '处理中' |
|
|
|
} |
|
|
|
if (flag === 'U') { |
|
|
|
return '待核实' |
|
|
|
return '处理中' |
|
|
|
} |
|
|
|
if (flag === 'S') { |
|
|
|
return '成功' |
|
|
|
@ -381,7 +429,7 @@ export default { |
|
|
|
if (flag === 'F') { |
|
|
|
return '失败' |
|
|
|
} |
|
|
|
return '未发' |
|
|
|
return '未发料' |
|
|
|
}, |
|
|
|
// 不确定状态使用警示色,提示先核实 IFS,禁止据此自动补发 - rqrq |
|
|
|
getIssueFlagTag (flag) { |
|
|
|
@ -425,26 +473,9 @@ export default { |
|
|
|
padding: 10px; |
|
|
|
border: 1px solid #ebeef5; |
|
|
|
background: #fff; |
|
|
|
box-sizing: border-box; |
|
|
|
} |
|
|
|
.detail-empty { |
|
|
|
color: #909399; |
|
|
|
padding: 16px 0; |
|
|
|
text-align: center; |
|
|
|
} |
|
|
|
.detail-header { |
|
|
|
margin-bottom: 8px; |
|
|
|
line-height: 22px; |
|
|
|
} |
|
|
|
.detail-error { |
|
|
|
color: #F56C6C; |
|
|
|
margin-bottom: 8px; |
|
|
|
} |
|
|
|
.detail-tip { |
|
|
|
margin-top: 8px; |
|
|
|
color: #909399; |
|
|
|
font-size: 12px; |
|
|
|
} |
|
|
|
/deep/ .el-table .error-row { |
|
|
|
/deep/ .el-table .error-row { |
|
|
|
background: #fef0f0; |
|
|
|
} |
|
|
|
</style> |