FlowTrans.nvue 3.33 KB
<template>
  <CardNvue :title="t('navData.flowConversion')">
    <template #content>
      <view class="trans" v-if="transData.length >0">
        <image src="/static/common/trans-bg.png" style="width: 664rpx;height: 378rpx;" mode=""></image>
        <view class="num">
          <view class="num-item" v-for="item in transData" :key="item.id">
            <text class="title">{{item.name}}</text>
            <text class="value">{{item.value}}</text>
          </view>
        </view>
        <view class="trans-item trans1">
          <text class="trans_text">{{ t('table.conversionRate') }}: {{getTrans(0)}}</text>
        </view>
        <view class="trans-item trans2">
          <text class="trans_text">{{ t('table.conversionRate') }}: {{getTrans(1)}}</text>
        </view>
        <view class="trans-item trans3">
          <text class="trans_text">{{ t('table.conversionRate') }}: {{getTrans(2)}}</text>
        </view>
      </view>
      <!-- <ChartsNvue ref="chartsRef" /> -->
    </template>
  </CardNvue>
</template>

<script setup>
  import {
    getTrafficConversionMallApi
  } from '@/api'
  import CardNvue from './Card.nvue'
  import ChartsNvue from '@/components/Charts.nvue'
  import {
    onMounted,
    ref,
    nextTick
  } from 'vue'
  import {
    rpx2Px
  } from '@/utils'
  import {
    t
  } from '@/plugins/index.js'



  const chartsRef = ref(null)

  // 初始化数据
  const options = ref({})
  const initData = async (params) => {
    options.value = params
    await nextTick(() => {
      setTimeout(() => {
        getTrendChartData()
      }, 0)
    })
  }
  // 获取转化率
  const getTrans = (index) => {
    const before = transData.value[index]?.value
    const after = transData.value[index + 1]?.value
    if (transData.length === 0 || !before || !after) {
      return '0%'
    }
    const valPercent = after / before * 100
    if(Number.isNaN(valPercent)){
      return '--'
    }
    return valPercent.toFixed(2) + '%'
  }

  defineExpose({
    initData
  })

  const transData = ref([])
  const getTrendChartData = async () => {
    try {
      // 参数设置位置:
      const optionParams = {
        id: options.value.storeId,
        startDate: options.value.startDate,
        endDate: options.value.endDate,
      }
      const {
        data
      } = await getTrafficConversionMallApi(optionParams)
      transData.value = data || []
      // renderChartData(data)
    } catch (e) {
      console.log(e);
    }
  }
</script>

<style lang="scss" scoped>
  .trans {
    width: 664rpx;
    height: 378rpx;
    margin-top: 28rpx;
    position: relative;
    overflow: hidden;

    .num {
      position: absolute;
      top: 0;
      left: 0;
      width: 400rpx;
      height: 378rpx;
      padding: 4rpx 0;

      .num-item {
        height: 76rpx;
        margin-bottom: 20rpx;
        display: flex;
        flex-direction: row;
        align-items: center;

        .title,
        .value {
          font-size: 26rpx;
          color: #202328;
        }

        .title {
          padding: 0 20rpx 0 28rpx;
        }
      }
    }
    .trans-item{
      position: absolute;
      .trans_text{
        font-size: 24rpx;
        color: #202328;
      }
    }
    .trans1{
      top: 60rpx;
      left: 450rpx;
    }
    .trans2{
      top: 168rpx;
      left: 430rpx;
    }
    .trans3{
      top: 274rpx;
      left: 400rpx;
    }
  }
</style>