已修改10个文件
549 ■■■■■ 文件已修改
src/components/PIMTable/PIMTable.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/customerFileOpenSea/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/materialIndex.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/dispatchLog/Record.vue 173 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/Record.vue 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/New.vue 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Record.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockProfitLoss/index.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PIMTable/PIMTable.vue
@@ -14,6 +14,10 @@
            :expand-row-keys="expandRowKeys"
            :show-summary="isShowSummary"
            :summary-method="summaryMethod"
            :default-expand-all="defaultExpandAll"
            :tree-props="treeProps"
            :lazy="lazy"
            :load="load"
            @row-click="rowClick"
            @current-change="currentChange"
            @selection-change="handleSelectionChange"
@@ -316,6 +320,22 @@
      type: [String, Object],
      default: () => ({ width: "100%" }),
    },
    defaultExpandAll: {
      type: Boolean,
      default: false,
    },
    treeProps: {
      type: Object,
      default: () => ({ children: "children", hasChildren: "hasChildren" }),
    },
    lazy: {
      type: Boolean,
      default: false,
    },
    load: {
      type: Function,
      default: null,
    },
  });
  const mergedHeaderCellStyle = computed(() => ({
@@ -326,6 +346,7 @@
  }));
  // Data
  const multipleTable = ref(null);
  const uploadRefs = ref([]);
  const currentFiles = ref({});
  const uploadKeys = ref({});
@@ -499,6 +520,44 @@
  const handleSelectionChange = newSelection => {
    emit("selection-change", newSelection);
  };
  // 展开/折叠树形节点
  const toggleRowExpansion = (row, expanded) => {
    multipleTable.value?.toggleRowExpansion(row, expanded);
  };
  // 展开所有树形节点
  const expandAll = () => {
    const expandRows = (rows) => {
      rows?.forEach(row => {
        if (row[props.treeProps.children]?.length > 0) {
          multipleTable.value?.toggleRowExpansion(row, true);
          expandRows(row[props.treeProps.children]);
        }
      });
    };
    expandRows(props.tableData);
  };
  // 折叠所有树形节点
  const collapseAll = () => {
    const collapseRows = (rows) => {
      rows?.forEach(row => {
        if (row[props.treeProps.children]?.length > 0) {
          collapseRows(row[props.treeProps.children]);
          multipleTable.value?.toggleRowExpansion(row, false);
        }
      });
    };
    collapseRows(props.tableData);
  };
  defineExpose({
    toggleRowExpansion,
    expandAll,
    collapseAll,
    multipleTable
  });
