军泰伟业
1.军泰伟业-库存管理增加库位
2.军泰伟业-生产入库要审核,加个入库审核菜单,入库数量,库位,通过不通过
已添加2个文件
已修改9个文件
554 ■■■■■ 文件已修改
src/api/collaborativeApproval/approvalProcess.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/inventoryManagement/stockInRecord.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/approvalProcess/components/purchaseInboundDia.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/approvalProcess/index.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/dispatchLog/Record.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/inboundApproval/index.vue 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/Record.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/New.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Qualified.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/index.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/deliveryLedger/index.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/collaborativeApproval/approvalProcess.js
@@ -8,6 +8,7 @@
        params: query,
    })
}
export function getDept(query) {
    return request({
        url: '/approveProcess/getDept',
@@ -15,6 +16,7 @@
        params: query,
    })
}
export function approveProcessGetInfo(query) {
    return request({
        url: '/approveProcess/get',
@@ -22,6 +24,7 @@
        params: query,
    })
}
// æ–°å¢žå®¡æ‰¹æµç¨‹
export function approveProcessAdd(query) {
    return request({
@@ -30,6 +33,7 @@
        data: query,
    })
}
// ä¿®æ”¹å®¡æ‰¹æµç¨‹
export function approveProcessUpdate(query) {
    return request({
@@ -38,6 +42,7 @@
        data: query,
    })
}
// æäº¤å®¡æ‰¹
export function updateApproveNode(query) {
    return request({
@@ -46,6 +51,16 @@
        data: query,
    })
}
// é‡‡è´­å…¥åº“
export function purchaseApprove(query) {
    return request({
        url: '/approveNode/purchaseApprove',
        method: 'post',
        data: query,
    })
}
// åˆ é™¤å®¡æ‰¹æµç¨‹
export function approveProcessDelete(query) {
    return request({
@@ -54,10 +69,11 @@
        data: query,
    })
}
// æŸ¥è¯¢å®¡æ‰¹æµç¨‹
export function approveProcessDetails(query) {
    return request({
        url: '/approveNode/details/' + query,
        method: 'get',
    })
}
}
src/api/inventoryManagement/stockInRecord.js
@@ -18,10 +18,19 @@
    });
};
// å…¥åº“审核
export const productionApprove = (data) => {
    return request({
        url: "/stockInRecord/productionApprove",
        method: "post",
        data,
    });
};
export const batchDeleteStockInRecords = (ids) => {
    return request({
        url: "/stockInRecord",
        method: "delete",
        data: ids,
    });
};
};
src/views/collaborativeApproval/approvalProcess/components/purchaseInboundDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
  <div>
    <el-dialog
      v-model="dialogVisible"
      title="采购入库"
      width="900px"
      @close="closeDialog"
    >
      <el-skeleton :loading="loading" animated>
        <template #template>
          <el-skeleton-item variant="h3" style="width: 30%" />
          <el-skeleton-item variant="text" style="width: 100%" />
          <el-skeleton-item variant="text" style="width: 100%" />
        </template>
        <template #default>
          <el-empty
            v-if="!currentPurchase || !currentPurchase.purchaseContractNumber"
            description="未查询到采购单据"
          />
          <template v-else>
            <el-descriptions :column="2" border>
              <el-descriptions-item label="采购合同号">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item>
              <el-descriptions-item label="供应商">{{ currentPurchase.supplierName }}</el-descriptions-item>
              <el-descriptions-item label="项目名称">{{ currentPurchase.projectName }}</el-descriptions-item>
              <el-descriptions-item label="销售合同号">{{ currentPurchase.salesContractNo }}</el-descriptions-item>
              <el-descriptions-item label="签订日期">{{ currentPurchase.executionDate }}</el-descriptions-item>
              <el-descriptions-item label="录入日期">{{ currentPurchase.entryDate }}</el-descriptions-item>
            </el-descriptions>
            <div style="margin-top: 20px;">
              <h4>产品明细</h4>
              <el-table :data="currentPurchase.productData || []" border style="width: 100%">
                <el-table-column prop="productCategory" label="产品名称" />
                <el-table-column prop="specificationModel" label="图纸编号" />
                <el-table-column prop="unit" label="单位" />
                <el-table-column prop="quantity" label="数量" />
                <el-table-column label="库位" min-width="180">
                  <template #default="scope">
                    <el-input
                      v-model="scope.row.stockLocation"
                      placeholder="请填写库位"
                      clearable
                    />
                  </template>
                </el-table-column>
              </el-table>
            </div>
          </template>
        </template>
      </el-skeleton>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="handleInbound">确认入库</el-button>
          <el-button @click="closeDialog">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { getCurrentInstance, ref } from "vue";
