2026-08-29 d5048a33e4760d414115a5e25645d30b41d24198
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' });
@@ -32,22 +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,
  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() {
@@ -55,7 +83,7 @@
    message.warning('请选择任务');
    return;
  }
  if (!formData.value.feedbackQuantity) {
  if (needQuantity.value && !formData.value.feedbackQuantity) {
    message.warning('请输入报工数量');
    return;
  }
@@ -63,7 +91,9 @@
  try {
    const result = await batchCreateFeedback({
      taskIds: selectedTasks.value.map((t) => t.id!),
      feedbackQuantity: formData.value.feedbackQuantity,
      feedbackQuantity: needQuantity.value
        ? (formData.value.feedbackQuantity ?? 0)
        : 0,
      remark: formData.value.remark || undefined,
    });
    if (result.failCount) {
@@ -101,7 +131,12 @@
          </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"