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