/** * 捐款记录相关 Mixin * 提供捐款记录的数据获取、搜索、分页等功能 */ import { getDonorList } from '@/api/donor/donor.js' import { getInstitutionalDetail } from '@/api/institutionalStructure/institutionalStructureDetail.js' export const donationMixin = { data() { return { // 捐款记录相关数据 donationList: [], projectInfo: {}, loading: false, searchKeyword: '', formedId: '', // 分页参数 pageNum: 1, pageSize: 10, hasMore: true } }, computed: { // 计算总造价(从项目详情获取,如果没有则计算捐款总和) totalAmount() { return this.projectInfo.totalAmount || this.donationList.reduce((sum, item) => sum + item.amount, 0) }, // 计算参与捐款人次(从项目详情获取,如果没有则计算捐款记录数量) participantCount() { return this.projectInfo.donorCount || this.donationList.length } }, methods: { /** * 获取项目详情 */ async loadProjectInfo() { if (!this.formedId) { console.error('缺少项目ID') return } try { const response = await getInstitutionalDetail(this.formedId) console.log('项目详情API响应:', response) if (response.code === 200) { // 根据实际后端数据结构获取项目信息 console.log('项目详情数据结构:', { hasData: !!response.data, hasRows: !!response.rows, dataType: typeof response.data, rowsType: typeof response.rows }) if (response.data) { this.projectInfo = response.data console.log('使用 response.data 作为项目信息') } else if (response.rows) { this.projectInfo = response.rows console.log('使用 response.rows 作为项目信息') } else { this.projectInfo = {} console.log('未找到项目信息,使用空对象') } console.log('项目信息:', this.projectInfo) } else { console.error('获取项目信息失败:', response.msg) uni.showToast({ title: response.msg || '获取项目信息失败', icon: 'none' }) } } catch (error) { console.error('获取项目信息失败:', error) uni.showToast({ title: '网络错误', icon: 'none' }) } }, /** * 获取捐款记录 * @param {string} keyword 搜索关键词 */ async loadDonationRecords(keyword = '') { this.loading = true try { const params = { formedId: this.formedId, pageNum: this.pageNum, pageSize: this.pageSize, minAmount: 1, maxAmount: 10000, sortAmount: 'amount', orderAmount: 'asc', sortTime: 'time', orderTime: 'desc' } // 如果有搜索关键词,添加姓名搜索 if (keyword) { params.realName = keyword } const response = await getDonorList(params) console.log('捐款记录API响应:', response) if (response.code === 200) { // 根据实际后端数据结构获取数据数组 let dataArray = [] console.log('解析数据结构:', { hasData: !!response.data, hasDataList: !!(response.data && response.data.list), hasDataListRows: !!(response.data && response.data.list && response.data.list.rows), dataIsArray: Array.isArray(response.data), hasRows: !!response.rows, rowsIsArray: Array.isArray(response.rows) }) if (response.data && response.data.list && response.data.list.rows) { // 标准结构:response.data.list.rows dataArray = response.data.list.rows console.log('使用标准结构: response.data.list.rows') } else if (response.data && Array.isArray(response.data)) { // 备用结构:response.data 直接是数组 dataArray = response.data console.log('使用备用结构: response.data') } else if (response.rows && Array.isArray(response.rows)) { // 备用结构:response.rows 是数组 dataArray = response.rows console.log('使用备用结构: response.rows') } else { console.error('无法找到数据数组,API响应结构:', response) uni.showToast({ title: '数据格式错误', icon: 'none' }) return } // 转换数据格式 const newData = dataArray.map(item => ({ id: item.id, name: item.realName, amount: item.amount, time: this.formatDate(item.donationDate) })) // 如果是第一页,直接替换数据 if (this.pageNum === 1) { this.donationList = newData } else { // 如果是加载更多,追加数据 this.donationList = [...this.donationList, ...newData] } // 判断是否还有更多数据 this.hasMore = newData.length === this.pageSize } else { uni.showToast({ title: response.msg || '获取数据失败', icon: 'none' }) } } catch (error) { console.error('获取捐款记录失败:', error) uni.showToast({ title: '获取数据失败', icon: 'none' }) } finally { this.loading = false } }, /** * 搜索捐款记录 * @param {string} val 搜索关键词 */ onSearch(val) { console.log('搜索内容:', val) this.pageNum = 1 // 重置页码 this.loadDonationRecords(val) }, /** * 筛选功能 */ onFilter() { uni.showToast({ title: '筛选功能开发中', icon: 'none' }) }, /** * 格式化日期 * @param {string} dateStr 日期字符串 * @returns {string} 格式化后的日期 */ formatDate(dateStr) { if (!dateStr) return '' const date = new Date(dateStr) const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}/${month}/${day}` }, /** * 初始化数据 * @param {string} formedId 建制ID */ async initData(formedId) { console.log('初始化捐款记录数据, formedId:', formedId) try { this.formedId = formedId await this.loadProjectInfo() await this.loadDonationRecords() console.log('捐款记录数据初始化完成') } catch (error) { console.error('初始化捐款记录数据失败:', error) uni.showToast({ title: '初始化数据失败', icon: 'none' }) } } } }