소스 검색

代码更新 2/14

zhangyun 4 년 전
부모
커밋
82c84ae6d9
36개의 변경된 파일6110개의 추가작업 그리고 273개의 파일을 삭제
  1. 2 2
      minggao/config/index.js
  2. 31 5
      minggao/package-lock.json
  3. 2 1
      minggao/package.json
  4. 9 0
      minggao/src/App.vue
  5. BIN
      minggao/src/assets/images/realTime/10.png
  6. BIN
      minggao/src/assets/images/realTime/11.png
  7. BIN
      minggao/src/assets/images/realTime/12.png
  8. BIN
      minggao/src/assets/images/realTime/13.png
  9. BIN
      minggao/src/assets/images/realTime/6.png
  10. BIN
      minggao/src/assets/images/realTime/7.png
  11. BIN
      minggao/src/assets/images/realTime/8.png
  12. BIN
      minggao/src/assets/images/realTime/9.png
  13. BIN
      minggao/src/assets/images/realTime/B.png
  14. BIN
      minggao/src/assets/images/realTime/shipin.png
  15. BIN
      minggao/src/assets/images/realTime/xiaoxi.png
  16. BIN
      minggao/src/assets/images/taskRegulator/1.png
  17. 80 0
      minggao/src/assets/js/directives.js
  18. 28 0
      minggao/src/assets/js/drag.js
  19. 24 0
      minggao/src/main.js
  20. 811 0
      minggao/src/page/commandCenter/laboratory.vue
  21. 1059 9
      minggao/src/page/commandCenter/realTime.vue
  22. 358 0
      minggao/src/page/commandCenter/supervise.vue
  23. 450 0
      minggao/src/page/commandCenter/superviseAdmin.vue
  24. 370 0
      minggao/src/page/commandCenter/superviseAdminDetails.vue
  25. 337 0
      minggao/src/page/commandCenter/superviseDetails.vue
  26. 338 0
      minggao/src/page/commandCenter/superviseLog.vue
  27. 235 0
      minggao/src/page/commandCenter/superviseLogDetails.vue
  28. 1256 0
      minggao/src/page/commandCenter/taskRegulator.vue
  29. 376 0
      minggao/src/page/commandCenter/taskRegulatorDetails.vue
  30. 248 237
      minggao/src/page/forecasting/cbd/PestsStats.vue
  31. 2 0
      minggao/src/page/home/index.vue
  32. 13 5
      minggao/src/page/systemmanger/customsManger.vue
  33. 5 4
      minggao/src/page/systemmanger/userManger.vue
  34. 76 10
      minggao/src/router/index.js
  35. BIN
      minggao/static/images/realTime/6.png
  36. BIN
      minggao/static/images/realTime/7.png

+ 2 - 2
minggao/config/index.js

@@ -15,7 +15,7 @@ module.exports = {
         // target: 'http://192.168.1.17:12345', //翟毅飞
         target: 'http://192.168.1.77:12345', //曹世祥
         changeOrigin: true,
-        pathRewrite: { 
+        pathRewrite: {
           '^/api': '/api' //重写接口
         }
       },
@@ -29,7 +29,7 @@ module.exports = {
     notifyOnErrors: true,
     poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
 
-    
+
     /**
      * Source Maps
      */

+ 31 - 5
minggao/package-lock.json

@@ -6620,7 +6620,8 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
+      "dev": true,
+      "optional": true
     },
     "pify": {
       "version": "3.0.0",
@@ -10928,9 +10929,9 @@
       "dev": true
     },
     "v-viewer": {
-      "version": "1.5.1",
-      "resolved": "https://registry.nlark.com/v-viewer/download/v-viewer-1.5.1.tgz?cache=0&sync_timestamp=1632202257840&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fv-viewer%2Fdownload%2Fv-viewer-1.5.1.tgz",
-      "integrity": "sha1-lIBNg4FMylZuaRM5/h5keTSG8gA=",
+      "version": "1.6.4",
+      "resolved": "https://registry.npmmirror.com/v-viewer/download/v-viewer-1.6.4.tgz",
+      "integrity": "sha1-OeNrU0uqs0B2+4FnBManNN4Nxy8=",
       "dev": true,
       "requires": {
         "throttle-debounce": "^2.0.1",
@@ -11258,6 +11259,7 @@
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
+          "optional": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -11323,13 +11325,15 @@
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
           "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "is-number": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "dev": true,
+          "optional": true,
           "requires": {
             "kind-of": "^3.0.2"
           }
@@ -11339,6 +11343,7 @@
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
+          "optional": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -12130,6 +12135,27 @@
         }
       }
     },
+    "zego-express-engine-webrtc": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmmirror.com/zego-express-engine-webrtc/download/zego-express-engine-webrtc-2.13.0.tgz",
+      "integrity": "sha512-f7zSVYlMdFK1TiS+z/XmbkM8JaC0Xio1GOyMERb0rgV617krj0KS3+ZnrGaEVPhfCZnc7/PHArRcLM7jqBKHvw==",
+      "requires": {
+        "zego-express-engine-webrtm": "1.12.0"
+      }
+    },
+    "zego-express-engine-webrtm": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmmirror.com/zego-express-engine-webrtm/download/zego-express-engine-webrtm-1.12.0.tgz",
+      "integrity": "sha512-Yp7S1EFJ00OyJ+q+pXKI7WVzBe3b9Nb7JGB6xw4DmkkyJ69IHG+hy3B+z/eqZf/ejvkkY1+nElDefjLlSbLElA==",
+      "requires": {
+        "zego-express-logger": "1.2.0"
+      }
+    },
+    "zego-express-logger": {
+      "version": "1.2.0",
+      "resolved": "https://registry.nlark.com/zego-express-logger/download/zego-express-logger-1.2.0.tgz",
+      "integrity": "sha1-/pkxS+xAjXP22EuYguEh+lPLh/I="
+    },
     "zrender": {
       "version": "4.3.2",
       "resolved": "https://registry.nlark.com/zrender/download/zrender-4.3.2.tgz",

+ 2 - 1
minggao/package.json

@@ -16,7 +16,8 @@
     "less": "^4.1.2",
     "vue": "^2.5.2",
     "vue-router": "^3.0.1",
-    "vuex": "^3.6.2"
+    "vuex": "^3.6.2",
+    "zego-express-engine-webrtc": "^2.13.0"
   },
   "devDependencies": {
     "autoprefixer": "^7.1.2",

+ 9 - 0
minggao/src/App.vue

@@ -7,6 +7,15 @@
 <script>
 export default {
   name: "App",
+  data() {
+    return {
+    }
+  },
+  methods: {
+
+  },
+  mounted() {
+  }
 };
 </script>
 

BIN
minggao/src/assets/images/realTime/10.png


BIN
minggao/src/assets/images/realTime/11.png


BIN
minggao/src/assets/images/realTime/12.png


BIN
minggao/src/assets/images/realTime/13.png


BIN
minggao/src/assets/images/realTime/6.png


BIN
minggao/src/assets/images/realTime/7.png


BIN
minggao/src/assets/images/realTime/8.png


BIN
minggao/src/assets/images/realTime/9.png


BIN
minggao/src/assets/images/realTime/B.png


BIN
minggao/src/assets/images/realTime/shipin.png


BIN
minggao/src/assets/images/realTime/xiaoxi.png


BIN
minggao/src/assets/images/taskRegulator/1.png


+ 80 - 0
minggao/src/assets/js/directives.js

@@ -0,0 +1,80 @@
+import Vue from 'vue';
+  
+// v-dialogDrag: 弹窗拖拽属性
+Vue.directive('dialogDrag', {
+  bind(el, binding, vnode, oldVnode) {
+    const dialogHeaderEl = el.querySelector('.el-dialog__header');
+    const dragDom = el.querySelector('.el-dialog');
+    //dialogHeaderEl.style.cursor = 'move';
+    dialogHeaderEl.style.cssText += ';cursor:move;'
+    dragDom.style.cssText += ';top:0px;'
+  
+    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
+    const sty = (function() {
+        if (window.document.currentStyle) {
+            return (dom, attr) => dom.currentStyle[attr];
+        } else{
+            return (dom, attr) => getComputedStyle(dom, false)[attr];
+        }
+    })()    
+     
+    dialogHeaderEl.onmousedown = (e) => {
+      // 鼠标按下,计算当前元素距离可视区的距离
+      const disX = e.clientX - dialogHeaderEl.offsetLeft;
+      const disY = e.clientY - dialogHeaderEl.offsetTop;
+       
+      const screenWidth = document.body.clientWidth; // body当前宽度
+        const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取) 
+         
+        const dragDomWidth = dragDom.offsetWidth; // 对话框宽度
+        const dragDomheight = dragDom.offsetHeight; // 对话框高度
+         
+        const minDragDomLeft = dragDom.offsetLeft;
+        const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
+         
+        const minDragDomTop = dragDom.offsetTop;
+        const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
+  
+       
+      // 获取到的值带px 正则匹配替换
+      let styL = sty(dragDom, 'left');
+      let styT = sty(dragDom, 'top');
+  
+      // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
+      if(styL.includes('%')) {
+        styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100);
+        styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100);
+      }else {
+        styL = +styL.replace(/\px/g, '');
+        styT = +styT.replace(/\px/g, '');
+      };
+       
+      document.onmousemove = function (e) {
+        // 通过事件委托,计算移动的距离 
+                let left = e.clientX - disX;
+                let top = e.clientY - disY;
+                 
+                // 边界处理
+                if (-(left) > minDragDomLeft) {
+                    left = -(minDragDomLeft);
+                } else if (left > maxDragDomLeft) {
+                    left = maxDragDomLeft;
+                }
+                 
+                if (-(top) > minDragDomTop) {
+                    top = -(minDragDomTop);
+                } else if (top > maxDragDomTop) {
+                    top = maxDragDomTop;
+                }
+  
+        // 移动当前元素 
+                dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
+      };
+  
+      document.onmouseup = function (e) {
+        document.onmousemove = null;
+        document.onmouseup = null;
+      };
+    } 
+  }
+})

