1 changed files with 438 additions and 0 deletions
			
			
		@ -0,0 +1,438 @@
					 | 
				
			||||
<template> | 
				
			||||
  <cs-page :selected="0" title="智慧生态" isTab> | 
				
			||||
    <view class="view-container"> | 
				
			||||
      <van-dropdown-menu safe-area-tab-bar active-color="#17C653"> | 
				
			||||
        <van-dropdown-item | 
				
			||||
          :value="queryParams.deptId" | 
				
			||||
          :options="getDropdownOption('dept')" | 
				
			||||
          @change=" | 
				
			||||
            v => { | 
				
			||||
              querySelect(v, 'deptId') | 
				
			||||
            } | 
				
			||||
          " | 
				
			||||
        /> | 
				
			||||
        <van-dropdown-item | 
				
			||||
          :value="queryParams.selectWeek" | 
				
			||||
          :options="getDropdownOption('select_week')" | 
				
			||||
          @change=" | 
				
			||||
            v => { | 
				
			||||
              querySelect(v, 'selectWeek') | 
				
			||||
            } | 
				
			||||
          " | 
				
			||||
        /> | 
				
			||||
      </van-dropdown-menu> | 
				
			||||
      <scroll-view | 
				
			||||
        :scroll-y="true" | 
				
			||||
        :style="{ maxHeight: `${viewHeigth}px` }" | 
				
			||||
        class="view" | 
				
			||||
        :refresher-enabled="true" | 
				
			||||
        @refresherrefresh="refresherrefresh" | 
				
			||||
        :refresher-triggered="refresherTriggered" | 
				
			||||
        @refresherpulling="refresherpulling" | 
				
			||||
      > | 
				
			||||
        <view class="box row-1"> | 
				
			||||
          <view class="wd-flex" style="justify-content: space-around"> | 
				
			||||
            <view | 
				
			||||
              class="wd-flex wd-flex-col wd-flex-center" | 
				
			||||
              style="gap: 4px" | 
				
			||||
            > | 
				
			||||
              <u-count-to | 
				
			||||
                :start-val="0" | 
				
			||||
                :end-val="detail.taskCount" | 
				
			||||
                bold | 
				
			||||
                font-size="24" | 
				
			||||
                color="#071437" | 
				
			||||
              ></u-count-to> | 
				
			||||
              <view class="">任务数量</view> | 
				
			||||
            </view> | 
				
			||||
            <view | 
				
			||||
              class="wd-flex wd-flex-col wd-flex-center" | 
				
			||||
              style="gap: 4px" | 
				
			||||
            > | 
				
			||||
              <u-count-to | 
				
			||||
                :start-val="0" | 
				
			||||
                :end-val="detail.inspectionsCount" | 
				
			||||
                bold | 
				
			||||
                font-size="24" | 
				
			||||
                color="#071437" | 
				
			||||
              ></u-count-to> | 
				
			||||
              <view class="">执法记录</view> | 
				
			||||
            </view> | 
				
			||||
            <view | 
				
			||||
              class="wd-flex wd-flex-col wd-flex-center" | 
				
			||||
              style="gap: 4px" | 
				
			||||
            > | 
				
			||||
              <u-count-to | 
				
			||||
                :start-val="0" | 
				
			||||
                :end-val="detail.enterpriseCount" | 
				
			||||
                bold | 
				
			||||
                font-size="24" | 
				
			||||
                color="#071437" | 
				
			||||
              ></u-count-to> | 
				
			||||
              <view class="">企业数量</view> | 
				
			||||
            </view> | 
				
			||||
          </view> | 
				
			||||
          <qiun-data-charts | 
				
			||||
            type="ring" | 
				
			||||
            :opts="opts" | 
				
			||||
            :chartData="chartData" | 
				
			||||
            :canvas2d="true" | 
				
			||||
            style="height: 144px" | 
				
			||||
          ></qiun-data-charts> | 
				
			||||
          <view class="wd-flex" style="gap: 12px; flex-wrap: wrap"> | 
				
			||||
            <view | 
				
			||||
              class="wd-flex wd-flex-col wd-flex-center" | 
				
			||||
              v-for="item in detail.legendData" | 
				
			||||
              :key="item" | 
				
			||||
              style=" | 
				
			||||
                border: 1px solid #f9f9f9; | 
				
			||||
                width: calc(100% / 3 - 8px); | 
				
			||||
                padding: 12px; | 
				
			||||
                gap: 4px; | 
				
			||||
                border-radius: 4px; | 
				
			||||
              " | 
				
			||||
            > | 
				
			||||
              <view class="wd-flex wd-flex-col" style="gap: 4px"> | 
				
			||||
                <view | 
				
			||||
                  class="wd-flex" | 
				
			||||
                  style="align-items: center; gap: 4px" | 
				
			||||
                > | 
				
			||||
                  <view | 
				
			||||
                    :style="{ | 
				
			||||
                      width: '8px', | 
				
			||||
                      height: '4px', | 
				
			||||
                      borderRadius: '4px', | 
				
			||||
                      backgroundColor: item.color | 
				
			||||
                    }" | 
				
			||||
                  ></view> | 
				
			||||
                  <view class="">{{ item.name }}</view> | 
				
			||||
                </view> | 
				
			||||
                <view class="wd-flex wd-flex-center"> | 
				
			||||
                  <u-count-to | 
				
			||||
                    :start-val="0" | 
				
			||||
                    :end-val="Number(item.value)" | 
				
			||||
                    bold | 
				
			||||
                    font-size="16" | 
				
			||||
                    color="#071437" | 
				
			||||
                  ></u-count-to> | 
				
			||||
                  % | 
				
			||||
                </view> | 
				
			||||
              </view> | 
				
			||||
            </view> | 
				
			||||
          </view> | 
				
			||||
        </view> | 
				
			||||
        <view class="box row-1"> | 
				
			||||
          <view | 
				
			||||
            class="wd-flex" | 
				
			||||
            style="margin-top: 12px; justify-content: center" | 
				
			||||
          > | 
				
			||||
            <view | 
				
			||||
              style=" | 
				
			||||
                background-color: #f9f9f9; | 
				
			||||
                display: inline-flex; | 
				
			||||
                padding: 4px; | 
				
			||||
              " | 
				
			||||
            > | 
				
			||||
              <view | 
				
			||||
                class="tab" | 
				
			||||
                v-for="(item, index) in tabs" | 
				
			||||
                :key="index" | 
				
			||||
                :style="{ | 
				
			||||
                  '--index': tabs.findIndex( | 
				
			||||
                    i => i.type == queryParams.type | 
				
			||||
                  ) | 
				
			||||
                }" | 
				
			||||
                @tap="changeTab(item.type)" | 
				
			||||
              > | 
				
			||||
                <view | 
				
			||||
                  class="name" | 
				
			||||
                  :style="{ | 
				
			||||
                    color: | 
				
			||||
                      queryParams.type == item.type ? '#071437' : '#78829d' | 
				
			||||
                  }" | 
				
			||||
                > | 
				
			||||
                  {{ item.name }} | 
				
			||||
                </view> | 
				
			||||
              </view> | 
				
			||||
            </view> | 
				
			||||
          </view> | 
				
			||||
          <view class=""> | 
				
			||||
            <view | 
				
			||||
              v-for="(item, index) in list" | 
				
			||||
              :key="index" | 
				
			||||
              class="wd-flex" | 
				
			||||
              style="justify-content: space-between; padding: 12px" | 
				
			||||
            > | 
				
			||||
              <view class="wd-font-800">{{ item.name }}</view> | 
				
			||||
              <view class="wd-font-800" style="color: #ff6f1e"> | 
				
			||||
                <view> | 
				
			||||
                  <u-count-to | 
				
			||||
                    :start-val="0" | 
				
			||||
                    :end-val="item.count" | 
				
			||||
                    bold | 
				
			||||
                    font-size="14" | 
				
			||||
                    color="#FF6F1E" | 
				
			||||
                  ></u-count-to> | 
				
			||||
                  <text>{{ queryParams.type == 1 ? '天' : '次' }}</text> | 
				
			||||
                </view> | 
				
			||||
              </view> | 
				
			||||
            </view> | 
				
			||||
          </view> | 
				
			||||
        </view> | 
				
			||||
      </scroll-view> | 
				
			||||
    </view> | 
				
			||||
  </cs-page> | 
				
			||||
