|
|
@@ -1,14 +1,12 @@
|
|
|
-
|
|
|
-
|
|
|
<script setup lang="ts">
|
|
|
import { computed, ref } from "vue";
|
|
|
-import { getImageUrl } from "@/utils/imageUtil";
|
|
|
-import { getTeamStatistics, getTeamAmountStatistics,getTeamMembers } from "@/api/my";
|
|
|
import {
|
|
|
- usePagination,
|
|
|
- useRequest,
|
|
|
- actionDelegationMiddleware,
|
|
|
-} from "alova/client";
|
|
|
+ getTeamStatistics,
|
|
|
+ getTeamAmountStatistics,
|
|
|
+ getTeamMembers,
|
|
|
+} from "@/api/my";
|
|
|
+import LsvList from "@/components/listScrollView/index.vue";
|
|
|
+import { useRequest } from "alova/client";
|
|
|
|
|
|
definePage({
|
|
|
style: {
|
|
|
@@ -17,9 +15,14 @@ definePage({
|
|
|
},
|
|
|
});
|
|
|
|
|
|
-const activePanel = ref("list");
|
|
|
+const activePanel = ref(1);
|
|
|
const activePeriod = ref("1");
|
|
|
-const activeTabs = ref("all");
|
|
|
+const activeTabs = ref("");
|
|
|
+
|
|
|
+const panelTabs = [
|
|
|
+ { label: "团队列表", value: 1 },
|
|
|
+ { label: "团队收益", value: 2 },
|
|
|
+];
|
|
|
|
|
|
const periodTabs = [
|
|
|
{ label: "今天", value: "1" },
|
|
|
@@ -27,9 +30,9 @@ const periodTabs = [
|
|
|
];
|
|
|
|
|
|
const incomeFilterTabs = [
|
|
|
- { label: "全部", value: "all" },
|
|
|
- { label: "一级收益", value: "level1" },
|
|
|
- { label: "二级收益", value: "level2" },
|
|
|
+ { label: "全部", value: "" },
|
|
|
+ { label: "一级收益", value: "1" },
|
|
|
+ { label: "二级收益", value: "2" },
|
|
|
];
|
|
|
|
|
|
const listSummary = computed(() => {
|
|
|
@@ -60,67 +63,59 @@ const { send: sendAmountStatistics, data: statisticsData } = useRequest(
|
|
|
{ immediate: false }
|
|
|
);
|
|
|
|
|
|
-const memberList = [
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- name: "吴枕书",
|
|
|
- level: "二级团员",
|
|
|
- orders: "5单 | 创收27.84元",
|
|
|
- phone: "15721118536",
|
|
|
- date: "2026-05-18 19:00:00",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: "吴枕书",
|
|
|
- level: "二级团员",
|
|
|
- orders: "5单 | 创收27.84元",
|
|
|
- phone: "15721118536",
|
|
|
- date: "2026-05-18 19:00:00",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- name: "吴枕书",
|
|
|
- level: "二级团员",
|
|
|
- orders: "5单 | 创收27.84元",
|
|
|
- phone: "15721118536",
|
|
|
- date: "2026-05-18 19:00:00",
|
|
|
- },
|
|
|
-];
|
|
|
-
|
|
|
const summaryItems = computed(() =>
|
|
|
- activePanel.value === "list" ? listSummary.value : incomeSummary.value
|
|
|
+ activePanel.value === 1 ? listSummary.value : incomeSummary.value
|
|
|
);
|
|
|
|
|
|
const showPicker = ref(false);
|
|
|
const defaultStart = ref();
|
|
|
const defaultEnd = ref();
|
|
|
const listRef = ref();
|
|
|
+
|
|
|
const handleConfirm = (value: { startDate: string; endDate: string }) => {
|
|
|
defaultStart.value = value.startDate;
|
|
|
defaultEnd.value = value.endDate;
|
|
|
- // reloadListRef();
|
|
|
sendIncomeData({
|
|
|
timeType: activePeriod.value,
|
|
|
startTime: defaultStart.value ? defaultStart.value + " 00:00:00" : "",
|
|
|
endTime: defaultEnd.value ? defaultEnd.value + " 23:59:59" : "",
|
|
|
});
|
|
|
+ reloadListRef();
|
|
|
};
|
|
|
+
|
|
|
const reloadListRef = () => {
|
|
|
- listRef.value.reloadList({
|
|
|
- startTime: defaultStart.value ? defaultStart.value + " 00:00:00" : "",
|
|
|
- endTime: defaultEnd.value ? defaultEnd.value + " 23:59:59" : "",
|
|
|
- timeType: activePeriod.value,
|
|
|
- });
|
|
|
+ if (activePanel.value == 1) {
|
|
|
+ listRef.value?.reloadList({
|
|
|
+ startTime: defaultStart.value ? defaultStart.value + " 00:00:00" : "",
|
|
|
+ endTime: defaultEnd.value ? defaultEnd.value + " 23:59:59" : "",
|
|
|
+ timeType: activePeriod.value,
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ listRef.value?.reloadList({
|
|
|
+ inviteType: activeTabs.value,
|
|
|
+ });
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
-onShow(async () => {
|
|
|
- await sendIncomeData({
|
|
|
- timeType: 1,
|
|
|
+const getCouponListApi = (params: any) => {
|
|
|
+ return getTeamMembers({
|
|
|
+ pageNo: params.pageNo,
|
|
|
+ pageSize: params.pageSize,
|
|
|
+ timeType: activePanel.value == 1 ? params.timeType || 1 : "",
|
|
|
+ startTime: params.startTime || "",
|
|
|
+ endTime: params.endTime || "",
|
|
|
+ inviteType: params.inviteType,
|
|
|
});
|
|
|
+};
|
|
|
|
|
|
- await sendAmountStatistics({
|
|
|
- timeType: 1,
|
|
|
- });
|
|
|
+const inviteTypeMap: Record<string, string> = {
|
|
|
+ "1": "一级团员",
|
|
|
+ "2": "二级团员",
|
|
|
+};
|
|
|
+
|
|
|
+onShow(async () => {
|
|
|
+ await sendIncomeData({ timeType: 1 });
|
|
|
+ await sendAmountStatistics();
|
|
|
});
|
|
|
|
|
|
const dateRangeText = computed(() => {
|
|
|
@@ -129,27 +124,42 @@ const dateRangeText = computed(() => {
|
|
|
}
|
|
|
return "日期筛选";
|
|
|
});
|
|
|
+
|
|
|
const handleCancel = () => {
|
|
|
console.log("取消选择");
|
|
|
};
|
|
|
|
|
|
-function goDetails(item) {
|
|
|
+function goDetails(item: any) {
|
|
|
uni.navigateTo({
|
|
|
- url: `/pages-C/my/myGroupDetails`,
|
|
|
+ url: `/pages-C/my/myGroupDetails?memberId=${item.userId}&inviteType=${item.inviteType}`,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-const tabClick = (item) => {
|
|
|
+const tabClick = (item: { label: string; value: string }) => {
|
|
|
activePeriod.value = item.value;
|
|
|
sendIncomeData({
|
|
|
timeType: activePeriod.value,
|
|
|
startTime: defaultStart.value ? defaultStart.value + " 00:00:00" : "",
|
|
|
endTime: defaultEnd.value ? defaultEnd.value + " 23:59:59" : "",
|
|
|
});
|
|
|
+ reloadListRef();
|
|
|
};
|
|
|
|
|
|
-const leaveClick = (item) => {
|
|
|
+const activePanelClick = (item: { label: string; value: number }) => {
|
|
|
+ activePanel.value = item.value;
|
|
|
+ reloadListRef();
|
|
|
+ if (item.value === 1) {
|
|
|
+ sendAmountStatistics({
|
|
|
+ timeType: activePeriod.value,
|
|
|
+ startTime: defaultStart.value ? defaultStart.value + " 00:00:00" : "",
|
|
|
+ endTime: defaultEnd.value ? defaultEnd.value + " 23:59:59" : "",
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const leaveClick = (item: { label: string; value: string }) => {
|
|
|
activeTabs.value = item.value;
|
|
|
+ reloadListRef();
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
@@ -160,19 +170,15 @@ const leaveClick = (item) => {
|
|
|
<view class="team-income-page">
|
|
|
|
|
|
<view class="panel-tabs">
|
|
|
- <view class="panel-tab" @tap="activePanel = 'list'">
|
|
|
- <text :class="{ active: activePanel === 'list' }">团队列表</text>
|
|
|
- <view v-if="activePanel === 'list'" class="tab-underline" />
|
|
|
- </view>
|
|
|
- <view class="panel-divider" />
|
|
|
- <view class="panel-tab" @tap="activePanel = 'income'">
|
|
|
- <text :class="{ active: activePanel === 'income' }">团队收益</text>
|
|
|
- <view v-if="activePanel === 'income'" class="tab-underline" />
|
|
|
+ <view v-for="(tab, index) in panelTabs" :key="index" class="panel-tab" @tap="activePanelClick(tab)">
|
|
|
+ <text :class="{ active: activePanel === tab.value }">{{ tab.label }}</text>
|
|
|
+ <view v-if="activePanel === tab.value" class="tab-underline" />
|
|
|
</view>
|
|
|
+ <view v-if="panelTabs.length === 2" class="panel-divider" />
|
|
|
</view>
|
|
|
|
|
|
- <view class="filter-box">
|
|
|
- <view v-if="activePanel === 'list'" class="list-filter">
|
|
|
+ <view v-if="activePanel === 1" class="filter-box">
|
|
|
+ <view class="list-filter">
|
|
|
<view class="period-tabs">
|
|
|
<view v-for="item in periodTabs" :key="item.value" class="period-tab"
|
|
|
:class="{ active: activePeriod === item.value }" @tap="tabClick(item)">
|
|
|
@@ -185,16 +191,18 @@ const leaveClick = (item) => {
|
|
|
<view class="caret" />
|
|
|
</view>
|
|
|
</view>
|
|
|
+ </view>
|
|
|
|
|
|
- <view v-else class="income-filter">
|
|
|
+ <view v-else class="filter-box">
|
|
|
+ <view class="income-filter">
|
|
|
<view v-for="item in incomeFilterTabs" :key="item.value" class="period-tab"
|
|
|
- :class="{ active: activeTabs==item.value }" @tap="leaveClick(item)">
|
|
|
+ :class="{ active: activeTabs==item.value }" @tap="leaveClick(item)">
|
|
|
<text>{{ item.label }}</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <view class="summary-section" :class="activePanel === 'list' ? 'list-summary' : 'income-summary'">
|
|
|
+ <view class="summary-section" :class="activePanel === 1 ? 'list-summary' : 'income-summary'">
|
|
|
<view v-for="(item, index) in summaryItems" :key="item.label" class="summary-item">
|
|
|
<text class="summary-label">{{ item.label }}</text>
|
|
|
<text class="summary-value">{{ item.value }}</text>
|
|
|
@@ -203,29 +211,34 @@ const leaveClick = (item) => {
|
|
|
</view>
|
|
|
|
|
|
<view class="member-list">
|
|
|
- <view v-for="item in memberList" :key="item.id" class="member-card" @click='goDetails'>
|
|
|
- <view class="member-header">
|
|
|
- <text class="member-name">{{ item.name }}</text>
|
|
|
- <view class="level-tag">
|
|
|
- <text>{{ item.level }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="card-line" />
|
|
|
- <view class="info-list">
|
|
|
- <view class="info-row">
|
|
|
- <text class="info-label">完成单数</text>
|
|
|
- <text class="info-value income">{{ item.orders }}</text>
|
|
|
- </view>
|
|
|
- <view class="info-row">
|
|
|
- <text class="info-label">联系方式</text>
|
|
|
- <text class="info-value">{{ item.phone }}</text>
|
|
|
- </view>
|
|
|
- <view class="info-row">
|
|
|
- <text class="info-label">邀请日期</text>
|
|
|
- <text class="info-value">{{ item.date }}</text>
|
|
|
+ <LsvList ref="listRef" :api="getCouponListApi" key-name="result">
|
|
|
+ <template #list="{ data }">
|
|
|
+ <view v-for="item in data" :key="item.userId || item.userName" class="member-card" @click='goDetails(item)'>
|
|
|
+ <view class="member-header">
|
|
|
+ <text class="member-name">{{ item.userName || '--' }}</text>
|
|
|
+ <view class="level-tag">
|
|
|
+ <text>{{ inviteTypeMap[String(item.inviteType)] || '团员' }}</text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="card-line" />
|
|
|
+ <view class="info-list">
|
|
|
+ <view class="info-row">
|
|
|
+ <text class="info-label">完成单数</text>
|
|
|
+ <text class="info-value income">{{ item.completeOrderCount || 0 }}单 |
|
|
|
+ ¥{{ item.revenueGenerationAmount || 0 }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="info-row">
|
|
|
+ <text class="info-label">联系方式</text>
|
|
|
+ <text class="info-value">{{ item.phone || '--' }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="info-row">
|
|
|
+ <text class="info-label">绑定时间</text>
|
|
|
+ <text class="info-value">{{ item.bindTime || '--' }}</text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+ </template>
|
|
|
+ </LsvList>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -239,11 +252,15 @@ const leaveClick = (item) => {
|
|
|
.group-info-container {
|
|
|
min-height: 100vh;
|
|
|
background: #f8f8fa;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
|
|
|
.team-income-page {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
width: 100%;
|
|
|
color: #1d2129;
|
|
|
|
|
|
@@ -311,6 +328,7 @@ const leaveClick = (item) => {
|
|
|
box-sizing: border-box;
|
|
|
flex: 0 0 auto;
|
|
|
border-bottom: 1rpx solid #d9d9d9;
|
|
|
+
|
|
|
.list-filter,
|
|
|
.income-filter {
|
|
|
display: flex;
|
|
|
@@ -353,6 +371,7 @@ const leaveClick = (item) => {
|
|
|
background: #d9d9d9;
|
|
|
flex: 0 0 auto;
|
|
|
}
|
|
|
+
|
|
|
.caret {
|
|
|
width: 0;
|
|
|
height: 0;
|
|
|
@@ -419,7 +438,6 @@ const leaveClick = (item) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 团队列表模式下的统计项宽度
|
|
|
&.list-summary {
|
|
|
.summary-item {
|
|
|
&:nth-child(1) {
|
|
|
@@ -438,7 +456,6 @@ const leaveClick = (item) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 团队收益模式下的统计项宽度
|
|
|
&.income-summary {
|
|
|
.summary-item {
|
|
|
&:nth-child(1),
|
|
|
@@ -461,96 +478,98 @@ const leaveClick = (item) => {
|
|
|
// 成员列表
|
|
|
.member-list {
|
|
|
display: flex;
|
|
|
- flex: 1 0 auto;
|
|
|
+ flex: 1 1 auto;
|
|
|
+ min-height: 0;
|
|
|
flex-direction: column;
|
|
|
gap: 32rpx;
|
|
|
width: 100%;
|
|
|
padding: 32rpx 32rpx 21rpx;
|
|
|
box-sizing: border-box;
|
|
|
+ overflow: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .member-card {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ width: 100%;
|
|
|
+ min-height: 311rpx;
|
|
|
+ padding: 32rpx;
|
|
|
+ border-radius: 32rpx;
|
|
|
+ background: #ffffff;
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
|
- .member-card {
|
|
|
+ .member-header {
|
|
|
display: flex;
|
|
|
- flex-direction: column;
|
|
|
- width: 100%;
|
|
|
- min-height: 311rpx;
|
|
|
- padding: 32rpx;
|
|
|
- border-radius: 32rpx;
|
|
|
- background: #ffffff;
|
|
|
- box-sizing: border-box;
|
|
|
+ align-items: center;
|
|
|
+ gap: 14rpx;
|
|
|
|
|
|
- .member-header {
|
|
|
+ .member-name {
|
|
|
+ color: #2c2c2c;
|
|
|
+ font-size: 32rpx;
|
|
|
+ font-weight: 700;
|
|
|
+ line-height: 32rpx;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ .level-tag {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: 14rpx;
|
|
|
-
|
|
|
- .member-name {
|
|
|
- color: #2c2c2c;
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 700;
|
|
|
- line-height: 32rpx;
|
|
|
+ justify-content: center;
|
|
|
+ height: 40rpx;
|
|
|
+ padding: 0 16rpx;
|
|
|
+ border-radius: 2rpx;
|
|
|
+ background: #e8f7ff;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ text {
|
|
|
+ color: #3491fa;
|
|
|
+ font-size: 24rpx;
|
|
|
+ font-weight: 500;
|
|
|
+ line-height: 40rpx;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
-
|
|
|
- .level-tag {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- height: 40rpx;
|
|
|
- padding: 0 16rpx;
|
|
|
- border-radius: 2rpx;
|
|
|
- background: #e8f7ff;
|
|
|
- box-sizing: border-box;
|
|
|
-
|
|
|
- text {
|
|
|
- color: #3491fa;
|
|
|
- font-size: 24rpx;
|
|
|
- font-weight: 500;
|
|
|
- line-height: 40rpx;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- .card-line {
|
|
|
- width: 100%;
|
|
|
- height: 1rpx;
|
|
|
- margin-top: 24rpx;
|
|
|
- background: #eaeaea;
|
|
|
- }
|
|
|
+ .card-line {
|
|
|
+ width: 100%;
|
|
|
+ height: 1rpx;
|
|
|
+ margin-top: 24rpx;
|
|
|
+ background: #eaeaea;
|
|
|
+ }
|
|
|
|
|
|
- .info-list {
|
|
|
+ .info-list {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 30rpx;
|
|
|
+ margin-top: 31rpx;
|
|
|
+
|
|
|
+ .info-row {
|
|
|
display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 30rpx;
|
|
|
- margin-top: 31rpx;
|
|
|
-
|
|
|
- .info-row {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- min-height: 30rpx;
|
|
|
-
|
|
|
- .info-label {
|
|
|
- color: #86909c;
|
|
|
- font-size: 30rpx;
|
|
|
- line-height: 30rpx;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ min-height: 30rpx;
|
|
|
|
|
|
- .info-value {
|
|
|
- color: #333333;
|
|
|
- font-size: 30rpx;
|
|
|
- line-height: 30rpx;
|
|
|
- text-align: right;
|
|
|
- white-space: nowrap;
|
|
|
+ .info-label {
|
|
|
+ color: #86909c;
|
|
|
+ font-size: 30rpx;
|
|
|
+ line-height: 30rpx;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-value {
|
|
|
+ color: #333333;
|
|
|
+ font-size: 30rpx;
|
|
|
+ line-height: 30rpx;
|
|
|
+ text-align: right;
|
|
|
+ white-space: nowrap;
|
|
|
|
|
|
- &.income {
|
|
|
- color: #ff5365;
|
|
|
- }
|
|
|
+ &.income {
|
|
|
+ color: #ff5365;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-</style>
|
|
|
+</style>
|