| | |
| | | <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' }); |
| | |
| | | |
| | | 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() { |
| | |
| | | message.warning('请选择任务'); |
| | | return; |
| | | } |
| | | if (!formData.value.feedbackQuantity) { |
| | | if (needQuantity.value && !formData.value.feedbackQuantity) { |
| | | message.warning('请输入报工数量'); |
| | | return; |
| | | } |
| | |
| | | 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) { |
| | |
| | | </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" |