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
//考核明细接口
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)

View File

@ -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

View File

@ -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,
},
]
// Simulate network delay and pagination
setTimeout(() => {
// Mock: stop after 2 pages
if (this.page > 2) {
this.loadStatus = 'nomore'
return
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)
}
const moreData = mockData.map(item => ({
...item,
memberId: item.memberId + this.page, // unique key for v-for
}))
this.memberList = [...this.memberList, ...moreData]
const newMembers = res.data.rows.map(item =>
this.mapApiDataToMember(item)
)
this.memberList = [...this.memberList, ...newMembers]
// 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);
// }
//
if (
newMembers.length < this.pageSize ||
this.memberList.length >= res.data.total
) {
this.loadStatus = 'nomore'
} else {
this.loadStatus = 'loadmore'
}
} else {
//
this.loadStatus = 'nomore'
}
} catch (e) {
//
this.loadStatus = 'loadmore'
console.error(e)
}
},
},
}

View File

@ -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,
},
]
// Simulate network delay and pagination
setTimeout(() => {
// Mock: stop after 2 pages
if (this.page > 2) {
this.loadStatus = 'nomore'
return
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)
}
const moreData = mockData.map(item => ({
...item,
memberId: item.memberId + this.page, // unique key for v-for
}))
this.memberList = [...this.memberList, ...moreData]
const newMembers = res.data.rows.map(item =>
this.mapApiDataToMember(item)
)
this.memberList = [...this.memberList, ...newMembers]
// 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);
// }
if (
newMembers.length < this.pageSize ||
this.memberList.length >= res.data.total
) {
this.loadStatus = 'nomore'
} else {
this.loadStatus = 'loadmore'
}
} else {
this.loadStatus = 'nomore'
}
} catch (e) {
this.loadStatus = 'loadmore'
console.error(e)
}
},
},
}