feat(market): 市场动态接口联调

This commit is contained in:
woody 2025-06-13 17:40:55 +08:00
parent 40e3df9ab0
commit 1c1667b879
4 changed files with 164 additions and 277 deletions

View File

@ -9,62 +9,52 @@
const http = uni.$u.http const http = uni.$u.http
//考核明细接口 //考核明细接口
export const getAssessList = (params) => http.get('/member/api/assess/assessList', { export const getAssessList = params =>
params http.get('/member/api/assess/assessList', {
}) params,
})
//考核分红积分 //考核分红积分
export const getAssAchieve = (params) => http.get('/member/api/assess/assAchieve', { export const getAssAchieve = params =>
params http.get('/member/api/assess/assAchieve', {
}) params,
})
//考核状态复购考核 //考核状态复购考核
export const getAssessStatusList = (params) => http.get('/system/pub/enums/member-assess-status', { export const getAssessStatusList = params =>
params http.get('/system/pub/enums/member-assess-status', {
}) params,
})
//注册等级下拉选 //注册等级下拉选
export const getGradeList = (params) => http.get('/system/api/grade/list', { export const getGradeList = params =>
params http.get('/system/api/grade/list', {
}) params,
})
//注册列表 //注册列表
export const getRegList = (params) => http.get('/member/api/market-news/reg-list', { export const getRegList = params =>
params http.get('/member/api/market-news/reg-list', {
}) params,
})
//招商列表 //招商列表
export const tripleCycleList = (params) => http.get('/member/api/market-news/triple_cycle_list', { export const tripleCycleList = params =>
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 menuList = (params) => http.get('/system/api/menu/list', { export const menuList = params =>
params http.get('/system/api/menu/list', {
}) params,
})
//直推列表 //直推列表
export const parentList = (params) => http.get('/member/api/member/parent-list', { export const parentList = params =>
params http.get('/member/api/member/parent-list', {
}) params,
})
// 市场动态接口
export const marketDynamicsList = params =>
// 抗衰能量仓列表 http.post('/retail-member/api/retail-member/market-dynamics', 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
})

View File