</template> | 
				
			||||
 | 
				
			||||
<script> | 
				
			||||
import { getDictBatchByType, getDeptTree } from '@/api/system/dict.js' | 
				
			||||
import { HomeApi } from '@/api/common/home.js' | 
				
			||||
export default { | 
				
			||||
  data() { | 
				
			||||
    return { | 
				
			||||
      dictMap: {}, | 
				
			||||
      queryParams: { | 
				
			||||
        selectWeek: '', | 
				
			||||
        deptId: '', | 
				
			||||
        type: 1 | 
				
			||||
      }, | 
				
			||||
      detail: {}, | 
				
			||||
      opts: {}, | 
				
			||||
      chartData: {}, | 
				
			||||
      viewHeigth: 0, | 
				
			||||
      tabs: [ | 
				
			||||
        { | 
				
			||||
          name: '资质逾期', | 
				
			||||
          type: 1 | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          name: '整改次数', | 
				
			||||
          type: 2 | 
				
			||||
        } | 
				
			||||
      ], | 
				
			||||
      refresherTriggered: false, | 
				
			||||
      list: [], | 
				
			||||
      color: ['#1B84FF', '#7239EA', '#F6B100', '#F8285A', '#17C653'] | 
				
			||||
    } | 
				
			||||
  }, | 
				
			||||
  onLoad: async function () { | 
				
			||||
    await uni.hideTabBar() | 
				
			||||
    uni.hideTabBar({ | 
				
			||||
      animation: false | 
				
			||||
    }) | 
				
			||||
    this.getDict() | 
				
			||||
    this.init() | 
				
			||||
  }, | 
				
			||||
  onReady() { | 
				
			||||
    this.$nextTick(() => { | 
				
			||||
      this.getPageHeight() | 
				
			||||
    }) | 
				
			||||
  }, | 
				
			||||
  onShow() { | 
				
			||||
    this.init() | 
				
			||||
  }, | 
				
			||||
  methods: { | 
				
			||||
    getPageHeight() { | 
				
			||||
      const query = uni.createSelectorQuery().in(this) | 
				
			||||
      query | 
				
			||||
        .select('.view-container') | 
				
			||||
        .boundingClientRect(data => { | 
				
			||||
          this.viewHeigth = data.height - 35 - 25 | 
				
			||||
        }) | 
				
			||||
        .exec() | 
				
			||||
    }, | 
				
			||||
    async getDict() { | 
				
			||||
      const dict = await getDictBatchByType({ | 
				
			||||
        type: ['select_week'].join(',') | 
				
			||||
      }) | 
				
			||||
      const dept = await getDeptTree() | 
				
			||||
      this.dictMap = { | 
				
			||||
        ...dict.data, | 
				
			||||
        dept: dept.data | 
				
			||||
      } | 
				
			||||
    }, | 
				
			||||
    getDropdownOption(key) { | 
				
			||||
      if (!this.dictMap[key]) return [] | 
				
			||||
      const keyMap = { | 
				
			||||
        select_week: '周期', | 
				
			||||
        dept: '部门' | 
				
			||||
      } | 
				
			||||
      if (key == 'dept') { | 
				
			||||
        const data = [ | 
				
			||||
          ...this.dictMap[key].map(d => { | 
				
			||||
            return { | 
				
			||||
              value: d.id, | 
				
			||||
              text: d.name | 
				
			||||
            } | 
				
			||||
          }) | 
				
			||||
        ] | 
				
			||||
        if (!this.$roles.checkRole(['director'])) { | 
				
			||||
          this.queryParams.deptId = this.$store.getters.deptId | 
				
			||||
          return [...data] | 
				
			||||
        } | 
				
			||||
        return [...data, { value: '', text: keyMap[key] }] | 
				
			||||
      } | 
				
			||||
      return [ | 
				
			||||
        ...this.dictMap[key].map(d => { | 
				
			||||
          return { | 
				
			||||
            value: d.value, | 
				
			||||
            text: d.label | 
				
			||||
          } | 
				
			||||
        }), | 
				
			||||
        { value: '', text: keyMap[key] } | 
				
			||||
      ] | 
				
			||||
    }, | 
				
			||||
    async init() { | 
				
			||||
      if (!this.$roles.checkRole(['director'])) { | 
				
			||||
        this.queryParams.deptId = this.$store.getters.deptId | 
				
			||||
      } | 
				
			||||
      const res = await HomeApi.getPieData(this.queryParams) | 
				
			||||
      this.detail = res.data | 
				
			||||
      let curIndex = 0 | 
				
			||||
      const data = this.detail.completionRate.map((item, index) => { | 
				
			||||
        const res = { ...item, color: this.color[curIndex] } | 
				
			||||
        curIndex > this.color.length ? 0 : curIndex++ | 
				
			||||
        return res | 
				
			||||
      }) | 
				
			||||
      this.detail.legendData = data | 
				
			||||
      this.setPieData(data, this.detail.taskCompletionRate) | 
				
			||||
      this.getList() | 
				
			||||
    }, | 
				
			||||
    async getList() { | 
				
			||||
      const res = await HomeApi.getListData(this.queryParams) | 
				
			||||
      this.list = res.data | 
				
			||||
    }, | 
				
			||||
    setPieData(data, max) { | 
				
			||||
      const pieData = data.map(i => { | 
				
			||||
        return { | 
				
			||||
          name: i.name, | 
				
			||||
          value: Number(i.pieValue) | 
				
			||||
        } | 
				
			||||
      }) | 
				
			||||
      if (Number(max) < 100) { | 
				
			||||
        pieData.push({ | 
				
			||||
          name: '', | 
				
			||||
          value: 100 - Number(max), | 
				
			||||
          color: '#fff' | 
				
			||||
        }) | 
				
			||||
      } | 
				
			||||
      this.opts = { | 
				
			||||
        legend: { | 
				
			||||
          show: false | 
				
			||||
        }, | 
				
			||||
        color: this.color, | 
				
			||||
        rotate: false, | 
				
			||||
        rotateLock: false, | 
				
			||||
        padding: [0, 0, 0, 0], | 
				
			||||
        dataLabel: false, | 
				
			||||
        enableScroll: false, | 
				
			||||
        title: { | 
				
			||||
          name: `${max}%`, | 
				
			||||
          fontSize: 24, | 
				
			||||
          color: '#071437', | 
				
			||||
          fontWeight: 'bold' | 
				
			||||
        }, | 
				
			||||
        subtitle: { | 
				
			||||
          name: '完成率', | 
				
			||||
          fontSize: 14, | 
				
			||||
          color: '#78829D' | 
				
			||||
        }, | 
				
			||||
        extra: { | 
				
			||||
          ring: { | 
				
			||||
            ringWidth: 15, | 
				
			||||
            activeOpacity: 0.5, | 
				
			||||
            offsetAngle: 90, | 
				
			||||
            labelWidth: 15, | 
				
			||||
            border: false, | 
				
			||||
            borderColor: '#FFFFFF', | 
				
			||||
            linearType: 'none' | 
				
			||||
          } | 
				
			||||
        } | 
				
			||||
      } | 
				
			||||
      this.chartData = { | 
				
			||||
        series: [ | 
				
			||||
          { | 
				
			||||
            data: pieData | 
				
			||||
          } | 
				
			||||
        ] | 
				
			||||
      } | 
				
			||||
    }, | 
				
			||||
    sectionChange(index) { | 
				
			||||
      this.queryParams.enterprise = index | 
				
			||||
    }, | 
				
			||||
    querySelect(v, key) { | 
				
			||||
      this.queryParams[key] = v.detail | 
				
			||||
      this.init() | 
				
			||||
    }, | 
				
			||||
    changeTab(type) { | 
				
			||||
      this.queryParams.type = type | 
				
			||||
      this.getList() | 
				
			||||
    }, | 
				
			||||
    refresherpulling() { | 
				
			||||
      const that = this | 
				
			||||
      if (!this.refresherTriggered) { | 
				
			||||
        this.refresherTriggered = true | 
				
			||||
        setTimeout(() => { | 
				
			||||
          that.refresherTriggered = false | 
				
			||||
        }, 1000) | 
				
			||||
      } | 
				
			||||
    }, | 
				
			||||
    refresherrefresh() { | 
				
			||||
      this.init() | 
				
			||||
    } | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
</script> | 
				
			||||
 | 
				
			||||
<style lang="scss" scoped> | 
				
			||||
.view-container { | 
				
			||||
  height: 100%; | 
				
			||||
} | 
				
			||||
.view { | 
				
			||||
  padding: 0 12px; | 
				
			||||
  padding-bottom: 12px; | 
				
			||||
  display: flex; | 
				
			||||
  gap: 12px; | 
				
			||||
  flex-flow: column nowrap; | 
				
			||||
  .box { | 
				
			||||
    padding: 12px; | 
				
			||||
    background-color: #fff; | 
				
			||||
    border: 1px solid #f9f9f9; | 
				
			||||
    border-radius: 12px; | 
				
			||||
    margin-top: 12px; | 
				
			||||
    &:last-child { | 
				
			||||
      margin-bottom: 12px; | 
				
			||||
    } | 
				
			||||
  } | 
				
			||||
  .row-1 { | 
				
			||||
    display: flex; | 
				
			||||
    flex-flow: column nowrap; | 
				
			||||
    gap: 12px; | 
				
			||||
  } | 
				
			||||
  .tab { | 
				
			||||
    position: relative; | 
				
			||||
    padding: 4px 16px; | 
				
			||||
    .name { | 
				
			||||
      z-index: 2; | 
				
			||||
      position: inherit; | 
				
			||||
      font-weight: bold; | 
				
			||||
    } | 
				
			||||
    &:first-child::before { | 
				
			||||
      content: ''; | 
				
			||||
      position: absolute; | 
				
			||||
      inset: 0; | 
				
			||||
      background-color: #fff; | 
				
			||||
      border-radius: 2px; | 
				
			||||
      transform: translateX(calc(var(--index) * 100%)); | 
				
			||||
      transition: 0.2s all; | 
				
			||||
      z-index: 1; | 
				
			||||
    } | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
::v-deep .van-dropdown-menu { | 
				
			||||
  box-shadow: none; | 
				
			||||
  height: 35px !important; | 
				
			||||
  font-size: 13px; | 
				
			||||
  border-bottom: 1px solid #f1f1f4; | 
				
			||||
} | 
				
			||||
</style> | 
				
			||||
					Loading…
					
					
				
		Reference in new issue