19 小时以前 bbce6db600e6bb0cf2a3bb78bdf5ccff70b737a8
src/views/mes/pro/task/modules/schedule-form.vue
@@ -1,16 +1,17 @@
<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 { useVbenModal } from '../../../../../packages/effects/common-ui/src';
import { useVbenModal } from '@vben/common-ui';
import { Button, Card, message, Popconfirm, Steps } from 'ant-design-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';
@@ -18,7 +19,8 @@
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); // 当前工艺路线编号
@@ -41,17 +43,23 @@
  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;
  }
}
/** 完成订单 */
@@ -94,7 +102,10 @@
      // 设置到 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();
@@ -129,7 +140,7 @@
        <TaskList
          :color-code="rp.colorCode"
          :disabled="isReadonly"
          :item-id="workOrder.productId"
          :item-id="rp.outputItemId || workOrder.productId"
          :process-id="rp.processId!"
          :route-id="currentRouteId"
          :work-order-id="workOrder.id!"
@@ -138,13 +149,18 @@
    </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>