xieqy 3 роки тому
батько
коміт
d365a1e136

+ 5 - 5
src/views/groupPage/districtPageModules/commonModules/SectorToolbar.vue

@@ -57,7 +57,7 @@
       >
         <div class="outerFan" v-if="isShowChildTool">
           <div class="outerFan-item" v-for="item of outerToolList" :key="item.name" v-show="isFold">
-            <el-tooltip effect="dark" :content="item.name" placement="right">
+            <el-tooltip effect="dark" :content="item.name" placement="right" transition="el-zoom-in-center">
               <div class="outerFan-content" @click="activeEvent(item)">
                 <img v-if="item.name !== '属性查看'" :src="item.imgUrl" />
                 <el-popover v-if="item.name == '属性查看'" placement="top" trigger="hover">
@@ -79,7 +79,7 @@
         </div>
       </transition>
       <div class="foldBtn" @click="isShowChildTool = !isShowChildTool">
-        <el-tooltip effect="dark" content="工具栏" placement="right">
+        <el-tooltip effect="dark" content="工具栏" placement="right" transition="el-zoom-in-center">
           <img :src="require('@/views/groupPage/images/工具栏/初视点.png')" />
         </el-tooltip>
       </div>
@@ -516,7 +516,7 @@ export default class SectorToolbar extends Vue {
     width: 50px;
     height: 50px;
     border-radius: 100% 0 0 0;
-    background-color: rgba(255, 255, 255, 0.1);
+    background-color: rgba(126, 201, 255, 0.18);
     bottom: 0;
     right: 0;
     img {
@@ -544,8 +544,8 @@ export default class SectorToolbar extends Vue {
     padding-left: 0.260417rem /* 50/192 */;
     border-top: 0.3125rem /* 60/192 */ solid;
     border-left: 0.3125rem /* 60/192 */ solid;
-    border-top-color: rgba(126, 201, 255, 0.2);
-    border-left-color: rgba(126, 201, 255, 0.2);
+    border-top-color: rgba(21, 35, 50,0.7);
+    border-left-color: rgba(21, 35, 50,0.7);
     display: inline-block;
     pointer-events: none;
     border-radius: 2.083333rem /* 400/192 */ 0 0 0;

+ 2 - 2
src/views/groupPage/districtPageModules/statisticalAnalysis/securityModule/InspectionsNum.vue

@@ -36,9 +36,9 @@ export default class InspectionsNum extends Vue {}
 .widget-InspectionsNum {
   bottom: 0.052083rem /* 10/192 */;
   left: 50%;
-  margin-left: -2.71875rem /* 522/192 */;
+  margin-left: -2.645833rem /* 508/192 */;
   height: 1.572917rem /* 302/192 */;
-  width: 5.4375rem /* 1044/192 */;
+  width: 5.291667rem /* 1016/192 */;
   position: absolute;
   font-family: Source Han Sans CN;
   .head {

+ 2 - 2
src/views/groupPage/districtPageModules/wisdomWarning/FocusOnWarning.vue

@@ -198,8 +198,8 @@ export default class FocusOnWarning extends Vue {}
           position: relative;
           img {
             position: absolute;
-            height: 0.645833rem /* 124/192 */;
-            width: 0.645833rem /* 124/192 */;
+            height: .703125rem /* 135/192 */;
+            width: .703125rem /* 135/192 */;
           }
         }
         .radar::after {

+ 1 - 1
src/views/groupPage/header/header.vue

@@ -194,7 +194,7 @@ export default {
               sort = item.sort
             }
           })
-          this.currentProjectActive = this.menuList[2].name
+          this.currentProjectActive = this.menuList[0].name
         })
         .catch((err) => {
           console.log(err)

+ 217 - 0
src/views/groupPageDataManagement/ForewarningManagement/ForewarningIndex/widget.vue

@@ -0,0 +1,217 @@
+<template>
+  <tf-page>
+    <template v-slot:action>
+      <ForewarningHeader
+        :kplaceholder="'支持预警分组、名称搜索'"
+        :selected="selected"
+        :actived="isActive"
+        :loading="loading"
+        :term="term"
+        @search="onSearch"
+        @add="onAdd"
+        @del="onDelete"
+        @import="onImport"
+        @export="onExport"
+      />
+    </template>
+    <tf-table :columns="tableCols" :data="tableData" v-loading="loading.search" @selection-change="onSelectionChange">
+      <template v-slot:operation="{ row }">
+        <el-button type="text" style="padding: 0" @click="editor(row)">编辑</el-button>
+        <el-button type="text" style="padding: 0" @click="remove(row)">删除</el-button>
+      </template>
+    </tf-table>
+    <!-- <IndexForm
+      :visible.sync="visible"
+      :loading="loading.add || loading.update"
+      :data="current"
+      :title="`${current.id ? '编辑' : '新增'}`"
+      @submit="onSubmit"
+    /> -->
+  </tf-page>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import {
+  getWarnIndexPage,
+  addIndexData,
+  editIndexData,
+  deleteWarningIndexById,
+  deleteWarningIndex
+} from '../../commonAPI/request'
+import ForewarningHeader from '../../components/ForewarningHeader.vue'
+import { IFWITableColumns } from '../../commonAPI/settings'
+import { ILoading, IForewarningSearchTerm } from '../../commonAPI/common'
+// import IndexForm from './IndexForm.vue'
+import axios from '@/utils/request'
+const exporUrl = '/tofly-sxgk/warnIndexManage/exportExcel'
+const importUrl = '/tofly-sxgk/warnIndexManage/importExcel'
+//预警指标管理
+@Component({
+  name: 'ForewarningIndex',
+  components: { ForewarningHeader }
+})
+export default class ForewarningIndex extends Vue {
+  visible: boolean = false
+
+  isActive: boolean = false
+
+  loading: ILoading = { search: false, add: false, update: false, delete: false, import: false, export: false }
+
+  term: IForewarningSearchTerm = { method: true, type: true, attention: false }
+
+  tableCols = IFWITableColumns
+
+  tableData: any = []
+
+  current: any = {}
+
+  selected: any = []
+
+  mounted() {
+    this.isActive = true
+  }
+  onSearch(data?) {
+    this.loading.search = true
+    let params = {}
+    if (data) {
+      params = {
+        warningMethod: data.method,
+        warningType: data.type
+      }
+    }
+    getWarnIndexPage(params).then((res) => {
+      try {
+        this.tableData = res.result.records.map((item) => {
+          Object.keys(item).forEach((val) => (item[val] = item[val] || '/'))
+          return { ...item }
+        })
+      } catch (error) {
+        console.log(error)
+      }
+      this.loading.search = false
+    })
+  }
+  onAdd() {
+    this.current = {}
+    this.visible = true
+  }
+  editor(row) {
+    this.current = { ...row }
+    this.visible = true
+  }
+  async remove(row) {
+    await this.$confirm(`是否确认删除此项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteWarningIndexById({ id: row.id })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  async onSubmit(data) {
+    this.loading[data.id ? 'update' : 'add'] = true
+    data['isNew'] = data['isNew'] == '是' ? 1 : 0
+    data['source'] = '人工'
+    try {
+      const { result } = await (data.id ? editIndexData({ ...data }) : addIndexData({ ...data }))
+      this.$message[result ? 'success' : 'error'](`${data.id ? '修改' : '新增'}指标${result ? '成功!' : '失败!'}`)
+      if (result) {
+        this.visible = false
+        this.onSearch()
+      }
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading[data.id ? 'update' : 'add'] = false
+  }
+
+  async onDelete(ids) {
+    await this.$confirm(`是否确认删除这${this.selected.length}项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteWarningIndex({ ids })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  onImport(data) {
+    this.loading.import = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'multipart/form-data',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'post',
+        url: importUrl,
+        data: { file: data.file }
+      })
+      .then((res) => {
+        this.$message[res.code === 1 ? 'success' : 'error'](`数据导入${res.code === 1 ? '成功!' : '失败!'}`)
+        this.onSearch()
+        this.loading.import = false
+      })
+      .catch((err) => {
+        console.log(err)
+      })
+  }
+
+  onExport(data) {
+    this.loading.export = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'application/json;charset=UTF-8',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'get',
+        url: exporUrl,
+        params: { isNew: 1, indexName: data ? data.keyword : '' },
+        responseType: 'blob'
+      })
+      .then((res) => {
+        var blob = res
+        let binaryData = []
+        binaryData.push(blob)
+        const href = window.URL.createObjectURL(new Blob(binaryData)) // 创建新的URL表示指定的blob对象
+        const a = document.createElement('a')
+        a.style.display = 'none'
+        a.href = href // 指定下载链接
+        a.download = '预警指标信息.xls' // 指定下载文件名
+        a.click()
+        this.loading.export = false
+      })
+      .catch((err) => {
+        console.log(err)
+        this.loading.export = false
+      })
+  }
+
+  onSelectionChange(selections) {
+    this.selected = [...selections]
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+/deep/ .el-table__fixed-right-patch {
+  background-color: transparent;
+}
+</style>

+ 214 - 0
src/views/groupPageDataManagement/ForewarningManagement/ForewarningIndexThreshold/widget.vue

@@ -0,0 +1,214 @@
+<template>
+  <tf-page>
+    <template v-slot:action>
+      <ForewarningHeader
+        :kplaceholder="'支持指标名称搜索'"
+        :selected="selected"
+        :actived="isActive"
+        :loading="loading"
+        @search="onSearch"
+        @add="onAdd"
+        @del="onDelete"
+        @import="onImport"
+        @export="onExport"
+      />
+    </template>
+    <tf-table :columns="tableCols" :data="tableData" v-loading="loading.search" @selection-change="onSelectionChange">
+      <template v-slot:operation="{ row }">
+        <el-button type="text" style="padding: 0" @click="editor(row)">编辑</el-button>
+        <el-button type="text" style="padding: 0" @click="remove(row)">删除</el-button>
+      </template>
+    </tf-table>
+    <!-- <IndexForm
+      :visible.sync="visible"
+      :loading="loading.add || loading.update"
+      :data="current"
+      :title="`${current.id ? '编辑' : '新增'}`"
+      @submit="onSubmit"
+    /> -->
+  </tf-page>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import {
+  getIndexList,
+  addIndexData,
+  editIndexData,
+  deleteIndexDataById,
+  deleteIndexData
+} from '../../commonAPI/request'
+import ForewarningHeader from '../../components/ForewarningHeader.vue'
+import { IFWITTableColumns } from '../../commonAPI/settings'
+import { ILoading } from '../../commonAPI/common'
+// import IndexForm from './IndexForm.vue'
+import axios from '@/utils/request'
+const exporUrl = '/tofly-sxgk/bigScreenData/exportExcel'
+const importUrl = '/tofly-sxgk/bigScreenData/importExcel'
+//预警指标管理
+@Component({
+  name: 'ForewarningIndexThreshold',
+  components: { ForewarningHeader }
+})
+export default class ForewarningIndexThreshold extends Vue {
+  visible: boolean = false
+
+  isActive: boolean = false
+
+  loading: ILoading = { search: false, add: false, update: false, delete: false, import: false, export: false }
+
+  tableCols = IFWITTableColumns
+
+  tableData: any = []
+
+  current: any = {}
+
+  selected: any = []
+
+  mounted() {
+    this.isActive = true
+  }
+  onSearch(data?) {
+    // this.loading.search = true
+    let params = {}
+    if (data) {
+      params = {
+        indexName: data ? data.keyword : ''
+      }
+      params['isNew'] = data.islatest ? 1 : 0
+    }
+    // getIndexList(params).then((res) => {
+    //   try {
+    //     this.tableData = res.result.map((item) => {
+    //       Object.keys(item).forEach((val) => (item[val] = item[val] || '/'))
+    //       return { ...item, source: item.source == '1' ? '本地导入' : '人工', isNew: item.isNew == '1' ? '是' : '否' }
+    //     })
+    //   } catch (error) {
+    //     console.log(error)
+    //   }
+    //   this.loading.search = false
+    // })
+  }
+  onAdd() {
+    this.current = {}
+    this.visible = true
+  }
+  editor(row) {
+    this.current = { ...row }
+    this.visible = true
+  }
+  async remove(row) {
+    await this.$confirm(`是否确认删除此项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteIndexDataById({ id: row.id })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  async onSubmit(data) {
+    this.loading[data.id ? 'update' : 'add'] = true
+    data['isNew'] = data['isNew'] == '是' ? 1 : 0
+    data['source'] = '人工'
+    try {
+      const { result } = await (data.id ? editIndexData({ ...data }) : addIndexData({ ...data }))
+      this.$message[result ? 'success' : 'error'](`${data.id ? '修改' : '新增'}指标${result ? '成功!' : '失败!'}`)
+      if (result) {
+        this.visible = false
+        this.onSearch()
+      }
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading[data.id ? 'update' : 'add'] = false
+  }
+
+  async onDelete(ids) {
+    await this.$confirm(`是否确认删除这${this.selected.length}项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteIndexData({ ids })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  onImport(data) {
+    this.loading.import = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'multipart/form-data',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'post',
+        url: importUrl,
+        data: { file: data.file }
+      })
+      .then((res) => {
+        this.$message[res.code === 1 ? 'success' : 'error'](`数据导入${res.code === 1 ? '成功!' : '失败!'}`)
+        this.onSearch()
+        this.loading.import = false
+      })
+      .catch((err) => {
+        console.log(err)
+      })
+  }
+
+  onExport(data) {
+    this.loading.export = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'application/json;charset=UTF-8',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'get',
+        url: exporUrl,
+        params: { isNew: 1, indexName: data ? data.keyword : '' },
+        responseType: 'blob'
+      })
+      .then((res) => {
+        var blob = res
+        let binaryData = []
+        binaryData.push(blob)
+        const href = window.URL.createObjectURL(new Blob(binaryData)) // 创建新的URL表示指定的blob对象
+        const a = document.createElement('a')
+        a.style.display = 'none'
+        a.href = href // 指定下载链接
+        a.download = '指标数据.xls' // 指定下载文件名
+        a.click()
+        this.loading.export = false
+      })
+      .catch((err) => {
+        console.log(err)
+        this.loading.export = false
+      })
+  }
+
+  onSelectionChange(selections) {
+    this.selected = [...selections]
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+/deep/ .el-table__fixed-right-patch {
+  background-color: transparent;
+}
+</style>

+ 214 - 0
src/views/groupPageDataManagement/ForewarningManagement/ForewarningInformation/widget.vue

@@ -0,0 +1,214 @@
+<template>
+  <tf-page>
+    <template v-slot:action>
+      <ForewarningHeader
+        :kplaceholder="'支持指标名称搜索'"
+        :selected="selected"
+        :actived="isActive"
+        :loading="loading"
+        @search="onSearch"
+        @add="onAdd"
+        @del="onDelete"
+        @import="onImport"
+        @export="onExport"
+      />
+    </template>
+    <tf-table :columns="tableCols" :data="tableData" v-loading="loading.search" @selection-change="onSelectionChange">
+      <template v-slot:operation="{ row }">
+        <el-button type="text" style="padding: 0" @click="editor(row)">编辑</el-button>
+        <el-button type="text" style="padding: 0" @click="remove(row)">删除</el-button>
+      </template>
+    </tf-table>
+    <!-- <IndexForm
+      :visible.sync="visible"
+      :loading="loading.add || loading.update"
+      :data="current"
+      :title="`${current.id ? '编辑' : '新增'}`"
+      @submit="onSubmit"
+    /> -->
+  </tf-page>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import {
+  getIndexList,
+  addIndexData,
+  editIndexData,
+  deleteIndexDataById,
+  deleteIndexData
+} from '../../commonAPI/request'
+import ForewarningHeader from '../../components/ForewarningHeader.vue'
+import { IFWIFTableColumns } from '../../commonAPI/settings'
+import { ILoading } from '../../commonAPI/common'
+// import IndexForm from './IndexForm.vue'
+import axios from '@/utils/request'
+const exporUrl = '/tofly-sxgk/bigScreenData/exportExcel'
+const importUrl = '/tofly-sxgk/bigScreenData/importExcel'
+//预警指标管理
+@Component({
+  name: 'ForewarningInformation',
+  components: { ForewarningHeader }
+})
+export default class ForewarningInformation extends Vue {
+  visible: boolean = false
+
+  isActive: boolean = false
+
+  loading: ILoading = { search: false, add: false, update: false, delete: false, import: false, export: false }
+
+  tableCols = IFWIFTableColumns
+
+  tableData: any = []
+
+  current: any = {}
+
+  selected: any = []
+
+  mounted() {
+    this.isActive = true
+  }
+  onSearch(data?) {
+    // this.loading.search = true
+    let params = {}
+    if (data) {
+      params = {
+        indexName: data ? data.keyword : ''
+      }
+      params['isNew'] = data.islatest ? 1 : 0
+    }
+    // getIndexList(params).then((res) => {
+    //   try {
+    //     this.tableData = res.result.map((item) => {
+    //       Object.keys(item).forEach((val) => (item[val] = item[val] || '/'))
+    //       return { ...item, source: item.source == '1' ? '本地导入' : '人工', isNew: item.isNew == '1' ? '是' : '否' }
+    //     })
+    //   } catch (error) {
+    //     console.log(error)
+    //   }
+    //   this.loading.search = false
+    // })
+  }
+  onAdd() {
+    this.current = {}
+    this.visible = true
+  }
+  editor(row) {
+    this.current = { ...row }
+    this.visible = true
+  }
+  async remove(row) {
+    await this.$confirm(`是否确认删除此项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteIndexDataById({ id: row.id })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  async onSubmit(data) {
+    this.loading[data.id ? 'update' : 'add'] = true
+    data['isNew'] = data['isNew'] == '是' ? 1 : 0
+    data['source'] = '人工'
+    try {
+      const { result } = await (data.id ? editIndexData({ ...data }) : addIndexData({ ...data }))
+      this.$message[result ? 'success' : 'error'](`${data.id ? '修改' : '新增'}指标${result ? '成功!' : '失败!'}`)
+      if (result) {
+        this.visible = false
+        this.onSearch()
+      }
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading[data.id ? 'update' : 'add'] = false
+  }
+
+  async onDelete(ids) {
+    await this.$confirm(`是否确认删除这${this.selected.length}项指标?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+    this.loading.delete = true
+    try {
+      const { result } = await deleteIndexData({ ids })
+      this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
+      result && this.onSearch()
+    } catch (error) {
+      console.log(error)
+    }
+    this.loading.delete = false
+  }
+
+  onImport(data) {
+    this.loading.import = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'multipart/form-data',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'post',
+        url: importUrl,
+        data: { file: data.file }
+      })
+      .then((res) => {
+        this.$message[res.code === 1 ? 'success' : 'error'](`数据导入${res.code === 1 ? '成功!' : '失败!'}`)
+        this.onSearch()
+        this.loading.import = false
+      })
+      .catch((err) => {
+        console.log(err)
+      })
+  }
+
+  onExport(data) {
+    this.loading.export = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'application/json;charset=UTF-8',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'get',
+        url: exporUrl,
+        params: { isNew: 1, indexName: data ? data.keyword : '' },
+        responseType: 'blob'
+      })
+      .then((res) => {
+        var blob = res
+        let binaryData = []
+        binaryData.push(blob)
+        const href = window.URL.createObjectURL(new Blob(binaryData)) // 创建新的URL表示指定的blob对象
+        const a = document.createElement('a')
+        a.style.display = 'none'
+        a.href = href // 指定下载链接
+        a.download = '指标数据.xls' // 指定下载文件名
+        a.click()
+        this.loading.export = false
+      })
+      .catch((err) => {
+        console.log(err)
+        this.loading.export = false
+      })
+  }
+
+  onSelectionChange(selections) {
+    this.selected = [...selections]
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+/deep/ .el-table__fixed-right-patch {
+  background-color: transparent;
+}
+</style>

+ 14 - 0
src/views/groupPageDataManagement/commonAPI/common.ts

@@ -1,3 +1,4 @@
+//配置管理
 export interface IActionType {
     keyword: string,
     islatest: boolean,
@@ -52,4 +53,17 @@ export interface IKeyCode {
     notes: string
     sort: string
     ulevel: string
+}
+
+//预警管理
+export interface IForewarningType {
+    keyword?: string,
+    method?: string,
+    type?: string,
+    attention?: string,
+}
+export interface IForewarningSearchTerm {
+    method?: boolean,
+    type?: boolean,
+    attention?: boolean,
 }

+ 24 - 0
src/views/groupPageDataManagement/commonAPI/request.ts

@@ -95,4 +95,28 @@ export function updatePbsList(data) {
         method: 'PUT',
         data: data,
     })
+}
+
+//预警指标管理(列表查询)
+export function getWarnIndexPage(params) {
+    return request({
+        url: '/tofly-sxgk/warnIndexManage/page',
+        method: 'get',
+        params
+    })
+}
+//预警指标管理(删除单个)
+export function deleteWarningIndexById(data) {
+    return request({
+        url: `/tofly-sxgk/warnIndexManage/${data.id}`,
+        method: 'DELETE',
+    })
+}
+//预警指标管理(批量删除)
+export function deleteWarningIndex(data) {
+    return request({
+        url: '/tofly-sxgk/warnIndexManage/deleteByIds',
+        method: 'DELETE',
+        params: data
+    })
 }

+ 73 - 2
src/views/groupPageDataManagement/commonAPI/settings.ts

@@ -1,10 +1,11 @@
 import { ColItem } from '@/api/common'
 import { ElTableColumn } from 'element-ui/types/table-column'
 const elTableAlignLeft = (tooltips: boolean = true): Partial<ElTableColumn> => ({
-    align: 'left',
-    headerAlign: 'left',
+    align: 'center',
+    headerAlign: 'center',
     showOverflowTooltip: tooltips
 })
+//指标管理
 export const IMTableColumns: ColItem[] = [
     { type: 'selection', width: '50px' },
     { type: 'index', label: '序号', width: '50px', ...elTableAlignLeft() },
@@ -26,6 +27,7 @@ export const IMTableColumns: ColItem[] = [
     { prop: 'createDate', label: '操作时间', width: '150px', ...elTableAlignLeft() },
     { prop: 'operation', label: '操作', width: '150px', _slot: true, fixed: "right" },
 ]
+//工程管理
 export const PMTableColumns: ColItem[] = [
     { type: 'index', label: '序号', width: '50px' },
     { prop: 'code', label: '工程编号' },
@@ -38,4 +40,73 @@ export const PMTableColumns: ColItem[] = [
     { prop: 'latitude', label: '纬度' },
     { prop: 'area', label: '工程面积(km²)', ...elTableAlignLeft() },
     { prop: 'operation', label: '操作', _slot: true },
+]
+//预警指标管理
+export const IFWITableColumns: ColItem[] = [
+    { type: 'selection', width: '50px' },
+    { type: 'index', label: '序号', width: '50px', ...elTableAlignLeft() },
+    { prop: 'warningMethod', label: '预警方式', width: '150px', ...elTableAlignLeft() },
+    { prop: 'warningType', label: '预警类型', width: '150px', ...elTableAlignLeft() },
+    { prop: 'warningGroup', label: '预警分组', width: '150px', ...elTableAlignLeft() },
+    { prop: 'warningIndexCode', label: '预警指标代码', width: '150px', ...elTableAlignLeft() },
+    { prop: 'warningIndexName', label: '预警指标名称', width: '150px', ...elTableAlignLeft() },
+    { prop: 'warningIndexShortName', label: '预警指标简称', width: '150px', ...elTableAlignLeft() },
+    { prop: 'explan', label: '说明', width: '150px', ...elTableAlignLeft() },
+    { prop: 'dataSources', label: '数据来源', width: '150px', ...elTableAlignLeft() },
+    { prop: 'linkedData', label: '关联数据', width: '150px', ...elTableAlignLeft() },
+    { prop: 'isEnable', label: '是否启用', width: '150px', ...elTableAlignLeft() },
+    { prop: 'createUserName', label: '操作人', width: '150px', ...elTableAlignLeft() },
+    { prop: 'createDate', label: '操作时间', width: '150px', ...elTableAlignLeft() },
+    { prop: 'operation', label: '操作', width: '150px', _slot: true, fixed: "right" },
+]
+//预警指标阈值管理
+export const IFWITTableColumns: ColItem[] = [
+    { type: 'selection', width: '50px' },
+    { type: 'index', label: '序号', width: '50px', ...elTableAlignLeft() },
+    { prop: '', label: '预警类型', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警分组', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警指标代码', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警指标名称', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警阈值编码', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '关注程度', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '指标参数', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '单位', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '特定值', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '下限', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '上限', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '有效时段', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警提示信息', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '详细信息', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '说明', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '是否启用', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '操作人', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '操作时间', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '操作', width: '150px', _slot: true, fixed: "right" },
+]
+//预警信息管理
+export const IFWIFTableColumns: ColItem[] = [
+    { type: 'selection', width: '50px' },
+    { type: 'index', label: '序号', width: '50px', ...elTableAlignLeft() },
+    { prop: '', label: '编号', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警指标名称', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '关注程度', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警等级', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警提示信息', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警详情', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '位置', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '经度', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '纬度', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警说明', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '处理状态', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '处理状态详情', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '说明', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '数据来源', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '关联数据', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '发现时间', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '预警时间', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '处理时间', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '操作时间', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '操作人', width: '150px', ...elTableAlignLeft() },
+    { prop: '', label: '是否显示', width: '150px', _slot: true, fixed: "right" },
+    { prop: '', label: '是否有效', width: '150px', _slot: true, fixed: "right" },
 ]

+ 116 - 0
src/views/groupPageDataManagement/components/ForewarningHeader.vue

@@ -0,0 +1,116 @@
+<template>
+  <el-form class="form" ref="form" v-bind="{ labelWidth: 'auto', size: 'small' }" :model="formData" inline>
+    <el-row type="flex" justify="space-between">
+      <div>
+        <el-form-item label="关键字:" prop="keyword">
+          <el-input v-model="formData.keyword" :placeholder="kplaceholder" clearable />
+        </el-form-item>
+        <el-form-item label="预警方式:" v-if="term.method">
+          <el-select v-model="formData.method" filterable clearable>
+            <el-option v-for="item in methodOptions" :key="item.id" :label="item.notes" :value="item.codeValue" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="预警类型:" v-if="term.type">
+          <el-select v-model="formData.type" filterable clearable>
+            <el-option v-for="item in typeOptions" :key="item.id" :label="item.notes" :value="item.codeValue" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="关注程度:" v-if="term.attention">
+          <el-select v-model="formData.attention" filterable clearable>
+            <el-option v-for="item in attentionOptions" :key="item.id" :label="item.notes" :value="item.codeValue" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            icon="el-icon-search"
+            type="primary"
+            @click="$emit('search', { ...formData })"
+            :loading="loading.search"
+            :disabled="loading.search"
+            >查询</el-button
+          >
+        </el-form-item>
+      </div>
+      <div>
+        <el-form-item>
+          <el-button type="primary" @click="$emit('add')" icon="el-icon-plus"> 新增 </el-button>
+          <el-button
+            type="danger"
+            @click="$emit('del', ids)"
+            icon="el-icon-delete"
+            :loading="loading.delete"
+            :disabled="loading.delete || !selected.length"
+          >
+            删除
+          </el-button>
+          <el-upload
+            style="margin: 0 10px; display: inline-block"
+            action="#"
+            :http-request="uploadHttpRequest"
+            :limit="1"
+            :show-file-list="false"
+            accept=".xls, .xlsx"
+          >
+            <el-button type="primary" size="small" icon="el-icon-download" :loading="loading.import"> 导入 </el-button>
+          </el-upload>
+          <el-button
+            type="primary"
+            @click="$emit('export', { ...formData })"
+            icon="el-icon-upload2"
+            :loading="loading.export"
+          >
+            导出
+          </el-button>
+        </el-form-item>
+      </div>
+    </el-row>
+  </el-form>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import { IForewarningType, IForewarningSearchTerm, IKeyCode } from '../commonAPI/common'
+import { ILoading } from '../commonAPI/common'
+import { getByKeys } from '../commonAPI/request'
+@Component({ name: 'ForewarningHeader' })
+export default class ForewarningHeader extends Vue {
+  @Prop({ type: Object, default: () => ({}) }) loading!: ILoading
+  @Prop({ type: String, default: '' }) kplaceholder!: string
+  @Prop({ type: Boolean, default: false }) actived!: boolean
+  @Prop({ type: Array, default: () => [] }) selected!: any
+  @Prop({ type: Object, default: () => ({}) }) term!: IForewarningSearchTerm
+  @Watch('actived')
+  onActived(active: boolean) {
+    if (active) {
+      this.$emit('search', { ...this.formData })
+      this.loadSelectInfo()
+    }
+  }
+  get ids() {
+    return this.selected.map((item) => item.id).join()
+  }
+  formData: Partial<IForewarningType> = {}
+  methodOptions: Array<IKeyCode> = []
+  typeOptions: Array<IKeyCode> = []
+  attentionOptions: Array<IKeyCode> = []
+  uploadHttpRequest(file) {
+    this.$emit('import', file)
+  }
+
+  async loadSelectInfo() {
+    let res = null
+    if (this.term.method) {
+      res = await getByKeys({ keys: 'WARNING_METHOD' })
+      this.methodOptions = res.result.WARNING_METHOD
+    }
+    if (this.term.type) {
+      res = await getByKeys({ keys: 'WARNING_TYPE' })
+      this.typeOptions = res.result.WARNING_TYPE
+    }
+    if (this.term.attention) {
+      res = await getByKeys({ keys: 'CONCERN_EXTENT' })
+      this.attentionOptions = res.result.CONCERN_EXTENT
+    }
+  }
+}
+</script>