<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 {
|
loadParamDetails,
|
paramDetails,
|
} from '#/views/mes/pro/feedback/param-state';
|
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,
|
remark: '',
|
};
|
// 预设任务时加载其工艺参数;否则等待选择任务后再加载
|
if (props.taskId) {
|
loadParamDetails(props.taskId);
|
} else {
|
paramDetails.value = [];
|
}
|
}
|
},
|
});
|
|
const formRef = ref<FormInstance>();
|
const selectedTaskId = ref<number | undefined>(props.taskId);
|
const selectedTask = ref<MesProTaskApi.Task>();
|
const formData = ref({
|
feedbackQuantity: 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;
|
loadParamDetails(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,
|
paramValues: paramDetails.value.map((detail) => ({
|
detailId: detail.id,
|
value: detail.paramValue,
|
})),
|
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>
|
<div v-if="paramDetails.length" class="mb-4">
|
<div class="mb-1 font-medium">工艺参数</div>
|
<div
|
v-for="detail in paramDetails"
|
:key="detail.id"
|
class="mb-2 flex items-center gap-2"
|
>
|
<span class="w-40 flex-shrink-0 text-right text-sm text-gray-600">
|
<span v-if="detail.required" class="text-red-500">* </span>
|
{{ detail.paramName || detail.paramCode
|
}}{{
|
detail.unitMeasureName ? `(${detail.unitMeasureName})` : ''
|
}}
|
</span>
|
<a-input
|
v-model:value="detail.paramValue"
|
placeholder="请输入参数值"
|
class="!w-full"
|
/>
|
</div>
|
</div>
|
<a-form-item label="备注">
|
<a-textarea
|
v-model:value="formData.remark"
|
placeholder="请输入备注"
|
:rows="2"
|
/>
|
</a-form-item>
|
</a-form>
|
</Modal>
|
</template>
|