fuliqi
2024-04-30 c46e3ad03a8c5fb27b0361d219babca0e537ad77
src/views/system/result/index.vue
@@ -1,248 +1,65 @@
<template>
  <div id="warp">
    <div>
      <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"
        style="margin-bottom: 10px">
        <el-menu-item index="0">省厅考核</el-menu-item>
        <el-menu-item index="1">市局考核</el-menu-item>
      </el-menu>
    </div>
    <div class="data-chart-container">
      <el-card class="data-card" :body-style="{ height: '100%' }">
        <div class="card-content">
          <div class="title-container">
            <h1>考核成绩</h1>
            <div class="select-container">
            <el-date-picker v-model="date" type="date"  placeholder="选择日期">
            </el-date-picker>
          </div>
          </div>
          <div class="echart-container">
            <div id="barChart" ref="barChart"></div>
          </div>
        </div>
      </el-card>
    </div>
    <el-row :gutter="100">
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              自流井
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
    <div>
      <el-row :gutter="100">
        <el-col :span="6" v-for="(city, index) in checkScoreList" :key="index">
          <div class="city-warp">
            <div class="city">
              <div class="title">
                {{ translateDeptId(parseInt(index)) }}
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              <div class="score-warp">
                <div class="score-item">
                  <div style="font-size: 15px; margin-bottom: 15px">{{ formatCreateDate(city[0].createTime) }}</div>
                </div>
                <div v-for="(score, scoreIndex) in city" :key="scoreIndex">
                  <div class="score-item">
                    <div v-if="score.examineCategory == 2">车辆:</div>
                    <div v-else-if="score.examineCategory == 3">人脸:</div>
                    <div v-else-if="score.examineCategory == 1">视频:</div>
                    <div class="score">{{ score.score }}</div>
                  </div>
                </div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              <div class="bottom-publish">
                <el-button size="medium" :type="isAnyUnpublished(city) ? 'success' : 'danger'" @click="publish(city)">
                  {{ isAnyUnpublished(city) ? '发布' : '取消' }}
                </el-button>
                <el-button size="medium" @click="jumpDetail(index)" type="info">详情</el-button>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              富顺
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              荣县
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              沿滩区
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
    </el-row>
    <el-row style="margin-top: 30px" :gutter="100">
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              高新区
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              大安区
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
      <el-col :span="6">
        <div class="city-warp">
          <div class="city">
            <div class="title">
              贡井区
            </div>
            <div class="score-warp">
              <div class="score-item">
                <div style="font-size: 15px;margin-bottom: 15px">2024年4月12日</div>
              </div>
              <div class="score-item">
                <div>视频:</div>
                <div class="score">99.5</div>
              </div>
              <div class="score-item">
                <div>人脸:</div>
                <div class="score">87</div>
              </div>
              <div class="score-item">
                <div>车辆:</div>
                <div class="score">94</div>
              </div>
            </div>
            <div class="bottom-publish">
              <el-button size="medium" type="success">发布</el-button>
              <el-button size="medium" @click="jumpDetail" type="info">详情</el-button>
            </div>
          </div>
        </div>
      </el-col>
    </el-row>
        </el-col>
      </el-row>
    </div>
  </div>
