gaoluyang
2026-08-31 8f8dcdae7e40ba4e94a363aa8eb91c7665810bc3
src/views/mes/pro/workorder-center/modules/quick-feedback.vue
@@ -9,6 +9,13 @@
import { message } from 'ant-design-vue';
import { quickCreateFeedback } from '#/api/mes/pro/feedback';
import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process';
import { getTask } from '#/api/mes/pro/task';
import {
  loadParamDetails,
  paramDetails,
} from '#/views/mes/pro/feedback/param-state';
import WaitCountdown from '#/views/mes/pro/feedback/modules/wait-countdown.vue';
import ProTaskSelect from '#/views/mes/pro/task/components/select.vue';
defineOptions({ name: 'QuickFeedbackForm' });
@@ -35,10 +42,20 @@
      selectedTask.value = undefined;
      formData.value = {
        feedbackQuantity: undefined,
        qualifiedQuantity: undefined,
        unqualifiedQuantity: undefined,
        remark: '',
      };
      waitDuration.value = undefined;
      needReportQuantity.value = true;
      waitStartTime.value = undefined;
      // 预设任务时加载其工艺参数与等待配置;否则等待选择任务后再加载
      if (props.taskId) {
        loadParamDetails(props.taskId);
        getTask(props.taskId)
          .then(applyTaskWaitConfig)
          .catch(() => {});
      } else {
        paramDetails.value = [];
      }
    }
  },
});
@@ -48,11 +65,12 @@
const selectedTask = ref<MesProTaskApi.Task>();
const formData = ref({
  feedbackQuantity: undefined as number | undefined,
  qualifiedQuantity: undefined as number | undefined,
  unqualifiedQuantity: undefined as number | undefined,
  remark: '',
});
const submitting = ref(false);
const waitDuration = ref<number>();
const needReportQuantity = ref<boolean>(true);
const waitStartTime = ref<string>();
const hasPredefinedTask = computed(() => !!props.taskId);
@@ -70,6 +88,28 @@
function handleTaskChange(task: MesProTaskApi.Task | undefined) {
  selectedTask.value = task;
  selectedTaskId.value = task?.id;
  loadParamDetails(task?.id);
  applyTaskWaitConfig(task);
}
/** 按任务工序加载等待时长与报工数量规则 */
async function applyTaskWaitConfig(task?: MesProTaskApi.Task) {
  waitDuration.value = undefined;
  needReportQuantity.value = true;
  waitStartTime.value = task?.waitStartTime;
  if (!task?.routeId || !task?.processId) {
    return;
  }
  try {
    const routeProcess = await getRouteProcessByRouteAndProcess(
      task.routeId,
      task.processId,
    );
    waitDuration.value = routeProcess?.waitDuration;
    needReportQuantity.value = routeProcess?.needReportQuantity ?? true;
  } catch {
    // 加载失败按默认处理(无需倒计时、数量必填)
  }
}
async function handleSubmit() {
@@ -78,7 +118,7 @@
    message.warning('请选择任务');
    return;
  }
  if (!formData.value.feedbackQuantity) {
  if (needReportQuantity.value && !formData.value.feedbackQuantity) {
    message.warning('请输入报工数量');
    return;
  }
@@ -86,9 +126,13 @@
  try {
    await quickCreateFeedback({
      taskId,
      feedbackQuantity: formData.value.feedbackQuantity,
      qualifiedQuantity: formData.value.qualifiedQuantity,
      unqualifiedQuantity: formData.value.unqualifiedQuantity,
      feedbackQuantity: needReportQuantity.value
        ? (formData.value.feedbackQuantity ?? 0)
        : 0,
      paramValues: paramDetails.value.map((detail) => ({
        detailId: detail.id,
        value: detail.paramValue,
      })),
      remark: formData.value.remark || undefined,
    });
    message.success('报工成功');
@@ -118,7 +162,14 @@
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="本次报工数量" required>
      <a-form-item v-if="waitDuration" label="报工倒计时">
        <WaitCountdown
          :task-id="selectedTaskId"
          :wait-duration="waitDuration"
          :wait-start-time="waitStartTime"
        />
      </a-form-item>
      <a-form-item v-if="needReportQuantity" label="本次报工数量" required>
        <a-input-number
          v-model:value="formData.feedbackQuantity"
          :min="0.01"
@@ -128,24 +179,27 @@
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="合格品数量">
        <a-input-number
          v-model:value="formData.qualifiedQuantity"
          :min="0"
          :precision="2"
          placeholder="请输入合格品数量"
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="不良品数量">
        <a-input-number
          v-model:value="formData.unqualifiedQuantity"
          :min="0"
          :precision="2"
          placeholder="请输入不良品数量"
          class="!w-full"
        />
      </a-form-item>
      <div v-if="paramDetails.length" class="mb-4">
        <div class="mb-1 font-medium">工艺参数</div>
        <div
          v-for="detail in paramDetails"
          :key="detail.id"
          class="mb-2 flex items-center gap-2"
        >
          <span class="w-40 flex-shrink-0 text-right text-sm text-gray-600">
            <span v-if="detail.required" class="text-red-500">*&nbsp;</span>
            {{ detail.paramName || detail.paramCode
            }}{{
              detail.unitMeasureName ? `(${detail.unitMeasureName})` : ''
            }}
          </span>
          <a-input
            v-model:value="detail.paramValue"
            placeholder="请输入参数值"
            class="!w-full"
          />
        </div>
      </div>
      <a-form-item label="备注">
        <a-textarea
          v-model:value="formData.remark"