浏览代码

修改下拉

sunshibo 2 天之前
父节点
当前提交
3b88b9e95d
共有 1 个文件被更改,包括 51 次插入3 次删除
  1. 51 3
      src/views/storeDecoration/personnelConfig/index.vue

+ 51 - 3
src/views/storeDecoration/personnelConfig/index.vue

@@ -255,7 +255,9 @@
           <el-input v-model="formData.name" placeholder="请输入" maxlength="20" show-word-limit clearable />
         </el-form-item>
         <el-form-item label="人员职位*" prop="position">
-          <el-input v-model="formData.position" placeholder="请输入" maxlength="50" clearable />
+          <el-select v-model="formData.position" placeholder="请选择" filterable clearable style="width: 100%">
+            <el-option v-for="opt in staffPositionOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
+          </el-select>
         </el-form-item>
         <el-form-item label="背景*" prop="backgroundImages">
           <div class="background-upload-three-col">
@@ -353,7 +355,8 @@ import {
   getTitleDetail,
   deleteTitle,
   setTopStatus,
-  setOnlineStatus
+  setOnlineStatus,
+  queryStaffTitle
 } from "@/api/modules/storeDecoration";
 
 // 人员接口
@@ -725,6 +728,47 @@ const formData = reactive({
   description: ""
 });
 
+/** 人员职位下拉:来自 storeStaffTitle/query */
+const staffPositionOptions = ref<{ label: string; value: string }[]>([]);
+
+const getPersonnelStoreId = (): string | number | undefined => {
+  return localGet("geeker-user")?.userInfo?.storeId || localGet("createdId");
+};
+
+async function loadStaffPositionOptions() {
+  const storeId = getPersonnelStoreId();
+  if (!storeId) {
+    staffPositionOptions.value = [];
+    return;
+  }
+  try {
+    const res: any = await queryStaffTitle({ storeId });
+    const inner = res?.data;
+    const raw = Array.isArray(inner) ? inner : (inner?.records ?? inner?.list ?? []);
+    const arr = Array.isArray(raw) ? raw : [];
+    const seen = new Set<string>();
+    const list: { label: string; value: string }[] = [];
+    for (const item of arr) {
+      const title = String(item.titleName ?? item.name ?? item.positionName ?? "").trim();
+      if (!title || seen.has(title)) continue;
+      seen.add(title);
+      list.push({ label: title, value: title });
+    }
+    staffPositionOptions.value = list;
+  } catch {
+    staffPositionOptions.value = [];
+  }
+}
+
+/** 编辑回显:接口返回的职位若不在当前标题列表中,仍补一条可选 */
+function mergeLegacyPositionOption(position: string) {
+  const v = (position || "").trim();
+  if (!v) return;
+  if (!staffPositionOptions.value.some(o => o.value === v)) {
+    staffPositionOptions.value = [{ label: v, value: v }, ...staffPositionOptions.value];
+  }
+}
+
 // 同步组件内部文件列表到 formData(避免上传中因过滤 blob 导致列表被清空或重复)
 const syncFileListFromComponent = async () => {
   if (!backgroundImagesUploadRef.value || !dialogVisible.value) return;
@@ -928,7 +972,7 @@ watch(
 // 表单校验规则
 const rules = reactive<FormRules>({
   name: [{ required: true, message: "请输入姓名/昵称", trigger: "blur" }],
-  position: [{ required: true, message: "请输入人员职位", trigger: "blur" }],
+  position: [{ required: true, message: "请选择人员职位", trigger: "change" }],
   avatar: [{ required: true, message: "请上传头像", trigger: "change" }],
   backgroundImages: [
     {
@@ -1356,6 +1400,7 @@ const openCreateDialog = async () => {
     editId.value = null;
     resetForm();
     uploadComponentKey.value += 1;
+    await loadStaffPositionOptions();
     dialogVisible.value = true;
   } catch (error: any) {
     // 如果检查标题时出错,记录错误但允许继续创建人员(避免阻塞用户)
@@ -1374,6 +1419,7 @@ const openCreateDialog = async () => {
     editId.value = null;
     resetForm();
     uploadComponentKey.value += 1;
+    await loadStaffPositionOptions();
     dialogVisible.value = true;
   }
 };
@@ -1438,6 +1484,8 @@ const editPersonnel = async (person: Personnel, index: number) => {
 
       // 强制背景上传组件重新挂载,避免沿用上次的 _fileList 导致数量显示错误
       uploadComponentKey.value += 1;
+      await loadStaffPositionOptions();
+      mergeLegacyPositionOption(formData.position);
       // 打开对话框
       dialogVisible.value = true;
     } else {