Hua 1 月之前
父節點
當前提交
546b4fd645
共有 35 個文件被更改,包括 3276 次插入14 次删除
  1. 159 0
      src/api/homeMainView.js
  2. 13 1
      src/router/moduleRoutes.js
  3. 1 1
      src/views/duChaGuanLi/duChaQuYuList.vue
  4. 1 1
      src/views/duChaJiHua/editDcdxInfo_common.vue
  5. 1 1
      src/views/duChaJiHua/editDcdxInfo_county.vue
  6. 1 1
      src/views/duChaJiHua/editDcdxInfo_sjzhdcjh.vue
  7. 1 1
      src/views/duChaJiHua/editDczInfo.vue
  8. 1 1
      src/views/duChaJiHua/planManageProvinceNew/duChaDuiXiangSingle/common.vue
  9. 1 1
      src/views/duChaJiHua/planManageProvinceNew/duChaDuiXiangSingle/sjzhdcjh.vue
  10. 1 1
      src/views/duChaJiHua/planManageProvinceNew/treeGroup.vue
  11. 1 1
      src/views/duChaTianBao/duChaTianBaoIndex_sxqfgdc.vue
  12. 1 1
      src/views/duChaTianBao/duChaTianBaoIndex_tydc.vue
  13. 1 1
      src/views/duChaWenTi/dcwt_ywgfzrwtcz_1.vue
  14. 77 0
      src/views/home/CenterMap.vue
  15. 70 0
      src/views/home/Centerbar.vue
  16. 358 0
      src/views/home/DcdxDetails.vue
  17. 41 0
      src/views/home/DcryDetails.vue
  18. 43 0
      src/views/home/DczDetails.vue
  19. 44 0
      src/views/home/FinishRate.vue
  20. 41 0
      src/views/home/FxwtDetails.vue
  21. 89 0
      src/views/home/HomeViewBar.vue
  22. 287 0
      src/views/home/MapChart.vue
  23. 97 0
      src/views/home/MultiSelect.vue
  24. 104 0
      src/views/home/Notices.vue
  25. 53 0
      src/views/home/ProblemPieChart.vue
  26. 2 0
      src/views/home/PublicMore.vue
  27. 323 0
      src/views/home/PublicSentiment.vue
  28. 91 0
      src/views/home/QuestionCount.vue
  29. 117 0
      src/views/home/QuestionLineChart.vue
  30. 249 0
      src/views/home/SupervisedObject.vue
  31. 48 0
      src/views/home/Systemstatus.vue
  32. 754 0
      src/views/home/homeMainView.vue
  33. 1 0
      src/views/jicha/fenPeiDidian.vue
  34. 1 2
      src/views/jicha/jiHuaGuanLi.vue
  35. 203 0
      src/views/zongHeZhanShi/index.vue

+ 159 - 0
src/api/homeMainView.js

@@ -0,0 +1,159 @@
+import request from '@/utils/gw_ajax_request'
+
+export function BarsDczNums(data) {
+    return request({
+        url: '/pc/index/countGroup',
+        method: 'POST',
+        data: data
+    })
+}
+export function BarsDcyrNums(data) {
+    return request({
+        url: '/pc/index/countPerson',
+        method: 'POST',
+        data: data
+    })
+}
+export function BarsDcdxNums(data) {
+    return request({
+        url: '/pc/index/countDucha',
+        method: 'POST',
+        data: data
+    })
+}
+export function BarsFxwtNums(data) {
+    return request({
+        url: '/pc/index/countPblmByType',
+        method: 'POST',
+        data: data
+    })
+}
+export function BarsFxwtReportNums(data) {
+    return request({
+        url: '/pc/index/countPblmByType',
+        method: 'POST',
+        data: data
+    })
+}
+export function userAndGroup(data) {
+    return request({
+        url: '/pc/index/countPersOnline',
+        method: 'POST',
+        data: data
+    })
+}
+
+export function getcountPlan(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countPlan',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getProblemCountByProAndLevel(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countPblmByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getAddvCountGroup(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countGroupByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getAddvCountPerson(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countPersonByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getAddvCountObject(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countPlanByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getAddvCountProblem(endTime, orgIds, pTypes, startTime) {
+    return request({
+        url: '/pc/index/countPblmByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime
+        }
+    })
+}
+
+export function getAddvCountProblemForReport(endTime, orgIds, pTypes, startTime, quote) {
+    return request({
+        url: '/pc/index/countPblmByPro',
+        method: 'POST',
+        data: {
+            "endTime": endTime,
+            "orgIds": orgIds,
+            "pTypes": pTypes,
+            "startTime": startTime,
+            "quote": quote
+        }
+    })
+}
+
+export function getTrendLineData(adCode, dtype, orgIds, pblmState, startTime, endTime, pTypes) {
+    return request({
+        url: '/pc/index/countPblmByTime',
+        method: 'POST',
+        data: {
+            "adCode": adCode,
+            "dtype": dtype,
+            "orgIds": orgIds,
+            "pblmState": pblmState,
+            "sttm": startTime,
+            "ettm": endTime,
+            "type": pTypes
+        }
+    })
+}
+
+export function getQustionCountData() {
+    return request({
+        url: '/pc/index/timeCount',
+        method: 'GET',
+    })
+}

+ 13 - 1
src/router/moduleRoutes.js

@@ -841,13 +841,25 @@ export default [
         path: 'jicha/jichuxinxi',
         component: () => import('../views/jicha/jichuxinxi.vue'),
       },
+      {
+        name: '督查首页',
+        path: 'home/homeMainView',
+        meta: { title: '督查首页' },
+        component: () => import('../views/home/homeMainView.vue'),
+      },
+      {
+        name: '综合展示',
+        path: 'zongHeZhanShi/index',
+        meta: { title: '综合展示' },
+        component: () => import('../views/zongHeZhanShi/index.vue'),
+      },
       {
         name: '稽察首页',
         path: 'jicha/inspectionIndex',
         component: () => import('../views/jicha/inspectionIndex.vue'),
       },
       {
-        name: '稽察成果报告',
+        name: '稽察阶段成果报告',
         path: 'jicha/result2',
         component: () => import('../views/jicha/result2.vue'),
       },

+ 1 - 1
src/views/duChaGuanLi/duChaQuYuList.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div
     style="height:100%;max-height:100%;overflow-y:auto;display:flex;flex-direction:column;justify-content:space-between;"
   >

+ 1 - 1
src/views/duChaJiHua/editDcdxInfo_common.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-modal
     title="添加督查对象"
     :open="dialogFormVisible"

+ 1 - 1
src/views/duChaJiHua/editDcdxInfo_county.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-modal title="添加督查对象" :open="dialogFormVisible" @ok="saveChange" @cancel="() => { dialogFormVisible = false, type = undefined }" width="80%">
     <a-layout>
       <a-layout-sider width="200px" style="border:1px solid #d5d5ff; background: #fff;">

+ 1 - 1
src/views/duChaJiHua/editDcdxInfo_sjzhdcjh.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-modal
     title="添加督查对象123"
     v-model:open="dialogFormVisible"

+ 1 - 1
src/views/duChaJiHua/editDczInfo.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-modal
     title="添加人员"
     :open="dialogFormVisible"

+ 1 - 1
src/views/duChaJiHua/planManageProvinceNew/duChaDuiXiangSingle/common.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-table
     :row-selection="{
       selectedRowKeys: selectedRowKeys,

+ 1 - 1
src/views/duChaJiHua/planManageProvinceNew/duChaDuiXiangSingle/sjzhdcjh.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <a-table
     :row-selection="{
       selectedRowKeys: selectedRowKeys,

+ 1 - 1
src/views/duChaJiHua/planManageProvinceNew/treeGroup.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div class="grid-content bg-purple tree_group" :style="{'height': treeHeight + 'px'}">
     <a-card title="分工节点" style="height: 100%">
       <!-- 左侧树 -->

+ 1 - 1
src/views/duChaTianBao/duChaTianBaoIndex_sxqfgdc.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div style="height:100%;width:100%;">
     <a-layout style="height:100%;width:100%;">
       <a-layout-sider width="320px" style="border-right:2px solid #d5d5ff;float:left" :style="{ 'max-height': testHeight + 'px', 'height': testHeight + 'px' }">

+ 1 - 1
src/views/duChaTianBao/duChaTianBaoIndex_tydc.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div style="height:100%;width:100%;">
     <a-layout style="height:100%;width:100%;">
       <a-layout-sider width="320px" theme="light" style="border-right:2px solid #d5d5ff;float:left" :style="{ 'max-height': testHeight + 'px', 'height': testHeight + 'px' }">

+ 1 - 1
src/views/duChaWenTi/dcwt_ywgfzrwtcz_1.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div class="mainCss">
     <div class="pageRight_none">
       <a-tabs v-model="hasStat" type="card" ref="topContainer" @tabClick="handleClick">

+ 77 - 0
src/views/home/CenterMap.vue

@@ -0,0 +1,77 @@
+<template>
+  <div class="chart-container">
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">{{ mapTitleFocusName || '督查' }}分布</div>
+    </div>
+    <div ref="chartRef" class="chart-body" />
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+
+export default {
+  name: 'CenterMap',
+  props: {
+    barsChooseType: String, barsChooseUnit: String, dczLists: Array,
+    transferUseLists: Array, mapData: Array,
+    requestEntmTime: String, requestOrgId: String,
+    requestObjectType: String, requestSttmTime: String,
+    mapTitleFocusName: { type: String, default: '督查' },
+    mapPointColor: { type: String, default: '#13C5A6' },
+  },
+  emits: ['globalTime', 'OrgListsEventToMainView', 'DctypeListsEventToMainView', 'mapClick'],
+  data() {
+    return { chart: null }
+  },
+  watch: {
+    mapData() { this.renderChart() },
+  },
+  methods: {
+    renderChart() {
+      if (!this.$refs.chartRef) return
+      if (!this.chart) this.chart = echarts.init(this.$refs.chartRef)
+      const data = this.mapData || []
+      const xData = data.map(i => i.name || i.adName || '')
+      const yData = data.map(i => i.value || i.total || 0)
+      this.chart.setOption({
+        tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
+        grid: { top: '8%', bottom: '8%', left: '5%', right: '5%', containLabel: true },
+        xAxis: { type: 'category', data: xData, axisLabel: { rotate: 30, fontSize: 9 } },
+        yAxis: { type: 'value' },
+        series: [{
+          type: 'bar', data: yData, barMaxWidth: 50,
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              { offset: 0, color: '#76E9C0' },
+              { offset: 1, color: '#13C4B8' },
+            ]),
+            borderRadius: [4, 4, 0, 0],
+          },
+        }],
+      })
+      this.chart.on('click', (params) => {
+        this.$emit('mapClick', { onClickAdCode: params.name, onClickAdName: params.name })
+      })
+    },
+  },
+  mounted() { this.$nextTick(() => this.renderChart()) },
+  beforeUnmount() { if (this.chart) this.chart.dispose() },
+}
+</script>
+
+<style scoped>
+.chart-container { width: 100%; height: 100%; }
+.simple_header {
+  height: 3.7vh; display: flex; align-items: center; padding: 0 10px;
+}
+.simple_header_icon {
+  background: rgba(46, 101, 253, 1); width: 4px; height: 2vh;
+  border-radius: 4px; margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1); font-size: 14px; font-weight: bold;
+}
+.chart-body { height: calc(100% - 3.7vh); }
+</style>

+ 70 - 0
src/views/home/Centerbar.vue

@@ -0,0 +1,70 @@
+<template>
+  <div class="chart-container">
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">{{ mapTitleFocusName || '统计' }}柱状图</div>
+    </div>
+    <div ref="chartRef" class="chart-body" />
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+
+export default {
+  name: 'Centerbar',
+  props: {
+    mapTitleFocusName: String, barData: Array,
+    barStartColor: { type: String, default: '#76E9C0' },
+    barEndColor: { type: String, default: '#13C4B8' },
+    barsChooseUnit: { type: String, default: '组' },
+  },
+  data() {
+    return { chart: null }
+  },
+  watch: {
+    barData() { this.renderChart() },
+  },
+  methods: {
+    renderChart() {
+      if (!this.$refs.chartRef) return
+      if (!this.chart) this.chart = echarts.init(this.$refs.chartRef)
+      const data = this.barData || []
+      const xData = data.map(i => i.name || i.adName || '')
+      const yData = data.map(i => i.value || i.total || 0)
+      this.chart.setOption({
+        grid: { top: '15%', bottom: '10%', left: '8%', right: '5%', containLabel: true },
+        tooltip: { trigger: 'axis' },
+        xAxis: { type: 'category', data: xData, axisLabel: { rotate: 30, fontSize: 10 } },
+        yAxis: { type: 'value', name: this.barsChooseUnit },
+        series: [{
+          type: 'bar', data: yData, barMaxWidth: 40,
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              { offset: 0, color: this.barStartColor },
+              { offset: 1, color: this.barEndColor },
+            ]),
+            borderRadius: [4, 4, 0, 0],
+          },
+        }],
+      })
+    },
+  },
+  mounted() { this.$nextTick(() => this.renderChart()) },
+  beforeUnmount() { if (this.chart) this.chart.dispose() },
+}
+</script>
+
+<style scoped>
+.simple_header {
+  height: 3.7vh; display: flex; align-items: center; padding: 0 10px;
+}
+.simple_header_icon {
+  background: rgba(46, 101, 253, 1); width: 4px; height: 2vh;
+  border-radius: 4px; margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1); font-size: 14px; font-weight: bold;
+}
+.chart-body { height: calc(100% - 3.7vh); }
+</style>

+ 358 - 0
src/views/home/DcdxDetails.vue

