diff --git a/src/api/ab98/user.ts b/src/api/ab98/user.ts index 2996825..8ef252f 100644 --- a/src/api/ab98/user.ts +++ b/src/api/ab98/user.ts @@ -39,6 +39,8 @@ export interface Ab98UserDTO { wxNickName?: string; /** 微信用户openid */ wxUserOpenid?: string; + /** 微信用户头像 */ + wxAvatar?: string; } export interface Ab98UserDetailDTO { /** 主键ID */ @@ -87,7 +89,8 @@ export interface Ab98UserQuery extends BasePageQuery { tel?: string; /** 身份证号码 */ idnum?: string; - tagName?: string; + /** 标签ID,多个标签ID用逗号分隔 */ + tagIds?: string; /** 绑定汇邦云 false未绑定 true已绑定 null 全部 */ hasAb98UserId?: boolean; } diff --git a/src/views/membership/tag/index.vue b/src/views/membership/tag/index.vue index 139aa2b..9579b51 100644 --- a/src/views/membership/tag/index.vue +++ b/src/views/membership/tag/index.vue @@ -244,6 +244,23 @@ const drawerRules = reactive({ ] }); +const getIconByName = (name: string) => { + switch (name) { + case 'Search': + return useRenderIcon(Search); + case 'Refresh': + return useRenderIcon(Refresh); + case 'Plus': + return useRenderIcon(Plus); + case 'Edit': + return useRenderIcon(Edit); + case 'Delete': + return useRenderIcon(Delete); + default: + return ''; + } +} + onMounted(() => { getList(); }); @@ -265,19 +282,19 @@ onMounted(() => { - + 搜索 - + 重置 - + 新增标签 @@ -311,10 +328,10 @@ onMounted(() => {
- + 编辑 - + 删除
diff --git a/src/views/user/ab98/detail.vue b/src/views/user/ab98/detail.vue index 8835ae0..d1e2622 100644 --- a/src/views/user/ab98/detail.vue +++ b/src/views/user/ab98/detail.vue @@ -164,7 +164,15 @@ async function fetchAvailableTags() { pageNum: 1, pageSize: 100 }); - availableTags.value = data.rows; + // 过滤掉用户已经拥有的标签(如果用户标签已加载) + if (tags.value.length > 0) { + const userTagIds = tags.value.map(tag => tag.tagId); + console.log('userTagIds:', userTagIds); + console.log('availableTags before filter:', data.rows); + availableTags.value = data.rows.filter(tag => !userTagIds.includes(tag.id)); + } else { + availableTags.value = data.rows; + } } catch (error) { console.error('Failed to fetch available tags:', error); } @@ -190,6 +198,8 @@ async function handleAddTag() { showAddTagDialog.value = false; addTagForm.value.tagId = null; await fetchUserTags(); + // 重新获取可用标签列表,过滤掉用户新添加的标签 + await fetchAvailableTags(); ElMessage.success('标签添加成功'); } catch (error) { ElMessage.error('标签添加失败'); @@ -256,16 +266,24 @@ async function handleShowAddTagDialog() { + +
+
+ + {{ tag.tagName }} + +
+ 添加标签 +
+
@@ -291,20 +309,9 @@ async function handleShowAddTagDialog() { {{ formatFenToYuan((userInfo as Ab98UserDetailDTO).balance) - }} + }} {{ formatFenToYuan((userInfo as Ab98UserDetailDTO).useBalance) - }} - -
-
- - {{ tag.tagName }} - -
- 添加标签 -
-
+ }} @@ -403,7 +408,7 @@ async function handleShowAddTagDialog() { + }} \ No newline at end of file diff --git a/src/views/user/ab98/index.vue b/src/views/user/ab98/index.vue index cf02b47..eeb85cb 100644 --- a/src/views/user/ab98/index.vue +++ b/src/views/user/ab98/index.vue @@ -12,7 +12,7 @@ import Refresh from "@iconify-icons/ep/refresh"; import Plus from "@iconify-icons/ep/plus"; import { useRouter } from "vue-router"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; -import { getAb98UserTagNamesApi } from "@/api/ab98/tag"; +import { getMembershipTagListApi, type MembershipTagQuery } from "@/api/membership/membershipTag"; import { formatFenToYuan } from "@/utils/currency"; defineOptions({ @@ -22,13 +22,13 @@ defineOptions({ const router = useRouter(); const formRef = ref(); const wxStore = useWxStore(); -const tagOptions = ref([]); -const searchFormParams = reactive({ +const tagOptions = ref<{ label: string; value: number }[]>([]); +const searchFormParams = reactive({ corpid: wxStore.corpid || "", name: undefined, tel: undefined, idnum: undefined, - tagName: undefined, + tagIds: undefined, hasAb98UserId: undefined, search: undefined }); @@ -62,8 +62,16 @@ async function onSearch() { async function getList() { CommonUtils.fillPaginationParams(searchFormParams, pagination); + // 处理标签ID数组转换为逗号分隔的字符串 + const params = { ...searchFormParams }; + if (params.tagIds && Array.isArray(params.tagIds) && params.tagIds.length > 0) { + params.tagIds = params.tagIds.join(','); + } else { + Reflect.deleteProperty(params, 'tagIds'); + } + pageLoading.value = true; - const { data } = await getAb98UserListApiWithWx(searchFormParams).finally( + const { data } = await getAb98UserListApiWithWx(params).finally( () => { pageLoading.value = false; } @@ -98,6 +106,7 @@ const resetForm = formEl => { if (!formEl) return; formEl.resetFields(); searchFormParams.hasAb98UserId = undefined; + searchFormParams.tagIds = undefined; onSearch(); }; @@ -172,10 +181,26 @@ const addMemberRules = reactive({ onMounted(() => { getList(); - getAb98UserTagNamesApi().then(res => { - tagOptions.value = res.data; + getMembershipTagListApi({ corpid: wxStore.corpid || "" }).then(res => { + tagOptions.value = res.data.rows.map(tag => ({ + label: tag.name || '', + value: tag.id || 0 + })); }); -}) +}); + +const getIconByName = (name: string) => { + switch (name) { + case 'Search': + return useRenderIcon(Search); + case 'Refresh': + return useRenderIcon(Refresh); + case 'Plus': + return useRenderIcon(Plus); + default: + return ''; + } +}