diff --git a/src/views/member/List.vue b/src/views/member/List.vue
index d9b7bd4..9f49e89 100644
--- a/src/views/member/List.vue
+++ b/src/views/member/List.vue
@@ -47,7 +47,8 @@
@@ -245,6 +281,15 @@
:title="enableTarget.jieshao"
:description="`会员 ID:${enableTarget.huiyuan_id}`"
/>
+
@@ -258,10 +303,26 @@
-
+
+
+
+
+
+
-
+
@@ -300,6 +361,16 @@ const memberList = ref([])
const priceNote = ref('')
const clubId = ref('xq')
const isAllClubScope = computed(() => getAdminClubScope() === 'all')
+const clubSubMemberOptions = computed(() =>
+ (memberList.value || []).filter(
+ (m) => !m.is_bundle && m.huiyuan_id !== currentMember.value?.huiyuan_id,
+ ),
+)
+const enableSubMemberOptions = computed(() =>
+ (memberList.value || []).filter(
+ (m) => !m.is_bundle && m.huiyuan_id !== enableTarget.value?.huiyuan_id,
+ ),
+)
const detailDialogVisible = ref(false)
const isEditMode = ref(false)
@@ -371,7 +442,8 @@ function defaultClubPriceForm() {
trial_price: 0,
trial_days: 7,
trial_guanshifc: 0,
- trial_zuzhangfc: 0
+ trial_zuzhangfc: 0,
+ included_huiyuan_ids: [],
}
}
@@ -389,6 +461,8 @@ function normalizeMember(member) {
trial_zuzhangfc: Number(member.trial_zuzhangfc || 0),
card_image: member.card_image || '',
card_bg: member.card_bg || '',
+ is_bundle: Boolean(member.is_bundle),
+ included_huiyuan_ids: Array.isArray(member.included_huiyuan_ids) ? [...member.included_huiyuan_ids] : [],
}
}
@@ -502,6 +576,10 @@ const saveMember = async () => {
if (!validatePriceSplit(m.jiage, m.guanshifc, m.zuzhangfc, m.trial_enabled, m.trial_price, m.trial_guanshifc, m.trial_zuzhangfc)) {
return
}
+ if (m.is_bundle && (!m.included_huiyuan_ids || m.included_huiyuan_ids.length === 0)) {
+ ElMessage.error('总会员请至少选择一个包含的子会员')
+ return
+ }
try {
await ElMessageBox.confirm('确定保存修改吗?', '确认', {
confirmButtonText: '确认',
@@ -523,6 +601,7 @@ const saveMember = async () => {
jtjieshao: m.jtjieshao || '',
card_image: m.card_image || '',
card_bg: m.card_bg || '',
+ included_huiyuan_ids: m.is_bundle ? (m.included_huiyuan_ids || []) : undefined,
...buildTrialPayload(m)
})
if (res.code === 0) {
@@ -557,7 +636,8 @@ const openAddDialog = () => {
jiage: 0,
guanshifc: 0,
zuzhangfc: 0,
- jtjieshao: ''
+ jtjieshao: '',
+ is_bundle: false,
}
addDialogVisible.value = true
}
@@ -594,7 +674,8 @@ const submitAdd = async () => {
jiage: addForm.value.jiage,
guanshifc: addForm.value.guanshifc,
zuzhangfc: addForm.value.zuzhangfc,
- jtjieshao: addForm.value.jtjieshao || ''
+ jtjieshao: addForm.value.jtjieshao || '',
+ is_bundle: addForm.value.is_bundle,
})
if (res.code === 0) {
ElMessage.success('创建成功')
@@ -640,8 +721,11 @@ const closeCatalogDialog = () => {
}
const openEnableDialog = (item) => {
- enableTarget.value = item
+ enableTarget.value = { ...item, is_bundle: Boolean(item.is_bundle) }
enableForm.value = defaultClubPriceForm()
+ if (item.is_bundle) {
+ enableForm.value.trial_enabled = false
+ }
enableDialogVisible.value = true
catalogDialogVisible.value = false
}
@@ -666,16 +750,32 @@ const submitEnable = async () => {
if (!validatePriceSplit(f.jiage, f.guanshifc, f.zuzhangfc, f.trial_enabled, f.trial_price, f.trial_guanshifc, f.trial_zuzhangfc)) {
return
}
+ if (enableTarget.value.is_bundle) {
+ if (!f.included_huiyuan_ids || f.included_huiyuan_ids.length === 0) {
+ ElMessage.error('总会员请至少选择一个包含的子会员')
+ return
+ }
+ if (enableSubMemberOptions.value.length === 0) {
+ ElMessage.error('请先将至少一个普通会员上架,再配置总会员')
+ return
+ }
+ }
enabling.value = true
try {
- const res = await request.post(JITUAN_API.memberEnable, {
+ const payload = {
username: username.value,
huiyuan_id: enableTarget.value.huiyuan_id,
jiage: f.jiage,
+ formal_days: f.formal_days,
guanshifc: f.guanshifc,
zuzhangfc: f.zuzhangfc,
- ...buildTrialPayload(f)
- })
+ ...buildTrialPayload(f),
+ }
+ if (enableTarget.value.is_bundle) {
+ payload.trial_enabled = false
+ payload.included_huiyuan_ids = f.included_huiyuan_ids
+ }
+ const res = await request.post(JITUAN_API.memberEnable, payload)
if (res.code === 0) {
ElMessage.success('上架成功')
enableDialogVisible.value = false
@@ -860,6 +960,18 @@ onMounted(() => {
border-radius: 8px;
background: #0d2137;
}
+.member-card-hint {
+ font-size: 12px;
+ color: #8ab3cf;
+}
+.member-card-scope-tip {
+ margin-bottom: 12px;
+}
+.form-hint-inline {
+ margin-left: 8px;
+ font-size: 12px;
+ color: #8ab3cf;
+}
.no-permission {
text-align: center;
padding: 80px 20px;