@@ -0,0 +1,358 @@
+<template>
+  <div>
+    <div class="detailsTop" style="border: 1px dotted skyblue;">
+      <div id="dcdx" style="width: 100%;height: 100%;"></div>
+    </div>
+    <div class="detailsBottom" ref="table">
+        <el-table
+          border
+          ref="multipleTable"
+          :data="tableData"
+
+          tooltip-effect="dark"
+        >
+            <el-table-column align="center" label="序号" min-width="50">
+            <template #default="scope">{{ (pageNum - 1) * pageSize + (scope.$index + 1) }}</template>
+          </el-table-column>
+         <el-table-column
+            header-align="center"
+            align="center"
+            min-width="100"
+            prop="adName"
+            label="地点"
+            show-overflow-tooltip
+          ></el-table-column>
+          <el-table-column
+            header-align="center"
+            align="center"
+            min-width="100"
+            prop="nm"
+            label="名称"
+            show-overflow-tooltip
+          ></el-table-column>
+          <el-table-column
+            header-align="center"
+            align="center"
+            min-width="80"
+            label="操作"
+          >
+            <template #default="scope">
+              <el-button type="primary" size="mini" @click.stop="lookOver(scope.row)">详情</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="pageNum"
+          :page-sizes="[10, 20, 100]"
+          :page-size="20"
+          :pager-count="3"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          style="text-align: center;margin-top: 1vh;">
+        </el-pagination>
+    </div>
+    <!--小水库,2人饮工程,3水毁工程,4 172工程建设,5水文司地下水,6水闸,7 172工程运行 ,-->
+    <!-- 水库基础信息 (基础表) -->
+    <jichuxinxiSk ref="skJcxxRef" v-if="this.pType == '1'" :currentResCode="currentId"></jichuxinxiSk>
+    <!--人饮工程-->
+    <renyinProject v-if="ryInfoDialog" :ryTitle="ryTitle" :ryObjId="ryObjId" @closeModal="closeInfo"></renyinProject>
+    <!-- 水毁工程基础信息 (基础表) -->
+    <jichuxinxiShuihui ref="shuihuiJcxxRef" v-if="this.pType == '3'" :currentResCode="currentId"></jichuxinxiShuihui>
+    <!-- 172工程建设基础信息 (基础表) -->
+    <jichuxinxi172 ref="172JcxxRef" v-if="this.pType == '4' || this.pType == '7'" :currentResCode="currentId"></jichuxinxi172>
+    <!-- 地下水基础信息 (基础表) -->
+    <jichuxinxiDxs ref="dxsJcxxRef" v-if="this.pType == '5'" :currentDxsCode="currentId"></jichuxinxiDxs>
+    <!-- 水闸基础信息 (基础表) -->
+    <jichuxinxiShuiza ref="shuizaJcxxRef" v-if="this.pType == '6'" :currentResCode="currentId"></jichuxinxiShuiza>
+
+  </div>
+</template>
+
+<script>
+  import * as echarts from 'echarts'
+  import request from "@/utils/gw_ajax_request";
+    export default {
+        name: "dcdxDetails",
+        props: ["adCode","requestSttmTime","requestEntmTime","requestOrgId","requestObjectType"],
+        components: {
+          jichuxinxiSk: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_sk'], resolve)
+          },
+          jichuxinxiSyd: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_nysyd'], resolve)
+          },
+          jichuxinxi150: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_ny150'], resolve)
+          },
+          jichuxinxiXzc: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_nyXzc'], resolve)
+          },
+          jichuxinxiNcysgc: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_ncysgc'], resolve)
+          },
+          jichuxinxiShuihui: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_shuihui'], resolve)
+          },
+          jichuxinxiShuiza: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_shuiza'], resolve)
+          },
+          jichuxinxiSzAll: resolve => {
+            require(['../zongHeXinXiNew/components/jichuxinxi_szAll'], resolve)
+          },
+          renyinProject: resolve => {
+            require(['../zongHeXinXiNew/components/renyinProject'], resolve)
+          }
+        },
+        data() {
+          return {
+            tableHeight: 0,
+            tableData: [],
+            pageNum: 1,
+            pageSize: 20,
+            total: 0,
+            currentId:'',
+            pType: '',
+            ryInfoDialog: false,
+            ryTitle:'',
+            ryObjId:'',
+            xData: [],
+            yData: []
+          }
+        },
+        mounted() {
+          this.getEcharts();
+          this.getTableData();
+          this.init();
+        },
+        methods:{
+          init() {
+            this.tableHeight = this.$refs['table'].offsetHeight - 45;
+          },
+          getTableData(){
+            let params = {
+              "adCode": this.adCode,
+              "pageSize": this.pageSize,
+              "pageNum": this.pageNum,
+              "startTime": this.requestSttmTime,
+              "endTime": this.requestEntmTime,
+              "orgIds": this.requestOrgId,
+              "pTypes": this.requestObjectType
+            }
+            this.$nextTick(function () {
+              request.post(`/pc/index/findObjByAdCode`,params).then(res =>{
+                if(res.success){
+                  this.tableData = res.data.list;
+                  this.total = res.data.total;
+                }else{
+                  this.$message.error(res.message);
+                }
+              }).catch(err =>{
+                this.$message.error(err);
+              })
+            })
+
+          },
+          getEcharts(){
+            let params = {
+              "adCode": this.adCode,
+              "startTime": this.requestSttmTime,
+              "endTime": this.requestEntmTime,
+              "orgIds": this.requestOrgId,
+              "pTypes": this.requestObjectType
+            };
+            this.$nextTick(function () {
+              request.post(`/pc/index/findObjCountByAdCode`, params).then(res => {
+                if(res.success){
+                  let CountData = res.data;
+                  let xData = [];
+                  let yData = [];
+                  CountData.forEach((item, index) => {
+                    xData.push(item.name);
+                    yData.push(item.total);
+                  });
+                  this.xData = xData;
+                  this.yData = yData;
+                  this.initCharts();
+                }
+              }).catch(err => {
+
+              })
+            })
+
+          },
+          handleSizeChange(val) {
+            this.pageSize = val;
+            this.getTableData();
+          },
+          handleCurrentChange(val) {
+            this.pageNum = val;
+            this.getTableData();
+          },
+          //柱状图demo
+          initCharts(){
+            const self = this;
+            self.myChart = echarts.init(document.getElementById('dcdx'));
+            self.myChart.setOption({
+              grid: {
+                left: '7%',
+                right: '5%',
+                top: '15%',
+                bottom: '25%',
+              },
+              title: {
+                show: false
+              },
+              tooltip : {
+                trigger: 'axis',
+                label: {
+                  show: true
+                },
+                formatter: function (params) {
+                  return params[0].axisValue + ': ' +params[0].data + '个'
+                }
+              },
+              legend: {
+                data: self.xData,
+                right: '3%',
+                top: '10%',
+                itemWidth: 11,
+                itemHeight: 11,
+                textStyle: {
+                  color: '#ffffff',
+                  fontSize: 13
+                }
+              },
+              toolbox: {
+                show: false,
+              },
+              xAxis: [
+                {
+                  type: 'category',
+                  show: true,
+                  axisTick: {
+                    show: false,
+                    alignWithLabel: true
+                  },
+                  axisLabel: {
+                    rotate: 30,
+                    color: '#333',
+                  },
+                  axisLine: {
+                    show: true,
+                    lineStyle: {
+                      color: 'rgba(63, 158, 255, 1)'
+                    }
+                  },
+                  data: self.xData
+                }
+              ],
+              yAxis: {
+                axisLabel:{
+                  color:'#333'
+                },
+                axisLine: {
+                  show: true,
+                  lineStyle: {
+                    color: 'rgba(63, 158, 255, 1)'
+                  }
+                },
+                splitLine: {
+                  show: true,
+                  lineStyle: {
+                    type: 'dashed',
+                    color: 'rgba(33,148,246,0.2)'
+                  }
+                },
+                axisTick: {
+                  show: false
+                },
+                splitArea: {
+                  show: true,
+                  areaStyle: {
+                    color: 'rgba(255,255,255,1)'
+                  }
+                },
+                type: 'value',
+                max: function(value) {
+                  return value.max;
+                },
+                min: function(value) {
+                  return value.min;
+                },
+              },
+              series: [
+                {
+                  type:'bar',
+                  label: {
+                    normal: {
+                      show: true,
+                      position: 'top',
+                      textStyle: {
+                        color: '#76e9c0'
+                      }
+                    }
+                  },
+                  itemStyle: {
+                    normal: {
+                      color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
+                        offset: 0,
+                        color: "#59E9BC" // 0% 处的颜色
+                      }, {
+                        offset: 1,
+                        color: "#76e9c0" // 100% 处的颜色
+                      }], false)
+                    }
+                  },
+                  barWidth: '40%',
+                  yAxisIndex: 0,
+                  data: self.yData
+                }
+              ]
+            });
+          },
+          // 详情接综合信息基础信息
+          lookOver(row){
+            this.pType = row.ptype;
+            this.currentId =  row.code;
+            if (this.$refs['skJcxxRef']) {
+              this.$refs['skJcxxRef'].showDialog();
+            }else if(this.pType == '2'){
+              this.ryObjId = row.objId;
+              this.ryTitle = row.adName;
+              this.ryInfoDialog = true;
+            }else if(this.$refs['shuihuiJcxxRef']){
+              this.$refs['shuihuiJcxxRef'].showDialog();
+            }else if(this.$refs['172JcxxRef']){
+              this.$refs['172JcxxRef'].showDialog();
+            }else if(this.$refs['dxsJcxxRef']){
+              this.$refs['dxsJcxxRef'].showDialog();
+            }else if(this.$refs['shuizaJcxxRef']){
+              this.$refs['shuizaJcxxRef'].showDialog();
+            }
+          },
+          //  弹窗关闭
+          closeInfo(name) {
+            this.ryInfoDialog = false;
+          },
+        },
+        watch:{
+          adCode(n,o){
+            this.adCode = n;
+            this.getTableData();
+          }
+        }
+    }
+</script>
+
+<style>
+  .detailsTop,.detailsBottom{
+    height: 30vh;
+    overflow: auto;
+  }
+  .detailsBottom{
+    margin-top: 2vh;
+  }
+  /*.v-modal{z-index: 1999 !important;}*/
+</style>

+ 41 - 0
src/views/home/DcryDetails.vue