import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
import { purchaseApprove } from "@/api/collaborativeApproval/approvalProcess.js";
const emit = defineEmits(["close"]);
const { proxy } = getCurrentInstance();
const dialogVisible = ref(false);
const loading = ref(false);
const currentPurchase = ref({});
const openDialog = (type, row) => {
  if (type !== "inbound") {
    return;
  }
  dialogVisible.value = true;
  loading.value = true;
  currentPurchase.value = {};
  const purchaseContractNumber = row?.approveReason;
  if (!purchaseContractNumber) {
    loading.value = false;
    proxy.$modal.msgError("未找到采购合同号");
    return;
  }
  getPurchaseByCode({ purchaseContractNumber })
    .then((res) => {
      currentPurchase.value = {
        ...res,
        productData: (res?.productData || []).map((item) => ({
          ...item,
          stockLocation: item.stockLocation || "",
        })),
      };
    })
    .catch((err) => {
      console.error("加载采购信息失败:", err);
      proxy.$modal.msgError("加载采购信息失败");
    })
    .finally(() => {
      loading.value = false;
    });
};
const closeDialog = () => {
  dialogVisible.value = false;
  loading.value = false;
  currentPurchase.value = {};
  emit("close");
};
const handleInbound = () => {
  const productData = currentPurchase.value?.productData || [];
  if (productData.length === 0) {
    proxy.$modal.msgError("未找到采购明细");
    return;
  }
  const emptyRow = productData.find((item) => !item.stockLocation || !String(item.stockLocation).trim());
  if (emptyRow) {
    proxy.$modal.msgError(`请先填写产品【${emptyRow.productCategory || emptyRow.specificationModel || "未知"}】的库位`);
    return;
  }
  const payload = productData.map((item) => ({
    ...item,
    stockLocation: String(item.stockLocation).trim(),
  }));
  purchaseApprove(payload)
    .then(() => {
      proxy.$modal.msgSuccess("入库成功");
      closeDialog();
    })
    .catch((err) => {
      console.error("入库失败:", err);
      proxy.$modal.msgError("入库失败");
    });
};
defineExpose({
  openDialog,
});
</script>
src/views/collaborativeApproval/approvalProcess/index.vue
@@ -6,7 +6,7 @@
      <el-tab-pane label="请假管理" name="2"></el-tab-pane>
      <el-tab-pane label="出差管理" name="3"></el-tab-pane>
      <el-tab-pane label="报销管理" name="4"></el-tab-pane>
      <el-tab-pane label="采购审批" name="5"></el-tab-pane>
      <el-tab-pane label="采购入库审批" name="5"></el-tab-pane>
      <el-tab-pane label="报价审批" name="6"></el-tab-pane>
      <el-tab-pane label="发货审批" name="7"></el-tab-pane>
    </el-tabs>
@@ -64,6 +64,7 @@
    </div>
    <info-form-dia ref="infoFormDia" @close="handleQuery" :approveType="currentApproveType"></info-form-dia>
    <approval-dia ref="approvalDia" @close="handleQuery" :approveType="currentApproveType"></approval-dia>
    <purchase-inbound-dia ref="purchaseInboundDia" @close="handleQuery" :approveType="currentApproveType"></purchase-inbound-dia>
    <FileList ref="fileListRef" />
  </div>
