From c9db4f11a4a89eff9f3b606fdd08e606424932a0 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 2 Nov 2026 18:17:53 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=BF=AB=E6=8D=B7=E5=85=85?= =?UTF-8?q?=E5=80=BC=E3=80=81=E5=BF=AB=E6=8D=B7=E6=9F=A5=E7=9C=8B=E6=B5=81?= =?UTF-8?q?=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 8 ++--- src/i18n/pages/my/en.ts | 6 ++++ src/i18n/pages/my/zh-cn.ts | 6 ++++ src/i18n/pages/my/zh-hk.ts | 6 ++++ src/pages/tabbar/my.vue | 61 ++++++++++++++++++++++++++++++++- src/sheep/api/wallet.ts | 7 +++- src/static/icon/service_22.png | Bin 0 -> 3104 bytes src/static/icon/service_23.png | Bin 0 -> 5108 bytes 8 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/static/icon/service_22.png create mode 100644 src/static/icon/service_23.png diff --git a/.env b/.env index add2994..f660ced 100644 --- a/.env +++ b/.env @@ -35,15 +35,15 @@ VITE_OAUTH2_SOCIAL_CLIENT='social:social' # 是否开启websocket 消息接受, VITE_WEBSOCKET_ENABLE = true # --------------------------- start 开发环境 start ---------------------------------- -# VITE_APP_DEV_SERVICE = https://www.zianxin.com/api -VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc +VITE_APP_DEV_SERVICE = https://www.zianxin.com/api +# VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc # VITE_APP_DEV_SERVICE = http://127.0.0.1:9999 # VITE_APP_DEV_SERVICE = https://www.zianxin.com/api # VITE_APP_DEV_SERVICE = https://dzc-test-1.fy.takin.cc # VITE_APP_DEV_SERVICE = http://127.0.0.1:9999 -# VITE_IMAGE_DEV_PATH = https://www.zianxin.com/api -VITE_IMAGE_DEV_PATH = https://dzc-test-1.fy.takin.cc +VITE_IMAGE_DEV_PATH = https://www.zianxin.com/api +# VITE_IMAGE_DEV_PATH = https://dzc-test-1.fy.takin.cc # VITE_IMAGE_DEV_PATH = http://127.0.0.1:9999 # VITE_IMAGE_DEV_PATH = https://www.zianxin.com/api # VITE_IMAGE_DEV_PATH = https://dzc-test-1.fy.takin.cc diff --git a/src/i18n/pages/my/en.ts b/src/i18n/pages/my/en.ts index c281cea..6854349 100644 --- a/src/i18n/pages/my/en.ts +++ b/src/i18n/pages/my/en.ts @@ -30,6 +30,12 @@ export default { wallet: "Wallet", + /** 本人默认饭卡的充值快捷入口。 */ + eatWalletTopUp: "Meal Card Top-up", + + /** 本人默认饭卡的钱包流水快捷入口。 */ + eatWalletTransaction: "Meal Card Transactions", + /** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */ guardianWardMenu: "Meal History", diff --git a/src/i18n/pages/my/zh-cn.ts b/src/i18n/pages/my/zh-cn.ts index 76ea600..f929412 100644 --- a/src/i18n/pages/my/zh-cn.ts +++ b/src/i18n/pages/my/zh-cn.ts @@ -30,6 +30,12 @@ export default { wallet: "钱包管理", + /** 本人默认饭卡的充值快捷入口。 */ + eatWalletTopUp: "饭卡充值", + + /** 本人默认饭卡的钱包流水快捷入口。 */ + eatWalletTransaction: "饭卡流水", + /** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */ guardianWardMenu: "用餐历史", diff --git a/src/i18n/pages/my/zh-hk.ts b/src/i18n/pages/my/zh-hk.ts index b3611be..d6c469c 100644 --- a/src/i18n/pages/my/zh-hk.ts +++ b/src/i18n/pages/my/zh-hk.ts @@ -30,6 +30,12 @@ export default { wallet: "錢包管理", + /** 本人默认饭卡的充值快捷入口。 */ + eatWalletTopUp: "飯卡充值", + + /** 本人默认饭卡的钱包流水快捷入口。 */ + eatWalletTransaction: "飯卡流水", + /** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */ guardianWardMenu: "用餐歷史", diff --git a/src/pages/tabbar/my.vue b/src/pages/tabbar/my.vue index e37d998..e158ad5 100644 --- a/src/pages/tabbar/my.vue +++ b/src/pages/tabbar/my.vue @@ -110,7 +110,7 @@ import { isEmpty } from "radash" import dayjs from "dayjs" import { filePath } from "@@/utils/file" import { hooks, router, constant } from "@@/index" -import { accessStatsApi, actCancelApi, productApi, userApi, adApi, workbenchMenuApi } from "@@/api" +import { accessStatsApi, actCancelApi, productApi, userApi, adApi, workbenchMenuApi, walletApi } from "@@/api" import { hasRoleCode, refreshUserRoleCodes, @@ -135,6 +135,8 @@ const { t } = useI18n() type MenuKey = | "wallet" + | "eatWalletTopUp" + | "eatWalletTransaction" | "guardianWardMenu" | "relationGraph" | "address" @@ -181,6 +183,10 @@ const menuText = (key: string) => { /** 浅色圆底 + 原彩色图标(不做 invert,避免 App 端图标消失) */ const MENU_THEME: Record = { wallet: { iconBg: "#ECFDF5" }, + /** 饭卡充值入口沿用钱包服务的浅绿图标底色。 */ + eatWalletTopUp: { iconBg: "#ECFDF5" }, + /** 饭卡流水入口与充值入口保持一致的钱包服务配色。 */ + eatWalletTransaction: { iconBg: "#ECFDF5" }, /** 用餐历史入口沿用关系服务的浅灰图标底色。 */ guardianWardMenu: { iconBg: "#F3F4F6" }, relationGraph: { iconBg: "#F3F4F6" }, @@ -206,6 +212,10 @@ const getMenuTheme = (key: MenuKey) => MENU_THEME[key] || { iconBg: "#F3F4F6" } /** “我的”页面固定功能入口,角色专属入口由 syncRoleMenus 按权限插入。 */ const BASE_MENUS: MenuItem[] = [ { key: "wallet", icon: "/static/icon/service_3.png", path: "/pages/wallet/list" }, + /** 点击时查询本人饭卡 ID,避免将示例钱包 ID 固定给所有用户。 */ + { key: "eatWalletTopUp", icon: "/static/icon/service_23.png", path: "/pages/wallet/recharge" }, + /** 点击时查询同一本人饭卡,直接进入已有钱包流水页。 */ + { key: "eatWalletTransaction", icon: "/static/icon/service_22.png", path: "/pages/wallet/detail" }, { key: "guardianWardMenu", icon: "/static/icon/service_21.png", path: "/pages/order/guardian-ward-menu" }, { key: "relationGraph", icon: "/static/icon/service_14.png", path: "/pages/user/relation/tree" }, { key: "address", tmIcon: "map-pin-2-line", path: "/pages/user/address/index" }, @@ -421,11 +431,60 @@ const onMessageEntryClick = async () => { router.jump("/pages/message/list") } +/** 钱包接口约定的本人饭卡类型编码;兼容响应中的字符串和数值编码。 */ +const EAT_WALLET_TYPE_CODE = "1" +/** 每次查询的钱包条数;仍按服务端总页数继续查找,不能把第一页当作全部钱包。 */ +const EAT_WALLET_PAGE_SIZE = 100 +/** 两个饭卡入口共用的页面级请求锁,避免连点或交叉点击造成重复跳转。 */ +const eatWalletOpening = ref(false) + +/** + * 从登录用户的钱包分页中查找饭卡,再携带真实钱包 ID 打开充值或流水页。 + * 接口由服务端限定本人范围并过滤不可见钱包,不使用关系人或跨账号缓存的钱包数据。 + * @param path 固定菜单配置的充值或流水页面路径,调用前须完成登录校验。 + */ +const openEatWallet = async (path: string) => { + if (eatWalletOpening.value) return + eatWalletOpening.value = true + try { + uni.showLoading({ title: t("common.loading"), mask: true }) + for (let current = 1, pages = 1; current <= pages; current += 1) { + const response: any = await walletApi.all({ current, size: EAT_WALLET_PAGE_SIZE }) + if (response?.code !== 0 || !Array.isArray(response?.data?.records)) { + throw new Error(response?.msg || t("mobile.wallet.queryWalletFail")) + } + const wallet = response.data.records.find( + (item: any) => String(item?.walletTypeUniqueCode) === EAT_WALLET_TYPE_CODE, + ) + if (wallet) { + if (!wallet.id) throw new Error(t("mobile.wallet.missingWalletInfo")) + uni.hideLoading() + router.jump(path, { id: wallet.id }) + return + } + // 商户可见性过滤可能使当前页为空,仍以分页元数据判断是否需要继续查询。 + pages = Number(response.data.pages) || 1 + } + throw new Error(t("mobile.wallet.wardNoCard")) + } catch (error: any) { + uni.hideLoading() + console.error("打开本人饭卡钱包失败", error) + uni.showToast({ title: error?.message || t("mobile.wallet.queryWalletFail"), icon: "none" }) + } finally { + eatWalletOpening.value = false + } +} + +/** 固定功能入口统一校验登录;饭卡入口先解析本人钱包,其余入口沿用原跳转方式。 */ const onTabMenu = async (item: MenuItem) => { const isLogin = await hooks.useCheckLogin() if (!isLogin) return if (item.path == "/pages/tabbar/index") return uni.switchTab({ url: item.path }) switch (item.key) { + case "eatWalletTopUp": + case "eatWalletTransaction": + await openEatWallet(item.path) + break case "scan": await appScanCode() break diff --git a/src/sheep/api/wallet.ts b/src/sheep/api/wallet.ts index e37962c..ad64c94 100644 --- a/src/sheep/api/wallet.ts +++ b/src/sheep/api/wallet.ts @@ -64,10 +64,15 @@ export default { method: "GET", params, }), - all: (): Promise => + /** + * 查询当前登录用户可见的钱包分页;省略参数时保持服务端默认分页。 + * @param params 可选分页参数,current 从 1 开始,size 表示每页钱包条数。 + */ + all: (params?: { current?: number; size?: number }): Promise => request({ url: "/wallet/wallet-manage/app/get-all", method: "GET", + params, }), getQrCode: (params: any) => request({ diff --git a/src/static/icon/service_22.png b/src/static/icon/service_22.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5eaf69b3024eaca23b77ceea71ea2d47302908 GIT binary patch literal 3104 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 literal 0 HcmV?d00001 diff --git a/src/static/icon/service_23.png b/src/static/icon/service_23.png new file mode 100644 index 0000000000000000000000000000000000000000..96e2f232eda85b2e99516759c59a8b3b6546ae2c GIT binary patch literal 5108 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 literal 0 HcmV?d00001