+ 28 - 0
minggao/src/assets/js/drag.js

@@ -0,0 +1,28 @@
+import Vue from 'vue';
+//使用Vue.directive()定义一个全局指令
+//1.参数一:指令的名称,定义时指令前面不需要写v-
+//2.参数二:是一个对象,该对象中有相关的操作函数
+//3.在调用的时候必须写v-
+const drag = Vue.directive('drag', {
+    //1.指令绑定到元素上回立刻执行bind函数,只执行一次
+    //2.每个函数中第一个参数永远是el,表示绑定指令的元素,el参数是原生js对象
+    //3.通过el.focus()是无法获取焦点的,因为只有插入DOM后才生效
+    bind: function (el) { },
+    //inserted表示一个元素,插入到DOM中会执行inserted函数,只触发一次
+    inserted: function (el) {
+        el.onmousedown = function (e) {
+            var disx = e.pageX - el.offsetLeft;
+            var disy = e.pageY - el.offsetTop;
+            document.onmousemove = function (e) {
+                el.style.left = e.pageX - disx + 'px';
+                el.style.top = e.pageY - disy + 'px';
+            }
+            document.onmouseup = function () {
+                document.onmousemove = document.onmouseup = null;
+            }
+        }
+    },
+    //当VNode更新的时候会执行updated,可以触发多次
+    updated: function (el) { }
+})
+export default drag;

+ 24 - 0
minggao/src/main.js

@@ -6,6 +6,9 @@ import store from '@/store/store.js'
 import less from 'less'
 Vue.use(less)
 
