<script lang="ts" setup>
|
import type { FormInstance } from 'ant-design-vue';
|
import type { MesProTaskApi } from '#/api/mes/pro/task';
|
|
import { computed, ref } from 'vue';
|
|
import { useVbenModal } from '@vben/common-ui';
|
|
import { message } from 'ant-design-vue';
|
|
import { quickCreateFeedback } from '#/api/mes/pro/feedback';
|
import ProTaskSelect from '#/views/mes/pro/task/components/select.vue';
|
|
defineOptions({ name: 'QuickFeedbackForm' });
|
|
interface Props {
|
taskId?: number;
|
taskCode?: string;
|
taskQuantity?: number;
|
taskProducedQuantity?: number;
|
}
|
|
const props = withDefaults(defineProps<Props>(), {});
|
|
interface Emits {
|
(e: 'success'): void;
|
}
|
|
const emit = defineEmits<Emits>();
|
|
const [Modal, modalApi] = useVbenModal({
|
onOpenChange: (open) => {
|
if (open) {
|
selectedTaskId.value = props.taskId;
|
selectedTask.value = undefined;
|
formData.value = {
|
feedbackQuantity: undefined,
|
qualifiedQuantity: undefined,
|
unqualifiedQuantity: undefined,
|
remark: '',
|
};
|
}
|
},
|
});
|
|
const formRef = ref<FormInstance>();
|
const selectedTaskId = ref<number | undefined>(props.taskId);
|
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 hasPredefinedTask = computed(() => !!props.taskId);
|
|
const pendingQuantity = computed(() => {
|
if (hasPredefinedTask.value) {
|
if (props.taskQuantity == null || props.taskProducedQuantity == null) return 0;
|
return Math.max(0, Number(props.taskQuantity) - Number(props.taskProducedQuantity));
|
}
|
if (!selectedTask.value) return 0;
|
const qty = Number(selectedTask.value.quantity || 0);
|
const produced = Number(selectedTask.value.producedQuantity || 0);
|
return Math.max(0, qty - produced);
|
});
|
|
function handleTaskChange(task: MesProTaskApi.Task | undefined) {
|
selectedTask.value = task;
|
selectedTaskId.value = task?.id;
|
}
|
|
async function handleSubmit() {
|
const taskId = selectedTaskId.value;
|
if (!taskId) {
|
message.warning('请选择任务');
|
return;
|
}
|
if (!formData.value.feedbackQuantity) {
|
message.warning('请输入报工数量');
|
return;
|
}
|
submitting.value = true;
|
try {
|
await quickCreateFeedback({
|
taskId,
|
feedbackQuantity: formData.value.feedbackQuantity,
|
qualifiedQuantity: formData.value.qualifiedQuantity,
|
unqualifiedQuantity: formData.value.unqualifiedQuantity,
|
remark: formData.value.remark || undefined,
|
});
|
message.success('报工成功');
|
modalApi.close();
|
emit('success');
|
} finally {
|
submitting.value = false;
|
}
|
}
|
</script>
|
|
<template>
|
<Modal title="快速报工" @ok="handleSubmit">
|
<a-form ref="formRef" :model="formData" layout="vertical">
|
<a-form-item label="任务" required>
|
<ProTaskSelect
|
v-if="!hasPredefinedTask"
|
v-model="selectedTaskId"
|
@change="handleTaskChange"
|
/>
|
<a-input v-else :value="props.taskCode" disabled />
|
</a-form-item>
|
<a-form-item label="待报工数量">
|
<a-input-number
|
:value="pendingQuantity"
|
disabled
|
class="!w-full"
|
/>
|
</a-form-item>
|
<a-form-item label="本次报工数量" required>
|
<a-input-number
|
v-model:value="formData.feedbackQuantity"
|
:min="0.01"
|
:max="pendingQuantity || undefined"
|
: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>
|
</Modal>
|
</template>
|