</template>
<script>
import { areaSelect } from '@/api/system/dept';
import { listScore, getScore, delScore, addScore, updateScore, publishScore } from "@/api/platform/check-score";
import * as echarts from 'echarts';
let observer = null;
let chart = null;
@@ -250,8 +67,13 @@
  name: 'index',
  data() {
    return {
      activeIndex: '1',
      activeIndex2: '1',
      province: {
        id: [],
        publish: null,
      },
      checkScoreList: [],
      areaList: [],
      activeIndex: '0',
      date: '',
      company: '',
      dataList: {
@@ -260,11 +82,31 @@
        data2: [93.7, 93.5, 94.3, 96.5, 95.3, 94.2, 93.3],
        data3: [98.3, 94.3, 93.3, 95.5, 96.8, 96.1, 95.8],
      },
      // 查询参数
      queryParams: {
        examineTag: null,
        createTime: null
      },
    }
  },
  created() {
    this.queryParams.examineTag = this.activeIndex
    this.getList();
    this.areaSelect();
  },
  mounted() {
    chart = echarts.init(this.$refs.barChart);
    this.initEchart();
  },
  methods: {
    jumpDetail() {
      this.$router.push("/examine/detail")
    jumpDetail(index) {
      this.$router.push({
        path: '/examine/detail',
        query: {
          index: index,
          examineTag: this.activeIndex
        }
      })
    },
    initEchart() {
      const option = {
@@ -319,17 +161,165 @@
        ]
      }
      chart.setOption(option, true);
    },
    }
    // 设置chart
    setChartOption(data) {
      if (!data) return;
      const mapData = Object.keys(data).map(key => {
        return {
          name: this.translateDeptId(parseInt(key)),
          data: data[key]
        }
      });
      const nameArray = mapData.map(item => item.name);
      const data1 = this.filterData(mapData, 1);
      const data2 = this.filterData(mapData, 2);
      const data3 = this.filterData(mapData, 3);
      const option = {
        grid: {
          left: 0,
          right: 0,
          bottom: 0,
          top: '20%',
          containLabel: true
        },
        legend: {
          right: 'right',
          top: 'top',
          icon: 'rect',
          orient: "vertical",
        },
        tooltip: {},
        xAxis: {
          type: 'category',
          axisLabel: {
          },
          data: nameArray
        },
        yAxis: {
          min: 90,
        },
        series: [
          {
            type: 'bar',
            name: '视频考核',
            data: data1,
            itemStyle: {
              color: 'rgba(255, 165, 0, 1)'
            }
          },
          {
            type: 'bar',
            name: '人脸考核',
            data: data2,
            itemStyle: {
              color: 'rgba(85, 192, 191, 1)'
            }
          },
          {
            type: 'bar',
            name: '车辆考核',
            data: data3,
            itemStyle: {
              color: 'rgba(62, 144, 247, 1)'
            }
          },
        ]
      }
      chart.setOption(option, true);
    },
    filterData(data, tag) {
      if (!data) return;
      if(!Array.isArray(data)) return;
      const tempArray = [];
      data.forEach((item) => {
        if(item.data.length) {
          item.data.forEach((examine) => {
            if(examine.examineCategory === tag) {
              tempArray.push(examine.score);
            }
          })
        }
      })
      return tempArray;
    },
    // 区域下拉数据
    areaSelect() {
      areaSelect().then(res => {
        this.areaList = res.data;
      })
    },
    translateDeptId(deptId) {
      const department = this.areaList.find(dept => dept.id === deptId);
      return department ? department.value : '未知';
    },
    isAnyUnpublished(city) {
      // 检查 city 的 score 数组中是否有任何一个的 publish 属性为 'UNPUBLISHED'
      return city.some(score => score.publish === 'UNPUBLISHED');
    },
    formatCreateDate(dateString) {
      const date = new Date(dateString);
      const year = date.getFullYear();
      const month = date.getMonth() + 1; // getMonth() 返回的月份是从 0 开始的,所以要加 1
      const day = date.getDate();
      // 使用 padStart 方法确保月份和日期始终是两位数
      const formattedMonth = month.toString().padStart(2, '0');
      const formattedDay = day.toString().padStart(2, '0');
      return `${year}年${formattedMonth}月${formattedDay}号`;
    },
    /** 导航切换 */
    handleSelect(key) {
      this.activeIndex = key; // 更新当前激活的菜单项
      this.queryParams.examineTag = key;
      this.getList();
    },
    /** 查询考核成绩列表 */
    getList() {
      this.loading = true;
      // 获取当前日期
      const today = new Date();
      // 计算昨天的日期
      const yesterday = new Date(today);
      yesterday.setDate(today.getDate() - 1);
      // 将昨天的日期格式化为字符串,这里假设后端期望的是ISO 8601格式
      this.queryParams.createTime = yesterday.toISOString().split('T')[0];
      console.log(this.queryParams);
      listScore(this.queryParams).then(response => {
        this.checkScoreList = response.data;
        console.log(this.checkScoreList);
        this.loading = false;
        this.setChartOption(this.checkScoreList);
      });
    },
    publish(city) {
      let text = this.isAnyUnpublished(city) ? "发布" : "取消发布";
      const cityName = this.translateDeptId(parseInt(city[0].deptId));
      this.province.publish = text === "发布" ? "PUBLISHED" : "UNPUBLISHED";
      this.province.id = city.map(city => city.id);
      this.$modal.confirm('是否确认' + text + '考核名为"' + cityName + '"的成绩?')
        .then(() => {
          return publishScore(this.province);
        })
        .then(() => {
          this.getList();
          this.$modal.msgSuccess(text + "成功");
        })
        .catch(() => {
          // 错误处理逻辑
        });
    },
  },
  mounted() {
    chart = echarts.init(this.$refs.barChart);
    this.initEchart();
  }
}
</script>
<style lang = "scss" scoped>
<style lang="scss" scoped>
.score-warp {
  display: flex;
  flex-direction: column;
@@ -337,25 +327,32 @@
  align-items: center;
  color: #797777
}
.score-item {
  display: flex;
  flex-direction: row;
}
.score {
  width: 60px;
  text-align: right;
  padding: 3px 0;
}
#warp {
  padding: 20px;
  padding: 0 10px;
}
.city-warp {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 210px;
  margin-bottom: 25px;
}
.city {
  width: 240px;
  height: 100%;
@@ -365,15 +362,18 @@
  text-align: center;
  padding: 10px 0px;
}
.bottom-publish {
  width: 100%;
  position: absolute;
  bottom: 10px;
}
.title {
  font-size: larger;
  margin-bottom: 5px;
}
.data-chart-container {
  height: 400px;
  margin-bottom: 20px;
@@ -388,6 +388,7 @@
    }
  }
}
.title-container {
  position: absolute;
  display: flex;
@@ -412,6 +413,7 @@
    height: 100%;
  }
}
.select-container {
  margin: 0 20px;
  width: 180px;