Browse Source

对接自动发料

dev
常熟吴彦祖 17 hours ago
parent
commit
27fd35dfa0
  1. 3
      .gitignore
  2. 185
      src/views/modules/haianWarehouse/automatedWarehouse/autoIssueTask54.vue

3
.gitignore

@ -17,3 +17,6 @@ node_modules/
*.sln
# GitNexus本地图谱不提交,刷新后可重新生成 - rqrq
.gitnexus
.claude
/CLAUDE.md
/AGENTS.md

185
src/views/modules/haianWarehouse/automatedWarehouse/autoIssueTask54.vue

@ -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
// PUU - 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>
Loading…
Cancel
Save