gaoluyang
2026-08-31 8f8dcdae7e40ba4e94a363aa8eb91c7665810bc3
src/views/mes/pro/feedback/modules/batch-feedback.vue
@@ -1,13 +1,14 @@
<script lang="ts" setup>
import type { MesProTaskApi } from '#/api/mes/pro/task';
import { ref } from 'vue';
import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { Button, message, Tag } from 'ant-design-vue';
import { batchCreateFeedback } from '#/api/mes/pro/feedback';
import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process';
import ProTaskSelectDialog from '#/views/mes/pro/task/components/select-dialog.vue';
defineOptions({ name: 'BatchFeedbackForm' });
@@ -24,8 +25,6 @@
      selectedTasks.value = [];
      formData.value = {
        feedbackQuantity: undefined,
        qualifiedQuantity: undefined,
        unqualifiedQuantity: undefined,
        remark: '',
      };
    }
@@ -34,24 +33,49 @@
const taskDialogRef = ref<InstanceType<typeof ProTaskSelectDialog>>();
const selectedTasks = ref<MesProTaskApi.Task[]>([]);
const needReportQuantityMap = ref<Record<number, boolean>>({});
const formData = ref({
  feedbackQuantity: undefined as number | undefined,
  qualifiedQuantity: undefined as number | undefined,
  unqualifiedQuantity: undefined as number | undefined,
  remark: '',
});
const submitting = ref(false);
/** 是否需要填写报工数量(任一选中任务工序要求填写数量即必填) */
const needQuantity = computed(() =>
  selectedTasks.value.some(
    (t) => needReportQuantityMap.value[t.id!] ?? true,
  ),
);
function handleOpenTaskDialog() {
  taskDialogRef.value?.open([], { multiple: true });
}
function handleTaskSelected(rows: MesProTaskApi.Task[]) {
/** 按选中任务工序加载是否需要报工数量 */
async function handleTaskSelected(rows: MesProTaskApi.Task[]) {
  selectedTasks.value = rows;
  needReportQuantityMap.value = {};
  for (const task of rows) {
    if (!task.routeId || !task.processId) {
      continue;
    }
    try {
      const routeProcess = await getRouteProcessByRouteAndProcess(
        task.routeId,
        task.processId,
      );
      needReportQuantityMap.value[task.id!] =
        routeProcess?.needReportQuantity ?? true;
    } catch {
      // 加载失败按默认处理(数量必填)
      needReportQuantityMap.value[task.id!] = true;
    }
  }
}
function handleRemoveTask(taskId: number) {
  selectedTasks.value = selectedTasks.value.filter((t) => t.id !== taskId);
  delete needReportQuantityMap.value[taskId];
}
async function handleSubmit() {
@@ -59,7 +83,7 @@
    message.warning('请选择任务');
    return;
  }
  if (!formData.value.feedbackQuantity) {
  if (needQuantity.value && !formData.value.feedbackQuantity) {
    message.warning('请输入报工数量');
    return;
  }
@@ -67,9 +91,9 @@
  try {
    const result = await batchCreateFeedback({
      taskIds: selectedTasks.value.map((t) => t.id!),
      feedbackQuantity: formData.value.feedbackQuantity,
      qualifiedQuantity: formData.value.qualifiedQuantity,
      unqualifiedQuantity: formData.value.unqualifiedQuantity,
      feedbackQuantity: needQuantity.value
        ? (formData.value.feedbackQuantity ?? 0)
        : 0,
      remark: formData.value.remark || undefined,
    });
    if (result.failCount) {
@@ -107,30 +131,17 @@
          </Tag>
        </div>
      </a-form-item>
      <a-form-item label="报工数量" required>
      <a-form-item
        v-if="needQuantity"
        label="报工数量"
        required
        tooltip="工序配置为不需填写报工数量时,合格品/不良品数量由质检确定"
      >
        <a-input-number
          v-model:value="formData.feedbackQuantity"
          :min="0.01"
          :precision="2"
          placeholder="请输入报工数量(应用到所有选中任务)"
          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>