</template>
@@ -76,6 +77,7 @@
import { useRoute } from 'vue-router';
import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue";
import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue";
import PurchaseInboundDia from "@/views/collaborativeApproval/approvalProcess/components/purchaseInboundDia.vue";
import {approveProcessDelete, approveProcessListPage} from "@/api/collaborativeApproval/approvalProcess.js";
import useUserStore from "@/store/modules/user";
@@ -231,6 +233,14 @@
        },
        disabled: (row) => row.approveUserCurrentId == null || row.approveStatus == 2 || row.approveStatus == 3 || row.approveStatus == 4 || row.approveUserCurrentId !== userStore.id
      },
      ...(isPurchaseType ? [{
        name: "入库",
        type: "text",
        clickFun: (row) => {
          openPurchaseInboundDia(row);
        },
        disabled: (row) => row.approveStatus != 2
      }] : []),
      {
        name: "详情",
        type: "text",
@@ -260,6 +270,7 @@
});
const infoFormDia = ref()
const approvalDia = ref()
const purchaseInboundDia = ref()
const { proxy } = getCurrentInstance()
// æŸ¥è¯¢åˆ—表
@@ -333,6 +344,12 @@
  })
};
const openPurchaseInboundDia = (row) => {
  nextTick(() => {
    purchaseInboundDia.value?.openDialog('inbound', row)
  })
};
// åˆ é™¤
const handleDelete = () => {
  let ids = [];
src/views/inventoryManagement/dispatchLog/Record.vue
@@ -85,6 +85,11 @@
                    prop="stockOutNum"
                    show-overflow-tooltip
                />
                <el-table-column
                    label="库位"
                    prop="stockLocation"
                    show-overflow-tooltip
                />
                <el-table-column label="质检状态"
                         prop="type"
                         show-overflow-tooltip
src/views/inventoryManagement/inboundApproval/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,256 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title ml10">产品名称:</span>
        <el-input
          v-model="searchForm.productName"
          style="width: 240px"
          placeholder="请输入产品名称"
          clearable
          @change="handleQuery"
        />
        <span class="search_title ml10">图纸编号:</span>
        <el-input
          v-model="searchForm.model"
          style="width: 240px"
          placeholder="请输入图纸编号"
          clearable
          @change="handleQuery"
        />
        <el-button type="primary" style="margin-left: 10px" @click="handleQuery">搜索</el-button>
        <el-button @click="handleReset">重置</el-button>
      </div>
    </div>
    <div class="table_list">
      <el-table :data="tableData" border v-loading="tableLoading" style="width: 100%" height="calc(100vh - 18.5em)">
        <el-table-column align="center" type="index" label="序号" width="60" />
        <el-table-column prop="productName" label="产品名称" min-width="160" show-overflow-tooltip />
        <el-table-column prop="model" label="图纸编号" min-width="160" show-overflow-tooltip />
        <el-table-column prop="waitAuditNum" label="待审核数量" min-width="120" align="center" />
        <el-table-column prop="stockLocation" label="库位" min-width="180" show-overflow-tooltip />
        <el-table-column prop="status" label="审核状态" min-width="120" align="center">
          <template #default="scope">
            <el-tag v-if="scope.row.status === 1 || scope.row.status === '1'" type="warning">待审核</el-tag>
            <el-tag v-else-if="scope.row.status === 2 || scope.row.status === '2'" type="success">已入库</el-tag>
            <el-tag v-else type="info">{{ scope.row.status }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column label="操作" min-width="120" align="center" fixed="right">
          <template #default="scope">
            <el-button
              link
              type="primary"
              size="small"
              :disabled="!(scope.row.status === 1 || scope.row.status === '1')"
              @click="openAuditDialog(scope.row)"
            >
              å®¡æ ¸
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <el-dialog v-model="auditDialogVisible" title="入库审核" width="620px" @close="closeAuditDialog">
      <el-form :model="auditForm" label-width="120px" label-position="top" ref="auditFormRef">
        <el-form-item
          label="审核结果"
          prop="result"
          :rules="[{ required: true, message: '请选择审核结果', trigger: 'change' }]"
        >
          <el-radio-group v-model="auditForm.result">
            <el-radio value="approved">通过</el-radio>
            <el-radio value="rejected">不通过</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item
          v-if="auditForm.result === 'rejected'"
          label="实际入库数量"
          prop="actualStockInNum"
          :rules="[{ required: true, message: '请输入实际入库数量', trigger: 'blur' }]"
        >
          <el-input-number
            v-model="auditForm.actualStockInNum"
            :min="0"
            :precision="0"
            controls-position="right"
            style="width: 100%;"
          />
        </el-form-item>
        <el-form-item
          v-if="auditForm.result === 'approved' || auditForm.result === 'rejected'"
          label="库位"
          prop="stockLocation"
          :rules="[{ required: true, message: '请输入库位', trigger: 'blur' }]"
        >
          <el-input v-model="auditForm.stockLocation" placeholder="请输入库位" clearable />
        </el-form-item>
        <el-form-item
          v-if="auditForm.result === 'rejected'"
          label="不通过原因"
          prop="reason"
          :rules="[{ required: true, message: '请输入不通过原因', trigger: 'blur' }]"
        >
          <el-input
            v-model="auditForm.reason"
            type="textarea"
            :rows="3"
            placeholder="请输入不通过原因"
            clearable
          />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitAudit">确认</el-button>
          <el-button @click="closeAuditDialog">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue";
import { getStockInRecordListPage, productionApprove } from "@/api/inventoryManagement/stockInRecord.js";
const { proxy } = getCurrentInstance();
const tableLoading = ref(false);
const tableData = ref([]);
const data = reactive({
  searchForm: {
    productName: "",
    model: "",
  },
});
const { searchForm } = toRefs(data);
const auditDialogVisible = ref(false);
const auditRow = ref(null);
const auditFormRef = ref(null);
const auditForm = reactive({
  result: "",
  stockLocation: "",
  actualStockInNum: null,
  reason: "",
});
const handleQuery = () => {
  tableLoading.value = true;
  const params = {
    current: 1,
    size: 10,
    productType: 1,
    status: 1,
    productName: searchForm.value.productName,
    model: searchForm.value.model,
  };
  getStockInRecordListPage(params)
    .then((res) => {
      tableData.value = res?.data?.records || res?.data || [];
    })
    .catch((err) => {
      console.error("加载入库审核列表失败:", err);
      tableData.value = [];
      proxy.$modal.msgError("加载入库审核列表失败");
    })
    .finally(() => {
      tableLoading.value = false;
    });
};
const handleReset = () => {
  searchForm.value.productName = "";
  searchForm.value.model = "";
  handleQuery();
};
const openAuditDialog = (row) => {
  auditRow.value = row;
  auditForm.result = "";
  auditForm.stockLocation = row.stockLocation || "";
  auditForm.actualStockInNum = row.waitAuditNum ?? null;
  auditForm.reason = "";
  auditDialogVisible.value = true;
  nextTick(() => {
    auditFormRef.value?.clearValidate?.();
  });
};
const closeAuditDialog = () => {
  auditDialogVisible.value = false;
  auditRow.value = null;
  auditForm.result = "";
  auditForm.stockLocation = "";
  auditForm.actualStockInNum = null;
  auditForm.reason = "";
};
const submitAudit = () => {
  auditFormRef.value?.validate((valid) => {
    if (!valid || !auditRow.value) {
      return;
    }
    if (auditForm.result === "rejected") {
      if (auditForm.actualStockInNum === null || auditForm.actualStockInNum === "" || Number(auditForm.actualStockInNum) < 0) {
        proxy.$modal.msgError("请输入实际入库数量");
        return;
      }
      if (Number(auditForm.actualStockInNum) > Number(auditRow.value.waitAuditNum ?? 0)) {
        proxy.$modal.msgError("实际入库数量不能大于待审核数量");
        return;
      }
      if (!auditForm.reason || !String(auditForm.reason).trim()) {
        proxy.$modal.msgError("请输入不通过原因");
        return;
      }
    }
    if (!auditForm.stockLocation || !String(auditForm.stockLocation).trim()) {
      proxy.$modal.msgError("请输入库位");
      return;
    }
    const payload = {
      id: auditRow.value.id,
      status: auditForm.result === "approved" ? 2 : 1,
      actualStockInNum: auditForm.result === "approved"
        ? Number(auditRow.value.waitAuditNum)
        : Number(auditForm.actualStockInNum),
      stockLocation: String(auditForm.stockLocation || "").trim(),
      reason: auditForm.result === "rejected" ? String(auditForm.reason).trim() : "",
      recordId: auditForm.result === "rejected" ? (auditRow.value.recordId ?? auditRow.value.id) : undefined,
    };
    productionApprove(payload)
      .then(() => {
        auditRow.value.status = payload.status;
        auditRow.value.stockLocation = payload.stockLocation;
        if (auditForm.result === "rejected") {
          auditRow.value.waitAuditNum = payload.actualStockInNum;
          auditRow.value.reason = payload.reason;
        }
        proxy.$modal.msgSuccess("审核提交成功");
        closeAuditDialog();
        handleQuery();
      })
      .catch(() => {
        proxy.$modal.msgError("审核提交失败");
      });
  });
};
onMounted(() => {
  handleQuery();
});
</script>
src/views/inventoryManagement/receiptManagement/Record.vue
@@ -93,7 +93,7 @@
          </template>
        </el-table-column>
        <el-table-column label="库位"
                         prop="locationName"
                         prop="stockLocation"
                         show-overflow-tooltip/>
        <el-table-column label="入库人"
                         prop="createBy"
@@ -195,6 +195,9 @@
const getList = () => {
  tableLoading.value = true;
  const params = {...page, productType: props.type};
  if (props.type === 1) {
    params.status = 2;
  }
  params.timeStr = searchForm.value.timeStr;
  params.productName = searchForm.value.productName;
  params.recordType = searchForm.value.recordType;
src/views/inventoryManagement/stockManagement/New.vue
@@ -45,6 +45,20 @@
        </el-form-item>
        <el-form-item
            label="库位"
            prop="stockLocation"
            :rules="[
                {
                required: true,
                message: '请输入库位',
                trigger: 'blur',
              }
            ]"
        >
          <el-input v-model="formState.stockLocation" placeholder="请输入库位" />
        </el-form-item>
        <el-form-item
            v-if="type === 'qualified'"
            label="库存预警数量"
            prop="warnNum"
@@ -102,6 +116,7 @@
  productModelName: "",
  unit: "",
  qualitity: 0,
  stockLocation: "",
  warnNum: 0,
  remark: '',
});
@@ -126,7 +141,11 @@
    productModelId: undefined,
    productName: "",
    productModelName: "",
    description: '',
    unit: "",
    qualitity: 0,
    stockLocation: "",
    warnNum: 0,
    remark: '',
  };
  isShow.value = false;
};
src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -35,6 +35,7 @@
        <el-table-column label="图纸编号" prop="model" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
        <el-table-column label="库位" prop="stockLocation" show-overflow-tooltip />
        <el-table-column label="质检状态"
                         show-overflow-tooltip
                         width="100">