@@ -0,0 +1,41 @@
+<template>
+  <div>
+    <div class="detail-header">{{ adCode ? '行政区划: ' + adCode : '督查人员详情' }}</div>
+    <a-table v-if="dataList.length" :columns="columns" :data-source="dataList" :pagination="false" size="small" bordered row-key="id" />
+    <div v-else style="text-align:center;padding:20px;color:#999;">暂无数据</div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/gw_ajax_request'
+
+export default {
+  name: 'DcryDetails',
+  props: { adCode: String, requestEntmTime: String, requestOrgId: String, requestSttmTime: String, requestObjectType: String },
+  data() {
+    return {
+      dataList: [],
+      columns: [
+        { title: '姓名', dataIndex: 'nm', width: 100 },
+        { title: '所属组', dataIndex: 'groupNm', width: 150 },
+        { title: '督查对象', dataIndex: 'dcdxNums', width: 120 },
+      ],
+    }
+  },
+  watch: {
+    adCode: { immediate: true, handler() { this.fetchData() } },
+  },
+  methods: {
+    fetchData() {
+      if (!this.adCode) return
+      request({ url: '/pc/index/countPersonByPro', method: 'POST',
+        data: { endTime: this.requestEntmTime, orgIds: this.requestOrgId, startTime: this.requestSttmTime, type: this.requestObjectType }
+      }).then(res => { this.dataList = res.data || [] })
+    },
+  },
+}
+</script>
+
+<style scoped>
+.detail-header { font-size: 16px; font-weight: bold; margin-bottom: 10px; padding: 5px 0; border-bottom: 1px solid #eee; }
+</style>

+ 43 - 0
src/views/home/DczDetails.vue

@@ -0,0 +1,43 @@
+<template>
+  <div>
+    <div class="detail-header">{{ adCode ? '行政区划: ' + adCode : '督查组详情' }}</div>
+    <a-table v-if="dataList.length" :columns="columns" :data-source="dataList" :pagination="false" size="small" bordered row-key="id" />
+    <div v-else style="text-align:center;padding:20px;color:#999;">暂无数据</div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/gw_ajax_request'
+
+export default {
+  name: 'DczDetails',
+  props: { adCode: String, requestEntmTime: String, requestOrgId: String, requestSttmTime: String, requestObjectType: String },
+  data() {
+    return {
+      dataList: [],
+      columns: [
+        { title: '督察组名称', dataIndex: 'nm', width: 150 },
+        { title: '督察人员数', dataIndex: 'dcryNum', width: 100 },
+        { title: '督查对象数', dataIndex: 'dcdxNum', width: 100 },
+      ],
+    }
+  },
+  watch: {
+    adCode: { immediate: true, handler() { this.fetchData() } },
+  },
+  methods: {
+    fetchData() {
+      if (!this.adCode) return
+      request({
+        url: '/pc/index/countGroupByPro',
+        method: 'POST',
+        data: { endTime: this.requestEntmTime, orgIds: this.requestOrgId, startTime: this.requestSttmTime, type: this.requestObjectType }
+      }).then(res => { this.dataList = res.data || [] })
+    },
+  },
+}
+</script>
+
+<style scoped>
+.detail-header { font-size: 16px; font-weight: bold; margin-bottom: 10px; padding: 5px 0; border-bottom: 1px solid #eee; }
+</style>

+ 44 - 0
src/views/home/FinishRate.vue

@@ -0,0 +1,44 @@
+<template>
+  <div>
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">督查完成率</div>
+    </div>
+    <div class="body">
+      <div class="status-item">
+        <div class="label">已完成</div>
+        <div class="value done">{{ finishNumber }}</div>
+      </div>
+      <div class="status-item">
+        <div class="label">未完成</div>
+        <div class="value undone">{{ unfinishNumber }}</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'FinishRate',
+  props: { finishNumber: { type: Number, default: 0 }, unfinishNumber: { type: Number, default: 0 } },
+}
+</script>
+
+<style scoped>
+.simple_header {
+  height: 3.7vh; display: flex; align-items: center; padding: 0 10px;
+}
+.simple_header_icon {
+  background: rgba(46, 101, 253, 1); width: 4px; height: 2vh;
+  border-radius: 4px; margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1); font-size: 14px; font-weight: bold;
+}
+.body { padding: 10px; }
+.status-item { margin-bottom: 10px; }
+.label { font-size: 14px; color: rgba(86,108,146,.8); }
+.value { font-size: 24px; font-weight: bold; }
+.done { color: #13C5A6; }
+.undone { color: #ff9780; }
+</style>

+ 41 - 0
src/views/home/FxwtDetails.vue

@@ -0,0 +1,41 @@
+<template>
+  <div>
+    <div class="detail-header">{{ adCode ? '行政区划: ' + adCode : '问题详情' }}</div>
+    <a-table v-if="dataList.length" :columns="columns" :data-source="dataList" :pagination="false" size="small" bordered row-key="id" />
+    <div v-else style="text-align:center;padding:20px;color:#999;">暂无数据</div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/gw_ajax_request'
+
+export default {
+  name: 'FxwtDetails',
+  props: { adCode: String, requestEntmTime: String, requestOrgId: String, requestSttmTime: String, requestObjectType: String },
+  data() {
+    return {
+      dataList: [],
+      columns: [
+        { title: '问题描述', dataIndex: 'pblmDesc', width: 250 },
+        { title: '严重程度', dataIndex: 'level', width: 100 },
+        { title: '数量', dataIndex: 'total', width: 80 },
+      ],
+    }
+  },
+  watch: {
+    adCode: { immediate: true, handler() { this.fetchData() } },
+  },
+  methods: {
+    fetchData() {
+      if (!this.adCode) return
+      request({ url: '/pc/index/countPblmByPro', method: 'POST',
+        data: { endTime: this.requestEntmTime, orgIds: this.requestOrgId, startTime: this.requestSttmTime, type: this.requestObjectType }
+      }).then(res => { this.dataList = res.data || [] })
+    },
+  },
+}
+</script>
+
+<style scoped>
+.detail-header { font-size: 16px; font-weight: bold; margin-bottom: 10px; padding: 5px 0; border-bottom: 1px solid #eee; }
+</style>

+ 89 - 0
src/views/home/HomeViewBar.vue

@@ -0,0 +1,89 @@
+<template>
+  <div>
+    <div class="button">
+      <div class="bar-item dcz" :class="{ checked: focusType === 'dcz' }" @click="selectType('dcz')">
+        <div class="content">
+          <div class="content_top"><span>督查组</span></div>
+          <div class="content_bottom"><span class="num">{{ dczNum }}</span><span class="unit">组</span></div>
+        </div>
+      </div>
+      <div class="bar-item dcry" :class="{ checked: focusType === 'dcry' }" @click="selectType('dcry')">
+        <div class="content">
+          <div class="content_top"><span>督查人员</span></div>
+          <div class="content_bottom"><span class="num">{{ dcyrNum }}</span><span class="unit">人/次</span></div>
+        </div>
+      </div>
+      <div class="bar-item dcdx" :class="{ checked: focusType === 'dcdx' }" @click="selectType('dcdx')">
+        <div class="content">
+          <div class="content_top"><span>已督查对象</span></div>
+          <div class="content_bottom"><span class="num">{{ dcdxNum }}</span><span class="unit">个</span></div>
+        </div>
+      </div>
+      <div class="bar-item fxwt" :class="{ checked: focusType === 'fxwt' }" @click="selectType('fxwt')">
+        <div class="content">
+          <div class="content_top"><span>发现问题</span></div>
+          <div class="content_bottom"><span class="num">{{ fxwtNum }}</span><span class="unit">个</span></div>
+        </div>
+      </div>
+      <div class="bar-item jbyywt" :class="{ checked: focusType === 'jbyywt' }" @click="selectType('jbyywt')">
+        <div class="content">
+          <div class="content_top"><span>简报引用问题</span></div>
+          <div class="content_bottom"><span class="num">{{ jbyywtNum }}</span><span class="unit">个</span></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HomeViewBar',
+  props: {
+    dczNum: { type: Number, default: 0 },
+    dcyrNum: { type: Number, default: 0 },
+    dcdxNum: { type: Number, default: 0 },
+    fxwtNum: { type: Number, default: 0 },
+    jbyywtNum: { type: Number, default: 0 },
+  },
+  emits: ['barsType', 'globalTime'],
+  data() {
+    return { focusType: 'dcz' }
+  },
+  methods: {
+    selectType(type) {
+      this.focusType = type
+      const config = {
+        dcz: { id: 'dcz', unit: '组', spanName: '督查组', mapPointColor: '#13C5A6', barStartColor: '#76E9C0', barEndColor: '#13C4B8' },
+        dcry: { id: 'dcry', unit: '人', spanName: '督查人员', mapPointColor: '#ff9780', barStartColor: '#ff9780', barEndColor: '#ff6b4a' },
+        dcdx: { id: 'dcdx', unit: '个', spanName: '督查对象', mapPointColor: '#76e9c0', barStartColor: '#76E9C0', barEndColor: '#13C4B8' },
+        fxwt: { id: 'fxwt', unit: '个', spanName: '发现问题', mapPointColor: '#b87cf6', barStartColor: '#b87cf6', barEndColor: '#9b4dca' },
+        jbyywt: { id: 'jbyywt', unit: '个', spanName: '简报引用问题', mapPointColor: '#f9a825', barStartColor: '#f9a825', barEndColor: '#c17900' },
+      }
+      this.$emit('barsType', config[type])
+    },
+  },
+  mounted() {
+    this.selectType('dcz')
+  },
+}
+</script>
+
+<style scoped>
+.button { overflow: hidden; }
+.bar-item {
+  width: 19%; height: 9.7vh; float: left; margin-left: 1%;
+  border-radius: 4px; color: #fff; cursor: pointer;
+  display: flex; align-items: center;
+}
+.bar-item:first-child { margin-left: 0; }
+.dcz { background: linear-gradient(135deg, #13C5A6, #0ea88d); }
+.dcry { background: linear-gradient(135deg, #ff9780, #e87a63); }
+.dcdx { background: linear-gradient(135deg, #76e9c0, #4ec8a0); }
+.fxwt { background: linear-gradient(135deg, #b87cf6, #9b4dca); }
+.jbyywt { background: linear-gradient(135deg, #f9a825, #d4850c); }
+.bar-item.checked { box-shadow: 0 0 10px rgba(81, 175, 234, 1); }
+.bar-item .content { width: 80%; margin: 0 auto; }
+.content_top span { font-size: 14px; }
+.num { font-size: 22px; font-weight: bold; margin-left: 5px; }
+.unit { font-size: 12px; }
+</style>

+ 287 - 0
src/views/home/MapChart.vue

@@ -0,0 +1,287 @@
+<!--  -->
+<template>
+    <div style="width:100%;height:100%;">
+        <div style="width:100%;height:100%;">
+            <div id="syMainMapContainer" style="width: 100%;height: calc(100% - 40px);">
+                <div style="width:100%;height:100%;" id="mapChart"></div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》 from '《组件路径》';
+import * as echarts from 'echarts'
+import axios from 'axios' //引入axios
+// import theme from '../../store/theme'
+export default {
+    //import引入的组件需要注入到对象中才能使用
+    props:['useAddv','mapData','focusType','mapTitleFocusName','mapPointColor','barsChooseUnit'],
+    components: {},
+    data() {
+    //这里存放数据
+        return {
+            addvCenters:{},
+            mapName:'china',
+            firstToOn:true,
+            themeColor:'#000',
+            themeColorMap:'rgb(195,240,255)',
+            mapBorderColor:'#778387',
+        };
+    },
+    //监听属性 类似于data概念
+    computed: {
+        msg(){
+            // return theme.state.testMsg;
+            return this.$store?.state?.theme?.testMsg || 'light';
+        },
+        symbolSize(){
+            if(window.innerWidth <= 1366){
+                return 40;
+            }else{
+                return 50;
+            }
+        },
+        organNm(){
+            return localStorage.getItem('currentOrgNm') ? localStorage.getItem('currentOrgNm') : ''
+        },
+        organCode(){
+            return localStorage.getItem('currentRlcode') ? localStorage.getItem('currentRlcode') : ''
+        },
+        isNational(){
+            return this.organCode.indexOf('00') == 0 ? true : false
+        }
+    },
+    //监控data中的数据变化
+    watch: {
+        mapData:function(){
+            this.mapName = this.organNm
+            this.refreshTheChart();
+        },
+        msg(n,o){
+            if( n == 'dark'){
+                this.themeColor = 'rgba(177, 210, 254, 1)';
+                this.themeColorMap = 'rgb(32,66,160)';
+                this.mapBorderColor = '#0380c3';
+                this.refreshTheChart();
+            }else{
+                this.themeColor = '#000';
+                this.themeColorMap = 'rgb(195,240,255)';
+                this.mapBorderColor = '#778387';
+                this.refreshTheChart();
+            }
+        }
+    },
+    //方法集合
+    methods: {
+        getTheCustomGeoDataByOrg(originalGeoJson,useAdName){
+            /*该方法接收原本的geoJson,从中挑选出所选机构涉及的行政区(其余的不要了) */
+            let usedGeoJson = [];
+            let originalGeoObject = {};
+            
+            originalGeoJson.features.forEach(item=>{//将要处理的originalGeoJson的Features数组转化为以adCode做key的对象,方便后续根据业务数据进行查找,避免嵌套循环
+                originalGeoObject[item.id] = item;
+            });
+            this.mapData.forEach((dataItem)=>{//根据业务数据,将业务数据包含的行政区划代码对应的geo数据放到数组里以过滤不涉及的行政区划
+                if(originalGeoObject[dataItem.adCode.substr(0,6)]){
+                    usedGeoJson.push(originalGeoObject[dataItem.adCode.substr(0,6)]);
+                }
+            });
+            console.log(usedGeoJson)
+            let _self = this;
+            usedGeoJson.forEach(item=>{//在挑选完需要保留的geo数据后,将中间点取出单独存储,供散点图使用。防止过度嵌套的for循环影像效率。
+                self.addvCenters[item.properties.name] = item.properties.cp;
+            });
+            // originalGeoJson.features = usedGeoJson;//将处理过后的features赋回原有对象,保持对象格式,便于echarts引用
+            // 2019.06.19 因为政治问题保留全部数据
+            return originalGeoJson;
+        },
+
+        convertData:function() {//制作散点数据。
+            const res = [];
+            let _self = this;
+            let mapSeriesData = this.mapData;
+            for (let i = 0; i < mapSeriesData.length; i++) {
+                const geoCoord = self.addvCenters[mapSeriesData[i].name];
+                if (geoCoord) {
+                    res.push({
+                        name: mapSeriesData[i].name,
+                        value: geoCoord.concat(Number(mapSeriesData[i].total)),
+                    });
+                }
+            }
+            return res;
+        },
+        getChartSeriesData:function(){
+            let seriesData =this.convertData();
+            console.log(seriesData);
+            return seriesData;
+            
+        },
+        getChartOption:function(){
+            console.log(this.mapData);
+            let _this = this
+            let seriesData = this.getChartSeriesData();
+            let option = {
+                            title: {
+                                    text: this.mapTitleFocusName + '数量分布情况',
+                                    // subtext: '督查机构:',
+                                    left: 'center',
+                                    textStyle: {
+                                        color: this.themeColor
+                                    }
+                                },
+                            tooltip: {
+                                show: false,
+                                },
+                            geo: {
+                                    itemStyle: {
+                                        normal: {
+                                            borderColor: this.mapBorderColor,
+                                            borderWidth: 1,
+                                        },
+                                        
+                                    },
+                                    show: true,
+                                    map: this.mapName,
+                                    label: {
+                                        normal: {
+                                            show: false
+                                        },
+                                        emphasis: {
+                                            show: false,
+                                        }
+                                    },
+                                    top: "80",
+                                    bottom: "30",
+                                    roam: true,
+                                    zoom: 1.2, 
+                                },
+                            visualMap: {
+                                    show: false,
+                                    min: 0,
+                                    max: 800,
+                                    left: 'left',
+                                    top: 'bottom',
+                                    text: ['高', '低'],
+                                    textStyle: {
+                                        color: '#ccc'
+                                    },
+                                    calculable: true,
+                                    seriesIndex: [1],
+                                    inRange: {
+                                        // color:['rgb(186,231,248)','rgb(92,168,222)']
+                                        color:this.themeColorMap
+                                    }
+                                },
+                            series: [
+                                        {
+                                            left:'20%',
+                                            tooltip: {
+                                                show:true,
+                                                formatter:function (params) { return params.name + ': ' + params.value[2] + ' ' + self.barsChooseUnit },
+                                            },
+                                            type: 'scatter',
+                                            coordinateSystem: 'geo',
+                                            symbol: 'pin', //气泡
+                                            symbolSize:this.symbolSize,
+                                            data:seriesData,
+                                            label: {
+                                                normal: {
+                                                    show: true,
+                                                    formatter:function (params) { return params.value[2] },
+                                                    textStyle: {
+                                                        fontSize: 12,
+                                                    }
+                                                },
+                                                emphasis: {
+                                                    show: false
+                                                }
+                                            },
+                                            itemStyle: {
+                                                normal: {
+                                                    color:this.mapPointColor,
+                                                    borderColor: '#fff',
+                                                    borderWidth: 1,
+                                                    borderType: 'solid',
+                                                }
+                                            }
+                                        },
+                                        {
+                                            type: 'map',
+                                            map: this.mapName,
+                                            geoIndex: 0,
+                                            aspectScale: 0.75, //长宽比
+                                            showLegendSymbol: false, // 存在legend时显示
+                                            label: {
+                                                show: false
+                                            },
+                                            roam: true,
+                                            animation: false,
+                                            data: seriesData
+                                        },
+                                ]
+                          };
+                          return option;
+        },
+        refreshTheChart:async function(){
+            // 准备工作
+            let _self = this;
+            let myChart = echarts.init(document.getElementById('mapChart'));
+
+            // 处理地图数据
+            let geoAdcode = this.organCode.substr(0,6)  //省级切换时获取不同的行政区代码
+            let geoJsonResult = await this.getAddvGeoData(geoAdcode);// 根据行政区划代码请求地图geoJson
+            let geoJson = self.getTheCustomGeoDataByOrg(geoJsonResult.data,'');//根据可能的所选机构处理摘出需要的行政区数据
+            echarts.registerMap(this.mapName, geoJson);//向echart注册地图
+
+            // 获取option
+            let option = self.getChartOption();
+            
+            myChart.setOption(option,true);
+            if(this.firstToOn){
+                myChart.on('click',function(params){//注册地图点击事件,上冒
+                    if(params.componentSubType&&params.componentSubType == 'scatter'){
+                        //点击的为标记 应当出弹框
+                        // let 
+                    }else if(params.componentSubType&&params.componentSubType == 'map'){
+                        //点击的为底图 应当下钻
+                        let adName = params.name;
+                        self.mapData.forEach((dataItem)=>{
+                            if(dataItem.name == adName){
+                                //确定点击行政区
+                                self.$emit('mapClick',{'onClickAdCode':dataItem.adCode,'onClickAdName':dataItem.name});
+                            }
+                        });
+                    }
+                });
+                this.firstToOn = false;
+            }
+           
+        },
+        getAddvGeoData:function(adCode){
+            let   geoJsonName = adCode+"DATA.json";
+            return axios.get('/src/assets/addvGeoData/'+geoJsonName);
+        },
+    },
+    //生命周期 - 创建完成(可以访问当前this实例)
+    created() {
+
+    },
+    //生命周期 - 挂载完成(可以访问DOM元素)
+    mounted() {
+        // this.refreshTheChart();
+    },
+    beforeCreate() {}, //生命周期 - 创建之前
+    beforeMount() {}, //生命周期 - 挂载之前
+    beforeUpdate() {}, //生命周期 - 更新之前
+    updated() {}, //生命周期 - 更新之后
+    beforeDestroy() {}, //生命周期 - 销毁之前
+    destroyed() {}, //生命周期 - 销毁完成
+    activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
+}
+</script>
+<style scoped>
+
+</style>

+ 97 - 0
src/views/home/MultiSelect.vue

@@ -0,0 +1,97 @@
+<!--  -->
+<template>
+    <div>
+        <el-select class="mySelect" :style="{'width':selectWidth+'vw'}" size="mini" v-model="orgLists" multiple collapse-tags placeholder="全部督查机构" @change="selectOrg()">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+    </div>
+</template>
+
+<script>
+//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》 from '《组件路径》';
+
+export default {
+    //import引入的组件需要注入到对象中才能使用
+    components: {},
+    data() {
+    //这里存放数据
+        return {
+            // selectWidth:13,
+            options: [
+                        {
+                            value: "020",
+                            label: "长委"
+                        },
+                        {
+                            value: "021",
+                            label: "黄委"
+                        },
+                        {
+                            value: "022",
+                            label: "淮委"
+                        },
+                        {
+                            value: "023",
+                            label: "海委"
+                        },
+                        {
+                            value: "024",
+                            label: "珠江委"
+                        },
+                        {
+                            value: "025",
+                            label: "松辽委"
+                        },
+                        {
+                            value: "026",   
+                            label: "太湖局" 
+                        },
+                    ],
+            orgLists: []
+        };
+    },
+    //监听属性 类似于data概念
+    computed: {
+        selectWidth(){
+            if(innerWidth <= 960){
+                return 15;
+            }else{
+                return 12;
+            }
+        }
+    },
+    //监控data中的数据变化
+    watch: {},
+    //方法集合
+    methods: {
+        selectOrg(){
+            this.$emit('OrgLists',this.orgLists);
+        }
+    },
+    //生命周期 - 创建完成(可以访问当前this实例)
+    created() {
+
+    },
+    //生命周期 - 挂载完成(可以访问DOM元素)
+    mounted() {
+        
+    },
+    beforeCreate() {}, //生命周期 - 创建之前
+    beforeMount() {}, //生命周期 - 挂载之前
+    beforeUpdate() {}, //生命周期 - 更新之前
+    updated() {}, //生命周期 - 更新之后
+    beforeDestroy() {}, //生命周期 - 销毁之前
+    destroyed() {}, //生命周期 - 销毁完成
+    activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
+}
+</script>
+<style type="text/css">
+/* 浅色input */
+	
+</style>

+ 104 - 0
src/views/home/Notices.vue

@@ -0,0 +1,104 @@
+<template>
+  <div>
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">公告</div>
+    </div>
+    <div class="notice-content">
+      <ul>
+        <li v-for="(item, index) in noticesList" :key="index">
+          <a href="javascript:void(0)" @click.prevent="clickHandler(item)">{{ item.title }}</a>
+          <span>{{ showStrDate(item.pubTm) }}</span>
+        </li>
+      </ul>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/gw_ajax_request'
+import { dateFormat } from '@/utils/gw_date'
+
+export default {
+  name: 'Notices',
+  emits: ['showAnnouncement'],
+  data() {
+    return { noticesList: [] }
+  },
+  methods: {
+    showStrDate(pubTm) {
+      const d = new Date(pubTm)
+      return dateFormat(d, 'yyyy-MM-dd')
+    },
+    clickHandler(item) {
+      if (item.url) {
+        window.open('http://' + item.url)
+      } else {
+        this.$emit('showAnnouncement', { announcement: { item } })
+      }
+    },
+    getAnnouncement() {
+      request({
+        url: 'gw/ntc/annsmnt/getNtsAnnsmmts',
+        method: 'POST',
+        params: { pageNum: 1, pageSize: 10, count: false },
+      }).then((response) => {
+        this.noticesList = response.data.list || response.data
+      }).catch((err) => {
+        console.log(err)
+      })
+    },
+  },
+  mounted() {
+    this.getAnnouncement()
+  },
+}
+</script>
+
+<style scoped>
+.simple_header {
+  height: 3.7vh;
+  display: flex;
+  align-items: center;
+}
+.simple_header_icon {
+  background-color: rgba(46, 101, 253, 1);
+  width: 4px;
+  height: 2vh;
+  border-radius: 4px;
+  margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1);
+  font-size: 14px;
+  font-weight: bold;
+}
+.notice-content {
+  font-size: 12px;
+  color: #606266;
+  max-height: 19.5vh;
+  overflow-y: auto;
+  width: 100%;
+}
+.notice-content ul {
+  margin: 0;
+  padding: 0 10px;
+}
+.notice-content li {
+  margin: 0;
+  height: 3vh;
+  line-height: 3vh;
+  list-style: none;
+  border-bottom: 1px solid rgba(109, 118, 236, 0.2);
+}
+.notice-content a {
+  color: #606266;
+  text-decoration: none;
+}
+.notice-content a:hover {
+  color: #51afea;
+}
+.notice-content span {
+  float: right;
+}
+</style>

+ 53 - 0
src/views/home/ProblemPieChart.vue

@@ -0,0 +1,53 @@
+<template>
+  <div>
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">问题分布</div>
+    </div>
+    <div class="body">
+      <div class="level-item">
+        <span class="dot l1" />
+        <span class="label">一般</span>
+        <span class="count">{{ levelone }}</span>
+      </div>
+      <div class="level-item">
+        <span class="dot l2" />
+        <span class="label">较重</span>
+        <span class="count">{{ leveltwo }}</span>
+      </div>
+      <div class="level-item">
+        <span class="dot l3" />
+        <span class="label">严重</span>
+        <span class="count">{{ levelthree }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ProblemPieChart',
+  props: { levelone: { type: Number, default: 0 }, leveltwo: { type: Number, default: 0 }, levelthree: { type: Number, default: 0 }, levelfour: { type: Number, default: 0 } },
+}
+</script>
+
+<style scoped>
+.simple_header {
+  height: 3.7vh; display: flex; align-items: center; padding: 0 10px;
+}
+.simple_header_icon {
+  background: rgba(46, 101, 253, 1); width: 4px; height: 2vh;
+  border-radius: 4px; margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1); font-size: 14px; font-weight: bold;
+}
+.body { padding: 10px; }
+.level-item { display: flex; align-items: center; margin-bottom: 12px; }
+.dot { width: 10px; height: 10px; border-radius: 50%; margin-right: 8px; display: inline-block; }
+.l1 { background: #5bb7e7; }
+.l2 { background: #d9cd1a; }
+.l3 { background: #ff9599; }
+.label { font-size: 14px; color: rgba(86,108,146,1); flex: 1; }
+.count { font-size: 18px; font-weight: bold; color: rgba(49,63,102,1); }
+</style>

+ 2 - 0
src/views/home/PublicMore.vue

@@ -0,0 +1,2 @@
+<template><div>更多舆情信息</div></template>
+<script>export default { name: 'PublicMore' }</script>

+ 323 - 0
src/views/home/PublicSentiment.vue

@@ -0,0 +1,323 @@
+<!--  -->
+<template>
+    <div>
+        <div class="simple_header">
+            <div class="simple_header_icon"></div>
+            <div class="simple_header_text">舆情</div>
+<!--			<div class="simple_header_text" style="float:right;margin-right:.5vw;">-->
+<!--				<el-button type="text" icon="el-icon-d-arrow-right" @click="showMore()">更多</el-button>-->
+<!--			</div>-->
+        </div>
+        <div class="left_PublicSentiment_content" id="left_PublicSentiment_content">
+<!--			<el-radio-group  class="myRadio" v-model="activeName2" size="mini" style="margin: 0px;width: 96%;overflow-x: auto;display: flex;padding: .5vh .4vw;text-align: center;">-->
+<!--				<el-radio-button label="0"   style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">新闻</el-radio-button>-->
+<!--				<el-radio-button label="1"    style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">论坛</el-radio-button>-->
+<!--				<el-radio-button label="2"    style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">博客</el-radio-button>-->
+<!--				<el-radio-button label="3"  style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">微博</el-radio-button>-->
+<!--				<el-radio-button v-if="radioForPad" label="4"  style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">app</el-radio-button>-->
+<!--				<el-radio-button label="5"    style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">微信</el-radio-button>-->
+<!--				<el-radio-button v-if="radioForPad" label="6"    style=" background-color: rgba(0,0,0,0) !important;font-size:x-large !important;">电子报</el-radio-button>-->
+<!--			</el-radio-group>-->
+            <div style="width: 100%;height: 77%;" id="building">
+                <el-table :show-header="false" style="padding: 0 .4vw;border: none;cursor: pointer;" class="myTable"  :data="tableList"  :height="pubListHeight"  @row-click="openTrsDetails" >
+                    <el-table-column prop="IR_URLTITLE" label="标题" min-width="120"  show-overflow-tooltip></el-table-column>
+<!--					<el-table-column v-if="tableMiddle" prop="IR_SITENAME" label="来源" width="70"  show-overflow-tooltip></el-table-column>-->
+                    <el-table-column prop="IR_URLTIME1" label="发布时间" width="100"  show-overflow-tooltip></el-table-column>
+                </el-table>
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page="page"
+          background
+          style="padding: 10px 20px"
+          :page-size="limit"
+          layout="total, prev, pager, next"
+          :total="total">
+        </el-pagination>
+                <!-- <div class="block" style="display:flex;flex-direction:row;justify-content:center;align-items:center;padding-top: 5px;">
+                    <el-pagination class="myPagination"
+                        small
+                        @current-change="handleCurrentChange"
+                        :pager-count="5"
+                        :current-page.sync="pageIndex"
+                        :page-size="pageSize"
+                        layout="prev, pager, next"
+                        :total="allcount">
+                    </el-pagination>
+                </div> -->
+            </div>
+        </div>
+        <el-dialog title="舆情" v-model:visible="publicDialog" :close-on-click-modal="false" width="60%">
+            <PublicMore v-if="publicDialog"></PublicMore>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》 from '《组件路径》';
+import { dateFormat } from '@/utils/gw_date'
+import PublicMore from './PublicMore'
+import axios from 'axios'
+// import theme from '../../store/theme'
+export default {
+  //import引入的组件需要注入到对象中才能使用
+    components: {
+        PublicMore
+    },
+    data() {
+        //这里存放数据
+        return {
+            radioForPad:true,
+            activeName2:'0',
+            tableResultData:[
+        {
+          IR_URLTITLE:'水利部来我省开展质量监督履职情况巡查及水利监督体系建设工作调研',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/9/28/art_27165_4160249.html',
+          IR_URLTIME1:'2022-09-28'
+        },
+        {
+          IR_URLTITLE:'江西省顺利完成水利部水资源管理和节约用水监督检查',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/9/14/art_27165_4141098.html',
+          IR_URLTIME1:'2022-09-14'
+        },
+        {
+          IR_URLTITLE:'胡春华在江西督导农业抗旱保丰收工作',
+          IR_URLNAME:'http://www.pearlwater.gov.cn/xwzxcs/szywcs/202208/t20220830_116292.html',
+          IR_URLTIME1:'2022-08-30'
+        },
+        {
+          IR_URLTITLE:'水利部水库移民司来我省复核有关整改落实情况',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/8/23/art_27165_4118253.html',
+          IR_URLTIME1:'2022-08-23'
+        },
+        {
+          IR_URLTITLE:'长江委来赣调研指导长江经济带涉及水域岸线生态环境突出问题整改工作',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/7/25/art_27165_4078725.html',
+          IR_URLTIME1:'2022-07-25'
+        },
+        {
+          IR_URLTITLE:'水利部调研指导我省水库移民监督管理工作',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/7/4/art_27165_4017040.html',
+          IR_URLTIME1:'2022-07-04'
+        },
+        {
+          IR_URLTITLE:'省长叶建春一眼就看出水利工程存在安全隐患,现场要求整改',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/6/11/art_27165_3991100.html',
+          IR_URLTIME1:'2022-06-11'
+        },
+        {
+          IR_URLTITLE:'江西省水利厅举办水利监督技术视频培训班',
+          IR_URLNAME:'http://www.mwr.gov.cn/xw/dfss/202206/t20220610_1578269.html',
+          IR_URLTIME1:'2022-06-10'
+        },
+        {
+          IR_URLTITLE:'省水利厅举办水利监督技术视频培训班',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/6/9/art_27165_3989125.html',
+          IR_URLTIME1:'2022-06-09'
+        },
+        {
+          IR_URLTITLE:'省委书记易炼红深入九江督导调研防汛工作',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/6/9/art_27165_3989049.html',
+          IR_URLTIME1:'2022-06-09'
+        },
+        {
+          IR_URLTITLE:'江西在水利部水利监督工作会上作交流发言',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2022/1/19/art_27165_3839008.html',
+          IR_URLTIME1:'2022-01-19'
+        },
+        {
+          IR_URLTITLE:'省水利厅召开中央环保督察水电站问题整改工作视频调度会',
+          IR_URLNAME:'http://slt.jiangxi.gov.cn/art/2021/12/14/art_27165_3785354.html',
+          IR_URLTIME1:'2021-12-14'
+        }
+      ],
+      page:1,
+      limit:10,
+      total:12,
+      tableList:[],
+            loading:true,
+            pageIndex:1,
+            // pageSize:12,
+            allcount:0,
+            // pubListHeight:window.innerHeight * 0.38,
+            pubListWidth:0,
+            tableClass:'myTable',
+            publicDialog:false
+        };
+    },
+    //监听属性 类似于data概念
+    computed: {
+        pubListHeight(){
+            if(window.innerWidth >= 1920){
+                return window.innerHeight * 0.4;
+            }else{
+                return window.innerHeight * 0.35;
+            }
+        },
+        pageSize(){
+            if(window.innerWidth >= 1920){
+                return 12;
+            }else{
+                return 7;
+            }
+        },
+        tableMiddle(){
+            if(window.innerWidth >= 1920){
+                return true;
+            }else{
+                return false;
+            }
+        },
+        msg(){
+            return this.$store?.state?.theme?.testMsg || 'light';
+        },
+    },
+    //监控data中的数据变化
+    watch: {
+        activeName2:function(n,o){
+            this.loading = true;
+            this.getTrsDataList();
+        },
+        msg(n,o){
+            if( n == 'dark' ){
+                this.tableClass = 'myTable_dark';
+            }else{
+                this.tableClass = 'myTable';
+            }
+        },
+    },
+    //生命周期 - 创建完成(可以访问当前this实例)
+    created() {},
+    //生命周期 - 挂载完成(可以访问DOM元素)
+    mounted() {
+        this.page = 1;
+        this.pageList();
+        // let h = document.getElementById('left_PublicSentiment_content').offsetHeight;
+        // this.pubListHeight = h - 85;
+        // console.log('pubListHeight'+this.pubListHeight);
+        // this.getTrsDataList();
+        if(window.innerWidth <= 1024){
+            this.radioForPad = false;
+        }else{
+            this.radioForPad = true;
+        }
+    },
+    beforeCreate() {}, //生命周期 - 创建之前
+    beforeMount() {}, //生命周期 - 挂载之前
+    beforeUpdate() {}, //生命周期 - 更新之前
+    updated() {}, //生命周期 - 更新之后
+    beforeDestroy() {}, //生命周期 - 销毁之前
+    destroyed() {}, //生命周期 - 销毁完成
+    activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
+    //方法集合
+    methods: {
+    //处理切换页码
+    // handleSizeChange(val) {
+    //     console.log(`每页 ${val} 条`);
+    //     this.limit = val;
+    //     this.pageList();
+    // },
+    handleCurrentChange(val) {
+        console.log(`当前页: ${val}`);
+        this.page = val;
+        this.pageList();
+    },
+    pageList() {
+        this.tableList = this.tableResultData.filter(
+            (item, index) =>
+                index < this.page * this.limit &&
+                index >= this.limit * (this.page - 1)
+        );
+        this.total = this.tableResultData.length;
+    },
+        showMore(){
+            this.publicDialog = true;
+        },
+        getTrsDataList(){
+            const self = this;
+            let endTime = dateFormat(new Date(),'yyyy-MM-dd hh:mm:ss');
+            let startTime = dateFormat(new Date().getTime() - 7*24*60*60*1000,'yyyy-MM-dd hh:mm:ss');
+            axios.get("/trs/om/cus",{params:{
+                'id':'9069e11e',
+                'key':'2515505d',
+                'sid':'63',
+                'pageNo':self.pageIndex,
+                'pageSize':self.pageSize,
+                'tid':self.activeName2,
+                'startDate':startTime,
+                'endDate':endTime,
+            }}).then((res)=>{
+                self.loading = false;
+                res.data.resultData.dataList.forEach((item)=>{
+                    item['IR_URLTIME1'] = item.IR_URLTIME.substring(0,10);
+                })
+                self.tableResultData = res.data.resultData.dataList;
+                self.allcount = res.data.resultData.databasic.allcount;
+            })
+            // request({
+            //     url:"/trs/om/cus?id=9069e11e&key=2515505d&sid=57&pageNo="+_self.pageIndex+"&pageSize="+_self.pageSize+
+            //         "&tid="+_self.activeName2+"&startDate="+startTime+"&endDate="+endTime,
+            //     method:'get',
+            //     responseType:'json',
+            //     params:''
+            // }).then((res)=>{
+            //     var results = res.data;
+            //     _self.loading = false;
+            //     res.data.resultData.dataList.forEach((item)=>{
+            //         item['IR_URLTIME1'] = item.IR_URLTIME.substring(0,10);
+            //     })
+            //     _self.tableResultData = res.data.resultData.dataList;
+            //     _self.allcount = res.data.resultData.databasic.allcount;
+            // });
+        },
+        // handleCurrentChange(val) {
+    //         console.log(`当前页: ${val}`);
+    //         this.loading = true;
+    //         this.getTrsDataList();
+        // },
+        openTrsDetails(row, event, column) {
+            if(row.IR_URLNAME){
+                window.open(row.IR_URLNAME);
+            }
+        },
+    },
+};
+</script>
+<style scoped>
+/* 透明表格样式 */
+#building .el-table::before { background: none !important; }
+.myTable ::-webkit-scrollbar-thumb { background-color: #cdcdcd; border-radius: 10px; }
+.myTable ::-webkit-scrollbar-corner { background-color: transparent !important; }
+.myTable ::-webkit-scrollbar-track { background-color: transparent !important; }
+.myTable ::-webkit-scrollbar-track-piece { background-color: transparent !important; }
+.myTable::before { background-color: none !important; }
+.myTable .el-table--border td { padding: 0; }
+.myTable tr.el-table__row { background-color: transparent !important; }
+.myTable td { border-bottom: 1px solid rgba(109, 118, 236, 0.2); padding: 4px 0; }
+.myTable, .el-table__expanded-cell { background-color: transparent; }
+.myTable .el-table__header th, .el-table__header tr {
+  padding: 2px 0;
+  background: rgba(176, 230, 255, 1) !important;
+  color: rgba(49, 63, 102, 1);
+}
+#building .el-table--enable-row-hover .el-table__body tr:hover > td { background-color: #e4e4e4; }
+/* Radio 样式 */
+.myRadio .el-radio-button__orig-radio:checked + .el-radio-button__inner { padding: .8vh .5vw; background-color: #409EFF; }
+.myRadio .el-radio-button--mini .el-radio-button__inner { padding: .8vh .38vw; font-size: 12px; }
+.myRadio .el-radio-button__inner { border: 1px solid #409EFF; border-left: none; color: #409EFF; }
+.myRadio .el-radio { margin-right: 1vw; }
+.myRadio .el-radio__label { font-size: 12px; }
+.myRadio .el-radio__inner { width: 12px; height: 12px; }
+.myRadio .el-radio-button--mini .el-radio-button__inner { background-color: transparent; }
+/* 暗色主题 */
+[data-theme="dark"] .myTable tr.el-table__row { color: rgba(177, 210, 254, 1); }
+[data-theme="dark"] .myTable .el-table__header th, [data-theme="dark"] .el-table__header tr {
+  background: rgba(37, 68, 159, 1) !important; color: rgba(255, 255, 255, 1) !important; border-bottom: none;
+}
+[data-theme="dark"] .myTable ::-webkit-scrollbar-thumb { background-color: rgba(70, 74, 115, 1); }
+[data-theme="dark"] #building .el-table--enable-row-hover .el-table__body tr:hover > td { background-color: #25449f; }
+[data-theme="dark"] .myTable tr.el-table__row { background-color: rgba(38, 44, 97, 1) !important; }
+[data-theme="dark"] .myPagination .el-pager li { color: rgba(177, 210, 254, 1); }
+[data-theme="dark"] .myPagination .btn-next, [data-theme="dark"] .myPagination .btn-prev { color: rgba(177, 210, 254, 1); }
+[data-theme="dark"] .myPagination button:disabled { color: rgba(177, 210, 254, 1); }
+</style>

+ 91 - 0
src/views/home/QuestionCount.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="question-count">
+    <div class="header">
+      <div class="header_text">问题</div>
+    </div>
+    <div class="content">
+      <div class="qc-item" @click="changeTimeLimit('day')">
+        <div class="top_text">日</div>
+        <div class="bottom_text">
+          <span class="num">{{ qustionsCountNums?.day || 0 }}</span>
+          <span class="unit">个</span>
+        </div>
+      </div>
+      <div class="divider" />
+      <div class="qc-item" @click="changeTimeLimit('week')">
+        <div class="top_text">周</div>
+        <div class="bottom_text">
+          <span class="num">{{ qustionsCountNums?.week || 0 }}</span>
+          <span class="unit">个</span>
+        </div>
+      </div>
+      <div class="divider" />
+      <div class="qc-item" @click="changeTimeLimit('month')">
+        <div class="top_text">月</div>
+        <div class="bottom_text">
+          <span class="num">{{ qustionsCountNums?.month || 0 }}</span>
+          <span class="unit">个</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'QuestionCount',
+  props: { qustionsCountNums: { type: [Object, Number], default: () => ({}) } },
+  emits: ['rightQustionTimeLimit'],
+  methods: {
+    changeTimeLimit(item) {
+      this.$emit('rightQustionTimeLimit', item)
+    },
+  },
+  mounted() {
+    this.$emit('rightQustionTimeLimit', 'day')
+  },
+}
+</script>
+
+<style scoped>
+.question-count { height: 100%; }
+.header {
+  height: 3.7vh;
+  background: linear-gradient(90deg, #2B6EFD, #5B8CFF);
+  display: flex;
+  align-items: center;
+  padding: 0 10px;
+}
+.header_text { color: #fff; font-size: 14px; font-weight: bold; }
+.content {
+  display: flex;
+  align-items: center;
+  height: calc(100% - 3.7vh);
+}
+.qc-item {
+  flex: 1;
+  text-align: center;
+  cursor: pointer;
+  transition: background 0.2s;
+  padding: 6px 0;
+}
+.qc-item:hover { background: rgba(43, 110, 253, 0.05); }
+.top_text {
+  font-size: 14px;
+  color: rgba(86, 108, 146, 0.8);
+  font-weight: bold;
+  margin-bottom: 4px;
+}
+.bottom_text { line-height: 1; }
+.num {
+  font-size: 20px;
+  color: rgba(254, 178, 58, 1);
+  font-weight: bold;
+}
+.unit { font-size: 12px; color: rgba(86, 108, 146, 1); }
+.divider {
+  width: 1px;
+  height: 3vh;
+  background: rgb(224, 224, 224);
+}
+</style>

+ 117 - 0
src/views/home/QuestionLineChart.vue

@@ -0,0 +1,117 @@
+<template>
+  <div style="height:100%;">
+    <div class="simple_header">
+      <div class="simple_header_icon" />
+      <div class="simple_header_text">问题趋势</div>
+      <div class="simple_header_control">
+        <a-radio-group v-model:value="radio" size="small" @change="changeLine">
+          <a-radio value="inc">增量</a-radio>
+          <a-radio value="total">累计</a-radio>
+        </a-radio-group>
+      </div>
+    </div>
+    <div ref="chartRef" class="chart-body" />
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts'
+
+export default {
+  name: 'QuestionLineChart',
+  props: {
+    GlobalSttmTime: String, GlobalEntmTime: String,
+    xData: { type: Array, default: () => [] },
+    yData: { type: Array, default: () => [] },
+  },
+  emits: ['trendLineChartType'],
+  data() {
+    return {
+      radio: 'inc',
+      chartType: 'bar',
+      chart: null,
+      defaultXData: ['24日', '25日', '26日', '27日', '28日', '29日', '30日'],
+      defaultYData: [12, 8, 15, 6, 20, 10, 18],
+    }
+  },
+  computed: {
+    chartXData() { return this.xData.length ? this.xData : this.defaultXData },
+    chartYData() { return this.yData.length ? this.yData : this.defaultYData },
+  },
+  watch: {
+    xData() { this.renderChart() },
+    yData() { this.renderChart() },
+  },
+  methods: {
+    changeLine() {
+      this.chartType = this.radio === 'inc' ? 'bar' : 'line'
+      this.$emit('trendLineChartType', this.radio)
+      this.renderChart()
+    },
+    renderChart() {
+      if (!this.$refs.chartRef) return
+      if (!this.chart) {
+        this.chart = echarts.init(this.$refs.chartRef)
+      }
+      const option = {
+        grid: { top: '10%', bottom: '10%', left: '5%', right: '10%', containLabel: true },
+        tooltip: {
+          trigger: 'axis',
+          formatter(params) { return params[0].axisValue + ': ' + params[0].data + '个' }
+        },
+        xAxis: {
+          type: 'category', data: this.chartXData,
+          axisLabel: { color: 'rgba(80,105,122,1)' },
+          axisLine: { lineStyle: { color: 'rgba(63,158,255,1)' } },
+          axisTick: { show: false, alignWithLabel: true },
+          splitLine: { show: false },
+        },
+        yAxis: {
+          type: 'value',
+          axisLabel: { color: 'rgba(80,105,122,1)' },
+          axisLine: { lineStyle: { color: 'rgba(63,158,255,1)' } },
+          axisTick: { show: false },
+          splitLine: { lineStyle: { type: 'dashed', color: 'rgba(33,148,246,0.2)' } },
+        },
+        series: [{
+          type: this.chartType,
+          data: this.chartYData,
+          barMaxWidth: '50%',
+          symbol: 'emptyCircle',
+          symbolSize: 7,
+          lineStyle: { color: 'rgba(124,129,255,1)', width: 2 },
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+              { offset: 0, color: 'rgba(122,189,250,1)' },
+              { offset: 1, color: 'rgba(101,142,253,1)' },
+            ]),
+            borderRadius: [5, 5, 0, 0],
+          },
+        }],
+      }
+      this.chart.setOption(option)
+    },
+  },
+  mounted() {
+    this.$nextTick(() => { this.renderChart() })
+  },
+  beforeUnmount() {
+    if (this.chart) { this.chart.dispose() }
+  },
+}
+</script>
+
+<style scoped>
+.simple_header {
+  height: 3.7vh; display: flex; align-items: center; padding: 0 10px;
+}
+.simple_header_icon {
+  background: rgba(46, 101, 253, 1); width: 4px; height: 2vh;
+  border-radius: 4px; margin-right: 8px;
+}
+.simple_header_text {
+  color: rgba(49, 63, 102, 1); font-size: 14px; font-weight: bold;
+}
+.simple_header_control { margin-left: auto; }
+.chart-body { width: 100%; height: calc(100% - 3.7vh); }
+</style>

+ 249 - 0
src/views/home/SupervisedObject.vue

@@ -0,0 +1,249 @@
+<!--  -->
+<template>
+    <div >
+        <div class="superviseObject" :style="'height:' + compHeight +'px'">
+            <!-- <ul>
+               <li class="myTag" v-for="(item,index) in transferUseLists" 
+               :key="index" 
+               @click="changeObjtypeEvent(index,item)">
+                    <el-tag
+                    :disable-transitions="true"
+                    style="width: 100%;"
+                    :type="checkedThis(item) ? '': 'info'">
+                     <template #default="scope">
+                         <span class="childSpan" style="">{{item.name}}</span>
+                         <div style="float:right;">
+                            <span>{{item.total}}</span>
+                            <span>{{barsChooseUnit}}</span>
+                         </div>
+                    </template>
+                    </el-tag>
+                </li>
+            </ul> -->
+            <!-- <ul>
+               <li v-for="(item,index) in transferUseLists" 
+               :key="index" :class="checkedThis(item) ? 'childLi_checked': 'childLi_normal'" 
+               @click="changeObjtypeEvent(index,item)">
+                    <span class="childSpan" style="">{{item.name}}</span>
+                    <div style="float:right;">
+                        <span>{{item.total}}</span>
+                        <span>{{barsChooseUnit}}</span>
+                    </div>
+                </li>
+            </ul> -->
+            <el-collapse accordion class="myCollapse">
+                <el-collapse-item v-for="(item,index) in transferUseLists" :key="index">
+                    <template #title>
+                        <el-row style="width:100%">
+                            <el-col :span="spanNumLeft" style="padding: 0 0 0 10px;"><span class="childSpan" style="">{{item.name}}</span></el-col>
+                            <el-col :span="spanNumRight"> 
+                                <div style="float:right;">
+                                    <span>{{item.total}}</span>
+                                    <span>{{barsChooseUnit}}</span>
+                                </div>
+                            </el-col>
+                        </el-row>
+                    </template>
+                    <li v-for="(itemChild,indexChild) in item.children" 
+                    :key="indexChild" :class="checkedThis(itemChild) ? 'childLi_checked': 'childLi_normal'" 
+                    @click="changeObjtypeEvent(indexChild,itemChild)">
+                        <span class="childSpan" style="margin-left:.8vw">{{itemChild.name}}</span>
+                        <div style="float:right;">
+                            <span>{{itemChild.total}}</span>
+                            <span>{{barsChooseUnit}}</span>
+                        </div>
+                    </li>
+                </el-collapse-item>
+            </el-collapse>
+        </div>
+    </div>
+</template>
+
+<script>
+//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》 from '《组件路径》';
+import {BarsDczNums} from "@/api/homeMainView.js";
+export default {
+    //import引入的组件需要注入到对象中才能使用
+    props:['barsChooseType','barsChooseUnit','transferUseLists','requestEntmTime','requestOrgId','requestObjectType','requestSttmTime'],
+    components: {},
+    data() {
+    //这里存放数据
+        return {
+            tabPosition: 'left',
+            // compHeight:window.innerHeight - 228,
+            checkedLists:"",
+            cheked:true,
+            // spanNumLeft:18,
+            // spanNumRight:6,
+        };
+    },
+    //监听属性 类似于data概念
+    computed: {
+        compHeight(){
+            if(window.screen.height <= 768){
+                return window.innerHeight - 443;
+            }else if(window.screen.height > 1080){
+                return window.innerHeight - 609;
+            }else{
+                return window.innerHeight - 569;
+            }
+        },
+        spanNumLeft(){
+            if(window.innerWidth <= 1366){
+                return 16;
+            }else{
+                return 16;
+            }
+        },
+        spanNumRight(){
+            if(window.innerWidth <= 1366){
+                return 8;
+            }else{
+                return 8;
+            }
+        },
+    },
+    //监控data中的数据变化
+    watch: {
+        barsChooseType(newValue,oldValue){
+            this.barsChooseType = newValue;	
+		},
+        barsChooseUnit(newValue,oldValue){
+            this.barsChooseUnit = newValue;	
+		},
+        transferUseLists(newValue,oldValue){
+                this.transferUseLists = newValue;	
+		}
+    },
+    //方法集合
+    methods: {
+        //初始化请求督查组数据
+        getDczData:function(){
+			let _self = this;
+            let  searchParmas = {
+                endTime: this.requestEntmTime,
+                orgIds: this.requestOrgId,
+                pTypes: this.requestObjectType,
+                startTime: this.requestSttmTime
+            };
+			BarsDczNums(searchParmas).then((res)=>{
+				this.transferUseLists = res.data;
+			});
+		},
+        //li点击处理选中督查对象类型
+        changeObjtypeEvent(index,item){
+            // if(this.checkedLists == ""){                                                                                                                                           
+                this.checkedLists = item.objType;
+            // }else{
+            //     let have = false;
+            //     this.checkedLists.forEach((element,index) => {
+            //         if(element == item.objType ){
+            //             this.checkedLists.splice(index,1);
+            //             have = true;
+            //         }
+            //     });
+            //     if(have == false){
+            //         this.checkedLists.push(item.objType);
+            //     }
+            // }
+            this.$emit('objTypeChangeEvent',this.checkedLists);
+        },
+        //控制li选中样式
+        checkedThis:function(item){
+            let have = false;
+            // this.checkedLists.forEach((element,index) => {
+                if(this.checkedLists == item.objType ){
+                    have = true;
+                }
+            // });
+            return have;
+        }
+    },
+    //生命周期 - 创建完成(可以访问当前this实例)
+    created() {
+
+    },
+    //生命周期 - 挂载完成(可以访问DOM元素)
+    mounted() {
+        // this.getDczData();
+        // alert(window.screen.width);
+        // alert(window.screen.height);
+    },
+    beforeCreate() {}, //生命周期 - 创建之前
+    beforeMount() {}, //生命周期 - 挂载之前
+    beforeUpdate() {}, //生命周期 - 更新之前
+    updated() {}, //生命周期 - 更新之后
+    beforeDestroy() {}, //生命周期 - 销毁之前
+    destroyed() {}, //生命周期 - 销毁完成
+    activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
+}
+</script>
+<style >
+@media  screen and (min-width: 1024px) and (max-width:1920px){
+	
+}
+@media screen and (width: 1920px) {
+  
+  
+}
+//暗色主题浅灰色字体
+//暗色主题透明背景
+//暗色主题 div透明背景
+.childLi_normal{
+    cursor: pointer;
+    margin-top: 0;
+    padding: .5vh .5vw !important;
+    // border-radius: 4px;
+    // border: 1px solid rgba(161,213,255,1);
+    // color: #36A2FC;
+    color: rgba(51, 51, 51, 1);
+    // background:rgba(236,245,255,1);
+    list-style: none;
+    }
+.childLi_checked{
+    cursor: pointer;
+    margin-top: 0;
+    padding: .5vh .5vw !important;
+    // border-radius: 4px;
+    // border: 1px solid rgba(161,213,255,1);
+    // color: #fff;
+    // color: #36A2FC;
+    list-style: none;
+    background:rgba(64,159,255,0.15);
+}
+.myTag .el-tag--mini{
+    background-color: transparent;
+}
+.myTag .el-tag--info{
+    // border: none;
+    color:#313F66;
+    } 
+.myCollapse{
+    background: rgba(242,243,247,1);
+    border: 1px solid #DCDEE3;
+    border-radius: 3px;
+    }
+.myCollapse .el-collapse-item__header{
+    background: transparent;
+    height: 32px;
+    line-height: 32px;
+}
+.myCollapse .el-collapse-item:last-child{
+    margin-bottom: 0px;
+}
+.myCollapse .el-collapse-item__wrap{
+    background: transparent;
+}
+.myCollapse .el-collapse-item__header.is-active{
+    background: #409FFF;
+    color:#fff;
+}
+.myCollapse .el-collapse-item__content{
+    padding-bottom: 10px;
+}
+// 
+</style>
+<style>
+    
+</style>

+ 48 - 0
src/views/home/Systemstatus.vue

@@ -0,0 +1,48 @@
+<template>
+  <div class="system-status">
+    <div class="status-card status-left">
+      <div class="status-icon">
+        <span class="icon-text">&#x1f465;</span>
+      </div>
+      <div class="status-text">
+        <div class="status-label">当前在线</div>
+        <div class="status-value">{{ usersNum }} <small>人</small></div>
+      </div>
+    </div>
+    <div class="status-card status-right">
+      <div class="status-icon">
+        <span class="icon-text">&#x1f3e2;</span>
+      </div>
+      <div class="status-text">
+        <div class="status-label">当前活动组</div>
+        <div class="status-value">{{ grounpNum }} <small>组</small></div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Systemstatus',
+  props: { usersNum: { type: Number, default: 0 }, grounpNum: { type: Number, default: 0 } },
+}
+</script>
+
+<style scoped>
+.system-status { overflow: hidden; }
+.status-card {
+  float: left; width: 50%; height: 9.21vh; border-radius: 6px;
+}
+.status-left { background: rgba(105, 176, 255, 1); }
+.status-right { background: rgba(131, 172, 255, 1); }
+.status-icon { width: 40%; height: 100%; float: left; display: flex; align-items: center; justify-content: center; }
+.status-icon .icon-text { font-size: 3vh; }
+.status-icon img { width: 5vh; }
+.status-text {
+  width: 60%; height: 100%; float: left; color: #fff;
+  font-size: 14px; display: flex; flex-direction: column; justify-content: center;
+}
+.status-label { font-size: 14px; }
+.status-value { font-size: 18px; font-weight: bold; }
+.status-value small { font-size: 12px; }
+</style>

+ 754 - 0
src/views/home/homeMainView.vue

@@ -0,0 +1,754 @@
+<!-- 督查首页 -->
+<template>
+  <div class="mainDiv" style="height:100%;" :style="backgroundChangeColor">
+    <!-- 左侧组件 -->
+    <div class="left">
+      <div class="left_user">
+        <Systemstatus
+          :usersNum="usersNum"
+          :grounpNum="grounpNum"
+        />
+      </div>
+      <div  class="left_qusLineChart">
+        <PublicSentiment />
+      </div>
+      <div style="margin-left: 1%;" class="left_notices">
+        <Notices @showAnnouncement="showAnnouncementHandler" />
+      </div>
+    </div>
+
+    <!-- 中部组件 -->
+    <div class="middle">
+      <div class="middle_button">
+        <HomeViewBar
+          @barsType="barTypeChangeHandler"
+          @globalTime="globalTimeHandler"
+          :dczNum="dczStatisticsData.total"
+          :dcyrNum="dcryStatisticsData.total"
+          :dcdxNum="dcdxStatisticsData.total"
+          :fxwtNum="fxwtStatisticsData.total"
+          :jbyywtNum="jbyywtStatisticsData.total"
+        />
+      </div>
+      <div class="middle_map">
+        <CenterMap
+          @globalTime="globalTimeHandler"
+          @OrgListsEventToMainView="OrgListsEventToMainViewEvent"
+          @DctypeListsEventToMainView="DctypeListsEventToMainViewEvent"
+          @mapClick="mapClickHandler"
+          :barsChooseType="barsChooseType"
+          :barsChooseUnit="barsChooseUnit"
+          :dczLists="dczLists"
+          :transferUseLists="transferUseLists"
+          :mapData="GlobalCenterMapUseData"
+          :requestEntmTime="requestEntmTime"
+          :requestOrgId="requestOrgId"
+          :requestObjectType="requestObjectType"
+          :requestSttmTime="requestSttmTime"
+          :mapTitleFocusName="mapTitleFocusName"
+          :mapPointColor="mapPointColor"
+        />
+      </div>
+      <div class="middle_bar">
+        <Centerbar
+          :mapTitleFocusName="mapTitleFocusName"
+          :barData="GlobalCenterMapUseData"
+          :barStartColor="barStartColor"
+          :barEndColor="barEndColor"
+          :barsChooseUnit="barsChooseUnit"
+        />
+      </div>
+    </div>
+
+    <!-- 右侧组件 -->
+    <div class="right">
+      <div class="right_qus">
+        <QuestionCount
+          @rightQustionTimeLimit="rightQustionTimeLimit"
+          :qustionsCountNums="qustionsCountNums"
+        />
+      </div>
+      <div class="right_line">
+        <QuestionLineChart
+          @trendLineChartType="trendLineChartTypeHandler"
+          :GlobalSttmTime="GlobalSttmTime"
+          :GlobalEntmTime="GlobalEntmTime"
+          :xData="xData"
+          :yData="yData"
+        />
+      </div>
+      <div class="right_pie_dcdx">
+        <FinishRate
+          :finishNumber="finishRateData.finishedCount"
+          :unfinishNumber="finishRateData.unfinishedCount"
+        />
+      </div>
+      <div class="right_pie_wtfb">
+        <ProblemPieChart
+          :levelone="problemLevelStatisticsData.levelOne"
+          :leveltwo="problemLevelStatisticsData.levelTwo"
+          :levelthree="problemLevelStatisticsData.levelThree"
+          levelfour="0"
+        />
+      </div>
+    </div>
+
+    <!-- 督查组dialog -->
+    <a-modal :title="dcdxTitle + '督查组'" v-model:open="dczVisible" width="40%">
+      <DczDetails
+        v-if="dczVisible"
+        :adCode="dcdxAdcode"
+        :requestEntmTime="requestEntmTime"
+        :requestOrgId="requestOrgId"
+        :requestSttmTime="requestSttmTime"
+        :requestObjectType="requestObjectType"
+      />
+    </a-modal>
+
+    <!-- 督查人员dialog -->
+    <a-modal :title="dcdxTitle + '督查人员'" v-model:open="dcryVisible" width="40%">
+      <DcryDetails
+        v-if="dcryVisible"
+        :adCode="dcdxAdcode"
+        :requestEntmTime="requestEntmTime"
+        :requestOrgId="requestOrgId"
+        :requestSttmTime="requestSttmTime"
+        :requestObjectType="requestObjectType"
+      />
+    </a-modal>
+
+    <!-- 督查对象dialog -->
+    <a-modal :title="dcdxTitle + '督查对象'" v-model:open="dcdxVisible" width="40%">
+      <DcdxDetails
+        v-if="dcdxVisible"
+        :adCode="dcdxAdcode"
+        :requestEntmTime="requestEntmTime"
+        :requestOrgId="requestOrgId"
+        :requestSttmTime="requestSttmTime"
+        :requestObjectType="requestObjectType"
+      />
+    </a-modal>
+
+    <!-- 发现问题dialog -->
+    <a-modal :title="dcdxTitle + '问题详情'" v-model:open="fxwtVisible" width="40%">
+      <FxwtDetails
+        v-if="fxwtVisible"
+        :adCode="dcdxAdcode"
+        :requestEntmTime="requestEntmTime"
+        :requestOrgId="requestOrgId"
+        :requestSttmTime="requestSttmTime"
+        :requestObjectType="requestObjectType"
+      />
+    </a-modal>
+
+    <!-- 公告dialog -->
+    <a-modal title="公告" v-model:open="showAnnouncement" width="40%">
+      <div style="display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;min-height:200px;">
+        <div style="display:flex;flex-direction:row;justify-content:center;align-items:center">
+          <h1>{{ announcementItem.title }}</h1>
+        </div>
+        <div style="display:flex;flex-direction:row;justify-content:center;align-items:center;color:gray;margin-top:20px;">
+          <p>{{ announcementItem.persNm }}</p>
+          <p style="margin-left:10px;">{{ announcementItem.orgNm }}</p>
+          <p style="margin-left:10px;">{{ showStrDate(announcementItem.pubTm) }}</p>
+        </div>
+        <div v-html="announcementItem.content" class="ql-editor" />
+      </div>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+// 左侧组件
+import Systemstatus from './Systemstatus'
+import Notices from './Notices'
+import PublicSentiment from './PublicSentiment'
+// 中部组件
+import HomeViewBar from './HomeViewBar'
+import CenterMap from './CenterMap'
+import Centerbar from './Centerbar'
+// 右侧组件
+import QuestionCount from './QuestionCount'
+import QuestionLineChart from './QuestionLineChart'
+import FinishRate from './FinishRate'
+import ProblemPieChart from './ProblemPieChart'
+import DcdxDetails from './DcdxDetails'
+import FxwtDetails from './FxwtDetails'
+import DczDetails from './DczDetails'
+import DcryDetails from './DcryDetails'
+// API
+import request from '@/utils/gw_ajax_request'
+import { dateFormat } from '@/utils/gw_date'
+import {
+  BarsDczNums,
+  BarsDcyrNums,
+  BarsDcdxNums,
+  BarsFxwtNums,
+  BarsFxwtReportNums,
+  userAndGroup,
+  getcountPlan,
+  getProblemCountByProAndLevel,
+  getAddvCountGroup,
+  getAddvCountPerson,
+  getAddvCountObject,
+  getAddvCountProblem,
+  getAddvCountProblemForReport,
+  getTrendLineData,
+  getQustionCountData,
+} from '@/api/homeMainView'
+
+export default {
+  name: 'HomeMainView',
+  components: {
+    Systemstatus,
+    QuestionCount,
+    QuestionLineChart,
+    Notices,
+    HomeViewBar,
+    CenterMap,
+    Centerbar,
+    PublicSentiment,
+    FinishRate,
+    ProblemPieChart,
+    DcdxDetails,
+    FxwtDetails,
+    DczDetails,
+    DcryDetails,
+  },
+  data() {
+    return {
+      backgroundChangeColor: 'background: rgba(255, 255, 255,1);',
+      transformScale: 1,
+      showAnnouncement: false,
+      announcementItem: {
+        "id": "c2219c04336a46bd92163bf0463a773e",
+        "type": null,
+        "title": "测试",
+        "content": "<p>测试</p>",
+        "url": null,
+        "note": null,
+        "persId": "89E69B31FE1344A98316A0153BA7386C",
+        "persNm": "王晓辰",
+        "orgId": "041",
+        "orgNm": "北京金水公司",
+        "pubState": "0",
+        "pubTm": null,
+        "intm": 1561363050000,
+        "uptm": 1561363050000
+      },
+      dczStatisticsData: {
+        total: 0,
+        byObjectType: [],
+        byAddv: [],
+      },
+      dcryStatisticsData: {
+        total: 0,
+        byObjectType: [],
+        byAddv: [],
+      },
+      dcdxStatisticsData: {
+        total: 0,
+        byObjectType: [],
+        byAddv: [],
+      },
+      fxwtStatisticsData: {
+        total: 0,
+        byObjectType: [],
+        byAddv: [],
+      },
+      jbyywtStatisticsData: {
+        total: 0,
+        byObjectType: [],
+        byAddv: [],
+      },
+      finishRateData: {
+        total: 0,
+        finishedCount: 0,
+        unfinishedCount: 0,
+      },
+      problemLevelStatisticsData: {
+        levelOne: 0,
+        levelTwo: 0,
+        levelThree: 0,
+        total: 0,
+      },
+      rightTimeLimit: '',
+      qustionsCountNums: '',
+      pblmStateForLine: '',
+      yData: [],
+      xData: [],
+      GlobalSttmTime: '',
+      GlobalEntmTime: '',
+      GlobalOrgIds: [],
+      GlobalObjectType: "",
+      GlobalAdCode: '',
+      GlobalFocusType: 'dcz',
+      mapTitleFocusName: '督查组',
+      mapPointColor: '#13C5A6',
+      barStartColor: '#76E9C0',
+      barEndColor: '#13C4B8',
+      barsChooseUnit: '组',
+      GlobalCenterMapUseData: [],
+      barsChooseType: '',
+      dczLists: [],
+      usersNum: 0,
+      grounpNum: 0,
+      transferUseLists: [],
+      dcdxTitle: '',
+      dcdxVisible: false,
+      dcdxAdcode: '',
+      fxwtTitle: '',
+      fxwtVisible: false,
+      dczVisible: false,
+      dcryVisible: false
+    }
+  },
+  computed: {
+    requestQuote() {
+      if (this.GlobalFocusType == 'jbyywt') {
+        return "1"
+      } else {
+        return ""
+      }
+    },
+    requestAdCode() {
+      if (this.GlobalAdCode) {
+        return this.GlobalAdCode
+      } else {
+        return ''
+      }
+    },
+    requestSttmTime() {
+      if (this.GlobalSttmTime) {
+        return this.GlobalSttmTime
+      } else {
+        return dateFormat(new Date(), 'yyyy-01-01')
+      }
+    },
+    requestEntmTime() {
+      if (this.GlobalEntmTime) {
+        return this.GlobalEntmTime
+      } else {
+        return dateFormat(new Date(), 'yyyy-MM-dd')
+      }
+    },
+    requestOrgId() {
+      if (this.GlobalOrgIds && this.GlobalOrgIds.length > 0) {
+        return this.GlobalOrgIds.join(',')
+      } else {
+        return ''
+      }
+    },
+    requestObjectType() {
+      if (this.GlobalObjectType) {
+        return this.GlobalObjectType
+      } else {
+        return ''
+      }
+    },
+    lineUseSttmTime() {
+      return this.GlobalSttmTime
+    },
+    lineUseEntmTime() {
+      return this.GlobalEntmTime
+    },
+  },
+  watch: {
+    msg(n) {
+      if (n == 'dark') {
+        this.backgroundChangeColor = 'background: linear-gradient(#1C204D, #0F067D);'
+      } else {
+        this.backgroundChangeColor = 'background: rgba(255, 255, 255,1);'
+      }
+      window.document.documentElement.setAttribute('data-theme', n)
+    },
+    rightTimeLimit() {
+      this.rightQustionLine()
+    },
+    pblmStateForLine() {
+      this.rightQustionLine()
+    },
+    requestSttmTime() {
+      this.getDynamicDataRefresh()
+      this.getLeftMap()
+    },
+    requestEntmTime() {
+      this.getDynamicDataRefresh()
+      this.getLeftMap()
+    },
+    requestOrgId() {
+      this.getDynamicDataRefresh()
+      this.getLeftMap()
+      this.rightQustionLine()
+    },
+    requestObjectType() {
+      this.getDynamicDataRefresh()
+      this.getLeftMap()
+      this.rightQustionLine()
+    },
+    GlobalFocusType(newValue) {
+      this.GlobalFocusType = newValue
+      this.getDynamicDataRefresh()
+      this.getLeftMap()
+      this.getAddVcdCountByType()
+    },
+    lineUseSttmTime() {
+      this.rightQustionLine()
+    },
+    lineUseEntmTime() {
+      this.rightQustionLine()
+    },
+  },
+  methods: {
+    showStrDate(pubTm) {
+      const d = new Date(pubTm)
+      return dateFormat(d, 'yyyy-MM-dd')
+    },
+    showAnnouncementHandler(params) {
+      this.showAnnouncement = true
+      this.announcementItem = params.announcement.item
+    },
+    getLeftMap() {
+      const self = this
+      const searchParmas = {
+        endTime: this.requestEntmTime,
+        orgIds: this.requestOrgId,
+        startTime: this.requestSttmTime
+      }
+      const searchParmasForReportqustions = {
+        endTime: this.requestEntmTime,
+        orgIds: this.requestOrgId,
+        startTime: this.requestSttmTime,
+        quote: this.requestQuote,
+      }
+      axios.all([BarsDczNums(searchParmas), BarsDcyrNums(searchParmas), BarsDcdxNums(searchParmas), BarsFxwtNums(searchParmas), BarsFxwtReportNums(searchParmasForReportqustions)]).then(
+        axios.spread(function (dcz, dcry, dcdx, fxwt, jbyywt) {
+          self.dczStatisticsData.byObjectType = dcz.data
+          self.dcryStatisticsData.byObjectType = dcry.data
+          self.dcdxStatisticsData.byObjectType = dcdx.data
+          self.fxwtStatisticsData.byObjectType = fxwt.data
+          self.jbyywtStatisticsData.byObjectType = jbyywt.data
+
+          if (self.GlobalFocusType === 'dcz') {
+            self.transferUseLists = self.dczStatisticsData.byObjectType
+          } else if (self.GlobalFocusType === 'dcry') {
+            self.transferUseLists = self.dcryStatisticsData.byObjectType
+          } else if (self.GlobalFocusType === 'dcdx') {
+            self.transferUseLists = self.dcdxStatisticsData.byObjectType
+          } else if (self.GlobalFocusType === 'fxwt') {
+            self.transferUseLists = self.fxwtStatisticsData.byObjectType
+          } else {
+            self.transferUseLists = self.jbyywtStatisticsData.byObjectType
+          }
+        })
+      )
+    },
+    getBarsDczNum() {
+      const self = this
+      const searchParmas = {
+        endTime: this.requestEntmTime,
+        orgIds: this.requestOrgId,
+        pTypes: this.requestObjectType,
+        startTime: this.requestSttmTime
+      }
+      const searchParmasForReportqustions = {
+        endTime: this.requestEntmTime,
+        orgIds: this.requestOrgId,
+        pTypes: this.requestObjectType,
+        startTime: this.requestSttmTime,
+        quote: '1',
+      }
+
+      axios.all([BarsDczNums(searchParmas), BarsDcyrNums(searchParmas), BarsDcdxNums(searchParmas), BarsFxwtNums(searchParmas), BarsFxwtReportNums(searchParmasForReportqustions)]).then(
+        axios.spread(function (dcz, dcry, dcdx, fxwt, jbyywt) {
+          self.dczStatisticsData.byObjectType = dcz.data
+          self.dcryStatisticsData.byObjectType = dcry.data
+          self.dcdxStatisticsData.byObjectType = dcdx.data
+          self.fxwtStatisticsData.byObjectType = fxwt.data
+          self.jbyywtStatisticsData.byObjectType = jbyywt.data
+
+          self.dczStatisticsData.total = self.countSum(self.dczStatisticsData.byObjectType, 'total')
+          self.dcryStatisticsData.total = self.countSum(self.dcryStatisticsData.byObjectType, 'total')
+          self.dcdxStatisticsData.total = self.countSum(self.dcdxStatisticsData.byObjectType, 'total')
+          self.fxwtStatisticsData.total = self.countSum(self.fxwtStatisticsData.byObjectType, 'total')
+          self.jbyywtStatisticsData.total = self.countSum(self.jbyywtStatisticsData.byObjectType, 'total')
+
+          self.finishRateData.finishedCount = self.dcdxStatisticsData.total
+          self.finishRateData.unfinishedCount = self.dcdxStatisticsData.total - self.finishRateData.total
+        })
+      )
+    },
+    getUsersAndGroup() {
+      userAndGroup({}).then(res => {
+        this.usersNum = res.data.countPers
+        this.grounpNum = res.data.countGroup
+      })
+    },
+    getDynamicDataRefresh() {
+      const self = this
+      function* generatorGetTheData() {
+        self.getHeaderBarsDataAndObjectTypeCount()
+        yield console.log('督查对象总数'); self.getPlanCount()
+        yield console.log('问题严重程度分布'); self.getProblemLevelCount()
+        yield console.log('问题线图'); self.rightQustionLine()
+        yield console.log('问题累计图'); self.rightQustionCount()
+        yield self.getAddVcdCountByType()
+      }
+      const gu = generatorGetTheData()
+      setInterval(function () {
+        gu.next()
+      }, 500)
+    },
+    getAllDataRefresh() {
+      this.getLeftMap()
+      this.getUsersAndGroup()
+      this.getDynamicDataRefresh()
+    },
+    getPlanCount() {
+      const self = this
+      self.finishRateData.total = 0
+      getcountPlan(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+        if (res.data && res.data.length > 0) {
+          let result = 0
+          res.data.forEach((item) => {
+            result += Number(item['total'])
+          })
+          self.finishRateData.total = result
+          self.finishRateData.unfinishedCount = self.finishRateData.total - self.finishRateData.finishedCount
+        }
+      })
+    },
+    getProblemLevelCount() {
+      const self = this
+      self.problemLevelStatisticsData.levelOne = 0
+      self.problemLevelStatisticsData.levelTwo = 0
+      self.problemLevelStatisticsData.levelThree = 0
+      getProblemCountByProAndLevel(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+        if (res.data && res.data.length > 0) {
+          res.data.forEach((item) => {
+            item.pblmDtoList.forEach((inspPblm) => {
+              switch (inspPblm.inspPblmCate) {
+                case '0': self.problemLevelStatisticsData.levelOne += inspPblm.total; break
+                case '1': self.problemLevelStatisticsData.levelTwo += inspPblm.total; break
+                case '2': self.problemLevelStatisticsData.levelThree += inspPblm.total; break
+              }
+            })
+          })
+        }
+      })
+    },
+    getAddVcdCountByType() {
+      const self = this
+      if (this.GlobalFocusType == 'dcz') {
+        getAddvCountGroup(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+          self.dczStatisticsData.byAddv = res.data
+          self.GlobalCenterMapUseData = self.dczStatisticsData.byAddv
+        })
+      } else if (this.GlobalFocusType == 'dcry') {
+        getAddvCountPerson(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+          self.dcryStatisticsData.byAddv = res.data
+          self.GlobalCenterMapUseData = self.dcryStatisticsData.byAddv
+        })
+      } else if (this.GlobalFocusType == 'dcdx') {
+        getAddvCountObject(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+          self.dcdxStatisticsData.byAddv = res.data
+          self.GlobalCenterMapUseData = self.dcdxStatisticsData.byAddv
+        })
+      } else if (this.GlobalFocusType == 'fxwt') {
+        getAddvCountProblem(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime).then((res) => {
+          self.fxwtStatisticsData.byAddv = res.data
+          self.GlobalCenterMapUseData = self.fxwtStatisticsData.byAddv
+        })
+      } else {
+        getAddvCountProblemForReport(this.requestEntmTime, this.requestOrgId, this.requestObjectType, this.requestSttmTime, this.requestQuote).then((res) => {
+          self.jbyywtStatisticsData.byAddv = res.data
+          self.GlobalCenterMapUseData = self.jbyywtStatisticsData.byAddv
+        })
+      }
+    },
+    getHeaderBarsDataAndObjectTypeCount() {
+      this.getBarsDczNum()
+    },
+    getRightLineData() {},
+    barTypeChangeHandler(item) {
+      this.GlobalFocusType = item.id
+      this.barsChooseUnit = item.unit
+      this.mapTitleFocusName = item.spanName
+      this.mapPointColor = item.mapPointColor
+      this.barStartColor = item.barStartColor
+      this.barEndColor = item.barEndColor
+    },
+    globalTimeHandler(item) {
+      this.GlobalSttmTime = item.sttm
+      this.GlobalEntmTime = item.entm
+    },
+    rightQustionTimeLimit(item) {
+      this.rightTimeLimit = item
+    },
+    trendLineChartTypeHandler(item) {
+      this.pblmStateForLine = item
+    },
+    rightQustionLine() {
+      const self = this
+      getTrendLineData('', this.rightTimeLimit, this.requestOrgId, this.pblmStateForLine, this.lineUseSttmTime, this.lineUseEntmTime, this.requestObjectType).then((res) => {
+        const dataList = res.data
+        const exData = []
+        const eyData = []
+        if (this.rightTimeLimit == 'day') {
+          dataList.forEach(element => {
+            exData.push(element.name + '日')
+            eyData.push(element.value)
+          })
+        } else if (this.rightTimeLimit == 'week') {
+          dataList.forEach(element => {
+            exData.push(element.name)
+            eyData.push(element.value)
+          })
+        } else {
+          dataList.forEach(element => {
+            exData.push(element.name + '月')
+            eyData.push(element.value)
+          })
+        }
+        self.xData = exData
+        self.yData = eyData
+      })
+    },
+    rightQustionCount() {
+      getQustionCountData().then((res) => {
+        this.qustionsCountNums = res.data
+      })
+    },
+    OrgListsEventToMainViewEvent(item) {
+      this.GlobalOrgIds = item
+    },
+    DctypeListsEventToMainViewEvent(item) {
+      this.GlobalObjectType = item
+    },
+    countSum(arr, valueNameToSum) {
+      let result = 0
+      if (arr && arr.length > 0) {
+        if (valueNameToSum && valueNameToSum != '') {
+          arr.forEach(item => {
+            result += Number(item[valueNameToSum])
+          })
+        } else {
+          arr.forEach(item => {
+            result += Number(item)
+          })
+        }
+      } else {
+        result = 0
+      }
+      return result
+    },
+    mapClickHandler(params) {
+      this.dcdxAdcode = params.onClickAdCode
+      this.dcdxTitle = params.onClickAdName
+      if (this.GlobalFocusType == 'dcz') {
+        this.dczVisible = true
+      } else if (this.GlobalFocusType == 'dcry') {
+        this.dcryVisible = true
+      } else if (this.GlobalFocusType == 'dcdx') {
+        this.dcdxVisible = true
+      } else {
+        this.fxwtVisible = true
+      }
+    },
+    autoSetScale() {
+      const zoom = (window.innerHeight / 1080).toFixed(3)
+      this.transformScale = `scale(${zoom})`
+      this.width = `${(window.innerWidth * zoom).toFixed(2)}px`
+    }
+  },
+  mounted() {
+    this.getAllDataRefresh()
+    window.document.documentElement.setAttribute('data-theme', this.msg)
+  },
+}
+</script>
+
+<style scoped>
+.mainDiv {
+  height: 100%;
+}
+
+/* 所有div基础样式 */
+.left > div,
+.middle > div,
+.right > div {
+  background: rgba(226,250,255,1);
+  box-shadow: 0px 1px 10px 0px rgba(160, 170, 199, 0.15);
+  border-radius: 2px;
+  margin-top: 5px;
+}
+.left > div:first-child,
+.middle > div:first-child,
+.right > div:first-child {
+  margin-top: 0;
+}
+
+/* 左侧 */
+.left {
+  width: 20%;
+  float: left;
+}
+.left_user {
+  height: 11.1vh;
+}
+.left_qusLineChart {
+  height: 46.62vh;
+}
+.left_notices {
+  height: 25.53vh;
+}
+
+/* 中部 */
+.middle {
+  width: 59.2%;
+  float: left;
+  margin-left: 5px;
+}
+.middle_button {
+  height: 11.1vh;
+}
+.middle_map {
+  height: 53.28vh;
+}
+.middle_map span {
+  font-size: 12px;
+  cursor: pointer;
+}
+.middle_bar {
+  height: 18.87vh;
+}
+
+/* 右侧 */
+.right {
+  width: 20%;
+  float: left;
+  margin-left: 5px;
+}
+.right_qus {
+  height: 11.1vh;
+}
+.right_line {
+  height: 24.42vh;
+}
+.right_pie_dcdx {
+  height: 22.2vh;
+}
+.right_pie_wtfb {
+  height: 24.64vh;
+}
+
+/* 暗色主题 */
+[data-theme="dark"] .left > div,
+[data-theme="dark"] .middle > div,
+[data-theme="dark"] .right > div {
+  background: transparent;
+  box-shadow: none;
+  border: 1px solid rgba(54, 162, 252, 1);
+}
+</style>

+ 1 - 0
src/views/jicha/fenPeiDidian.vue

@@ -342,6 +342,7 @@
 
 <script>
 import { defineAsyncComponent } from 'vue';
+import { PlusOutlined as Plus, EyeOutlined as View, EditOutlined as Edit, DeleteOutlined as Delete } from '@ant-design/icons-vue';
 import request from '@/utils/gw_ajax_request';
 import { dateFormat } from '@/utils/gw_date';
 import { formatterArrayToLabel } from '@/utils/gw_formatter.js';

+ 1 - 2
src/views/jicha/jiHuaGuanLi.vue

@@ -573,7 +573,7 @@
           :before-remove="beforeRemove"
           :on-preview="handlePreview"
           :on-change="changeUpload">
-          <el-icon><Upload /></el-icon>
+          <el-icon></el-icon>
           <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
           <div slot="tip" class="el-upload__tip">只限上传pdf文件</div>
         </el-upload>
@@ -598,7 +598,6 @@ import NewPersXzInfo from './NewPersXzInfo';
 export default {
   name: 'jiChaAnPai',
   components: {
-    Upload,
     NewPersInfo: NewPersInfo,
     NewPersXzInfo: NewPersXzInfo,
     fenPeiDidian: fenPeiDidian,

+ 203 - 0
src/views/zongHeZhanShi/index.vue

@@ -0,0 +1,203 @@
+<template>
+  <div class="zhzs-page" style="height:100%;padding:20px;position:relative;">
+    <div class="toolbar">
+      <div class="toolbar-search">
+        <el-input
+          v-model="searchText"
+          placeholder="请输入内容"
+          class="search-input"
+          @keyup.enter="handleSearch"
+        />
+        <el-button class="search-btn" @click="handleSearch">
+          <el-icon><Search /></el-icon>
+        </el-button>
+      </div>
+      <div class="toolbar-btns">
+        <el-button class="t-btn" text>
+          <el-icon><DataLine /></el-icon>
+          数据表
+        </el-button>
+        <el-dropdown trigger="click">
+          <span class="t-btn t-dropdown">
+            <el-icon><Document /></el-icon>
+            督查对象
+            <el-icon class="el-icon--right"><ArrowDown /></el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>选项1</el-dropdown-item>
+              <el-dropdown-item>选项2</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-dropdown trigger="click">
+          <span class="t-btn t-dropdown">
+            <el-icon><MapLocation /></el-icon>
+            水利一张图
+            <el-icon class="el-icon--right"><ArrowDown /></el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>选项1</el-dropdown-item>
+              <el-dropdown-item>选项2</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <span class="t-divider">|</span>
+        <el-dropdown trigger="click">
+          <span class="t-btn t-dropdown">
+            <el-icon><Location /></el-icon>
+            全国
+            <el-icon class="el-icon--right"><ArrowDown /></el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>全国</el-dropdown-item>
+              <el-dropdown-item>省份</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-dropdown trigger="click">
+          <span class="t-btn t-dropdown">
+            <el-icon><FolderOpened /></el-icon>
+            工具箱
+            <el-icon class="el-icon--right"><ArrowDown /></el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>工具1</el-dropdown-item>
+              <el-dropdown-item>工具2</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <span class="t-divider">|</span>
+        <el-dropdown trigger="click">
+          <span class="t-btn t-dropdown">
+            <el-icon><Picture /></el-icon>
+            影像
+            <el-icon class="el-icon--right"><ArrowDown /></el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item>卫星影像</el-dropdown-item>
+              <el-dropdown-item>航拍影像</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Search, DataLine, Document, MapLocation, Location, FolderOpened, Picture, ArrowDown } from '@element-plus/icons-vue'
+
+export default {
+  name: 'ZongHeZhanShi',
+  components: {
+    Search,
+    DataLine,
+    Document,
+    MapLocation,
+    Location,
+    FolderOpened,
+    Picture,
+    ArrowDown,
+  },
+  data() {
+    return {
+      searchText: '',
+    }
+  },
+  methods: {
+    handleSearch() {
+      console.log('搜索:', this.searchText)
+    },
+  },
+}
+</script>
+
+<style scoped>
+.toolbar {
+  position: absolute;
+  top: 20px;
+  right: 20px;
+  display: flex;
+  align-items: center;
+  gap: 0;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
+  z-index: 10;
+  overflow: hidden;
+}
+
+.toolbar-search {
+  display: flex;
+  align-items: center;
+  border-right: 1px solid #e8e8e8;
+}
+
+.search-input {
+  width: 140px;
+}
+
+.search-input :deep(.el-input__wrapper) {
+  box-shadow: none;
+  border-radius: 0;
+  padding: 0 8px;
+}
+
+.search-btn {
+  border: none;
+  border-radius: 0;
+  background: transparent;
+  color: #409eff;
+  padding: 8px 10px;
+  cursor: pointer;
+}
+
+.search-btn:hover {
+  background: #f5f7fa;
+}
+
+.search-btn :deep(.el-icon) {
+  font-size: 16px;
+}
+
+.toolbar-btns {
+  display: flex;
+  align-items: center;
+  padding: 0 4px;
+}
+
+.t-btn {
+  display: inline-flex;
+  align-items: center;
+  gap: 4px;
+  padding: 6px 10px;
+  border: none;
+  background: transparent;
+  cursor: pointer;
+  font-size: 13px;
+  color: #409eff;
+  border-radius: 3px;
+  transition: background 0.2s;
+  white-space: nowrap;
+}
+
+.t-btn:hover {
+  background: #ecf5ff;
+}
+
+.t-dropdown {
+  cursor: pointer;
+}
+
+.t-divider {
+  color: #dcdfe6;
+  margin: 0 2px;
+  user-select: none;
+  font-size: 12px;
+}
+</style>