gaoluyang
2026-04-25 4e62fd388119141405e33ecc28cad2638617603f
src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue
@@ -2,47 +2,29 @@
  <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>
@@ -68,7 +50,7 @@
<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 },
@@ -84,24 +66,37 @@
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;
  }
@@ -118,19 +113,6 @@
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 = () => {
@@ -154,7 +136,7 @@
const openReturnSummaryDialog = async () => {
  if (!canOpenReturnSummary.value) {
    ElMessage.warning("退料数量=领用数量+补料数量-实际数量,且需大于0");
    ElMessage.warning("退料数量=领用数量-实际数量,且需大于0");
    return;
  }
  returnSummaryList.value = buildReturnSummary();