소스 검색

fix: 修复渠道选择的多个问题(接口路径、竞态、range-key等)

Developer 4 일 전
부모
커밋
73eb1839ea
1개의 변경된 파일39개의 추가작업 그리고 37개의 파일을 삭제
  1. 39 37
      pagesMy/familyMemberVindicate.vue

+ 39 - 37
pagesMy/familyMemberVindicate.vue

@@ -83,11 +83,12 @@
 			<view class="pre adfac">
 				<view class="pre-title">会员渠道</view>
 				<view class="pre-content">
-					<picker :range="channelList" range-key="name" :value="selectedChannelIndex" @change="(e) => { selectedChannelIndex = e.detail.value; if(e.detail.value >= 0) selectedChannelId = String(channelList[e.detail.value].id) }">
+					<picker v-if="channelList.length > 0" :range="channelList" range-key="channelName" :value="selectedChannelIndex" @change="onChannelChange">
 						<view style="font-size: 30rpx;color: #252525;text-align: right;">
-							{{ selectedChannelIndex >= 0 ? channelList[selectedChannelIndex].name : '请选择渠道' }}
+							{{ selectedChannelIndex >= 0 ? channelList[selectedChannelIndex].channelName : '请选择渠道' }}
 						</view>
 					</picker>
+					<view v-else style="font-size: 30rpx;color: #A1A4A9;text-align: right;">暂无可用渠道</view>
 				</view>
 			</view>
 		</view>
@@ -129,14 +130,17 @@
 					return
 				}
 				channelList.value = res.data || []
+				// 若 loadMemberChannel 已先完成并设置了 selectedChannelId,补充同步 index
+				if (selectedChannelId.value) {
+					const idx = channelList.value.findIndex(c => String(c.id) === selectedChannelId.value)
+					if (idx >= 0) selectedChannelIndex.value = idx
+				}
 				resolve()
 			})
 		})
 	}
 
 	const loadMemberChannel = async (memberId) => {
-		// 等待渠道列表加载完成
-		await loadChannelList()
 		proxy.$api.get('/app/member/channelList', { memberId }).then(({ data: res }) => {
 			if (res.code !== 0) return
 			const list = res.data || []
@@ -168,40 +172,38 @@
 		proxy.$api[memberInfo.value.id?'put':'post']('/core/family/member',memberInfo.value).then(({data:res})=>{
 			if(res.code!==0) return proxy.$showToast(res.msg)
 			const memberId = memberInfo.value.id || res.data?.id
-			// 保存渠道
-			if(selectedChannelId.value && memberId) {
-				proxy.$api.post('/app/member/channel', {
-					memberId: memberId,
-					channelId: selectedChannelId.value
-				}).then(({data:channelRes})=>{
-					if(channelRes.code!==0) return proxy.$showToast(channelRes.msg)
-					proxy.$showToast(memberInfo.value.id?'编辑成功':'添加成功')
-					setTimeout(()=>{
-						if(turnType.value==='my'){
-							uni.reLaunch({
-								url:'/pages/my'
-							})
-							return
-						}
-						uni.redirectTo({
-							url:'/pagesMy/familyMember'
-						})
-					},1000)
-				})
-			} else {
-				proxy.$showToast(memberInfo.value.id?'编辑成功':'添加成功')
-				setTimeout(()=>{
-					if(turnType.value==='my'){
-						uni.reLaunch({
-							url:'/pages/my'
-						})
-						return
-					}
-					uni.redirectTo({
-						url:'/pagesMy/familyMember'
-					})
-				},1000)
+			if (memberId) {
+				setMemberChannel(memberId)  // 异步,不 await,不阻断跳转
 			}
+			proxy.$showToast(memberInfo.value.id?'编辑成功':'添加成功')
+			setTimeout(()=>{
+				if(turnType.value==='my'){
+					uni.reLaunch({
+						url:'/pages/my'
+					})
+					return
+				}
+				uni.redirectTo({
+					url:'/pagesMy/familyMember'
+				})
+			},1000)
+		})
+	}
+
+	const onChannelChange = (e) => {
+		const idx = e.detail.value
+		selectedChannelIndex.value = idx
+		selectedChannelId.value = String(channelList.value[idx].id)
+	}
+
+	const setMemberChannel = (memberId) => {
+		proxy.$api.post('/app/member/setChannels', {
+			memberId,
+			channelIds: selectedChannelId.value
+		}).then(({ data: res }) => {
+			if (res.code !== 0) proxy.$showToast(res.msg)
+		}).catch(() => {
+			proxy.$showToast('渠道设置失败,请稍后重试')
 		})
 	}