buddhism/pages/institutionalStructure/mixins/donation-mixin.js
2025-08-02 11:14:12 +08:00

245 lines
7.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 捐款记录相关 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)
// 显示页面loading
if (this.pageLoading) {
this.pageLoading.show('努力加载中~')
}
try {
this.formedId = formedId
await this.loadProjectInfo()
await this.loadDonationRecords()
console.log('捐款记录数据初始化完成')
} catch (error) {
console.error('初始化捐款记录数据失败:', error)
uni.showToast({
title: '初始化数据失败',
icon: 'none'
})
} finally {
// 隐藏页面loading
if (this.pageLoading) {
this.pageLoading.hide()
console.log('页面loading已隐藏')
}
}
}
}
}