zhangwencui
2 天以前 9c90d0ffbc48f603c1b43e5d13805fde245a163b
src/views/productionPlan/productionPlan/index.vue
@@ -18,7 +18,7 @@
                    @keyup.enter="handleQuery" />
        </el-form-item>
        <el-form-item label="产品规格:">
          <el-input v-model="searchForm.productSpec"
          <el-input v-model="searchForm.specification"
                    placeholder="请输入"
                    clearable
                    style="width: 160px;"
@@ -102,7 +102,7 @@
        <el-row :gutter="20">
          <el-col :span="10">
            <el-form-item label="产品规格">
              <div class="info-display">{{ mergeForm.productSpec || '-' }}</div>
              <div class="info-display">{{ mergeForm.specification || '-' }}</div>
            </el-form-item>
          </el-col>
          <el-col :span="10">
@@ -234,19 +234,26 @@
                    placeholder="请输入客户名称" />
        </el-form-item>
        <el-form-item label="产品名称"
                      prop="productName">
          <el-input v-model="form.productName"
                    placeholder="请输入产品名称" />
                      prop="productMaterialId">
          <el-tree-select v-model="form.productMaterialId"
                          placeholder="请选择"
                          clearable
                          :data="productOptions"
                          :render-after-expand="false"
                          filterable
                          @change="handleProductChange"
                          style="width: 100%" />
        </el-form-item>
        <el-form-item label="产品规格"
                      prop="productSpec">
          <el-input v-model="form.productSpec"
                    placeholder="请输入产品规格" />
        </el-form-item>
        <el-form-item label="物料编码"
                      prop="materialCode">
          <el-input v-model="form.materialCode"
                    placeholder="请输入物料编码" />
                      prop="productMaterialSkuId">
          <el-select v-model="form.productMaterialSkuId"
                     @change="handleChangeSpecification"
                     placeholder="请选择">
            <el-option v-for="item in specificationOptions"
                       :key="item.skuId"
                       :label="item.specification"
                       :value="item.skuId" />
          </el-select>
        </el-form-item>
        <el-form-item label="块数"
                      prop="quantity">
@@ -335,6 +342,7 @@
    productionPlanCombine,
  } from "@/api/productionPlan/productionPlan.js";
  import PIMTable from "./components/PIMTable.vue";
  import { modelListPage, productTreeList } from "@/api/basicData/newProduct.js";
  const { proxy } = getCurrentInstance();
@@ -365,7 +373,7 @@
    },
    {
      label: "产品规格",
      prop: "productSpec",
      prop: "specification",
      width: "150px",
      className: "spec-cell",
    },
@@ -482,14 +490,15 @@
          clickFun: row => {
            // 单独下发操作
            // 设置表单数据
            mergeForm.ids = [row.id];
            mergeForm.materialCode = row.materialCode;
            mergeForm.productName = row.productName || "";
            mergeForm.productSpec = row.productSpec || "";
            mergeForm.specification = row.specification || "";
            mergeForm.length = row.length || 0;
            mergeForm.width = row.width || 0;
            mergeForm.height = row.height || 0;
            mergeForm.totalAssignedQuantity =
              Number(row.volume) - Number(row.assignedQuantity) || 0;
              (Number(row.volume) - Number(row.assignedQuantity)).toFixed(4) || 0;
            mergeForm.planCompleteTime = row.planCompleteTime || "";
            sumAssignedQuantity.value = mergeForm.totalAssignedQuantity;
            // 打开弹窗
@@ -526,7 +535,7 @@
  const mergeForm = reactive({
    materialCode: "",
    productName: "",
    productSpec: "",
    specification: "",
    length: 0,
    width: 0,
    height: 0,
@@ -557,13 +566,17 @@
  // 新增/编辑相关
  const dialogVisible = ref(false);
  const operationType = ref("add"); // add | edit
  const productOptions = ref([]);
  const specificationOptions = ref([]);
  const formRef = ref(null);
  const form = reactive({
    id: undefined,
    applyNo: "",
    customerName: "",
    productMaterialId: undefined,
    productMaterialSkuId: undefined,
    productName: "",
    productSpec: "",
    specification: "",
    materialCode: "",
    quantity: 0,
    volume: 0,
@@ -581,10 +594,11 @@
    customerName: [
      { required: true, message: "请输入客户名称", trigger: "blur" },
    ],
    productName: [{ required: true, message: "请输入产品名称", trigger: "blur" }],
    productSpec: [{ required: true, message: "请输入产品规格", trigger: "blur" }],
    materialCode: [
      { required: true, message: "请输入物料编码", trigger: "blur" },
    productMaterialSkuId: [
      { required: true, message: "请选择产品规格", trigger: "change" },
    ],
    productMaterialId: [
      { required: true, message: "请选择产品", trigger: "change" },
    ],
  });
@@ -609,6 +623,55 @@
  const onBlur = value => {
    // 限制四位小数
    mergeForm.totalAssignedQuantity = Number(value.toFixed(4));
  };
  const fetchProductOptions = () => {
    return productTreeList().then(res => {
      productOptions.value = convertIdToValue(res.data);
      return res;
    });
  };
  const convertIdToValue = data => {
    return data.map(item => {
      const newItem = {
        value: `config_${item.configId}`, // 使用config_前缀确保唯一性
        label: item.configName,
        disabled: item.materialList.length === 0,
      };
      if (item.materialList && item.materialList.length > 0) {
        newItem.children = item.materialList.map(material => ({
          value: material.id, // 使用material的id作为value
          label: material.materialName, // 使用materialName作为label
        }));
      }
      return newItem;
    });
  };
  const handleProductChange = value => {
    form.productMaterialSkuId = undefined;
    fetchSpecificationOptions(value);
  };
  const fetchSpecificationOptions = materialId => {
    specificationOptions.value = [];
    if (materialId) {
      modelListPage({ materialId: materialId }).then(res => {
        specificationOptions.value = res.data;
      });
    }
  };
  const handleChangeSpecification = value => {
    form.materialCode = undefined;
    const selectedModel = specificationOptions.value.find(
      item => item.id === value
    );
    if (selectedModel) {
      form.materialCode = selectedModel.materialCode;
    }
  };
  // 生成模拟进度详情数据
@@ -686,7 +749,7 @@
    searchForm: {
      customerName: "",
      productName: "",
      productSpec: "",
      specification: "",
      materialCode: "",
      applyNo: "",
      dateRange: [],
@@ -706,7 +769,7 @@
    Object.assign(searchForm.value, {
      customerName: "",
      productName: "",
      productSpec: "",
      specification: "",
      materialCode: "",
      applyNo: "",
      dateRange: [],
@@ -732,8 +795,9 @@
          totalAssignedQuantity: 0,
        };
      }
      summary[category].totalAssignedQuantity +=
        Number(row.volume) - Number(row.assignedQuantity);
      summary[category].totalAssignedQuantity += (
        Number(row.volume) - Number(row.assignedQuantity)
      ).toFixed(4);
    });
    // 转换为数组格式
@@ -811,7 +875,7 @@
        sum +
        (row.volume == null
          ? 0
          : Number(row.volume) - Number(row.assignedQuantity))
          : (Number(row.volume) - Number(row.assignedQuantity)).toFixed(4))
      );
    }, 0);
    sumAssignedQuantity.value = totalAssignedQuantity;
