fix(排产): 生产状态为已完成的单不再显示0%进度,已完成类型隐藏排产维护按钮

- 新增 MesProWorkOrderProductionStatusEnum(0待生产/1生产中/2生产完成)对齐后端
- 排产列表(生产管控>生产排产)对已完成类型行(订单状态=已完成 或 生产状态=生产完成)做完成态兜底展示:已生产数量按订单数量展示、完成进度100%,仅本页展示不改库
- 排产维护按钮显示条件增加:生产状态=生产完成时同样隐藏(订单仍已确认但工序任务已全部完工的行不再可维护)

Co-Authored-By: Claude <noreply@anthropic.com>
已修改2个文件
47 ■■■■■ 文件已修改
src/packages/constants/src/biz-mes-enum.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/task/index.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/packages/constants/src/biz-mes-enum.ts
@@ -244,6 +244,13 @@
  CANCELED: 3, // 已取消
} as const;
/** MES 生产工单生产状态枚举(对齐后端 MesProWorkOrderProductionStatusEnum) */
export const MesProWorkOrderProductionStatusEnum = {
  WAITING: 0, // 待生产
  PRODUCING: 1, // 生产中
  FINISHED: 2, // 生产完成
} as const;
/** MES 工单类型枚举 */
export const MesProWorkOrderTypeEnum = {
  SELF: 1, // 自行生产
src/views/mes/pro/task/index.vue
@@ -7,6 +7,7 @@
import { Page, useVbenModal } from '@vben/common-ui';
import {
  MesProWorkOrderProductionStatusEnum,
  MesProWorkOrderStatusEnum,
  MesProWorkOrderTypeEnum,
} from '@vben/constants';
@@ -71,6 +72,30 @@
  router.push({ name: 'MesProTaskGanttEdit' });
}
/** 判断订单是否为“已完成类型”:订单状态=已完成 或 生产状态=生产完成 */
function isCompletedWorkOrder(row: MesProWorkOrderApi.WorkOrder): boolean {
  return (
    row.status === MesProWorkOrderStatusEnum.FINISHED ||
    row.productionStatus === MesProWorkOrderProductionStatusEnum.FINISHED
  );
}
/**
 * 已完成类型行的“完成态”兜底展示:
 * 已生产数量按订单数量展示(若低于订单数量),使完成进度显示为 100%。
 * 仅作用于本页列表展示,不修改后端数据,不影响库存/报工/导出等真实口径。
 */
function normalizeCompletionDisplay(row: MesProWorkOrderApi.WorkOrder): void {
  if (!isCompletedWorkOrder(row)) {
    return;
  }
  const quantity = row.quantity ?? 0;
  const produced = row.quantityProduced ?? 0;
  if (produced < quantity) {
    row.quantityProduced = quantity;
  }
}
const [Grid, gridApi] = useVbenVxeGrid({
  formOptions: {
    schema: useGridFormSchema(),
@@ -82,21 +107,26 @@
      ajax: {
        query: async ({ page }, formValues) => {
          let scheduleStatus: number | undefined = undefined;
          if (activeTab.value === 'PENDING') {
            scheduleStatus = 0; // 待排产
            scheduleStatus = 0; // 未完成
          } else if (activeTab.value === 'FINISHED') {
            scheduleStatus = 1; // 已完成
          }
          // activeTab === 'ALL' 时不传
          return await getWorkOrderSchedulePage({
          const res = await getWorkOrderSchedulePage({
            pageNo: page.currentPage,
            pageSize: page.pageSize,
            scheduleStatus,
            type: MesProWorkOrderTypeEnum.SELF,
            ...formValues,
          });
          // 已完成类型行:已生产数量/完成进度做“完成态”兜底展示(仅本页展示,不改库)
          if (res?.list) {
            res.list.forEach(normalizeCompletionDisplay);
          }
          return res;
        },
      },
    },
@@ -173,7 +203,9 @@
              label: '排产维护',
              type: 'link',
              auth: ['mes:pro-task:create'],
              ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
              ifShow:
                row.status === MesProWorkOrderStatusEnum.CONFIRMED &&
                !isCompletedWorkOrder(row),
              onClick: handleSchedule.bind(null, row),
            },
            {