src/views/salesManagement/salesQuotation/index.vue
@@ -52,6 +52,7 @@
      >
            <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column prop="quotationNo" label="报价单号" />
        <el-table-column prop="masterContractNo" label="总合同号" width="150" show-overflow-tooltip />
        <el-table-column prop="customer" label="客户名称" />
        <el-table-column prop="salesperson" label="业务员" width="100" />
        <el-table-column prop="quotationDate" label="报价日期" width="120" />
@@ -103,11 +104,20 @@
            <el-row :gutter="24">
              <el-col :span="12">
                <el-form-item label="客户名称" prop="customerId">
                  <el-select v-model="form.customerId" placeholder="请选择客户" style="width: 100%" clearable filterable>
                  <el-select v-model="form.customerId" placeholder="请选择客户" style="width: 100%" clearable filterable @change="handleCustomerChange">
                    <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="总合同号">
                  <el-select v-model="form.masterContractNo" placeholder="请先选择客户" style="width: 100%" clearable filterable :disabled="!form.customerId">
                    <el-option v-for="item in contractList" :key="item.id" :label="item.masterContractNo" :value="item.masterContractNo"></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row :gutter="24">
              <el-col :span="12">
                <el-form-item label="业务员" prop="salesperson">
                  <el-select v-model="form.salesperson" placeholder="请选择业务员" style="width: 100%" clearable filterable>
@@ -264,6 +274,7 @@
    <el-dialog v-model="viewDialogVisible" title="报价详情" width="800px">
      <el-descriptions :column="2" border>
        <el-descriptions-item label="报价单号">{{ currentQuotation.quotationNo }}</el-descriptions-item>
        <el-descriptions-item label="总合同号">{{ currentQuotation.masterContractNo || '--' }}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ currentQuotation.customer }}</el-descriptions-item>
        <el-descriptions-item label="业务员">{{ currentQuotation.salesperson }}</el-descriptions-item>
        <el-descriptions-item label="报价日期">{{ currentQuotation.quotationDate }}</el-descriptions-item>
@@ -309,6 +320,7 @@
import {modelList, productTreeList} from "@/api/basicData/product.js";
import {listCustomer} from "@/api/basicData/customer.js";
import { userListNoPage } from "@/api/system/user.js";
import { getCustomerContractList } from "@/api/basicData/customerContract.js";
// 响应式数据
const loading = ref(false)
@@ -322,6 +334,7 @@
const userList = ref([])
const productOptions = ref([]);
const modelOptions  = ref([]);
const contractList = ref([]);
const pagination = reactive({
  total: 3,
  currentPage: 1,
@@ -341,6 +354,7 @@
  paymentMethod: '',
  status: '草稿',
  remark: '',
  masterContractNo: '',
  products: [],
  subtotal: 0,
  freight: 0,
@@ -381,6 +395,7 @@
// 计算属性
const filteredList = computed(() => {
  let list = quotationList.value
  console.log(list)
  return list
})
@@ -419,6 +434,23 @@
    customerOption.value = res.data.records;
  });
}
// 客户选择变化时,加载该客户的合同列表
const handleCustomerChange = async (customerId) => {
  form.masterContractNo = '';
  contractList.value = [];
  if (!customerId) return;
  try {
    const res = await getCustomerContractList(customerId);
    if (res.code === 200) {
      contractList.value = res.data || [];
    }
  } catch (error) {
    console.error('获取客户合同列表失败:', error);
  }
};
const getProductOptions = () => {
   // 返回 Promise,便于编辑时 await 确保能反显
   return productTreeList().then((res) => {
@@ -521,6 +553,7 @@
    quotationDate: row.quotationDate || '',
    validDate: row.validDate || '',
    paymentMethod: row.paymentMethod || '',
    masterContractNo: row.masterContractNo || '',
    status: row.status || '',
    remark: row.remark || '',
    products: row.products ? row.products.map(product => ({
@@ -557,6 +590,22 @@
  form.paymentMethod = row.paymentMethod || ''
  form.status = row.status || '草稿'
  form.remark = row.remark || ''
  // 编辑时加载客户的合同列表以便回显总合同号
  if (row.customerId) {
    try {
      const contractRes = await getCustomerContractList(row.customerId);
      if (contractRes.code === 200) {
        contractList.value = contractRes.data || [];
      }
    } catch (error) {
      console.error('获取客户合同列表失败:', error);
    }
  }
  // 兼容后端返回的 masterContractNo 或 master_contract_no,放在合同列表加载后设置
  form.masterContractNo = row.masterContractNo || row.master_contract_no || ''
  form.products = row.products ? await Promise.all(row.products.map(async (product) => {
    const productName = product.product || product.productName || ''
    // 优先用 productId;如果只有名称,尝试反查 id 以便树选择器反显
@@ -634,11 +683,13 @@
  form.paymentMethod = ''
  form.status = '草稿'
  form.remark = ''
  form.masterContractNo = ''
  form.products = []
  form.subtotal = 0
  form.freight = 0
  form.otherFee = 0
  form.totalAmount = 0
  contractList.value = []
}
const addProduct = () => {
@@ -749,6 +800,7 @@
        customer: item.customer || '',
        customerId: item.customerId || undefined,
        salesperson: item.salesperson || '',
        masterContractNo: item.masterContractNo || '',
        quotationDate: item.quotationDate || '',
        validDate: item.validDate || '',
        paymentMethod: item.paymentMethod || '',