gaoluyang
8 小时以前 b64a0deae5b5d33f9e20671a68936b27f0b9b00b
Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0
已修改10个文件
134 ■■■■■ 文件已修改
src/views/mes/pro/feedback/modules/form.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/task/components/gantt-chart.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/task/data.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/modules/form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/process-design/route/modules/form.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/itemreceipt/modules/form.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/productissue/modules/form.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/returnissue/modules/form.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/salesnotice/modules/form.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/feedback/modules/form.vue
@@ -128,6 +128,7 @@
      await updateFeedback(data);
      formData.value = { ...formData.value, ...data };
      message.success($t('common.updateSuccess'));
      await modalApi.close();
    }
    // 刷新快照(已对齐数量并补 id),后续 submit 用于判断是否需要再保存
    originalSnapshot.value = JSON.stringify(data);
src/views/mes/pro/task/components/gantt-chart.vue
@@ -13,7 +13,7 @@
 * 1. 按订单分组展示生产任务,订单为 project 行,任务为子行
 * 2. 支持只读预览和拖拽编辑两种模式
 * 3. 拖拽后触发 taskUpdate 事件,通知父组件批量保存
 * 4. 时间刻度:周 → 日 → 8 小时(1 工作日 = 8 小时)
 * 4. 时间刻度:周 → 日 → 小时
 */
defineOptions({ name: 'GanttChart', inheritAttrs: false });
@@ -47,8 +47,8 @@
  gantt.config.readonly = props.readonly;
  gantt.config.date_format = '%Y-%m-%d %H:%i:%s';
  gantt.config.duration_unit = 'hour'; // 持续时间单位为小时,配合 duration_step 实现工作日单位
  gantt.config.duration_step = 8; // 1 工作日 = 8 小时
  gantt.config.duration_unit = 'hour'; // 持续时间单位为小时
  gantt.config.duration_step = 1; // duration 字段即为实际小时数
  gantt.config.row_height = 36;
  gantt.config.bar_height = 24;
  gantt.config.fit_tasks = true;
