|
|
@@ -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 {
|