3 小时以前 5367b3b4d92588c4e76728e6bd4ad6aae0cbb967
src/views/mes/pro/task/index.vue
@@ -1,31 +1,37 @@
<script lang="ts" setup>
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
import { onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '../../../../packages/effects/common-ui/src';
import { Page, useVbenModal } from '@vben/common-ui';
import {
  MesProWorkOrderStatusEnum,
  MesProWorkOrderTypeEnum,
} from '../../../../packages/constants/src';
} from '@vben/constants';
import { Button, Card } from 'ant-design-vue';
import { Button, Card, message } from 'ant-design-vue';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { getGanttTaskList } from '#/api/mes/pro/task';
import { getGanttTaskList, previewAutoGenerate, autoGenerateTasks } from '#/api/mes/pro/task';
import { getWorkOrderPage } from '#/api/mes/pro/workorder';
import { GanttChart } from './components';
import { useGridColumns, useGridFormSchema } from './data';
import ScheduleForm from './modules/schedule-form.vue';
import SchedulePreview from '../workorder-center/modules/schedule-preview.vue';
const router = useRouter();
const ganttTasks = ref<any[]>([]); // 甘特图预览数据
const [ScheduleModal, scheduleModalApi] = useVbenModal({
  connectedComponent: ScheduleForm,
  destroyOnClose: true,
});
const [SchedulePreviewModal, schedulePreviewModalApi] = useVbenModal({
  connectedComponent: SchedulePreview,
  destroyOnClose: true,
});
@@ -43,7 +49,7 @@
  });
}
/** 查看工单详情 */
/** 查看订单详情 */
function handleDetail(row: MesProWorkOrderApi.WorkOrder) {
  scheduleModalApi.setData({ formType: 'detail', id: row.id }).open();
}
@@ -51,6 +57,29 @@
/** 排产 */
function handleSchedule(row: MesProWorkOrderApi.WorkOrder) {
  scheduleModalApi.setData({ formType: 'schedule', id: row.id }).open();
}
/** 一键排产预览 */
async function handleAutoSchedulePreview(row: MesProWorkOrderApi.WorkOrder) {
  try {
    const preview = await previewAutoGenerate({ workOrderId: row.id! });
    schedulePreviewModalApi
      .setData({ workOrder: row, preview })
      .open();
  } catch {
    message.error('获取排产预览失败');
  }
}
/** 一键排产执行 */
async function handleAutoSchedule(row: MesProWorkOrderApi.WorkOrder) {
  try {
    const result = await autoGenerateTasks({ workOrderId: row.id! });
    message.success(`排产成功,生成 ${result.taskIds?.length || 0} 个任务`);
    handleRefresh();
  } catch {
    message.error('排产失败');
  }
}
/** 打开甘特图编辑页面 */
@@ -101,21 +130,15 @@
<template>
  <Page auto-content-height>
    <template #doc>
      <DocAlert
        title="【生产】生产排产、工序流转卡"
        url="https://doc.iocoder.cn/mes/pro/schedule-card/"
      />
    </template>
    <ScheduleModal @success="handleRefresh" />
    <SchedulePreviewModal @success="handleRefresh" />
    <!-- 排产甘特图预览 -->
    <Card title="排产甘特图" class="mb-4">
      <GanttChart :height="350" :readonly="true" :tasks="ganttTasks" />
    </Card>
    <Grid table-title="待排产工单">
    <Grid table-title="待排产订单">
      <template #toolbar-tools>
        <TableAction
          :actions="[
@@ -143,6 +166,13 @@
              ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
              onClick: handleSchedule.bind(null, row),
            },
            {
              label: '一键排产',
              type: 'link',
              auth: ['mes:pro-task:create'],
              ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
              onClick: handleAutoSchedulePreview.bind(null, row),
            },
          ]"
        />
      </template>