@ -20,7 +20,7 @@ module.exports = vm => {
//#ifdef DEV_SERVER //#ifdef DEV_SERVER
console.log('DEV_SERVER') console.log('DEV_SERVER')
config.baseURL = 'http://localhost:8080' config.baseURL = 'http://192.168.0.102:8080'
//#endif //#endif
//#ifdef QA_SERVER //#ifdef QA_SERVER

View File

@ -1,13 +1,13 @@
<template> <template>
<view class="container"> <view class="container">
<!-- <view class="search-bar"> <view class="search-bar">
<u-search <u-search
placeholder="请输入会员编号或姓名查询" placeholder="请输入会员编号或姓名查询"
v-model="keyword" v-model="keyword"
@custom="search" @custom="search"
@search="search" @search="search"
></u-search> ></u-search>
</view> --> </view>
<!-- 特殊会员信息 --> <!-- 特殊会员信息 -->
<view class="top-member-card" v-if="topMember"> <view class="top-member-card" v-if="topMember">
@ -68,6 +68,7 @@
</template> </template>
<script> <script>
import { marketDynamicsList } from '@/config/market'
// API // API
// import { getMarketAchievementTop, getMarketAchievementList } from '@/config/mine.js'; // import { getMarketAchievementTop, getMarketAchievementList } from '@/config/mine.js';
@ -86,141 +87,90 @@ export default {
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: '市场动态-业绩', title: '市场动态-业绩',
}) })
this.fetchTopMember() this.fetchData(true)
this.fetchMemberList(true)
}, },
onReachBottom() { onReachBottom() {
if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') { if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') {
return return
} }
this.page++ this.page++
this.fetchMemberList() this.fetchData()
}, },
methods: { methods: {
formatMemberInfo(member) { formatMemberInfo(member) {
if (!member) return '' if (!member) return ''
// 使 award
const { memberCode, nickName, grade, award } = member 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() { search() {
this.memberList = [] this.fetchData(true)
this.page = 1
this.fetchTopMember()
this.fetchMemberList(true)
}, },
// // API使
async fetchTopMember() { mapApiDataToMember(apiData) {
// --- MOCK DATA --- if (!apiData) return null
this.topMember = {
memberId: 'HZS32223336', // Using memberId as key return {
memberCode: 'HZS32223336', memberId: apiData.pkId || apiData.memberCode, // 使 pkId
nickName: '小新哥', memberCode: apiData.memberCode,
grade: 'V5', nickName: apiData.memberName,
award: 'W1', grade: apiData.gradeName,
todayAchievement: 0.0, award: apiData.awardsName,
yesterdayAchievement: 1.0978, todayAchievement: parseFloat(apiData.todayPv || 0).toFixed(2),
monthAchievement: 2.3395, yesterdayAchievement: parseFloat(apiData.yesterdayPv || 0).toFixed(2),
lastMonthAchievement: 10.7727, 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) { if (isRefresh) {
this.page = 1 this.page = 1
this.memberList = [] this.memberList = []
this.topMember = null
} }
this.loadStatus = 'loading' this.loadStatus = 'loading'
// --- MOCK DATA --- try {
const mockData = [ const res = await marketDynamicsList({
{ pageNum: this.page,
memberId: 'HZS81617255', pageSize: this.pageSize,
memberCode: 'HZS81617255', keywords: this.keyword,
nickName: '小星哥', })
grade: 'V5', if (res.code === 200 && res.data) {
award: 'W1', //
todayAchievement: 0.0, if (this.page === 1 && res.data.bigRange) {
yesterdayAchievement: 0.0499, this.topMember = this.mapApiDataToMember(res.data.bigRange)
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,
},
]
// Simulate network delay and pagination const newMembers = res.data.rows.map(item =>
setTimeout(() => { this.mapApiDataToMember(item)
// Mock: stop after 2 pages )
if (this.page > 2) { 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' this.loadStatus = 'nomore'
return
} }
} catch (e) {
const moreData = mockData.map(item => ({ //
...item, this.loadStatus = 'loadmore'
memberId: item.memberId + this.page, // unique key for v-for console.error(e)
})) }
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);
// }
}, },
}, },
} }

View File

@ -1,13 +1,13 @@
<template> <template>
<view class="container"> <view class="container">
<!-- <view class="search-bar"> <view class="search-bar">
<u-search <u-search
placeholder="请输入会员编号或姓名查询" placeholder="请输入会员编号或姓名查询"
v-model="keyword" v-model="keyword"
@custom="search" @custom="search"
@search="search" @search="search"
></u-search> ></u-search>
</view> --> </view>
<!-- 特殊会员信息 --> <!-- 特殊会员信息 -->
<view class="top-member-card" v-if="topMember"> <view class="top-member-card" v-if="topMember">
@ -21,15 +21,15 @@
<text class="stat-label">今日盒数</text> <text class="stat-label">今日盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ topMember.yesterdayBox }}</text> <text class="stat-value">{{ toInt(topMember.yesterdayBox) }}</text>
<text class="stat-label">昨日盒数</text> <text class="stat-label">昨日盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ topMember.monthBox }}</text> <text class="stat-value">{{ toInt(topMember.monthBox) }}</text>
<text class="stat-label">本月盒数</text> <text class="stat-label">本月盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ topMember.lastMonthBox }}</text> <text class="stat-value">{{ toInt(topMember.lastMonthBox) }}</text>
<text class="stat-label">上月盒数</text> <text class="stat-label">上月盒数</text>
</view> </view>
</view> </view>
@ -48,15 +48,15 @@
<text class="stat-label">今日盒数</text> <text class="stat-label">今日盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ item.yesterdayBox }}</text> <text class="stat-value">{{ toInt(item.yesterdayBox) }}</text>
<text class="stat-label">昨日盒数</text> <text class="stat-label">昨日盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ item.monthBox }}</text> <text class="stat-value">{{ toInt(item.monthBox) }}</text>
<text class="stat-label">本月盒数</text> <text class="stat-label">本月盒数</text>
</view> </view>
<view class="stat-item"> <view class="stat-item">
<text class="stat-value">{{ item.lastMonthBox }}</text> <text class="stat-value">{{ toInt(item.lastMonthBox) }}</text>
<text class="stat-label">上月盒数</text> <text class="stat-label">上月盒数</text>
</view> </view>
</view> </view>
@ -69,6 +69,7 @@
<script> <script>
// API // API
import { marketDynamicsList } from '@/config/market'
// import { getMarketBoxTop, getMarketBoxList } from '@/config/mine.js'; // import { getMarketBoxTop, getMarketBoxList } from '@/config/mine.js';
export default { export default {
@ -83,147 +84,93 @@ export default {
} }
}, },
onLoad() { onLoad() {
this.fetchTopMember() uni.setNavigationBarTitle({
this.fetchMemberList(true) title: '市场动态-盒数',
})
this.fetchData(true)
}, },
onReachBottom() { onReachBottom() {
if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') { if (this.loadStatus === 'nomore' || this.loadStatus === 'loading') {
return return
} }
this.page++ this.page++
this.fetchMemberList() this.fetchData()
}, },
methods: { methods: {
toInt(value) { toInt(value) {
if (value === null || value === undefined) return 0
const intValue = parseInt(value, 10) const intValue = parseInt(value, 10)
return isNaN(intValue) ? value : intValue return isNaN(intValue) ? 0 : intValue
}, },
formatMemberInfo(member) { formatMemberInfo(member) {
if (!member) return '' if (!member) return ''
const { memberCode, nickName, grade, award } = member const { memberCode, nickName, grade, award } = member
return `${memberCode}/${nickName || '未知'}/${grade}/${award}` let info = `${memberCode}/${nickName}/${grade}`
if (award && award !== '无') {
info += `/${award}`
}
return info
}, },
search() { search() {
this.memberList = [] this.fetchData(true)
this.page = 1
this.fetchTopMember()
this.fetchMemberList(true)
}, },
// // API使
async fetchTopMember() { mapApiDataToMember(apiData) {
// --- MOCK DATA from screenshot --- if (!apiData) return null
this.topMember = {
memberId: 'HZS55197913', return {
memberCode: 'HZS55197913', memberId: apiData.pkId || apiData.memberCode,
nickName: '未知', // Screenshot has no name, API might memberCode: apiData.memberCode,
grade: 'V5', nickName: apiData.memberName,
award: 'S2', grade: apiData.gradeName,
todayBox: 3361.0, award: apiData.awardsName,
yesterdayBox: 114, todayBox: apiData.todayBoxNum,
monthBox: 3475, yesterdayBox: apiData.yesterdayBoxNum,
lastMonthBox: 3206, 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) { if (isRefresh) {
this.page = 1 this.page = 1
this.memberList = [] this.memberList = []
this.topMember = null
} }
this.loadStatus = 'loading' this.loadStatus = 'loading'
// --- MOCK DATA from screenshot --- try {
const mockData = [ const res = await marketDynamicsList({
{ pageNum: this.page,
memberId: 'HZS931295626', pageSize: this.pageSize,
memberCode: 'HZS931295626', keywords: this.keyword,
nickName: '未知', type: 2, // 1= 2=
grade: 'V5', })
award: 'S1', if (res.code === 200 && res.data) {
todayBox: 38.0, if (this.page === 1 && res.data.bigRange) {
yesterdayBox: 0, this.topMember = this.mapApiDataToMember(res.data.bigRange)
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,
},
]
// Simulate network delay and pagination const newMembers = res.data.rows.map(item =>
setTimeout(() => { this.mapApiDataToMember(item)
// Mock: stop after 2 pages )
if (this.page > 2) { 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' this.loadStatus = 'nomore'
return
} }
} catch (e) {
const moreData = mockData.map(item => ({ this.loadStatus = 'loadmore'
...item, console.error(e)
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);
// }
}, },
}, },
} }