diff --git a/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue b/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue index fca043bc..cd7c12f5 100644 --- a/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue +++ b/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue @@ -12,10 +12,7 @@
- + {{ cardTitleLabel(row) }} 查看 + + 存为任务集合 + 编辑 @@ -159,7 +161,10 @@
-
+
import { computed, ref } from 'vue' - import { View, Position, Document, Check, More, EditPen, Delete, ArrowDown, ArrowUp, DataLine } from '@element-plus/icons-vue' + import { + View, + Position, + Document, + Check, + More, + EditPen, + Delete, + ArrowDown, + ArrowUp, + DataLine, + FolderAdd + } from '@element-plus/icons-vue' import type { ProductionWorkOrderItem } from '@/api/production-work-order' import type { OutboundQcDetailProduct } from '@/api/qc-work-order' import type { ProductionWorkOrderCardMetaConfig } from '@/utils/production-work-order-card-meta' @@ -301,6 +318,7 @@ import type { TagType } from '@/utils/status-tag-registry' import { productStatusLabel, productStatusTagType } from '@/utils/status-tag-registry' import { useUserStore } from '@/store/modules/user' + import { useMenuPerm } from '@/hooks/core/useMenuPerm' import { sumProductionWorkOrderStepBadgeCount } from '@/utils/production-work-order-step-badge' import WorkOrderTaskSubList from './WorkOrderTaskSubList.vue' import ProductionStepBadge from './ProductionStepBadge.vue' @@ -337,6 +355,7 @@ ) const userStore = useUserStore() + const { hasMenuPerm } = useMenuPerm() const isMineMode = computed(() => props.pageMode === 'mine') function resolveCurrentUserId() { @@ -369,9 +388,7 @@ } const cardMeta = computed( - () => - props.cardMetaConfig ?? - getCardMetaConfigForLegacyTab(props.activeTypeTab || 'inbound') + () => props.cardMetaConfig ?? getCardMetaConfigForLegacyTab(props.activeTypeTab || 'inbound') ) const listTabKey = computed(() => cardMeta.value.tabKey) @@ -508,7 +525,8 @@ function dispatchQcTooltip(row: ProductionWorkOrderItem) { if (!rowCardMeta(row).allowDispatchQc) return '' - if (row.workOrderStatus === 'dpz') return '请先派发生产任务,并在步骤中录入有效物产出及条码后再派发质检' + if (row.workOrderStatus === 'dpz') + return '请先派发生产任务,并在步骤中录入有效物产出及条码后再派发质检' if (row.workOrderStatus === 'yzf') return '已作废工单不可派发质检' return '请先在生产任务步骤中录入类型为有效物且含条码的产出物' } @@ -531,8 +549,21 @@ return row.workOrderStatus !== 'ywc' } + function canSaveTaskSet(row: ProductionWorkOrderItem) { + if (isMineMode.value) return false + if (!hasMenuPerm('production:task-set:add')) return false + const tasks = resolvePresetTasks(row.id) + return Array.isArray(tasks) && tasks.some((t) => String(t?.taskName || '').trim()) + } + function hasMoreActions(row: ProductionWorkOrderItem) { - return canDispatchTask(row) || canEditWorkOrder(row) || canDeleteWorkOrder(row) || true + return ( + canDispatchTask(row) || + canSaveTaskSet(row) || + canEditWorkOrder(row) || + canDeleteWorkOrder(row) || + true + ) } diff --git a/web-admin/src/views/production/production-work-order/SaveProductionTaskSetDialog.vue b/web-admin/src/views/production/production-work-order/SaveProductionTaskSetDialog.vue new file mode 100644 index 00000000..87279db7 --- /dev/null +++ b/web-admin/src/views/production/production-work-order/SaveProductionTaskSetDialog.vue @@ -0,0 +1,151 @@ + + + + + + + diff --git a/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue b/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue index c3dbba70..92582b30 100644 --- a/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue +++ b/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue @@ -220,6 +220,12 @@ :source-type="sampleReceptionSourceType" @success="handleSampleReceptionSuccess" /> + +
@@ -234,6 +240,7 @@ import ProductionWorkOrderCardList from '../ProductionWorkOrderCardList.vue' import ProductionWorkOrderQcViewDialog from '../ProductionWorkOrderQcViewDialog.vue' import SampleReceptionDialog from '../SampleReceptionDialog.vue' + import SaveProductionTaskSetDialog from '../SaveProductionTaskSetDialog.vue' import { PRODUCTION_WORK_ORDER_VIEW_DIALOG_COMPONENTS } from '../view-dialogs/view-dialog-registry' import { useProductionWorkOrderTabPage, @@ -266,6 +273,8 @@ const sampleReceptionSourceType = ref(undefined) const qcViewVisible = ref(false) const qcViewRow = ref(null) + const saveSetVisible = ref(false) + const saveSetRow = ref(null) const { cardMetaConfig, @@ -297,6 +306,10 @@ taskRefreshKey } = useProductionWorkOrderTabPage(tabKeyRef, pageModeComputed) + const saveSetTasks = computed( + () => presetTasksByWorkOrderId.value[saveSetRow.value?.id || ''] || [] + ) + const viewDialogComponent = computed( () => PRODUCTION_WORK_ORDER_VIEW_DIALOG_COMPONENTS[viewTabKey.value] ) @@ -322,6 +335,11 @@ handleView(row) return } + if (command === 'save-set') { + saveSetRow.value = row + saveSetVisible.value = true + return + } emit('command', command, row) }