沐梦. преди 2 дни
родител
ревизия
ffc70ca614

+ 3 - 17
src/views/common/businessActivity.vue

@@ -126,7 +126,7 @@
                 <el-col :span="12">
                   <div class="m-item">
                     <span class="m-label">创建人</span>
-                    <span class="m-value link-style">{{ (infoData.createByName && infoData.createByName !== 'admin') ? infoData.createByName : (infoData.createByStaffName || getStaffName(infoData.createBy || infoData.createByName)) }}</span>
+                    <span class="m-value link-style">{{ userStore.nickname }}</span>
                   </div>
                 </el-col>
                 <el-col :span="12">
@@ -144,7 +144,7 @@
                 <el-col :span="12">
                   <div class="m-item">
                     <span class="m-label">最后修改人</span>
-                    <span class="m-value">{{ (infoData.updateByName && infoData.updateByName !== 'admin') ? infoData.updateByName : (infoData.updateByStaffName || getStaffName(infoData.updateBy || infoData.updateByName)) }}</span>
+                    <span class="m-value">{{ userStore.nickname }}</span>
                   </div>
                 </el-col>
               </el-row>
@@ -735,21 +735,7 @@ const submitRecord = async () => {
   });
 };
 
-const getStaffName = (id) => {
-  if (!id) return '';
-  const strId = String(id).trim();
-  if (strId.toLowerCase() === 'admin' || strId === '1') return '超级管理员';
-  // 避免将非 ID 字符串(已是姓名)再次查找
-  if (id && isNaN(Number(id)) && strId.length > 4) return id; 
-
-  const staff = staffOptions.value.find(item => 
-    String(item.staffId) === strId || 
-    String(item.userId) === strId || 
-    String(item.userName).toLowerCase() === strId.toLowerCase() ||
-    String(item.id) === strId
-  );
-  return staff ? (staff.staffName || staff.userName || staff.nickName) : id;
-};
+
 
 // 获取记录显示的用户名
 const getRecordUser = (record) => {

+ 109 - 41
src/views/customer/care/add.vue

@@ -20,6 +20,10 @@
                   placeholder="请选择" 
                   style="width: 100%" 
                   filterable 
+                  remote
+                  reserve-keyword
+                  :remote-method="remoteLoadCustomers"
+                  :loading="selectLoading"
                   clearable
                   @change="handleCustomerChange"
                 >
@@ -51,7 +55,18 @@
             </el-col>
             <el-col :span="12">
               <el-form-item label="业务员:" prop="salesman">
-                <el-select v-model="form.salesman" placeholder="请选择" style="width: 100%" clearable>
+                <el-select 
+                  v-model="form.salesman" 
+                  placeholder="请选择" 
+                  style="width: 100%" 
+                  filterable
+                  remote
+                  reserve-keyword
+                  :remote-method="remoteLoadStaffs"
+                  :loading="staffLoading"
+                  clearable 
+                  @change="handleSalesmanChange"
+                >
                   <el-option v-for="item in staffOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="item.staffName" />
                 </el-select>
               </el-form-item>
@@ -65,11 +80,11 @@
                   placeholder="请选择" 
                   style="width: 100%" 
                   filterable 
+                  remote
+                  reserve-keyword
+                  :remote-method="remoteLoadContacts"
+                  :loading="contactLoading"
                   clearable 
-                  remote 
-                  :remote-method="remoteSearchContacts" 
-                  :loading="contactSearchLoading" 
-                  @focus="onContactFocus" 
                   @change="handleContactChange"
                 >
                   <el-option v-for="item in contactOptions" :key="item.id" :label="item.label" :value="item.label" />
@@ -173,6 +188,8 @@ const router = useRouter();
 
 const visible = ref(false);
 const selectLoading = ref(false);
+const staffLoading = ref(false);
+const contactLoading = ref(false);
 const contactSearchLoading = ref(false);
 const customerOptions = ref([]);
 const contactOptions = ref([]);
@@ -203,20 +220,48 @@ const form = reactive({
   auditStatus: 0
 });
 
-/** 打开抽屉 */
-const open = (data = {}) => {
+const open = async (data = {}) => {
   visible.value = true;
+  
+  // 识别传入的 data 是客户对象还是其他格式
+  const initCustomerId = data.customerId ? String(data.customerId) : (data.id ? String(data.id) : undefined);
+  const initCustomerName = data.customerName || data.customName || data.companyName || '';
+
   Object.assign(form, {
-    customerName: data.customerName || '',
-    customerId: data.customerId ? String(data.customerId) : undefined,
-    profession: data.profession || '',
-    department: data.department || '',
-    salesman: data.salesman || '',
-    contactPerson: data.contactName || '',
-    personnelNumber: data.contactId ? String(data.contactId) : undefined,
-    phone: data.phone || '',
-    telephone: data.officePhone || ''
+    id: undefined,
+    customerId: initCustomerId,
+    personnelNumber: undefined,
+    customerName: initCustomerName,
+    profession: '',
+    department: '',
+    salesman: '',
+    contactPerson: '',
+    phone: '',
+    telephone: '',
+    concernType: '',
+    amount: undefined,
+    requirementDate: undefined,
+    fileNo: '',
+    giftDesc: '',
+    concernArgument: '',
+    receiptId: '',
+    platformCode: 'crm',
+    auditStatus: 0
   });
+
+  if (initCustomerId) {
+    try {
+      const res = await getCustomerInfo(initCustomerId);
+      const detail = res.data;
+      if (detail) {
+        form.profession = detail.industryCategory || '';
+        if (detail.customerSalesInfoVo) {
+          form.salesman = detail.customerSalesInfoVo.salesPerson || '';
+          form.department = detail.customerSalesInfoVo.belongingDepartment || '';
+        }
+      }
+    } catch (error) {}
+  }
 };
 
 defineExpose({ open });
@@ -247,10 +292,10 @@ const rules = reactive({
   ]
 });
 
-/** 加载客户列表 (500条) */
+/** 加载客户列表 (远程搜索) */
 const remoteLoadCustomers = (query) => {
   selectLoading.value = true;
-  listCustomerInfo({ pageNum: 1, pageSize: 500, isHighSeas: 'all' }).then(res => {
+  listCustomerInfo({ pageNum: 1, pageSize: 20, isHighSeas: 'all', customerName: query || undefined }).then(res => {
     customerOptions.value = (res.rows || []).map(item => ({
       label: item.customerName,
       value: item.customerName,
@@ -263,6 +308,29 @@ const remoteLoadCustomers = (query) => {
   });
 };
 
+/** 加载业务员 (远程搜索) */
+const remoteLoadStaffs = (query) => {
+  staffLoading.value = true;
+  listComStaff({ pageNum: 1, pageSize: 20, staffName: query || undefined }).then(res => {
+    staffOptions.value = res.rows || res.data || [];
+    staffLoading.value = false;
+  }).catch(() => { staffLoading.value = false; });
+};
+
+/** 加载联系人 (远程搜索) */
+const remoteLoadContacts = (query) => {
+  contactLoading.value = true;
+  listContact({ pageNum: 1, pageSize: 20, contactName: query || undefined }).then(res => {
+    contactOptions.value = (res.rows || []).map(item => ({
+      label: item.contactName,
+      value: item.contactName,
+      id: item.id,
+      ...item
+    }));
+    contactLoading.value = false;
+  }).catch(() => { contactLoading.value = false; });
+};
+
 /** 客户选中处理 */
 const handleCustomerChange = async (val) => {
   const customer = customerOptions.value.find(item => item.label === val);
@@ -283,33 +351,30 @@ const handleCustomerChange = async (val) => {
         }
       }
     } catch (error) {}
+    
+    // 不再根据客户ID过滤,保持显示所有的联系人
+    remoteLoadContacts('');
+  } else {
+    // 清空客户时,加载所有联系人
+    remoteLoadContacts('');
   }
 };
 
-/** 远程搜索联系人 */
-const remoteSearchContacts = (query) => {
-  contactSearchLoading.value = true;
-  const params = { pageSize: 50 };
-  if (query) params.contactName = query;
-  
-  listContact(params).then(res => {
-    contactOptions.value = (res.rows || []).map(item => ({
-      label: item.contactName,
-      value: item.contactName,
-      id: item.id,
-      ...item
-    }));
-  }).finally(() => {
-    contactSearchLoading.value = false;
-  });
-};
-
-const onContactFocus = () => {
-  if (contactOptions.value.length === 0) remoteSearchContacts('');
+const handleSalesmanChange = (val) => {
+  const staff = staffOptions.value.find(item => item.staffName === val);
+  if (staff) {
+    form.department = staff.deptName || staff.departmentName || '';
+  } else {
+    form.department = '';
+  }
 };
 
 const handleContactChange = (val) => {
-  // 不再自动填充手机号和固定电话,由用户手动维护
+  const contact = contactOptions.value.find(item => item.label === val);
+  if (contact) {
+    form.phone = contact.phone || '';
+    form.telephone = contact.officePhone || contact.telephone || '';
+  }
 };
 
 /** 生成单据编号: YYYYMMDD + 4位流水号 */
@@ -350,16 +415,19 @@ function handleClose() {
 /** 加载基础选项 */
 const initBaseOptions = () => {
   listIndustryCategory().then(res => { industryOptions.value = res.data || res.rows || []; });
-  listComStaff({ pageSize: 1000 }).then(res => { staffOptions.value = res.rows || res.data || []; });
   deptTreeSelect().then(res => {
     const data = res.data || [];
     deptOptions.value = proxy.handleTree(data, "id");
   });
+  
+  // 初始加载少量数据,用户可根据输入远程搜索
+  remoteLoadCustomers('');
+  remoteLoadStaffs('');
+  remoteLoadContacts('');
 };
 
 onMounted(() => {
   initBaseOptions();
-  remoteLoadCustomers('');
 });
 </script>
 

+ 2 - 0
src/views/customer/contactPerson/add.vue

@@ -218,6 +218,8 @@ const form = reactive({
 const rules = reactive({
   contactName: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
   age: [{ required: true, message: "年龄不能为空", trigger: "blur" }],
+  deptId: [{ required: true, message: "归属公司不能为空", trigger: "change" }],
+  customerId: [{ required: true, message: "客户名称不能为空", trigger: "change" }],
   deptName: [{ required: true, message: "部门不能为空", trigger: "blur" }],
   phone: [
     { pattern: /^1[3-9]\d{9}$/, message: "请输入正确的11位手机号码", trigger: "blur" }

+ 23 - 10
src/views/saleManage/leads/index.vue

@@ -23,6 +23,10 @@
                 style="width: 100%" 
                 clearable 
                 filterable
+                remote
+                reserve-keyword
+                :remote-method="remoteLoadCustomers"
+                :loading="customerLoading"
               >
                 <el-option v-for="item in localCustomerOptions" :key="item.customerNo" :label="item.customerName" :value="item.customerName" />
               </el-select>
@@ -30,7 +34,7 @@
           </el-col>
           <el-col :span="6">
             <el-form-item label="负责人" prop="leader">
-              <el-select v-model="queryParams.leader" placeholder="请选择" style="width: 100%" clearable>
+              <el-select v-model="queryParams.leader" placeholder="请输入关键字搜索" style="width: 100%" clearable filterable remote reserve-keyword :remote-method="remoteLoadStaffs" :loading="staffLoading">
                 <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
@@ -54,7 +58,7 @@
           </el-col>
           <el-col :span="6">
             <el-form-item label="产品支持" prop="productSupport">
-              <el-select v-model="queryParams.productSupport" placeholder="请选择" style="width: 100%" clearable>
+              <el-select v-model="queryParams.productSupport" placeholder="请输入关键字搜索" style="width: 100%" clearable filterable remote reserve-keyword :remote-method="remoteLoadStaffs" :loading="staffLoading">
                 <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
@@ -255,7 +259,7 @@
     <el-dialog title="是否将选中的项目线索转移给其他负责人?" v-model="transferVisible" width="500px" append-to-body>
       <el-form :model="transferForm" label-width="100px" style="padding: 10px 20px 0;">
         <el-form-item label="新负责人" required>
-          <el-select v-model="transferForm.newOwner" placeholder="请选择" style="width:100%" filterable>
+          <el-select v-model="transferForm.newOwner" placeholder="请输入关键字搜索" style="width:100%" filterable remote reserve-keyword :remote-method="remoteLoadStaffs" :loading="staffLoading">
             <el-option v-for="u in userOptions" :key="u.staffId" :label="(u.staffCode ? '(' + u.staffCode + ') ' : '') + u.staffName" :value="u.staffId" />
           </el-select>
         </el-form-item>
@@ -275,13 +279,13 @@
     <el-dialog v-model="claimOpen" title="您正在认领销售线索,请分配销售线索认领信息" width="500px" append-to-body>
       <el-form :model="claimForm" label-width="150px">
         <el-form-item label="业务负责人" required>
-          <el-select v-model="claimForm.leader" filterable placeholder="请选择" style="width: 100%">
+          <el-select v-model="claimForm.leader" filterable remote reserve-keyword :remote-method="remoteLoadStaffs" :loading="staffLoading" placeholder="请输入关键字搜索" style="width: 100%">
             <el-option v-for="item in computedClaimUserOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="item.staffId" />
           </el-select>
         </el-form-item>
 
         <el-form-item label="产品支持" required>
-          <el-select v-model="claimForm.productSupport" filterable placeholder="请选择" style="width: 100%">
+          <el-select v-model="claimForm.productSupport" filterable remote reserve-keyword :remote-method="remoteLoadStaffs" :loading="staffLoading" placeholder="请输入关键字搜索" style="width: 100%">
             <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="item.staffId" />
           </el-select>
         </el-form-item>
@@ -408,19 +412,18 @@ onMounted(() => {
   remoteLoadCustomers(''); // 初始化加载一部分客户
 });
 
+const staffLoading = ref(false);
+
 const getDicts = () => {
   listCompanyOption().then(res => companyOptions.value = res.data.map(i => ({ ...i, companyCode: String(i.companyCode) })));
-  listComStaff({ pageSize: 1000 }).then(res => {
-    const list = res.rows || res.data || [];
-    userOptions.value = list.map(i => ({ ...i, staffId: String(i.staffId) }));
-  });
   listIndustryCategory().then(res => industryOptions.value = res.data || res.rows || []);
   deptTreeSelect().then(res => deptOptions.value = res.data);
+  remoteLoadStaffs('');
 };
 
 const remoteLoadCustomers = (query) => {
   customerLoading.value = true;
-  listCustomerInfo({ pageNum: 1, pageSize: 500, isHighSeas: 'all' }).then(res => {
+  listCustomerInfo({ pageNum: 1, pageSize: 20, isHighSeas: 'all', customerName: query || undefined }).then(res => {
     const list = res.rows || [];
     localCustomerOptions.value = list.map(i => ({ ...i, customerNo: String(i.customerNo) }));
   }).finally(() => {
@@ -428,6 +431,16 @@ const remoteLoadCustomers = (query) => {
   });
 };
 
+const remoteLoadStaffs = (query) => {
+  staffLoading.value = true;
+  listComStaff({ pageNum: 1, pageSize: 20, staffName: query || undefined }).then(res => {
+    const list = res.rows || res.data || [];
+    userOptions.value = list.map(i => ({ ...i, staffId: String(i.staffId) }));
+  }).finally(() => {
+    staffLoading.value = false;
+  });
+};
+
 const getList = () => {
   loading.value = true;
   listLeads(proxy.addDateRange(queryParams, dateRange.value)).then(res => {

+ 17 - 5
src/views/saleManage/platformSelection/add.vue

@@ -61,7 +61,7 @@
             <el-col :span="8">
               <el-form-item label="项目负责人" prop="leader" label-for="leaderSelect">
                 <el-select id="leaderSelect" v-model="drawerForm.leader" style="width:100%" placeholder="请选择" filterable>
-                  <el-option v-for="item in options.user" :key="item.userId || item.staffId" :label="(item.userName || item.staffCode ? '(' + (item.userName || item.staffCode) + ') ' : '') + (item.nickName || item.staffName)" :value="String(item.userId || item.staffId)" />
+                  <el-option v-for="item in options.user" :key="item.staffId" :label="(item.userName || item.staffCode ? '(' + (item.userName || item.staffCode) + ') ' : '') + (item.nickName || item.staffName)" :value="String(item.staffId)" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -75,7 +75,7 @@
             <el-col :span="8">
               <el-form-item label="产品支持" prop="productSupport" label-for="productSupportSelect">
                 <el-select id="productSupportSelect" v-model="drawerForm.productSupport" style="width:100%" placeholder="请选择" filterable clearable>
-                  <el-option v-for="item in options.user" :key="item.userId || item.staffId" :label="(item.userName || item.staffCode ? '(' + (item.userName || item.staffCode) + ') ' : '') + (item.nickName || item.staffName)" :value="String(item.userId || item.staffId)" />
+                  <el-option v-for="item in options.user" :key="item.staffId" :label="(item.userName || item.staffCode ? '(' + (item.userName || item.staffCode) + ') ' : '') + (item.nickName || item.staffName)" :value="String(item.staffId)" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -255,8 +255,10 @@ import { addPlatformSelection } from '@/api/saleManage/platformSelection/index';
 import { listCustomerInfo } from "@/api/customer/customerInfo/index";
 import { getToken } from "@/utils/auth";
 import { Upload } from '@element-plus/icons-vue';
+import { useUserStore } from "@/store/modules/user";
 
 const proxy = getCurrentInstance().proxy;
+const userStore = useUserStore();
 
 const props = defineProps({
   modelValue: Boolean,
@@ -304,9 +306,16 @@ const remoteSearchCustomer = async (query) => {
   }
 };
 
+const getStaffId = () => {
+  if (!props.options || !props.options.user) return undefined;
+  const staff = props.options.user.find(u => String(u.userId) === String(userStore.userId));
+  return staff ? String(staff.staffId) : undefined;
+};
+
 // 每次打开抽屉时刷新客户列表
 watch(() => props.modelValue, (val) => {
   if (val) {
+    drawerForm.value.leader = getStaffId();
     remoteSearchCustomer('');
   }
 });
@@ -320,6 +329,7 @@ const drawerForm = ref({
   projectStatus: 1,
   bidPeriodType: 1,
   productSupport: undefined,
+  leader: getStaffId(),
   fileList: [],
   memberList: []
 });
@@ -332,6 +342,7 @@ const drawerRules = {
   customName: [{ required: true, message: '请选择客户名称', trigger: 'change' }],
   projectLevel: [{ required: true, message: '请选择项目级别', trigger: 'change' }],
   businessType: [{ required: true, message: '请选择项目类型', trigger: 'change' }],
+  leader: [{ required: true, message: '请选择项目负责人', trigger: 'change' }],
   projectName: [
     { required: true, message: '请输入项目名称', trigger: 'blur' },
     { max: 200, message: '项目名称不能超过200个字符', trigger: 'blur' }
@@ -397,14 +408,15 @@ const handleSubmit = async () => {
     if (valid) {
       submitting.value = true;
       try {
-        const leaderUser = props.options.user.find(u => String(u.userId || u.staffId) === String(drawerForm.value.leader));
+        const leaderUser = props.options.user.find(u => String(u.staffId) === String(drawerForm.value.leader));
         const postData = {
           ...drawerForm.value,
           leaderName: leaderUser ? (leaderUser.nickName || leaderUser.staffName) : '',
           condition: drawerForm.value.shortlistedRequirement,
           requirement: drawerForm.value.shortlistedRequirement,
           fileNo: drawerForm.value.fileList.map(f => f.ossId).filter(Boolean).join(','),
-          finalizationType: drawerForm.value.shortlistedType // 双向映射,兼容后端字段不统一
+          finalizationType: 1, // 固定为1代表平台入围
+          shortlistedType: drawerForm.value.shortlistedType // 确保字段不丢失
         };
         await addPlatformSelection(postData);
         proxy.$modal.msgSuccess("新增成功");
@@ -424,7 +436,7 @@ const handleUploadSuccess = (res, file) => {
       fileName: item.originalName || item.fileName || file.name,
       fileUrl: item.url || item.fileName || item.ossId,
       ossId: item.ossId,
-      createTime: new Date().toISOString()
+      createTime: proxy.parseTime(new Date())
     });
     proxy.$modal.msgSuccess("上传成功");
   } else {

+ 9 - 9
src/views/saleManage/platformSelection/edit.vue

@@ -452,10 +452,9 @@ const loadData = async () => {
       createTimeStr: data.createTimeStr || proxy.parseTime(data.createTime, '{y}-{m}-{d}')
     };
 
-    // 补全 productSupportName
     if (data.productSupport) {
-      const user = props.options.user?.find(u => String(u.userId || u.staffId) === String(data.productSupport));
-      drawerForm.value.productSupportName = user ? (user.nickName || user.staffName) : '';
+      const user = props.options.user?.find(u => String(u.staffId) === String(data.productSupport));
+      drawerForm.value.productSupportName = user ? user.staffName : '';
     }
     if (data.fileNo) {
       const ossRes = await listByIds(data.fileNo);
@@ -482,9 +481,9 @@ const loadData = async () => {
 };
 
 const handleProductSupportChange = (val) => {
-  const user = computedProductSupportOptions.value.find(u => String(u.userId || u.staffId) === String(val));
+  const user = computedProductSupportOptions.value.find(u => String(u.staffId) === String(val));
   if (user) {
-    drawerForm.value.productSupportName = user.nickName || user.staffName;
+    drawerForm.value.productSupportName = user.staffName;
   } else {
     drawerForm.value.productSupportName = undefined;
   }
@@ -496,14 +495,15 @@ const handleSubmit = async () => {
     if (valid) {
       submitting.value = true;
       try {
-        const leaderUser = props.options.user.find(u => String(u.userId || u.staffId) === String(drawerForm.value.leader));
+        const leaderUser = props.options.user.find(u => String(u.staffId) === String(drawerForm.value.leader));
         const postData = {
           ...drawerForm.value,
-          leaderName: leaderUser ? (leaderUser.nickName || leaderUser.staffName) : '',
+          leaderName: leaderUser ? leaderUser.staffName : '',
           condition: drawerForm.value.shortlistedRequirement,
           requirement: drawerForm.value.shortlistedRequirement,
           fileNo: drawerForm.value.fileList.map(f => f.ossId).filter(Boolean).join(','),
-          finalizationType: drawerForm.value.shortlistedType, // 双向映射,兼容后端字段不统一
+          finalizationType: 1, // 固定为1代表平台入围
+          shortlistedType: drawerForm.value.shortlistedType, // 确保字段不丢失
           profession: Array.isArray(drawerForm.value.profession) ? drawerForm.value.profession.join(',') : drawerForm.value.profession
         };
         await updatePlatformSelection(postData);
@@ -534,7 +534,7 @@ const handleUploadSuccess = (res, file) => {
       fileName: item.originalName || item.fileName || file.name,
       fileUrl: item.url || item.fileName || item.ossId,
       ossId: item.ossId,
-      createTime: new Date().toISOString()
+      createTime: proxy.parseTime(new Date())
     });
     proxy.$modal.msgSuccess("上传成功");
   } else {

+ 6 - 6
src/views/saleManage/platformSelection/index.vue

@@ -24,7 +24,7 @@
           <el-col :span="6">
             <el-form-item label="负责人" prop="leader">
               <el-select v-model="queryParams.leader" placeholder="请选择" style="width: 100%" clearable>
-                 <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                 <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -48,7 +48,7 @@
           <el-col :span="6">
             <el-form-item label="产品支持" prop="productSupport">
               <el-select v-model="queryParams.productSupport" placeholder="请选择" style="width: 100%" clearable>
-                 <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                 <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -176,7 +176,7 @@
         <el-table-column label="部门" align="center" prop="deptName" width="120" />
         <el-table-column label="业务负责人" align="center" prop="leaderName" width="100">
           <template #default="scope">
-            {{ scope.row.leaderName || scope.row.managerName || userOptions.find(u => String(u.staffId || u.userId) === String(scope.row.leader))?.staffName || '' }}
+            {{ scope.row.leaderName || scope.row.managerName || userOptions.find(u => String(u.staffId) === String(scope.row.leader))?.staffName || '' }}
           </template>
         </el-table-column>
         <el-table-column label="产品支持" align="center" prop="productSupportName" width="100">
@@ -302,7 +302,7 @@
       <el-form label-width="110px" style="padding: 10px 20px 0;">
         <el-form-item label="新负责人:" required>
           <el-select v-model="transferOwner" placeholder="请选择" style="width: 100%" filterable clearable>
-            <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+            <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
           </el-select>
         </el-form-item>
         <el-form-item label="">
@@ -632,8 +632,8 @@ const getOptions = () => {
 
 const findUserName = (id) => {
   if (!id) return '';
-  const user = userOptions.value.find(u => String(u.staffId || u.userId) === String(id));
-  return user ? (user.staffName || user.nickName) : id;
+  const user = userOptions.value.find(u => String(u.staffId) === String(id));
+  return user ? user.staffName : id;
 };
 
 onMounted(() => {

+ 14 - 5
src/views/saleManage/projectSelection/add.vue

@@ -62,14 +62,14 @@
               <el-col :span="8">
                 <el-form-item label="项目负责人" prop="leader">
                     <el-select v-model="form.leader" placeholder="请选择" style="width: 100%" clearable filterable @change="handleLeaderChange">
-                      <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                      <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId)" />
                     </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="8">
                 <el-form-item label="产品支持" prop="productSupport">
                     <el-select v-model="form.productSupport" placeholder="请选择" style="width: 100%" clearable filterable>
-                      <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                      <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId)" />
                     </el-select>
                 </el-form-item>
               </el-col>
@@ -214,6 +214,7 @@ import { addProjectSelection } from '@/api/saleManage/projectSelection/index';
 import { listCustomerInfo } from "@/api/customer/customerInfo/index";
 import { globalHeaders } from '@/utils/request';
 import { Upload } from '@element-plus/icons-vue';
+import { useUserStore } from "@/store/modules/user";
 
 const props = defineProps({
   modelValue: Boolean,
@@ -228,6 +229,7 @@ const props = defineProps({
 
 const emit = defineEmits(['update:modelValue', 'success']);
 const proxy = getCurrentInstance().proxy;
+const userStore = useUserStore();
 
 const visible = ref(false);
 const submitting = ref(false);
@@ -257,6 +259,7 @@ const rules = reactive({
   customName: [{ required: true, message: '客户名称不能为空', trigger: 'change' }],
   businessType: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
   projectLevel: [{ required: true, message: '项目类别不能为空', trigger: 'change' }],
+  leader: [{ required: true, message: '请选择项目负责人', trigger: 'change' }],
   projectName: [
     { required: true, message: '项目名称不能为空', trigger: 'blur' },
     { max: 200, message: '项目名称不能超过200个字符', trigger: 'blur' }
@@ -293,6 +296,12 @@ watch(() => props.modelValue, (val) => {
     remoteLoadCustomers('');
   }
 });
+const getStaffId = () => {
+  if (!props.userOptions) return undefined;
+  const staff = props.userOptions.find(u => String(u.userId) === String(userStore.userId));
+  return staff ? String(staff.staffId) : undefined;
+};
+
 watch(() => visible.value, (val) => { emit('update:modelValue', val); });
 
 const reset = () => {
@@ -303,7 +312,7 @@ const reset = () => {
     customNo: undefined,
     businessType: undefined,
     projectLevel: undefined,
-    leader: undefined,
+    leader: getStaffId(),
     productSupport: undefined,
     projectName: undefined,
     amount: undefined,
@@ -366,9 +375,9 @@ const handleCustomerChange = (val) => {
 const resetQuery = () => {}; // 占位符或不需要
 
 const handleLeaderChange = (val) => {
-  const user = props.userOptions.find(u => String(u.staffId || u.userId) === String(val));
+  const user = props.userOptions.find(u => String(u.staffId) === String(val));
   if (user) {
-    form.leaderName = user.staffName || user.nickName;
+    form.leaderName = user.staffName;
   } else {
     form.leaderName = undefined;
   }

+ 2 - 2
src/views/saleManage/projectSelection/detail.vue

@@ -901,7 +901,7 @@ const findIndustryLabel = () => {
 const findLeaderDeptName = (val) => {
   const leaderId = val || detailData.value.leader;
   // 优先从人员选项中匹配部门
-  const user = props.userOptions?.find(u => String(u.staffId || u.userId || u.id) === String(leaderId));
+  const user = props.userOptions?.find(u => String(u.staffId) === String(leaderId));
   const userDept = user ? (user.deptName || user.departmentName) : null;
   // 如果人员档案没带部门,则显示项目数据中存储的部门名称
   return userDept || detailData.value.deptName || '';
@@ -923,7 +923,7 @@ const findCompanyName = (val) => {
 
 const findUserName = (id) => {
   if (!id) return '';
-  const user = props.userOptions?.find(u => String(u.staffId || u.userId || u.id) === String(id));
+  const user = props.userOptions?.find(u => String(u.staffId) === String(id));
   return user ? (user.staffName || user.nickName) : id;
 };
 

+ 6 - 6
src/views/saleManage/projectSelection/edit.vue

@@ -297,7 +297,7 @@ const computedCompanyOptions = computed(() => {
 const computedUserOptions = computed(() => {
   const options = [...(props.userOptions || [])];
   if (form.leader && form.leaderName) {
-    const exists = options.some(i => String(i.staffId || i.userId) === String(form.leader));
+    const exists = options.some(i => String(i.staffId) === String(form.leader));
     if (!exists) options.unshift({ staffId: form.leader, staffName: form.leaderName });
   }
   return options;
@@ -306,7 +306,7 @@ const computedUserOptions = computed(() => {
 const computedProductSupportOptions = computed(() => {
   const options = [...(props.userOptions || [])];
   if (form.productSupport && form.productSupportName) {
-    const exists = options.some(i => String(i.staffId || i.userId) === String(form.productSupport));
+    const exists = options.some(i => String(i.staffId) === String(form.productSupport));
     if (!exists) options.unshift({ staffId: form.productSupport, staffName: form.productSupportName });
   }
   return options;
@@ -347,13 +347,13 @@ const loadDetail = (id) => {
 
     // 补全 productSupportName
     if (data.productSupport) {
-      const user = props.userOptions.find(u => String(u.staffId || u.userId) === String(data.productSupport));
+      const user = props.userOptions.find(u => String(u.staffId) === String(data.productSupport));
       form.productSupportName = user ? (user.staffName || user.nickName) : '';
     }
 
     // 部门回显
     if (form.leader) {
-      const user = props.userOptions?.find(u => String(u.staffId || u.userId) === String(form.leader));
+      const user = props.userOptions?.find(u => String(u.staffId) === String(form.leader));
       form.deptName = user ? (user.deptName || user.departmentName) : (data.deptName || '');
     } else {
       form.deptName = data.deptName || '';
@@ -452,7 +452,7 @@ const handleCustomerChange = (val) => {
 };
 
 const handleLeaderChange = (val) => {
-  const user = computedUserOptions.value.find(u => String(u.staffId || u.userId) === String(val));
+  const user = computedUserOptions.value.find(u => String(u.staffId) === String(val));
   if (user) {
     form.leaderName = user.staffName || user.nickName;
     form.deptName = user.deptName || user.departmentName || '';
@@ -463,7 +463,7 @@ const handleLeaderChange = (val) => {
 };
 
 const handleProductSupportChange = (val) => {
-  const user = computedProductSupportOptions.value.find(u => String(u.staffId || u.userId) === String(val));
+  const user = computedProductSupportOptions.value.find(u => String(u.staffId) === String(val));
   if (user) {
     form.productSupportName = user.staffName || user.nickName;
   } else {

+ 6 - 6
src/views/saleManage/projectSelection/index.vue

@@ -23,7 +23,7 @@
           <el-col :span="6">
             <el-form-item label="负责人" prop="managerId">
               <el-select v-model="queryParams.managerId" placeholder="请选择" style="width: 100%" clearable filterable>
-                <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -47,7 +47,7 @@
           <el-col :span="6">
             <el-form-item label="产品支持" prop="productSupport">
               <el-select v-model="queryParams.productSupport" placeholder="请选择" style="width: 100%" clearable filterable>
-                <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+                <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -300,7 +300,7 @@
        <el-form label-width="100px">
          <el-form-item label="新负责人" required>
             <el-select v-model="transferOwner" placeholder="请选择" style="width: 100%" filterable>
-              <el-option v-for="item in userOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
+              <el-option v-for="item in userOptions" :key="item.staffId" :label="(item.staffCode ? '(' + item.staffCode + ') ' : '') + item.staffName" :value="String(item.staffId)" />
             </el-select>
          </el-form-item>
          <el-form-item>
@@ -561,7 +561,7 @@ const handleTransfer = () => { transferVisible.value = true; };
 const confirmTransfer = async () => {
   if (!transferOwner.value) return proxy.$modal.msgWarning('请选择新负责人');
   const ids = multipleSelection.value.map(item => item.id);
-  const user = userOptions.value.find(u => String(u.staffId || u.userId) === String(transferOwner.value));
+  const user = userOptions.value.find(u => String(u.staffId) === String(transferOwner.value));
   try {
     await transferProjectSelection({ 
       ids, leader: transferOwner.value, leaderName: user?.staffName || user?.nickName || '',
@@ -611,8 +611,8 @@ const initOptions = () => {
 
 const findUserName = (id) => {
   if (!id) return '';
-  const user = userOptions.value.find(u => String(u.staffId || u.userId) === String(id));
-  return user ? (user.staffName || user.nickName) : id;
+  const user = userOptions.value.find(u => String(u.staffId) === String(id));
+  return user ? user.staffName : id;
 };
 
 onMounted(() => {