feat:快捷充值、快捷查看流水

This commit is contained in:
dzc committed 2026-11-02 18:17:53 +08:00
1 parent cc89123dd1
commit c9db4f11a4
8 files changed
+88 -6

No files matched your search

+4 -4
View File
@@ -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
+6
View File
@@ -30,6 +30,12 @@ export default {
wallet: "Wallet",
/** 本人默认饭卡的充值快捷入口。 */
eatWalletTopUp: "Meal Card Top-up",
/** 本人默认饭卡的钱包流水快捷入口。 */
eatWalletTransaction: "Meal Card Transactions",
/** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */
guardianWardMenu: "Meal History",
+6
View File
@@ -30,6 +30,12 @@ export default {
wallet: "钱包管理",
/** 本人默认饭卡的充值快捷入口。 */
eatWalletTopUp: "饭卡充值",
/** 本人默认饭卡的钱包流水快捷入口。 */
eatWalletTransaction: "饭卡流水",
/** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */
guardianWardMenu: "用餐历史",
+6
View File
@@ -30,6 +30,12 @@ export default {
wallet: "錢包管理",
/** 本人默认饭卡的充值快捷入口。 */
eatWalletTopUp: "飯卡充值",
/** 本人默认饭卡的钱包流水快捷入口。 */
eatWalletTransaction: "飯卡流水",
/** 用餐历史入口名称,涵盖本人和被监护人的用餐记录。 */
guardianWardMenu: "用餐歷史",
+60 -1
View File
@@ -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<MenuKey, { iconBg: string; iconColor?: string }> = {
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
+6 -1
View File
@@ -64,10 +64,15 @@ export default {
method: "GET",
params,
}),
all: (): Promise<any> =>
/**
* 查询当前登录用户可见的钱包分页;省略参数时保持服务端默认分页。
* @param params 可选分页参数,current 从 1 开始,size 表示每页钱包条数。
*/
all: (params?: { current?: number; size?: number }): Promise<any> =>
request({
url: "/wallet/wallet-manage/app/get-all",
method: "GET",
params,
}),
getQrCode: (params: any) =>
request({
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB