gaoluyang
8 小时以前 e449a5408265e4bd1f6c66f5be28a42efac444ee
src/pages/sales/salesQuotation/edit.vue
@@ -23,6 +23,16 @@
                       @click="showCustomerSheet = true"></up-icon>
            </template>
          </up-form-item>
          <up-form-item label="所属项目"
                        prop="projectId">
            <FormPicker v-model="form.projectId"
                        :display-text="form.projectName"
                        type="select"
                        title="选择所属项目"
                        :options="projectOptions"
                        placeholder="请选择所属项目"
                        @change="onProjectChange" />
          </up-form-item>
          <up-form-item label="业务员"
                        prop="salesperson"
                        required>
@@ -199,7 +209,9 @@
  import { onLoad } from "@dcloudio/uni-app";
  import FooterButtons from "@/components/FooterButtons.vue";
  import PageHeader from "@/components/PageHeader.vue";
  import FormPicker from "@/components/FormPicker.vue";
  import { formatDateToYMD } from "@/utils/ruoyi";
  import { loadProjectOptions, pickProjectName } from "@/utils/projectOptions";
  import { modelList, productTreeList } from "@/api/basicData/product";
  import { userListNoPageByTenantId } from "@/api/system/user";
  import {
@@ -224,6 +236,7 @@
  const salespersonList = ref([]);
  const productList = ref([]);
  const modelActions = ref([]);
  const projectOptions = ref([]);
  let uidSeed = 1;
@@ -232,6 +245,8 @@
    quotationNo: "",
    customerId: undefined,
    customer: "",
    projectId: "",
    projectName: "",
    salesperson: "",
    quotationDate: "",
    validDate: "",
@@ -420,6 +435,31 @@
    );
  };
  const onProjectChange = (value, item) => {
    form.value.projectName = pickProjectName(item);
  };
  const loadProjectList = async () => {
    try {
      projectOptions.value = await loadProjectOptions();
    } catch (error) {
      projectOptions.value = [];
    }
  };
  // 报价单只带 projectId 不带名称时,从下拉选项反查补全,避免保存时把名称清空
  const resolveProjectName = () => {
    if (form.value.projectName) return;
    if (!form.value.projectId) {
      form.value.projectName = "";
      return;
    }
    const matched = projectOptions.value.find(
      option => String(option.value) === String(form.value.projectId)
    );
    form.value.projectName = matched ? matched.name : "";
  };
  // 根据名称反查节点 id,便于仅存名称时的反显
  const findNodeIdByLabel = (nodes, label) => {
    if (!label) return null;
@@ -498,6 +538,8 @@
        quotationNo: data.quotationNo || "",
        customerId: data.customerId,
        customer: data.customer || "",
        projectId: data.projectId ?? "",
        projectName: data.projectName || "",
        salesperson: data.salesperson || "",
        quotationDate: data.quotationDate || "",
        validDate: data.validDate || "",
@@ -546,6 +588,7 @@
    // 同步最新的总额
    form.value.totalAmount = totalAmount.value;
    form.value.subtotal = totalAmount.value;
    resolveProjectName();
    const payload = {
      ...form.value,
@@ -586,7 +629,7 @@
  });
  onMounted(async () => {
    await fetchBaseOptions();
    await Promise.all([fetchBaseOptions(), loadProjectList()]);
    if (quotationId.value) {
      await loadDetail();
    }