monitorReport.vue 13 KB
<template>
  <div class="monitor">
    <div class="w80">
      <div class="monitor_con">
        <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
          <el-tab-pane label="监控日报" name="day">
            <el-empty v-if="!state.dayList.length" description="暂无数据" />
            <div v-for="item in state.dayList" :key="item.id" class="demo_item" >
              <div class="line">
                <img src="../../assets/images/monitor/ellipse.png" alt="">
                <div></div>
              </div>
              <div class="item_con">
                <div class="item_title">
                  <div>{{ item.executeDate }}</div>
                  <div>
                    <el-button text icon="Download" @click="download(item.id)">下载</el-button>
                    <el-button text icon="Tickets" @click="toDetail(item)">详情</el-button>
                  </div>
                </div>
                <div class="con_top">
                  <div>
                    <img src="../../assets/images/monitor/frame1.png" alt="">
                    共 <span> {{item.countObj.companyCount}} </span> 家企业发生 <span> {{item.countObj.monCount}} </span> 条动态
                  </div>
                  <div class="text">
                    <div>高风险<span>{{ item.highRisk }}</span></div>
                    <div>中风险<span>{{ item.mediumRisk }}</span></div>
                    <div>警示<span>{{ item.warning }}</span></div>
                    <div>提示<span>{{ item.reminder }}</span></div>
                  </div>
                </div>
                <div class="con_list" :class="item.active?'active':''">
                  <div class="item" v-for="change in item.changeObj">
                    <div>
                      <div class="img">{{ change.companyName.substring(0,4) }}</div>
                      <div class="name">{{ change.companyName }}</div>
                    </div>
                    <div class="tag">
                      <div><span style="color: #2969E7;">{{ change.monitor_col }}</span> 条</div>
                    </div>
                  </div>
                </div>
                <div v-if="item.changeObj.length>4" class="expand" :class="item.active?'active':''" @click="item.active=!item.active">
                  {{ item.active?'收起':'展开' }}
                  <img src="../../assets/images/monitor/ellipse1.png" alt="">
                </div>
              </div>
            </div>
          </el-tab-pane>
          <el-tab-pane label="监控周报" name="week">
            <el-empty v-if="!state.weekList.length" description="暂无数据" />
            <div v-for="item in state.weekList" :key="item.id" class="demo_item" >
              <div class="line">
                <img src="../../assets/images/monitor/ellipse.png" alt="">
                <div></div>
              </div>
              <div class="item_con">
                <div class="item_title">
                  <div>{{ item.executeDate }}</div>
                  <div>
                    <el-button text icon="Download" @click="download1(item.id)">下载</el-button>
                    <el-button text icon="Tickets" @click="toDetail(item)">详情</el-button>
                  </div>
                </div>
                <div class="con_top">
                  <div>
                    <img src="../../assets/images/monitor/frame1.png" alt="">
                    共 <span> {{item.countObj.companyCount}} </span> 家企业发生 <span> {{item.countObj.monCount}} </span> 条动态
                  </div>
                  <div class="text">
                    <div>高风险<span>{{ item.highRisk }}</span></div>
                    <div>中风险<span>{{ item.mediumRisk }}</span></div>
                    <div>警示<span>{{ item.reminder }}</span></div>
                    <div>提示<span>{{ item.warning }}</span></div>
                  </div>
                </div>
                <div class="con_list" :class="item.active?'active':''">
                  <div class="item" v-for="change in item.changeObj">
                    <div>
                      <div class="img">{{ change.companyName.substring(0,4) }}</div>
                      <div class="name">{{ change.companyName }}</div>
                    </div>
                    <div class="tag">
                      <div><span style="color: #2969E7;">{{ change.monitor_col }}</span> 条</div>
                    </div>
                  </div>
                </div>
                <div v-if="item.changeObj.length>4" class="expand" :class="item.active?'active':''" @click="item.active=!item.active">
                  {{ item.active?'收起':'展开' }}
                  <img src="../../assets/images/monitor/ellipse1.png" alt="">
                </div>
              </div>
            </div>
          </el-tab-pane>
          <el-tab-pane label="监控月报" name="month">
            <el-empty v-if="!state.monthList.length" description="暂无数据" />
            <div v-for="item in state.monthList" :key="item.id" class="demo_item" >
              <div class="line">
                <img src="../../assets/images/monitor/ellipse.png" alt="">
                <div></div>
              </div>
              <div class="item_con">
                <div class="item_title">
                  <div>{{ item.executeDate }}</div>
                  <div>
                    <el-button text icon="Download" @click="download2(item.id)">下载</el-button>
                    <el-button text icon="Tickets" @click="toDetail(item)">详情</el-button>
                  </div>
                </div>
                <div class="con_top">
                  <div>
                    <img src="../../assets/images/monitor/frame1.png" alt="">
                    共 <span> {{item.countObj.companyCount}} </span> 家企业发生 <span> {{item.countObj.monCount}} </span> 条动态
                  </div>
                  <div class="text">
                    <div>高风险<span>{{ item.highRisk }}</span></div>
                    <div>中风险<span>{{ item.mediumRisk }}</span></div>
                    <div>警示<span>{{ item.reminder }}</span></div>
                    <div>提示<span>{{ item.warning }}</span></div>
                  </div>
                </div>
                <div class="con_list" :class="item.active?'active':''">
                  <div class="item" v-for="change in item.changeObj">
                    <div>
                      <div class="img">{{ change.companyName.substring(0,4) }}</div>
                      <div class="name">{{ change.companyName }}</div>
                    </div>
                    <div class="tag">
                      <div><span style="color: #2969E7;">{{ change.monitor_col }}</span> 条</div>
                    </div>
                  </div>
                </div>
                <div v-if="item.changeObj.length>4" class="expand" :class="item.active?'active':''" @click="item.active=!item.active">
                  {{ item.active?'收起':'展开' }}
                  <img src="../../assets/images/monitor/ellipse1.png" alt="">
                </div>
              </div>
            </div>
          </el-tab-pane>
        </el-tabs>
      </div>
    </div>
  </div>
