diff --git a/src/api/membership/MembershipTagMember.ts b/src/api/membership/MembershipTagMember.ts new file mode 100644 index 0000000..ba2d669 --- /dev/null +++ b/src/api/membership/MembershipTagMember.ts @@ -0,0 +1,126 @@ +import { http } from "@/utils/http"; + +/** + * 会员标签关联数据传输对象 + */ +export interface MembershipTagMemberDTO { + /** 主键,自动递增 */ + id?: number; + /** 企业微信ID */ + corpid?: string; + /** 标签ID */ + tagId?: number; + /** 汇邦云用户ID */ + ab98UserId?: number; + /** 微信用户ID */ + wxUserId?: number; + /** 创建者ID */ + creatorId?: number; + /** 创建时间 */ + createTime?: string; + /** 更新者ID */ + updaterId?: number; + /** 更新时间 */ + updateTime?: string; + /** 标签名称(可选,通过关联查询或缓存获取) */ + tagName?: string; +} + +/** + * 会员标签关联查询参数 + */ +export interface SearchMembershipTagMemberQuery extends BasePageQuery { + /** 企业微信ID */ + corpid?: string; + /** 标签ID */ + tagId?: number; + /** 汇邦云用户ID */ + ab98UserId?: number; + /** 微信用户ID */ + wxUserId?: number; +} + +/** + * 添加会员标签关联命令 + */ +export interface AddMembershipTagMemberCommand { + /** 企业微信ID */ + corpid?: string; + /** 标签ID */ + tagId: number; + /** 汇邦云用户ID */ + ab98UserId?: number; + /** 微信用户ID */ + wxUserId?: number; +} + +/** + * 更新会员标签关联命令 + */ +export interface UpdateMembershipTagMemberCommand extends AddMembershipTagMemberCommand { + /** 主键,自动递增 */ + id: number; +} + +/** + * 获取会员标签关联列表 + */ +export const getMembershipTagMemberListApi = (params: SearchMembershipTagMemberQuery) => { + return http.request>>("get", "/membership/tagMembers", { params }); +}; + +/** + * 获取标签关联详情 + */ +export const getMembershipTagMemberDetailApi = (id: number) => { + return http.request>("get", `/membership/tagMembers/${id}`); +}; + +/** + * 添加会员标签关联 + */ +export const addMembershipTagMemberApi = (data: AddMembershipTagMemberCommand) => { + return http.request>("post", "/membership/tagMembers", { data }); +}; + +/** + * 更新会员标签关联 + */ +export const updateMembershipTagMemberApi = (id: number, data: UpdateMembershipTagMemberCommand) => { + return http.request>("put", `/membership/tagMembers/${id}`, { data }); +}; + +/** + * 删除会员标签关联 + */ +export const deleteMembershipTagMemberApi = (ids: number[]) => { + return http.request>("delete", `/membership/tagMembers/${ids.join(',')}`); +}; + +/** + * 根据标签ID查询关联用户 + */ +export const getMembershipTagMemberByTagIdApi = (tagId: number) => { + return http.request>("get", `/membership/tagMembers/byTag/${tagId}`); +}; + +/** + * 根据汇邦云用户ID查询标签 + */ +export const getMembershipTagMemberByAb98UserIdApi = (ab98UserId: number) => { + return http.request>("get", `/membership/tagMembers/byAb98User/${ab98UserId}`); +}; + +/** + * 根据微信用户ID查询标签 + */ +export const getMembershipTagMemberByWxUserIdApi = (wxUserId: number) => { + return http.request>("get", `/membership/tagMembers/byWxUser/${wxUserId}`); +}; + +/** + * 获取用户的所有标签 + */ +export const getUserTagsApi = (params: { corpid: string; ab98UserId?: number; wxUserId?: number }) => { + return http.request>("get", "/membership/tagMembers/userTags", { params }); +}; \ No newline at end of file diff --git a/src/api/membership/membershipTag.ts b/src/api/membership/membershipTag.ts new file mode 100644 index 0000000..eaca1a5 --- /dev/null +++ b/src/api/membership/membershipTag.ts @@ -0,0 +1,98 @@ +import { http } from "@/utils/http"; + +/** + * 会员标签数据传输对象 + */ +export interface MembershipTagDTO { + /** 主键,自动递增 */ + id?: number; + /** 企业微信ID */ + corpid?: string; + /** 标签名称 */ + name?: string; + /** 标签颜色(十六进制代码) */ + color?: string; + /** 标签说明 */ + remark?: string; + /** 状态:0-禁用 1-启用 */ + status?: number; + /** 创建者ID */ + creatorId?: number; + /** 创建时间 */ + createTime?: string; + /** 更新者ID */ + updaterId?: number; + /** 更新时间 */ + updateTime?: string; +} + +/** + * 会员标签查询参数 + */ +export interface MembershipTagQuery extends BasePageQuery { + /** 企业微信ID */ + corpid?: string; + /** 标签名称 */ + name?: string; + /** 状态:0-禁用 1-启用 */ + status?: number; +} + +/** + * 添加会员标签命令 + */ +export interface AddMembershipTagCommand { + /** 企业微信ID */ + corpid?: string; + /** 标签名称 */ + name: string; + /** 标签颜色(十六进制代码) */ + color?: string; + /** 标签说明 */ + remark?: string; + /** 状态:0-禁用 1-启用 */ + status?: number; +} + +/** + * 更新会员标签命令 + */ +export interface UpdateMembershipTagCommand extends AddMembershipTagCommand { + /** 主键,自动递增 */ + id: number; +} + +/** + * 获取会员标签列表 + */ +export const getMembershipTagListApi = (params: MembershipTagQuery) => { + return http.request>>("get", "/membership/tags", { params }); +}; + +/** + * 获取标签详情 + */ +export const getMembershipTagDetailApi = (id: number) => { + return http.request>("get", `/membership/tags/${id}`); +}; + +/** + * 添加会员标签 + */ +export const addMembershipTagApi = (data: AddMembershipTagCommand) => { + return http.request>("post", "/membership/tags", { data }); +}; + +/** + * 更新会员标签 + */ +export const updateMembershipTagApi = (id: number, data: UpdateMembershipTagCommand) => { + return http.request>("put", `/membership/tags/${id}`, { data }); +}; + +/** + * 删除会员标签 + */ +export const deleteMembershipTagApi = (ids: number[]) => { + return http.request>("delete", `/membership/tags/${ids.join(',')}`); +}; diff --git a/src/views/membership/tag/index.vue b/src/views/membership/tag/index.vue new file mode 100644 index 0000000..139aa2b --- /dev/null +++ b/src/views/membership/tag/index.vue @@ -0,0 +1,485 @@ + + + + + \ No newline at end of file diff --git a/src/views/user/ab98/detail.vue b/src/views/user/ab98/detail.vue index 6ccfd9b..dd7a6bc 100644 --- a/src/views/user/ab98/detail.vue +++ b/src/views/user/ab98/detail.vue @@ -4,7 +4,8 @@ import { useRoute } from "vue-router"; import { type Ab98UserDetailDTO, getAb98UserDetailApi } from "@/api/ab98/user"; import { type WxUserDTO, getWxUserDetailApi } from "@/api/wx/wxUser"; import { getOrderListApi, type OrderDTO } from "@/api/shop/order"; -import { Ab98UserTagDTO, addAb98UserTagApi, deleteAb98UserTagConfirmApi, getAb98UserTagListApi } from "@/api/ab98/tag"; +import { MembershipTagMemberDTO, getUserTagsApi, addMembershipTagMemberApi, deleteMembershipTagMemberApi } from "@/api/membership/MembershipTagMember"; +import { getMembershipTagListApi, addMembershipTagApi, type MembershipTagDTO } from "@/api/membership/membershipTag"; import { ElMessage, ElMessageBox } from "element-plus"; import { PureTableBar } from "@/components/RePureTableBar"; import { useWxStore } from "@/store/modules/wx"; @@ -20,11 +21,12 @@ const wxStore = useWxStore(); const userInfo = ref({}); const userType = ref<'ab98' | 'wx'>('ab98'); // 用户类型:ab98用户或微信用户 const loading = ref(false); -const tags = ref([]); +const tags = ref([]); const tagsLoading = ref(false); const showAddTagDialog = ref(false); +const availableTags = ref([]); const addTagForm = ref({ - tagName: '' + tagId: null as number | null }); const balanceVisible = ref(false); @@ -102,28 +104,48 @@ async function fetchUserTags() { if (userType.value !== 'ab98') return; tagsLoading.value = true; - const { data } = await getAb98UserTagListApi({ - ab98UserId: (userInfo.value as Ab98UserDetailDTO).ab98UserId, - pageSize: 6, - pageNum: 1 + const { data } = await getUserTagsApi({ + corpid: wxStore.corpid, + ab98UserId: (userInfo.value as Ab98UserDetailDTO).ab98UserId }); - tags.value = data.rows; + tags.value = data; } finally { tagsLoading.value = false; } } +async function fetchAvailableTags() { + try { + const { data } = await getMembershipTagListApi({ + corpid: wxStore.corpid, + pageNum: 1, + pageSize: 100 + }); + availableTags.value = data.rows; + } catch (error) { + console.error('Failed to fetch available tags:', error); + } +} + async function handleAddTag() { try { if (userType.value !== 'ab98') return; + if (!addTagForm.value.tagId) { + ElMessage.warning('请选择一个标签'); + return; + } tagsLoading.value = true; - await addAb98UserTagApi({ - ab98UserId: (userInfo.value as Ab98UserDetailDTO).ab98UserId, - tagName: addTagForm.value.tagName + + // 将标签关联到用户 + await addMembershipTagMemberApi({ + corpid: wxStore.corpid, + tagId: addTagForm.value.tagId, + ab98UserId: (userInfo.value as Ab98UserDetailDTO).ab98UserId }); + showAddTagDialog.value = false; - addTagForm.value.tagName = ''; + addTagForm.value.tagId = null; await fetchUserTags(); ElMessage.success('标签添加成功'); } catch (error) { @@ -133,7 +155,7 @@ async function handleAddTag() { } } -async function handleDeleteTag(tagId: number) { +async function handleDeleteTag(id: number) { try { await ElMessageBox.confirm('确定要删除这个标签吗?', '提示', { confirmButtonText: '确定', @@ -141,7 +163,7 @@ async function handleDeleteTag(tagId: number) { type: 'warning' }); tagsLoading.value = true; - await deleteAb98UserTagConfirmApi(tagId); + await deleteMembershipTagMemberApi([id]); await fetchUserTags(); ElMessage.success('标签删除成功'); } catch (error) { @@ -155,11 +177,17 @@ async function handleDeleteTag(tagId: number) { onMounted(() => { fetchUserDetail(); + fetchAvailableTags(); }); async function handleModifyBalance() { balanceVisible.value = true; } + +async function handleShowAddTagDialog() { + await fetchAvailableTags(); + showAddTagDialog.value = true; +}