修正用户名显示逻辑进入服务列表页面自动刷新

This commit is contained in:
zhonghua.li
2026-04-17 08:12:56 +08:00
parent d74bc2ad1f
commit 18455a311d
14 changed files with 132 additions and 72 deletions

View File

@@ -40,13 +40,6 @@ Component({
iconPath: '/static/tabbar/insight.png', iconPath: '/static/tabbar/insight.png',
selectedIconPath: '/static/tabbar/insight_active.png', selectedIconPath: '/static/tabbar/insight_active.png',
}, },
{
key: 'furniture_reception',
text: '接待',
pagePath: 'pages/furniture_reception/furniture_reception',
iconPath: '/static/tabbar/reception.png',
selectedIconPath: '/static/tabbar/reception_active.png',
},
{ {
key: 'common_begin_reception', key: 'common_begin_reception',
text: '开始接待', text: '开始接待',
@@ -68,6 +61,13 @@ Component({
iconPath: '/static/tabbar/ai_analysis.png', iconPath: '/static/tabbar/ai_analysis.png',
selectedIconPath: '/static/tabbar/ai_analysis_active.png', selectedIconPath: '/static/tabbar/ai_analysis_active.png',
}, },
{
key: 'workbench',
text: '工作台',
pagePath: 'pages/workbench/workbench',
iconPath: '/static/tabbar/team.png',
selectedIconPath: '/static/tabbar/team_active.png',
},
{ {
key: 'furniture_top_sales', key: 'furniture_top_sales',
text: '销冠', text: '销冠',
@@ -280,8 +280,8 @@ Component({
'team': 'pages/team/team', 'team': 'pages/team/team',
'ucenter': 'pages/ucenter/ucenter', 'ucenter': 'pages/ucenter/ucenter',
'meeting_summary': 'pages-subpackage/meeting_summary/meeting_summary', 'meeting_summary': 'pages-subpackage/meeting_summary/meeting_summary',
'furniture_reception': 'pages/furniture_reception/furniture_reception',
'common_begin_reception': 'pages/furniture_reception/common_begin_reception', 'common_begin_reception': 'pages/furniture_reception/common_begin_reception',
'workbench': 'pages/workbench/workbench',
'furniture_customer': 'pages-subpackage/furniture_customer/furniture_customer', 'furniture_customer': 'pages-subpackage/furniture_customer/furniture_customer',
'ai_analysis': 'pages/ai_analysis/ai_analysis', 'ai_analysis': 'pages/ai_analysis/ai_analysis',
'furniture_top_sales': 'pages/furniture_top_sales/furniture_top_sales' 'furniture_top_sales': 'pages/furniture_top_sales/furniture_top_sales'
@@ -511,7 +511,7 @@ Component({
const hasFurnitureRole = roles.includes('furniture'); const hasFurnitureRole = roles.includes('furniture');
if (isAdminFurniture || hasFurnitureRole) { if (isAdminFurniture || hasFurnitureRole) {
const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter']; const furnitureTabs = ['ai_analysis', 'workbench', 'ucenter'];
console.log('[TabBar][allowed] furniture/admin_furniture role ->', furnitureTabs); console.log('[TabBar][allowed] furniture/admin_furniture role ->', furnitureTabs);
return furnitureTabs; return furnitureTabs;
} }

View File

@@ -34,13 +34,6 @@ export default {
roles: [], roles: [],
currentPath: '', currentPath: '',
allTabs: [ allTabs: [
{
key: 'furniture_reception',
text: '接待',
pagePath: '/pages/furniture_reception/furniture_reception',
iconPath: '/static/tabbar/reception.png',
selectedIconPath: '/static/tabbar/reception_active.png',
},
{ {
key: 'furniture_customer', key: 'furniture_customer',
text: '客户', text: '客户',
@@ -77,6 +70,13 @@ export default {
iconPath: '/static/tabbar/me.png', iconPath: '/static/tabbar/me.png',
selectedIconPath: '/static/tabbar/me_active.png', selectedIconPath: '/static/tabbar/me_active.png',
}, },
{
key: 'workbench',
text: '工作台',
pagePath: '/pages/workbench/workbench',
iconPath: '/static/tabbar/team.png',
selectedIconPath: '/static/tabbar/team_active.png',
},
{ {
key: 'ai_analysis', key: 'ai_analysis',
text: 'AI分析', text: 'AI分析',
@@ -96,36 +96,29 @@ export default {
}, },
computed: { computed: {
furnitureTabs() { furnitureTabs() {
// 强制返回所有家具角色的tab使用与pages.json相同的路径格式 // 与 pages.json 的 tabBar 一致AI分析、工作台、我的
return [ return [
{
key: 'furniture_reception',
text: '接待',
pagePath: 'pages/furniture_reception/furniture_reception', // 移除开头的/
iconPath: '/static/tabbar/reception.png',
selectedIconPath: '/static/tabbar/reception_active.png',
},
{
key: 'furniture_customer',
text: '客户',
pagePath: 'pages-subpackage/furniture_customer/furniture_customer', // 移除开头的/
iconPath: '/static/tabbar/customer.png',
selectedIconPath: '/static/tabbar/customer_active.png',
},
{ {
key: 'ai_analysis', key: 'ai_analysis',
text: 'AI分析', text: 'AI分析',
pagePath: 'pages/ai_analysis/ai_analysis', pagePath: '/pages/ai_analysis/ai_analysis',
iconPath: '/static/tabbar/ai_analysis.png', iconPath: '/static/tabbar/ai_analysis.png',
selectedIconPath: '/static/tabbar/ai_analysis_active.png', selectedIconPath: '/static/tabbar/ai_analysis_active.png',
}, },
{
key: 'workbench',
text: '工作台',
pagePath: '/pages/workbench/workbench',
iconPath: '/static/tabbar/team.png',
selectedIconPath: '/static/tabbar/team_active.png',
},
{ {
key: 'ucenter', key: 'ucenter',
text: '我的', text: '我的',
pagePath: 'pages/ucenter/ucenter', // 移除开头的/ pagePath: '/pages/ucenter/ucenter',
iconPath: '/static/tabbar/me.png', iconPath: '/static/tabbar/me.png',
selectedIconPath: '/static/tabbar/me_active.png', selectedIconPath: '/static/tabbar/me_active.png',
} },
]; ];
}, },
@@ -134,7 +127,7 @@ export default {
console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5'); console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5');
// 简化逻辑直接返回家具相关的tabs跳过权限检查 // 简化逻辑直接返回家具相关的tabs跳过权限检查
const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter']; const furnitureKeys = ['ai_analysis', 'workbench', 'ucenter'];
const result = furnitureKeys.map(key => { const result = furnitureKeys.map(key => {
return this.allTabs.find(tab => tab.key === key); return this.allTabs.find(tab => tab.key === key);
}).filter(Boolean); }).filter(Boolean);
@@ -289,15 +282,15 @@ export default {
console.log('GET ALLOWED KEYS - 简化版本总是返回家具相关tabs'); console.log('GET ALLOWED KEYS - 简化版本总是返回家具相关tabs');
// 简化逻辑总是返回家具相关的tabs // 简化逻辑总是返回家具相关的tabs
const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter']; const furnitureTabs = ['ai_analysis', 'workbench', 'ucenter'];
console.log('[TabBar][allowed] 简化逻辑 ->', furnitureTabs); console.log('[TabBar][allowed] 简化逻辑 ->', furnitureTabs);
return furnitureTabs; return furnitureTabs;
}, },
// #ifdef H5 // #ifdef H5
toggleNativeTabs() { toggleNativeTabs() {
// H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项 // H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项
// 当前位置顺序(根据 pages.json 的 tabBar.list 顺序接待、客户、AI分析、我的、团队、总结和统计 // 当前位置顺序( pages.json 的 tabBar.list 一致AI分析、工作台、我的
const ORDER = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception']; const ORDER = ['ai_analysis', 'workbench', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
const allowed = this.getAllowedKeys(); const allowed = this.getAllowedKeys();
// 限制重试次数,防止渲染时机未就绪 // 限制重试次数,防止渲染时机未就绪
this._h5TabRetries = (this._h5TabRetries || 0) + 1; this._h5TabRetries = (this._h5TabRetries || 0) + 1;
@@ -326,10 +319,9 @@ export default {
isInTabBar(pagePath) { isInTabBar(pagePath) {
// 检查页面路径是否在原生tabBar配置中 // 检查页面路径是否在原生tabBar配置中
const tabBarList = [ const tabBarList = [
'pages/furniture_reception/furniture_reception',
'pages-subpackage/furniture_customer/furniture_customer',
'pages/ai_analysis/ai_analysis', 'pages/ai_analysis/ai_analysis',
'pages/ucenter/ucenter' 'pages/workbench/workbench',
'pages/ucenter/ucenter',
]; ];
const normalizedPath = pagePath.startsWith('/') ? pagePath.substring(1) : pagePath; const normalizedPath = pagePath.startsWith('/') ? pagePath.substring(1) : pagePath;
const result = tabBarList.includes(normalizedPath); const result = tabBarList.includes(normalizedPath);
@@ -367,9 +359,8 @@ export default {
const allElements = document.querySelectorAll('*'); const allElements = document.querySelectorAll('*');
const tabElements = Array.from(allElements).filter(el => const tabElements = Array.from(allElements).filter(el =>
el.textContent && ( el.textContent && (
el.textContent.includes('接待') ||
el.textContent.includes('客户') ||
el.textContent.includes('AI分析') || el.textContent.includes('AI分析') ||
el.textContent.includes('工作台') ||
el.textContent.includes('我的') el.textContent.includes('我的')
) )
); );
@@ -406,9 +397,9 @@ export default {
return; return;
} }
// 按文本内容排序:接待、客户、AI分析、我的 // 按文本内容排序AI分析、工作台、我的
const sortedElements = tabElements.sort((a, b) => { const sortedElements = tabElements.sort((a, b) => {
const order = ['接待', '客户', 'AI分析', '我的']; const order = ['AI分析', '工作台', '我的'];
const aIndex = order.findIndex(text => a.textContent.includes(text)); const aIndex = order.findIndex(text => a.textContent.includes(text));
const bIndex = order.findIndex(text => b.textContent.includes(text)); const bIndex = order.findIndex(text => b.textContent.includes(text));
return aIndex - bIndex; return aIndex - bIndex;
@@ -418,7 +409,7 @@ export default {
// 处理每个元素 // 处理每个元素
sortedElements.forEach((element, index) => { sortedElements.forEach((element, index) => {
const keyMap = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter']; const keyMap = ['ai_analysis', 'workbench', 'ucenter'];
const key = keyMap[index]; const key = keyMap[index];
const shouldShow = allowed.includes(key); const shouldShow = allowed.includes(key);

View File

@@ -40,7 +40,12 @@
</view> </view>
<!-- 服务状态列表 --> <!-- 服务状态列表 -->
<service-list-furniture v-if="activeTab === 'status'" class="service-status-container" :style="{ top: computedContentTop || contentTop }"></service-list-furniture> <service-list-furniture
v-if="activeTab === 'status'"
ref="serviceListRef"
class="service-status-container"
:style="{ top: computedContentTop || contentTop }"
></service-list-furniture>
<!-- 开始接待表单 --> <!-- 开始接待表单 -->
<common-begin-reception <common-begin-reception
@@ -467,6 +472,21 @@ import ServiceListFurniture from "./serviceListFurniture.vue";
}); });
}, },
methods: { methods: {
/**
* 由宿主页 onShow / 分包就绪后调用。tab 页缓存时子列表的 mounted 不会重复执行,需在此主动拉取后端数据。
*/
refreshPageData() {
this.$nextTick(() => {
if (this.activeTab === 'status') {
const list = this.$refs.serviceListRef;
if (list && typeof list.onServiceStatusRefresh === 'function') {
list.onServiceStatusRefresh();
}
} else if (this.activeTab === 'tag' && this.tagViewMode === 'list') {
this.fetchTagList({ force: true });
}
});
},
applyIncomingTab(tab) { applyIncomingTab(tab) {
const allowed = ['status', 'reception', 'tag']; const allowed = ['status', 'reception', 'tag'];
if (!allowed.includes(tab)) return; if (!allowed.includes(tab)) return;

View File

@@ -82,13 +82,23 @@
if (item.path) { if (item.path) {
// 判断是 tabBar 页面还是普通页面 // 判断是 tabBar 页面还是普通页面
const tabBarPages = [ const tabBarPages = [
'/pages/furniture_reception/furniture_reception',
'/pages-subpackage/furniture_customer/furniture_customer', '/pages-subpackage/furniture_customer/furniture_customer',
'/pages/furniture_top_sales/furniture_top_sales', '/pages/furniture_top_sales/furniture_top_sales',
'/pages/ucenter/ucenter' '/pages/ucenter/ucenter'
]; ];
if (tabBarPages.includes(item.path)) { if (item.path === '/pages/furniture_reception/furniture_reception') {
uni.navigateTo({
url: item.path,
fail: (err) => {
console.error('跳转失败:', err);
uni.showToast({
title: '页面不存在',
icon: 'none'
});
}
});
} else if (tabBarPages.includes(item.path)) {
uni.switchTab({ uni.switchTab({
url: item.path, url: item.path,
fail: (err) => { fail: (err) => {

View File

@@ -10,6 +10,9 @@
"path": "pages/furniture_reception/furniture_reception", "path": "pages/furniture_reception/furniture_reception",
"style": { "style": {
"navigationStyle": "custom" "navigationStyle": "custom"
},
"componentPlaceholder": {
"FurnitureReceptionImpl": "pages-subpackage/furniture_reception/furniture_reception-impl"
} }
}, },
{ {
@@ -440,12 +443,6 @@
"borderStyle": "black", "borderStyle": "black",
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"list": [ "list": [
{
"pagePath": "pages/furniture_reception/furniture_reception",
"iconPath": "static/tabbar/reception.png",
"selectedIconPath": "static/tabbar/reception_active.png",
"text": "接待"
},
{ {
"pagePath": "pages/ai_analysis/ai_analysis", "pagePath": "pages/ai_analysis/ai_analysis",
"iconPath": "static/tabbar/ai_analysis.png", "iconPath": "static/tabbar/ai_analysis.png",
@@ -454,8 +451,8 @@
}, },
{ {
"pagePath": "pages/workbench/workbench", "pagePath": "pages/workbench/workbench",
"iconPath": "static/tabbar/team.svg", "iconPath": "static/tabbar/team.png",
"selectedIconPath": "static/tabbar/team_active.svg", "selectedIconPath": "static/tabbar/team_active.png",
"text": "工作台" "text": "工作台"
}, },
{ {

View File

@@ -445,7 +445,7 @@ export default {
} catch (e) { } catch (e) {
console.warn('[AIAnalysis] 写入接待tab快捷跳转参数失败:', e); console.warn('[AIAnalysis] 写入接待tab快捷跳转参数失败:', e);
} }
uni.switchTab({ uni.navigateTo({
url: '/pages/furniture_reception/furniture_reception', url: '/pages/furniture_reception/furniture_reception',
fail: (err) => { fail: (err) => {
console.error('[AIAnalysis] 快捷跳转接待页失败:', err); console.error('[AIAnalysis] 快捷跳转接待页失败:', err);

View File

@@ -1,6 +1,10 @@
<template> <template>
<view class="subpackage-host"> <view class="subpackage-host">
<FurnitureReceptionImpl v-if="implReady" :incomingTab="incomingTab" /> <FurnitureReceptionImpl
v-if="implReady"
ref="furnitureReceptionImpl"
:incomingTab="incomingTab"
/>
<view v-else class="loading"> <view v-else class="loading">
<text v-if="error">{{ error }}</text> <text v-if="error">{{ error }}</text>
<text v-else>正在加载接待模块...</text> <text v-else>正在加载接待模块...</text>
@@ -9,11 +13,16 @@
</template> </template>
<script> <script>
// 微信小程序pages.json 的 componentPlaceholder 注册分包组件requiredComponents / 分包异步化)
// #ifndef MP-WEIXIN
import FurnitureReceptionImpl from '@/pages-subpackage/furniture_reception/furniture_reception-impl.vue'; import FurnitureReceptionImpl from '@/pages-subpackage/furniture_reception/furniture_reception-impl.vue';
// #endif
export default { export default {
components: { components: {
// #ifndef MP-WEIXIN
FurnitureReceptionImpl FurnitureReceptionImpl
// #endif
}, },
data() { data() {
return { return {
@@ -41,6 +50,8 @@ export default {
} catch (e) { } catch (e) {
// ignore // ignore
} }
// 底部 tab 等场景下页面会被缓存,子组件 mounted 不会再次执行,需每次显示时拉取最新数据
this.refreshImplDataIfReady();
}, },
methods: { methods: {
loadSubPackagePagesSubpackage() { loadSubPackagePagesSubpackage() {
@@ -67,10 +78,23 @@ export default {
try { try {
await this.loadSubPackagePagesSubpackage(); await this.loadSubPackagePagesSubpackage();
this.implReady = true; this.implReady = true;
await this.$nextTick();
this.refreshImplDataIfReady();
} catch (e) { } catch (e) {
console.error('[FurnitureReceptionHost] loadImpl failed:', e); console.error('[FurnitureReceptionHost] loadImpl failed:', e);
this.error = '接待模块加载失败,请重试'; this.error = '接待模块加载失败,请重试';
} }
},
refreshImplDataIfReady() {
if (!this.implReady) {
return;
}
this.$nextTick(() => {
const impl = this.$refs.furnitureReceptionImpl;
if (impl && typeof impl.refreshPageData === 'function') {
impl.refreshPageData();
}
});
} }
} }
}; };

View File

@@ -7,8 +7,8 @@
<uni-easyinput v-model="deviceBindForm.deviceCode" placeholder="请输入设备编号" /> <uni-easyinput v-model="deviceBindForm.deviceCode" placeholder="请输入设备编号" />
</view> </view>
<view class="device-bind-field"> <view class="device-bind-field">
<text class="device-bind-label">家长电话</text> <text class="device-bind-label">电话</text>
<uni-easyinput v-model="deviceBindForm.salesPhone" placeholder="请输入销售电话" type="number" /> <uni-easyinput v-model="deviceBindForm.salesPhone" placeholder="请输入电话" type="number" />
</view> </view>
<view class="device-bind-field"> <view class="device-bind-field">
<text class="device-bind-label">所属门店</text> <text class="device-bind-label">所属门店</text>

View File

@@ -9,7 +9,7 @@
</view> </view>
<view class="logo-title"> <view class="logo-title">
<text class="uer-name" v-if="hasLogin">{{userInfo.nickname||userInfo.username||userInfo.mobile}}</text> <text class="uer-name" v-if="hasLogin">{{headerDisplayName}}</text>
<text class="uer-name" v-else>{{$t('mine.notLogged')}}</text> <text class="uer-name" v-else>{{$t('mine.notLogged')}}</text>
</view> </view>
</view> </view>
@@ -287,6 +287,13 @@
} catch (e) { } catch (e) {
return {}; return {};
} }
},
/** 与下方「用户名」卡片一致:优先后端登录名,避免 nickname 存成手机号时盖住真实用户名 */
headerDisplayName() {
const backend = (this.loginUserInfo && this.loginUserInfo.userName) || ''
if (backend) return backend
const u = this.userInfo || {}
return u.username || u.nickname || u.mobile || ''
} }
}, },
methods: { methods: {
@@ -385,8 +392,12 @@
this[item.event](); this[item.event]();
} else if (item.to) { } else if (item.to) {
// 如果是 tabBar 页面,使用 switchTab // 如果是 tabBar 页面,使用 switchTab
const tabBarPages = ['/pages/furniture_reception/furniture_reception', '/pages-subpackage/furniture_customer/furniture_customer', '/pages/ai_analysis/ai_analysis', '/pages/xixi/xixi', '/pages/ucenter/ucenter'] const tabBarPages = ['/pages-subpackage/furniture_customer/furniture_customer', '/pages/ai_analysis/ai_analysis', '/pages/xixi/xixi', '/pages/ucenter/ucenter']
if (tabBarPages.includes(item.to)) { if (item.to === '/pages/furniture_reception/furniture_reception') {
uni.navigateTo({
url: item.to
})
} else if (tabBarPages.includes(item.to)) {
uni.switchTab({ uni.switchTab({
url: item.to url: item.to
}) })

View File

@@ -72,6 +72,13 @@ export default {
switchTabWithQuery(basePath, tab) { switchTabWithQuery(basePath, tab) {
if (basePath === '/pages/furniture_reception/furniture_reception') { if (basePath === '/pages/furniture_reception/furniture_reception') {
uni.setStorageSync('workbench-reception-tab', tab); uni.setStorageSync('workbench-reception-tab', tab);
uni.navigateTo({
url: basePath,
fail: () => {
uni.showToast({ title: '跳转接待页失败', icon: 'none' });
},
});
return;
} }
uni.switchTab({ uni.switchTab({
url: basePath, url: basePath,

View File

@@ -528,7 +528,7 @@
// 微信登录成功后跳转到首页 // 微信登录成功后跳转到首页
setTimeout(() => { setTimeout(() => {
uni.switchTab({ uni.switchTab({
url: '/pages/furniture_reception/furniture_reception' url: '/pages/ai_analysis/ai_analysis'
}) })
}, 500); }, 500);
}).catch(err => { }).catch(err => {
@@ -542,7 +542,7 @@
// 即使获取用户信息失败,也要跳转 // 即使获取用户信息失败,也要跳转
setTimeout(() => { setTimeout(() => {
uni.switchTab({ uni.switchTab({
url: '/pages/furniture_reception/furniture_reception' url: '/pages/ai_analysis/ai_analysis'
}) })
}, 500); }, 500);
}); });

View File

@@ -230,13 +230,13 @@
console.warn('[Login] Failed to update global role info:', e); console.warn('[Login] Failed to update global role info:', e);
} }
// 登录成功后跳转到首页(接待页面 // 登录成功后跳转到首页(tabBar 首页AI分析
// 在微信小程序中增加延迟确保store更新完全后再跳转 // 在微信小程序中增加延迟确保store更新完全后再跳转
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
setTimeout(() => { setTimeout(() => {
console.log('[Login] Preparing to navigate after login, hasLogin:', store.hasLogin) console.log('[Login] Preparing to navigate after login, hasLogin:', store.hasLogin)
uni.switchTab({ uni.switchTab({
url: '/pages/furniture_reception/furniture_reception', url: '/pages/ai_analysis/ai_analysis',
success: () => { success: () => {
console.log('[Login] Navigation successful, checking login status after navigation') console.log('[Login] Navigation successful, checking login status after navigation')
// 延迟检查,确保页面跳转完成后再检查状态 // 延迟检查,确保页面跳转完成后再检查状态
@@ -253,7 +253,7 @@
// #ifndef MP-WEIXIN // #ifndef MP-WEIXIN
setTimeout(() => { setTimeout(() => {
uni.switchTab({ uni.switchTab({
url: '/pages/furniture_reception/furniture_reception' url: '/pages/ai_analysis/ai_analysis'
}) })
}, 300) }, 300)
// #endif // #endif

View File

@@ -100,8 +100,8 @@
}, },
{ {
"pagePath": "pages/workbench/workbench", "pagePath": "pages/workbench/workbench",
"iconPath": "static/tabbar/team.svg", "iconPath": "static/tabbar/team.png",
"selectedIconPath": "static/tabbar/team_active.svg", "selectedIconPath": "static/tabbar/team_active.png",
"text": "工作台" "text": "工作台"
}, },
{ {

File diff suppressed because one or more lines are too long