+import './assets/js/directives'; // 实现elementui对话框可拖拽功能
+import drag from '@/assets/js/drag'; // 实现div弹框可拖拽功能
+
 import Viewer from 'v-viewer'
 import 'viewerjs/dist/viewer.css'
 Vue.use(Viewer, {
@@ -13,6 +16,27 @@ Vue.use(Viewer, {
     "zIndex": 9999,
   }
 })
+// import Viewer from 'v-viewer'
+// import 'viewerjs/dist/viewer.css'
+// Vue.use(Viewer)
+// Viewer.setDefaults({
+//   Options: {
+//     inline: true,
+//     button: false,
+//     navbar: true,
+//     title: true,
+//     toolbar: true,
+//     tooltip: true,
+//     movable: true,
+//     zoomable: true,
+//     rotatable: true,
+//     scalable: true,
+//     transition: true,
+//     fullscreen: true,
+//     keyboard: true,
+//     url: 'data-source'
+//   }
+// })
 
 import echarts from 'echarts'
 Vue.prototype.$echarts = echarts

+ 811 - 0
minggao/src/page/commandCenter/laboratory.vue

@@ -0,0 +1,811 @@
+<!--  -->
+<template>
+  <div class="laboratory_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <!-- 筛选 -->
+      <el-row>
+        <el-col>
+          <div class="search_box">
+            <!-- 任务处理人 -->
+            <el-select
+              filterable
+              v-model="input"
+              clearable
+              @change="searchData"
+              placeholder="请选择任务处理人/实际处理人"
+              size="mini"
+            >
+              <el-option
+                v-for="item in conductorList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 任务状态 -->
+            <el-select
+              filterable
+              v-model="value"
+              @change="searchData"
+              clearable
+              placeholder="请选择任务状态"
+              size="mini"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 时间筛选 -->
+            <el-date-picker
+              size="mini"
+              v-model="value1"
+              @change="searchData"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+            >
+            </el-date-picker>
+
+            <div class="btn_box">
+              <el-button type="primary" size="mini" @click="searchData"
+                >搜索</el-button
+              >
+              <el-button type="primary" size="mini" @click="reset"
+                >重置</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+
+      <!-- 列表 -->
+      <el-table
+        :data="tableData"
+        stripe
+        v-loading="loading"
+        style="width: 100%"
+      >
+        <el-table-column prop="serial" label="序号" width="100">
+        </el-table-column>
+        <el-table-column prop="trap_number" label="设备编号" width="120">
+        </el-table-column>
+        <el-table-column prop="lng" label="经度" width="150">
+          <template slot-scope="scope">
+            <span>{{ scope.row.lng || "无" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="lat" label="纬度" width="150">
+          <template slot-scope="scope">
+            <span>{{ scope.row.lat || "无" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="id" label="任务编号" width="180">
+        </el-table-column>
+        <el-table-column
+          prop="operator_user_name"
+          label="任务处理人"
+          width="180"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="actual_operator_name"
+          label="实际处理人"
+          width="180"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row.actual_operator_name || "暂无" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="report_time" label="带回时间">
+          <template slot-scope="scope">
+            <span>{{ scope.row.report_time || "暂无" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="discern_status" label="任务状态" width="280">
+          <template slot-scope="scope">
+            <span v-if="scope.row.discern_status == '待接收'">
+              <span
+                style="
+                  width: 6px;
+                  height: 6px;
+                  background: #f93f3d;
+                  border-radius: 50%;
+                  display: inline-block;
+                  margin: 0 0 2px 0;
+                "
+              ></span>
+              <span>待接收样本</span>
+            </span>
+
+            <span v-if="scope.row.discern_status == '已接收'">
+              <span
+                style="
+                  width: 6px;
+                  height: 6px;
+                  background: #f93f3d;
+                  border-radius: 50%;
+                  display: inline-block;
+                  margin: 0 0 2px 0;
+                "
+              ></span>
+              <span>已接收样本</span>
+            </span>
+
+            <span v-if="scope.row.discern_status == '已填报'">
+              <span
+                style="
+                  width: 6px;
+                  height: 6px;
+                  background: #e6a23c;
+                  border-radius: 50%;
+                  display: inline-block;
+                  margin: 0 0 2px 0;
+                "
+              ></span>
+              <span>已填报样本</span>
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <a
+              v-if="scope.row.discern_status == '待接收'"
+              class="reset"
+              href="javascript:;"
+              @click="receive(scope.row)"
+              >确认接收</a
+            >
+
+            <a
+              v-if="scope.row.discern_status == '已接收'"
+              class="reset"
+              @click="examine(scope.row)"
+              href="javascript:;"
+              >填报</a
+            >
+
+            <a
+              v-if="scope.row.discern_status == '已填报'"
+              class="reset"
+              href="javascript:;"
+              @click="examine(scope.row)"
+              >编辑</a
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <el-pagination
+        style="margin: 60px 0 0 0"
+        :page-size="10"
+        @current-change="newPage"
+        :current-page="page"
+        v-if="tableData.length > 0"
+        background
+        layout="prev, pager, next, jumper"
+        :total="tableSum"
+      >
+      </el-pagination>
+    </el-card>
+
+    <!-- 填报弹框 -->
+    <el-dialog
+      title="填报"
+      v-loading="loading1"
+      :visible.sync="dialogVisible"
+      width="30%"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <ul class="fill_ul">
+        <li class="fill_listTlt">
+          <div class="fill_tltie">有害生物</div>
+          <div class="fill_tltie">数量</div>
+        </li>
+
+        <li class="fill_list1" v-if="fillList.length !== 0">
+          <div v-for="(item, index) in fillList" :key="item.ind">
+            <el-select
+              v-model="models[index]"
+              size="mini"
+              clearable
+              @change="compileInsect($event, item, index)"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item1 in fillList"
+                :key="item1.value"
+                :label="item1.label"
+                :value="item1.value"
+              >
+              </el-option>
+            </el-select>
+
+            <el-input
+              placeholder="请输入内容"
+              size="mini"
+              @change="compileInsect($event, item, index)"
+              v-model="item.num"
+              clearable
+              type="number"
+              style="width: 30%"
+            >
+            </el-input>
+
+            <span @click="delInsect(item)">删除</span>
+          </div>
+        </li>
+
+        <!-- 添加 -->
+        <li class="fill_list">
+          <el-input
+            placeholder="请输入有害生物"
+            size="mini"
+            v-model="insectVal"
+            clearable
+            style="width: 37%; margin: 0 0 0 -8px"
+          >
+          </el-input>
+
+          <el-input
+            placeholder="请输入数量"
+            size="mini"
+            v-model="numVal"
+            clearable
+            type="number"
+            style="width: 30%"
+          >
+          </el-input>
+
+          <span
+            style="color: #000; font-size: 30px; cursor: pointer"
+            @click="addInsect()"
+            >+</span
+          >
+        </li>
+      </ul>
+      <!-- <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="compileInsect"
+          >确 定</el-button
+        >
+      </span> -->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 筛选
+      input: "", // 任务处理人
+      conductorList: [], // 任务处理人列表
+      options: [
+        {
+          value: "待接收",
+          label: "待接收"
+        },
+        {
+          value: "已接收",
+          label: "已接收"
+        },
+        {
+          value: "已填报",
+          lanbel: "已填报"
+        }
+      ],
+      value: "", // 任务状态
+      value1: "", // 时间筛选
+      startTime: "",
+      endTime: "",
+
+      // 表格
+      tableData: [],
+      page: 1,
+      tableSum: 0, // 总页数
+
+      // 填报弹框
+      dialogVisible: false,
+      options1: [
+        {
+          value: "选项1",
+          label: "黄金糕"
+        }
+      ],
+      value2: "",
+      input2: "",
+      loading: false, // 加载
+
+      // 已识别
+      examineObj: {}, // 选中的对象值
+      fillList: [], // 填报详情数据
+      spareData: [], // 填报详情备用数据
+      // models: Array(fillList.length).fill(''), // 填报select数据
+      models: null, // 填报select数据
+      insectVal: "", // 添加 - 有害生物
+      numVal: "", // 添加 - 数量
+      loading1: false // 加载
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    },
+
+    // 填报弹框
+    dialogVisible(val) {
+      if (val == false) {
+        this.fillList = [];
+        this.spareData = []; // 备用数据
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 筛选
+    searchData() {
+      // 对时间筛选中获取到的时间进行处理
+      if (this.value1) {
+        this.startTime = this.formatTime(this.value1[0], "yyyy-MM-dd");
+        this.endTime = this.formatTime(this.value1[1], "yyyy-MM-dd");
+      } else {
+        this.startTime = "";
+        this.endTime = "";
+      }
+      this.loading = true;
+      this.tableData = [];
+      this.tableList();
+    },
+
+    // 重置
+    reset() {
+      this.input = "";
+      this.value = "";
+      this.value1 = "";
+      this.startTime = "";
+      this.endTime = "";
+      this.loading = true;
+      this.tableList();
+    },
+
+    // 下页
+    newPage(page) {
+      this.page = page;
+      this.tableList();
+    },
+
+    // 表格数据
+    tableList() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.discern_list",
+        data: this.qs.stringify({
+          page: this.page,
+          page_item: 10,
+          operator_user_id: this.input, // 任务处理人id
+          start_time: this.startTime, // 开始时间
+          end_time: this.endTime, // 结束时间
+          task_status: this.value // 任务状态
+        })
+      })
+        .then(res => {
+          if (res.data.data.total_item !== 0) {
+            this.tableSum = res.data.data.total_item;
+            var data = res.data.data.page_list;
+            var list = [];
+            data.forEach((item, index) => {
+              item.serial = index + 1;
+              list.push(item);
+            });
+            this.tableData = list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+        });
+    },
+
+    // 筛选列表 - 任务处理人
+    conductorAxios() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_user_list",
+        data: this.qs.stringify({
+          user_type: "operator", // 用户类型,operator(任务处理人), supervisor(任务监督人), owner(任务发布人)
+          operator_id: "", // 已经选择的任务处理人id
+          supervisor_id: "", // 已经选择的任务监督人id
+          owner_id: "" // 已经选择的任务发布人id
+        })
+      })
+        .then(res => {
+          if (res.data.data.length !== 0) {
+            var data = res.data.data;
+            var list = [];
+            data.forEach(item => {
+              var obj = {};
+              obj["value"] = item.user_id;
+              obj["label"] = item.real_name;
+              list.push(obj);
+            });
+            this.conductorList = list;
+          }
+        })
+        .catch(err => {});
+    },
+
+    // 确认接收
+    receive(data) {
+      this.$confirm("此操作将确认接收, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          this.$axios({
+            method: "POST",
+            url: "/api/api_gateway?method=control_center.task.discern_modify",
+            data: this.qs.stringify({
+              record_id: data.id // 任务id
+            })
+          })
+            .then(res => {
+              if (res.data.data == true) {
+                this.$message({
+                  type: "success",
+                  message: "接收成功!",
+                  duration: 1500
+                });
+                this.loading = true;
+                this.tableList();
+              }
+            })
+            .catch(err => {
+              console.log(err);
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消接收",
+            duration: 1500
+          });
+        });
+    },
+
+    // 填报、编辑事件  (表格中的操作)
+    examine(data) {
+      // console.log(data);
+      this.examineObj = data;
+      // 填报记录详情接口
+      this.$axios({
+        method: "POST",
+        url:
+          "/api/api_gateway?method=control_center.task.trap_pest_record_info",
+        data: this.qs.stringify({
+          trap_record_id: data.id // 任务id
+        })
+      })
+        .then(res => {
+          var data = res.data.data;
+          var list = [];
+          var arr = [];
+          data.forEach((item, index) => {
+            var obj = {};
+            obj["value"] = item.id;
+            obj["label"] = item.pest_name;
+            obj["num"] = item.pest_number;
+            obj["ind"] = index;
+            list.push(obj);
+            arr.push(item.id);
+          });
+          this.fillList = list;
+          this.spareData = list; // 备用数据
+          this.models = arr;
+          this.dialogVisible = true;
+        })
+        .catch(err => {
+          console.log(err);
+        });
+    },
+
+    // 添加有害生物
+    addInsect() {
+      if (this.insectVal !== "" && this.numVal !== "") {
+        var array = [];
+        for (var i = 0; i < this.fillList.length; i++) {
+          var obj = {};
+          obj["pest_name"] = this.fillList[i].label;
+          obj["pest_number"] = this.fillList[i].num;
+          array.push(obj);
+        }
+        var obj1 = {};
+        obj1["pest_name"] = this.insectVal;
+        obj1["pest_number"] = Number(this.numVal);
+        array = [...array, obj1];
+
+        this.$confirm("此操作将新增有害生物, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            this.$axios({
+              method: "POST",
+              url: "/api/api_gateway?method=control_center.task.discern_add",
+              data: this.qs.stringify({
+                record_id: this.examineObj.id, // 任务id
+                pest_list: JSON.stringify(array) // 害虫数组
+              })
+            })
+              .then(res => {
+                if (res.data.message == "") {
+                  this.$message({
+                    type: "success",
+                    message: "添加成功!",
+                    duration: 1500
+                  });
+                  this.examine(this.examineObj);
+                }
+                this.insectVal = "";
+                this.numVal = "";
+              })
+              .catch(err => {
+                console.log(err);
+              });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消添加",
+              duration: 1500
+            });
+          });
+      } else {
+        this.$message({
+          type: "info",
+          message: "请将信息填写完整!",
+          duration: 1500
+        });
+      }
+    },
+
+    // 删除有害生物
+    delInsect(data) {
+      this.$confirm("此操作将永久删除该有害生物, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          this.loading1 = true;
+          var list = this.fillList;
+          list.splice(data.ind, 1);
+          var arr = [];
+          list.forEach(item => {
+            var obj = {};
+            obj["pest_name"] = item.label;
+            obj["pest_number"] = item.num;
+            arr.push(obj);
+          });
+          this.$axios({
+            method: "POST",
+            url: "/api/api_gateway?method=control_center.task.discern_add",
+            data: this.qs.stringify({
+              record_id: this.examineObj.id, // 任务id
+              pest_list: JSON.stringify(arr) // 害虫数组
+            })
+          })
+            .then(res => {
+              if (res.data.message == "") {
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                  duration: 1500
+                });
+                this.examine(this.examineObj);
+              }
+              this.loading1 = false;
+            })
+            .catch(err => {
+              this.loading1 = false;
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+            duration: 1500
+          });
+        });
+    },
+
+    // 编辑有害生物
+    compileInsect(e, data, index) {
+      this.$confirm("此操作将编辑该有害生物, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          this.$set(this.models, index, e);
+          var list = this.spareData;
+          var newList = [];
+          // 下拉框数据改变处理
+          for (var i = 0; i < list.length; i++) {
+            var obj = {};
+            if (e == list[i].value) {
+              obj["pest_name"] = list[i].label;
+              obj["pest_number"] = data.num;
+              newList.push(obj);
+            }
+          }
+          // 修改数据为可发送到后端接口数据
+          var arr = [];
+          var list = this.fillList;
+          list.forEach(item => {
+            var obj = {};
+            obj["pest_name"] = item.label;
+            obj["pest_number"] = item.num;
+            arr.push(obj);
+          });
+          arr.splice(index, 1, ...newList);
+          this.$axios({
+            method: "POST",
+            url: "/api/api_gateway?method=control_center.task.discern_add",
+            data: this.qs.stringify({
+              record_id: this.examineObj.id, // 任务id
+              pest_list: JSON.stringify(arr) // 害虫数组
+            })
+          })
+            .then(res => {
+              if (res.data.message == "") {
+                this.$message({
+                  type: "success",
+                  message: "编辑成功!",
+                  duration: 1500
+                });
+                this.examine(this.examineObj);
+              }
+              this.insectVal = "";
+              this.numVal = "";
+            })
+            .catch(err => {
+              console.log(err);
+            });
+        })
+        .catch(() => {
+          this.loading1 = false;
+          this.$set(this.models, index, this.fillList[index].value);
+          this.$message({
+            type: "info",
+            message: "已取消编辑"
+          });
+        });
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true;
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.tableList(); // 表格列表数据
+    this.conductorAxios(); // 筛选列表 - 任务处理人列表
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.laboratory_box {
+  // 搜索
+  .search_box {
+    display: flex;
+    /deep/.el-select {
+      margin: 0 15px 0 0;
+    }
+    /deep/.el-input {
+      // width: 15%;
+      margin: 0 15px 0 0;
+    }
+    .btn_box {
+      margin: 0 0 0 15px;
+    }
+
+    /deep/.el-range-editor--mini.el-input__inner {
+      width: 20%;
+    }
+  }
+
+  a {
+    text-decoration: none;
+  }
+  .reset {
+    color: #1890ff;
+  }
+
+  // 填报弹框
+  .fill_ul {
+    .fill_listTlt {
+      display: flex;
+      width: 50%;
+      margin: 0 0 0 24px;
+      justify-content: space-between;
+      .fill_tltie {
+        margin: 0 0 10px 0;
+      }
+    }
+    .fill_list {
+      display: flex;
+      justify-content: space-around;
+      margin: 0 20px 10px 0;
+      span {
+        line-height: 30px;
+        color: #1890ff;
+      }
+    }
+
+    .fill_list1 {
+      div {
+        display: flex;
+        justify-content: space-around;
+        margin: 0 20px 10px 0;
+        span {
+          line-height: 30px;
+          color: #1890ff;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1059 - 9
minggao/src/page/commandCenter/realTime.vue


+ 358 - 0
minggao/src/page/commandCenter/supervise.vue

@@ -0,0 +1,358 @@
+<!--  -->
+<template>
+  <div class="supervise_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <!-- 筛选 -->
+      <el-row>
+        <el-col>
+          <div class="search_box">
+            <!-- 监督人 -->
+            <el-select
+              filterable
+              v-model="input"
+              clearable
+              @change="searchData"
+              placeholder="请选择监督人"
+              size="mini"
+            >
+              <el-option
+                v-for="item in conductorList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 监督形式 -->
+            <el-select
+              filterable
+              v-model="input2"
+              clearable
+              @change="searchData"
+              placeholder="请选择监督形式"
+              size="mini"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 时间筛选 -->
+            <el-date-picker
+              size="mini"
+              v-model="value"
+              @change="searchData"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+            >
+            </el-date-picker>
+
+            <div class="btn_box">
+              <el-button type="primary" size="mini" @click="searchData"
+                >搜索</el-button
+              >
+              <el-button size="mini" @click="reset">重置</el-button>
+
+              <el-button type="primary" size="mini" @click="exportData">
+                <i v-if="loadingShow" class="el-icon-loading"></i>
+                导出数据</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+
+      <!-- 表格 -->
+      <el-table
+        :data="tableData"
+        v-loading="loading"
+        stripe
+        style="width: 100%"
+      >
+        <el-table-column prop="ind" label="序号" width="180"> </el-table-column>
+        <el-table-column prop="supervisor_user" label="监督人" width="180">
+        </el-table-column>
+        <el-table-column prop="supervisor_type" label="监督形式">
+        </el-table-column>
+        <el-table-column prop="supervisor_depa" label="监督单位">
+        </el-table-column>
+        <el-table-column prop="supervisor_msg" label="监督情况">
+        </el-table-column>
+        <el-table-column prop="supervisor_time" label="监督时间">
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <a
+              class="reset"
+              href="javascript:;"
+              @click="examineDetail(scope.row)"
+              >查看</a
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <el-pagination
+        style="margin: 60px 0 0 0"
+        :page-size="10"
+        @current-change="newPage"
+        :current-page="page"
+        v-if="tableData.length > 0"
+        background
+        layout="prev, pager, next, jumper"
+        :total="tableSum"
+      >
+      </el-pagination>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 筛选
+      input: "", // 监督人
+      conductorList: [], // 监督人 - 列表
+      input2: "", // 监督形式
+      // 监督形式 - 列表
+      options: [
+        {
+          value: "远程监督",
+          label: "远程监督"
+        },
+        {
+          value: "现场监督",
+          label: "现场监督"
+        }
+      ],
+      value: "", // 时间筛选
+      startTime: "", // 开始时间
+      endTime: "", // 结束时间
+      loadingShow: false, // 导出加载
+
+      // 表格
+      tableData: [],
+      loading: false, // 加载
+
+      // 分页
+      page: 1, // 当期页码
+      tableSum: 0 // 总页数
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 表格
+    tableList() {
+      this.$axios({
+        method: "POST",
+        url:
+          "/api/api_gateway?method=control_center.task.supervisor_record_list",
+        data: this.qs.stringify({
+          page: this.page,
+          page_item: "10",
+          supervisor_user_id: this.input, // 监督人id
+          start_time: this.startTime, // 开始时间
+          end_time: this.endTime, // 结束时间
+          supervisor_type: this.input2 // 监督形式
+        })
+      })
+        .then(res => {
+          if (res.data.data.total_item !== 0) {
+            var data = res.data.data;
+            this.tableSum = data.total_item;
+            var list = [];
+            data.page_list.forEach((item, index) => {
+              item.ind = index + 1;
+              list.push(item);
+            });
+            this.tableData = list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+        });
+    },
+
+    // 监督人列表
+    conductorAxios() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_user_list",
+        data: this.qs.stringify({
+          user_type: "supervisor", // 用户类型,operator(任务处理人), supervisor(任务监督人), owner(任务发布人)
+          operator_id: "", // 已经选择的任务处理人id
+          supervisor_id: "", // 已经选择的任务监督人id
+          owner_id: "" // 已经选择的任务发布人id
+        })
+      })
+        .then(res => {
+          if (res.data.data.length !== 0) {
+            var data = res.data.data;
+            var list = [];
+            data.forEach(item => {
+              var obj = {};
+              obj["value"] = item.user_id;
+              obj["label"] = item.real_name;
+              list.push(obj);
+            });
+            this.conductorList = list;
+          }
+        })
+        .catch(err => {});
+    },
+
+    // 搜索
+    searchData() {
+      this.loading = true;
+      this.tableData = [];
+      this.tableList();
+    },
+
+    // 重置
+    reset() {
+      this.input = ""; // 监督人
+      this.input2 = ""; // 监督形式
+      this.value = ""; // 时间筛选
+      this.startTime = ""; // 开始时间
+      this.endTime = ""; // 结束时间
+      this.loading = true;
+      this.tableData = [];
+      this.tableList();
+    },
+
+    // 导出数据
+    exportData() {
+      this.loadingShow = true;
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.supervisor_export",
+        responseType: "blob"
+      })
+        .then(res => {
+          this.downloadFile(res, "监督记录.xls");
+          this.loadingShow = false;
+        })
+        .catch(err => {
+          this.loadingShow = false;
+          // console.log(err);
+        });
+    },
+
+    // 流文件下载
+    downloadFile(res, name) {
+      let link = document.createElement("a");
+      link.href = window.URL.createObjectURL(new Blob([res.data]));
+      link.target = "_blank";
+      // 文件名和格式
+      link.download = name;
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    },
+
+    // 分页
+    newPage(page) {
+      this.page = page;
+      this.tableList();
+    },
+
+    // 查看
+    examineDetail(data) {
+      this.$router.push({
+        path: "/index/superviseDetails",
+        query: {
+          id: data.id
+        }
+      });
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true;
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.conductorAxios(); // 监督人 - 筛选列表
+    this.tableList(); // 表格
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.supervise_box {
+  // 搜索
+  .search_box {
+    display: flex;
+    /deep/.el-select {
+      margin: 0 15px 0 0;
+    }
+    /deep/.el-input {
+      margin: 0 15px 0 0;
+    }
+    .btn_box {
+      margin: 0 0 0 15px;
+    }
+
+    /deep/.el-range-editor--mini.el-input__inner {
+      width: 20%;
+    }
+  }
+
+  a {
+    text-decoration: none;
+  }
+  .reset {
+    color: #1890ff;
+  }
+}
+</style>

+ 450 - 0
minggao/src/page/commandCenter/superviseAdmin.vue

@@ -0,0 +1,450 @@
+<!--  -->
+<template>
+  <div class="superviseAdmin_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <!-- 筛选 -->
+      <el-row>
+        <el-col>
+          <div class="search_box">
+            <!-- 任务处理人 -->
+            <el-select
+              filterable
+              :loading="loading2"
+              v-model="input"
+              clearable
+              @change="searchData"
+              @focus="selectList('operator')"
+              placeholder="请选择任务处理人/实际处理人"
+              size="mini"
+            >
+              <el-option
+                v-for="item in conductorList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 任务发布人 -->
+            <!-- <el-input
+              style="width: 14%"
+              @change="searchData"
+              :loading="loading3"
+              @focus="selectList('owner')"
+              placeholder="请输入任务发布人"
+              v-model="input2"
+              size="mini"
+              clearable
+            >
+            </el-input> -->
+            <el-select
+              filterable
+              :loading="loading3"
+              v-model="input2"
+              clearable
+              @change="searchData"
+              @focus="selectList('owner')"
+              placeholder="请选择任务发布人"
+              size="mini"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 任务状态 -->
+            <el-select
+              filterable
+              v-model="value"
+              @change="searchData"
+              clearable
+              placeholder="请选择任务状态"
+              size="mini"
+            >
+              <el-option
+                v-for="item in options2"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 时间筛选 -->
+            <el-date-picker
+              size="mini"
+              v-model="value2"
+              @change="searchData"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+            >
+            </el-date-picker>
+
+            <div class="btn_box">
+              <el-button type="primary" size="mini" @click="searchData"
+                >搜索</el-button
+              >
+              <el-button size="mini" @click="reset">重置</el-button>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+
+      <!-- 表格 -->
+      <el-table
+        :data="tableData"
+        v-loading="loading"
+        stripe
+        style="width: 100%"
+      >
+        <el-table-column prop="ind" label="序号" width="80"> </el-table-column>
+        <el-table-column prop="task_id" label="任务编号" width="100">
+        </el-table-column>
+        <el-table-column prop="task_type" label="任务类型"> </el-table-column>
+        <el-table-column prop="operator_user" label="任务处理人">
+        </el-table-column>
+        <el-table-column prop="owner_user" label="任务发布人">
+        </el-table-column>
+        <el-table-column prop="supervisor_user" label="任务监督人">
+        </el-table-column>
+        <el-table-column prop="start_time" label="任务时间"></el-table-column>
+        <el-table-column prop="start_time" label="任务结束"></el-table-column>
+        <el-table-column prop="end_time" label="任务完成时间">
+          <template slot-scope="scope">
+            <span>{{ scope.row.end_time || "暂无" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="task_status" label="任务状态">
+          <template slot-scope="scope">
+            <div v-for="(item, index) in type_status" :key="index">
+              <span
+                v-if="item.name == scope.row.task_status"
+                :style="'color:' + item.color + '; font-weight: 550'"
+                >{{ scope.row.task_status }}</span
+              >
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <a
+              class="reset"
+              href="javascript:;"
+              @click="examineDetail(scope.row)"
+              >查看</a
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <el-pagination
+        style="margin: 60px 0 0 0"
+        :page-size="10"
+        @current-change="newPage"
+        :current-page="page"
+        v-if="tableData.length > 0"
+        background
+        layout="prev, pager, next, jumper"
+        :total="tableSum"
+      >
+      </el-pagination>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 筛选
+      input: "", // 任务处理人
+      loading2: false,
+      conductorList: [], // 任务处理人 - 列表
+      input2: "", // 任务发布人
+      loading3: false,
+      options: [], // 任务发布人 - 列表
+      value: "", // 任务状态
+      options2: [
+        {
+          value: "未开始",
+          label: "未开始"
+        },
+        {
+          value: "处理中",
+          label: "处理中"
+        },
+        {
+          value: "已完成",
+          label: "已完成"
+        },
+        {
+          value: "未处理",
+          label: "未处理"
+        },
+        {
+          value: "逾期完成",
+          label: "逾期完成"
+        }
+      ], // 任务状态 - 列表
+      value2: "", // 时间筛选
+      startTime: "", // 开始时间
+      endTime: "", // 结束时间
+
+      // 表格
+      tableData: [],
+      loading: false, // 加载
+      // 任务状态展示
+      type_status: [
+        {
+          name: "未开始",
+          color: "#E6A23C"
+        },
+        {
+          name: "处理中",
+          color: "#E6A23C"
+        },
+        {
+          name: "已完成",
+          color: "#67C23A"
+        },
+        {
+          name: "未处理",
+          color: "#F56C6C"
+        },
+        {
+          name: "逾期完成",
+          color: "#409EFF"
+        }
+      ],
+
+      // 分页
+      page: 1, // 当前页码
+      tableSum: 0 // 总页码
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 表格
+    tableList() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.supervisor_list",
+        data: this.qs.stringify({
+          page: this.page,
+          page_item: "10",
+          operator_user_id: this.input, // 处理人
+          owner_user_id: this.input2, // 发布人id
+          start_time: this.startTime, // 开始时间
+          end_time: this.endTime, // 结束时间
+          task_status: this.value // 任务状态
+        })
+      })
+        .then(res => {
+          if (res.data.data.total_item !== 0) {
+            var data = res.data.data;
+            this.tableSum = data.total_item;
+            var list = [];
+            data.page_list.forEach((item, index) => {
+              item.ind = index + 1;
+              list.push(item);
+            });
+            this.tableData = list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+        });
+    },
+
+    // 搜索
+    searchData() {
+      if (this.value2) {
+        this.startTime = this.formatTime(this.value2[0], "yyyy-MM-dd");
+        this.endTime = this.formatTime(this.value2[1], "yyyy-MM-dd");
+      } else {
+        this.startTime = "";
+        this.endTime = "";
+      }
+      this.tableData = [];
+      this.loading = true;
+      this.tableList();
+    },
+
+    // 筛选列表 - 任务处理人、任务发布人
+    selectList(type) {
+      if (type == "operator") {
+        // 任务处理人
+        var a = ""; //任务处理人
+        var b = ""; //任务监督人
+        var c = this.input2; //任务发布人
+        this.loading2 = true;
+      } else if (type == "owner") {
+        // 任务发布人
+        var a = this.input; //任务处理人
+        var b = ""; //任务监督人
+        var c = ""; //任务发布人
+        this.loading3 = true;
+      }
+      this.conductorAxios(type, a, b, c);
+    },
+
+    // 筛选列表 - 处理人
+    conductorAxios(type, a, b, c) {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_user_list",
+        data: this.qs.stringify({
+          user_type: type, // 用户类型,operator(任务处理人), supervisor(任务监督人), owner(任务发布人)
+          operator_id: a, // 已经选择的任务处理人id
+          supervisor_id: b, // 已经选择的任务监督人id
+          owner_id: c // 已经选择的任务发布人id
+        })
+      })
+        .then(res => {
+          if (res.data.data.length !== 0) {
+            var data = res.data.data;
+            var list = [];
+            data.forEach(item => {
+              var obj = {};
+              obj["value"] = item.user_id;
+              obj["label"] = item.real_name;
+              list.push(obj);
+            });
+            if (type == "operator") {
+              // 任务处理人
+              this.loading2 = false;
+              this.conductorList = list;
+            } else if (type == "owner") {
+              // 任务发布人
+              this.loading3 = false;
+              this.options = list;
+            }
+          }
+        })
+        .catch(err => {});
+    },
+
+    // 重置
+    reset() {
+      this.input = ""; // 处理人
+      this.input2 = ""; // 发布人
+      this.value = ""; // 任务状态
+      this.value2 = ""; // 时间筛选
+      this.startTime = ""; // 开始时间
+      this.endTime = ""; // 结束时间
+      this.tableData = [];
+      this.loading = true;
+      this.tableList();
+    },
+
+    // 下页
+    newPage(page) {
+      this.page = page;
+      this.tableData = [];
+      this.loading = true;
+      this.tableList();
+    },
+
+    // 查看
+    examineDetail(data) {
+      this.$router.push({
+        path: "/index/superviseAdminDetails",
+        query: {
+          id: data.task_id
+        }
+      });
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true;
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.tableList(); // 表格
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.superviseAdmin_box {
+  // 搜索
+  .search_box {
+    display: flex;
+    /deep/.el-select {
+      margin: 0 15px 0 0;
+    }
+    /deep/.el-input {
+      margin: 0 15px 0 0;
+    }
+    .btn_box {
+      margin: 0 0 0 15px;
+    }
+
+    /deep/.el-range-editor--mini.el-input__inner {
+      width: 20%;
+    }
+  }
+
+  a {
+    text-decoration: none;
+  }
+  .reset {
+    color: #1890ff;
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 370 - 0
minggao/src/page/commandCenter/superviseAdminDetails.vue

@@ -0,0 +1,370 @@
+<!--  -->
+<template>
+  <div class="superviseAdminDetails_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <el-row>
+        <!-- 任务信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">
+              <span>任务信息</span>
+              <el-button type="primary" size="mini">监督</el-button>
+            </div>
+
+            <ul class="list_ul">
+              <li class="list_li">
+                <div class="list_div">
+                  <span class="list_div_tlt">任务类型:</span>
+                  <span class="list_div_val">{{ taskObj.task_type }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务监督人:</span>
+                  <span class="list_div_val">{{
+                    taskObj.supervisor_user
+                  }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务时间:</span>
+                  <span class="list_div_val">{{ taskObj.start_time }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务发布人:</span>
+                  <span class="list_div_val">{{ taskObj.owner_user }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务处理人:</span>
+                  <span class="list_div_val">{{ taskObj.operator_user }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务状态:</span>
+                  <span class="list_div_val">{{ taskObj.task_status }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务描述:</span>
+                  <span class="list_div_val">{{ taskObj.tesk_msg }}</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 签到信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">签到信息</div>
+
+            <ul class="list_ul">
+              <li class="list_sing_li">
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到图片:</span>
+                  <p
+                    v-if="taskObj.img_list.length !== 0"
+                    style="display: flex;"
+                  >
+                    <span
+                      class="list_div_img"
+                      v-for="(item, index) in taskObj.img_list"
+                      :key="index"
+                    >
+                      <img v-viewer :src="item" alt="" />
+                    </span>
+                  </p>
+                  <span>暂无签到图片</span>
+                </div>
+
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到时间:</span>
+                  <span class="list_div_val">{{
+                    taskObj.end_time || "暂无"
+                  }}</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务填报信息 -->
+        <el-col :span="24" v-if="taskObj.task_type == '有害生物监测'">
+          <div class="list_box">
+            <div class="list_tlt">任务填报信息</div>
+            <ul class="list_table_ul">
+              <li class="list_li">
+                <el-table :data="tableData" stripe style="width: 100%">
+                  <el-table-column prop="trap_number" label="设备编号">
+                  </el-table-column>
+                  <el-table-column prop="monitor_point" label="监测点">
+                  </el-table-column>
+                  <el-table-column prop="inducer_type" label="诱剂">
+                  </el-table-column>
+                  <el-table-column prop="report_status" label="有害生物登记">
+                    <template slot-scope="scope">
+                      <span
+                        v-if="scope.row.report_status == '已登记'"
+                        @click="examine(scope.row)"
+                        style="color: #409EFF; cursor: pointer;"
+                        >查看</span
+                      >
+                      <span v-else>{{ scope.row.report_status || "无" }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="report_time" label="录入时间">
+                    <template slot-scope="scope">
+                      <span>{{ scope.row.report_time || "无" }}</span>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务汇报 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">任务汇报</div>
+
+            <ul class="list_report_ul">
+              <li class="list_report_li">{{ taskObj.report_msg || "暂无" }}</li>
+            </ul>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 填报信息弹框 -->
+    <el-dialog
+      :title="titleData"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      width="30%"
+    >
+      <ul class="insect_ul">
+        <li
+          class="insect_list"
+          v-for="(item, index) in insectList"
+          :key="index"
+        >
+          <div>{{ item.pest_name + ":" }}</div>
+          <div style="margin: 0 0 0 20px">{{ item.pest_number }}</div>
+        </li>
+      </ul>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 详情总数据
+      taskObj: {},
+
+      // 任务填报信息
+      tableData: [],
+      dialogVisible: false, // 弹框
+      titleData: "", // 弹框标题
+      insectList: [], //害虫列表
+
+      // 任务汇报
+      reportList: [
+        "1、今天做了检测完成任务了没有",
+        "2、途中发生了什么事情",
+        "3、对这次任务有什么总结",
+        "4、我对这次任务有哪些建议"
+      ]
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 详情界面数据
+    detailsData() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_info",
+        data: this.qs.stringify({
+          task_id: this.$route.query.id
+        })
+      })
+        .then(res => {
+          if (res.data.data) {
+            var data = res.data.data;
+            data.img_list = JSON.parse(data.img_list);
+            this.taskObj = data;
+            this.tableData = data.trap_record_list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+          console.log(err);
+        });
+    },
+
+    // 查看
+    examine(data) {
+      this.titleData = "设备编号:" + data.trap_number;
+      this.insectList = data.pest_list;
+      this.dialogVisible = true;
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true; // 加载
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.detailsData(); //详情界面数据
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.superviseAdminDetails_box {
+  // 任务信息
+  .list_box {
+    margin: 0 0 20px 0;
+    .list_tlt {
+      display: flex;
+      justify-content: space-between;
+      width: 95%;
+      margin: 0 auto;
+      font-size: 20px;
+    }
+
+    .list_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+
+      .list_sing_li {
+        display: flex;
+        justify-content: space-between;
+        .list_sing_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          display: flex;
+          color: #333333;
+          .list_div_img {
+            width: 113px;
+            margin: 0 15px 0 0;
+            display: flex;
+            img {
+              width: 100%;
+              height: 100%;
+            }
+          }
+        }
+      }
+    }
+
+    // 任务填报信息
+    .list_table_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      // background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+    }
+
+    // 任务汇报
+    .list_report_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_report_li {
+        font-size: 14px;
+        margin: 0 0 10px 0;
+        color: #333333;
+      }
+    }
+  }
+
+  /deep/.el-table th.el-table__cell {
+    background-color: #f6f8fa;
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+
+  // 害虫弹框
+  .insect_ul {
+    .insect_list {
+      display: flex;
+      margin: 0 0 20px 0;
+      div {
+        font-size: 18px;
+        width: 20%;
+        text-align: right;
+        margin: 0px 0 0 -35px;
+      }
+    }
+  }
+}
+</style>

+ 337 - 0
minggao/src/page/commandCenter/superviseDetails.vue

@@ -0,0 +1,337 @@
+<!--  -->
+<template>
+  <div class="superviseDetails_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <el-row>
+        <!-- 监督信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">
+              <span>监督信息</span>
+              <el-button type="primary" size="mini">监督</el-button>
+            </div>
+
+            <ul class="list_ul">
+              <li class="list_li">
+                <div class="list_div">
+                  <span class="list_div_tlt">督查人:</span>
+                  <span class="list_div_val">有害生物</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务监督人:</span>
+                  <span class="list_div_val">胡军</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监督时间:</span>
+                  <span class="list_div_val">2022-01-14 16:00:00</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监督形式:</span>
+                  <span class="list_div_val">胡适</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监督单位:</span>
+                  <span class="list_div_val">刑天</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监督情况:</span>
+                  <span class="list_div_val">已完成</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">
+              <span>任务信息</span>
+              <el-button type="primary" size="mini">监督</el-button>
+            </div>
+
+            <ul class="list_ul">
+              <li class="list_li">
+                <div class="list_div">
+                  <span class="list_div_tlt">任务类型:</span>
+                  <span class="list_div_val">有害生物</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务监督人:</span>
+                  <span class="list_div_val">胡军</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务时间:</span>
+                  <span class="list_div_val">2022-01-14 16:00:00</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务发布人:</span>
+                  <span class="list_div_val">胡适</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务处理人:</span>
+                  <span class="list_div_val">刑天</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务状态:</span>
+                  <span class="list_div_val">已完成</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务类型:</span>
+                  <span class="list_div_val"
+                    >去安徽监测点的诱捕器虫类手机一下,记得拍照</span
+                  >
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 签到信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">签到信息</div>
+
+            <ul class="list_ul">
+              <li class="list_sing_li">
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到图片:</span>
+                  <span class="list_div_img">
+                    <img src="../../assets/images/newImg/12.jpg" alt="" />
+                  </span>
+                  <span class="list_div_img">
+                    <img src="../../assets/images/newImg/12.jpg" alt="" />
+                  </span>
+                </div>
+
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到时间:</span>
+                  <span class="list_div_val">2022-2-8 12:00:00</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务填报信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">任务填报信息</div>
+            <ul class="list_table_ul">
+              <li class="list_li">
+                <el-table :data="tableData" stripe style="width: 100%">
+                  <el-table-column prop="date" label="日期" width="180">
+                  </el-table-column>
+                  <el-table-column prop="name" label="姓名" width="180">
+                  </el-table-column>
+                  <el-table-column prop="address" label="地址">
+                  </el-table-column>
+                </el-table>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务汇报 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">任务汇报</div>
+
+            <ul class="list_report_ul">
+              <li class="list_report_li" v-for="item in reportList" :key="item">
+                {{ item }}
+              </li>
+            </ul>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 任务填报信息
+      tableData: [
+        {
+          date: "2016-05-02",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1518 弄"
+        },
+        {
+          date: "2016-05-04",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1517 弄"
+        },
+        {
+          date: "2016-05-01",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1519 弄"
+        },
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          address: "上海市普陀区金沙江路 1516 弄"
+        }
+      ],
+
+      // 任务汇报
+      reportList: [
+        "1、今天做了检测完成任务了没有",
+        "2、途中发生了什么事情",
+        "3、对这次任务有什么总结",
+        "4、我对这次任务有哪些建议"
+      ]
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {},
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.superviseDetails_box {
+  // 任务信息
+  .list_box {
+    margin: 0 0 20px 0;
+    .list_tlt {
+      display: flex;
+      justify-content: space-between;
+      width: 95%;
+      margin: 0 auto;
+      font-size: 20px;
+    }
+
+    .list_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+
+      .list_sing_li {
+        display: flex;
+        justify-content: space-between;
+        .list_sing_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          display: flex;
+          color: #333333;
+          .list_div_img {
+            width: 113px;
+            margin: 0 15px 0 0;
+            display: flex;
+            img {
+              width: 100%;
+              height: 100%;
+            }
+          }
+        }
+      }
+    }
+
+    // 任务填报信息
+    .list_table_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      // background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+    }
+
+    // 任务汇报
+    .list_report_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_report_li {
+        font-size: 14px;
+        margin: 0 0 10px 0;
+        color: #333333;
+      }
+    }
+  }
+
+  /deep/.el-table th.el-table__cell {
+    background-color: #f6f8fa;
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 338 - 0
minggao/src/page/commandCenter/superviseLog.vue

@@ -0,0 +1,338 @@
+<!--  -->
+<template>
+  <div class="superviseLog_box">
+    <el-card :style="'height:' + fullHeight + 'px'">
+      <el-row>
+        <el-col>
+          <div class="search_box">
+            <!-- 监测人员 -->
+            <el-select
+              filterable
+              v-model="input"
+              clearable
+              @change="searchData"
+              placeholder="请选择监测人员"
+              size="mini"
+            >
+              <el-option
+                v-for="item in conductorList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+
+            <!-- 时间筛选 -->
+            <el-date-picker
+              size="mini"
+              v-model="value"
+              @change="searchData"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+            >
+            </el-date-picker>
+
+            <div class="btn_box">
+              <el-button type="primary" size="mini" @click="searchData"
+                >搜索</el-button
+              >
+              <el-button size="mini" @click="reset">重置</el-button>
+              <el-button type="primary" size="mini" @click="exportData">
+                <i v-if="loadingShow" class="el-icon-loading"></i>
+                导出数据</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+
+      <!-- 表格 -->
+      <el-table
+        :data="tableData"
+        v-loading="loading"
+        stripe
+        style="width: 100%"
+      >
+        <el-table-column prop="ind" label="序号" width="180"> </el-table-column>
+        <el-table-column prop="owner_user" label="监测人员" width="180">
+        </el-table-column>
+        <el-table-column prop="monitor_time" label="监测时间">
+        </el-table-column>
+        <el-table-column prop="weather" label="天气"> </el-table-column>
+        <el-table-column prop="temperature" label="温度"> </el-table-column>
+        <el-table-column prop="address" label="地点"> </el-table-column>
+        <el-table-column prop="monitor_time" label="提交时间">
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <a
+              href="javascript:;"
+              class="reset"
+              @click="examineDetail(scope.row)"
+              >查看</a
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <el-pagination
+        style="margin: 60px 0 0 0"
+        :page-size="10"
+        @current-change="newPage"
+        :current-page="page"
+        v-if="tableData.length > 0"
+        background
+        layout="prev, pager, next, jumper"
+        :total="tableSum"
+      >
+      </el-pagination>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 筛选
+      conductorList: [], // 监测人员 - 筛选列表
+      input: "", // 监测人员
+      value: "", // 时间筛选
+      startTime: "", //开始时间
+      endTime: "", // 结束时间
+      loadingShow: false, // 导出加载
+
+      // 表格
+      tableData: [],
+      loading: false, // 加载
+
+      // 分页
+      page: 1, // 当前页码
+      tableSum: 0 // 总页码
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 表格列表
+    tableList() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.monitor_log_list",
+        data: this.qs.stringify({
+          page: this.page, // 当前页码
+          page_item: "10", //
+          monitor_user_id: "", // 监测人id
+          start_time: this.startTime, // 开始时间
+          end_time: this.endTime // 结束时间
+        })
+      })
+        .then(res => {
+          if (res.data.data.total_item !== 0) {
+            var data = res.data.data.page_list;
+            this.tableSum = res.data.data.total_item;
+            var list = [];
+            data.forEach((item, index) => {
+              item.ind = index + 1;
+              item.temperature =
+                item.temperature !== "" || item.temperature !== undefined
+                  ? item.temperature + "°C"
+                  : "暂无";
+              list.push(item);
+            });
+            this.tableData = list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+        });
+    },
+
+    // 筛选列表 - 监测人员
+    conductorAxios() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_user_list",
+        data: this.qs.stringify({
+          user_type: "supervisor", // 用户类型,operator(任务处理人), supervisor(任务监督人), owner(任务发布人)
+          operator_id: "", // 已经选择的任务处理人id
+          supervisor_id: "", // 已经选择的任务监督人id
+          owner_id: "" // 已经选择的任务发布人id
+        })
+      })
+        .then(res => {
+          if (res.data.data.length !== 0) {
+            var data = res.data.data;
+            var list = [];
+            data.forEach(item => {
+              var obj = {};
+              obj["value"] = item.user_id;
+              obj["label"] = item.real_name;
+              list.push(obj);
+            });
+            this.conductorList = list;
+          }
+        })
+        .catch(err => {});
+    },
+
+    // 筛选
+    searchData() {
+      if (this.value) {
+        this.startTime = this.formatTime(this.value[0], "yyyy-MM-dd");
+        this.endTime = this.formatTime(this.value[1], "yyyy-MM-dd");
+      } else {
+        this.startTime = "";
+        this.endTime = "";
+      }
+      this.loading = true;
+      this.tableData = [];
+      this.tableList();
+    },
+
+    // 重置
+    reset() {
+      this.input = ""; // 监测人员
+      this.value = ""; // 时间筛选
+      this.startTime = ""; // 开始时间
+      this.endTime = ""; // 结束时间
+      this.tableData = [];
+      this.loading = true;
+      this.tableList();
+    },
+
+    // 下页
+    newPage(page) {
+      this.page = page;
+      this.tableList();
+    },
+
+    // 查看
+    examineDetail(data) {
+      this.$router.push({
+        path: "/index/superviseLogDetails",
+        query: {
+          id: data.id
+        }
+      });
+    },
+
+    // 导出数据
+    exportData() {
+      this.loadingShow = true;
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.monitor_log_export",
+        responseType: "blob"
+      })
+        .then(res => {
+          this.downloadFile(res, "监测日志.xls");
+          this.loadingShow = false;
+        })
+        .catch(err => {
+          this.loadingShow = false;
+          // console.log(err);
+        });
+    },
+
+    // 流文件下载
+    downloadFile(res, name) {
+      let link = document.createElement("a");
+      link.href = window.URL.createObjectURL(new Blob([res.data]));
+      link.target = "_blank";
+      // 文件名和格式
+      link.download = name;
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true;
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.tableList(); // 表格列表数据
+    this.conductorAxios(); // 筛选 - 监测人员列表
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.superviseLog_box {
+  // 搜索
+  .search_box {
+    display: flex;
+    /deep/.el-select {
+      margin: 0 15px 0 0;
+    }
+    /deep/.el-input {
+      margin: 0 15px 0 0;
+    }
+    .btn_box {
+      margin: 0 0 0 15px;
+    }
+
+    /deep/.el-range-editor--mini.el-input__inner {
+      width: 20%;
+    }
+  }
+
+  a {
+    text-decoration: none;
+  }
+  .reset {
+    color: #1890ff;
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 235 - 0
minggao/src/page/commandCenter/superviseLogDetails.vue

@@ -0,0 +1,235 @@
+<!--  -->
+<template>
+  <div class="superviseLogDetails_box">
+    <el-card :style="'height:' + fullHeight + 'px'" v-loading="loading">
+      <el-row>
+        <!-- 监督信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">
+              <span>监督信息</span>
+            </div>
+
+            <ul class="list_ul">
+              <li class="list_li">
+                <div class="list_div">
+                  <span class="list_div_tlt">监测人员:</span>
+                  <span class="list_div_val">{{
+                    superviseList.owner_user
+                  }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监督时间:</span>
+                  <span class="list_div_val">{{
+                    superviseList.monitor_time
+                  }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">提交时间:</span>
+                  <span class="list_div_val">{{
+                    superviseList.create_time
+                  }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">天气:</span>
+                  <span class="list_div_val">{{ superviseList.weather }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">监测地点:</span>
+                  <span class="list_div_val">{{ superviseList.address }}</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 监测内容 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">监测内容</div>
+            <ul class="list_table_ul">
+              <li class="list_li">
+                <el-table :data="tableData" style="width: 100%">
+                  <el-table-column prop="title" label="事项"></el-table-column>
+                  <el-table-column
+                    prop="message"
+                    label="内容"
+                  ></el-table-column>
+                  <el-table-column prop="img_list" label="图像信息">
+                    <template slot-scope="scope">
+                      <span
+                        class="span_img"
+                        v-if="scope.row.img_list.length !== 0"
+                      >
+                        <img
+                          :src="item"
+                          alt=""
+                          v-for="item in scope.row.img_list"
+                          :key="item"
+                        />
+                      </span>
+                      <span v-else>暂无图像信息</span>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 监督信息
+      superviseList: {},
+      // 监测内容
+      tableData: [],
+      loading: false // 加载
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 详情界面数据
+    detailsData() {
+      console.log(this.$route.query.id);
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.monitor_log_info",
+        data: this.qs.stringify({
+          record_id: this.$route.query.id
+        })
+      })
+        .then(res => {
+          if (res.data.data.total_item !== 0) {
+            var data = res.data.data;
+            this.superviseList = data.monitor_info; // 监督信息
+            var list = [];
+            data.page_list.forEach(item => {
+              item.img_list = JSON.parse(item.img_list);
+              list.push(item);
+            });
+            this.tableData = list; // 监测内容
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+        });
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true;
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.detailsData(); // 详情界面数据
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.superviseLogDetails_box {
+  // 监督信息
+  .list_box {
+    margin: 0 0 20px 0;
+    .list_tlt {
+      display: flex;
+      justify-content: space-between;
+      width: 95%;
+      margin: 0 auto;
+      font-size: 20px;
+    }
+
+    .list_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+          .list_div_tlt {
+            text-align: right;
+            width: 78px;
+            display: inline-block;
+          }
+        }
+      }
+    }
+
+    // 监测内容
+    .list_table_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+    }
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1256 - 0
minggao/src/page/commandCenter/taskRegulator.vue


+ 376 - 0
minggao/src/page/commandCenter/taskRegulatorDetails.vue

@@ -0,0 +1,376 @@
+<!--  -->
+<template>
+  <div class="taskRegulatorDetails_box">
+    <el-card :style="'height:' + fullHeight + 'px'" v-loading="loading">
+      <el-row>
+        <!-- 任务信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">
+              <span>任务信息</span>
+            </div>
+
+            <ul class="list_ul">
+              <li class="list_li">
+                <div class="list_div">
+                  <span class="list_div_tlt">任务类型:</span>
+                  <span class="list_div_val">{{ taskObj.task_type }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务监督人:</span>
+                  <span class="list_div_val">{{
+                    taskObj.supervisor_user
+                  }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务时间:</span>
+                  <span class="list_div_val">{{ taskObj.start_time }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务发布人:</span>
+                  <span class="list_div_val">{{ taskObj.owner_user }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务处理人:</span>
+                  <span class="list_div_val">{{ taskObj.operator_user }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务状态:</span>
+                  <span class="list_div_val">{{ taskObj.task_status }}</span>
+                </div>
+
+                <div class="list_div">
+                  <span class="list_div_tlt">任务描述:</span>
+                  <span class="list_div_val">{{ taskObj.tesk_msg }}</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 签到信息 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">签到信息</div>
+
+            <ul class="list_ul">
+              <li class="list_sing_li">
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到图片:</span>
+                  <p
+                    v-if="taskObj.img_list.length !== 0"
+                    style="display: flex;"
+                  >
+                    <span
+                      class="list_div_img"
+                      v-for="(item, index) in taskObj.img_list"
+                      :key="index"
+                    >
+                      <img v-viewer :src="item" alt="" />
+                    </span>
+                  </p>
+                  <span v-else>暂无签到图片</span>
+                </div>
+
+                <div class="list_sing_div">
+                  <span class="list_div_tlt">签到时间:</span>
+                  <span class="list_div_val">{{
+                    taskObj.end_time || "暂无"
+                  }}</span>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务填报信息 -->
+        <el-col :span="24" v-if="taskObj.task_type == '有害生物监测'">
+          <div class="list_box">
+            <div class="list_tlt">任务填报信息</div>
+            <ul class="list_table_ul">
+              <li class="list_li">
+                <el-table :data="tableData" stripe style="width: 100%">
+                  <el-table-column prop="trap_number" label="设备编号">
+                  </el-table-column>
+                  <el-table-column prop="monitor_point" label="监测点">
+                  </el-table-column>
+                  <el-table-column prop="inducer_type" label="诱剂">
+                  </el-table-column>
+                  <el-table-column prop="report_status" label="有害生物登记">
+                    <template slot-scope="scope">
+                      <span
+                        v-if="scope.row.report_status == '已登记'"
+                        @click="examine(scope.row)"
+                        style="color: #409EFF; cursor: pointer;"
+                        >查看</span
+                      >
+                      <span v-else>{{ scope.row.report_status || "无" }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="report_time" label="录入时间">
+                    <template slot-scope="scope">
+                      <span>{{ scope.row.report_time || "无" }}</span>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </li>
+            </ul>
+          </div>
+        </el-col>
+
+        <!-- 任务汇报 -->
+        <el-col :span="24">
+          <div class="list_box">
+            <div class="list_tlt">任务汇报</div>
+
+            <ul class="list_report_ul">
+              <!-- <li
+                class="list_report_li"
+                v-for="item in tabskObj.report_msg"
+                :key="item"
+              >
+                {{ item }}
+              </li> -->
+              <li class="list_report_li">{{ taskObj.report_msg || "暂无" }}</li>
+            </ul>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 填报信息弹框 -->
+    <el-dialog
+      :title="titleData"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      width="30%"
+    >
+      <ul class="insect_ul">
+        <li
+          class="insect_list"
+          v-for="(item, index) in insectList"
+          :key="index"
+        >
+          <div>{{ item.pest_name + ":" }}</div>
+          <div style="margin: 0 0 0 20px">{{ item.pest_number }}</div>
+        </li>
+      </ul>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      fullHeight: document.documentElement.clientHeight - 116, //
+
+      // 详情总数据
+      taskObj: {},
+
+      // 任务填报信息
+      tableData: [],
+      dialogVisible: false, // 弹框
+      titleData: "", // 弹框标题
+      insectList: [], //害虫列表
+
+      // 任务汇报
+      reportList: [
+        "1、今天做了检测完成任务了没有",
+        "2、途中发生了什么事情",
+        "3、对这次任务有什么总结",
+        "4、我对这次任务有哪些建议"
+      ],
+      loading: false // 加载
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {
+    fullHeight(val) {
+      //监控浏览器高度变化
+      if (!this.timer) {
+        this.fullHeight = val;
+        this.timer = true;
+        let that = this;
+        setTimeout(function() {
+          //防止过度调用监测事件,导致卡顿
+          that.timer = false;
+        }, 400);
+      }
+    }
+  },
+  //方法集合
+  methods: {
+    //动态获取浏览器高度
+    get_boderHeight() {
+      const that = this;
+      window.onresize = () => {
+        return (() => {
+          window.fullHeight = document.documentElement.clientHeight;
+          that.fullHeight = window.fullHeight;
+        })();
+      };
+    },
+
+    // 详情界面数据
+    detailsData() {
+      this.$axios({
+        method: "POST",
+        url: "/api/api_gateway?method=control_center.task.task_info",
+        data: this.qs.stringify({
+          task_id: this.$route.query.id
+        })
+      })
+        .then(res => {
+          if (res.data.data) {
+            var data = res.data.data;
+            data.img_list = JSON.parse(data.img_list);
+            this.taskObj = data;
+            this.tableData = data.trap_record_list;
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+          console.log(err);
+        });
+    },
+
+    // 查看
+    examine(data) {
+      this.titleData = "设备编号:" + data.trap_number;
+      this.insectList = data.pest_list;
+      this.dialogVisible = true;
+    }
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.loading = true; // 加载
+    this.get_boderHeight(); // 动态获取浏览器高度
+    this.detailsData(); //详情界面数据
+  },
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang="less" scoped>
+.taskRegulatorDetails_box {
+  // 任务信息
+  .list_box {
+    margin: 0 0 20px 0;
+    .list_tlt {
+      display: flex;
+      justify-content: space-between;
+      width: 95%;
+      margin: 0 auto;
+      font-size: 20px;
+    }
+
+    .list_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+
+      .list_sing_li {
+        display: flex;
+        justify-content: space-between;
+        .list_sing_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          display: flex;
+          color: #333333;
+          .list_div_img {
+            width: 113px;
+            margin: 0 15px 0 0;
+            display: flex;
+            img {
+              width: 100%;
+              height: 100%;
+            }
+          }
+        }
+      }
+    }
+
+    // 任务填报信息
+    .list_table_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      // background: #f6f8fa;
+      .list_li {
+        display: flex;
+        flex-wrap: wrap;
+        .list_div {
+          margin: 0 0 25px 0;
+          width: 33%;
+          font-size: 14px;
+          color: #333333;
+        }
+      }
+    }
+
+    // 任务汇报
+    .list_report_ul {
+      margin: 20px 0 0 0;
+      padding: 20px 40px 20px 40px;
+      background: #f6f8fa;
+      .list_report_li {
+        font-size: 14px;
+        margin: 0 0 10px 0;
+        color: #333333;
+      }
+    }
+  }
+
+  /deep/.el-table th.el-table__cell {
+    background-color: #f6f8fa;
+  }
+
+  /deep/.el-card {
+    overflow: hidden;
+    overflow-y: auto;
+  }
+
+  // 害虫弹框
+  .insect_ul {
+    .insect_list {
+      display: flex;
+      margin: 0 0 20px 0;
+      div {
+        font-size: 18px;
+        width: 20%;
+        text-align: right;
+        margin: 0px 0 0 -35px;
+      }
+    }
+  }
+}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 248 - 237
minggao/src/page/forecasting/cbd/PestsStats.vue


+ 2 - 0
minggao/src/page/home/index.vue

@@ -153,6 +153,8 @@ export default {
         this.infodata = res.data.data.children;
         console.log(this.routerdata);
         // this.infodata.shift();
+        localStorage.setItem('userID', res.data.data.im_user_id) // 存储当前登录账号的ID
+        this.infodata.shift();
         this.username = res.data.data.username;
         localStorage.setItem("usernme", this.username);
         this.routemap(this.routerdata);

+ 13 - 5
minggao/src/page/systemmanger/customsManger.vue

@@ -40,7 +40,7 @@
       ></tree-table>
 
       <!-- 分页 -->
-      <el-pagination
+      <!-- <el-pagination
         style="position: absolute; bottom: 0; left: 50%"
         :page-size="10"
         @current-change="newPage"
@@ -50,6 +50,17 @@
         layout="prev, pager, next, jumper"
         :total="tableSum"
       >
+      </el-pagination> -->
+
+      <el-pagination
+        :page-size="10"
+        @current-change="newPage"
+        :current-page="page"
+        v-if="treeDataSource.length > 0"
+        background
+        layout="prev, pager, next, jumper"
+        :total="tableSum"
+      >
       </el-pagination>
     </el-card>
 
@@ -274,7 +285,6 @@ export default {
 
     // 请求下页数据
     newPage(page) {
-      // console.log(page);
       this.page = page;
       this.tabListData();
     },
@@ -364,7 +374,6 @@ export default {
         }),
       })
         .then((res) => {
-          // console.log(res.data.data);
           if (res.data.data.total_item !== 0) {
             this.treeDataSource = res.data.data.page_list;
             this.tableSum = res.data.data.total_item;
@@ -374,7 +383,6 @@ export default {
           }
         })
         .catch((err) => {
-          // console.log(err);
         });
     },
 
@@ -400,7 +408,7 @@ export default {
 </script>
 <style lang='less' scoped>
 .customsManger_box {
-  /deep/.el-card__body {
+  /deep/.el-card {
     overflow: hidden;
     overflow-y: auto;
   }

+ 5 - 4
minggao/src/page/systemmanger/userManger.vue

@@ -200,6 +200,7 @@
               value: 'id',
               emitPath: false,
               children: 'childrens',
+              checkStrictly: true,
             }"
             clearable
           ></el-cascader>
@@ -216,6 +217,7 @@
               label: 'role_name',
               multiple: true,
               emitPath: false,
+              checkStrictly: true,
             }"
             clearable
           ></el-cascader>
@@ -311,9 +313,7 @@ export default {
         user: "", //账号
         password: "", // 密码
         name: "", // 姓名
-        judge: [
-          [3, 4, 7],
-        ], // 隶属海关
+        judge: [], // 隶属海关
         role: [], //角色
         phone: "", // 手机号码
         mailbox: "", //邮箱
@@ -698,8 +698,9 @@ export default {
         .catch((err) => {});
     },
     judgeData(item) {
-      console.log(item);
+      // console.log(item);
       this.form.judge = item;
+      console.log(this.form.judge)
     },
     roleChange(item) {
       this.form.role = item;

+ 76 - 10
minggao/src/router/index.js

@@ -12,9 +12,6 @@ import facilitydistribute from '@/page/homepage/facilitydistribute'//设备分
 
 import pestdistribute from '@/page/homepage/pestdistribute'//有害生物分布
 //---------------------------------------系统管理----------------------------------------------------
-// const customsManger = () => import('@/Page/systemmanger/customsManger')
-// const role = () => import('@/Page/systemmanger/role')
-// const motif = () => import('@/Page/systemmanger/motif')
 const customsManger = () => import('@/Page/systemmanger/customsManger') //隶属海关
 const role = () => import('@/Page/systemmanger/role') // 角色管理
 const motif = () => import('@/Page/systemmanger/motif') // 主题定制
@@ -24,6 +21,15 @@ const dayRecord = () => import('@/Page/systemmanger/dayRecord') // 用户管理
 
 //---------------------------------------指挥中心----------------------------------------------------
 const realTime = () => import('@/Page/commandCenter/realTime') //实时通信
+const laboratory = () => import('@/Page/commandCenter/laboratory') //实验室识别
+const taskRegulator = () => import('@/Page/commandCenter/taskRegulator') //任务管理
+const taskRegulatorDetails = () => import('@/Page/commandCenter/taskRegulatorDetails') //任务管理 - 详情
+const superviseAdmin = () => import('@/Page/commandCenter/superviseAdmin') //监督管理
+const superviseAdminDetails = () => import('@/Page/commandCenter/superviseAdminDetails') //监督管理 - 详情
+const supervise = () => import('@/Page/commandCenter/supervise') //监督记录
+const superviseDetails = () => import('@/Page/commandCenter/superviseDetails') //监督记录 - 详情
+const superviseLog = () => import('@/Page/commandCenter/superviseLog') //监测日志
+const superviseLogDetails = () => import('@/Page/commandCenter/superviseLogDetails') //监测日志 - 详情
 
 // *****************测报系统**********************
 import cbd from '@/page/forecasting/cbd/Cbd'//首页
@@ -32,22 +38,19 @@ import DataPhotos from '@/page/forecasting/cbd/cbdDataPhotos'//图片详情
 import PestsStats from '@/page/forecasting/cbd/pestsStats'//害虫统计
 import tongji from '@/page/forecasting/cbd/tongji'//害虫分析
 import deviceTongji from '@/page/forecasting/cbd/deviceTongji'//害虫排行
-
 // ********************监控**************************
 import monitor from '@/page/monitor/Monitor'
 import photoView from '@/page/monitor/PhotoView'
 //*********************诱捕器系统********************
-import trap from '@/page/forecasting/trap/trap'//诱捕器
-import fillinrecord from '@/page/forecasting/trap/fillinrecord'//填报记录
-import bait from '@/page/forecasting/trap/bait'//诱剂维护
-
 import maintain from '@/page/forecasting/maintain/maintain'//监测点维护
+import trap from '@/page/forecasting/trap/trap' //诱捕器
+import fillinrecord from '@/page/forecasting/trap/fillinrecord' //填报记录
+import bait from '@/page/forecasting/trap/bait' //诱剂维护
 
 Vue.use(Router)
 
 export default new Router({
-  routes: [
-    {
+  routes: [{
       path: '/',
       name: 'Login',
       component: Login
@@ -135,6 +138,69 @@ export default new Router({
             title: '实时通信'
           }
         },
+        {
+          path: 'laboratory',
+          component: laboratory,
+          meta: {
+            title: '实验室识别'
+          }
+        },
+        {
+          path: 'taskRegulator',
+          component: taskRegulator,
+          meta: {
+            title: '任务管理'
+          }
+        },
+        {
+          path: 'taskRegulatorDetails',
+          component: taskRegulatorDetails,
+          meta: {
+            title: '任务管理详情'
+          }
+        },
+        {
+          path: 'superviseAdmin',
+          component: superviseAdmin,
+          meta: {
+            title: '监督管理'
+          }
+        },
+        {
+          path: 'superviseAdminDetails',
+          component: superviseAdminDetails,
+          meta: {
+            title: '监督管理详情'
+          }
+        },
+        {
+          path: 'supervise',
+          component: supervise,
+          meta: {
+            title: '监督记录'
+          }
+        },
+        {
+          path: 'superviseDetails',
+          component: superviseDetails,
+          meta: {
+            title: '监督记录详情'
+          }
+        },
+        {
+          path: 'superviseLog',
+          component: superviseLog,
+          meta: {
+            title: '监测日志'
+          }
+        },
+        {
+          path: 'superviseLogDetails',
+          component: superviseLogDetails,
+          meta: {
+            title: '监测日志详情'
+          }
+        },
         //------------------指挥中心--------------------------
         {
           path: 'cbd',

BIN
minggao/static/images/realTime/6.png


BIN
minggao/static/images/realTime/7.png