Explorar o código

我的公益相关接口联调

htc hai 1 día
pai
achega
cfa65f6fe3

+ 6 - 3
pages/nonprofit.vue

@@ -27,7 +27,7 @@
 	import NonprofitItem from '@/components/pages/nonprofitItem/index.vue'
 	import pageEmpty from '@/components/pageEmpty/index.vue'
 	import { ref, getCurrentInstance, watch } from 'vue'
-	import { onLoad } from '@dcloudio/uni-app'
+	import { onLoad, onShow } from '@dcloudio/uni-app'
 	const { proxy } = getCurrentInstance()
 	
 	const tidx = ref(1)
@@ -119,10 +119,13 @@
 		text.value = `暂无${statusCfg.value[newVal]}活动`;
 	})
 	
-	onLoad((options)=>{
+	onShow(()=>{
+		let pages = getCurrentPages();
+		let options = pages[pages.length-1]?.options;
 		queryParams.value.userId = uni.getStorageSync('userInfo')&&JSON.parse(uni.getStorageSync('userInfo')).id;
-		tidx.value = +options.type||1;
+		if(+options?.type) tidx.value = +options.type;
 		queryParams.value.activeState = tidx.value;
+		initList()
 		getList()
 	})
 </script>

+ 90 - 62
pagesHome/activityApply.vue

@@ -2,91 +2,91 @@
 	<view class="common_page adffc" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
 		<cus-header title="报名信息填写" bgColor="transparent"></cus-header>
 		<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/19/54b75bc8-d926-449b-95a5-1126f700b481.png" class="top_bg_img" mode="widthFix"></image>
-		<div class="box box1">
-			<div class="box1-top">
-				<div class="title">{{activity?.activityName||''}}</div>
-				<div class="tip">活动时间:{{activity?.activityStartTime||''}} 到 {{activity?.activityEndTime||''}}</div>
-				<div class="tip">活动地点:{{activity?.provinceName||''}}{{activity?.cityName||''}}{{activity?.address||''}}</div>
-			</div>
-			<div class="box1-bottom adfac">
+		<view class="box box1">
+			<view class="box1-top">
+				<view class="title">{{activity?.activityName||''}}</view>
+				<view class="tip">活动时间:{{activity?.activityStartTime||''}} 到 {{activity?.activityEndTime||''}}</view>
+				<view class="tip">活动地点:{{activity?.provinceName||''}}{{activity?.cityName||''}}{{activity?.address||''}}</view>
+			</view>
+			<view class="box1-bottom adfac">
 				<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/0f8ec76b-5c24-4d79-a77e-354d3e70bb36.png"></image>
 				<text>报名时间截止前可取消并返还{{activityLimitCfg[activity?.activityLimit]}},截止后不可取消。</text>
-			</div>
-		</div>
-		<div class="box box2">
-			<div class="box2-title">报名信息</div>
-			<div class="box2-members" v-if="selectMemberList.length">
-				<div class="box2-members-pre adfacjb" v-for="(item,index) in selectMemberList" :key="index">
-					<div class="box2-members-pre-left">
-						<div class="ltop adfac">
-							<div class="name">{{item.name}}</div>
+			</view>
+		</view>
+		<view class="box box2">
+			<view class="box2-title">报名信息</view>
+			<view class="box2-members" v-if="selectMemberList.length">
+				<view class="box2-members-pre adfacjb" v-for="(item,index) in selectMemberList" :key="index">
+					<view class="box2-members-pre-left">
+						<view class="ltop adfac">
+							<view class="name">{{item.name}}</view>
 							<image class="sex" v-if="item.gender==1" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/b6d1fcb3-55ba-4104-b8cd-756b963a4da8.png"></image>
 							<image class="sex" v-else-if="item.gender==0" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/a1899fd0-c468-48d9-b554-2f17b75a4157.png"></image>
-							<div class="age" :class="{'women':item.gender==1,'man':item.gender==0}">{{item.age}}岁</div>
-						</div>
-						<div class="lbottom">
+							<view class="age" :class="{'women':item.gender==1,'man':item.gender==0}">{{item.age}}岁</view>
+						</view>
+						<view class="lbottom">
 							身份证 {{item.idCardCopy}}
-						</div>
-					</div>
-					<div class="box2-members-pre-right" @click="deleteMember(item,index)">
+						</view>
+					</view>
+					<view class="box2-members-pre-right" @click="deleteMember(item,index)">
 						<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/bf4876c8-43bf-4eeb-a153-1414e567ed10.png"></image>
-					</div>
-				</div>
-			</div>
-			<div class="box2-add adfacjc" @tap="handleAdd">
+					</view>
+				</view>
+			</view>
+			<view class="box2-add adfacjc" @click="handleAdd">
 				<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/9aa7a091-d1fe-40a9-9a7e-846decf2d4e0.png"></image>
 				<text>添加</text>
-			</div>
-		</div>
-		<div class="box box3">
-			<div class="box3-pre adfacjb">
-				<div class="box3-pre-left">联系人姓名</div>
-				<div class="box3-pre-right">
+			</view>
+		</view>
+		<view class="box box3">
+			<view class="box3-pre adfacjb">
+				<view class="box3-pre-left">联系人姓名</view>
+				<view class="box3-pre-right">
 					<up-input v-model="submitDto.contact" border="none" style="font-size: 30rpx;color: #151B29;text-align: right;" placeholder="请输入联系人姓名"></up-input>
-				</div>
-			</div>
-			<div class="box3-pre adfacjb">
-				<div class="box3-pre-left">联系人电话</div>
-				<div class="box3-pre-right">
+				</view>
+			</view>
+			<view class="box3-pre adfacjb">
+				<view class="box3-pre-left">联系人电话</view>
+				<view class="box3-pre-right">
 					<up-input v-model="submitDto.contactPhone" border="none" style="font-size: 30rpx;color: #151B29;text-align: right;" placeholder="请输入联系人电话"></up-input>
-				</div>
-			</div>
-		</div>
-		<div class="box box4 adfacjb">
-			<div class="box4-left">专享券抵扣</div>
-			<div class="box4-right adfac" @tap="handleSelectTicket">
-				<text>{{'暂无可用专享券'}}</text>
+				</view>
+			</view>
+		</view>
+		<view class="box box4 adfacjb" v-if="activity?.activityLimit==2" @click="handleSelectTicket">
+			<view class="box4-left">专享券抵扣</view>
+			<view class="box4-right adfac">
+				<text>{{ticketText}}</text>
 				<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/4d3329f1-7421-4bde-a7dd-5175a7748f8f.png"></image>
-			</div>
-		</div>
-		<div class="cbottom">
-			<div class="cbottom-top adfac" @tap="changeAgree">
+			</view>
+		</view>
+		<view class="cbottom">
+			<view class="cbottom-top adfac" @click="changeAgree">
 				<image v-if="agree" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/87b5b244-d14f-43cd-991b-4ac9f48d909e.png"></image>
 				<image v-else src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/b8a5cabd-57f8-4ad7-9677-f6372423c50a.png"></image>
 				<text>我已知晓并同意活动组织方获取以上我所提交的报名信息。</text>
-			</div>
-			<div class="cbottom-btn adfacjb">
-				<div class="cbottom-btn-left adffcac">
+			</view>
+			<view class="cbottom-btn adfacjb">
+				<view class="cbottom-btn-left adffcac">
 					<template v-if="activity?.activityLimit<3">
-						<div class="heart adfac">
+						<view class="heart adfac">
 							<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/ab188fd0-afcc-4d76-a1d6-de367af3e756.png"></image>
 							<text>{{payValue}}</text>
-						</div>
-						<div class="text">{{activityLimitCfg[activity?.activityLimit]||''}}</div>
+						</view>
+						<view class="text">{{activityLimitCfg[activity?.activityLimit]||''}}</view>
 					</template>
 					<template v-else>
 						<view class="free">免费</view>
 					</template>
-				</div>
-				<div class="cbottom-btn-right" @click="handleApply">确定报名</div>
-			</div>
-		</div>
+				</view>
+				<view class="cbottom-btn-right" @click="handleApply">确定报名</view>
+			</view>
+		</view>
 	</view>
 </template>
 
 <script setup name="">
 	import CusHeader from '@/components/CusHeader/index.vue'
-	import { ref, getCurrentInstance } from 'vue'
+	import { ref, getCurrentInstance, onMounted } from 'vue'
 	import { onLoad } from '@dcloudio/uni-app'
 	const { proxy } = getCurrentInstance()
 	
@@ -107,6 +107,9 @@
 	})
 	const agree = ref(false)
 	const payValue = ref(0)
