src/views/mes/workbench/components/tabs/FeedbackTab.vue
@@ -4,20 +4,23 @@
import { computed, ref, watch } from 'vue';
import dayjs from 'dayjs';
import {
  MesAutoCodeRuleCode,
  MesProFeedbackStatusEnum,
} from '@vben/constants';
import { useUserStore } from '@vben/stores';
import { Button, message, Popconfirm } from 'ant-design-vue';
import { Button, message, Modal, Popconfirm } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { generateAutoCode } from '#/api/mes/md/autocode/record';
import {
  approveFeedback,
  createFeedback,
  createFeedback, getBatchRequirements,
  getFeedback,
  getFeedbackPage,
  rejectFeedback,
  submitFeedback,
  updateFeedback,
@@ -26,7 +29,10 @@
import { $t } from '#/locales';
import { useFormSchema } from '../../../pro/feedback/data';
import BatchInputDialog from '../../../pro/feedback/modules/batch-input-dialog.vue';
const batchDialogRef = ref<InstanceType<typeof BatchInputDialog>>();
const batchActionType = ref<'submit' | 'approve'>('');
const pendingSubmitMode = ref<'saveAndSubmit' | 'submit'>('submit');
defineOptions({ name: 'WorkbenchFeedbackTab' });
const props = defineProps<{
@@ -115,7 +121,7 @@
  await formApi.setValues({
    code,
    type: 1,
    feedbackTime: Date.now(),
    feedbackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
    feedbackUserId: userStore.userInfo?.id,
    taskId: task.id,
    workOrderId: task.workOrderId,
@@ -128,9 +134,9 @@
    itemSpecification: task.itemSpecification,
    unitMeasureName: task.unitMeasureName,
    scheduledQuantity: task.quantity,
    feedbackApprove: task.feedbackApprove,
    checkFlag,
  });
  originalSnapshot.value = JSON.stringify(await getAlignedData());
}
@@ -140,6 +146,7 @@
  if (!valid) return;
  const data = await getAlignedData();
  const code = data.code as string;
  if (formType.value === 'create') {
    const id = await createFeedback(data);
@@ -148,12 +155,78 @@
    formType.value = 'update';
    formApi.setState({ schema: useFormSchema(formType.value, formApi) });
    await formApi.setFieldValue('id', id);
    message.success($t('common.createSuccess'));
  } else {
    await updateFeedback(data);
    message.success($t('common.updateSuccess'));
  }
  originalSnapshot.value = JSON.stringify(data);
  // 显示显眼的成功提示
  Modal.success({
    title: '保存成功',
    content: `报工单 ${code} 已保存`,
    centered: true,
  });
  // 重置表单为新建模式,重新生成报订单号
  if (props.task) {
    await resetForTask(props.task);
  }
  emit('reported');
}
/** 保存并提交(先保存,再查询并提交) */
async function handleSaveAndSubmit() {
  const { valid } = await formApi.validate();
  if (!valid) return;
  const data = await getAlignedData();
  const code = data.code as string;
  // 1. 先保存
  if (formType.value === 'create') {
    const id = await createFeedback(data);
    feedbackId.value = id;
    feedbackStatus.value = MesProFeedbackStatusEnum.PREPARE;
    formType.value = 'update';
    formApi.setState({ schema: useFormSchema(formType.value, formApi) });
    await formApi.setFieldValue('id', id);
  } else {
    await updateFeedback(data);
  }
  originalSnapshot.value = JSON.stringify(data);
  // 2. 查询报工记录,匹配该报工单号
  const pageResult = await getFeedbackPage({ code, pageNo: 1, pageSize: 1 });
  const record = pageResult.list?.[0];
  // 3. 检查是否可提交(草稿状态)
  if (!record || record.status !== MesProFeedbackStatusEnum.PREPARE) {
    message.warning('保存成功,但当前报工单状态不可提交');
    emit('reported');
    return;
  }
  pendingSubmitMode.value = 'saveAndSubmit';
  // 4. 调用提交接口
  const isDone = await handleOnSubmit(feedbackId.value!,props.task.feedbackApprove);
  if (!isDone) return;
  feedbackId.value = record.id;
  feedbackStatus.value = record.status;
  // 显示显眼的成功提示
  Modal.success({
    title: '保存并提交成功',
    content: `报工单 ${code} 已提交`,
    centered: true,
  });
  // 重置表单为新建模式,重新生成报订单号
  if (props.task) {
    await resetForTask(props.task);
  }
  emit('reported');
}
@@ -167,8 +240,12 @@
    await updateFeedback(data);
    originalSnapshot.value = JSON.stringify(data);
  }
  await submitFeedback(feedbackId.value!);
  message.success('报订单已提交');
  pendingSubmitMode.value = 'submit';
  const isDone = await handleOnSubmit(feedbackId.value!,props.task.feedbackApprove);
  if (!isDone) return;
  message.success('报工单已提交');
  // 重置表单为新建模式
  if (props.task) {
    await resetForTask(props.task);
@@ -176,10 +253,53 @@
  emit('reported');
}
/** 提交方法 */
async function handleOnSubmit(id:any,feedbackRate:any): Promise<boolean> {
  if (feedbackRate&&feedbackRate==true){
    await submitFeedback({ id: feedbackId.value! });
    return true;
  }
  const checkResult = await getBatchRequirements(id);
  if (checkResult?.needBatchInput) {
    batchActionType.value = 'submit';
    batchDialogRef.value?.open({ checkResult });
    return false;
  } else {
    await submitFeedback({ id: feedbackId.value! });
    return true;
  }
}
/** 批次确认回调 */
async function handleBatchConfirm(batchData: Record<string, unknown>) {
  if (batchActionType.value === 'submit') {
    await submitFeedback({ id: feedbackId.value!, ...batchData });
    if (pendingSubmitMode.value === 'saveAndSubmit') {
      const data = await getAlignedData();
      const code = data.code as string;
      Modal.success({
        title: '保存并提交成功',
        content: `报工单 ${code} 已提交`,
        centered: true,
      });
    } else {
      message.success('报工单已提交');
    }
    if (props.task) {
      await resetForTask(props.task);
    }
    emit('reported');
  }
}
/** 审批通过 */
async function handleApprove() {
  if (!feedbackId.value) return;
  const finished = await approveFeedback(feedbackId.value);
  const finished = await approveFeedback({ id: feedbackId.value });
  message.success(
    finished ? '报订单已审批完成' : '报工成功,请等待质量检验完成!',
  );
@@ -229,6 +349,7 @@
<template>
  <div class="feedback-tab">
    <BatchInputDialog ref="batchDialogRef" @confirm="handleBatchConfirm" />
    <div v-if="!task" class="feedback-tab__empty">
      请从左侧工单列表选择一条任务
    </div>
@@ -252,6 +373,13 @@
        >
          保存
        </Button>
        <Button
          v-if="isEditable"
          type="primary"
          @click="handleSaveAndSubmit"
        >
          保存并提交
        </Button>
        <Popconfirm
          v-if="canSubmit"
          title="确认提交该报订单?提交后将不能修改。"