| | |
| | | <div> |
| | | <el-dialog v-model="dialogVisible" title="领料详情" width="1400px" @close="handleClose"> |
| | | <el-table v-loading="materialDetailLoading" :data="materialDetailTableData" border row-key="id"> |
| | | <el-table-column label="工序名称" prop="processName" min-width="180" /> |
| | | <el-table-column label="原料名称" prop="materialName" min-width="160" /> |
| | | <el-table-column label="原料型号" prop="materialModel" min-width="180" /> |
| | | <el-table-column label="需求数量" prop="requiredQty" min-width="110" /> |
| | | <el-table-column label="原纸需要量" prop="basePaperQty" min-width="120" /> |
| | | <el-table-column label="纸箱需要量" prop="cartonQty" min-width="120" /> |
| | | <el-table-column label="塑料袋数量" prop="plasticBagQty" min-width="120" /> |
| | | <el-table-column label="计量单位" prop="unit" width="100" /> |
| | | <el-table-column label="领用数量" prop="pickQty" min-width="110" /> |
| | | <el-table-column label="补料数量" min-width="120"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" link @click="handleViewSupplementRecord(row)"> |
| | | {{ row.supplementQty ?? 0 }} |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="原纸领用数量" prop="basePaperPickQty" min-width="120" /> |
| | | <el-table-column label="纸箱领用数量" prop="cartonPickQty" min-width="120" /> |
| | | <el-table-column label="塑料袋领用数量" prop="plasticBagPickQty" min-width="120" /> |
| | | <el-table-column label="退料数量" prop="returnQty" min-width="110" /> |
| | | <el-table-column label="实际数量" prop="actualQty" min-width="110" /> |
| | | </el-table> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button |
| | | type="warning" |
| | | :loading="materialReturnConfirming" |
| | | :disabled="!canOpenReturnSummary" |
| | | @click="openReturnSummaryDialog" |
| | | > |
| | | 退料确认 |
| | | </el-button> |
| | | <!-- <el-button--> |
| | | <!-- type="warning"--> |
| | | <!-- :loading="materialReturnConfirming"--> |
| | | <!-- :disabled="!canOpenReturnSummary"--> |
| | | <!-- @click="openReturnSummaryDialog"--> |
| | | <!-- >--> |
| | | <!-- 退料确认--> |
| | | <!-- </el-button>--> |
| | | <el-button @click="dialogVisible = false">取消</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <el-dialog v-model="supplementRecordDialogVisible" title="补料记录" width="800px"> |
| | | <el-table v-loading="supplementRecordLoading" :data="supplementRecordTableData" border row-key="id"> |
| | | <el-table-column label="补料数量" prop="supplementQty" min-width="120" /> |
| | | <el-table-column label="补料人" prop="supplementUserName" min-width="120" /> |
| | | <el-table-column label="补料日期" prop="supplementTime" min-width="160" /> |
| | | <el-table-column label="补料原因" prop="supplementReason" min-width="200" /> |
| | | </el-table> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="supplementRecordDialogVisible = false">关闭</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | <script setup> |
| | | import { computed, ref, watch } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import { listMaterialPickingDetail, listMaterialSupplementRecord, confirmMaterialReturn } from "@/api/productionManagement/productionOrder.js"; |
| | | import { listMaterialPickingDetail, confirmMaterialReturn } from "@/api/productionManagement/productionOrder.js"; |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { type: Boolean, default: false }, |
| | |
| | | const materialDetailLoading = ref(false); |
| | | const materialDetailTableData = ref([]); |
| | | const materialReturnConfirming = ref(false); |
| | | const supplementRecordDialogVisible = ref(false); |
| | | const supplementRecordLoading = ref(false); |
| | | const supplementRecordTableData = ref([]); |
| | | const returnSummaryDialogVisible = ref(false); |
| | | const returnSummaryList = ref([]); |
| | | const getPickQty = item => { |
| | | const directPick = Number(item.pickQty ?? NaN); |
| | | if (Number.isFinite(directPick)) return directPick; |
| | | return ( |
| | | Number(item.basePaperPickQty || 0) + |
| | | Number(item.cartonPickQty || 0) + |
| | | Number(item.plasticBagPickQty || 0) |
| | | ); |
| | | }; |
| | | const calcReturnQty = item => |
| | | Number(item.pickQty || 0) + Number(item.supplementQty || 0) - Number(item.actualQty || 0); |
| | | const canOpenReturnSummary = computed(() => |
| | | materialDetailTableData.value.some(item => calcReturnQty(item) > 0) |
| | | ); |
| | | getPickQty(item) - Number(item.actualQty || 0); |
| | | const normalizeList = (res) => { |
| | | if (Array.isArray(res?.data)) return res.data; |
| | | if (Array.isArray(res?.data?.records)) return res.data.records; |
| | | if (Array.isArray(res?.records)) return res.records; |
| | | return []; |
| | | }; |
| | | const canOpenReturnSummary = computed(() => { |
| | | const list = Array.isArray(materialDetailTableData.value) ? materialDetailTableData.value : []; |
| | | return list.some(item => calcReturnQty(item) > 0); |
| | | }); |
| | | |
| | | const loadDetailList = async () => { |
| | | if (!props.orderRow?.id) return; |
| | | materialDetailLoading.value = true; |
| | | materialDetailTableData.value = []; |
| | | try { |
| | | const res = await listMaterialPickingDetail({ orderId: props.orderRow.id }); |
| | | materialDetailTableData.value = res.data || []; |
| | | const res = await listMaterialPickingDetail({ productOrderId: props.orderRow.id }); |
| | | materialDetailTableData.value = normalizeList(res); |
| | | } finally { |
| | | materialDetailLoading.value = false; |
| | | } |
| | |
| | | |
| | | const handleClose = () => { |
| | | materialDetailTableData.value = []; |
| | | }; |
| | | |
| | | const handleViewSupplementRecord = async row => { |
| | | if (!row?.id) return; |
| | | supplementRecordDialogVisible.value = true; |
| | | supplementRecordLoading.value = true; |
| | | supplementRecordTableData.value = []; |
| | | try { |
| | | const res = await listMaterialSupplementRecord({ materialDetailId: row.id }); |
| | | supplementRecordTableData.value = res.data || []; |
| | | } finally { |
| | | supplementRecordLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | | const buildReturnSummary = () => { |
| | |
| | | |
| | | const openReturnSummaryDialog = async () => { |
| | | if (!canOpenReturnSummary.value) { |
| | | ElMessage.warning("退料数量=领用数量+补料数量-实际数量,且需大于0"); |
| | | ElMessage.warning("退料数量=领用数量-实际数量,且需大于0"); |
| | | return; |
| | | } |
| | | returnSummaryList.value = buildReturnSummary(); |