xieqy 3 years ago
parent
commit
e2f9461386

+ 2 - 2
src/views/groupPageDataManagement/IndexManagement/IndexForm.vue

@@ -20,7 +20,7 @@
             <el-date-picker
               v-if="type === 'date'"
               v-model="formData[name]"
-              value-format="yyyy-MM-dd"
+              value-format="yyyy-MM-dd HH:mm:ss"
               format="yyyy-MM-dd"
               :disabled="disabled"
               :placeholder="`请选择${label}`"
@@ -52,7 +52,7 @@
               v-bind="rest"
             />
           </el-form-item>
-          <el-row>
+          <el-row style="display: inline-block; width: 100%">
             <el-form-item :key="'floatTips'" :label="'提示信息'" :prop="'floatTips'">
               <el-input
                 v-model="formData['floatTips']"

+ 130 - 10
src/views/groupPageDataManagement/IndexManagement/widget.vue

@@ -8,6 +8,9 @@
         :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">
@@ -28,11 +31,14 @@
 
 <script lang="ts">
 import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
-import { getRequestResult } from '../commonAPI/request'
+import { getIndexList, addIndexData, editIndexData, deleteIndexDataById, deleteIndexData } from '../commonAPI/request'
 import ActionHeader from '../components/ActionHeader.vue'
 import { IMTableColumns } 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: 'IndexManagement',
@@ -56,13 +62,32 @@ export default class IndexManagement extends Vue {
   mounted() {
     this.isActive = true
   }
-  onSearch(data) {
+  onSearch(data?) {
     this.loading.search = true
-    getRequestResult({ blockCode: 'ycepclist' }).then((res: any) => {
-      this.tableData = res.map((item) => {
-        Object.keys(item).forEach((val) => (item[val] = item[val] || '/'))
-        return { ...item, source: '本地导入', isNew: '是' }
-      })
+    let params = {}
+    if (data) {
+      params = {
+        indexName: data ? data.keyword : ''
+      }
+      if (data.latest) {
+        params['isNew'] = 0
+      }
+      if (data.notlatest) {
+        params['isNew'] = 1
+      }
+      if (data.latest && data.notlatest) {
+        delete params['isNew']
+      }
+    }
+    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 == '0' ? '是' : '否' }
+        })
+      } catch (error) {
+        console.log(error)
+      }
       this.loading.search = false
     })
   }
@@ -74,10 +99,105 @@ export default class IndexManagement extends Vue {
     this.current = { ...row }
     this.visible = true
   }
-  remove(row) {}
+  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
+    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
+  }
 