@@ -70,7 +70,7 @@
  gantt.config.buttons_left = ['gantt_save_btn'];
  gantt.config.buttons_right = ['gantt_cancel_btn'];
  // 时间刻度:周 > 日 > 8 小时
  // 时间刻度:周 > 日 > 小时
  const weekScaleTemplate = (date: Date) => {
    const dateToStr = gantt.date.date_to_str('%M %d');
    const endDate = gantt.date.add(gantt.date.add(date, 1, 'week'), -1, 'day');
@@ -82,7 +82,7 @@
  gantt.config.scales = [
    { unit: 'week', step: 1, format: weekScaleTemplate },
    { unit: 'day', step: 1, format: dayTemplate, css: daysStyle },
    { unit: 'hour', step: 8, format: '%H:%i' },
    { unit: 'hour', step: 1, format: '%H:%i' },
  ];
  gantt.config.scale_height = 50;
  gantt.config.show_task_cells = true;
src/views/mes/pro/task/data.ts
@@ -347,8 +347,8 @@
    },
    {
      field: 'duration',
      title: '生产时长',
      width: 80,
      title: '生产时长(h)',
      width: 120,
    },
    {
      field: 'endTime',
@@ -420,7 +420,7 @@
    },
    {
      fieldName: 'duration',
      label: '生产时长',
      label: '生产时长(h)',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
@@ -456,7 +456,7 @@
  ];
}
/** 计算结束时间:开始时间 + 生产时长 × 8 小时 */
/** 计算结束时间:开始时间 + 生产时长(小时) */
async function recalcEndTime(formApi?: VbenFormApi) {
  if (!formApi) {
    return;
@@ -466,7 +466,7 @@
    const start = Number(values.startTime);
    await formApi.setFieldValue(
      'endTime',
      start + values.duration * 8 * 3600 * 1000,
      start + values.duration * 3600 * 1000,
    );
  }
}
@@ -553,7 +553,7 @@
      width: 170,
      formatter: 'formatDateTime',
    },
    { field: 'duration', title: '生产时长', width: 100 },
    { field: 'duration', title: '生产时长(h)', width: 120 },
    {
      field: 'endTime',
      title: '预计完成时间',
src/views/mes/pro/workorder/index.vue
@@ -203,7 +203,9 @@
              label: '完成',
              type: 'link',
              auth: ['mes:pro-work-order:update'],
              ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
              ifShow:
                row.status === MesProWorkOrderStatusEnum.CONFIRMED &&
                !!row.quantityProduced,
              onClick: handleFinish.bind(null, row),
            },
            {
src/views/mes/pro/workorder/modules/form.vue
@@ -204,6 +204,9 @@
        if (formData.value?.id) {
          await updateWorkOrder({ ...formData.value, ...data });
          formData.value = { ...formData.value, ...data };
          emit("success");
          message.success($t("ui.actionMessage.operationSuccess"));
          await modalApi.close();
        } else {
          const id = await createWorkOrder(data);
          formData.value = {
@@ -214,10 +217,9 @@
          formType.value = "update";
          applySchema();
          await formApi.setValues(formData.value);
          emit("success");
        }
        originalSnapshot.value = JSON.stringify(await formApi.getValues());
        emit("success");
        message.success($t("ui.actionMessage.operationSuccess"));
      } finally {
        modalApi.unlock();
      }
src/views/mes/process-design/route/modules/form.vue
@@ -67,7 +67,12 @@
      } else {
        await updateRoute(data);
        formData.value = { ...formData.value, ...data };
        emit('success');
        message.success($t('ui.actionMessage.operationSuccess'));
        await modalApi.close();
        return;
      }
      // 新增:保持弹窗打开,切换到编辑模式继续维护
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
    } finally {
src/views/wls/itemreceipt/modules/form.vue
@@ -133,17 +133,21 @@
      if (formData.value?.id) {
        await updateItemReceipt({ ...formData.value, ...data });
        formData.value = { ...formData.value, ...data };
      } else {
        const id = await createItemReceipt(data);
        formData.value = {
          ...data,
          id,
          status: MesWmItemReceiptStatusEnum.PREPARE,
        };
        await formApi.setFieldValue('id', id);
        await formApi.setFieldValue('status', formData.value.status);
        formType.value = 'update';
        emit('success');
        message.success($t('ui.actionMessage.operationSuccess'));
        await modalApi.close();
        return;
      }
      // 新增:保持弹窗打开,切换到编辑模式
      const id = await createItemReceipt(data);
      formData.value = {
        ...data,
        id,
        status: MesWmItemReceiptStatusEnum.PREPARE,
      };
      await formApi.setFieldValue('id', id);
      await formApi.setFieldValue('status', formData.value.status);
      formType.value = 'update';
      originalSnapshot.value = JSON.stringify(await formApi.getValues());
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
src/views/wls/productissue/modules/form.vue
@@ -152,17 +152,21 @@
      if (formData.value?.id) {
        await updateProductIssue({ ...formData.value, ...data });
        formData.value = { ...formData.value, ...data };
      } else {
        const id = await createProductIssue(data);
        formData.value = {
          ...data,
          id,
          status: MesWmProductIssueStatusEnum.PREPARE,
        };
        await formApi.setFieldValue('id', id);
        await formApi.setFieldValue('status', formData.value.status);
        formType.value = 'update';
        emit('success');
        message.success($t('ui.actionMessage.operationSuccess'));
        await modalApi.close();
        return;
      }
      // 新增:保持弹窗打开,切换到编辑模式
      const id = await createProductIssue(data);
      formData.value = {
        ...data,
        id,
        status: MesWmProductIssueStatusEnum.PREPARE,
      };
      await formApi.setFieldValue('id', id);
      await formApi.setFieldValue('status', formData.value.status);
      formType.value = 'update';
      originalSnapshot.value = JSON.stringify(await formApi.getValues());
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
src/views/wls/returnissue/modules/form.vue
@@ -142,17 +142,21 @@
      if (formData.value?.id) {
        await updateReturnIssue({ ...formData.value, ...data });
        formData.value = { ...formData.value, ...data };
      } else {
        const id = await createReturnIssue(data);
        formData.value = {
          ...data,
          id,
          status: MesWmReturnIssueStatusEnum.PREPARE,
        };
        await formApi.setFieldValue('id', id);
        await formApi.setFieldValue('status', formData.value.status);
        formType.value = 'update';
        emit('success');
        message.success($t('ui.actionMessage.operationSuccess'));
        await modalApi.close();
        return;
      }
      // 新增:保持弹窗打开,切换到编辑模式
      const id = await createReturnIssue(data);
      formData.value = {
        ...data,
        id,
        status: MesWmReturnIssueStatusEnum.PREPARE,
      };
      await formApi.setFieldValue('id', id);
      await formApi.setFieldValue('status', formData.value.status);
      formType.value = 'update';
      originalSnapshot.value = JSON.stringify(await formApi.getValues());
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
src/views/wls/salesnotice/modules/form.vue
@@ -100,17 +100,21 @@
      if (formData.value?.id) {
        await updateSalesNotice({ ...formData.value, ...data });
        formData.value = { ...formData.value, ...data };
      } else {
        const id = await createSalesNotice(data);
        formData.value = {
          ...data,
          id,
          status: MesWmSalesNoticeStatusEnum.PREPARE,
        };
        await formApi.setFieldValue('id', id);
        await formApi.setFieldValue('status', formData.value.status);
        formType.value = 'update';
        emit('success');
        message.success($t('ui.actionMessage.operationSuccess'));
        await modalApi.close();
        return;
      }
      // 新增:保持弹窗打开,切换到编辑模式
      const id = await createSalesNotice(data);
      formData.value = {
        ...data,
        id,
        status: MesWmSalesNoticeStatusEnum.PREPARE,
      };
      await formApi.setFieldValue('id', id);
      await formApi.setFieldValue('status', formData.value.status);
      formType.value = 'update';
      originalSnapshot.value = JSON.stringify(await formApi.getValues());
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));