src/views/productionManagement/productionProcess/New.vue
@@ -10,53 +10,21 @@
        <el-row :gutter="16">
          <el-col :span="12">
            <el-form-item
            label="产品名称:"
            prop="productId"
            label="部件名称"
            prop="name"
            :rules="[
                {
                required: true,
                message: '请选择产品名称',
              },
            ]">
              <el-tree-select
            v-model="formState.productId"
            placeholder="请选择产品名称"
            clearable
            filterable
            check-strictly
            :data="productCategoryOptions"
            :render-after-expand="false"
            style="width: 100%"
            @change="handleProductChange"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item
            label="产品规格:"
            prop="productModelId"
            :rules="[
                {
                required: true,
                message: '请选择产品规格',
              },
            ]">
              <el-select v-model="formState.productModelId"
                     placeholder="请选择产品规格"
                     clearable
                     filterable
                     :disabled="!formState.productId"
                     style="width: 100%">
                <el-option v-for="item in modelOptions"
                       :key="item.id"
                       :label="item.model"
                       :value="item.id" />
              </el-select>
                message: '请输入部件名称',
              }
            ]"
            >
              <el-input v-model="formState.name" placeholder="请输入部件名称" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="部件编号" prop="no">
              <el-input v-model="formState.no"  />
              <el-input v-model="formState.no" placeholder="请输入部件编号" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -113,6 +81,25 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划执行人员" prop="executorId">
              <el-select
            v-model="formState.executorId"
            placeholder="请选择计划执行人员"
            clearable
            filterable
            style="width: 100%"
            @change="handleExecutorChange"
              >
                <el-option
              v-for="item in plannerOptions"
              :key="item.userId"
              :label="item.nickName"
              :value="item.userId"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="是否质检" prop="isQuality">
              <el-switch v-model="formState.isQuality" :active-value="true" inactive-value="false"/>
            </el-form-item>
@@ -137,7 +124,6 @@
<script setup>
import { ref, computed, getCurrentInstance, onMounted } from "vue";
import {add} from "@/api/productionManagement/productionProcess.js";
import { modelListPage, productTreeList } from "@/api/basicData/product";
import { userListNoPageByTenantId } from "@/api/system/user.js";
const props = defineProps({
@@ -152,17 +138,15 @@
// 响应式数据(替代选项式的 data)
const formState = ref({
  name: '',
  productId: undefined,
  productModelId: undefined,
  type: undefined,
  remark: '',
  salaryQuota:  '',
  plannerId: undefined,
  plannerName: '',
  executorId: undefined,
  executorName: '',
  isQuality: false,
});
const productCategoryOptions = ref([]);
const modelOptions = ref([]);
const plannerOptions = ref([]);
const isShow = computed({
@@ -189,60 +173,6 @@
  callback();
};
const convertProductTree = list => {
  return (list || []).map(item => {
    const children = convertProductTree(item.children || item.childList || []);
    return {
      ...item,
      value: item.id,
      label: item.name || item.label,
      children,
      disabled: children.length > 0,
    };
  });
};
const findNodeById = (nodes, targetId) => {
  for (const node of nodes || []) {
    if (String(node.value) === String(targetId)) {
      return node;
    }
    if (node.children && node.children.length > 0) {
      const found = findNodeById(node.children, targetId);
      if (found) return found;
    }
  }
  return null;
};
const getProductCategoryOptions = async () => {
  try {
    const res = await productTreeList();
    const list = Array.isArray(res) ? res : res?.data || [];
    productCategoryOptions.value = convertProductTree(list);
  } catch (e) {
    productCategoryOptions.value = [];
  }
};
const getModelOptions = async productId => {
  if (!productId) {
    modelOptions.value = [];
    return;
  }
  try {
    const res = await modelListPage({
      id: productId,
      current: 1,
      size: 999,
    });
    const records = res?.records || res?.data?.records || [];
    modelOptions.value = records;
  } catch (e) {
    modelOptions.value = [];
  }
};
const getPlannerOptions = async () => {
  try {
    const res = await userListNoPageByTenantId();
@@ -257,11 +187,9 @@
  formState.value.plannerName = selectedUser?.nickName || '';
};
const handleProductChange = async value => {
  const selectedNode = findNodeById(productCategoryOptions.value, value);
  formState.value.name = selectedNode?.label || '';
  formState.value.productModelId = undefined;
  await getModelOptions(value);
const handleExecutorChange = value => {
  const selectedUser = plannerOptions.value.find(item => String(item.userId) === String(value));
  formState.value.executorName = selectedUser?.nickName || '';
};
const closeModal = () => {
@@ -283,7 +211,6 @@
};
onMounted(() => {
  getProductCategoryOptions();
  getPlannerOptions();
});