src/views/productionManagement/productionOrder/index.vue
@@ -116,6 +116,15 @@
            />
          </template>
        </el-table-column>
        <el-table-column label="库位" min-width="180" align="center" prop="stockLocation">
          <template #default="{ row }">
            <el-input
              v-model="row.stockLocation"
              placeholder="请输入库位"
              clearable
            />
          </template>
        </el-table-column>
      </el-table>
      <div class="picking-footer-info">
        <span>已选 {{ inputSelectedRows.length }} æ¡</span>
@@ -132,7 +141,7 @@
    <!-- é¢†æ–™å¼¹æ¡† -->
    <el-dialog v-model="pickingDialogVisible"
               title="工单领料"
               width="1200px"
               width="70%"
               :close-on-click-modal="false">
      <el-table
@@ -162,6 +171,15 @@
              size="small" 
              style="width: 160px"
              @change="(val) => handlePickingQuantityChange(val, row)"
            />
          </template>
        </el-table-column>
        <el-table-column label="库位" min-width="180" align="center" prop="stockLocation">
          <template #default="{ row }">
            <el-input
              v-model="row.stockLocation"
              placeholder="请输入库位"
              clearable
            />
          </template>
        </el-table-column>
@@ -737,6 +755,7 @@
        inputTableData.value = res.data.records.map(item => ({
          ...item,
          currentReturnQuantity: 0,
          stockLocation: item.stockLocation || "",
        }));
        inputPage.total = res.data.total;
      })