+	const userLoveTicket = ref(null)
+	const selectCouponIds = ref([])
+	const ticketText = ref('暂无可用专享券')
 	
 	const handleAdd = () => {
 		uni.navigateTo({
@@ -122,18 +125,30 @@
 	
 	const handleSelectTicket = () => {
 		uni.navigateTo({
-			url:'/pagesMy/exclusiveScroll'
+			url:'/pagesMy/exclusiveScroll?activityId='+activity.value?.id,
+			events:{
+				'selectTickets': data => {
+					selectCouponIds.value = data;
+					ticketText.value = `已选${data?.length||0}张,剩余${userLoveTicket.value?.couponIds?.length-data?.length}张可用`;
+				}
+			}
 		})
 	}
 	
-	const handleApply = () => {
+	const handleApply = async () => {
 		if(selectMemberList.value.length===0) return proxy.$showToast('请至少添加一位报名人员')
 		if(!submitDto.value.contact) return proxy.$showToast('请输入联系人姓名')
 		if(!proxy.$reg.mobile(submitDto.value.contactPhone)) return proxy.$showToast('请输入正确的联系电话')
-		if(!agree.value) return proxy.$showToast('请勾选已知晓并同意')
 		submitDto.value.memberIds = selectMemberList.value.map(m=>m.id);
 		submitDto.value.activityId = activity.value.id;
 		submitDto.value.userId = JSON.parse(uni.getStorageSync('userInfo')).id;
+		if(activity.value?.activityLimit==2){
+			let smnum = selectMemberList.value.length;
+			let stnum = selectCouponIds.value.length;
+			if(stnum<smnum) return proxy.$showToast(`请选择${smnum}张专享券`)
+		}
+		submitDto.value.couponIds = selectCouponIds.value;
+		if(!agree.value) return proxy.$showToast('请勾选已知晓并同意')
 		
 		proxy.$api.post('/core/activity/signup/signup',submitDto.value).then(({data:res})=>{
 			if(res.code!==0) return proxy.$showToast(res.msg)
@@ -143,6 +158,15 @@
 		})
 	}
 	
+	const getUserLoveTicket = () => {
+		let userId = JSON.parse(uni.getStorageSync('userInfo'))?.id;
+		proxy.$api.get(`/core/activity/signup/userAsset/${userId}/${activity.value?.id}`).then(({data:res})=>{
+			if(res.code!==0) return proxy.$showToast(res.msg)
+			userLoveTicket.value = res.data;
+			ticketText.value = `剩余${res.data?.couponIds?.length||0}张可用`;
+		})
+	}
+	
 	const changeAgree = () => {
 		agree.value = !agree.value;
 	}
@@ -155,6 +179,10 @@
 	onLoad(options=>{
 		activity.value = options.activity&&JSON.parse(decodeURIComponent(options.activity))
 	})
+	
+	onMounted(()=>{
+		getUserLoveTicket()
+	})
 </script>
 
 <style scoped lang="scss">

+ 0 - 20
pagesHome/activityDetail.vue

@@ -254,8 +254,6 @@
 	//立即报名
 	const handleApply = async () => {
 		let { loveValue, couponIds } = await getUserLoveTicket();
-		// url:'/pagesHome/signSuccess'
-		// url:'/pagesHome/fillNonprofitArchives'
 		let url = `/pagesHome/activityApply?activity=${encodeURIComponent(JSON.stringify(activityInfo.value))}`;
 		
 		if((activityInfo.value?.activityLimit==1&&loveValue<activityInfo?.value.valueLimit)
@@ -289,24 +287,6 @@
 		uni.reLaunch({
 			url:'/pages/nonprofit?type=2'
 		})
-		// try{
-		// 	uni.scanCode({
-		// 		success: (res) => {
-		// 			if(res.errMsg=='scanCode:ok'){
-		// 				let { id } = JSON.parse(res.result)
-		// 				console.log(id);
-		// 				proxy.$api.get('/xx',this.params).then(({data:res})=>{
-		// 					if(res.code!==0) return proxy.$showToast(res.msg)
-		// 				})
-		// 			}else proxy.$showToast(res.errMsg)
-		// 		},
-		// 		fail: (err) => {
-		// 			proxy.$showToast('扫描异常,请稍后再试')
-		// 		}
-		// 	})
-		// }catch(e){
-		// 	proxy.$showToast('签到异常,请稍后再试')
-		// }
 	}
 	//填写公益档案
 	const handleFill = () => {

+ 38 - 16
pagesHome/fillNonprofitArchives.vue

@@ -2,28 +2,28 @@
 	<view class="common_page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
 		<cus-header title="填写公益档案" bgColor="transparent"></cus-header>
 		<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/19/54b75bc8-d926-449b-95a5-1126f700b481.png" class="top_bg_img" mode="widthFix"></image>
-		<div class="box">
+		<div class="box" v-if="activity">
 			<div class="box-title">活动信息</div>
 			<div class="box-pre adf">
 				<div class="box-pre-left">活动名称</div>
-				<div class="box-pre-right">{{'让孩子成为小小自然守护者'}}</div>
+				<div class="box-pre-right">{{activity?.activityName||''}}</div>
 			</div>
 			<div class="box-pre adf">
-				<div class="box-pre-left">学生姓名</div>
-				<div class="box-pre-right">{{'周飒然'}}</div>
+				<div class="box-pre-left">人员姓名</div>
+				<div class="box-pre-right">{{activity?.memberName||''}}</div>
 			</div>
 			<div class="box-pre adf">
 				<div class="box-pre-left">参与时间</div>
-				<div class="box-pre-right">{{'2025年7月30日'}}</div>
+				<div class="box-pre-right">{{activity?.signinTime||''}}</div>
 			</div>
 			<div class="box-pre adf">
 				<div class="box-pre-left">公益支持</div>
-				<div class="box-pre-right">{{'种植沙漠沙沙树2棵'}}</div>
+				<div class="box-pre-right">{{activity?.channelName||''}}</div>
 			</div>
 		</div>
 		<div class="box">
 			<div class="box-title">活动心得</div>
-			<up-textarea v-model="xxx" placeholder="请分享参加公益活动心得,至少输入10个字~" count border="none" style="height: 250rpx;margin-top: 28rpx;padding: 0;font-size: 26rpx;color: #252525;"></up-textarea>
+			<up-textarea v-model="experience" placeholder="请分享参加公益活动心得,至少输入10个字~" count border="none" style="height: 250rpx;margin-top: 28rpx;padding: 0;font-size: 26rpx;color: #252525;"></up-textarea>
 		</div>
 		<div class="box">
 			<div class="box-title">活动照片<text>(分享活动照片)</text></div>
@@ -48,9 +48,13 @@
 
 <script setup name="">
 	import CusHeader from '@/components/CusHeader/index.vue'
-	import { ref } from 'vue'
+	import { BaseApi } from '../common/api/baseApi';
+	import { onLoad } from '@dcloudio/uni-app'
+	import { ref, getCurrentInstance } from 'vue'
+	const { proxy } = getCurrentInstance()
 	
-	const xxx = ref('')
+	const activity = ref(null)
+	const experience = ref('')
 	const fileList = ref([])
 	
 	const deletePic = (event) => {
@@ -84,26 +88,44 @@
 	const uploadFilePromise = (url) => {
 	  return new Promise((resolve, reject) => {
 	    let a = uni.uploadFile({
-	      url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
+	      url: BaseApi+'/uploadFile',
 	      filePath: url,
 	      name: 'file',
-	      formData: {
-	        user: 'test',
-	      },
 	      success: (res) => {
 	        setTimeout(() => {
-	          resolve(res.data.data);
+				let data = JSON.parse(res.data)
+				if(data&&data.code===0){
+					resolve(data.data);
+				}else proxy.$showToast(data?.msg)
 	        }, 1000);
 	      },
+		  fail: err =>{
+			resolve('');
+		  }
 	    });
 	  });
 	};
 	
 	const handleSubmit = () => {
-		uni.navigateTo({
-			url:'/pagesHome/fillNonprofitResult'
+		if(!experience.value) return proxy.$showToast('请输入活动心得')
+		if(fileList.value.length===0) return proxy.$showToast('请上传活动照片')
+		let activityFile = fileList.value.map(f=>f.url).join(';')
+		proxy.$api.post('/core/activity/signup/addArchive',{
+			activityFile,
+			activityId:activity.value?.activityId,
+			experience:experience.value,
+			memberId:activity.value?.memberId
+		}).then(({data:res})=>{
+			if(res.code!==0) return proxy.$showToast(res.msg)
+			uni.navigateTo({
+				url:'/pagesHome/fillNonprofitResult'
+			})
 		})
 	}
+	
+	onLoad((options)=>{
+		if(options.activity) activity.value = JSON.parse(decodeURIComponent(options.activity));
+	})
 </script>
 
 <style scoped lang="scss">

+ 139 - 51
pagesMy/exclusiveScroll.vue

@@ -1,71 +1,134 @@
 <template>
 	<view class="common_page adffc" :style="{'height':h+'px', 'padding-top':mt+'px'}">
 		<cus-header title="我的专享卷" bgColor="#FFFFFF"></cus-header>
-		<div class="tab adf">
-			<div class="tab-pre adfacjc" :class="{'active':tidx===0}" @tap="changeTab(0)">未使用</div>
-			<div class="tab-pre adfacjc" :class="{'active':tidx===1}" @tap="changeTab(1)">已使用</div>
-			<div class="tab-pre adfacjc" :class="{'active':tidx===2}" @tap="changeTab(2)">已过期</div>
-		</div>
-		<div class="list" v-if="list.length">
-			<up-list @scrolltolower="scrolltolower" style="height: 100%;">
-				<up-list-item v-for="(item, index) in list" :key="index">
-					<div class="box" :style="{'margin-top':index===0?0:'24rpx'}" :class="{'grey':tidx!==0}">
-						<image class="box-img" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/09/4320f839-19f2-484f-a827-f2b403bb00ff.png" v-if="tidx===1"></image>
-						<image class="box-img" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/09/106a02e0-e979-42a5-979b-0d934d6690f6.png" v-if="tidx===2"></image>
-						<div class="box-top">
-							<div class="box-top-title">{{'活动专享卷'}}</div>
-							<div class="box-top-tip">{{'环保知识知多少? 让孩子成为大自然的守护者!'}}</div>
-							<div class="box-top-date adfacjb">
-								<div class="box-top-date-left">有效期至{{'2025.07.30 23:59'}}</div>
-								<div class="box-top-date-right" v-if="tidx===0">立即使用</div>
-							</div>
-						</div>
-						<div class="box-bottom adf" @tap="handleExpand(item,index)">
-							<div class="box-bottom-left">
-								<div class="h" v-if="!item.select">本券仅限报名指定活动使用,不可用于其他场景</div>
-								<div class="s" v-else>
-									<div class="p">1.适用范围:本券仅限报名指定活动使用;</div>
-									<div class="p">2.使用方式:在报名指定活动时将自动抵扣爱心值;</div> 
-									<div class="p">3.不退不换:券一经使用,不可退还、不可取消;</div>
-									<div class="p">4.有效期:请于券面标注日期前使用,逾期自动失效。</div>
-								</div>
-							</div>
-							<div class="box-bottom-right">
-								<up-icon name="arrow-right" color="#CBCBCB" size="32rpx" v-if="!item.select"></up-icon>
-								<up-icon name="arrow-up" color="#CBCBCB" size="32rpx" v-else></up-icon>
-							</div>
-						</div>
-					</div>
-				</up-list-item>
-			</up-list>
-		</div>
-		<div class="empty adffcacjc" v-else>
-			<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/09/478d380c-2d22-4ce0-828f-b6b454571a6c.png"></image>
-			<text>没有卷</text>
-		</div>
+		<view class="tab adf">
+			<view class="tab-pre adfacjc" :class="{'active':tidx===0}" @click="changeTab(0,0)">未使用</view>
+			<view class="tab-pre adfacjc" :class="{'active':tidx===1}" @click="changeTab(1,1)">已使用</view>
+			<view class="tab-pre adfacjc" :class="{'active':tidx===2}" @click="changeTab(2,-1)">已过期</view>
+		</view>
+		<template v-if="list.length">
+			<view class="list">
+				<up-list @scrolltolower="scrolltolower" style="height: 100%;">
+					<up-list-item v-for="(item, index) in list" :key="index">
+						<view class="box" :style="{'margin-top':index===0?0:'24rpx'}" :class="{'grey':tidx!==0}">
+							<image class="box-img" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/09/4320f839-19f2-484f-a827-f2b403bb00ff.png" v-if="tidx===1"></image>
+							<image class="box-img" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/09/106a02e0-e979-42a5-979b-0d934d6690f6.png" v-if="tidx===2"></image>
+							<view class="box-top" @click="handleCheck(item,index)">
+								<template v-if="queryParams.activityId&&tidx===0">
+									<image class="box-check" v-if="item.check" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/87b5b244-d14f-43cd-991b-4ac9f48d909e.png"></image>
+									<image class="box-check" v-else src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/b8a5cabd-57f8-4ad7-9677-f6372423c50a.png"></image>
+								</template>
+								<view class="box-top-title">活动专享卷</view>
+								<view class="box-top-tip">{{item?.activityName||''}}</view>
+								<view class="box-top-date adfacjb">
+									<view class="box-top-date-left">有效期至{{item?.expiredTime||''}}</view>
+									<view class="box-top-date-right" v-if="item?.state===0&&!queryParams.activityId" @click="handleUse(item)">立即使用</view>
+								</view>
+							</view>
+							<view class="box-bottom adf" @click="handleExpand(item,index)">
+								<view class="box-bottom-left">
+									<view class="h" v-if="!item.select">本券仅限报名指定活动使用,不可用于其他场景</view>
+									<view class="s" v-else>
+										<view class="p">1.适用范围:本券仅限报名指定活动使用;</view>
+										<view class="p">2.使用方式:在报名指定活动时将自动抵扣爱心值;</view> 
+										<view class="p">3.不退不换:券一经使用,不可退还、不可取消;</view>
+										<view class="p">4.有效期:请于券面标注日期前使用,逾期自动失效。</view>
+									</view>
+								</view>
+								<view class="box-bottom-right">
+									<up-icon name="arrow-right" color="#CBCBCB" size="32rpx" v-if="!item.select"></up-icon>
+									<up-icon name="arrow-up" color="#CBCBCB" size="32rpx" v-else></up-icon>
+								</view>
+							</view>
+						</view>
+					</up-list-item>
+				</up-list>
+			</view>
+			<view class="confirm" v-if="queryParams.activityId&&tidx===0" @click="confirmCheck">确定,已选择{{selectNum}}张专享券</view>
+		</template>
+		<view class="dataEmpty" v-else>
+			<page-empty text='没有券'></page-empty>
+		</view>
 	</view>
 </template>
 
 <script setup name="">
 	import CusHeader from '@/components/CusHeader/index.vue'
-	import { ref } from 'vue'
+	import PageEmpty from '@/components/pageEmpty/index.vue'
+	import { ref, getCurrentInstance } from 'vue'
+	import { onLoad } from '@dcloudio/uni-app'
+	const { proxy } = getCurrentInstance()
 	
 	const tidx = ref(0)
-	const list = ref(
-		[{status:0,select:false},
-		{status:0,select:false},
-		{status:0,select:false},
-		{status:0,select:false},
-		{status:0,select:false}]
-	)
+	const queryParams = ref({
+		page:1,
+		limit:10,
+		activityId:'',
+		state:0,
+		userId:''
+	})
+	const isOver = ref(false)
+	const list = ref([])
+	const selectNum = ref(0)
 
-	const changeTab = index => {
+	const changeTab = (index,status) => {
 		tidx.value = index;
+		queryParams.value.state = status;
+		init()
+		getList()
+	}
+	
+	const scrolltolower = () => {
+		if(isOver.value) return
+		getList()
+	}
+	
+	const handleCheck = (item,index) => {
+		list.value[index].check = !list.value[index].check;
+		selectNum.value = list.value.filter(l=>l.check).length;
 	}
 	
 	const handleExpand = (item,index) => {
 		list.value[index].select = !list.value[index].select;
 	}
+	
+	const init = () =>{
+		queryParams.value.page = 1;
+		isOver.value = false;
+		list.value = [];
+	}
+	
+	const getList = () => {
+		proxy.$api.get('/core/activity/coupon/page',queryParams.value).then(({data:res})=>{
+			if(res.code!==0) return proxy.$showToast(res.msg)
+			list.value = res.data.list;
+			list.value.forEach(l=>{
+				l.select = false;
+				l.check = false;
+			})
+			queryParams.value.page++;
+			if(res.data.list.length===0) isOver.value = true;
+		})
+	}
+	
+	const handleUse = item => {
+		uni.navigateTo({
+			url:'/pagesHome/activityDetail?id='+item.activityId
+		})
+	}
+	
+	const confirmCheck = () => {
+		if(list.value.filter(l=>l.check).length===0) return proxy.$showToast('请至少选择一张专享券')
+		let selectIds = list.value.filter(l=>l.check).map(l=>l.id);
+		proxy.getOpenerEventChannel().emit('selectTickets',selectIds);
+		uni.navigateBack();
+	}
+	
+	onLoad((options)=>{
+		queryParams.value.activityId = options?.activityId||'';
+		queryParams.value.userId = JSON.parse(uni.getStorageSync('userInfo')).id;
+		getList()
+	})
 </script>
 
 <style scoped lang="scss">
@@ -119,6 +182,14 @@
 					top: 0;
 					right: 0;
 				}
+				&-check{
+					width: 42rpx;
+					height: 42rpx;
+					border-radius: 50%;
+					position: absolute;
+					top: 30rpx;
+					right: 30rpx;
+				}
 				&-top{
 					border-radius: 24rpx 24rpx 0 0;
 					padding: 40rpx 24rpx 24rpx;
@@ -205,6 +276,23 @@
 			}
 		}	
 	
+		.confirm{
+			width: calc(100% - 100rpx);
+			padding: 0 40rpx;
+			margin: 40rpx auto 64rpx;
+			display: inline-block;
+			height: 90rpx;
+			background: #B7F358;
+			border-radius: 45rpx;
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #151B29;
+			line-height: 90rpx;
+			text-align: center;
+			letter-spacing: 2rpx;
+		}
+	
 		.empty{
 			flex: 1;
 			image{

+ 159 - 77
pagesNonprofit/nonprofitDetail.vue

@@ -2,84 +2,94 @@
 	<view class="common_page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
 		<cus-header title="公益活动详情" bgColor="transparent"></cus-header>
 		<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/19/54b75bc8-d926-449b-95a5-1126f700b481.png" class="top_bg_img" mode="widthFix"></image>
-		<div class="top">
-			<div class="top-status adfacjb">
-				<div class="left">{{signupStateDict[info?.signupState]||'未知'}}</div>
-				<div class="right" v-if="info?.activityLimit==1"><span>{{info?.valueLimit||0}}</span>爱心值</div>
-				<div class="right" v-else-if="info?.activityLimit==2"><span>{{info?.valueLimit||0}}</span>张专享券</div>
-				<div class="right" v-else-if="info?.activityLimit==3"><span>免费</span></div>
-			</div>
-			<div class="top-no">善行少年编号:{{info?.uniqueNo||''}}</div>
-		</div>
-		<div class="box box1 adf" style="margin-top: 30rpx;">
-			<div class="box1-left">
+		<view class="top">
+			<view class="top-status adfacjb">
+				<view class="left">{{signupStateDict[info?.signupState]||'未知'}}</view>
+				<view class="right" v-if="info?.activityLimit==1"><span>{{info?.valueLimit||0}}</span>爱心值</view>
+				<view class="right" v-else-if="info?.activityLimit==2"><span>{{info?.valueLimit||0}}</span>张专享券</view>
+				<view class="right" v-else-if="info?.activityLimit==3"><span>免费</span></view>
+			</view>
+			<view class="top-no">善行少年编号:{{info?.uniqueNo||''}}</view>
+		</view>
+		<view class="box box1 adf" style="margin-top: 30rpx;">
+			<view class="box1-left">
 				<image :src="info?.coverFile||''"></image>
-			</div>
-			<div class="box1-right">
-				<div class="title">{{info?.activityName||''}}</div>
-				<div class="memo">{{info?.loveValueContent||''}}</div>
-			</div>
-		</div>
-		<div class="box box2">
-			<div class="box-title">活动信息</div>
-			<div class="box2-item adf">
-				<div class="left">报名时间</div>
-				<div class="right">{{info?.signupStartTime||''}} ~ {{info?.signupEndTime||''}}</div>
-			</div>
-			<div class="box2-item adf">
-				<div class="left">活动时间</div>
-				<div class="right">{{info?.activityStartTime||''}} ~ {{info?.activityEndTime||''}}</div>
-			</div>
-			<div class="box2-item adf">
-				<div class="left">活动地点</div>
-				<div class="right">{{info?.provinceName||''}}{{info?.cityName||''}}</div>
-			</div>
-			<div class="box2-item adf">
-				<div class="left">招募人数</div>
-				<div class="right">{{info?.recruitmentNow||0}}/{{info?.recruitmentMax||'无限制'}}</div>
-			</div>
-			<div class="box2-item adf">
-				<div class="left">联系人</div>
-				<div class="right">{{info?.activityContact||''}}/{{info?.activityContactPhone||''}}</div>
-			</div>
-			<div class="box2-item adf">
-				<div class="left">公益支持</div>
-				<div class="right">{{info?.channelName||''}}</div>
-			</div>
-		</div>
-		<div class="box box3">
-			<div class="box-title">报名信息</div>
-			<div class="box3-list">
-				<div class="box3-list-item adfacjb">
-					<div class="left">
-						<div class="top adfac">
-							<div class="name">{{info?.memberName||''}}</div>
+			</view>
+			<view class="box1-right">
+				<view class="title">{{info?.activityName||''}}</view>
+				<view class="memo">{{info?.loveValueContent||''}}</view>
+			</view>
+		</view>
+		<view class="box box2">
+			<view class="box-title">活动信息</view>
+			<view class="box2-item adf">
+				<view class="left">报名时间</view>
+				<view class="right">{{info?.signupStartTime||''}} ~ {{info?.signupEndTime||''}}</view>
+			</view>
+			<view class="box2-item adf">
+				<view class="left">活动时间</view>
+				<view class="right">{{info?.activityStartTime||''}} ~ {{info?.activityEndTime||''}}</view>
+			</view>
+			<view class="box2-item adf">
+				<view class="left">活动地点</view>
+				<view class="right">{{info?.provinceName||''}}{{info?.cityName||''}}</view>
+			</view>
+			<view class="box2-item adf">
+				<view class="left">招募人数</view>
+				<view class="right">{{info?.recruitmentNow||0}}/{{info?.recruitmentMax||'无限制'}}</view>
+			</view>
+			<view class="box2-item adf">
+				<view class="left">联系人</view>
+				<view class="right">{{info?.activityContact||''}}/{{info?.activityContactPhone||''}}</view>
+			</view>
+			<view class="box2-item adf">
+				<view class="left">公益支持</view>
+				<view class="right">{{info?.channelName||''}}</view>
+			</view>
+		</view>
+		<view class="box box3">
+			<view class="box-title">报名信息</view>
+			<view class="box3-list">
+				<view class="box3-list-item adfacjb">
+					<view class="left">
+						<view class="top adfac">
+							<view class="name">{{info?.memberName||''}}</view>
 							<image class="sex" v-if="info?.gender==1" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/b6d1fcb3-55ba-4104-b8cd-756b963a4da8.png"></image>
 							<image class="sex" v-else-if="info?.gender==0" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/12/a1899fd0-c468-48d9-b554-2f17b75a4157.png"></image>
-							<div class="age" :class="{'women':info?.gender==1,'man':info?.gender==0}">{{info?.age}}岁</div>
-						</div>
-						<div class="left-bottom">身份证 {{info?.idCardCopy}}</div>
-					</div>
-				</div>
-			</div>
-		</div>
-		<div class="user">
-			<div class="user-pre adfacjb">
-				<div class="user-pre-left">联系人姓名</div>
-				<div class="user-pre-right">{{info?.contact||''}}</div>
-			</div>
-			<div class="user-pre adfacjb">
-				<div class="user-pre-left">联系人电话</div>
-				<div class="user-pre-right">{{info?.contactPhone||''}}</div>
-			</div>
-		</div>
-		<div class="bottom adfacjb">
-			<div class="right" @click="handleCancel" v-if="info?.activeState==1&&info?.signupState==1">取消报名</div>
-			<div class="right" @click="handleSignup" v-if="info?.activeState==1&&info?.signupState==-1">立即报名</div>
-			<div class="right" v-if="info?.activeState==2&&info?.signupState==1">去签到</div>
-			<div class="right" v-if="info?.activeState==3&&info?.signupState==2">写档案</div>
-			<div class="right" v-if="info?.activeState==3&&info?.signupState==3">查看档案</div>
-		</div>
+							<view class="age" :class="{'women':info?.gender==1,'man':info?.gender==0}">{{info?.age}}岁</view>
+						</view>
+						<view class="left-bottom">身份证 {{info?.idCardCopy}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="user">
+			<view class="user-pre adfacjb">
+				<view class="user-pre-left">联系人姓名</view>
+				<view class="user-pre-right">{{info?.contact||''}}</view>
+			</view>
+			<view class="user-pre adfacjb">
+				<view class="user-pre-left">联系人电话</view>
+				<view class="user-pre-right">{{info?.contactPhone||''}}</view>
+			</view>
+		</view>
+		<view class="user" v-if="info?.activityLimit==2">
+			<view class="user-pre adfacjb" @click="handleSelectTicket">
+				<view class="user-pre-left">专享券抵扣</view>
+				<view class="user-pre-right adfac">
+					<text>{{ticketText}}</text>
+					<image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/4d3329f1-7421-4bde-a7dd-5175a7748f8f.png"></image>
+				</view>
+			</view>
+		</view>
+		<view class="bottom adfacjb">
+			<view class="right" @click="handleCancel" v-if="info?.activeState==1&&info?.signupState==1">取消报名</view>
+			<view class="right" @click="handleApply" v-else-if="info?.activeState==1&&info?.signupState==-1">立即报名</view>
+			<view class="right" @click="handleSignup" v-else-if="info?.activeState==2&&info?.signupState==1">去签到</view>
+			<view class="right grey" v-else-if="info?.activeState==2&&info?.signupState==2">已签到</view>
+			<view class="right" @click="handleFill" v-else-if="info?.activeState==3&&info?.signupState==2">写档案</view>
+			<view class="right" @click="handleReview" v-else-if="info?.activeState==3&&info?.signupState==3">查看档案</view>
+		</view>
 	</view>
 </template>
 
@@ -97,6 +107,9 @@
 		2:'已签到',
 		3:'已填档案'
 	})
+	const userLoveTicket = ref(null)
+	const selectCouponIds = ref([])
+	const ticketText = ref('暂无可用专享券')
 
 	const getUserActivityDetail = () => {
 		proxy.$api.get(`/core/activity/signup/myActivityInfo/${memberSignupId.value}`).then(({data:res})=>{
@@ -104,6 +117,7 @@
 			info.value = res.data;
 			info.value.age = getAge(info.value.idCard);
 			info.value.idCardCopy = info.value.idCard.replace(/^(\d{6})(\d{8})(\d{3}[\dX])$/i,'$1********$3');
+			getUserLoveTicket()
 		})
 	}
 	
@@ -154,9 +168,14 @@
 		})
 	}
 	
-	const handleSignup = () => {
+	const handleApply = () => {
+		let couponId = '';
+		if(info.value?.activityLimit==2){
+			if(selectCouponIds.value.length==0) return proxy.$showToast(`请选择1张专享券`)
+			couponId = selectCouponIds.value[0];
+		} 
 		proxy.$api.post(`/core/activity/signup/signupBySingle`,{
-			couponId:'',
+			couponId,
 			memberSignupId:memberSignupId.value,
 			userId:JSON.parse(uni.getStorageSync('userInfo')).id
 		}).then(({data:res})=>{
@@ -165,6 +184,61 @@
 			proxy.$showToast('报名成功')
 		})
 	}
+	
+	const handleSignup = () => {
+		try{
+			uni.scanCode({
+				success: (res) => {
+					if(res.errMsg=='scanCode:ok'){
+						let { id } = JSON.parse(res.result)
+						proxy.$api.post('/core/activity/signup/signinBySingle',{
+							memberSignupId:memberSignupId.value,
+							userId:JSON.parse(uni.getStorageSync('userInfo')).id
+						}).then(({data:res})=>{
+							if(res.code!==0) return proxy.$showToast(res.msg)
+							uni.navigateTo({
+								url:'/pagesHome/signSuccess'
+							})
+						})
+					}else proxy.$showToast(res.errMsg)
+				},
+				fail: (err) => {
+					proxy.$showToast('扫描异常,请稍后再试')
+				}
+			})
+		}catch(e){
+			proxy.$showToast('签到异常,请稍后再试')
+		}
+	}
+	const handleFill = () => {
+		uni.navigateTo({
+			url:'/pagesHome/fillNonprofitArchives?activity='+encodeURIComponent(JSON.stringify(info.value))
+		})
+	}
+	const handleReview = () => {
+		
+	}
+	
+	const getUserLoveTicket = () => {
+		let userId = JSON.parse(uni.getStorageSync('userInfo'))?.id;
+		proxy.$api.get(`/core/activity/signup/userAsset/${userId}/${info.value?.activityId}`).then(({data:res})=>{
+			if(res.code!==0) return proxy.$showToast(res.msg)
+			userLoveTicket.value = res.data;
+			ticketText.value = `剩余${res.data?.couponIds?.length||0}张可用`;
+		})
+	}
+	
+	const handleSelectTicket = () => {
+		uni.navigateTo({
+			url:'/pagesMy/exclusiveScroll?activityId='+info.value?.activityId,
+			events:{
+				'selectTickets': data => {
+					selectCouponIds.value = data;
+					ticketText.value = `已选${data?.length||0}张,剩余${userLoveTicket.value?.couponIds?.length-data?.length}张可用`;
+				}
+			}
+		})
+	}
 
 	onLoad((options)=>{
 		memberSignupId.value = options?.memberSignupId;
@@ -376,6 +450,11 @@
 					color: #252525;
 					line-height: 30rpx;
 					text-align: right;
+					image{
+						width: 32rpx;
+						height: 32rpx;
+						margin-left: 20rpx;
+					}
 				}
 			}
 		}
@@ -412,6 +491,9 @@
 				line-height: 90rpx;
 				text-align: center;
 				letter-spacing: 2rpx;
+				&.grey{
+					background: #F7F7F7;
+				}
 			}
 		}