IosStoreHeatMap.nvue 4.76 KB
<template>
  <view class="ios-heatmap">
    <view class="date-picker">
      <DatePicker @change="handleDateChange" :has-today="false" @modalChange="handleModalChange">
        <template #filter>
          <view class="filter" @tap="handleSelectFilterItem">
            <uv-text :text="indicatorText" align="center" size="26rpx" color="#202328" :lines="1"></uv-text>
            <uv-icon name="arrow-down-fill" class="filter_icon" size="10rpx" color="#202328" />
          </view>
        </template>
      </DatePicker>
    </view>
    <view class="mall" style="height: 0;overflow: hidden;">
      <MallSelectNvue has-store="1" choose-group="0" @change="handlStoreChange" />
    </view>

    <IndicatorsFilter ref="filterRef" :options="indicatorsList" @change="handleIndicatorChange"
      @modalChange="handleModalChange" />
  </view>
</template>

<script setup>
  import {
    ref,
    watch
  } from 'vue'
  import {
    getStageObj,
    rpx2Px
  } from '@/utils'
  import DatePicker from '@/components/DatePicker.nvue'
  import MallSelectNvue from '@/components/MallSelect.nvue';
  import IndicatorsFilter from '@/components/IndicatorsFilter.nvue'
  import {
    onHide,
    onShow
  } from '@dcloudio/uni-app'
  import {
    t
  } from '@/plugins/index.js'
  const props = defineProps({
    index: {
      type: Number,
      default: 0
    }
  })

  watch(() => props.index, (newVal) => {
    if (newVal !== 1) {
      if (webview.value) {
        webview.value?.hide()
      } 
    }else {
      webview.value?.show()
    }
  })


  const params = ref({})
  const flag = ref(false) // 是否初始化完成
  const indicatorsList = [{
    name: t('table.residenceTime'),
    key: 'rt'
  }, {
    name: t('PreMallIndex.CustomerMantime'),
    key: 'tc'
  }]
  const indicatorText = ref(t('table.residenceTime'))
  const indicatorKey = ref('rt')
  // storeChange
  const handlStoreChange = (e) => {
    params.value = {
      ...params.value,
      ...e
    }
    if (!params.value.storeId) {
      const store = getStageObj('store')
      params.value.storeId = store.id
    }
  }
  let showHideFlag = ref(false)

  onHide(() => {
    if (webview.value && props.index === 1) {
      plus.webview.close(webview.value)
      webview.value = null
      showHideFlag.value = true
    }else{
      showHideFlag.value = false
    }
  })
  onShow(() => {
    if (showHideFlag.value) {
      initHeatMapApp()
    }
  })
  // pickerChange
  const handleDateChange = (e) => {
    const [startDate, endDate] = e.range
    params.value = {
      ...params.value,
      startDate,
      endDate,
      ...e
    }
    // 日期更改时直接加载数据
    if (!flag.value) {
      initHeatMapApp()
    }
  }

  const filterRef = ref(null)
  const handleSelectFilterItem = () => {
    filterRef.value?.open()
  }

  const handleIndicatorChange = (e) => {
    indicatorText.value = e.name
    indicatorKey.value = e.key
    // 指标更改时直接加载数据
    if (!flag.value) {
      initHeatMapApp()
    }
  }

  // webview信息 仅ios
  const webview = ref(null)
  const handleModalChange = (val) => {
    val ? webview.value?.hide() : webview.value?.show()
  }
  const initHeatMapApp = () => {
    console.log(params.value);
    if (webview.value) {
      plus.webview.close(webview.value)
      webview.value = null
    }
    const {
      startDate,
      endDate,
      indicatorKey: indicatorKeys
    } = params.value
    const token = uni.getStorageSync('Authorization')

    const store = getStageObj('store')
    const storeId = params.value.storeId || store.id

    const statusBarHeight = plus.navigator.getStatusbarHeight()
    const top = statusBarHeight + 88 + rpx2Px(100)
    // const systemInfo = uni.getSystemInfoSync()
    // const tabBarHeight = systemInfo.safeArea.bottom + 50

    console.log(
      `https://store.keliuyun.com/apph5/heatMap?token=${token}&mallId=${storeId}&startDate=${startDate}&endDate=${endDate}&level=${indicatorKeys||'rt'}`
      );
    webview.value = plus.webview.create(
      `https://store.keliuyun.com/apph5/heatMap?token=${token}&mallId=${storeId}&startDate=${startDate}&endDate=${endDate}&level=${indicatorKeys||'rt'}`,
      "store-heatmap", {
        top: `${top}px`, // 关键:从导航栏下方开始
        bottom: "50px",
        left: "0px",
        right: "0px",
        'uni-app': 'none',
        popGesture: 'close',
        // backButtonAutoControl:'close',
        hardwareAccelerated: true,
        wkwebview: true,
        zindex: 0
      }
    )
    webview.value.show()
  }
</script>

<style scoped>
  .date-picker {
    padding: 20rpx;
  }

  .filter {
    background-color: #fff;
    width: 160rpx;
    height: 60rpx;
    border-radius: 12rpx;
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: center;
    margin-left: 16rpx;
    padding: 0 10rpx;
  }
</style>