</template>

<script lang="ts" setup>
import * as api from '../../interface/api.ts'
import {downloadFileGet, downloadFilePost} from "../../utils/request.ts";

const state = reactive({
  dayList: [],
  weekList: [],
  monthList: [],
  dayActive: '',
  weekActive: '',
  monthActive: '',
})

const activeName = ref('day')
const handleClick = (tab: TabsPaneContext, event: Event) => {
  getList()
}

const download = (d:string) => {
  downloadFileGet('/web/monitorReportDays/down/'+d)
}
const download1 = (d:string) => {
  downloadFileGet('/web/monitorReportWeeks/down/'+d)
}
const download2 = (d:string) => {
  downloadFileGet('/web/monitorReportMonths/down/'+d)
}

const router = useRouter()

const toDetail = (d) => {
  if(activeName.value=='day') {
    router.push('/monitorReportDetailDay?id='+d.id)
  } else if(activeName.value=='week') {
    router.push('/monitorReportDetailWeek?id='+d.id)
  } else if(activeName.value=='month') {
    router.push('/monitorReportDetailMonth?id='+d.id)
  }
}


const getList = () => {
  state.dayList = []
  state.weekList = []
  state.monthList = []
  if(activeName.value=='day') {
    api.getInfoList({},'/web/monitorReportDays/getList').then((res:any) => {
      res.data.rows.map(item=>{
        item.changeObj=JSON.parse(item.changeJson)
        item.typeObj=JSON.parse(item.typeJson)
        item.countObj=JSON.parse(item.countJson)
        item.expand = false
        state.dayList.push({...item,active: false})
      })
    })
  } else if(activeName.value=='week') {
    api.getInfoList({},'/web/monitorReportWeeks/getList').then((res:any) => {
      res.data.rows.map(item=>{
        item.changeObj=JSON.parse(item.changeJson)
        item.typeObj=JSON.parse(item.typeJson)
        item.countObj=JSON.parse(item.countJson)
        item.expand = false
        state.weekList.push({...item,active: false})
      })
    })
  } else if(activeName.value=='month') {
    api.getInfoList({},'/web/monitorReportMonths/getList').then((res:any) => {
      res.data.rows.map(item=>{
        item.changeObj=JSON.parse(item.changeJson)
        item.typeObj=JSON.parse(item.typeJson)
        item.countObj=JSON.parse(item.countJson)
        item.expand = false
        state.monthList.push({...item,active: false})
      })
    })
  }
}
onMounted(() => {
  getList()
})
</script>