@@ -820,12 +884,13 @@
    const firstRow = selectedRows.value[0];
    mergeForm.materialCode = selectedserialNo.value;
    mergeForm.productName = firstRow.productName || "";
    mergeForm.productSpec = firstRow.productSpec || "";
    mergeForm.specification = firstRow.specification || "";
    mergeForm.length = firstRow.length || 0;
    mergeForm.width = firstRow.width || 0;
    mergeForm.height = firstRow.height || 0;
    mergeForm.totalAssignedQuantity = totalAssignedQuantity;
    mergeForm.planCompleteTime = firstRow.planCompleteTime || "";
    mergeForm.ids = selectedRows.value.map(row => row.id);
    // 打开弹窗
    isShowNewModal.value = true;
@@ -833,6 +898,10 @@
  // 处理合并下发提交
  const handleMergeSubmit = () => {
    if (mergeForm.totalAssignedQuantity === 0) {
      ElMessage.warning("请输入生产方数");
      return;
    }
    console.log(sumAssignedQuantity.value, "sumAssignedQuantity");
    // 计算当前选中行的总方数
    const totalVolume = selectedRows.value.reduce((sum, row) => {
@@ -845,16 +914,17 @@
      return;
    }
    mergeForm.ids = selectedRows.value.map(row => row.id);
    console.log(mergeForm, "mergeForm");
    productionPlanCombine(mergeForm)
      .then(res => {
        if (res.code === 200) {
          ElMessage.success("合并下发成功");
          ElMessage.success("下发成功");
          getList();
          isShowNewModal.value = false;
          // 可以选择刷新列表或其他操作
          getList();
        } else {
          ElMessage.error(res.message || "合并下发失败");
          ElMessage.error(res.message || "下发失败");
        }
      })
      .catch(err => {
@@ -948,7 +1018,9 @@
      applyNo: "",
      customerName: "",
      productName: "",
      productSpec: "",
      productMaterialId: undefined,
      productMaterialSkuId: undefined,
      specification: "",
      materialCode: "",
      quantity: 0,
      volume: 0,
@@ -962,6 +1034,7 @@
      remarkTwo: "",
    });
    dialogVisible.value = true;
    fetchProductOptions();
  };
  // 编辑
@@ -972,7 +1045,9 @@
      applyNo: row.applyNo || "",
      customerName: row.customerName || "",
      productName: row.productName || "",
      productSpec: row.productSpec || "",
      productMaterialId: row.productMaterialId || undefined,
      productMaterialSkuId: row.productMaterialSkuId || undefined,
      specification: row.specification || "",
      materialCode: row.materialCode || "",
      quantity: row.quantity || 0,
      volume: row.volume || 0,
@@ -986,6 +1061,8 @@
      remarkTwo: row.remarkTwo || "",
    });
    dialogVisible.value = true;
    fetchProductOptions();
    fetchSpecificationOptions(row.productMaterialId);
  };
  // 删除