123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 |
- import {
- Button,
- Cell,
- Checkbox,
- CheckboxGroup,
- Col,
- DatetimePicker,
- Picker,
- Popup,
- Row
- } from 'vant'
- import { defineComponent, markRaw } from 'vue'
- import styles from './index.module.less'
- import * as echarts from 'echarts/core'
- import {
- BarChart,
- // 系列类型的定义后缀都为 SeriesOption
- BarSeriesOption,
- LineChart,
- LineSeriesOption
- } from 'echarts/charts'
- import { PieChart } from 'echarts/charts'
- import {
- TitleComponent,
- // 组件类型的定义后缀都为 ComponentOption
- TitleComponentOption,
- TooltipComponent,
- TooltipComponentOption,
- GridComponent,
- GridComponentOption,
- // 数据集组件
- DatasetComponent,
- DatasetComponentOption,
- // 内置数据转换器组件 (filter, sort)
- TransformComponent,
- LegendComponent,
- ToolboxComponent,
- DataZoomComponent
- } from 'echarts/components'
- import { LabelLayout, UniversalTransition } from 'echarts/features'
- import { CanvasRenderer } from 'echarts/renderers'
- // 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
- type ECOption = echarts.ComposeOption<
- | BarSeriesOption
- | LineSeriesOption
- | TitleComponentOption
- | TooltipComponentOption
- | GridComponentOption
- | DatasetComponentOption
- >
- // 注册必须的组件
- echarts.use([
- TitleComponent,
- TooltipComponent,
- GridComponent,
- DatasetComponent,
- TransformComponent,
- BarChart,
- LabelLayout,
- UniversalTransition,
- CanvasRenderer,
- PieChart,
- ToolboxComponent,
- LegendComponent,
- DataZoomComponent,
- LineChart
- ])
- import { lineChartOption, pieChartOption } from './echarts'
- import request from '@/helpers/request'
- import dayjs from 'dayjs'
- import { formatterDate, moneyFormat } from '@/helpers/utils'
- export const getAssetsHomeFile = (fileName: string) => {
- const path = `./images/${fileName}`
- const modules = import.meta.globEager('./images/*')
- return modules[path].default
- }
- const yearColumns: any = []
- const year = dayjs().year()
- let defaultIndex = 10
- for (let i = year - 10; i <= year + 10; i++) {
- yearColumns.push({
- text: `${i}年`,
- value: i
- })
- }
- export default defineComponent({
- name: 'IncomeConsus',
- data() {
- return {
- moneyInfo: {
- totalSingleRate: 0,
- totalShareRate: 0,
- totalInAmount: 0,
- practiceAmount: 0,
- practiceRate: 0,
- liveAmount: 0,
- liveRate: 0,
- videoAmount: 0,
- videoRate: 0,
- musicAmount: 0,
- musicRate: 0,
- vipShareAmount: 0,
- vipShareRate: 0,
- liveShareAmount: 0,
- liveShareRate: 0,
- videoShareAmount: 0,
- videoShareRate: 0,
- mallShareAmount: 0,
- mallShareRate: 0,
- musicShareAmount: 0,
- musicShareRate: 0,
- actiRegistShareAmount: 0,
- actiRegistShareRate: 0
- },
- params: {
- timeType: 'YEAR' as 'YEAR' | 'MONTH',
- dateTime: `${year}`
- },
- dateTimeStr: `${year}年`,
- myChart: null as any,
- myChart2: null as any,
- timerStatus: false,
- currentDate: new Date()
- }
- },
- async mounted() {
- this.myChart = markRaw(
- echarts.init(document.getElementById('incomeClass') as HTMLDivElement)
- )
- this.myChart2 = markRaw(
- echarts.init(document.getElementById('structrueClass') as HTMLDivElement)
- )
- this.getList()
- },
- methods: {
- async getList() {
- try {
- const params = this.params
- const res = await request.post(
- '/api-teacher/userAccount/accountTotal',
- {
- data: params
- }
- )
- const result = res.data || {}
- this.moneyInfo = {
- totalSingleRate:
- result.practiceRate +
- result.liveRate +
- result.videoRate +
- result.musicRate,
- totalShareRate:
- result.vipShareRate +
- result.liveShareRate +
- result.videoShareRate +
- result.musicShareRate +
- result.mallShareRate +
- result.actiRegistShareRate,
- totalInAmount: result.totalInAmount || 0,
- practiceAmount: result.practiceAmount || 0,
- practiceRate: result.practiceRate || 0,
- liveAmount: result.liveAmount || 0,
- liveRate: result.liveRate || 0,
- videoAmount: result.videoAmount || 0,
- videoRate: result.videoRate || 0,
- musicAmount: result.musicAmount || 0,
- musicRate: result.musicRate || 0,
- vipShareAmount: result.vipShareAmount || 0,
- vipShareRate: result.vipShareRate || 0,
- liveShareAmount: result.liveShareAmount || 0,
- liveShareRate: result.liveShareRate || 0,
- videoShareAmount: result.videoShareAmount || 0,
- videoShareRate: result.videoShareRate || 0,
- mallShareAmount: result.mallShareAmount || 0,
- mallShareRate: result.mallShareRate || 0,
- musicShareAmount: result.musicShareAmount || 0,
- musicShareRate: result.musicShareRate || 0,
- actiRegistShareAmount: result.actiRegistShareAmount || 0,
- actiRegistShareRate: result.actiRegistShareRate || 0
- }
- // 处理折线图数据
- const lineData = {
- xAxis: [] as any,
- practiceAmount: [] as any,
- liveAmount: [] as any,
- videoAmount: [] as any,
- musicAmount: [] as any,
- vipShareAmount: [] as any,
- liveShareAmount: [] as any,
- videoShareAmount: [] as any,
- mallShareAmount: [] as any,
- musicShareAmount: [] as any,
- actiRegistShareAmount: [] as any
- }
- ;(result.infoList || []).forEach((item: any) => {
- if (params.timeType === 'YEAR') {
- lineData.xAxis.push(dayjs(item.timeStr).format('MM月'))
- } else if (params.timeType === 'MONTH') {
- lineData.xAxis.push(dayjs(item.timeStr).format('DD日'))
- }
- lineData.practiceAmount.push(item.practiceAmount)
- lineData.liveAmount.push(item.liveAmount)
- lineData.videoAmount.push(item.videoAmount)
- lineData.musicAmount.push(item.musicAmount)
- lineData.vipShareAmount.push(item.vipShareAmount) // 小酷Ai
- lineData.liveShareAmount.push(item.liveShareAmount)
- lineData.videoShareAmount.push(item.videoShareAmount)
- lineData.mallShareAmount.push(item.mallShareAmount)
- lineData.musicShareAmount.push(item.musicShareAmount)
- lineData.actiRegistShareAmount.push(item.actiRegistShareAmount)
- })
- // 初始化折线图
- lineChartOption.xAxis.data = lineData.xAxis
- lineChartOption.series[0].data = lineData.practiceAmount
- lineChartOption.series[1].data = lineData.liveAmount
- lineChartOption.series[2].data = lineData.videoAmount
- lineChartOption.series[3].data = lineData.musicAmount
- lineChartOption.series[4].data = lineData.vipShareAmount
- lineChartOption.series[5].data = lineData.liveShareAmount
- lineChartOption.series[6].data = lineData.videoShareAmount
- lineChartOption.series[7].data = lineData.mallShareAmount
- lineChartOption.series[8].data = lineData.musicShareAmount
- lineChartOption.series[9].data = lineData.actiRegistShareAmount
- // console.log(lineChartOption)
- this.myChart.clear()
- this.myChart.setOption(lineChartOption)
- // 处理饼图数据
- pieChartOption.series[0].data[0].value = result.practiceAmount
- pieChartOption.series[0].data[1].value = result.liveAmount
- pieChartOption.series[0].data[2].value = result.videoAmount
- pieChartOption.series[0].data[3].value = result.musicAmount
- pieChartOption.series[0].data[4].value = result.vipShareAmount
- pieChartOption.series[0].data[5].value = result.liveShareAmount
- pieChartOption.series[0].data[6].value = result.videoShareAmount
- pieChartOption.series[0].data[7].value = result.mallShareAmount
- pieChartOption.series[0].data[8].value = result.musicShareAmount
- pieChartOption.series[0].data[9].value = result.actiRegistShareAmount
- this.myChart2.clear()
- this.myChart2.setOption(pieChartOption)
- } catch (e) {
- // console.log(e)
- }
- }
- },
- render() {
- return (
- <div style={{ overflow: 'hidden' }}>
- <div class={styles.incomeConsus}>
- <Cell
- class={styles.income}
- title="总收入(元)"
- v-slots={{
- label: () => (
- <span class={styles.countPrice}>
- {moneyFormat(this.moneyInfo.totalInAmount)}
- </span>
- ),
- value: () => (
- <span
- class={styles.searchTime}
- onClick={() => (this.timerStatus = true)}
- >
- {this.dateTimeStr}
- </span>
- )
- }}
- ></Cell>
- <div class={styles.section}>
- <Row class={styles.numberCount}>
- <Col span={6}>
- <i></i>
- <div class={styles.type}>
- <span>陪练课</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.practiceAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color1}></i>
- <div class={styles.type}>
- <span>直播课</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.liveAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color2}></i>
- <div class={styles.type}>
- <span>视频课</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.videoAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color3}></i>
- <div class={styles.type}>
- <span>乐谱</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.musicAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color4}></i>
- <div class={styles.type}>
- <span>小酷Ai推广</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.vipShareAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color5}></i>
- <div class={styles.type}>
- <span>直播课推荐</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.liveShareAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color6}></i>
- <div class={styles.type}>
- <span>视频课推荐</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.videoShareAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color7}></i>
- <div class={styles.type}>
- <span>商品推荐</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.mallShareAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color8}></i>
- <div class={styles.type}>
- <span>乐谱推荐</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.musicShareAmount)}
- </span>
- </div>
- </Col>
- <Col span={6}>
- <i class={styles.color9}></i>
- <div class={styles.type}>
- <span>活动报名</span>
- <span class={styles.price}>
- {moneyFormat(this.moneyInfo.actiRegistShareAmount)}
- </span>
- </div>
- </Col>
- </Row>
- </div>
- <div id="incomeClass" class={styles.incomeLine}></div>
- <div class={styles.incomeTitle}>
- <i></i>收入结构
- </div>
- <div class={[styles.pieSection, 'van-hairline--bottom']}>
- <div id="structrueClass" class={styles.pieIncome}></div>
- <div class={styles.rateAll}>
- <div>
- <img src={getAssetsHomeFile('icon_user.png')} />
- <span>个人收入总占比</span>
- <span class={styles.rate}>
- {this.moneyInfo.totalSingleRate}%
- </span>
- </div>
- <div>
- <img src={getAssetsHomeFile('icon_fly.png')} />
- <span>推广收益总占比</span>
- <span class={styles.rate}>
- {this.moneyInfo.totalShareRate}%
- </span>
- </div>
- </div>
- </div>
- <div class={styles.pieData}>
- <div>
- <i class={styles.piePractice}></i>
- <span class={styles.pieTitle}>陪练课</span>
- <span>{this.moneyInfo.practiceRate}%</span>
- </div>
- <div>
- <i class={styles.pie1}></i>
- <span class={styles.pieTitle}>小酷Ai推广</span>
- <span>{this.moneyInfo.vipShareRate}%</span>
- </div>
- <div>
- <i class={styles.pieLive}></i>
- <span class={styles.pieTitle}>直播课</span>
- <span>{this.moneyInfo.liveRate}%</span>
- </div>
- <div>
- <i class={styles.pie2}></i>
- <span class={styles.pieTitle}>直播课推荐</span>
- <span>{this.moneyInfo.liveShareRate}%</span>
- </div>
- <div>
- <i class={styles.pieVideo}></i>
- <span class={styles.pieTitle}>视频课</span>
- <span>{this.moneyInfo.videoRate}%</span>
- </div>
- <div>
- <i class={styles.pie3}></i>
- <span class={styles.pieTitle}>视频课推荐</span>
- <span>{this.moneyInfo.videoShareRate}%</span>
- </div>
- <div>
- <i class={styles.pieMusic}></i>
- <span class={styles.pieTitle}>乐谱</span>
- <span>{this.moneyInfo.musicRate}%</span>
- </div>
- <div>
- <i class={styles.pie5}></i>
- <span class={styles.pieTitle}>乐谱推荐</span>
- <span>{this.moneyInfo.musicShareRate}%</span>
- </div>
- <div>
- <i class={styles.pie6}></i>
- <span class={styles.pieTitle}>活动报名</span>
- <span>{this.moneyInfo.actiRegistShareRate}%</span>
- </div>
- <div>
- <i class={styles.pie4}></i>
- <span class={styles.pieTitle}>商品推荐</span>
- <span>{this.moneyInfo.mallShareRate}%</span>
- </div>
- </div>
- </div>
- <Popup
- v-model:show={this.timerStatus}
- position="bottom"
- round
- zIndex={99999999}
- >
- {this.params.timeType === 'MONTH' && (
- <DatetimePicker
- v-model={this.currentDate}
- type="year-month"
- title="选择时间"
- formatter={formatterDate}
- onCancle={() => (this.timerStatus = false)}
- onConfirm={(value: any) => {
- this.params.dateTime = dayjs(value).format('YYYY-MM')
- this.dateTimeStr = dayjs(value).format('YYYY年MM月')
- this.timerStatus = false
- this.getList()
- }}
- v-slots={{
- 'columns-top': () => (
- <div class={styles.timePopup}>
- <Button
- type="primary"
- plain={this.params.timeType !== 'MONTH'}
- size="mini"
- class={styles.timeMonth}
- onClick={() => (this.params.timeType = 'MONTH')}
- >
- 按月
- </Button>
- <Button
- type="primary"
- plain={this.params.timeType !== 'YEAR'}
- size="mini"
- class={styles.timeYear}
- onClick={() => (this.params.timeType = 'YEAR')}
- >
- 按年
- </Button>
- </div>
- )
- }}
- />
- )}
- {this.params.timeType === 'YEAR' && (
- <Picker
- v-model={this.currentDate}
- title="选择时间"
- columns={yearColumns}
- defaultIndex={defaultIndex}
- onCancel={() => (this.timerStatus = false)}
- onConfirm={(obj: any, index: number) => {
- this.params.dateTime = obj.value
- defaultIndex = index // 记录当前选择的年份
- this.dateTimeStr = obj.text
- this.timerStatus = false
- this.getList()
- }}
- v-slots={{
- 'columns-top': () => (
- <div class={styles.timePopup}>
- <Button
- type="primary"
- plain={this.params.timeType !== 'MONTH'}
- size="mini"
- class={styles.timeMonth}
- onClick={() => (this.params.timeType = 'MONTH')}
- >
- 按月
- </Button>
- <Button
- type="primary"
- plain={this.params.timeType !== 'YEAR'}
- onClick={() => (this.params.timeType = 'YEAR')}
- size="mini"
- class={styles.timeYear}
- >
- 按年
- </Button>
- </div>
- )
- }}
- />
- )}
- </Popup>
- </div>
- )
- }
- })
|