<style scoped>
.monitor {
  background: #F5F9FF;
  padding-top: 10px;
  padding-bottom: 80px;
  font-family: 思源黑体 CN, 思源黑体 CN;
  min-height: calc(100vh - 225px);
  color: rgba(0,0,0,0.85);
  .demo_item {
    display: flex;
    justify-content: space-between;
    margin-bottom: 16px;
    .line {
      display: flex;
      flex-direction: column;
      align-items: center;
      padding-top: 7px;
      img {
        width: 16px;
        margin-bottom: 8px;
      }
      div {
        width: 1px;
        height: 100%;
        background: #CED2DA;
      }
    }
    .item_con {
      width: calc(100% - 40px);
      .item_title {
        display: flex;
        justify-content: space-between;
        font-family: Microsoft YaHei UI, Microsoft YaHei UI;
        font-weight: 400;
        font-size: 20px;
        color: rgba(0,0,0,0.85);
        margin-bottom: 10px;
      }
      .con_top {
        display: flex;
        justify-content: space-between;
        height: 60px;
        padding: 0 24px;
        align-items: center;
        margin-bottom: 16px;
        background: linear-gradient( 180deg, #CEDDFA 0%, #F4F8FE 100%);
        box-shadow: 0px 4px 16px 0px rgba(23,63,142,0.1);
        border-radius: 12px 12px 12px 12px;
        border: 1px solid;
        font-size: 14px;
        border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0));
        div {
          display: flex;
          align-items: center;
          img {
            width: 24px;
            margin-right: 8px;
          }
          span {
            color: #2969E7;
            margin: 0 3px;
          }
        }
        .text {
          div {
            margin-left: 32px;
            span {
              margin-left: 3px;
            }
          }
        }
      }
      .con_list {
        display: flex;
        justify-content: space-between;
        flex-wrap: wrap;
        max-height: 200px;
        overflow: hidden;
        .item {
          width: calc(50% - 8px);
          box-sizing: border-box;
          padding: 16px 24px;
          background: #FFFFFF;
          box-shadow: 0px 4px 16px 0px rgba(23,63,142,0.1);
          border-radius: 8px;
          border: 2px solid;
          border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)) 0 0;
          display: flex;
          justify-content: space-between;
          align-items: center;
          margin-bottom: 16px;
          
          div {
            display: flex;
            align-items: center;
          }
          .img {
            width: 43px;
            height: 43px;
            background: #94B3EC;
            border-radius: 4px 4px 4px 4px;
            font-family: 思源黑体 CN, 思源黑体 CN;
            font-weight: 500;
            font-size: 14px;
            color: #FFFFFF;
            padding: 4px 5px;
            box-sizing: border-box;
            text-align: center;
            line-height: 16px;
            margin-right: 8px;
          }
          .name {
            font-weight: 400;
            font-size: 16px;
            color: #1A2653;
          }
        }
      }
      .con_list.active {
        max-height: 200000px !important;
      }
      .expand {
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 20px;
        color: #2969E7;
        cursor: pointer;
        img {
          width: 20px;
          margin-left: 16px;
          display: block;
        }
      }
      .expand.active {
        img {
          transform: rotateZ(180deg);
        }
      }
    }
  }
}
</style>