@@ -759,6 +778,7 @@
      pickingTableData.value = materials.map(item => ({
        ...item,
        quantity: 0,
        stockLocation: item.stockLocation || "",
        unpickedQuantity: (item.demandedQuantity || 0) - (item.completedQuantity || 0),
      }));
    } catch (e) {
@@ -796,6 +816,10 @@
        proxy.$modal.msgWarning(`${row.productName} çš„领料数量必须大于0`);
        return;
      }
      if (!row.stockLocation || !String(row.stockLocation).trim()) {
        proxy.$modal.msgWarning(`${row.productName} çš„库位不能为空`);
        return;
      }
    }
    
    // æäº¤é¢†æ–™æ•°æ®
@@ -805,6 +829,7 @@
        productStructureRecordId: row.id,
        productModelId: row.productModelId,
        quantity: row.quantity,
        stockLocation: String(row.stockLocation).trim(),
      }));
      await pickMaterial(pickData);
      proxy.$modal.msgSuccess("领料成功");
@@ -851,10 +876,18 @@
      proxy.$modal.msgWarning("请填写本次退料数量");
      return;
    }
    const invalidLocationRows = inputSelectedRows.value.filter(
      row => !row.stockLocation || !String(row.stockLocation).trim()
    );
    if (invalidLocationRows.length > 0) {
      proxy.$modal.msgWarning("请填写库位");
      return;
    }
    const returnData = inputSelectedRows.value.map(row => ({
      ...row,
      returnQuantity: row.currentReturnQuantity,
      stockLocation: String(row.stockLocation).trim(),
    }));
    try {
src/views/salesManagement/deliveryLedger/index.vue
@@ -29,6 +29,8 @@
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="销售订单" prop="salesContractNo" show-overflow-tooltip />
        <el-table-column label="发货订单号" prop="shippingNo" show-overflow-tooltip />
        <el-table-column label="产品名称" prop="productCategory" show-overflow-tooltip />
        <el-table-column label="图纸编号" prop="specificationModel" show-overflow-tooltip />
        <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip />
        <el-table-column label="发货进度" align="center" width="150">
          <template #default="scope">
@@ -105,6 +107,14 @@
                <div class="info-item">
                  <span class="label">发货订单号</span>
                  <span class="value">{{ currentShippingOrder.shippingNo || '--' }}</span>
                </div>
                <div class="info-item">
                  <span class="label">产品名称</span>
                  <span class="value">{{ currentShippingOrder.productCategory || '--' }}</span>
                </div>
                <div class="info-item">
                  <span class="label">图纸编号</span>
                  <span class="value">{{ currentShippingOrder.specificationModel || '--' }}</span>
                </div>
                <el-divider />
                <div class="quantity-summary">
@@ -203,6 +213,10 @@
                          />
                        </div>
                      </div>
                                            <div class="info-row">
                                                <span class="info-label">库位</span>
                                                <span class="info-value">{{ record.stockLocation || '--' }}</span>
                                            </div>
                      <div class="record-actions" v-if="canRevokeShipping(record)">
                        <el-button 
                          type="danger" 
@@ -260,11 +274,18 @@
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="库位" prop="stockLocation">
                            <el-input v-model="shippingForm.stockLocation" placeholder="请输入库位" clearable/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="发货日期" prop="shippingDate">
              <el-date-picker
                v-model="shippingForm.shippingDate"
                value-format="YYYY-MM-DD HH:mm:ss"
                type="datetime"
              <el-date-picker
                v-model="shippingForm.shippingDate"
                value-format="YYYY-MM-DD HH:mm:ss"
                type="datetime"
                placeholder="请选择"
                style="width: 100%"
              />
@@ -373,9 +394,11 @@
  shippingCarNumber: "",
  expressCompany: "",
  expressNumber: "",
    stockLocation: "",
});
const shippingRules = {
  shippingNum: [{ required: true, message: "请输入发货数量", trigger: "blur" }],
    stockLocation: [{ required: true, message: "请输入库位", trigger: "blur" }],
  type: [{ required: true, message: "请选择发货类型", trigger: "change" }],
  shippingDate: [{ required: true, message: "请选择发货日期", trigger: "change" }],
  shippingCarNumber: [
@@ -474,6 +497,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "",
        stockLocation: "",
  };
  shippingFileList.value = [];
  
@@ -509,6 +533,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "",
        stockLocation: "",
  };
  shippingFileList.value = [];
};
@@ -523,6 +548,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "",
        stockLocation: "",
  };
  shippingFileList.value = [];
};
@@ -581,6 +607,7 @@
        shippingNum: shippingForm.value.shippingNum,
        type: shippingForm.value.type,
        shippingDate: shippingForm.value.shippingDate,
                stockLocation: shippingForm.value.stockLocation,
        shippingCarNumber: shippingForm.value.type === "货车" ? shippingForm.value.shippingCarNumber : "",
        expressCompany: shippingForm.value.type === "快递" ? shippingForm.value.expressCompany : "",
        expressNumber: shippingForm.value.type === "快递" ? shippingForm.value.expressNumber : "",