<script lang="ts" setup>
|
import type { MesProTaskApi } from '#/api/mes/pro/task';
|
|
import { 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 ProTaskSelectDialog from '#/views/mes/pro/task/components/select-dialog.vue';
|
|
defineOptions({ name: 'BatchFeedbackForm' });
|
|
interface Emits {
|
(e: 'success'): void;
|
}
|
|
const emit = defineEmits<Emits>();
|
|
const [Modal, modalApi] = useVbenModal({
|
onOpenChange: (open) => {
|
if (open) {
|
selectedTasks.value = [];
|
formData.value = {
|
feedbackQuantity: undefined,
|
qualifiedQuantity: undefined,
|
unqualifiedQuantity: undefined,
|
remark: '',
|
};
|
}
|
},
|
});
|
|
const taskDialogRef = ref<InstanceType<typeof ProTaskSelectDialog>>();
|
const selectedTasks = 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);
|
|
function handleOpenTaskDialog() {
|
taskDialogRef.value?.open([], { multiple: true });
|
}
|
|
function handleTaskSelected(rows: MesProTaskApi.Task[]) {
|
selectedTasks.value = rows;
|
}
|
|
function handleRemoveTask(taskId: number) {
|
selectedTasks.value = selectedTasks.value.filter((t) => t.id !== taskId);
|
}
|
|
async function handleSubmit() {
|
if (!selectedTasks.value.length) {
|
message.warning('请选择任务');
|
return;
|
}
|
if (!formData.value.feedbackQuantity) {
|
message.warning('请输入报工数量');
|
return;
|
}
|
submitting.value = true;
|
try {
|
const result = await batchCreateFeedback({
|
taskIds: selectedTasks.value.map((t) => t.id!),
|
feedbackQuantity: formData.value.feedbackQuantity,
|
qualifiedQuantity: formData.value.qualifiedQuantity,
|
unqualifiedQuantity: formData.value.unqualifiedQuantity,
|
remark: formData.value.remark || undefined,
|
});
|
if (result.failCount) {
|
message.warning(
|
`批量报工完成:成功 ${result.successCount} 个,失败 ${result.failCount} 个`,
|
);
|
} else {
|
message.success(`批量报工成功,共 ${result.successCount} 个`);
|
}
|
modalApi.close();
|
emit('success');
|
} finally {
|
submitting.value = false;
|
}
|
}
|
</script>
|
|
<template>
|
<Modal title="批量报工" @ok="handleSubmit">
|
<a-form layout="vertical">
|
<a-form-item label="选择任务" required>
|
<div class="mb-2">
|
<Button type="dashed" @click="handleOpenTaskDialog">
|
{{ selectedTasks.length ? `已选 ${selectedTasks.length} 个任务` : '点击选择任务' }}
|
</Button>
|
</div>
|
<div v-if="selectedTasks.length" class="flex flex-wrap gap-1">
|
<Tag
|
v-for="task in selectedTasks"
|
:key="task.id"
|
closable
|
@close="handleRemoveTask(task.id!)"
|
>
|
{{ task.code }}
|
</Tag>
|
</div>
|
</a-form-item>
|
<a-form-item label="报工数量" required>
|
<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>
|
<a-form-item label="备注">
|
<a-textarea
|
v-model:value="formData.remark"
|
placeholder="请输入备注"
|
:rows="2"
|
/>
|
</a-form-item>
|
</a-form>
|
<ProTaskSelectDialog ref="taskDialogRef" @selected="handleTaskSelected" />
|
</Modal>
|
</template>
|