-  onSubmit(data) {
-    console.log(data)
+  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() {
+    this.loading.export = true
+    axios
+      .request({
+        headers: {
+          'Content-Type': 'application/json;charset=UTF-8',
+          Authorization: 'bearer ' + sessionStorage.getItem('token')
+        },
+        method: 'get',
+        url: exporUrl,
+        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) {

+ 30 - 9
src/views/groupPageDataManagement/ProjectManagement/ProjectForm.vue

@@ -10,7 +10,7 @@
           :rules="rules"
         >
           <el-form-item
-            v-for="{ name, label, type, required, options, onChange, disabled, ...rest } of formItems"
+            v-for="{ name, label, type, required, options, disabled, ...rest } of formItems"
             :key="name"
             :required="required"
             :label="label"
@@ -35,10 +35,9 @@
               size="small"
               clearable
               v-bind="rest"
-              @change="onChange"
               style="width: 100%"
             >
-              <el-option v-for="item in options" :key="item.id" :label="item.deviceTypeName" :value="item.id" />
+              <el-option v-for="item in options" :key="item.id" :label="item.notes" :value="item.notes" />
             </el-select>
             <el-input
               v-else
@@ -100,7 +99,8 @@
 <script lang="ts">
 import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
 import { ElForm } from 'element-ui/types/form'
-import { IProject } from '../commonAPI/common'
+import { IProject, IKeyCode } from '../commonAPI/common'
+import { getByKeys } from '../commonAPI/request'
 import * as turf from '@turf/turf'
 //地图变量
 const Cesium = (window as any).Cesium
@@ -127,6 +127,14 @@ export default class ProjectForm extends Vue {
 
   polygonDraw
 
+  types: IKeyCode[] = []
+
+  status: IKeyCode[] = []
+
+  created() {
+    this.getDictionaryValue()
+  }
+
   get listeners() {
     const { submit, ...rest } = this.$listeners
     return rest
@@ -136,8 +144,13 @@ export default class ProjectForm extends Vue {
     return [
       { label: '工程编号', name: 'code', disabled: true },
       { label: '工程名称', name: 'name', disabled: true },
-      { label: '工程类型', name: 'projectType', type: 'select' },
-      { label: '工程状态', name: 'projectStatus', type: 'select' },
+      { label: '工程类型', name: 'projectType', type: 'select', options: this.types },
+      {
+        label: '工程状态',
+        name: 'projectStatus',
+        type: 'select',
+        options: this.status
+      },
       { label: '计划开始时间', name: 'planBeginDate', type: 'date', style: 'width:100%' },
       { label: '计划结束时间', name: 'planEndDate', type: 'date', style: 'width:100%' }
     ]
@@ -164,6 +177,13 @@ export default class ProjectForm extends Vue {
     this.formData = val.id ? { ...val } : { ...getDefaultValue() }
   }
 
+  async getDictionaryValue() {
+    let pType = await getByKeys({ keys: 'PROJECT_TYPE' })
+    let pStatus = await getByKeys({ keys: 'PROJECT_STATUS' })
+    this.types = pType.result.PROJECT_TYPE
+    this.status = pStatus.result.PROJECT_STATUS
+  }
+
   //图上选择坐标
   selectCoord() {
     const viewer = (window as any).viewer
@@ -260,7 +280,6 @@ export default class ProjectForm extends Vue {
         if (Cesium.defined(polygon)) {
           positions.push(position)
         }
-        console.log('分区绘制', polygon, positions)
         this.getArea(polygon)
         isDrawing = false
         this.clearDrawHandler()
@@ -275,12 +294,14 @@ export default class ProjectForm extends Vue {
     const positions = polygon.polygon.hierarchy.getValue(Cesium.JulianDate.now())
     const scopePositions = positions.positions.map((position) => {
       const lonlat = Cesium.Cartographic.fromCartesian(position)
-      return { x: Cesium.Math.toDegrees(lonlat.longitude), y: Cesium.Math.toDegrees(lonlat.latitude) }
+      return [Cesium.Math.toDegrees(lonlat.longitude), Cesium.Math.toDegrees(lonlat.latitude)]
     })
+    scopePositions.push(scopePositions[0]) //形成闭环
+    console.log(scopePositions)
     this.formData.range = JSON.stringify({ coordinates: scopePositions })
     //面积计算
     const newLonlat = scopePositions.map((item) => {
-      return [item.x, item.y]
+      return item
     })
     newLonlat.push(newLonlat[0])
     const turfpolygon = turf.polygon([newLonlat])

+ 9 - 5
src/views/groupPageDataManagement/ProjectManagement/widget.vue

@@ -74,12 +74,16 @@ export default class IndexManagement extends Vue {
       prjId: this.prjId
     }
     getPbsListWithRange(params).then((res) => {
-      this.tableData = res.result[0].structures.map((item) => {
-        Object.keys(item).forEach((val) => {
-          item[val] = item[val] || '/'
+      try {
+        this.tableData = res.result[0].structures.map((item) => {
+          Object.keys(item).forEach((val) => {
+            item[val] = item[val] || '/'
+          })
+          return { ...item }
         })
-        return { ...item }
-      })
+      } catch (error) {
+        console.log(error)
+      }
       this.loading.search = false
     })
   }

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

@@ -39,4 +39,16 @@ export interface IProject {
     latitude: string,
     range: string,
     area: string
+}
+
+export interface IKeyCode {
+    codeKey: string
+    codeRemark: string
+    codeValue: string
+    createTime: string
+    createUser: string
+    id: string
+    notes: string
+    sort: string
+    ulevel: string
 }

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

@@ -26,6 +26,53 @@ export function getRequestResult(params) {
     })
     return returnData
 }
+//字典查询
+export function getByKeys(params) {
+    return request({
+        url: '/base/code/getByKeys',
+        method: 'get',
+        params
+    })
+}
+//指标管理查询
+export function getIndexList(params) {
+    return request({
+        url: '/tofly-sxgk/bigScreenData/list',
+        method: 'get',
+        params
+    })
+}
+//新增指标管理
+export function addIndexData(data) {
+    return request({
+        url: '/tofly-sxgk/bigScreenData',
+        method: 'post',
+        data
+    })
+}
+//修改指标管理
+export function editIndexData(data) {
+    return request({
+        url: '/tofly-sxgk/bigScreenData',
+        method: 'put',
+        data
+    })
+}
+//删除单个指标
+export function deleteIndexDataById(data) {
+    return request({
+        url: `/tofly-sxgk/bigScreenData/${data.id}`,
+        method: 'DELETE',
+    })
+}
+//批量删除指标
+export function deleteIndexData(data) {
+    return request({
+        url: '/tofly-sxgk/bigScreenData/deleteByIds',
+        method: 'DELETE',
+        params: data
+    })
+}
 //带范围的工程结构树
 // export function getPbsListWithRange(params) {
 //     return request({

+ 3 - 3
src/views/groupPageDataManagement/commonAPI/settings.ts

@@ -11,11 +11,11 @@ export const IMTableColumns: ColItem[] = [
     { prop: 'dataGroup', label: '分组', width: '150px' },
     { prop: 'projectCode', label: '项目编码', width: '150px' },
     { prop: 'projectName', label: '项目名称', width: '150px' },
-    { prop: 'mangeField', label: '管理领域', width: '150px' },
+    { prop: 'mangeField', label: '管理领域', width: '150px', ...elTableAlignLeft() },
     { prop: 'indexType', label: '指标分类', width: '150px' },
     { prop: 'indexCode', label: '指标代码', width: '150px' },
-    { prop: 'indexName', label: '指标名称', width: '150px' },
-    { prop: 'indexValue', label: '值', width: '150px' },
+    { prop: 'indexName', label: '指标名称', width: '150px', ...elTableAlignLeft() },
+    { prop: 'indexValue', label: '值', width: '150px', ...elTableAlignLeft() },
     { prop: 'unit', label: '单位', width: '150px' },
     { prop: 'floatTips', label: '提示信息', width: '150px', ...elTableAlignLeft() },
     { prop: 'note', label: '指标说明', width: '150px' },

+ 29 - 4
src/views/groupPageDataManagement/components/ActionHeader.vue

@@ -23,15 +23,33 @@
         <el-button
           type="danger"
           size="small"
-          @click="$emit('del')"
+          @click="$emit('del', ids)"
           icon="el-icon-delete"
           :loading="loading.delete"
           :disabled="loading.delete || !selected.length"
         >
           删除
         </el-button>
-        <el-button type="primary" size="small" @click="$emit('import')" icon="el-icon-download"> 导入 </el-button>
-        <el-button type="primary" size="small" @click="$emit('export')" icon="el-icon-upload2"> 导出 </el-button>
+        <!-- <el-button type="primary" size="small" @click="$emit('import')" icon="el-icon-download"> 导入 </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"
+          size="small"
+          @click="$emit('export')"
+          icon="el-icon-upload2"
+          :loading="loading.export"
+        >
+          导出
+        </el-button>
       </el-form-item>
     </template>
   </el-form>
@@ -41,6 +59,7 @@
 import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
 import { IActionType } from '../commonAPI/common'
 import { ILoading } from '../commonAPI/common'
+import axios from '@/utils/request'
 @Component({ name: 'ActionHeader' })
 export default class ActionHeader extends Vue {
   @Prop({ type: Object, default: () => ({}) }) loading!: ILoading
@@ -54,6 +73,12 @@ export default class ActionHeader extends Vue {
       this.$emit('search', { ...this.formData })
     }
   }
-  formData: Partial<IActionType> = { latest: true }
+  formData: Partial<IActionType> = { notlatest: true }
+  get ids() {
+    return this.selected.map((item) => item.id).join()
+  }
+  uploadHttpRequest(file) {
+    this.$emit('import', file)
+  }
 }
 </script>