| | |
| | | <script lang="ts" setup> |
| | | import type { MesProRouteProcessApi } from '#/api/mes/pro/route/process'; |
| | | import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder'; |
| | | import type { MesProWorkOrderProcessApi } from '#/api/mes/pro/workorder/process'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { getRouteProcessListByProduct } from '#/api/mes/pro/route/process'; |
| | | import { finishWorkOrder, getWorkOrder } from '#/api/mes/pro/workorder'; |
| | | import { getWorkOrderProcessListByWorkOrderId } from '#/api/mes/pro/workorder/process'; |
| | | |
| | | import { useScheduleFormSchema } from '../data'; |
| | | import TaskList from './task-list.vue'; |
| | |
| | | const emit = defineEmits(['success']); |
| | | const formType = ref<'detail' | 'schedule'>('schedule'); |
| | | const workOrder = ref<MesProWorkOrderApi.WorkOrder>(); // 当前订单详情 |
| | | const routeProcessList = ref<MesProRouteProcessApi.RouteProcess[]>([]); // 工艺路线工序列表 |
| | | /** 排产工序列表 */ |
| | | const routeProcessList = ref<MesProWorkOrderProcessApi.WorkOrderProcess[]>([]); |
| | | const activeProcessStep = ref(0); // 当前工序步骤索引 |
| | | const currentRouteId = ref(0); // 当前工艺路线编号 |
| | | |
| | |
| | | wrapperClass: 'grid-cols-3', |
| | | }); |
| | | |
| | | /** 加载工艺路线工序列表 */ |
| | | async function loadRouteProcesses(productId: number) { |
| | | const processes = await getRouteProcessListByProduct(productId); |
| | | if (!processes || processes.length === 0) { |
| | | message.warning('当前产品未配置工艺路线,请先在工艺路线中维护'); |
| | | /** 加载工单工序列表(仅使用工单工序,不回退到工艺路线模板) */ |
| | | async function loadRouteProcesses(workOrderId: number, productId: number) { |
| | | const woProcesses = await getWorkOrderProcessListByWorkOrderId(workOrderId); |
| | | if (!woProcesses || woProcesses.length === 0) { |
| | | message.warning('当前订单未配置工序,请先在工单中维护工序信息'); |
| | | return; |
| | | } |
| | | currentRouteId.value = processes[0]!.routeId ?? 0; |
| | | routeProcessList.value = [...processes].toSorted( |
| | | routeProcessList.value = [...woProcesses].toSorted( |
| | | (a, b) => (a.sort ?? 0) - (b.sort ?? 0), |
| | | ); |
| | | // 确定工艺路线ID:工单路线 → 产品路线 |
| | | if (workOrder.value?.routeId) { |
| | | currentRouteId.value = workOrder.value.routeId; |
| | | } else { |
| | | const processes = await getRouteProcessListByProduct(productId); |
| | | currentRouteId.value = processes?.[0]?.routeId ?? 0; |
| | | } |
| | | } |
| | | |
| | | /** 完成订单 */ |
| | |
| | | // 设置到 values |
| | | await formApi.setValues(workOrder.value); |
| | | if (workOrder.value.productId) { |
| | | await loadRouteProcesses(workOrder.value.productId); |
| | | await loadRouteProcesses( |
| | | workOrder.value.id!, |
| | | workOrder.value.productId, |
| | | ); |
| | | } |
| | | } finally { |
| | | modalApi.unlock(); |
| | |
| | | </template> |
| | | <template #prepend-footer> |
| | | <div class="flex flex-auto items-center gap-2"> |
| | | <Popconfirm |
| | | v-if="formType === 'schedule'" |
| | | title="确认要完成该订单吗?完成后订单下所有任务将标记为已完成。" |
| | | @confirm="handleFinish" |
| | | > |
| | | <Button type="primary">完成</Button> |
| | | </Popconfirm> |
| | | <template v-if="formType === 'schedule'"> |
| | | <Popconfirm |
| | | v-if="routeProcessList.length > 0" |
| | | title="确认要完成该订单吗?完成后订单下所有任务将标记为已完成。" |
| | | @confirm="handleFinish" |
| | | > |
| | | <Button type="primary">完成</Button> |
| | | </Popconfirm> |
| | | <span v-else class="text-gray-400 text-sm"> |
| | | 当前订单未配置工序,请先在工单中维护工序信息后再完成 |
| | | </span> |
| | | </template> |
| | | </div> |
| | | </template> |
| | | </Modal> |