</script>
<style scoped lang="scss">
src/views/basicData/customerFileOpenSea/index.vue
@@ -884,7 +884,7 @@
    },
    {
      label: "领用状态",
      prop: "usageStatus",
      prop: "isAssigned",
      dataType: "tag",
      width: 100,
            fixed: "right",
@@ -917,7 +917,7 @@
        {
          name: "分配",
          type: "text",
          showHide: row => row.usageStatus != 1,
          showHide: row => row.isAssigned != 1,
          clickFun: row => {
            openAssignDialog(row);
          },
@@ -925,7 +925,7 @@
        {
          name: "回收",
          type: "text",
          showHide: row => row.usageStatus == 1,
          showHide: row => row.isAssigned == 1,
          clickFun: row => {
            recycle(row);
          },
@@ -933,7 +933,7 @@
                {
                    name: "共享",
                    type: "text",
                    showHide: row => row.usageStatus == 1,
                    showHide: row => row.isAssigned == 1,
                    clickFun: row => {
                        openShareDialog(row);
                    },
src/views/basicData/product/materialIndex.vue
@@ -440,7 +440,7 @@
          form.value.parentId = "";
        } else {
          form.value.id = currentId.value;
          form.value.parentId = "";
          form.value.parentId = currentParentId.value;
        }
        addOrEditProduct(form.value).then(res => {
          proxy.$modal.msgSuccess("提交成功");
src/views/inventoryManagement/dispatchLog/Record.vue
@@ -68,6 +68,7 @@
          show-overflow-tooltip
        />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="库位" prop="warehouseName" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column
@@ -148,23 +149,50 @@
                      prop="unit">
          <el-input v-model="formState.unit" disabled />
        </el-form-item>
        <el-form-item label="库存类型"
                      prop="type"
        <el-form-item label="仓库"
                      prop="warehouseInfoId"
                      :rules="[
                        {
                          required: true,
                          message: '请选择库存类型',
                          message: '请选择仓库',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.type"
                     placeholder="请选择库存类型"
                     :disabled="isEdit">
            <el-option label="合格库存"
                       value="qualified" />
            <el-option label="不合格库存"
                       value="unqualified" />
          <el-select v-model="formState.warehouseInfoId"
                     placeholder="请选择仓库"
                     clearable
                     @change="handleWarehouseChange"
                     style="width: 100%">
            <el-option v-for="warehouse in warehouseList"
                       :key="warehouse.id"
                       :label="warehouse.warehouseName"
                       :value="warehouse.id" />
          </el-select>
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo"
                      :rules="[
                        {
                          required: true,
                          message: '请选择批号',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.batchNo"
                     placeholder="请选择批号"
                     clearable
                     @change="handleBatchNoChange"
                     style="width: 100%">
            <el-option v-for="batch in batchNoList"
                       :key="batch"
                       :label="batch + ' (库存: ' + (batchNoStockMap[batch] || 0) + ')'"
                       :value="batch" />
          </el-select>
        </el-form-item>
        <el-form-item v-if="formState.batchNo && batchNoStockMap[formState.batchNo]"
                      label="当前批号库存"
                      prop="currentStock">
          <el-input v-model="batchNoStockMap[formState.batchNo]" disabled />
        </el-form-item>
        <el-form-item label="出库数量"
                      prop="qualitity"
@@ -191,32 +219,6 @@
                           :max="formState.maxStock > 0 ? formState.maxStock : undefined"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo"
                      :rules="[
                        {
                          required: true,
                          message: '请选择批号',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.batchNo"
                     placeholder="请选择批号"
                     clearable
                     :disabled="isEdit"
                     @change="handleBatchNoChange"
                     style="width: 100%">
            <el-option v-for="batch in batchNoList"
                       :key="batch"
                       :label="batch + ' (库存: ' + (batchNoStockMap[batch] || 0) + ')'"
                       :value="batch" />
          </el-select>
        </el-form-item>
        <el-form-item v-if="formState.batchNo && batchNoStockMap[formState.batchNo]"
                      label="当前批号库存"
                      prop="currentStock">
          <el-input v-model="batchNoStockMap[formState.batchNo]" disabled />
        </el-form-item>
        <el-form-item v-if="isEdit"
                      label="来源"
                      prop="recordType">
@@ -227,6 +229,24 @@
                       :key="item.value"
                       :label="item.label"
                       :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="库存类型"
                      prop="type"
                      :rules="[
                        {
                          required: true,
                          message: '请选择库存类型',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.type"
                     placeholder="请选择库存类型"
                     >
            <el-option label="合格库存"
                       value="qualified" />
            <el-option label="不合格库存"
                       value="unqualified" />
          </el-select>
        </el-form-item>
        <el-form-item label="备注"
@@ -270,6 +290,8 @@
} from "@/api/basicData/enum.js";
import { addStockOutRecordOnly } from "@/api/inventoryManagement/stockInventory.js";
import { addUnqualifiedStockOutRecordOnly } from "@/api/inventoryManagement/stockUninventory.js";
import { getWarehouseList } from "@/api/inventoryManagement/warehouse.js";
import { productModelListByUrl } from "@/api/basicData/productModel.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
@@ -282,6 +304,10 @@
const batchNoList = ref([]);
// 批号库存映射
const batchNoStockMap = ref({});
// 仓库列表
const warehouseList = ref([]);
// 原始batchNoMaps数据
const rawBatchNoMaps = ref({});
const page = reactive({
  current: 1,
  size: 100,
@@ -330,6 +356,7 @@
  productName: "",
  productModelName: "",
  unit: "",
  warehouseInfoId: null, // 仓库ID
  type: undefined,
  qualitity: 0,
  batchNo: null,
@@ -449,9 +476,10 @@
    type: props.type === '0' ? 'qualified' : 'unqualified',
    qualitity: row.stockOutNum,
    batchNo: row.batchNo,
    warehouseInfoId: row.warehouseInfoId,
    recordType: row.recordType,
    remark: row.remark || "",
    maxStock: row.stockOutNum || 0, // 编辑时使用当前出库数量作为最大库存(因为是修改已有记录)
    maxStock: row.stockOutNum || 0,
  };
  // 编辑时从batchNoMaps获取批号列表
  if (row.batchNoMaps && Object.keys(row.batchNoMaps).length > 0) {
@@ -476,6 +504,7 @@
    productName: "",
    productModelName: "",
    unit: "",
    warehouseInfoId: null,
    type: undefined,
    qualitity: 0,
    batchNo: null,
@@ -483,14 +512,29 @@
    remark: "",
    maxStock: 0,
  };
  warehouseList.value = [];
  batchNoList.value = [];
  batchNoStockMap.value = {};
  rawBatchNoMaps.value = {};
};
// 关闭对话框
const closeDialog = () => {
  dialogVisible.value = false;
  resetForm();
};
// 加载仓库列表
const loadWarehouseList = async () => {
  try {
    const res = await getWarehouseList();
    if (res.code === 200) {
      return res.data || [];
    }
  } catch (error) {
    console.error('加载仓库列表失败', error);
  }
  return [];
};
// 产品选择处理
@@ -502,23 +546,60 @@
    formState.value.productModelName = product.model;
    formState.value.productModelId = product.id;
    formState.value.unit = product.unit;
    // 从batchNoMaps获取批号列表和库存
    if (product.batchNoMaps && Object.keys(product.batchNoMaps).length > 0) {
      batchNoList.value = Object.keys(product.batchNoMaps);
      batchNoStockMap.value = product.batchNoMaps;
    } else {
      batchNoList.value = [];
      batchNoStockMap.value = {};
    }
    // 清空已选择的批号和最大库存
    // 解析batchNoMaps数据,格式为:{ 仓库ID: [{批号: 库存}, {批号: 库存}] }
    warehouseList.value = [];
    batchNoList.value = [];
    batchNoStockMap.value = {};
    rawBatchNoMaps.value = {};
    formState.value.warehouseInfoId = null;
    formState.value.batchNo = null;
    formState.value.maxStock = 0;
    if (product.batchNoMaps && Object.keys(product.batchNoMaps).length > 0) {
      rawBatchNoMaps.value = product.batchNoMaps;
      // 获取所有仓库信息用于反显名称
      const allWarehouses = await loadWarehouseList();
      const warehouseMap = {};
      allWarehouses.forEach(w => {
        warehouseMap[w.id] = w.warehouseName || w.name || w.warehouseCode || `仓库${w.id}`;
      });
      // 构建仓库列表
      warehouseList.value = Object.keys(product.batchNoMaps).map(warehouseInfoId => ({
        id: warehouseInfoId,
        warehouseName: warehouseMap[warehouseInfoId] || `仓库${warehouseInfoId}`
      }));
    }
    showProductSelect.value = false;
    // 触发表单验证更新
    proxy.$refs["formRef"]?.validateField("productModelId");
  }
};
// 仓库选择变化处理
const handleWarehouseChange = (warehouseInfoId) => {
  batchNoList.value = [];
  batchNoStockMap.value = {};
  formState.value.batchNo = null;
  formState.value.maxStock = 0;
  if (warehouseInfoId && rawBatchNoMaps.value[warehouseInfoId]) {
    // 解析该仓库下的批号数据,格式为:[{批号: 库存}, {批号: 库存}]
    const batchArray = rawBatchNoMaps.value[warehouseInfoId];
    const batchMap = {};
    const batches = [];
    batchArray.forEach(item => {
      const batchNo = Object.keys(item)[0];
      const stock = item[batchNo];
      batches.push(batchNo);
      batchMap[batchNo] = stock;
    });
    batchNoList.value = batches;
    batchNoStockMap.value = batchMap;
  }
};
// 批号选择变化处理
const handleBatchNoChange = (batchNo) => {
  if (batchNo && batchNoStockMap.value[batchNo]) {
src/views/inventoryManagement/receiptManagement/Record.vue
@@ -70,6 +70,9 @@
        <el-table-column label="规格型号"
                         prop="model"
                         show-overflow-tooltip/>
        <el-table-column label="库位"
                         prop="warehouseName"
                         show-overflow-tooltip/>
        <el-table-column label="批号"
                         prop="batchNo"
                         show-overflow-tooltip/>
@@ -149,39 +152,8 @@
                      prop="unit">
          <el-input v-model="formState.unit" disabled />
        </el-form-item>
        <el-form-item label="库存类型"
                      prop="type"
                      :rules="[
                        {
                          required: true,
                          message: '请选择库存类型',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.type"
                     placeholder="请选择库存类型"
                     :disabled="isEdit">
            <el-option label="合格库存"
                       value="qualified" />
            <el-option label="不合格库存"
                       value="unqualified" />
          </el-select>
        </el-form-item>
        <el-form-item label="库存数量"
                      prop="qualitity">
          <el-input-number v-model="formState.qualitity"
                           :step="1"
                           :min="1"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo">
          <el-input v-model="formState.batchNo"
                    placeholder="请输入批号"
                    :disabled="isEdit" />
        </el-form-item>
        <el-form-item label="库位"
                      prop="warehouseId"
                      prop="warehouseInfoId"
                      :rules="[
                        {
                          required: true,
@@ -189,7 +161,7 @@
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.warehouseId"
          <el-select v-model="formState.warehouseInfoId"
                     placeholder="请选择库位"
                     clearable
                     style="width: 100%">
@@ -198,6 +170,19 @@
                       :label="warehouse.warehouseName + ' - ' + warehouse.location"
                       :value="warehouse.id" />
          </el-select>
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo">
          <el-input v-model="formState.batchNo"
                    placeholder="请输入批号"
                    :disabled="isEdit" />
        </el-form-item>
        <el-form-item label="库存数量"
                      prop="qualitity">
          <el-input-number v-model="formState.qualitity"
                           :step="1"
                           :min="1"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item v-if="isEdit"
                      label="来源"
@@ -219,6 +204,24 @@
                           :min="0"
                           :max="formState.qualitity"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item label="库存类型"
                      prop="type"
                      :rules="[
                        {
                          required: true,
                          message: '请选择库存类型',
                          trigger: 'change',
                        }
                      ]">
          <el-select v-model="formState.type"
                     placeholder="请选择库存类型"
                     :disabled="isEdit">
            <el-option label="合格库存"
                       value="qualified" />
            <el-option label="不合格库存"
                       value="unqualified" />
          </el-select>
        </el-form-item>
        <el-form-item label="备注"
                      prop="remark">
@@ -322,7 +325,7 @@
  type: undefined,
  qualitity: 0,
  batchNo: null,
  warehouseId: undefined,
  warehouseInfoId: undefined,
  warnNum: 0,
  recordType: "",
  remark: "",
@@ -451,7 +454,7 @@
    type: props.type === '0' ? 'qualified' : 'unqualified',
    qualitity: row.stockInNum,
    batchNo: row.batchNo,
    warehouseId: row.warehouseId,
    warehouseInfoId: row.warehouseInfoId,
    warnNum: row.warnNum || 0,
    recordType: row.recordType,
    remark: row.remark || "",
@@ -471,7 +474,7 @@
    type: undefined,
    qualitity: 0,
    batchNo: null,
    warehouseId: undefined,
    warehouseInfoId: undefined,
    warnNum: 0,
    recordType: "",
    remark: "",
@@ -560,7 +563,7 @@
    model: formState.value.productModelName,
    unit: formState.value.unit,
    batchNo: formState.value.batchNo,
    warehouseId: formState.value.warehouseId,
    warehouseInfoId: formState.value.warehouseInfoId,
    stockInNum: formState.value.qualitity,
    recordType: formState.value.recordType,
    remark: formState.value.remark,
src/views/inventoryManagement/stockManagement/New.vue
@@ -32,6 +32,37 @@
          <el-input v-model="formState.unit"
                    disabled />
        </el-form-item>
        <el-form-item label="库位"
                      prop="warehouseInfoId"
                      :rules="[
                {
                required: true,
                message: '请选择库位',
                trigger: 'change',
              }
            ]">
          <el-select v-model="formState.warehouseInfoId"
                     placeholder="请选择库位"
                     clearable
                     style="width: 100%">
            <el-option v-for="warehouse in warehouseList"
                       :key="warehouse.id"
                       :label="warehouse.warehouseName + ' - ' + warehouse.location"
                       :value="warehouse.id" />
          </el-select>
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo">
          <el-input v-model="formState.batchNo"
                    placeholder="请输入批号" />
        </el-form-item>
        <el-form-item label="库存数量"
                      prop="qualitity">
          <el-input-number v-model="formState.qualitity"
                           :step="1"
                           :min="1"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item label="库存类型"
                      prop="type"
                      :rules="[
@@ -48,18 +79,6 @@
            <el-option label="不合格库存"
                       value="unqualified" />
          </el-select>
        </el-form-item>
        <el-form-item label="库存数量"
                      prop="qualitity">
          <el-input-number v-model="formState.qualitity"
                           :step="1"
                           :min="1"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item label="批号"
                      prop="batchNo">
          <el-input v-model="formState.batchNo"
                    placeholder="请输入批号" />
        </el-form-item>
        <el-form-item v-if="formState.type === 'qualified'"
                      label="库存预警数量"
@@ -93,10 +112,11 @@
</template>
<script setup>
  import { ref, computed, watch, getCurrentInstance } from "vue";
  import { ref, computed, watch, getCurrentInstance, onMounted } from "vue";
  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
  import { addStockInRecordOnly } from "@/api/inventoryManagement/stockInventory.js";
  import { createStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js";
  import { getWarehouseList } from "@/api/inventoryManagement/warehouse.js";
  const props = defineProps({
    visible: {
@@ -119,12 +139,16 @@
    productName: "",
    productModelName: "",
    unit: "",
    warehouseInfoId: undefined,
    type: undefined,
    qualitity: 0,
    batchNo: null,
    warnNum: 0,
    remark: "",
  });
  // 仓库列表
  const warehouseList = ref([]);
  const isShow = computed({
    get() {
@@ -136,6 +160,15 @@
  });
  const showProductSelectDialog = ref(false);
  // 获取仓库列表
  const fetchWarehouseList = () => {
    getWarehouseList({ status: true }).then(res => {
      warehouseList.value = res.data || [];
    }).catch(() => {
      proxy.$modal.msgError("获取仓库列表失败");
    });
  };
  // 批号为空时转为 null
  watch(
@@ -157,6 +190,7 @@
      productName: "",
      productModelName: "",
      unit: "",
      warehouseInfoId: undefined,
      type: undefined,
      qualitity: 0,
      batchNo: null,
@@ -215,6 +249,11 @@
    });
  };
  // 组件挂载时加载仓库列表
  onMounted(() => {
    fetchWarehouseList();
  });
  defineExpose({
    closeModal,
    handleSubmit,
src/views/inventoryManagement/stockManagement/Record.vue
@@ -26,6 +26,7 @@
        <el-table-column label="产品大类" prop="productName" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="库位" prop="warehouseName" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" show-overflow-tooltip />
        <el-table-column label="合格库存数量" prop="qualifiedQuantity" show-overflow-tooltip />
        <el-table-column label="不合格库存数量" prop="unQualifiedQuantity" show-overflow-tooltip />
src/views/inventoryManagement/stockProfitLoss/index.vue
@@ -58,8 +58,8 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="仓库" prop="warehouseId">
              <el-select v-model="form.warehouseId" placeholder="请选择仓库" style="width: 100%" filterable :disabled="form.source === 'check'">
            <el-form-item label="仓库" prop="warehouseInfoId">
              <el-select v-model="form.warehouseInfoId" placeholder="请选择仓库" style="width: 100%" filterable :disabled="form.source === 'check'">
                <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
              </el-select>
            </el-form-item>
@@ -336,7 +336,7 @@
const form = reactive({
  id: null,
  type: 'profit',
  warehouseId: null,
  warehouseInfoId: null,
  remark: '',
  source: 'manual',
  checkPlanNo: '',
@@ -358,7 +358,7 @@
const rules = {
  type: [{ required: true, message: '请选择盈亏类型', trigger: 'change' }],
  warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
  warehouseInfoId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
}
const totalDiffAmount = computed(() => {
@@ -396,7 +396,7 @@
  dialogTitle.value = mode === 'add' ? '新建盈亏单' : '编辑盈亏单'
  if (mode === 'add') {
    Object.assign(form, {
      id: null, type: 'profit', warehouseId: null, remark: '',
      id: null, type: 'profit', warehouseInfoId: null, remark: '',
      source: 'manual', checkPlanNo: '', items: [],
    })
  }
@@ -409,7 +409,7 @@
    Object.assign(form, {
      id: data.id,
      type: data.type,
      warehouseId: data.warehouseId,
      warehouseInfoId: data.warehouseInfoId,
      remark: data.remark,
      source: data.source,
      checkPlanNo: data.checkPlanNo,
src/views/procurementManagement/procurementLedger/index.vue
@@ -115,62 +115,62 @@
        <el-table-column align="center"
                         label="序号"
                         type="index"
                         width="60" />
                         width="80" />
        <el-table-column label="采购合同号"
                         prop="purchaseContractNumber"
                         width="160"
                         min-width="160"
                         show-overflow-tooltip />
        <el-table-column label="销售合同号"
                         prop="salesContractNo"
                         width="160"
                         min-width="160"
                         show-overflow-tooltip />
        <el-table-column label="供应商名称"
                         prop="supplierName"
                         width="160"
                         min-width="160"
                         show-overflow-tooltip />
        <el-table-column label="项目名称"
                         prop="projectName"
                         width="320"
                         min-width="200"
                         show-overflow-tooltip />
        <el-table-column label="审批状态"
                         prop="approvalStatus"
                         width="100"
                         show-overflow-tooltip>
          <template #default="scope">
            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)"
                    size="small">
              {{ approvalStatusText[scope.row.approvalStatus] || '未知状态' }}
            </el-tag>
          </template>
        </el-table-column>
        <!--        <el-table-column label="审批状态"-->
        <!--                         prop="approvalStatus"-->
        <!--                         width="100"-->
        <!--                         show-overflow-tooltip>-->
        <!--          <template #default="scope">-->
        <!--            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)"-->
        <!--                    size="small">-->
        <!--              {{ approvalStatusText[scope.row.approvalStatus] || '未知状态' }}-->
        <!--            </el-tag>-->
        <!--          </template>-->
        <!--        </el-table-column>-->
        <el-table-column label="签订日期"
                         prop="executionDate"
                         width="100"
                         width="120"
                         show-overflow-tooltip />
        <el-table-column label="付款方式"
                         width="100"
                         width="120"
                         prop="paymentMethod"
                         show-overflow-tooltip />
        <el-table-column label="合同金额(元)"
                         prop="contractAmount"
                         width="200"
                         width="150"
                         show-overflow-tooltip
                         :formatter="formattedNumber" />
        <el-table-column label="录入人"
                         prop="recorderName"
                         width="120"
                         width="100"
                         show-overflow-tooltip />
        <el-table-column label="录入日期"
                         prop="entryDate"
                         width="100"
                         width="120"
                         show-overflow-tooltip />
        <el-table-column label="备注"
                         prop="remarks"
                         width="200"
                         min-width="150"
                         show-overflow-tooltip />
        <el-table-column fixed="right"
                         label="操作"
                         width="120"
                         width="140"
                         align="center">
          <template #default="scope">
            <el-button link
src/views/productionPlan/productionPlan/index.vue
@@ -13,14 +13,14 @@
                    style="width: 160px;"
                    @keyup.enter="handleQuery" />
        </el-form-item>
        <el-form-item label="销售合同号:"
                      prop="salesContractNo">
          <el-input v-model="searchForm.salesContractNo"
                    placeholder="请输入"
                    clearable
                    style="width: 160px;"
                    @keyup.enter="handleQuery" />
        </el-form-item>
<!--        <el-form-item label="销售合同号:"-->
<!--                      prop="salesContractNo">-->
<!--          <el-input v-model="searchForm.salesContractNo"-->
<!--                    placeholder="请输入"-->
<!--                    clearable-->
<!--                    style="width: 160px;"-->
<!--                    @keyup.enter="handleQuery" />-->
<!--        </el-form-item>-->
        <el-form-item label="需求日期范围:"
                      prop="dateRange">
          <el-date-picker v-model="searchForm.dateRange"
@@ -303,46 +303,49 @@
    {
      label: "主生产计划号",
      prop: "mpsNo",
      width: "150px",
      minWidth: "150px",
      align: "center",
    },
    {
      label: "来源",
      prop: "source",
      width: "150px",
      dataType: "tag",
      formatType: params => {
        return params == "销售" ? "primary" : "info";
      },
      formatData: params => {
        return params == "销售" ? "销售" : "内部";
      },
    },
    // {
    //   label: "来源",
    //   prop: "source",
    //   width: "150px",
    //   dataType: "tag",
    //   formatType: params => {
    //     return params == "销售" ? "primary" : "info";
    //   },
    //   formatData: params => {
    //     return params == "销售" ? "销售" : "内部";
    //   },
    // },
    {
      label: "产品名称",
      prop: "productName",
      width: "200px",
      minWidth: "200px",
      dataType: "tag",
      formatType: params => {
        return "primary";
      },
      align: "center",
    },
    {
      label: "产品规格",
      prop: "model",
      width: "150px",
      minWidth: "150px",
      className: "spec-cell",
      align: "center",
    },
    {
      label: "单位",
      prop: "unit",
      width: "100px",
      align: "center",
    },
    {
      label: "所需数量",
      prop: "qtyRequired",
      width: "150px",
      align: "right",
      minWidth: "150px",
      align: "center",
      dataType: "slot",
      slot: "qtyRequired",
      className: "volume-cell",
@@ -369,49 +372,54 @@
        };
        return statusMap[cell] || "";
      },
      align: "center",
    },
    {
      label: "已下发数量",
      prop: "quantityIssued",
      width: "120px",
      minWidth: "120px",
      className: "spec-cell",
      align: "center",
      // formatData: (cell, row) => (cell ? `${cell}${row.unit || "方"}` : 0),
    },
    {
      label: "需求日期",
      prop: "requiredDate",
      width: "160px",
      minWidth: "160px",
      className: "date-cell",
      formatData: cell => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
      align: "center",
    },
    {
      label: "承诺日期",
      prop: "promisedDeliveryDate",
      width: "160px",
      minWidth: "160px",
      className: "date-cell",
      formatData: cell => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
      align: "center",
    },
    {
      label: "销售合同号",
      prop: "salesContractNo",
      width: "200px",
      dataType: "slot",
      slot: "salesContractNo",
    },
    {
      label: "客户名称",
      prop: "customerName",
      width: "150px",
    },
    {
      label: "项目名称",
      prop: "projectName",
      width: "150px",
    },
    // {
    //   label: "销售合同号",
    //   prop: "salesContractNo",
    //   width: "200px",
    //   dataType: "slot",
    //   slot: "salesContractNo",
    // },
    // {
    //   label: "客户名称",
    //   prop: "customerName",
    //   width: "150px",
    // },
    // {
    //   label: "项目名称",
    //   prop: "projectName",
    //   width: "150px",
    // },
    {
      label: "备注",
      width: "150px",
      minWidth: "150px",
      prop: "remark",
      align: "center",
    },
    {
      dataType: "action",
@@ -441,13 +449,13 @@
            mergeForm.productName = row.productName || "";
            mergeForm.model = row.model || "";
            mergeForm.totalAssignedQuantity =
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
                Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
            mergeForm.planCompleteTime = row.requiredDate || "";
            mergeForm.productId = row.productId || "";
            mergeForm.ids = [row.id];
            mergeForm.workshopId = row.workshopId ?? undefined;
            sumAssignedQuantity.value =
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
                Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
            isShowNewModal.value = true;
          },
        },