245 lines
7.4 KiB
JavaScript
245 lines
7.4 KiB
JavaScript
/**
|
||
* 捐款记录相关 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已隐藏')
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|