feat:任务单排产-列表表头调整、排产弹框对接
parent
3a6a164960
commit
e21b5e3246
@ -0,0 +1,493 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog v-model="dialogVisible" title="排产" width="80%" destroy-on-close>
|
||||||
|
<div class="flex items-center gap-20px mb-16px">
|
||||||
|
<div class="flex items-center gap-8px">
|
||||||
|
<span class="text-red-500">*</span>
|
||||||
|
<span>排产规则</span>
|
||||||
|
<el-select v-model="searchForm.sortRule" class="!w-220px" clearable>
|
||||||
|
<el-option v-for="item in scheduleRuleOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-8px">
|
||||||
|
<span class="text-red-500">*</span>
|
||||||
|
<span>产能来源</span>
|
||||||
|
<el-select v-model="searchForm.capacityType" class="!w-220px">
|
||||||
|
<el-option v-for="item in capacityTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border border-solid border-gray-200 rounded p-16px mt-16px">
|
||||||
|
<el-form :inline="true" :model="searchForm" label-width="90px" class="-mb-8px">
|
||||||
|
<el-form-item label="任务单编码">
|
||||||
|
<el-input v-model="searchForm.code" placeholder="请输入" clearable class="!w-200px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="下达日期">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.orderDate"
|
||||||
|
type="daterange"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
class="!w-260px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="交货日期">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="searchForm.deliveryDate"
|
||||||
|
type="daterange"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
class="!w-260px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备注">
|
||||||
|
<el-input v-model="searchForm.remark" placeholder="请输入" clearable class="!w-220px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="任务类型">
|
||||||
|
<el-checkbox v-model="searchForm.inventoryTaskSchedule">库存任务</el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleSearch">
|
||||||
|
<Icon icon="ep:search" class="mr-5px" /> 查询
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleReset">
|
||||||
|
<Icon icon="ep:refresh" class="mr-5px" /> 重置
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
ref="taskTableRef"
|
||||||
|
v-loading="taskLoading"
|
||||||
|
:data="taskList"
|
||||||
|
border
|
||||||
|
:stripe="true"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
highlight-current-row
|
||||||
|
class="mt-12px"
|
||||||
|
row-key="id"
|
||||||
|
@current-change="handleCurrentTaskChange"
|
||||||
|
@select="handleTaskSelect"
|
||||||
|
@select-all="handleTaskSelectAll"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" :reserve-selection="true" align="center" />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableTaskCodeColumn')" align="center" prop="code" width="200px" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableOrderDateColumn')" align="center" prop="orderDate" :formatter="dateFormatter2" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableDeliveryDateColumn')" align="center" prop="deliveryDate" :formatter="dateFormatter2" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.Task.tableTaskTypeColumn')" align="center" prop="taskType" sortable>
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.MES_TASK_TYPE" :value="scope.row.taskType" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableStatusColumn')" align="center" prop="status" sortable>
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableScheduleCompletedColumn')" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag :type="scope.row.isScheduled ? 'success' : 'info'">{{ scope.row.isScheduled ? '是' : '否' }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableRemarkColumn')" align="center" prop="remark" />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.tableOperateColumn')" align="center" min-width="100px">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button link type="info" @click="openTaskItemNeed(scope.row)">
|
||||||
|
{{ t('ProductionPlan.TaskSummary.actionMaterialLabel') }}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="loadTaskList"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="text-20px font-bold mt-20px mb-12px">{{ t('ProductionPlan.TaskSummary.detailTabSummaryLabel') }}</div>
|
||||||
|
<el-table
|
||||||
|
ref="detailTableRef"
|
||||||
|
v-loading="detailLoading"
|
||||||
|
:data="detailList"
|
||||||
|
border
|
||||||
|
:stripe="true"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
row-key="id"
|
||||||
|
@select="handleDetailSelect"
|
||||||
|
@select-all="handleDetailSelectAll"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" :reserve-selection="true" align="center" />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTaskCodeColumn')" align="center" prop="taskCode" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableProductCodeColumn')" align="center" prop="barCode" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableProductNameColumn')" align="center" prop="productName" sortable />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTotalNumberColumn')" align="center" prop="number" />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTablePlanNumberColumn')" align="center" prop="planNumber" />
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableUnplanNumberColumn')" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<span class="el-alert--warning" style="color: #e66126">
|
||||||
|
{{ scope.row.number - scope.row.planNumber > 0 ? scope.row.number - scope.row.planNumber : 0 }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableOperateColumn')" align="center" width="100px">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button link type="info" @click="openProductItemNeed(scope.row)">
|
||||||
|
{{ t('ProductionPlan.TaskSummary.detailActionMaterialLabel') }}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">确定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
|
||||||
|
<ItemNeedIndex ref="itemNeedRef" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { TaskApi } from '@/api/mes/task'
|
||||||
|
import ItemNeedIndex from '@/views/mes/bom/ItemNeedIndex.vue'
|
||||||
|
import { dateFormatter2 } from '@/utils/formatTime'
|
||||||
|
|
||||||
|
defineOptions({ name: 'TaskScheduleDialog' })
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const emit = defineEmits(['success'])
|
||||||
|
|
||||||
|
const dialogVisible = ref(false)
|
||||||
|
const taskLoading = ref(false)
|
||||||
|
const detailLoading = ref(false)
|
||||||
|
const submitLoading = ref(false)
|
||||||
|
const itemNeedRef = ref()
|
||||||
|
const taskTableRef = ref()
|
||||||
|
const detailTableRef = ref()
|
||||||
|
|
||||||
|
const scheduleRuleOptions = [
|
||||||
|
{ label: '订单优先级', value: 2 },
|
||||||
|
{ label: '订单交期优先', value: 4 }
|
||||||
|
]
|
||||||
|
const capacityTypeOptions = [
|
||||||
|
{ label: '额定产能', value: 1 },
|
||||||
|
{ label: '每日报工平均值', value: 2 },
|
||||||
|
{ label: '数据采集产能', value: 3 }
|
||||||
|
]
|
||||||
|
|
||||||
|
const searchForm = reactive({
|
||||||
|
inventoryTaskSchedule: false,
|
||||||
|
sortRule: 2 as number | undefined,
|
||||||
|
capacityType: 1 as number | undefined,
|
||||||
|
code: '',
|
||||||
|
orderDate: [] as string[],
|
||||||
|
deliveryDate: [] as string[],
|
||||||
|
remark: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
const total = ref(0)
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
const taskList = ref<any[]>([])
|
||||||
|
const detailList = ref<any[]>([])
|
||||||
|
const currentTask = ref<any>()
|
||||||
|
const allDetailsMap = ref<Record<number, any[]>>({}) // store details per taskId
|
||||||
|
|
||||||
|
const loadTaskList = async () => {
|
||||||
|
taskLoading.value = true
|
||||||
|
try {
|
||||||
|
const params: any = {
|
||||||
|
isScheduled: 0,
|
||||||
|
pageNo: queryParams.pageNo,
|
||||||
|
pageSize: queryParams.pageSize,
|
||||||
|
code: searchForm.code || undefined,
|
||||||
|
orderDate: searchForm.orderDate,
|
||||||
|
deliveryDate: searchForm.deliveryDate,
|
||||||
|
remark: searchForm.remark || undefined,
|
||||||
|
taskType: searchForm.inventoryTaskSchedule ? '库存任务' : undefined
|
||||||
|
}
|
||||||
|
const data = await TaskApi.getPlanTaskPage(params)
|
||||||
|
taskList.value = data?.list ?? []
|
||||||
|
total.value = data?.total ?? 0
|
||||||
|
if (taskList.value.length) {
|
||||||
|
await handleCurrentTaskChange(taskList.value[0])
|
||||||
|
} else {
|
||||||
|
currentTask.value = undefined
|
||||||
|
detailList.value = []
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
taskLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadDetailList = async (taskId?: number) => {
|
||||||
|
if (!taskId) {
|
||||||
|
detailList.value = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use cached list if exists
|
||||||
|
if (allDetailsMap.value[taskId]) {
|
||||||
|
detailList.value = allDetailsMap.value[taskId]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
detailLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = await TaskApi.getTaskDetailPage({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
taskId
|
||||||
|
})
|
||||||
|
const list = (data?.list ?? []).map((item: any) => ({
|
||||||
|
...item,
|
||||||
|
_parentTaskOrderPriority: currentTask.value?.orderPriority,
|
||||||
|
_parentTaskDeliveryDate: currentTask.value?.deliveryDate
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Cache the loaded list
|
||||||
|
allDetailsMap.value[taskId] = list
|
||||||
|
detailList.value = list
|
||||||
|
} finally {
|
||||||
|
detailLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleCurrentTaskChange = async (row: any) => {
|
||||||
|
if (!row) return
|
||||||
|
currentTask.value = row
|
||||||
|
await loadDetailList(row?.id)
|
||||||
|
|
||||||
|
// Re-apply selection state for children when view changes
|
||||||
|
nextTick(() => {
|
||||||
|
const parentIsSelected = taskTableRef.value?.getSelectionRows()?.some((t: any) => t.id === row.id)
|
||||||
|
if (parentIsSelected) {
|
||||||
|
detailList.value.forEach(child => {
|
||||||
|
detailTableRef.value?.toggleRowSelection(child, true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleTaskSelect = async (selection: any[], row: any) => {
|
||||||
|
const isSelected = selection.some((item) => item.id === row.id)
|
||||||
|
|
||||||
|
// load detail list to cache if not exists
|
||||||
|
if (!allDetailsMap.value[row.id]) {
|
||||||
|
currentTask.value = row
|
||||||
|
await loadDetailList(row.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
const childList = allDetailsMap.value[row.id] || []
|
||||||
|
|
||||||
|
if (isSelected && childList.length === 0) {
|
||||||
|
message.warning(`任务单 ${row.code} 无任务明细数据,无法勾选`)
|
||||||
|
taskTableRef.value?.toggleRowSelection(row, false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childList.length) {
|
||||||
|
childList.forEach((child) => {
|
||||||
|
// Find the row in detailList if currently displayed, or just use the child object
|
||||||
|
// `toggleRowSelection` needs the exact object reference that is in `data`
|
||||||
|
const rowInView = detailList.value.find(d => d.id === child.id)
|
||||||
|
if (rowInView) {
|
||||||
|
detailTableRef.value?.toggleRowSelection(rowInView, isSelected)
|
||||||
|
} else {
|
||||||
|
// If not in view but we want to select it, we can push it to selection or wait until viewed
|
||||||
|
// In Element Plus, toggleRowSelection works best with displayed data.
|
||||||
|
// We'll rely on handleCurrentTaskChange to re-apply selection if needed when viewed.
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleTaskSelectAll = async (selection: any[]) => {
|
||||||
|
const isAllSelected = selection.length > 0
|
||||||
|
|
||||||
|
if (isAllSelected) {
|
||||||
|
const validRows = []
|
||||||
|
let hasEmptyChild = false
|
||||||
|
|
||||||
|
for (const row of selection) {
|
||||||
|
if (!allDetailsMap.value[row.id]) {
|
||||||
|
currentTask.value = row
|
||||||
|
await loadDetailList(row.id)
|
||||||
|
}
|
||||||
|
const childList = allDetailsMap.value[row.id] || []
|
||||||
|
|
||||||
|
if (childList.length === 0) {
|
||||||
|
hasEmptyChild = true
|
||||||
|
taskTableRef.value?.toggleRowSelection(row, false)
|
||||||
|
} else {
|
||||||
|
validRows.push(row)
|
||||||
|
childList.forEach((child) => {
|
||||||
|
const rowInView = detailList.value.find(d => d.id === child.id)
|
||||||
|
if (rowInView) {
|
||||||
|
detailTableRef.value?.toggleRowSelection(rowInView, true)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasEmptyChild) {
|
||||||
|
message.warning('部分任务单无明细数据,已自动取消勾选')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
detailTableRef.value?.clearSelection()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDetailSelect = (selection: any[], row: any) => {
|
||||||
|
const taskId = row.taskId
|
||||||
|
const childList = allDetailsMap.value[taskId] || []
|
||||||
|
|
||||||
|
// check if all children for this task are selected
|
||||||
|
const allChildrenSelected = childList.every(child => selection.some(sel => sel.id === child.id))
|
||||||
|
const noChildrenSelected = childList.every(child => !selection.some(sel => sel.id === child.id))
|
||||||
|
|
||||||
|
const parentTask = taskList.value.find(task => task.id === taskId)
|
||||||
|
if (parentTask) {
|
||||||
|
if (allChildrenSelected) {
|
||||||
|
taskTableRef.value?.toggleRowSelection(parentTask, true)
|
||||||
|
} else if (noChildrenSelected) {
|
||||||
|
taskTableRef.value?.toggleRowSelection(parentTask, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDetailSelectAll = (selection: any[]) => {
|
||||||
|
if (!currentTask.value?.id) return
|
||||||
|
|
||||||
|
const taskId = currentTask.value.id
|
||||||
|
const childList = allDetailsMap.value[taskId] || []
|
||||||
|
|
||||||
|
const parentTask = taskList.value.find(task => task.id === taskId)
|
||||||
|
if (parentTask) {
|
||||||
|
// if any child in current view is selected, consider it an intent to select parent (if not all were selected)
|
||||||
|
// selection will contain all selected items across pages, so we need to filter for current view's task
|
||||||
|
const currentViewSelection = selection.filter(sel => sel.taskId === taskId)
|
||||||
|
|
||||||
|
if (currentViewSelection.length === childList.length && childList.length > 0) {
|
||||||
|
taskTableRef.value?.toggleRowSelection(parentTask, true)
|
||||||
|
} else if (currentViewSelection.length === 0) {
|
||||||
|
taskTableRef.value?.toggleRowSelection(parentTask, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSearch = async () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
await loadTaskList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleReset = async () => {
|
||||||
|
searchForm.inventoryTaskSchedule = false
|
||||||
|
searchForm.sortRule = undefined
|
||||||
|
searchForm.capacityType = 1
|
||||||
|
searchForm.code = ''
|
||||||
|
searchForm.orderDate = []
|
||||||
|
searchForm.deliveryDate = []
|
||||||
|
searchForm.remark = ''
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
await loadTaskList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const openTaskItemNeed = (row: any) => {
|
||||||
|
if (!row?.id) return
|
||||||
|
itemNeedRef.value.open('task', '任务单-' + (row?.code ?? ''), row.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
const openTaskPlan = (row: any) => {
|
||||||
|
if (!row?.id) return
|
||||||
|
window.open(`/mes/plan?taskId=${row.id}`, '_self')
|
||||||
|
}
|
||||||
|
|
||||||
|
const openProductItemNeed = (row: any) => {
|
||||||
|
if (!row?.productId) return
|
||||||
|
const number = row.number - row.planNumber > 0 ? row.number - row.planNumber : 0
|
||||||
|
itemNeedRef.value.open('product', row.productName, row.productId, number)
|
||||||
|
}
|
||||||
|
|
||||||
|
const openDetailPlan = (row: any) => {
|
||||||
|
if (!row?.taskId || !row?.productId) return
|
||||||
|
window.open(`/mes/plan?taskId=${row.taskId}&productId=${row.productId}`, '_self')
|
||||||
|
}
|
||||||
|
|
||||||
|
const openDetailCreatePlan = (_row: any) => {
|
||||||
|
message.info('请在任务单汇总明细列表中使用“新增计划”功能')
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSubmit = async () => {
|
||||||
|
if (searchForm.sortRule === undefined) {
|
||||||
|
message.warning('请选择排产规则')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (searchForm.capacityType === undefined) {
|
||||||
|
message.warning('请选择产能来源')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedRows = detailTableRef.value?.getSelectionRows() || []
|
||||||
|
if (selectedRows.length === 0) {
|
||||||
|
message.warning('至少选一个任务单汇总明细的数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
submitLoading.value = true
|
||||||
|
try {
|
||||||
|
const createReqVO = selectedRows.map((row: any) => {
|
||||||
|
const planNumber = row.number - row.planNumber > 0 ? row.number - row.planNumber : 0
|
||||||
|
return {
|
||||||
|
// PlanForm fields
|
||||||
|
productId: row.productId,
|
||||||
|
taskId: row.taskId,
|
||||||
|
taskDetailId: row.id,
|
||||||
|
planNumber: planNumber,
|
||||||
|
finishNumber: 0,
|
||||||
|
isPreProduction: 0,
|
||||||
|
isCode: true,
|
||||||
|
planStartTime: new Date().getTime(),
|
||||||
|
planEndTime: new Date().getTime(),
|
||||||
|
reyaNumber: planNumber,
|
||||||
|
|
||||||
|
// Image fields
|
||||||
|
orderPriority: row.orderPriority || row._parentTaskOrderPriority || 0,
|
||||||
|
workOrderCode: row.taskCode,
|
||||||
|
deliveryDate: row._parentTaskDeliveryDate || new Date().getTime(), // Fallback
|
||||||
|
orderDetailDeliveryDate: row.deliveryDate || row.finishDate || row._parentTaskDeliveryDate || new Date().getTime(), // Fallback
|
||||||
|
orderDetailId: row.id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await TaskApi.oneClickSchedule({
|
||||||
|
createReqVO,
|
||||||
|
sortRule: searchForm.sortRule,
|
||||||
|
capacityType: searchForm.capacityType
|
||||||
|
})
|
||||||
|
message.success('排产已提交')
|
||||||
|
dialogVisible.value = false
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
submitLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const open = async () => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
await loadTaskList()
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ open })
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue