feat: 初始化
This commit is contained in:
72
pages/partner/components/myClient/index.scss
Normal file
72
pages/partner/components/myClient/index.scss
Normal file
@ -0,0 +1,72 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.currentClient {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.clientDataWrapper {
|
||||
padding: 12px 4px 30px;
|
||||
display: flex;
|
||||
overflow-y: auto;
|
||||
.clientData {
|
||||
display: flex;
|
||||
column-gap: 10px;
|
||||
.clientDataItem {
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
width: 145px;
|
||||
height: 129px;
|
||||
padding: 14px 16px 5px;
|
||||
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.1);
|
||||
.title {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
.label {
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
font-weight: 700;
|
||||
color: #333333;
|
||||
}
|
||||
.value {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
.bgIcon {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
bottom: 5px;
|
||||
width: 114px;
|
||||
height: 65px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.searchWrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 8px;
|
||||
height: 34px;
|
||||
.filterButton {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 80px;
|
||||
height: 34px;
|
||||
color: #fff;
|
||||
background-color: rgba(41, 187, 228, 1);
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.rebate-setting-btn {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 34px;
|
||||
color: #fff;
|
||||
background-color: rgba(15, 54, 117, 1);
|
||||
white-space: nowrap;
|
||||
}
|
87
pages/partner/components/myClient/index.vue
Normal file
87
pages/partner/components/myClient/index.vue
Normal file
@ -0,0 +1,87 @@
|
||||
<template>
|
||||
<view class="currentClient" >
|
||||
{{ $t('partner.myClient.currentClient') + (statCustomerData?Object.values(statCustomerData).reduce((a, b) => a + b, 0):0) + $t('common.unit.human') }}
|
||||
</view>
|
||||
<view class="clientDataWrapper">
|
||||
<view class="clientData">
|
||||
<view v-for="item in clientDataList" :key="item.dataIndex" class="clientDataItem">
|
||||
<view class="title">
|
||||
<view class="label">{{ item.title }}</view>
|
||||
<view class="value" :style="{ color: item.color }">
|
||||
{{ (statCustomerData[item.dataIndex] ?? '-') + $t('common.unit.human') }}
|
||||
<image :src="item.bgSrc" mode="aspectFit" class="bgIcon"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view style="width: 100%;margin-bottom: 20upx;">
|
||||
<view class="rebate-setting-btn" @click="goFundSetting">
|
||||
<text class="filterText">{{ $t('ib.fundSetting') }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view>
|
||||
<ReportTable url="/app/partners/queryMyAgentList" timeRangeStart="create_time_start" timeRangeEnd="create_time_end" :visible="visible" :showTimeRangeSelector="false">
|
||||
<template v-slot="{ showSearchDialog, searchFormData, handleSearch }">
|
||||
<view class="searchWrapper">
|
||||
<uni-easyinput primaryColor="#29BBE4" v-model="searchFormData.name" :placeholder="$t('ibTree.nameOrEmail')" />
|
||||
<view class="filterButton" @click="handleSearch">
|
||||
<text class="filterText">{{ $t('form.search') }}</text>
|
||||
</view>
|
||||
<image src="/static/partner/ibTree.png" mode="aspectFit" style="width: 21px; height: 21px" @click="navigateToIbTree"></image>
|
||||
</view>
|
||||
</template>
|
||||
</ReportTable>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ReportTable from '@/pages/components/reportTable/index.vue';
|
||||
import { getstatCustomerNum } from '@/services/partner/myClient.ts';
|
||||
export default {
|
||||
name: 'MyClient',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
statCustomerData: {},
|
||||
clientDataList: [
|
||||
{ title: this.$t('partner.myClient.ibClient'), dataIndex: 'zs_ib_num', color: '#25BAE4', bgSrc: '/static/partner/blueLine.svg' },
|
||||
{ title: this.$t('partner.myClient.directClient'), dataIndex: 'zs_kh_num', color: '#0F3675', bgSrc: '/static/partner/darkBlueLine.svg' },
|
||||
{ title: this.$t('partner.myClient.indirectCustomer'), dataIndex: 'jj_kh_num', color: '#ABCF37', bgSrc: '/static/partner/greenLine.svg' }
|
||||
]
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async getstatCustomerData() {
|
||||
const res = await getstatCustomerNum();
|
||||
if (res && res.code === 0) {
|
||||
this.statCustomerData = res.data;
|
||||
}
|
||||
},
|
||||
navigateToIbTree() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/partner/ibTree/index'
|
||||
});
|
||||
},
|
||||
goFundSetting() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/partner/rebateSetting/index'
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getstatCustomerData();
|
||||
},
|
||||
components: { ReportTable }
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
17
pages/partner/components/myIB/index.scss
Normal file
17
pages/partner/components/myIB/index.scss
Normal file
@ -0,0 +1,17 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.filterButton {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
width: 100%;
|
||||
height: 34px;
|
||||
color: #fff;
|
||||
background-color: rgba(41, 187, 228, 1);
|
||||
.filterText {
|
||||
white-space: nowrap;
|
||||
margin: 0 8px 0 3px;
|
||||
}
|
||||
}
|
37
pages/partner/components/myIB/index.vue
Normal file
37
pages/partner/components/myIB/index.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<view>
|
||||
<ReportTable url="/app/partners/queryMyAgentList" timeRangeStart="create_time_start" timeRangeEnd="create_time_end" :visible="visible">
|
||||
<template v-slot="{ showSearchDialog }">
|
||||
<view class="filterButton" @click="showSearchDialog">
|
||||
<image src="/static/filter.png" alt="" style="width: 12px; height: 13px" />
|
||||
<text class="filterText">筛选</text>
|
||||
<uni-icons type="right" size="20" color="#fff"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</ReportTable>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ReportTable from '@/pages/components/reportTable/index.vue';
|
||||
import { getstatCustomerNum } from '@/services/partner/myClient.ts';
|
||||
export default {
|
||||
name: 'MyIB',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
methods: {},
|
||||
components: { ReportTable }
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
73
pages/partner/components/overview/index.scss
Normal file
73
pages/partner/components/overview/index.scss
Normal file
@ -0,0 +1,73 @@
|
||||
.overviewCard {
|
||||
height: 187px;
|
||||
padding: 20px 28px 15px;
|
||||
box-sizing: border-box;
|
||||
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.1);
|
||||
.field {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 12px;
|
||||
color: #0f3675;
|
||||
margin-top: 10px;
|
||||
&.currentCommission {
|
||||
margin-top: 0px;
|
||||
font-size: 16px;
|
||||
.valueWrapper {
|
||||
font-size: 14px;
|
||||
.value {
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.overviewCardBtns {
|
||||
display: flex;
|
||||
column-gap: 12px;
|
||||
margin-top: 20px;
|
||||
.btn {
|
||||
height: 31px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.filter {
|
||||
margin-top: 10px;
|
||||
.datePreset {
|
||||
margin-bottom: 10px;
|
||||
::v-deep .checklist-group .checklist-box .radio__inner {
|
||||
border-radius: 4px;
|
||||
}
|
||||
::v-deep .checklist-group .checklist-box .radio__inner .radio__inner-icon {
|
||||
border-radius: 2px;
|
||||
}
|
||||
::v-deep .checklist-group .checklist-box.is--default.is-checked .radio__inner {
|
||||
border-color: #e5e5e5 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.overviewContent {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
row-gap: 16px;
|
||||
column-gap: 11px;
|
||||
margin-top: 20px;
|
||||
.overviewItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
padding: 8px 10px;
|
||||
height: 84px;
|
||||
box-sizing: border-box;
|
||||
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.1);
|
||||
.label {
|
||||
font-size: 14px;
|
||||
color: #666666;
|
||||
}
|
||||
.value {
|
||||
font-size: 20px;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
140
pages/partner/components/overview/index.vue
Normal file
140
pages/partner/components/overview/index.vue
Normal file
@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<view class="overviewCard">
|
||||
<view class="field currentCommission">
|
||||
<text>{{ $t('partner.currentCommission') }}</text>
|
||||
<view class="valueWrapper">
|
||||
<text class="value">{{ ibFund.amount ?? '-' }}</text>
|
||||
<text>{{ ' USD' }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="field">
|
||||
<text>{{ $t('partner.statCommission') }}</text>
|
||||
<text>{{ ibFund.totalAmount ?? '-' }} USD</text>
|
||||
</view>
|
||||
<view class="field">
|
||||
<text>{{ $t('partner.withdrawn') }}</text>
|
||||
<text>{{ ibFund.fundOut ?? '-' }} USD</text>
|
||||
</view>
|
||||
<view class="field">
|
||||
<text>{{ $t('partner.transferred') }}</text>
|
||||
<text>{{ ibFund.fundTransfer ?? '-' }} USD</text>
|
||||
</view>
|
||||
<view class="overviewCardBtns">
|
||||
<view class="btn primaryButton" @click="navigateTo('/pages/capital/ibWithdraw/index')">
|
||||
{{ $t('home.goldout') }}
|
||||
</view>
|
||||
<view class="btn secondaryButton" @click="navigateTo('/pages/capital/ibTransfer/index')">
|
||||
{{ $t('home.transfer') }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="filter">
|
||||
<uni-data-checkbox v-model="daterangePreset" :localdata="daterangePresets" @change="handlePresetChange" selectedColor="#29BBE4" class="datePreset"></uni-data-checkbox>
|
||||
<uni-datetime-picker type="daterange" v-model="timeRange" @change="handleDaterangeChange" />
|
||||
</view>
|
||||
<view class="overviewContent">
|
||||
<view v-for="item in overviewList" :key="item.label" class="overviewItem" @click="() => showChart(item)">
|
||||
<view class="label">
|
||||
{{ item.label }}
|
||||
</view>
|
||||
<view class="value">
|
||||
{{ overviewData[item.dataIndex]?.toFixed(2) }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { useUserStore } from '@/stores/user';
|
||||
import { getPhaseSummarizing } from '@/services/partner/overview.ts';
|
||||
import dayjs from 'dayjs';
|
||||
export default {
|
||||
name: 'Overview',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
ibFund: {
|
||||
totalAmount: 123.123,
|
||||
amount: 290.123,
|
||||
fundOut: 123.0,
|
||||
fundTransfer: 0.0
|
||||
},
|
||||
overviewList: [
|
||||
{ label: this.$t('partner.overview.statPL'), dataIndex: 'my_yk', type: 8, clickable: true },
|
||||
{ label: this.$t('partner.overview.statEquity'), dataIndex: 'jz', type: false, clickable: false },
|
||||
{ label: this.$t('partner.overview.IBCommission'), dataIndex: 'yj', type: 2, clickable: true },
|
||||
{ label: this.$t('partner.overview.statDeposit'), dataIndex: 'rj', type: 3, clickable: true },
|
||||
{ label: this.$t('partner.overview.statWithdraw'), dataIndex: 'mt_cj', type: 4, clickable: true },
|
||||
{ label: this.$t('partner.overview.statIBWithdraw'), dataIndex: 'yj_cj', type: 9, clickable: true },
|
||||
{ label: this.$t('partner.overview.newClient'), dataIndex: 'zc', type: 5, clickable: true },
|
||||
{ label: this.$t('partner.overview.volume'), dataIndex: 'my_jyl', type: 6, clickable: true },
|
||||
{ label: this.$t('partner.overview.volume_cent'), dataIndex: 'mf_jyl', type: 7, clickable: true },
|
||||
{ label: this.$t('partner.overview.statPL_cent'), dataIndex: 'mf_yk', type: 1, clickable: true }
|
||||
],
|
||||
overviewData: {},
|
||||
timeRange: undefined,
|
||||
daterangePreset: undefined,
|
||||
daterangePresets: [
|
||||
{ text: this.$t('common.yesterday'), value: 1 },
|
||||
{ text: this.$t('common.threeDays'), value: 2 },
|
||||
{ text: this.$t('common.7Days'), value: 6 },
|
||||
{ text: this.$t('common.30Days'), value: 29 }
|
||||
]
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async getOverviewData() {
|
||||
let params = {};
|
||||
if (this.timeRange) {
|
||||
params.time_start = this.timeRange[0];
|
||||
params.time_end = this.timeRange[1];
|
||||
}
|
||||
const res = await getPhaseSummarizing(params);
|
||||
if (res && res.code === 0) {
|
||||
this.overviewData = res.data;
|
||||
}
|
||||
},
|
||||
handleDaterangeChange() {
|
||||
this.daterangePreset = undefined;
|
||||
this.getOverviewData();
|
||||
},
|
||||
handlePresetChange(e) {
|
||||
this.daterangePreset = e.detail.value;
|
||||
this.timeRange = [dayjs().subtract(Number(e.detail.value), 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')];
|
||||
this.getOverviewData();
|
||||
},
|
||||
showChart(overview) {
|
||||
if (!overview.clickable) return;
|
||||
this.navigateTo('/pages/partner/overviewChart/index', {
|
||||
label: overview.label,
|
||||
type: overview.type,
|
||||
time_start: this.timeRange[0],
|
||||
time_end: this.timeRange[1]
|
||||
});
|
||||
},
|
||||
navigateTo(target, params) {
|
||||
if (target) {
|
||||
uni.navigateTo({
|
||||
url: `${target}${params ? `?params=${JSON.stringify(params)}` : ''}`
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
const userStore = useUserStore();
|
||||
this.ibFund = userStore.ibFund;
|
||||
this.handlePresetChange({ detail: { value: 6 } });
|
||||
this.getOverviewData();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
100
pages/partner/components/promotionLink/index.scss
Normal file
100
pages/partner/components/promotionLink/index.scss
Normal file
@ -0,0 +1,100 @@
|
||||
.shareList {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
row-gap: 16px;
|
||||
.shareCard {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
row-gap: 4px;
|
||||
padding: 13px 23px 9px;
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15);
|
||||
.closeIcon {
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
right: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.shareName {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
line-height: 26px;
|
||||
}
|
||||
.shareLinkWrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
row-gap: 4px;
|
||||
margin-top: 16px;
|
||||
margin-bottom: 4px;
|
||||
word-break: break-all;
|
||||
font-size: 14px;
|
||||
.shareLink {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 4px;
|
||||
}
|
||||
}
|
||||
.btnWrapper {
|
||||
display: flex;
|
||||
column-gap: 12px;
|
||||
width: 100%;
|
||||
.downloadMore {
|
||||
height: 30px;
|
||||
font-size: 14px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
.addShareLink {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
row-gap: 8px;
|
||||
height: 108px;
|
||||
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.materialCard {
|
||||
height: 184px;
|
||||
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15);
|
||||
.sysShareImg {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 129px;
|
||||
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.materialCardBottom {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
column-gap: 24px;
|
||||
margin-top: 10px;
|
||||
color: #29bbe4;
|
||||
.divider {
|
||||
width: 2px;
|
||||
height: 39px;
|
||||
border-radius: 5px;
|
||||
background-color: #c2c2c2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.shareCodeWrapper {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
column-gap: 12px;
|
||||
}
|
||||
.shareCodeContent {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 3px;
|
||||
width: max-content;
|
||||
background-image: linear-gradient(90deg, #103776 0%, #92dbed 100%);
|
||||
}
|
151
pages/partner/components/promotionLink/index.vue
Normal file
151
pages/partner/components/promotionLink/index.vue
Normal file
@ -0,0 +1,151 @@
|
||||
<template>
|
||||
<view class="shareList">
|
||||
<view class="shareCard" v-for="share in shareList" :key="share.id">
|
||||
<image src="/static/close.png" mode="aspectFit" class="closeIcon" @click="() => handleRemoveShareRecord(share)"></image>
|
||||
<text class="shareName">{{ share.name }}</text>
|
||||
<view class="shareCodeContent">
|
||||
<l-qrcode :value="composeLink(share.share_code)" :size="94" :marginSize="1" bgColor="#fff" />
|
||||
</view>
|
||||
<view class="shareLinkWrapper">
|
||||
<view class="shareLink">
|
||||
{{ composeLink(share.share_code) }}
|
||||
<CopyIcon :value="composeLink(share.share_code)" :size="16" />
|
||||
</view>
|
||||
<view class="shareLink">
|
||||
{{ $t('form.shareCode.label') }}:{{ share.share_code }}
|
||||
<CopyIcon :value="share.share_code" :size="16" />
|
||||
</view>
|
||||
</view>
|
||||
<view class="btnWrapper">
|
||||
<button class="primaryButton downloadMore" @click="() => downloadMoreSize(share.share_code)">{{ $t('partner.promotionLink.downloadMoreSize') }}</button>
|
||||
<button v-if="share.img_url" class="secondaryButton downloadMore" @click="() => downloadMaterial(share.img_url)">下载推广设计素材</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="addShareLink">
|
||||
<image @click="() => createShareLink()" src="/static/user/add.png" mode="aspectFit" style="width: 47px; height: 47px"></image>
|
||||
<text>{{ $t('partner.promotionLink.addLink') }}</text>
|
||||
</view>
|
||||
<view class="materialCard" v-for="sysShare in sysShareList" :key="sysShare.id">
|
||||
<image :src="sysShare.img_url?.split(',')?.[0]" mode="aspectFit" class="sysShareImg"></image>
|
||||
<view class="materialCardBottom">
|
||||
<text @click="() => createShareLink(sysShare)">{{ $t('partner.promotionLink.getLink') }}</text>
|
||||
<div class="divider"></div>
|
||||
<text @click="() => downloadMaterial(sysShare.img_url)">{{ $t('partner.promotionLink.downloadMaterials') }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getShareRecord, getSysShareList, removeShareRecord } from '@/services/partner/promotionLink.ts';
|
||||
export default {
|
||||
name: 'PromotionLink',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
currentShareCode: undefined,
|
||||
shareList: [],
|
||||
sysShareList: [],
|
||||
image: undefined
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
composeLink(shareCode) {
|
||||
// #ifdef H5
|
||||
return `${window.location.origin ?? 'https://user.htfx.co'}/api/promotion/${shareCode}`;
|
||||
// #endif
|
||||
|
||||
// #ifndef H5
|
||||
return `https://user.htfx.co/api/promotion/${shareCode}`;
|
||||
// #endif
|
||||
},
|
||||
async getShareRecordData() {
|
||||
const res = await getShareRecord();
|
||||
if (res && res.code === 0) {
|
||||
this.shareList = res.data;
|
||||
}
|
||||
},
|
||||
async getSysShareListData() {
|
||||
const res = await getSysShareList();
|
||||
if (res && res.code === 0) {
|
||||
this.sysShareList = res.data;
|
||||
}
|
||||
},
|
||||
showDetailDialog() {
|
||||
this.$refs.alertDialog.open();
|
||||
},
|
||||
closeDetailDialog() {
|
||||
this.$refs.alertDialog.close();
|
||||
},
|
||||
createShareLink(sysShare) {
|
||||
if (sysShare) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/partner/createShareLink/index?sysId=${sysShare.id}&imgUrls=${sysShare.img_url}`
|
||||
});
|
||||
} else {
|
||||
uni.navigateTo({
|
||||
url: '/pages/partner/createShareLink/index'
|
||||
});
|
||||
}
|
||||
},
|
||||
handleRemoveShareRecord(share) {
|
||||
uni.showModal({
|
||||
content: this.$t('shareLink.confirmRemove'),
|
||||
confirmColor: '#4DC0E5',
|
||||
success: async (res) => {
|
||||
if (res.confirm) {
|
||||
const resp = await removeShareRecord({ id: share.id });
|
||||
if (resp.code == 0) {
|
||||
this.$nextTick(() => {
|
||||
this.$cusModal.showModal({
|
||||
type: 'message',
|
||||
status: 'success',
|
||||
contentText: this.$t('common.success.action')
|
||||
});
|
||||
})
|
||||
this.getShareRecordData();
|
||||
this.getSysShareListData();
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this.$cusModal.showModal({
|
||||
type: 'message',
|
||||
status: 'warning',
|
||||
contentText: resp.msg ?? this.$t('common.error.sysError')
|
||||
});
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
downloadMoreSize(shareCode) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/partner/downloadMoreSize/index?shareCode=${shareCode}`
|
||||
});
|
||||
},
|
||||
downloadMaterial(imgUrl) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/partner/downloadMaterial/index?imgUrl=${imgUrl}`
|
||||
});
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
visible(newValue, oldValue) {
|
||||
if (newValue) {
|
||||
this.getShareRecordData();
|
||||
this.getSysShareListData();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
72
pages/partner/components/statReport/index.scss
Normal file
72
pages/partner/components/statReport/index.scss
Normal file
@ -0,0 +1,72 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.statDataWrapper {
|
||||
padding: 12px 4px 30px;
|
||||
display: flex;
|
||||
overflow-y: auto;
|
||||
.statData {
|
||||
display: flex;
|
||||
column-gap: 10px;
|
||||
.statDataItem {
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
min-width: 135px;
|
||||
height: 80px;
|
||||
padding: 6px 9px;
|
||||
box-sizing: border-box;
|
||||
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.1);
|
||||
.title {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
height: 100%;
|
||||
.label {
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
font-weight: 700;
|
||||
color: #333333;
|
||||
}
|
||||
.value {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #25bae4;
|
||||
line-height: 26px;
|
||||
.unit {
|
||||
color: #333333;
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
}
|
||||
.bgIcon {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 6px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.filterWrapper {
|
||||
display: flex;
|
||||
column-gap: 6px;
|
||||
margin-bottom: 10px;
|
||||
.filterSelector {
|
||||
flex: 1;
|
||||
}
|
||||
.filterButton {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 91px;
|
||||
height: 34px;
|
||||
color: #fff;
|
||||
background-color: rgba(41, 187, 228, 1);
|
||||
.filterText {
|
||||
white-space: nowrap;
|
||||
margin: 0 8px 0 3px;
|
||||
}
|
||||
}
|
||||
}
|
175
pages/partner/components/statReport/index.vue
Normal file
175
pages/partner/components/statReport/index.vue
Normal file
@ -0,0 +1,175 @@
|
||||
<template>
|
||||
<view class="statDataWrapper">
|
||||
<view class="statData">
|
||||
<view v-for="item in statDataList" :key="item.dataIndex" class="statDataItem">
|
||||
<view class="title">
|
||||
<view class="label">{{ item.title }}</view>
|
||||
<view class="value">
|
||||
{{ statData[item.dataIndex] ?? '-' }}
|
||||
<text class="unit">USD</text>
|
||||
<image :src="item.bgSrc" mode="aspectFit" class="bgIcon"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<ReportTable
|
||||
:title="reportList[currentReport].title"
|
||||
:url="reportList[currentReport].url"
|
||||
:defaultDateRangeKey="reportList[currentReport].defaultDateRangeKey ?? 'apply_time'"
|
||||
:timeRangeStart="reportList[currentReport].timeRangeStart ?? 'apply_time_start'"
|
||||
:timeRangeEnd="reportList[currentReport].timeRangeEnd ?? 'apply_time_end'"
|
||||
:visible="visible"
|
||||
>
|
||||
<template v-slot="{ showSearchDialog }">
|
||||
<view class="filterWrapper">
|
||||
<uni-data-select
|
||||
:localdata="reportOptions"
|
||||
@change="handleReportSelectorChange"
|
||||
:clear="false"
|
||||
v-model="currentReport"
|
||||
:placeholder="$t('form.pleaseSelect')"
|
||||
:emptyTips="$t('common.empty')"
|
||||
class="filterSelector"
|
||||
></uni-data-select>
|
||||
<view class="filterButton" @click="showSearchDialog">
|
||||
<image src="/static/filter.png" alt="" style="width: 12px; height: 13px" />
|
||||
<text class="filterText">{{ $t('common.filter') }}</text>
|
||||
<uni-icons type="right" size="20" color="#fff"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
</ReportTable>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getStatReportInfo } from '@/services/partner/statReport';
|
||||
import ReportTable from '@/pages/components/reportTable/index.vue';
|
||||
export default {
|
||||
name: 'StatReport',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
currentReport: 'deposit',
|
||||
statData: {},
|
||||
statDataList: [
|
||||
{ title: this.$t('partner.statReport.statCommission'), dataIndex: 'yj', bgSrc: '/static/partner/statCommission.svg' },
|
||||
{ title: this.$t('partner.statReport.statDeposit'), dataIndex: 'rj', bgSrc: '/static/partner/statDeposit.svg' },
|
||||
{ title: this.$t('partner.statReport.statWithdrawal'), dataIndex: 'mt_cj', bgSrc: '/static/partner/statWithdrawal.svg' },
|
||||
{ title: this.$t('partner.statReport.statTransaction'), dataIndex: 'jyl', bgSrc: '/static/partner/statTransaction.svg' },
|
||||
{ title: this.$t('partner.statReport.currentPL'), dataIndex: 'profit', bgSrc: '/static/partner/currentPL.svg' }
|
||||
],
|
||||
reportList: {
|
||||
// 入金报表
|
||||
deposit: {
|
||||
title: this.$t('report.goldIn'),
|
||||
url: '/app/report/getReport16'
|
||||
},
|
||||
// 出金报表
|
||||
withdrawal: {
|
||||
title: this.$t('report.goldOut'),
|
||||
url: '/app/report/getReport17'
|
||||
},
|
||||
// 挂单报表
|
||||
pendingTrading: {
|
||||
title: this.$t('report.pendingOrder'),
|
||||
url: '/app/report/getReport14'
|
||||
},
|
||||
// 交易报表
|
||||
trading: {
|
||||
title: this.$t('report.trading'),
|
||||
url: '/app/report/getReport20'
|
||||
},
|
||||
// 持仓报表
|
||||
openPosition: {
|
||||
title: this.$t('report.openPosition'),
|
||||
url: '/app/report/getReport22',
|
||||
defaultDateRangeKey: 'close_time'
|
||||
},
|
||||
// 账户综合报表
|
||||
consolidatedAccount: {
|
||||
title: this.$t('report.consolidatedAccount'),
|
||||
url: '/app/report/getReport21',
|
||||
defaultDateRangeKey: 'regdate',
|
||||
timeRangeStart: 'close_start',
|
||||
timeRangeEnd: 'close_end'
|
||||
},
|
||||
// 资金报表
|
||||
fund: {
|
||||
title: this.$t('report.fund'),
|
||||
url: '/app/report/getReport24',
|
||||
defaultDateRangeKey: 'close_time',
|
||||
timeRangeStart: 'close_time_start',
|
||||
timeRangeEnd: 'close_time_end'
|
||||
},
|
||||
// 佣金钱包报表
|
||||
rebateWallet: {
|
||||
title: this.$t('report.rebateWallet'),
|
||||
url: '/app/report/getReport28',
|
||||
defaultDateRangeKey: 'create_time',
|
||||
timeRangeStart: 'create_time_start',
|
||||
timeRangeEnd: 'create_time_end'
|
||||
},
|
||||
// 待定钱包报表
|
||||
pendingWallet: {
|
||||
title: this.$t('report.pendingWallet'),
|
||||
url: '/app/report/getReport27',
|
||||
defaultDateRangeKey: 'create_time',
|
||||
timeRangeStart: 'create_time_start',
|
||||
timeRangeEnd: 'create_time_end'
|
||||
},
|
||||
// 交易返佣报表
|
||||
tradeRebate: {
|
||||
title: this.$t('report.tradeRebate'),
|
||||
url: '/app/report/getReport26',
|
||||
defaultDateRangeKey: 'close_time'
|
||||
},
|
||||
// 业绩统计报表
|
||||
performanceStatistics: {
|
||||
title: this.$t('report.performanceStatistics'),
|
||||
url: '/app/report/getReport81'
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
reportOptions() {
|
||||
return Object.keys(this.reportList).map((key) => ({
|
||||
text: this.reportList[key].title,
|
||||
value: key
|
||||
}));
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleReportSelectorChange(e) {
|
||||
this.currentReport = e;
|
||||
},
|
||||
async getStatData() {
|
||||
const res = await getStatReportInfo();
|
||||
if (res && res.code === 0) {
|
||||
this.statData = res.data;
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
visible(newValue, oldValue) {
|
||||
if (newValue) {
|
||||
this.getStatData();
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
ReportTable
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
Reference in New Issue
Block a user