修改升级版本、缴费记录分页显示金额问题
This commit is contained in:
@@ -2,8 +2,8 @@
|
|||||||
"name" : "花开物业",
|
"name" : "花开物业",
|
||||||
"appid" : "__UNI__29C3D60",
|
"appid" : "__UNI__29C3D60",
|
||||||
"description" : "智慧社区居民端面向小区业主使用,支持注册、验证码、账号密码多种登录方式,提供密码找回功能,账号使用安全便捷。支持多小区切换,首页设有轮播 banner、社区公告,集成远程开门、生活缴费、在线报修、访客邀请、社区活动常用服务。全服务板块统一涵盖门禁开门、线上缴费、报修申报、访客预约、投诉反馈、问卷调研、活动报名、社区公示、一键联系物业功能。个人中心可管理房屋、住户、车位、车辆信息,支持更换手机号、修改密码、消息通知设置、版本更新及账号退出,一站式满足业主居家生活、社区服务、房产车辆管理需求,实现社区生活数字化、便捷化。",
|
"description" : "智慧社区居民端面向小区业主使用,支持注册、验证码、账号密码多种登录方式,提供密码找回功能,账号使用安全便捷。支持多小区切换,首页设有轮播 banner、社区公告,集成远程开门、生活缴费、在线报修、访客邀请、社区活动常用服务。全服务板块统一涵盖门禁开门、线上缴费、报修申报、访客预约、投诉反馈、问卷调研、活动报名、社区公示、一键联系物业功能。个人中心可管理房屋、住户、车位、车辆信息,支持更换手机号、修改密码、消息通知设置、版本更新及账号退出,一站式满足业主居家生活、社区服务、房产车辆管理需求,实现社区生活数字化、便捷化。",
|
||||||
"versionName" : "1.2.7",
|
"versionName" : "1.2.8",
|
||||||
"versionCode" : 141,
|
"versionCode" : 142,
|
||||||
"transformPx" : false,
|
"transformPx" : false,
|
||||||
"uniCloud" : {
|
"uniCloud" : {
|
||||||
"provider" : "aliyun",
|
"provider" : "aliyun",
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import { navigateToLogin } from '@/common/checkLogin.js'
|
|||||||
|
|
||||||
let baseUrl = '';
|
let baseUrl = '';
|
||||||
if (process.env.NODE_ENV === 'development') {
|
if (process.env.NODE_ENV === 'development') {
|
||||||
baseUrl = 'http://192.168.0.222:8080'; // 开发环境
|
// baseUrl = 'http://192.168.0.222:8080'; // 开发环境
|
||||||
// baseUrl = 'https://wuyeapi.ckdzkj.com';
|
baseUrl = 'https://wuyeapi.ckdzkj.com';
|
||||||
} else {
|
} else {
|
||||||
baseUrl = 'https://wuyeapi.ckdzkj.com'; // 生产环境
|
baseUrl = 'https://wuyeapi.ckdzkj.com'; // 生产环境
|
||||||
// baseUrl = 'https://during-immovable-eats.ngrok-free.dev';
|
// baseUrl = 'https://during-immovable-eats.ngrok-free.dev';
|
||||||
|
|||||||
@@ -124,23 +124,42 @@
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// iOS App Store 数字 ID(App Store Connect → App 信息 → Apple ID)
|
||||||
|
const IOS_APPLE_ID = '6785337718'
|
||||||
|
|
||||||
|
// 获取 Android 包名。plus.runtime.appid 是 DCloud 的 __UNI__ 标识,不是包名
|
||||||
|
const getAndroidPackageName = () => {
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
if (plus.os.name === 'Android') {
|
||||||
|
try {
|
||||||
|
return String(plus.android.runtimeMainActivity().getPackageName())
|
||||||
|
} catch (e) {
|
||||||
|
console.log('获取包名失败', e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
return 'com.chengkong.property.owner' // 兜底:与 App Store 上的 bundleId 一致
|
||||||
|
}
|
||||||
|
|
||||||
// 跳转到应用商店更新
|
// 跳转到应用商店更新
|
||||||
const openAppStore = (downloadUrl, platform) => {
|
const openAppStore = (downloadUrl, platform) => {
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
if (downloadUrl) {
|
const shopUrl = (downloadUrl || '').trim()
|
||||||
// 优先使用服务端返回的应用商店地址
|
if (platform === 'ios') {
|
||||||
const pkgName = plus.runtime.appid || ''
|
// iOS 用 itms-apps 原生协议直接唤起 App Store,不带中文名避免二次编码
|
||||||
console.log('包名---------',pkgName)
|
//'itms-apps://itunes.apple.com/app/id' + IOS_APPLE_ID
|
||||||
// 无论返回哪种 downloadUrl,都在后面拼接包名
|
plus.runtime.openURL(downloadUrl, () => {
|
||||||
const finalUrl = downloadUrl + pkgName
|
// itms-apps 协议不可用时回退到 https 链接
|
||||||
plus.runtime.openURL(finalUrl)
|
plus.runtime.openURL('https://apps.apple.com/cn/app/id' + IOS_APPLE_ID)
|
||||||
} else if (platform === 'ios') {
|
})
|
||||||
// iOS: 打开 App Store(需在 Apple Developer 后台获取 Apple ID)
|
} else if (shopUrl) {
|
||||||
plus.runtime.openURL('itms-apps://itunes.apple.com/app/id' + plus.runtime.appid)
|
// 服务端返回的是渠道地址前缀(如应用宝的 ...?pkgname=),拼上真实包名
|
||||||
|
plus.runtime.openURL(shopUrl + getAndroidPackageName(), () => {
|
||||||
|
uni.showToast({ title: '请前往应用商店更新', icon: 'none' })
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
// Android: 通过 market 协议唤起手机自带应用商店
|
// Android: 通过 market 协议唤起手机自带应用商店
|
||||||
const packageName = plus.runtime.appid || ''
|
plus.runtime.openURL('market://details?id=' + getAndroidPackageName(), () => {
|
||||||
plus.runtime.openURL('market://details?id=' + packageName, () => {
|
|
||||||
// market 协议失败时的回调,提示用户手动前往应用商店
|
// market 协议失败时的回调,提示用户手动前往应用商店
|
||||||
uni.showToast({ title: '请前往应用商店更新', icon: 'none' })
|
uni.showToast({ title: '请前往应用商店更新', icon: 'none' })
|
||||||
})
|
})
|
||||||
@@ -233,8 +252,9 @@
|
|||||||
uni.showToast({ title: '检查更新失败2', icon: 'none' })
|
uni.showToast({ title: '检查更新失败2', icon: 'none' })
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
console.log('err',err)
|
||||||
uni.hideLoading()
|
uni.hideLoading()
|
||||||
uni.showToast({ title: err.msg || '检查更新失败', icon: 'none' })
|
uni.showToast({ title: err.msg || '无最新版本', icon: 'none' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,8 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view v-if="loading" class="list-tip">加载中...</view>
|
||||||
|
<view v-else-if="noMore && monthGroups.length > 0" class="list-tip">没有更多了</view>
|
||||||
</view>
|
</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
@@ -93,6 +95,12 @@
|
|||||||
const barMaxHeight = ref(300)
|
const barMaxHeight = ref(300)
|
||||||
|
|
||||||
const billList = ref([])
|
const billList = ref([])
|
||||||
|
// 各月缴费合计,来自接口 monthlyStats,key 形如 "2026-09"
|
||||||
|
const monthStatsMap = ref({})
|
||||||
|
// 加载中,防止 scrolltolower 连续触发导致 pageNum 连跳
|
||||||
|
const loading = ref(false)
|
||||||
|
// 没有更多数据了
|
||||||
|
const noMore = ref(false)
|
||||||
|
|
||||||
// 费用名称映射
|
// 费用名称映射
|
||||||
// topup(水电表充值):type 1=电费, 2=水费
|
// topup(水电表充值):type 1=电费, 2=水费
|
||||||
@@ -119,11 +127,15 @@
|
|||||||
|
|
||||||
// 获取缴费记录(loadMore=true 时分页追加)
|
// 获取缴费记录(loadMore=true 时分页追加)
|
||||||
const getRecords = async (loadMore = false) => {
|
const getRecords = async (loadMore = false) => {
|
||||||
|
if (loading.value) return
|
||||||
|
if (loadMore && noMore.value) return
|
||||||
|
loading.value = true
|
||||||
|
// 成功后才推进页码,避免请求失败时丢掉一页
|
||||||
|
const nextPage = loadMore ? pageNum.value + 1 : 1
|
||||||
try {
|
try {
|
||||||
if (!loadMore) pageNum.value = 1
|
|
||||||
const res = await getTopupRecordWithStat({
|
const res = await getTopupRecordWithStat({
|
||||||
residentUserId: uni.getStorageSync('userId'),
|
residentUserId: uni.getStorageSync('userId'),
|
||||||
pageNum: pageNum.value,
|
pageNum: nextPage,
|
||||||
pageSize: pageSize.value
|
pageSize: pageSize.value
|
||||||
})
|
})
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
@@ -139,11 +151,14 @@
|
|||||||
month: parts[1] ? parseInt(parts[1], 10) : 1,
|
month: parts[1] ? parseInt(parts[1], 10) : 1,
|
||||||
name,
|
name,
|
||||||
account: item.deviceCode || '',
|
account: item.deviceCode || '',
|
||||||
amount: Number(item.amount) || 0,
|
amount: Number(item.paidAmount) || 0,
|
||||||
recordType: item.recordType || '',
|
recordType: item.recordType || '',
|
||||||
icon: iconMap[name] || iconMap['账单']
|
icon: iconMap[name] || iconMap['账单']
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
pageNum.value = nextPage
|
||||||
|
// 返回条数不足一页,说明没有更多了
|
||||||
|
noMore.value = mappedList.length < pageSize.value
|
||||||
billList.value = loadMore ? [...billList.value, ...mappedList] : mappedList
|
billList.value = loadMore ? [...billList.value, ...mappedList] : mappedList
|
||||||
// 累计缴费金额
|
// 累计缴费金额
|
||||||
totalAmount.value = res.data.totalAmount || '0.00'
|
totalAmount.value = res.data.totalAmount || '0.00'
|
||||||
@@ -152,12 +167,13 @@
|
|||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('获取缴费记录失败', err)
|
console.error('获取缴费记录失败', err)
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载更多(触底分页)
|
// 加载更多(触底分页)
|
||||||
const loadMore = () => {
|
const loadMore = () => {
|
||||||
pageNum.value++
|
|
||||||
getRecords(true)
|
getRecords(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,13 +185,15 @@
|
|||||||
const priceMatch = value.match(/([\d.]+)元/)
|
const priceMatch = value.match(/([\d.]+)元/)
|
||||||
if (priceMatch && key.includes('-')) {
|
if (priceMatch && key.includes('-')) {
|
||||||
const [y, m] = key.split('-')
|
const [y, m] = key.split('-')
|
||||||
statsMap[key] = {
|
// 统一成补零格式(2026-09),方便和分组 key 对齐
|
||||||
|
statsMap[`${parseInt(y, 10)}-${String(parseInt(m, 10)).padStart(2, '0')}`] = {
|
||||||
year: parseInt(y, 10),
|
year: parseInt(y, 10),
|
||||||
month: parseInt(m, 10),
|
month: parseInt(m, 10),
|
||||||
price: parseFloat(priceMatch[1]) || 0
|
price: parseFloat(priceMatch[1]) || 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
monthStatsMap.value = statsMap
|
||||||
|
|
||||||
// 取最近6个月(当前月往前)
|
// 取最近6个月(当前月往前)
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
@@ -215,6 +233,7 @@
|
|||||||
const key = `${bill.year}-${String(bill.month).padStart(2, '0')}`
|
const key = `${bill.year}-${String(bill.month).padStart(2, '0')}`
|
||||||
if (!map[key]) {
|
if (!map[key]) {
|
||||||
map[key] = {
|
map[key] = {
|
||||||
|
key,
|
||||||
month: bill.month,
|
month: bill.month,
|
||||||
year: bill.year,
|
year: bill.year,
|
||||||
total: 0,
|
total: 0,
|
||||||
@@ -224,8 +243,15 @@
|
|||||||
map[key].list.push(bill)
|
map[key].list.push(bill)
|
||||||
map[key].total += bill.amount
|
map[key].total += bill.amount
|
||||||
})
|
})
|
||||||
|
// 分组合计优先用接口返回的月度统计:列表是分页加载的,
|
||||||
|
// 只累加已加载的记录会少算,滚动翻页时数字还会一直往上跳
|
||||||
|
const groups = Object.values(map)
|
||||||
|
groups.forEach(group => {
|
||||||
|
const stat = monthStatsMap.value[group.key]
|
||||||
|
if (stat) group.total = stat.price
|
||||||
|
})
|
||||||
// 按年月降序排列
|
// 按年月降序排列
|
||||||
return Object.values(map).sort((a, b) => {
|
return groups.sort((a, b) => {
|
||||||
if (a.year !== b.year) return b.year - a.year
|
if (a.year !== b.year) return b.year - a.year
|
||||||
return b.month - a.month
|
return b.month - a.month
|
||||||
})
|
})
|
||||||
@@ -298,6 +324,13 @@
|
|||||||
margin-bottom: 10rpx;
|
margin-bottom: 10rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-tip {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #999;
|
||||||
|
padding: 20rpx 0 40rpx;
|
||||||
|
}
|
||||||
|
|
||||||
.top-box {
|
.top-box {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|||||||
@@ -164,10 +164,10 @@
|
|||||||
const activityList = ref([])
|
const activityList = ref([])
|
||||||
|
|
||||||
const serviceItems = [
|
const serviceItems = [
|
||||||
{ title: '一键开门', icon: 'https://wuye.ckdzkj.com/images/home/openDoor.png', url: '/pageSubPack/notice-list/oneClickOpen' },
|
|
||||||
{ title: '生活缴费', icon: 'https://wuye.ckdzkj.com/images/home/lifePay.png', url: '/pageSubPack/payment-list/paymentIndex' },
|
{ title: '生活缴费', icon: 'https://wuye.ckdzkj.com/images/home/lifePay.png', url: '/pageSubPack/payment-list/paymentIndex' },
|
||||||
{ title: '在线报修', icon: 'https://wuye.ckdzkj.com/images/home/repair.png', url: '/pageSubPack/online-repair/onlineRepair' },
|
{ title: '在线报修', icon: 'https://wuye.ckdzkj.com/images/home/repair.png', url: '/pageSubPack/online-repair/onlineRepair' },
|
||||||
{ title: '访客邀请', icon: 'https://wuye.ckdzkj.com/images/home/visitorInvite.png', url: '/pageSubPack/visitor/visitor-list' }
|
{ title: '公告公示', icon: 'https://wuye.ckdzkj.com/images/propertyImgs/icon-notice.png', url: '/pageSubPack/notice-list/noticeList' },
|
||||||
|
{ title: '联系物业', icon: 'https://wuye.ckdzkj.com/images/propertyImgs/icon-contact.png', url: '/pageSubPack/service-list/contactProperty' }
|
||||||
]
|
]
|
||||||
const currentCommunity = ref('请绑定房屋')
|
const currentCommunity = ref('请绑定房屋')
|
||||||
const currentVillageId = ref('')
|
const currentVillageId = ref('')
|
||||||
|
|||||||
Reference in New Issue
Block a user