feat(market): 市场动态接口联调
This commit is contained in:
parent
40e3df9ab0
commit
1c1667b879
|
@ -9,62 +9,52 @@
|
|||
const http = uni.$u.http
|
||||
|
||||
//考核明细接口
|
||||
export const getAssessList = (params) => http.get('/member/api/assess/assessList', {
|
||||
params
|
||||
})
|
||||
export const getAssessList = params =>
|
||||
http.get('/member/api/assess/assessList', {
|
||||
params,
|
||||
})
|
||||
|
||||
//考核分红积分
|
||||
export const getAssAchieve = (params) => http.get('/member/api/assess/assAchieve', {
|
||||
params
|
||||
})
|
||||
|
||||
export const getAssAchieve = params =>
|
||||
http.get('/member/api/assess/assAchieve', {
|
||||
params,
|
||||
})
|
||||
|
||||
//考核状态复购考核
|
||||
export const getAssessStatusList = (params) => http.get('/system/pub/enums/member-assess-status', {
|
||||
params
|
||||
})
|
||||
export const getAssessStatusList = params =>
|
||||
http.get('/system/pub/enums/member-assess-status', {
|
||||
params,
|
||||
})
|
||||
|
||||
//注册等级下拉选
|
||||
export const getGradeList = (params) => http.get('/system/api/grade/list', {
|
||||
params
|
||||
})
|
||||
|
||||
export const getGradeList = params =>
|
||||
http.get('/system/api/grade/list', {
|
||||
params,
|
||||
})
|
||||
|
||||
//注册列表
|
||||
export const getRegList = (params) => http.get('/member/api/market-news/reg-list', {
|
||||
params
|
||||
})
|
||||
export const getRegList = params =>
|
||||
http.get('/member/api/market-news/reg-list', {
|
||||
params,
|
||||
})
|
||||
|
||||
//招商列表
|
||||
export const tripleCycleList = (params) => http.get('/member/api/market-news/triple_cycle_list', {
|
||||
params
|
||||
})
|
||||
|
||||
//海粉列表
|
||||
export const seaFlourList = (params) => http.get('/member/api/market-news/sea_flour_list', {
|
||||
params
|
||||
})
|
||||
export const tripleCycleList = params =>
|
||||
http.get('/member/api/market-news/triple_cycle_list', {
|
||||
params,
|
||||
})
|
||||
|
||||
//菜单列表
|
||||
export const menuList = (params) => http.get('/system/api/menu/list', {
|
||||
params
|
||||
})
|
||||
export const menuList = params =>
|
||||
http.get('/system/api/menu/list', {
|
||||
params,
|
||||
})
|
||||
//直推列表
|
||||
export const parentList = (params) => http.get('/member/api/member/parent-list', {
|
||||
params
|
||||
})
|
||||
export const parentList = params =>
|
||||
http.get('/member/api/member/parent-list', {
|
||||
params,
|
||||
})
|
||||
|
||||
|
||||
|
||||
// 抗衰能量仓列表
|
||||
export const getSiloList = (params) => http.post('/member/api/silo/list', params)
|
||||
|
||||
|
||||
|
||||
//查询能量仓明细
|
||||
export const getSiloDetail = (params) => http.post('/member/api/silo/detail', params)
|
||||
|
||||
// 沙棘公益列表
|
||||
export const treeList = (params) => http.get('/activity/api/tree-rule-pick/member-info-list', {
|
||||
params
|
||||
})
|
||||
// 市场动态接口
|
||||
export const marketDynamicsList = params =>
|
||||
http.post('/retail-member/api/retail-member/market-dynamics', params)
|
||||
|
|
|
@ -20,7 +20,7 @@ module.exports = vm => {
|
|||
|
||||
//#ifdef DEV_SERVER
|
||||
console.log('DEV_SERVER')
|
||||
config.baseURL = 'http://localhost:8080'
|
||||
config.baseURL = 'http://192.168.0.102:8080'
|
||||
//#endif
|
||||
|
||||
//#ifdef QA_SERVER
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<template>
|
||||
<view class="container">
|
||||
<!-- <view class="search-bar">
|
||||
<view class="search-bar">
|
||||
<u-search
|
||||
placeholder="请输入会员编号或姓名查询"
|
||||
v-model="keyword"
|
||||
@custom="search"
|
||||
@search="search"
|
||||
></u-search>
|
||||
</view> -->
|
||||
</view>
|
||||
|
||||
<!-- 特殊会员信息 -->
|
||||
<view class="top-member-card" v-if="topMember">
|
||||
|
@ -68,6 +68,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { marketDynamicsList } from '@/config/market'
|
||||
// 假设的API方法,您需要替换为真实实现
|
||||
// import { getMarketAchievementTop, getMarketAchievementList } from '@/config/mine.js';
|
||||
|
||||
|
@ -86,141 +87,90 @@ export default {
|
|||
uni.setNavigationBarTitle({
|
||||
title: '市场动态-业绩',
|
||||
})
|
||||
this.fetchTopMember()
|
||||
this.fetchMemberList(true)
|
||||
this.fetchData(true)
|
||||
},
|
||||
onReachBottom() {
|
||||
if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') {
|
||||
return
|
||||
}
|
||||
this.page++
|
||||
this.fetchMemberList()
|
||||
this.fetchData()
|
||||
},
|
||||
methods: {
|
||||
formatMemberInfo(member) {
|
||||
if (!member) return ''
|
||||
// 使用 award 字段来表示会员的奖励或头衔
|
||||
const { memberCode, nickName, grade, award } = member
|
||||
return `${memberCode}/${nickName}/${grade}/${award}`
|
||||
let info = `${memberCode}/${nickName}/${grade}`
|
||||
// 当 award 存在且不为 "无" 时,才将其拼接到会员信息中
|
||||
if (award && award !== '无') {
|
||||
info += `/${award}`
|
||||
}
|
||||
return info
|
||||
},
|
||||
search() {
|
||||
this.memberList = []
|
||||
this.page = 1
|
||||
this.fetchTopMember()
|
||||
this.fetchMemberList(true)
|
||||
this.fetchData(true)
|
||||
},
|
||||
// 获取置顶会员数据
|
||||
async fetchTopMember() {
|
||||
// --- MOCK DATA ---
|
||||
this.topMember = {
|
||||
memberId: 'HZS32223336', // Using memberId as key
|
||||
memberCode: 'HZS32223336',
|
||||
nickName: '小新哥',
|
||||
grade: 'V5',
|
||||
award: 'W1',
|
||||
todayAchievement: 0.0,
|
||||
yesterdayAchievement: 1.0978,
|
||||
monthAchievement: 2.3395,
|
||||
lastMonthAchievement: 10.7727,
|
||||
// 映射API数据到组件内使用的数据结构
|
||||
mapApiDataToMember(apiData) {
|
||||
if (!apiData) return null
|
||||
|
||||
return {
|
||||
memberId: apiData.pkId || apiData.memberCode, // 使用 pkId 作为唯一标识
|
||||
memberCode: apiData.memberCode,
|
||||
nickName: apiData.memberName,
|
||||
grade: apiData.gradeName,
|
||||
award: apiData.awardsName,
|
||||
todayAchievement: parseFloat(apiData.todayPv || 0).toFixed(2),
|
||||
yesterdayAchievement: parseFloat(apiData.yesterdayPv || 0).toFixed(2),
|
||||
monthAchievement: parseFloat(apiData.currentMonthPv || 0).toFixed(2),
|
||||
lastMonthAchievement: parseFloat(apiData.lastMonthPv || 0).toFixed(2),
|
||||
}
|
||||
// --- REAL API CALL ---
|
||||
// try {
|
||||
// const res = await getMarketAchievementTop({ keyword: this.keyword });
|
||||
// if (res.code === 200) {
|
||||
// this.topMember = res.data;
|
||||
// }
|
||||
// } catch (e) {
|
||||
// console.error(e);
|
||||
// }
|
||||
},
|
||||
// 获取会员列表数据
|
||||
async fetchMemberList(isRefresh = false) {
|
||||
async fetchData(isRefresh = false) {
|
||||
if (isRefresh) {
|
||||
this.page = 1
|
||||
this.memberList = []
|
||||
this.topMember = null
|
||||
}
|
||||
this.loadStatus = 'loading'
|
||||
|
||||
// --- MOCK DATA ---
|
||||
const mockData = [
|
||||
{
|
||||
memberId: 'HZS81617255',
|
||||
memberCode: 'HZS81617255',
|
||||
nickName: '小星哥',
|
||||
grade: 'V5',
|
||||
award: 'W1',
|
||||
todayAchievement: 0.0,
|
||||
yesterdayAchievement: 0.0499,
|
||||
monthAchievement: 1.2881,
|
||||
lastMonthAchievement: 26.3515,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS93817578',
|
||||
memberCode: 'HZS93817578',
|
||||
nickName: '婉琳',
|
||||
grade: 'V5',
|
||||
award: 'W1',
|
||||
todayAchievement: 0.0,
|
||||
yesterdayAchievement: 0.0,
|
||||
monthAchievement: 0.508,
|
||||
lastMonthAchievement: 2.422,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS55865236',
|
||||
memberCode: 'HZS55865236',
|
||||
nickName: '谭谭',
|
||||
grade: 'V5',
|
||||
award: 'W1',
|
||||
todayAchievement: 0.0,
|
||||
yesterdayAchievement: 0.0,
|
||||
monthAchievement: 0.4261,
|
||||
lastMonthAchievement: 8.5454,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS67896897',
|
||||
memberCode: 'HZS67896897',
|
||||
nickName: '楠杉',
|
||||
grade: 'V5',
|
||||
award: 'W1',
|
||||
todayAchievement: 0.0,
|
||||
yesterdayAchievement: 0.0,
|
||||
monthAchievement: 0.0,
|
||||
lastMonthAchievement: 0.0,
|
||||
},
|
||||
]
|
||||
try {
|
||||
const res = await marketDynamicsList({
|
||||
pageNum: this.page,
|
||||
pageSize: this.pageSize,
|
||||
keywords: this.keyword,
|
||||
})
|
||||
if (res.code === 200 && res.data) {
|
||||
// 在刷新时,更新顶部特殊会员信息
|
||||
if (this.page === 1 && res.data.bigRange) {
|
||||
this.topMember = this.mapApiDataToMember(res.data.bigRange)
|
||||
}
|
||||
|
||||
// Simulate network delay and pagination
|
||||
setTimeout(() => {
|
||||
// Mock: stop after 2 pages
|
||||
if (this.page > 2) {
|
||||
const newMembers = res.data.rows.map(item =>
|
||||
this.mapApiDataToMember(item)
|
||||
)
|
||||
this.memberList = [...this.memberList, ...newMembers]
|
||||
|
||||
// 根据返回的数据量判断是否还有更多数据
|
||||
if (
|
||||
newMembers.length < this.pageSize ||
|
||||
this.memberList.length >= res.data.total
|
||||
) {
|
||||
this.loadStatus = 'nomore'
|
||||
} else {
|
||||
this.loadStatus = 'loadmore'
|
||||
}
|
||||
} else {
|
||||
// 接口异常或无数据时,标记为没有更多数据
|
||||
this.loadStatus = 'nomore'
|
||||
return
|
||||
}
|
||||
|
||||
const moreData = mockData.map(item => ({
|
||||
...item,
|
||||
memberId: item.memberId + this.page, // unique key for v-for
|
||||
}))
|
||||
this.memberList = [...this.memberList, ...moreData]
|
||||
|
||||
// After adding data, check if we should be able to load more
|
||||
this.loadStatus = this.page >= 2 ? 'nomore' : 'loadmore'
|
||||
}, 500)
|
||||
|
||||
// --- REAL API CALL ---
|
||||
// try {
|
||||
// const res = await getMarketAchievementList({ page: this.page, size: this.pageSize, keyword: this.keyword });
|
||||
// if (res.code === 200) {
|
||||
// this.memberList = [...this.memberList, ...res.data.records];
|
||||
// if (res.data.records.length < this.pageSize) {
|
||||
// this.loadStatus = 'nomore';
|
||||
// } else {
|
||||
// this.loadStatus = 'loadmore';
|
||||
// }
|
||||
// }
|
||||
// } catch(e) {
|
||||
// this.loadStatus = 'loadmore';
|
||||
// console.error(e);
|
||||
// }
|
||||
} catch (e) {
|
||||
// 请求失败时,允许用户再次尝试加载
|
||||
this.loadStatus = 'loadmore'
|
||||
console.error(e)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<template>
|
||||
<view class="container">
|
||||
<!-- <view class="search-bar">
|
||||
<view class="search-bar">
|
||||
<u-search
|
||||
placeholder="请输入会员编号或姓名查询"
|
||||
v-model="keyword"
|
||||
@custom="search"
|
||||
@search="search"
|
||||
></u-search>
|
||||
</view> -->
|
||||
</view>
|
||||
|
||||
<!-- 特殊会员信息 -->
|
||||
<view class="top-member-card" v-if="topMember">
|
||||
|
@ -21,15 +21,15 @@
|
|||
<text class="stat-label">今日盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ topMember.yesterdayBox }}</text>
|
||||
<text class="stat-value">{{ toInt(topMember.yesterdayBox) }}</text>
|
||||
<text class="stat-label">昨日盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ topMember.monthBox }}</text>
|
||||
<text class="stat-value">{{ toInt(topMember.monthBox) }}</text>
|
||||
<text class="stat-label">本月盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ topMember.lastMonthBox }}</text>
|
||||
<text class="stat-value">{{ toInt(topMember.lastMonthBox) }}</text>
|
||||
<text class="stat-label">上月盒数</text>
|
||||
</view>
|
||||
</view>
|
||||
|
@ -48,15 +48,15 @@
|
|||
<text class="stat-label">今日盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ item.yesterdayBox }}</text>
|
||||
<text class="stat-value">{{ toInt(item.yesterdayBox) }}</text>
|
||||
<text class="stat-label">昨日盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ item.monthBox }}</text>
|
||||
<text class="stat-value">{{ toInt(item.monthBox) }}</text>
|
||||
<text class="stat-label">本月盒数</text>
|
||||
</view>
|
||||
<view class="stat-item">
|
||||
<text class="stat-value">{{ item.lastMonthBox }}</text>
|
||||
<text class="stat-value">{{ toInt(item.lastMonthBox) }}</text>
|
||||
<text class="stat-label">上月盒数</text>
|
||||
</view>
|
||||
</view>
|
||||
|
@ -69,6 +69,7 @@
|
|||
|
||||
<script>
|
||||
// 假设的API方法,您需要替换为真实实现
|
||||
import { marketDynamicsList } from '@/config/market'
|
||||
// import { getMarketBoxTop, getMarketBoxList } from '@/config/mine.js';
|
||||
|
||||
export default {
|
||||
|
@ -83,147 +84,93 @@ export default {
|
|||
}
|
||||
},
|
||||
onLoad() {
|
||||
this.fetchTopMember()
|
||||
this.fetchMemberList(true)
|
||||
uni.setNavigationBarTitle({
|
||||
title: '市场动态-盒数',
|
||||
})
|
||||
this.fetchData(true)
|
||||
},
|
||||
onReachBottom() {
|
||||
if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') {
|
||||
return
|
||||
}
|
||||
this.page++
|
||||
this.fetchMemberList()
|
||||
this.fetchData()
|
||||
},
|
||||
methods: {
|
||||
toInt(value) {
|
||||
if (value === null || value === undefined) return 0
|
||||
const intValue = parseInt(value, 10)
|
||||
return isNaN(intValue) ? value : intValue
|
||||
return isNaN(intValue) ? 0 : intValue
|
||||
},
|
||||
formatMemberInfo(member) {
|
||||
if (!member) return ''
|
||||
const { memberCode, nickName, grade, award } = member
|
||||
return `${memberCode}/${nickName || '未知'}/${grade}/${award}`
|
||||
let info = `${memberCode}/${nickName}/${grade}`
|
||||
if (award && award !== '无') {
|
||||
info += `/${award}`
|
||||
}
|
||||
return info
|
||||
},
|
||||
search() {
|
||||
this.memberList = []
|
||||
this.page = 1
|
||||
this.fetchTopMember()
|
||||
this.fetchMemberList(true)
|
||||
this.fetchData(true)
|
||||
},
|
||||
// 获取置顶会员数据
|
||||
async fetchTopMember() {
|
||||
// --- MOCK DATA from screenshot ---
|
||||
this.topMember = {
|
||||
memberId: 'HZS55197913',
|
||||
memberCode: 'HZS55197913',
|
||||
nickName: '未知', // Screenshot has no name, API might
|
||||
grade: 'V5',
|
||||
award: 'S2',
|
||||
todayBox: 3361.0,
|
||||
yesterdayBox: 114,
|
||||
monthBox: 3475,
|
||||
lastMonthBox: 3206,
|
||||
// 映射API数据到组件内使用的数据结构
|
||||
mapApiDataToMember(apiData) {
|
||||
if (!apiData) return null
|
||||
|
||||
return {
|
||||
memberId: apiData.pkId || apiData.memberCode,
|
||||
memberCode: apiData.memberCode,
|
||||
nickName: apiData.memberName,
|
||||
grade: apiData.gradeName,
|
||||
award: apiData.awardsName,
|
||||
todayBox: apiData.todayBoxNum,
|
||||
yesterdayBox: apiData.yesterdayBoxNum,
|
||||
monthBox: apiData.currentMonthBoxNum,
|
||||
lastMonthBox: apiData.lastMonthBoxNum,
|
||||
}
|
||||
// --- REAL API CALL ---
|
||||
// try {
|
||||
// const res = await getMarketBoxTop({ keyword: this.keyword });
|
||||
// if (res.code === 200) {
|
||||
// // Real data mapping from fields like realizedBox, upMonthBox
|
||||
// this.topMember = { ...res.data, todayBox: res.data.realizedBox, lastMonthBox: res.data.upMonthBox };
|
||||
// }
|
||||
// } catch (e) {
|
||||
// console.error(e);
|
||||
// }
|
||||
},
|
||||
// 获取会员列表数据
|
||||
async fetchMemberList(isRefresh = false) {
|
||||
async fetchData(isRefresh = false) {
|
||||
if (isRefresh) {
|
||||
this.page = 1
|
||||
this.memberList = []
|
||||
this.topMember = null
|
||||
}
|
||||
this.loadStatus = 'loading'
|
||||
|
||||
// --- MOCK DATA from screenshot ---
|
||||
const mockData = [
|
||||
{
|
||||
memberId: 'HZS931295626',
|
||||
memberCode: 'HZS931295626',
|
||||
nickName: '未知',
|
||||
grade: 'V5',
|
||||
award: 'S1',
|
||||
todayBox: 38.0,
|
||||
yesterdayBox: 0,
|
||||
monthBox: 38,
|
||||
lastMonthBox: 503,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS938173516',
|
||||
memberCode: 'HZS938173516',
|
||||
nickName: '未知',
|
||||
grade: 'V3',
|
||||
award: 'S0',
|
||||
todayBox: 25.0,
|
||||
yesterdayBox: 0,
|
||||
monthBox: 25,
|
||||
lastMonthBox: 0,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS61632161',
|
||||
memberCode: 'HZS61632161',
|
||||
nickName: '未知',
|
||||
grade: 'V3',
|
||||
award: 'S0',
|
||||
todayBox: 16.0,
|
||||
yesterdayBox: 0,
|
||||
monthBox: 16,
|
||||
lastMonthBox: 0,
|
||||
},
|
||||
{
|
||||
memberId: 'HZS978982363',
|
||||
memberCode: 'HZS978982363',
|
||||
nickName: '未知',
|
||||
grade: 'V3',
|
||||
award: 'S0',
|
||||
todayBox: 15.0,
|
||||
yesterdayBox: 0,
|
||||
monthBox: 15,
|
||||
lastMonthBox: 0,
|
||||
},
|
||||
]
|
||||
try {
|
||||
const res = await marketDynamicsList({
|
||||
pageNum: this.page,
|
||||
pageSize: this.pageSize,
|
||||
keywords: this.keyword,
|
||||
type: 2, // 1=业绩 2=盒数
|
||||
})
|
||||
if (res.code === 200 && res.data) {
|
||||
if (this.page === 1 && res.data.bigRange) {
|
||||
this.topMember = this.mapApiDataToMember(res.data.bigRange)
|
||||
}
|
||||
|
||||
// Simulate network delay and pagination
|
||||
setTimeout(() => {
|
||||
// Mock: stop after 2 pages
|
||||
if (this.page > 2) {
|
||||
const newMembers = res.data.rows.map(item =>
|
||||
this.mapApiDataToMember(item)
|
||||
)
|
||||
this.memberList = [...this.memberList, ...newMembers]
|
||||
|
||||
if (
|
||||
newMembers.length < this.pageSize ||
|
||||
this.memberList.length >= res.data.total
|
||||
) {
|
||||
this.loadStatus = 'nomore'
|
||||
} else {
|
||||
this.loadStatus = 'loadmore'
|
||||
}
|
||||
} else {
|
||||
this.loadStatus = 'nomore'
|
||||
return
|
||||
}
|
||||
|
||||
const moreData = mockData.map(item => ({
|
||||
...item,
|
||||
memberId: item.memberId + this.page, // unique key for v-for
|
||||
}))
|
||||
this.memberList = [...this.memberList, ...moreData]
|
||||
|
||||
// After adding data, check if we should be able to load more
|
||||
this.loadStatus = this.page >= 2 ? 'nomore' : 'loadmore'
|
||||
}, 500)
|
||||
|
||||
// --- REAL API CALL ---
|
||||
// try {
|
||||
// const res = await getMarketBoxList({ page: this.page, size: this.pageSize, keyword: this.keyword });
|
||||
// if (res.code === 200) {
|
||||
// const newList = res.data.records.map(item => ({ ...item, todayBox: item.realizedBox, lastMonthBox: item.upMonthBox }));
|
||||
// this.memberList = [...this.memberList, ...newList];
|
||||
// if (res.data.records.length < this.pageSize) {
|
||||
// this.loadStatus = 'nomore';
|
||||
// } else {
|
||||
// this.loadStatus = 'loadmore';
|
||||
// }
|
||||
// }
|
||||
// } catch(e) {
|
||||
// this.loadStatus = 'loadmore';
|
||||
// console.error(e);
|
||||
// }
|
||||
} catch (e) {
|
||||
this.loadStatus = 'loadmore'
|
||||
console.error(e)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue