From 6022b19160bd2521570a5f7722ad962c6b1a0bdd Mon Sep 17 00:00:00 2001 From: zhouyanli <593579392@qq.com> Date: Wed, 23 Sep 2026 16:51:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E3=80=81=E7=BC=B4=E8=B4=B9=E8=AE=B0=E5=BD=95=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=98=BE=E7=A4=BA=E9=87=91=E9=A2=9D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- property-uniapp-project/manifest.json | 4 +- .../pageSubPack/api/request.js | 4 +- .../pageSubPack/my/settingIndex.vue | 46 +++++++++++++------ .../payment-list/paymentRecord.vue | 45 +++++++++++++++--- property-uniapp-project/pages/index/index.vue | 4 +- 5 files changed, 78 insertions(+), 25 deletions(-) diff --git a/property-uniapp-project/manifest.json b/property-uniapp-project/manifest.json index 4636706..f1446fc 100644 --- a/property-uniapp-project/manifest.json +++ b/property-uniapp-project/manifest.json @@ -2,8 +2,8 @@ "name" : "花开物业", "appid" : "__UNI__29C3D60", "description" : "智慧社区居民端面向小区业主使用,支持注册、验证码、账号密码多种登录方式,提供密码找回功能,账号使用安全便捷。支持多小区切换,首页设有轮播 banner、社区公告,集成远程开门、生活缴费、在线报修、访客邀请、社区活动常用服务。全服务板块统一涵盖门禁开门、线上缴费、报修申报、访客预约、投诉反馈、问卷调研、活动报名、社区公示、一键联系物业功能。个人中心可管理房屋、住户、车位、车辆信息,支持更换手机号、修改密码、消息通知设置、版本更新及账号退出,一站式满足业主居家生活、社区服务、房产车辆管理需求,实现社区生活数字化、便捷化。", - "versionName" : "1.2.7", - "versionCode" : 141, + "versionName" : "1.2.8", + "versionCode" : 142, "transformPx" : false, "uniCloud" : { "provider" : "aliyun", diff --git a/property-uniapp-project/pageSubPack/api/request.js b/property-uniapp-project/pageSubPack/api/request.js index a915c90..b23822d 100644 --- a/property-uniapp-project/pageSubPack/api/request.js +++ b/property-uniapp-project/pageSubPack/api/request.js @@ -2,8 +2,8 @@ import { navigateToLogin } from '@/common/checkLogin.js' let baseUrl = ''; if (process.env.NODE_ENV === 'development') { - baseUrl = 'http://192.168.0.222:8080'; // 开发环境 - // baseUrl = 'https://wuyeapi.ckdzkj.com'; + // baseUrl = 'http://192.168.0.222:8080'; // 开发环境 + baseUrl = 'https://wuyeapi.ckdzkj.com'; } else { baseUrl = 'https://wuyeapi.ckdzkj.com'; // 生产环境 // baseUrl = 'https://during-immovable-eats.ngrok-free.dev'; diff --git a/property-uniapp-project/pageSubPack/my/settingIndex.vue b/property-uniapp-project/pageSubPack/my/settingIndex.vue index 124ac44..74e497a 100644 --- a/property-uniapp-project/pageSubPack/my/settingIndex.vue +++ b/property-uniapp-project/pageSubPack/my/settingIndex.vue @@ -124,23 +124,42 @@ 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) => { // #ifdef APP-PLUS - if (downloadUrl) { - // 优先使用服务端返回的应用商店地址 - const pkgName = plus.runtime.appid || '' - console.log('包名---------',pkgName) - // 无论返回哪种 downloadUrl,都在后面拼接包名 - const finalUrl = downloadUrl + pkgName - plus.runtime.openURL(finalUrl) - } else if (platform === 'ios') { - // iOS: 打开 App Store(需在 Apple Developer 后台获取 Apple ID) - plus.runtime.openURL('itms-apps://itunes.apple.com/app/id' + plus.runtime.appid) + const shopUrl = (downloadUrl || '').trim() + if (platform === 'ios') { + // iOS 用 itms-apps 原生协议直接唤起 App Store,不带中文名避免二次编码 + //'itms-apps://itunes.apple.com/app/id' + IOS_APPLE_ID + plus.runtime.openURL(downloadUrl, () => { + // itms-apps 协议不可用时回退到 https 链接 + plus.runtime.openURL('https://apps.apple.com/cn/app/id' + IOS_APPLE_ID) + }) + } else if (shopUrl) { + // 服务端返回的是渠道地址前缀(如应用宝的 ...?pkgname=),拼上真实包名 + plus.runtime.openURL(shopUrl + getAndroidPackageName(), () => { + uni.showToast({ title: '请前往应用商店更新', icon: 'none' }) + }) } else { // Android: 通过 market 协议唤起手机自带应用商店 - const packageName = plus.runtime.appid || '' - plus.runtime.openURL('market://details?id=' + packageName, () => { + plus.runtime.openURL('market://details?id=' + getAndroidPackageName(), () => { // market 协议失败时的回调,提示用户手动前往应用商店 uni.showToast({ title: '请前往应用商店更新', icon: 'none' }) }) @@ -233,8 +252,9 @@ uni.showToast({ title: '检查更新失败2', icon: 'none' }) } } catch (err) { + console.log('err',err) uni.hideLoading() - uni.showToast({ title: err.msg || '检查更新失败', icon: 'none' }) + uni.showToast({ title: err.msg || '无最新版本', icon: 'none' }) } } diff --git a/property-uniapp-project/pageSubPack/payment-list/paymentRecord.vue b/property-uniapp-project/pageSubPack/payment-list/paymentRecord.vue index 4b0bf44..2241bec 100644 --- a/property-uniapp-project/pageSubPack/payment-list/paymentRecord.vue +++ b/property-uniapp-project/pageSubPack/payment-list/paymentRecord.vue @@ -58,6 +58,8 @@ + 加载中... + 没有更多了 @@ -93,6 +95,12 @@ const barMaxHeight = ref(300) const billList = ref([]) + // 各月缴费合计,来自接口 monthlyStats,key 形如 "2026-09" + const monthStatsMap = ref({}) + // 加载中,防止 scrolltolower 连续触发导致 pageNum 连跳 + const loading = ref(false) + // 没有更多数据了 + const noMore = ref(false) // 费用名称映射 // topup(水电表充值):type 1=电费, 2=水费 @@ -119,11 +127,15 @@ // 获取缴费记录(loadMore=true 时分页追加) 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 { - if (!loadMore) pageNum.value = 1 const res = await getTopupRecordWithStat({ residentUserId: uni.getStorageSync('userId'), - pageNum: pageNum.value, + pageNum: nextPage, pageSize: pageSize.value }) if (res.code === 200) { @@ -139,11 +151,14 @@ month: parts[1] ? parseInt(parts[1], 10) : 1, name, account: item.deviceCode || '', - amount: Number(item.amount) || 0, + amount: Number(item.paidAmount) || 0, recordType: item.recordType || '', icon: iconMap[name] || iconMap['账单'] } }) + pageNum.value = nextPage + // 返回条数不足一页,说明没有更多了 + noMore.value = mappedList.length < pageSize.value billList.value = loadMore ? [...billList.value, ...mappedList] : mappedList // 累计缴费金额 totalAmount.value = res.data.totalAmount || '0.00' @@ -152,12 +167,13 @@ } } catch (err) { console.error('获取缴费记录失败', err) + } finally { + loading.value = false } } // 加载更多(触底分页) const loadMore = () => { - pageNum.value++ getRecords(true) } @@ -169,13 +185,15 @@ const priceMatch = value.match(/([\d.]+)元/) if (priceMatch && key.includes('-')) { 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), month: parseInt(m, 10), price: parseFloat(priceMatch[1]) || 0 } } }) + monthStatsMap.value = statsMap // 取最近6个月(当前月往前) const now = new Date() @@ -215,6 +233,7 @@ const key = `${bill.year}-${String(bill.month).padStart(2, '0')}` if (!map[key]) { map[key] = { + key, month: bill.month, year: bill.year, total: 0, @@ -224,8 +243,15 @@ map[key].list.push(bill) 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 return b.month - a.month }) @@ -298,6 +324,13 @@ margin-bottom: 10rpx; } + .list-tip { + text-align: center; + font-size: 26rpx; + color: #999; + padding: 20rpx 0 40rpx; + } + .top-box { display: flex; justify-content: space-between; diff --git a/property-uniapp-project/pages/index/index.vue b/property-uniapp-project/pages/index/index.vue index 8cd43bf..91a5053 100644 --- a/property-uniapp-project/pages/index/index.vue +++ b/property-uniapp-project/pages/index/index.vue @@ -164,10 +164,10 @@ const activityList = ref([]) 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/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 currentVillageId = ref('')