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 0000000..0f5eaf6 Binary files /dev/null and b/src/static/icon/service_22.png differ diff --git a/src/static/icon/service_23.png b/src/static/icon/service_23.png new file mode 100644 index 0000000..96e2f23 Binary files /dev/null and b/src/static/icon/service_23.png differ