diff --git a/src/views/task/TaskChainDetail.vue b/src/views/task/TaskChainDetail.vue index 5a98744..14528e9 100644 --- a/src/views/task/TaskChainDetail.vue +++ b/src/views/task/TaskChainDetail.vue @@ -98,6 +98,12 @@ text type="success" size="small" @click="openMockCallback(task)" >模拟回调 + 回库 删除 @@ -337,6 +343,14 @@ 模拟回调 +
+ + 回库 +
变更状态 @@ -447,7 +461,7 @@ defineOptions({ name: 'TaskChainDetail' }) import { computed, onMounted, ref } from 'vue' import { useRoute } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' -import { ArrowLeft, MoreFilled, VideoPlay, Switch, Delete } from '@element-plus/icons-vue' +import { ArrowLeft, MoreFilled, VideoPlay, Switch, Delete, House } from '@element-plus/icons-vue' import { useDevice } from '@/composables/useDevice' import { useUserStore } from '@/stores/user' import { chainStatusMap, getChainStatusTag } from '@/constants/chainStatus' @@ -457,6 +471,7 @@ import { callbackScenarioMap, sendMockCallback, type CallbackScenario, type TaskChainDetailVO, type TaskVO, } from '@/api/task' +import { generateRelease } from '@/api/generate' const { isMobile } = useDevice() const userStore = useUserStore() @@ -465,6 +480,7 @@ const route = useRoute() const loading = ref(false) const executing = ref(false) const canceling = ref(false) +const returningTaskCode = ref(null) const chain = ref(null) const tasks = ref([]) const statusOptions = taskStatusOptions @@ -478,6 +494,55 @@ function canExecuteNext(status: string) { return status === 'IN_PROGRESS' || status === 'CREATED' || status === 'READY' } +/** TP/HJ 前缀映射回库库区;与任务生成-释放信号约定一致 */ +function resolveReturnWarehouseTargetCode(container: string | undefined | null): string | null { + const c = container?.trim().toUpperCase() + if (!c) return null + if (c.startsWith('TP')) return 'WH01-3-2' + if (c.startsWith('HJ')) return 'WH01-3-3' + return null +} + +function canReturnToWarehouse(task: TaskVO): boolean { + if (task.type !== 'HK_STATION_RELEASE' || task.status !== 'WAITING_RELEASE') return false + if (!chain.value?.warehouse || !task.sourceContainer?.trim()) return false + return resolveReturnWarehouseTargetCode(task.sourceContainer) != null +} + +async function handleReturnToWarehouse(task: TaskVO) { + const wh = chain.value?.warehouse + if (!wh) return + const targetCode = resolveReturnWarehouseTargetCode(task.sourceContainer) + if (!targetCode) { + ElMessage.warning('仅支持容器号以 TP、HJ 开头时回库') + return + } + const taskChainCode = task.chainCode || chain.value?.code + if (!taskChainCode) { + ElMessage.warning('缺少任务链编号') + return + } + try { + await ElMessageBox.confirm( + `确认发送回库释放信号?目标库区:${targetCode},容器:${task.sourceContainer}`, + '回库', + { type: 'warning' }, + ) + returningTaskCode.value = task.code + await generateRelease({ + warehouse: wh, + taskChainCode, + container: task.sourceContainer, + targetType: 'AREA', + targetCode, + }) + ElMessage.success('回库释放信号已发送') + await loadData() + } catch { /* cancelled */ } finally { + returningTaskCode.value = null + } +} + // ==================== 移动端子任务操作 ==================== const taskActionDrawerVisible = ref(false) const statusPickerVisible = ref(false)