East 4 gadi atpakaļ
vecāks
revīzija
427bbfb5d9

+ 11 - 30
package-lock.json

@@ -5698,8 +5698,7 @@
         },
         "ansi-regex": {
           "version": "2.1.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "aproba": {
           "version": "1.2.0",
@@ -5717,13 +5716,11 @@
         },
         "balanced-match": {
           "version": "1.0.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
-          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -5736,18 +5733,15 @@
         },
         "code-point-at": {
           "version": "1.1.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "concat-map": {
           "version": "0.0.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "console-control-strings": {
           "version": "1.1.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -5850,8 +5844,7 @@
         },
         "inherits": {
           "version": "2.0.3",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "ini": {
           "version": "1.3.5",
@@ -5861,7 +5854,6 @@
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
-          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -5874,20 +5866,17 @@
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
-          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
         "minimist": {
           "version": "0.0.8",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
-          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -5904,7 +5893,6 @@
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
-          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -5977,8 +5965,7 @@
         },
         "number-is-nan": {
           "version": "1.0.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -5988,7 +5975,6 @@
         "once": {
           "version": "1.4.0",
           "bundled": true,
-          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -6064,8 +6050,7 @@
         },
         "safe-buffer": {
           "version": "5.1.2",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "safer-buffer": {
           "version": "2.1.2",
@@ -6095,7 +6080,6 @@
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
-          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -6113,7 +6097,6 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
-          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -6152,13 +6135,11 @@
         },
         "wrappy": {
           "version": "1.0.2",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "yallist": {
           "version": "3.0.3",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         }
       }
     },

+ 7 - 4
src/utils/httpRequest.js

@@ -5,9 +5,11 @@ import qs from 'qs'
 import merge from 'lodash/merge'
 import { clearLoginInfo } from '@/utils'
 
-var cookies = document.cookie.split(' ')
-var cookie = cookies[1].split('=')
-var farmId = cookie[1]
+// var cookies = document.cookie.split(' ')
+// var cookie = cookies[1].split('=')
+// var farmId = cookie[1]
+let farmId = localStorage.getItem('farmId');
+
 
 const http = axios.create({
   timeout: 1000 * 30,
@@ -56,7 +58,8 @@ http.adornUrl = (actionName) => {
  */
 http.adornParams = (params = {}, openDefultParams = true) => {
   var defaults = {
-    't': new Date().getTime()
+    't': new Date().getTime(),
+    'farmId': farmId
   }
   return openDefultParams ? merge(defaults, params) : params
 }

+ 1 - 0
src/utils/index.js

@@ -54,5 +54,6 @@ export function treeDataTranslate (data, id = 'id', pid = 'parentId') {
 export function clearLoginInfo () {
   Vue.cookie.delete('token')
   store.commit('resetStore')
+  localStorage.removeItem('farmId')
   router.options.isAddDynamicMenuRoutes = false
 }

+ 1 - 0
src/views/common/login.vue

@@ -82,6 +82,7 @@
               if (data && data.code === 0) {
                 this.$cookie.set('token', data.token)
                 this.$cookie.set('farmId', data.farmId)
+                localStorage.setItem('farmId', data.farmId)
                 this.$router.replace({ name: 'home' })
               } else {
                 this.getCaptcha()

+ 373 - 0
src/views/modules/alarm/indoor.vue

@@ -0,0 +1,373 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0" @change="farmChange">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="猪舍" v-model="form.pigstyId" @change="pigstyChange">
+                <el-option
+                  v-for="item in pigstySelectedList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="报警类型" v-model="form.warningType">
+                <el-option
+                  v-for="item in thresholdTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="nowDate"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              prop="pigstyName"
+              header-align="center"
+              align="center"
+              label="猪舍">
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="报警类型">
+              <template slot-scope="scope">
+                <span>{{thresholdTypes[scope.row.warningType - 1].label}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="nowValue"
+              header-align="center"
+              align="center"
+              label="当前数值">
+            </el-table-column>
+            <el-table-column
+              prop="warningTime"
+              header-align="center"
+              align="center"
+              label="报警时间">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  style="color: rgb(24,144,255)"
+                  @click="verifyHandle(scope.row.id)">
+                  处理确认
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+          <!-- 弹窗, 新增 / 修改 -->
+          <verify v-if="verifyVisible" ref="verify" @refreshDataList="getDataList" :thresholdTypes="thresholdTypes"></verify>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import verify from './verify'
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          pigstyId: '',
+          time: [],
+          warningType: ''
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        pigstyList: [], // 猪舍List
+        pigstySelectedList: [], // 根据牧场限制的猪舍SelectedList
+        labelPosition: 'right',
+        thresholdTypes: [
+          {
+            label: '高温',
+            value: 1
+          },
+          {
+            label: '低温',
+            value: 2
+          },
+          {
+            label: '空气污染',
+            value: 3
+          }
+        ],
+        verifyVisible: false, // 弹窗是否显示
+        pigsty: {
+          farmId: '',
+          pigstyId: ''
+        }
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    components: {
+      verify
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/warningInfo/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'pigstyId': this.pigstyId || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined,
+            'belongTo': 1,
+            'warningType': this.form.warningType || undefined
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            console.log(data);
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          // 栋舍List
+          this.pigstyList = []
+          let pigstyList = []
+          let pigstyR = await this.$http({
+            url: this.$http.adornUrl("/management/pigsty/findAll"),
+            method: "get"
+          })
+          pigstyR.data.all && (pigstyList = pigstyR.data.all)
+          pigstyList.forEach(pigsty => {
+            let item = {
+              value: pigsty.id,
+              label: pigsty.number,
+              farmId: pigsty.farmId
+            }
+            this.pigstyList.push(item)
+          })
+          this.pigstySelectedList = this.pigstyList
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 根据牧场选择限制猪舍
+      farmChange (val) {
+        this.pigstySelectedList = this.pigstyList.filter(item => item.farmId === val)
+        if (this.pigsty.farmId === val) {
+          return
+        }
+        this.form.pigstyId = ''
+      },
+      // 根据猪舍选择确定牧场
+      pigstyChange (val) {
+        for (let pigsty of this.pigstyList) {
+          if (pigsty.value === val) {
+            this.form.farmId = pigsty.farmId
+            this.pigsty.farmId = pigsty.farmId
+            this.pigsty.pigstyId = val
+            break
+          }
+        }
+        this.farmChange(this.form.farmId)
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.pigstyId = ''
+        this.form.time = []
+        this.form.warningType = ''
+        this.pigstySelectedList = this.pigstyList
+      },
+      // 确认处理
+      verifyHandle (id) {
+        this.verifyVisible = true
+        this.$nextTick(() => {
+          this.$refs.verify.init(id)
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 316 - 0
src/views/modules/alarm/meteo.vue

@@ -0,0 +1,316 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="报警类型" v-model="form.warningType">
+                <el-option
+                  v-for="item in thresholdTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="nowDate"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              prop="pigstyName"
+              header-align="center"
+              align="center"
+              label="猪舍">
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="报警类型">
+              <template slot-scope="scope">
+                <span>{{thresholdTypes[scope.row.warningType - 5].label}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="nowValue"
+              header-align="center"
+              align="center"
+              label="当前数值">
+            </el-table-column>
+            <el-table-column
+              prop="warningTime"
+              header-align="center"
+              align="center"
+              label="报警时间">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  style="color: rgb(24,144,255)"
+                  @click="verifyHandle(scope.row.id)">
+                  处理确认
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+          <!-- 弹窗, 新增 / 修改 -->
+          <verify v-if="verifyVisible" ref="verify" @refreshDataList="getDataList" :thresholdTypes="thresholdTypes"></verify>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import verify from './verify'
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          time: [],
+          warningType: ''
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        labelPosition: 'right',
+        thresholdTypes: [
+          {
+            label: '高温',
+            value: 5
+          },
+          {
+            label: '低温',
+            value: 6
+          },
+          {
+            label: '空气污染',
+            value: 7
+          }
+        ],
+        verifyVisible: false, // 弹窗是否显示
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    components: {
+      verify
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/warningInfo/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined,
+            'belongTo': 2,
+            'warningType': this.form.warningType || undefined
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            console.log(data);
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.time = []
+        this.form.warningType = ''
+      },
+      // 确认处理
+      verifyHandle (id) {
+        this.verifyVisible = true
+        this.$nextTick(() => {
+          this.$refs.verify.init(id)
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 381 - 0
src/views/modules/alarm/temp.vue

@@ -0,0 +1,381 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 180px">
+              <el-input placeholder="耳标" v-model="form.earTag"></el-input>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0" @change="farmChange">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="猪舍" v-model="form.pigstyId" @change="pigstyChange">
+                <el-option
+                  v-for="item in pigstySelectedList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="报警类型" v-model="form.warningType">
+                <el-option
+                  v-for="item in thresholdTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button  @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="nowDate"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="earTag"
+              header-align="center"
+              align="center"
+              label="耳标">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              prop="pigstyName"
+              header-align="center"
+              align="center"
+              label="猪舍">
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="报警类型">
+              <template slot-scope="scope">
+                <span>{{thresholdTypes[scope.row.warningType - 8].label}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="nowValue"
+              header-align="center"
+              align="center"
+              label="当前数值">
+            </el-table-column>
+            <el-table-column
+              prop="warningTime"
+              header-align="center"
+              align="center"
+              label="报警时间">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  style="color: rgb(24,144,255)"
+                  @click="verifyHandle(scope.row.id)">
+                  处理确认
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+          <!-- 弹窗, 新增 / 修改 -->
+          <verify v-if="verifyVisible" ref="verify" @refreshDataList="getDataList" :thresholdTypes="thresholdTypes"></verify>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import verify from './verify'
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          pigstyId: '',
+          time: [],
+          warningType: '',
+          earTag: ''
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        pigstyList: [], // 猪舍List
+        pigstySelectedList: [], // 根据牧场限制的猪舍SelectedList
+        labelPosition: 'right',
+        thresholdTypes: [
+          {
+            label: '高温',
+            value: 8
+          },
+          {
+            label: '低温',
+            value: 9
+          }
+        ],
+        verifyVisible: false, // 弹窗是否显示
+        pigsty: {
+          farmId: '',
+          pigstyId: ''
+        }
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    components: {
+      verify
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/warningInfo/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'pigstyId': this.pigstyId || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined,
+            'belongTo': 3,
+            'warningType': this.form.warningType || undefined,
+            'earTag': this.form.earTag
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            console.log(data);
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          // 栋舍List
+          this.pigstyList = []
+          let pigstyList = []
+          let pigstyR = await this.$http({
+            url: this.$http.adornUrl("/management/pigsty/findAll"),
+            method: "get"
+          })
+          pigstyR.data.all && (pigstyList = pigstyR.data.all)
+          pigstyList.forEach(pigsty => {
+            let item = {
+              value: pigsty.id,
+              label: pigsty.number,
+              farmId: pigsty.farmId
+            }
+            this.pigstyList.push(item)
+          })
+          this.pigstySelectedList = this.pigstyList
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 根据牧场选择限制猪舍
+      farmChange (val) {
+        this.pigstySelectedList = this.pigstyList.filter(item => item.farmId === val)
+        if (this.pigsty.farmId === val) {
+          return
+        }
+        this.form.pigstyId = ''
+      },
+      // 根据猪舍选择确定牧场
+      pigstyChange (val) {
+        for (let pigsty of this.pigstyList) {
+          if (pigsty.value === val) {
+            this.form.farmId = pigsty.farmId
+            this.pigsty.farmId = pigsty.farmId
+            this.pigsty.pigstyId = val
+            break
+          }
+        }
+        this.farmChange(this.form.farmId)
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.pigstyId = ''
+        this.form.time = []
+        this.form.warningType = ''
+        this.form.earTag = ''
+        this.pigstySelectedList = this.pigstyList
+      },
+      // 确认处理
+      verifyHandle (id) {
+        this.verifyVisible = true
+        this.$nextTick(() => {
+          this.$refs.verify.init(id)
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 85 - 0
src/views/modules/alarm/verify.vue

@@ -0,0 +1,85 @@
+<template>
+  <el-dialog
+    title="确认说明"
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    width="600px">
+    <el-form 
+      :model="dataForm" 
+      :rules="dataRule" 
+      ref="dataForm" 
+      @keyup.enter.native="dataFormSubmit()" 
+      label-width="80px" 
+      size="mini"
+      style="margin-left: 20px;width: 500px">
+      <el-form-item label="确认描述" prop="verifyDescription">
+        <el-input
+          type="textarea"
+          :rows="8"
+          v-model="dataForm.verifyDescription">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="mini" @click="visible = false">关闭</el-button>
+      <el-button size="mini" type="primary" @click="dataFormSubmit()">确定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+  export default {
+    props: ["thresholdTypes"],
+    data () {
+      return {
+        visible: false,
+        dataForm: {
+          id: '',
+          verifyDescription: ''
+        },
+        dataRule: {
+          verifyDescription: [
+            { required: true, message: '确认描述不能为空', trigger: 'blur' }
+          ]
+        }
+      }
+    },
+    methods: {
+      // 在ealarm.vue调用该方法
+      init (id) {
+        this.visible = true
+        this.$nextTick(() => {
+          this.$refs['dataForm'].resetFields()
+          this.dataForm.id = id
+        })
+      },
+      // 表单提交
+      dataFormSubmit () {
+        this.$refs['dataForm'].validate((valid) => {
+          if (valid) {
+            this.$http({
+              url: this.$http.adornUrl('/management/warningInfo/verity'),
+              method: 'post',
+              data: this.$http.adornData({
+                'id': this.dataForm.id || undefined,
+                'verifyDescription': this.dataForm.verifyDescription
+              })
+            }).then(({data}) => {
+              if (data && data.code === 0) {
+                this.visible = false
+                this.$emit('refreshDataList')
+                this.$message({
+                  message: '操作成功',
+                  type: 'success',
+                  duration: 1500
+                })
+              } else {
+                this.$message.error(data.msg)
+              }
+            })
+          }
+        })
+      }
+    }
+  }
+</script>

+ 375 - 0
src/views/modules/alarm/water.vue

@@ -0,0 +1,375 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0" @change="farmChange">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="猪舍" v-model="form.pigstyId" @change="pigstyChange">
+                <el-option
+                  v-for="item in pigstySelectedList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <!-- <el-form-item style="width: 140px">
+              <el-select placeholder="报警类型" v-model="form.warningType">
+                <el-option
+                  v-for="item in thresholdTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item> -->
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="nowDate"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              prop="pigstyName"
+              header-align="center"
+              align="center"
+              label="猪舍">
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="报警类型">
+              <template slot-scope="scope">
+                <span>饮用水指标异常</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="nowValue"
+              header-align="center"
+              align="center"
+              label="当前饮用水成分">
+            </el-table-column>
+            <el-table-column
+              prop="warningTime"
+              header-align="center"
+              align="center"
+              label="报警时间">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  style="color: rgb(24,144,255)"
+                  @click="verifyHandle(scope.row.id)">
+                  处理确认
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+          <!-- 弹窗, 新增 / 修改 -->
+          <verify v-if="verifyVisible" ref="verify" @refreshDataList="getDataList" :thresholdTypes="thresholdTypes"></verify>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import verify from './verify'
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          pigstyId: '',
+          time: [],
+          warningType: ''
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        pigstyList: [], // 猪舍List
+        pigstySelectedList: [], // 根据牧场限制的猪舍SelectedList
+        labelPosition: 'right',
+        thresholdTypes: [
+          {
+            label: '高温',
+            value: 1
+          },
+          {
+            label: '低温',
+            value: 2
+          },
+          {
+            label: '空气污染',
+            value: 3
+          }
+        ],
+        verifyVisible: false, // 弹窗是否显示
+        pigsty: {
+          farmId: '',
+          pigstyId: ''
+        }
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    components: {
+      verify
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/warningInfo/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'pigstyId': this.pigstyId || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined,
+            'belongTo': 4,
+            // 'warningType': this.form.warningType || undefined
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            console.log(data);
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          // 栋舍List
+          this.pigstyList = []
+          let pigstyList = []
+          let pigstyR = await this.$http({
+            url: this.$http.adornUrl("/management/pigsty/findAll"),
+            method: "get"
+          })
+          pigstyR.data.all && (pigstyList = pigstyR.data.all)
+          pigstyList.forEach(pigsty => {
+            let item = {
+              value: pigsty.id,
+              label: pigsty.number,
+              farmId: pigsty.farmId
+            }
+            this.pigstyList.push(item)
+          })
+          this.pigstySelectedList = this.pigstyList
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 根据牧场选择限制猪舍
+      farmChange (val) {
+        this.pigstySelectedList = this.pigstyList.filter(item => item.farmId === val)
+        if (this.pigsty.farmId === val) {
+          return
+        }
+        this.form.pigstyId = ''
+      },
+      // 根据猪舍选择确定牧场
+      pigstyChange (val) {
+        for (let pigsty of this.pigstyList) {
+          if (pigsty.value === val) {
+            this.form.farmId = pigsty.farmId
+            this.pigsty.farmId = pigsty.farmId
+            this.pigsty.pigstyId = val
+            break
+          }
+        }
+        this.farmChange(this.form.farmId)
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.pigstyId = ''
+        this.form.time = []
+        this.form.warningType = ''
+        this.pigstySelectedList = this.pigstyList
+        console.log(this.$cookie.get('farmId'));
+        console.log(this.form.id);
+      },
+      // 确认处理
+      verifyHandle (id) {
+        this.verifyVisible = true
+        this.$nextTick(() => {
+          this.$refs.verify.init(id)
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 582 - 0
src/views/modules/basic/pigsty.vue

@@ -0,0 +1,582 @@
+<template>
+  <div class="bpighouse">
+    <el-container>
+      <el-header>
+        <div class="rect rect-form">
+          <el-form
+            :inline="true"
+            :model="dataForm"
+            @keyup.enter.native="getDataList()"
+            size="mini">
+            <el-form-item style="width: 500px">
+              <el-input
+                v-model="dataForm.key"
+                placeholder="请输入猪舍编号/牧场/养殖员"
+                clearable style="width: 500px">
+              </el-input>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()">查询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button
+                v-if="isAuth('sys:role:save')"
+                type="primary"
+                @click="addOrUpdateHandle()">
+                新增
+              </el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button
+                v-if="isAuth('sys:role:delete')"
+                type="danger"
+                @click="deleteHandle()"
+                :disabled="selectionDataList.length <= 0">
+                批量删除
+              </el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            height="670"
+            :data="dataList"
+            @selection-change="selectionChangeHandle"
+            v-loading="dataListLoading"
+            style="width: 100%"
+            size="mini"
+            border
+            stripe
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              type="selection"
+              header-align="center"
+              align="center"
+              width="50">
+            </el-table-column>
+            <el-table-column
+              prop="number"
+              header-align="center"
+              align="center"
+              label="猪舍编号">
+            </el-table-column>
+            <el-table-column
+              prop="name"
+              header-align="center"
+              align="center"
+              label="所属牧场">
+            </el-table-column>
+            <el-table-column
+              prop="feeder"
+              header-align="center"
+              align="center"
+              label="养殖员">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  v-if="isAuth('sys:user:update')"
+                  type="text"
+                  size="mini"
+                  @click="addOrUpdateHandle(scope.row)">
+                  修改
+                </el-button>
+                <el-button
+                  v-if="isAuth('sys:user:delete')"
+                  type="text"
+                  size="mini"
+                  @click="deleteHandle(scope.row.id)">
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="block">
+            <el-pagination
+              @size-change="sizeChangeHandle"
+              @current-change="currentChangeHandle"
+              :current-page="pageIndex"
+              :page-sizes="[10, 20, 30, 50, 100]"
+              :page-size="pageSize"
+              layout="total, sizes, prev, pager, next, jumper"
+              :total="totalPage">
+            </el-pagination>
+          </div>
+          <el-dialog
+            :title="!form.id ? '新增' : '修改'"
+            :close-on-click-modal="false"
+            :visible.sync="visible"
+            @close="cancel">
+            <el-form
+              :rules="dataRule"
+              :model="form"
+              ref="form"
+              @keyup.enter.native="formSubmit()"
+              label-width="80px">
+              <el-form-item label="所属牧场" prop="pastureId">
+                <el-select v-model="form.pastureId" placeholder="请选择所属牧场" style="width: 100%">
+                  <el-option
+                    v-for="item in pastureList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="猪舍编号" prop="number">
+                <el-input v-model="form.number" placeholder="猪舍编号"></el-input>
+              </el-form-item>
+              <el-form-item label="养殖员" prop="feederId">
+                <el-select v-model="form.feederId" placeholder="请选择养殖员" style="width: 100%">
+                  <el-option
+                    v-for="item in employeeList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+              <el-button @click="cancel">关闭</el-button>
+              <el-button type="primary" @click="formSubmit()">确定</el-button>
+            </span>
+          </el-dialog>
+        </div>
+      </el-main>
+    </el-container>
+    
+    
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      dataForm: {
+        key: "",
+      },
+      dataList: [
+        {
+          buildTime: "",
+          id: "",
+          location: "",
+          manager: "",
+          name: "",
+        },
+      ],
+      pageIndex: 1,
+      pageSize: 10,
+      totalPage: 0,
+      dataListLoading: false,
+      selectionDataList: [],
+      visible: false,
+      form: {
+        id: "",
+        number: "",
+        pastureId: "",
+        feederId: "",
+      },
+      pastureList: [], // 牧场list
+      employeeList: [], // 养殖员list
+      // TODO: 猪舍编号长度
+      dataRule: {
+        pastureId: [
+          { required: true, message: '所属牧场不能为空', trigger: 'blur' }
+        ],
+        number: [
+          { required: true, message: '猪舍编号不能为空', trigger: ['blur', 'change'] }
+        ],
+        feederId: [
+          { required: true, message: '养殖员不能为空', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  mounted() {
+    this.getDataList();
+  },
+  methods: {
+    // 获取数据列表
+    getDataList() {
+      this.dataListLoading = true;
+      this.$http({
+        url: this.$http.adornUrl("/management/pigsty/list"),
+        method: "post",
+        params: this.$http.adornParams({
+          page: this.pageIndex,
+          limit: this.pageSize,
+          keywords: this.dataForm.key
+        })
+      }).then(async ({ data }) => {
+        let pastureResult = await this.$http({
+          url: this.$http.adornUrl("/management/farm/findAll"),
+          method: "post"
+        });
+        pastureResult.data.all && (this.pastureList = pastureResult.data.all)
+        let employeeResult = await this.$http({
+          url: this.$http.adornUrl("/management/employee/findAll"),
+          method: "post"
+        });
+        employeeResult.data.all && (this.employeeList = employeeResult.data.all)
+        console.log(this.employeeList);
+        if (data && data.code === 0) {
+          this.dataList = data.page.list;
+          this.totalPage = data.page.totalCount;
+          this.dataList.forEach((item) => {
+            for (let pasture of this.pastureList) {
+              if (item.pastureId === pasture.id) {
+                item["name"] = pasture.name;
+                break;
+              }
+            }
+            for (let feeder of this.employeeList) {
+              if (parseInt(item.feederId) === feeder.id) {
+                item.feederId = parseInt(item.feederId)
+                item["feeder"] = feeder.name
+                break
+              }
+            }
+          })
+        } else {
+          this.dataList = []
+          this.totalPage = 0
+        }
+        this.dataListLoading = false
+      })
+    },
+    // 每页数
+    sizeChangeHandle(val) {
+      this.pageSize = val;
+      this.pageIndex = 1;
+      this.getDataList();
+    },
+    // 当前页
+    currentChangeHandle(val) {
+      this.pageIndex = val;
+      this.getDataList();
+    },
+    // 新增 or 修改牧场
+    addOrUpdateHandle(row) {
+      // 显示猪舍新增 or 修改面板
+      this.visible = true;
+      if (row) {
+        this.form.id = row.id
+        for (let key of Object.keys(this.form)) {
+          this.form[key] = row[key]
+        }
+      }
+      // 获取牧场
+      this.$http({
+        url: this.$http.adornUrl("/management/pasture/findAll"),
+        method: "post"
+      }).then(async ({ data }) => {
+        if (data && data.code === 0) {
+          this.pastureList = data.all
+          // 获取养殖员
+          let employeeResult = await this.$http({
+            url: this.$http.adornUrl("/management/employee/findAll"),
+            method: "post"
+          });
+          employeeResult.data.all && (this.employeeList = employeeResult.data.all)
+        }
+      })
+    },
+    // 选择n个牧场
+    selectionChangeHandle(val) {
+      this.selectionDataList = [];
+      val.forEach((item) => {
+        this.selectionDataList.push(item.id);
+      });
+    },
+    // 删除n个牧场
+    deleteHandle(id) {
+      this.$confirm(`确定删除牧场?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+      .then(() => {
+        // 删除操作
+        if (id) {
+          this.selectionDataList.push(id);
+        }
+        if (this.selectionDataList.length <= 0) {
+          return;
+        }
+        this.$http({
+          url: this.$http.adornUrl("/management/pigsty/delete"),
+          method: "post",
+          data: this.$http.adornData(this.selectionDataList, false),
+        }).then((result) => {
+          console.log(result);
+          if (result.data.code === 0) {
+            this.$message({
+              message: "成功删除猪舍",
+              type: "success",
+              duration: 1000,
+            })
+            // pageIndex修正
+            this.totalPage -= this.selectionDataList.length
+            let pages = Math.ceil(this.totalPage / this.pageSize)
+            this.pageIndex = this.pageIndex > pages? pages: this.pageIndex
+            this.pageIndex = this.pageIndex < 1? pages: this.pageIndex
+          } else {
+            // this.$message.error('删除失败:' + result.data.msg)
+            this.$confirm(result.data.msg, '删除失败', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }).then(() => {
+              console.log('猪舍编号输入不合法')
+            }).catch(() => {})
+          }
+          this.resetForm();
+          this.selectionDataList = [];
+        });
+      })
+      .catch(() => {});
+    },
+    formSubmit() {
+      if (this.form.id) {
+        /** 修改 */
+        // 输入是否完整
+        if (!this.confirmComplete()) {
+          return
+        }
+        // 输入是否合法
+        if (!this.confirmInput()) {
+          return
+        }
+          // 进行修改操作
+        this.$http({
+          url: this.$http.adornUrl("/management/pigsty/update"),
+          method: "post",
+          data: this.$http.adornData({
+            id: this.form.id,
+            number: this.form.number,
+            pastureId: this.form.pastureId,
+            feederId: this.form.feederId,
+          }),
+        }).then((result) => {
+          if (result.data.code === 0) {
+            this.resetForm();
+            this.visible = false;
+            this.$message({
+              message: "成功修改猪舍信息",
+              type: "success",
+              duration: 1000,
+            })
+          } else {
+            if (result.data.code === 600) {
+              let msg = result.data.msg.split('-')
+              let pasture = ''
+              for (let item of this.pastureList) {
+                if (this.form.pastureId === item.id) {
+                  pasture = item.name
+                  break
+                }
+              }
+              this.$message({
+                message: `${pasture}中猪舍编号 <p style="color:#333; display:inline">${msg[0]}</p> 已经存在!`,
+                type: "error",
+                duration: 1000,
+                dangerouslyUseHTMLString: true
+              })
+              return
+            }
+            this.$message.error("修改猪舍信息失败");
+          }
+        })
+      } else {
+        /** 新增 */
+        // 输入是否完整
+        if (!this.confirmComplete(1)) {
+          return
+        }
+        // 输入是否合法
+        if (!this.confirmInput()) {
+          return
+        }
+        // 进行新增操作
+        this.$http({
+          url: this.$http.adornUrl("/management/pigsty/save"),
+          method: "post",
+          data: this.$http.adornData({
+            number: this.form.number,
+            farmId: this.form.pastureId,
+            feederId: this.form.feederId,
+          }),
+        }).then((result) => {
+          if (result.data.code === 0) {
+            // 新增pageIndex的修正
+            this.totalPage++
+            let pages = Math.ceil(this.totalPage / this.pageSize)
+            this.pageIndex = this.pageIndex < pages? pages: this.pageIndex
+            this.resetForm();
+            this.visible = false;
+            this.$message({
+              message: "成功添加猪舍",
+              type: "success",
+              duration: 1000,
+            });
+          } else {
+            if (result.data.code === 600) {
+              let msg = result.data.msg.split('-')
+              let pasture = ''
+              for (let item of this.pastureList) {
+                if (this.form.pastureId === item.id) {
+                  pasture = item.name
+                  break
+                }
+              }
+              this.$message({
+                message: `${pasture}中猪舍编号 <p style="color:#333; display:inline">${msg[0]}</p> 已经存在!`,
+                type: "error",
+                duration: 1000,
+                dangerouslyUseHTMLString: true
+              })
+              return
+            }
+            this.$message.error("添加猪舍失败");
+          }
+        })
+      }
+    },
+    // 清空form
+    resetForm() {
+      for (let i in this.form) {
+        this.form[i] = "";
+      }
+      this.getDataList();
+    },
+    // 取消
+    cancel() {
+      this.visible = false
+      // 如果新增,则不保留form
+      if (this.form.id) {
+        this.resetForm()
+      }
+    },
+    // 校验输入是否完整
+    validComplete (val) {
+      val && (delete this.form.id)
+      for (let i in this.form) {
+        if (!this.form[i].toString()) {
+          return false
+        }
+      }
+      return true
+    },
+    // 如不完整,则提示
+    confirmComplete (val) {
+      if (this.validComplete(val)) {
+        return true
+      }
+      this.$confirm(`请输入完整`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        console.log('牧场输入不完整')
+      }).catch(() => {})
+      return false
+    },
+    // 校验输入是否合法,此处只校验猪舍编号
+    validInput () {
+      // 只允许中文、英文、数字、-、_的输入,取反
+      const reg = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5\_\-]/g
+      if (reg.test(this.form.number)) {
+        return false
+      }
+      return true
+    },
+    // 如不合法,则提示
+    confirmInput () {
+      if (this.validInput()) {
+        return true
+      }
+      this.$confirm(`只允许输入中英文、数字、-与_`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        console.log('猪舍编号输入不合法')
+      }).catch(() => {})
+      return false
+    },
+    getchange (val) {
+      console.log(val);
+    },
+    // 变色
+    tableRowClassName({row, rowIndex}) {
+      console.log(row);
+      if (rowIndex%2 === 0) {
+        return 'warning-row';
+      }
+      return '';
+    }
+    // TODO: 猪舍编号的长度校验
+  }
+}
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 184 - 0
src/views/modules/envir/ealarm-add-or-update.vue

@@ -0,0 +1,184 @@
+<template>
+  <el-dialog
+    :title="!dataForm.id ? '新增' : '修改'"
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    width="600px">
+    <el-form 
+      :model="dataForm" 
+      :rules="dataRule" 
+      ref="dataForm" 
+      @keyup.enter.native="dataFormSubmit()" 
+      label-width="80px" 
+      size="mini"
+      style="margin-left: 20px;width: 500px">
+      <el-form-item label="牧场名称" prop="farmId">
+        <el-select v-model="dataForm.farmId" :disabled="farmId > 0" style="width: 100%">
+          <el-option
+            v-for="item in farmList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="参数名称" prop="thresholdType">
+        <!-- <el-input v-model.number="dataForm.thresholdType" placeholder="请输入数字"></el-input> -->
+        <el-select v-model="dataForm.thresholdType" :disabled="farmId > 0" style="width: 100%">
+          <el-option
+            v-for="item in thresholdTypes"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="参数阈值" prop="thresholdValue">
+        <el-input v-model="dataForm.thresholdValue"></el-input>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="mini" @click="visible = false">关闭</el-button>
+      <el-button size="mini" type="primary" @click="dataFormSubmit()">确定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+  import { isEmail, isMobile } from '@/utils/validate'
+  export default {
+    props: ["thresholdTypes"],
+    data () {
+      var validateEmail = (rule, value, callback) => {
+        // if (!isEmail(value)) {
+        //   callback(new Error('邮箱格式错误'))
+        // } else {
+        //   callback()
+        // }
+        if (value === '') {
+          callback()
+        } else if (!isEmail(value)) {
+          callback(new Error('邮箱格式错误'))
+        } else {
+          callback()
+        }
+      }
+      var validateMobile = (rule, value, callback) => {
+        if (!isMobile(value)) {
+          callback(new Error('手机号格式错误'))
+        } else {
+          callback()
+        }
+      }
+      return {
+        visible: false,
+        dataForm: {
+          id: '',
+          thresholdName: '',
+          thresholdType: '',
+          thresholdValue: '',
+          farmId: ''
+        },
+        dataRule: {
+          farmId: [
+            { required: true, message: '牧场名称不能为空', trigger: 'blur' }
+          ],
+          thresholdType: [
+            { required: true, message: '参数名称不能为空', trigger: 'blur' }
+          ],
+          thresholdValue: [
+            { required: true, message: '参数阈值不能为空', trigger: 'blur' }
+          ]
+        },
+        farmList: [], // 牧场List
+        farmId: undefined
+      }
+    },
+    methods: {
+      // 在ealarm.vue调用该方法
+      init (id) {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.visible = true
+        this.$nextTick(() => {
+          this.$refs['dataForm'].resetFields()
+          this.dataForm.farmId = (this.dataForm.farmId || this.farmId) || undefined
+        })
+        this.dataForm.id = id || undefined
+        if (this.dataForm.id) {
+          console.log(this.dataForm.id);
+          this.$http({
+            url: this.$http.adornUrl(`/management/thresholdManagement/info/${this.dataForm.id}`),
+            method: 'get',
+            params: this.$http.adornParams()
+          }).then(({data}) => {
+            if (data && data.code === 0) {
+              console.log(data)
+              this.dataForm.thresholdType = data.thresholdManagement.thresholdType
+              this.dataForm.thresholdValue = data.thresholdManagement.thresholdValue
+              this.dataForm.farmId = data.thresholdManagement.farmId
+            }
+          })
+        }
+        // 获取所有牧场
+        this.farmList = []
+        let farmList = []
+        this.$http({
+          url: this.$http.adornUrl("/management/farm/findAll"),
+          method: "post",
+        }).then(({data}) => {
+          if (data && data.code === 0) {
+            farmList = data.all
+            farmList.forEach(farm => {
+              let item = {
+                label: farm.name,
+                value: farm.id
+              }
+              this.farmList.push(item)
+            })
+          }
+        })
+      },
+      // 表单提交
+      dataFormSubmit () {
+        this.$refs['dataForm'].validate((valid) => {
+          if (valid) {
+            let belong = {
+              '1': 1,
+              '2': 1,
+              '3': 1,
+              '4': 4,
+              '5': 2,
+              '6': 2,
+              '7': 2,
+              '8': 3,
+              '9': 3
+            }
+            this.$http({
+              url: this.$http.adornUrl(`/management/thresholdManagement/${!this.dataForm.id ? 'save' : 'update'}`),
+              method: 'post',
+              data: this.$http.adornData({
+                'id': this.dataForm.id || undefined,
+                'thresholdType': this.dataForm.thresholdType,
+                'thresholdValue': this.dataForm.thresholdValue,
+                'farmId': this.dataForm.farmId,
+                'belongTo': belong[this.dataForm.thresholdType.toString()]
+              })
+            }).then(({data}) => {
+              if (data && data.code === 0) {
+                this.visible = false
+                this.$emit('refreshDataList')
+                this.$message({
+                  message: '操作成功',
+                  type: 'success',
+                  duration: 1500
+                })
+              } else {
+                this.$message.error(data.msg)
+              }
+            })
+          }
+        })
+      }
+    }
+  }
+</script>

+ 364 - 0
src/views/modules/envir/ealarm.vue

@@ -0,0 +1,364 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="参数名称" v-model="form.thresholdType" :disabled="farmId > 0">
+                <el-option
+                  v-for="item in thresholdTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <!-- 新增 删除按钮 -->
+          <el-form inline size="mini">
+            <el-form-item>
+              <el-button 
+                icon="el-icon-plus" 
+                @click="addOrUpdateHandle()">
+                新 增
+              </el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-delete" 
+                type="danger" 
+                @click="deleteHandle()" 
+                :disabled="dataListSelections.length <= 0">
+                删 除
+              </el-button>
+            </el-form-item>
+          </el-form>
+          
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            @selection-change="selectionChangeHandle"
+            style="width: 100%;"
+            size="mini"
+            height="540"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              type="selection"
+              header-align="center"
+              align="center"
+              width="50">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场名称">
+              <template slot-scope="scope">
+                <span>{{thresholdTypes[scope.row.thresholdType - 1].label}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="参数名称">
+              <template slot-scope="scope">
+                <span>{{thresholdTypes[scope.row.thresholdType - 1].label}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="thresholdValue"
+              header-align="center"
+              align="center"
+              label="阈值">
+            </el-table-column>
+            <el-table-column
+              fixed="right"
+              header-align="center"
+              align="center"
+              label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  style="color: rgb(24,144,255)"
+                  @click="addOrUpdateHandle(scope.row.id)">
+                  编辑
+                </el-button>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="deleteHandle"
+                  style="color: rgb(24,144,255)">
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+          <!-- 弹窗, 新增 / 修改 -->
+          <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" :thresholdTypes="thresholdTypes"></add-or-update>
+        </div>
+      </el-main>
+      
+      
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import AddOrUpdate from './ealarm-add-or-update'
+  export default {
+    data () {
+      return {
+        form: {
+          thresholdType: '',
+          farmId: ''
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        dataListSelections: [],
+        addOrUpdateVisible: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        labelPosition: 'right',
+        thresholdTypes: [
+          {
+            label: '室内高温',
+            value: 1
+          },
+          {
+            label: '室内低温',
+            value: 2
+          },
+          {
+            label: '室内空气污染',
+            value: 3
+          },
+          {
+            label: '饮用水污染',
+            value: 4
+          },
+          {
+            label: '室外高温',
+            value: 5
+          },
+          {
+            label: '室外低温',
+            value: 6
+          },
+          {
+            label: '室外空气污染',
+            value: 7
+          },
+          {
+            label: '体温高温',
+            value: 8
+          },
+          {
+            label: '体温低温',
+            value: 9
+          }
+        ]
+      }
+    },
+    components: {
+      AddOrUpdate
+    },
+    activated () {
+      this.getDataList()
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/thresholdManagement/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'thresholdType': this.form.thresholdType,
+            'farmId': (this.form.farmId || this.farmId) || undefined
+          })
+        }).then(async({data}) => {
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          // 获取报警List
+          if (data && data.code === 0) {
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        if (!this.farmId) {
+          this.form.farmId = ''
+        }
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+      },
+      // 新增 / 修改
+      addOrUpdateHandle (id) {
+        this.addOrUpdateVisible = true
+        this.$nextTick(() => {
+          this.$refs.addOrUpdate.init(id)
+        })
+      },
+      // 删除
+      deleteHandle (id) {
+        var ids = id ? [id] : this.dataListSelections.map(item => {
+          return item.id
+        })
+        this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.$http({
+            url: this.$http.adornUrl('/management/thresholdManagement/delete'),
+            method: 'post',
+            data: this.$http.adornData(ids, false)
+          }).then(({data}) => {
+            if (data && data.code === 0) {
+              this.getDataList()
+              this.$message({
+                message: '操作成功',
+                type: 'success',
+                duration: 1500
+              })
+            } else {
+              this.$message.error(data.msg)
+            }
+          })
+        }).catch(() => {})
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 0 - 0
src/views/modules/envir/eindoor-add-or-update.vue


+ 113 - 356
src/views/modules/envir/eindoor.vue

@@ -5,23 +5,16 @@
       <el-header>
         <div class="rect rect-form">
           <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
-            <el-form-item>
-              <el-input v-model="form.eartag" placeholder="耳标" clearable></el-input>
+            <el-form-item style="width: 50px">
+              <el-button type="success" :disabled="abnormalStatus===false" @click="changeClick">正常</el-button>
             </el-form-item>
-            <el-form-item style="width: 140px">
-              <el-select placeholder="性别" v-model="form.sex">
-                <el-option
-                  v-for="item in gender"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
+            <el-form-item style="width: 100px">
+              <el-button type="warning" :disabled="abnormalStatus===true" @click="changeClick">异常</el-button>
             </el-form-item>
             <el-form-item style="width: 140px">
-              <el-select placeholder="品种" v-model="form.breed">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0" @change="farmChange">
                 <el-option
-                  v-for="item in breed"
+                  v-for="item in farmList"
                   :key="item.value"
                   :label="item.label"
                   :value="item.value">
@@ -29,56 +22,27 @@
               </el-select>
             </el-form-item>
             <el-form-item style="width: 140px">
-              <el-select placeholder="健康状态" v-model="form.healthStatus">
+              <el-select placeholder="猪舍" v-model="form.pigstyId" @change="pigstyChange">
                 <el-option
-                  v-for="item in healthStatus"
+                  v-for="item in pigstySelectedList"
                   :key="item.value"
                   :label="item.label"
                   :value="item.value">
                 </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item style="width: 140px">
-              <el-select placeholder="养殖状态" v-model="form.outFenceStatus">
-                <el-option
-                  v-for="item in outFenceStatus"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item style="width: 140px">
-              <el-select placeholder="栏期" v-model="form.periodId">
-                <el-option
-                  v-for="item in periodSelectedList"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item style="width: 140px">
-              <el-select placeholder="栋舍" v-model="form.pigstyId" @change="pigstyChange">
-                <el-option
-                  v-for="item in pigstyList"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item style="width: 140px">
-              <el-select placeholder="单元" v-model="form.unitId">
-                <el-option
-                  v-for="item in unitSelectedList"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
             </el-form-item>
-
             <el-form-item>
               <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
             </el-form-item>
@@ -93,136 +57,61 @@
       <!-- role表格 -->
       <el-main>
         <div class="rect rect-table">
-          <!-- 新增 删除按钮 -->
-          <el-form inline size="mini">
-            <el-form-item>
-              <el-button 
-                icon="el-icon-plus" 
-                @click="addOrUpdateHandle()">
-                新 增
-              </el-button>
-            </el-form-item>
-            <el-form-item>
-              <el-button 
-                icon="el-icon-delete" 
-                type="danger" 
-                @click="deleteHandle()" 
-                :disabled="dataListSelections.length <= 0">
-                删 除
-              </el-button>
-            </el-form-item>
-            <el-form-item>
-              <el-button 
-                icon="el-icon-edit" 
-                type="danger" 
-                @click="addOrUpdateHandle()" 
-                :disabled="dataListSelections.length <= 0">
-                批量修改
-              </el-button>
-            </el-form-item>
-          </el-form>
-          
           <el-table
             :data="dataList"
             border
             stripe
             v-loading="dataListLoading"
-            @selection-change="selectionChangeHandle"
             style="width: 100%;"
             size="mini"
-            height="540"
+            height="578"
             :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
             :cell-style="{color: '#888',fontSize: '13px'}">
             <el-table-column
-              type="selection"
-              header-align="center"
-              align="center"
-              width="50">
-            </el-table-column>
-            <el-table-column
-              prop="id"
-              header-align="center"
-              align="center"
-              label="id">
-            </el-table-column>
-            <el-table-column
-              prop="eartag"
+              prop="date"
               header-align="center"
               align="center"
-              label="耳标">
+              label="当前日期">
             </el-table-column>
             <el-table-column
-              prop="sex"
+              prop="farmName"
               header-align="center"
               align="center"
-              label="性别">
+              label="牧场">
             </el-table-column>
             <el-table-column
-              prop="birthday"
+              prop="pigstyName"
               header-align="center"
               align="center"
-              label="出生日期">
+              label="猪舍">
             </el-table-column>
             <el-table-column
               header-align="center"
               align="center"
-              label="健康状态">
+              label="温度">
               <template slot-scope="scope">
-                <span>{{scope.row.healthStatus? '健康': '不健康'}}</span>
+                <span>{{scope.row.temperature}}℃</span>
               </template>
             </el-table-column>
             <el-table-column
               header-align="center"
               align="center"
-              label="养殖状态">
+              label="湿度">
               <template slot-scope="scope">
-                <span>{{scope.row.outFenceStatus? '出栏': '育肥'}}</span>
+                <span>{{scope.row.humidity.toFixed(2) *100}}% rh</span>
               </template>
             </el-table-column>
             <el-table-column
-              prop="breed"
-              header-align="center"
-              align="center"
-              label="品种">
-            </el-table-column>
-            <el-table-column
-              prop="phNumber"
-              header-align="center"
-              align="center"
-              label="栋舍">
-            </el-table-column>
-            <el-table-column
-              prop="unitNumber"
+              prop="airQuality"
               header-align="center"
               align="center"
-              label="单元">
+              label="空气质量">
             </el-table-column>
             <el-table-column
-              prop="periodNumber"
+              prop="collectTime"
               header-align="center"
               align="center"
-              label="栏期">
-            </el-table-column>
-            <el-table-column
-              fixed="right"
-              header-align="center"
-              align="center"
-              label="操作">
-              <template slot-scope="scope">
-                <el-button
-                  type="text"
-                  size="medium"
-                  style="color: rgb(24,144,255)">
-                  查看
-                </el-button>
-                <el-button
-                  type="text"
-                  size="medium"
-                  @click="addOrUpdateHandle(scope.row)"
-                  style="color: rgb(24,144,255)">
-                  编辑
-                </el-button>
-              </template>
+              label="采集时间">
             </el-table-column>
           </el-table>
           <el-pagination
@@ -234,121 +123,81 @@
             :total="totalPage"
             layout="total, sizes, prev, pager, next, jumper">
           </el-pagination>
-          <!-- 弹窗, 新增 / 修改 -->
-          <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
         </div>
       </el-main>
-      
-      
     </el-container>
   </div>
 </template>
 
 <script>
-  import AddOrUpdate from './eindoor-add-or-update'
   export default {
     data () {
       return {
         form: {
-          eartag: '',
-          sex: '',
-          breed: '',
-          healthStatus: '',
-          outFenceStatus: '',
-          periodId: '',
+          farmId: '',
           pigstyId: '',
-          unitId: ''
+          time: []
         },
         dataList: [],
         pageIndex: 1,
         pageSize: 10,
         totalPage: 0,
         dataListLoading: false,
-        dataListSelections: [],
-        addOrUpdateVisible: false,
         farmId: undefined,
-        gender: [
-          {
-            value: '公',
-            label: '公'
-          },
-          {
-            value: '母',
-            label: '母'
-          }
-        ],
-        breed: [
-          {
-            value: 1,
-            label: '杜巴嘉'
-          },
-          {
-            value: 2,
-            label: '长白'
-          }
-        ],
-        healthStatus: [
-          {
-            value: true,
-            label: '健康'
-          },
-          {
-            value: false,
-            label: '不健康'
-          }
-        ],
-        outFenceStatus: [
-          {
-            value: 0,
-            label: '育肥'
-          },
-          {
-            value: 1,
-            label: '出栏'
-          }
-        ],
-        periodList: [], // 所有栏期
-        periodSelectedList: [], // 根据栋舍限制的栏期
-        pigstyList: [], // 所有栋舍
-        unitList: [], // 所有单元
-        unitSelectedList: [], // 根据栋舍限制的单元
+        farmList: [], // 牧场List
+        pigstyList: [], // 猪舍List
+        pigstySelectedList: [], // 根据牧场限制的猪舍SelectedList
         labelPosition: 'right',
-        abnormalStatus: 0
+        abnormalStatus: false,
+        pigsty: {
+          farmId: '',
+          pigstyId: ''
+        }
       }
     },
-    components: {
-      AddOrUpdate
-    },
     activated () {
       this.getDataList()
     },
     methods: {
       // 获取数据列表
       getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
         this.dataListLoading = true
         this.$http({
-          url: this.$http.adornUrl('/management/indoorenvironment/list'),
+          url: this.$http.adornUrl('/management/indoorEnvironment/list'),
           method: 'get',
           params: this.$http.adornParams({
             'page': this.pageIndex,
             'limit': this.pageSize,
             'abnormalStatus': this.abnormalStatus,
-            'farmId': this.$cookie.get('farmId') || undefined
-
-            // 'username': this.form.username,
-            // 'departmentCode': this.form.departmentCode,
-            // 'jobCode': this.form.jobCode,
-            // 'sex': this.form.gender,
-            // 'farmId': this.farmId
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined
           })
         }).then(async({data}) => {
-          // // 获取所有牧场
-          // let pastureList = []
-          // let pastureResult = await this.$http({
-          //   url: this.$http.adornUrl("/management/farm/findAll"),
-          //   method: "post",
-          // })
-          // pastureResult.data.all && (pastureList = pastureResult.data.all)
+          if (data && data.code === 0) {
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
           // 栋舍List
           this.pigstyList = []
           let pigstyList = []
@@ -360,102 +209,57 @@
           pigstyList.forEach(pigsty => {
             let item = {
               value: pigsty.id,
-              label: pigsty.number
+              label: pigsty.number,
+              farmId: pigsty.farmId
             }
             this.pigstyList.push(item)
           })
-          // 单元List
-          this.unitList = []
-          let unitList = []
-          let unitR = await this.$http({
-            url: this.$http.adornUrl("/management/unit/findAll"),
-            method: "get"
-          })
-          unitR.data.all && (unitList = unitR.data.all)
-          unitList.forEach(unit => {
-            let item = {
-              value: unit.id,
-              label: unit.number,
-              pigstyId: unit.pigstyId,
-              farmId: unit.farmId
-            }
-            this.unitList.push(item)
-          })
-          this.unitSelectedList = this.unitList
-          // 栏期List
-          this.periodList = []
-          let periodList = []
-          let periodR = await this.$http({
-            url: this.$http.adornUrl("/management/period/findAll"),
-            method: "get"
-          })
-          periodR.data.all && (periodList = periodR.data.all)
-          periodList.forEach(period => {
-            let item = {
-              value: period.id,
-              label: period.number,
-              pigstyId: period.pigstyId
-            }
-            this.periodList.push(item)
-          })
-          this.periodSelectedList = this.periodList
-          // 获取猪只List
-          if (data && data.code === 0) {
-            this.dataList = data.page.list
-            this.totalPage = data.page.totalCount
-          } else {
-            this.dataList = []
-            this.totalPage = 0
-            this.$message.error(data.msg)
-          }
-          // 猪只信息与单元、牧场、栏期、栋舍对应
-          this.dataList.forEach((item) => {
-            // 单元对应
-            for (let unit of this.unitList) {
-              if (item.unitId === unit.value) {
-                item.unitNumber = unit.label;
-                item.farmId = unit.farmId;
-                item.pigstyId = unit.pigstyId;
-                break;
-              }
-            }
-            // // 牧场对应
-            // for (let pasture of pastureList) {
-            //   if (item.farmId === pasture.id) {
-            //     item.name = pasture.name;
-            //     break;
-            //   }
-            // }
-            // 栋舍对应
-            for (let pighouse of this.pigstyList) {
-              if (item.pigstyId === pighouse.value) {
-                item.phNumber = pighouse.label;
-                break;
-              }
-            }
-            // 栏期对应
-            for (let period of this.periodList) {
-              if (item.periodId === period.value) {
-                item.periodNumber = period.label;
-                break;
-              }
-            }
-          })
+          this.pigstySelectedList = this.pigstyList
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
           this.dataListLoading = false
         })
       },
-      // 根据栋舍选择限制单元和栏期
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 根据牧场选择限制猪舍
+      farmChange (val) {
+        this.pigstySelectedList = this.pigstyList.filter(item => item.farmId === val)
+        if (this.pigsty.farmId === val) {
+          return
+        }
+        this.form.pigstyId = ''
+      },
+      // 根据猪舍选择确定牧场
       pigstyChange (val) {
-        this.unitSelectedList = this.unitList.filter(item => item.pigstyId === val)
-        this.periodSelectedList = this.periodList.filter(item => item.pigstyId === val)
+        for (let pigsty of this.pigstyList) {
+          if (pigsty.value === val) {
+            this.form.farmId = pigsty.farmId
+            this.pigsty.farmId = pigsty.farmId
+            this.pigsty.pigstyId = val
+            break
+          }
+        }
+        this.farmChange(this.form.farmId)
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
       },
       // form表单清空,单元SelectedList 和 栏期SelectedList重置
       clearAll () {
-        for (let i in this.form) {
-          this.form[i] = ''
-        }
-        this.unitSelectedList = this.unitList
-        this.periodSelectedList = this.periodList
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.pigstyId = ''
+        this.form.time = []
+        this.pigstySelectedList = this.pigstyList
       },
       // 每页数
       sizeChangeHandle (val) {
@@ -467,53 +271,6 @@
       currentChangeHandle (val) {
         this.pageIndex = val
         this.getDataList()
-      },
-      // 多选
-      selectionChangeHandle (val) {
-        this.dataListSelections = val
-      },
-      // 新增 / 修改
-      addOrUpdateHandle (id) {
-        this.addOrUpdateVisible = true
-        var ids = id ? [id] : this.dataListSelections.map(item => {
-          return {
-            id: item.id,
-            eartag: item.eartag
-          }
-        })
-        this.$nextTick(() => {
-          this.$refs.addOrUpdate.init(ids)
-        })
-      },
-      // 删除
-      deleteHandle (id) {
-        var ids = id ? [id] : this.dataListSelections.map(item => {
-          return item.id
-        })
-        this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(() => {
-          this.$http({
-            url: this.$http.adornUrl('/management/yearpigbase/delete'),
-            method: 'post',
-            data: this.$http.adornData(ids, false)
-          }).then(({data}) => {
-            if (data && data.code === 0) {
-              this.$message({
-                message: '操作成功',
-                type: 'success',
-                duration: 1500,
-                onClose: () => {
-                  this.getDataList()
-                }
-              })
-            } else {
-              this.$message.error(data.msg)
-            }
-          })
-        }).catch(() => {})
       }
     }
   }

+ 268 - 0
src/views/modules/envir/emeteo.vue

@@ -0,0 +1,268 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 50px">
+              <el-button type="success" :disabled="abnormalStatus===false" @click="changeClick">正常</el-button>
+            </el-form-item>
+            <el-form-item style="width: 100px">
+              <el-button type="warning" :disabled="abnormalStatus===true" @click="changeClick">异常</el-button>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="date"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="温度">
+              <template slot-scope="scope">
+                <span>{{scope.row.temperature}}℃</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              header-align="center"
+              align="center"
+              label="湿度">
+              <template slot-scope="scope">
+                <span>{{scope.row.humidity.toFixed(2) *100}}% rh</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="airQuality"
+              header-align="center"
+              align="center"
+              label="空气质量">
+            </el-table-column>
+            <el-table-column
+              prop="collectTime"
+              header-align="center"
+              align="center"
+              label="采集时间">
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          time: []
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        labelPosition: 'right',
+        abnormalStatus: false
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/outdoorEnvironment/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'abnormalStatus': this.abnormalStatus,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.time = []
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>

+ 315 - 0
src/views/modules/envir/ewater.vue

@@ -0,0 +1,315 @@
+<template>
+  <div class="mod-role">
+    <el-container>
+      <!-- form表单 -->
+      <el-header>
+        <div class="rect rect-form">
+          <el-form :inline="true" :model="form" @keyup.enter.native="getDataList()" size="mini" ref="form">
+            <el-form-item style="width: 50px">
+              <el-button type="success" :disabled="abnormalStatus===false" @click="changeClick">正常</el-button>
+            </el-form-item>
+            <el-form-item style="width: 100px">
+              <el-button type="warning" :disabled="abnormalStatus===true" @click="changeClick">异常</el-button>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="牧场" v-model="form.farmId" :disabled="farmId > 0" @change="farmChange">
+                <el-option
+                  v-for="item in farmList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="width: 140px">
+              <el-select placeholder="猪舍" v-model="form.pigstyId" @change="pigstyChange">
+                <el-option
+                  v-for="item in pigstySelectedList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-date-picker
+                v-model="form.time"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                :default-time="['08:00:00', '16:00:00']"
+                @change="timeChange"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button @click="getDataList()" icon="el-icon-search">查 询</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button 
+                icon="el-icon-circle-close"
+                @click="clearAll">清 空</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-header>
+      <!-- role表格 -->
+      <el-main>
+        <div class="rect rect-table">
+          <el-table
+            :data="dataList"
+            border
+            stripe
+            v-loading="dataListLoading"
+            style="width: 100%;"
+            size="mini"
+            height="578"
+            :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}" 
+            :cell-style="{color: '#888',fontSize: '13px'}">
+            <el-table-column
+              prop="date"
+              header-align="center"
+              align="center"
+              label="当前日期">
+            </el-table-column>
+            <el-table-column
+              prop="farmName"
+              header-align="center"
+              align="center"
+              label="牧场">
+            </el-table-column>
+            <el-table-column
+              prop="pigstyName"
+              header-align="center"
+              align="center"
+              label="猪舍">
+            </el-table-column>
+            <el-table-column
+              prop="drinkingWaterQuality"
+              header-align="center"
+              align="center"
+              label="饮用水指标">
+            </el-table-column>
+            <el-table-column
+              prop="collectTime"
+              header-align="center"
+              align="center"
+              label="采集时间">
+            </el-table-column>
+          </el-table>
+          <el-pagination
+            @size-change="sizeChangeHandle"
+            @current-change="currentChangeHandle"
+            :current-page="pageIndex"
+            :page-sizes="[10, 20, 50, 100]"
+            :page-size="pageSize"
+            :total="totalPage"
+            layout="total, sizes, prev, pager, next, jumper">
+          </el-pagination>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        form: {
+          farmId: '',
+          pigstyId: '',
+          time: []
+        },
+        dataList: [],
+        pageIndex: 1,
+        pageSize: 10,
+        totalPage: 0,
+        dataListLoading: false,
+        farmId: undefined,
+        farmList: [], // 牧场List
+        pigstyList: [], // 猪舍List
+        pigstySelectedList: [], // 根据牧场限制的猪舍SelectedList
+        labelPosition: 'right',
+        abnormalStatus: false,
+        pigsty: {
+          farmId: '',
+          pigstyId: ''
+        }
+      }
+    },
+    activated () {
+      this.getDataList()
+    },
+    methods: {
+      // 获取数据列表
+      getDataList () {
+        this.farmId = this.$cookie.get('farmId') === 'null'? undefined: parseInt(this.$cookie.get('farmId'))
+        this.dataListLoading = true
+        this.$http({
+          url: this.$http.adornUrl('/management/drinkingWater/list'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'page': this.pageIndex,
+            'limit': this.pageSize,
+            'abnormalStatus': this.abnormalStatus,
+            'farmId': (this.form.farmId || this.farmId) || undefined,
+            'startTime': this.form.time[0] || undefined,
+            'endTime': this.form.time[1] || undefined
+          })
+        }).then(async({data}) => {
+          if (data && data.code === 0) {
+            this.dataList = data.page.list
+            this.totalPage = data.page.totalCount
+          } else {
+            this.dataList = []
+            this.totalPage = 0
+            this.$message.error(data.msg)
+          }
+          // 获取所有牧场
+          this.farmList = []
+          let farmList = []
+          let farmResult = await this.$http({
+            url: this.$http.adornUrl("/management/farm/findAll"),
+            method: "post",
+          })
+          farmResult.data.all && (farmList = farmResult.data.all)
+          farmList.forEach(farm => {
+            let item = {
+              label: farm.name,
+              value: farm.id
+            }
+            this.farmList.push(item)
+          })
+          console.log(this.farmList);
+          // 栋舍List
+          this.pigstyList = []
+          let pigstyList = []
+          let pigstyR = await this.$http({
+            url: this.$http.adornUrl("/management/pigsty/findAll"),
+            method: "get"
+          })
+          pigstyR.data.all && (pigstyList = pigstyR.data.all)
+          pigstyList.forEach(pigsty => {
+            let item = {
+              value: pigsty.id,
+              label: pigsty.number,
+              farmId: pigsty.farmId
+            }
+            this.pigstyList.push(item)
+          })
+          this.pigstySelectedList = this.pigstyList
+          this.form.farmId = (this.form.farmId || this.farmId) || undefined
+          this.dataListLoading = false
+        })
+      },
+      // 切换正常异常状态
+      changeClick () {
+        this.abnormalStatus = !this.abnormalStatus
+        this.getDataList()
+      },
+      // 根据牧场选择限制猪舍
+      farmChange (val) {
+        this.pigstySelectedList = this.pigstyList.filter(item => item.farmId === val)
+        if (this.pigsty.farmId === val) {
+          return
+        }
+        this.form.pigstyId = ''
+      },
+      // 根据猪舍选择确定牧场
+      pigstyChange (val) {
+        for (let pigsty of this.pigstyList) {
+          if (pigsty.value === val) {
+            this.form.farmId = pigsty.farmId
+            this.pigsty.farmId = pigsty.farmId
+            this.pigsty.pigstyId = val
+            break
+          }
+        }
+        this.farmChange(this.form.farmId)
+      },
+      // 获取起始与结束时间
+      timeChange (val) {
+        let start = new Date(val[0])
+        let end = new Date(val[1])
+        let now = new Date()
+        if (start > now || end > now) {
+          this.form.time = []
+          this.$message.error('请勿选择超出现在的时刻')
+        }
+      },
+      // form表单清空,单元SelectedList 和 栏期SelectedList重置
+      clearAll () {
+        this.form.farmId = this.$cookie.get('farmId') === 'null'? '': parseInt(this.$cookie.get('farmId'))
+        this.form.pigstyId = ''
+        this.form.time = []
+        this.pigstySelectedList = this.pigstyList
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageIndex = 1
+        this.getDataList()
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageIndex = val
+        this.getDataList()
+      }
+    }
+  }
+</script>
+<style scoped>
+.rect {
+  background-color: #fff;
+  padding: 30px 15px;
+  border-radius: 5px;
+  border: 1px solid #e8e8e8;
+}
+.rect-form {
+  padding-bottom: 10px;
+}
+.rect-table {
+  margin-top: 20px;
+}
+.demo-table-expand {
+  font-size: 0;
+  margin-left: 40px;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 80%;
+}
+.el-table .height {
+  background: rgba(254, 254, 254, 0.5);
+}
+/deep/ .el-table--mini td, .el-table--mini th {
+  padding: 3px 0 !important;
+  height: 20px !important;
+}
+/deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
+  color: rgb(24,144,255);
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__inner:hover {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: rgb(24,144,255);
+}
+/deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: rgb(24,144,255);
+  border-color: rgb(24,144,255);
+}
+</style>