LR 2 anos atrás
pai
commit
111a9e17fb

+ 3 - 3
src/api/common/index.ts

@@ -8,7 +8,7 @@ const uris = {
   }
 }
 
-interface IQueryCommon extends IPagination {
+export interface IQueryCommon extends IPagination {
   hitCount?: boolean
   optimizeCountSql?: boolean
   orders?: { asc?: boolean; column?: string }[]
@@ -16,13 +16,13 @@ interface IQueryCommon extends IPagination {
   searchCount?: boolean
 }
 
-type IRes<T = any> = Promise<{
+export type IRes<T = any> = Promise<{
   code: number
   message: string
   result: IQueryCommon & { records: T }
 }>
 
-type IResult<T = any> = Promise<{
+export type IResult<T = any> = Promise<{
   code: number
   message: string
   result: T

+ 64 - 0
src/views/spectrum/configuration/api/common.ts

@@ -0,0 +1,64 @@
+import { ElTableColumn } from 'element-ui/types/table-column'
+
+export const base = '/survey'
+
+export interface ColItem extends Partial<ElTableColumn> {
+  _slot?: boolean
+}
+export interface IPagination {
+  current?: string | number
+  size?: string | number
+  total?: string | number
+}
+export interface IDeviceType {
+  dataUploadTime: number
+  dictionaryId: number
+  fileTypeID: number
+  projectId: number
+  deviceTypeName: string
+  file: string
+  projectName: string
+}
+
+export interface IStandard {
+  projectId: number
+  projectName: number
+  standardName: string
+  typeId: number
+}
+
+export interface IDevice {
+  id?: number
+  buyTime: string
+  deviceFirm: string
+  deviceModel: string
+  deviceName: string
+  deviceSn: string
+  deviceType: number
+  deviceTypeName: string
+  fileTypeID: number
+  filesPath: string
+  firmLiaison: string
+  liaisonPhone: string
+  projectCode: string
+  projectId: number
+  projectName: string
+  remark: string
+}
+
+export interface IDeviceTypeParam {}
+
+export interface IPoint {
+  drainageId: number
+  drainageName: string
+  drainageRoadName: string
+  drainageType: string
+  latitude: number
+  longitude: number
+  projectCode: string
+  projectId: number
+  projectName: number
+  sectionId: string
+  siteAddress: string
+  siteName: string
+}

+ 25 - 0
src/views/spectrum/configuration/api/device.ts

@@ -0,0 +1,25 @@
+import { IQueryCommon, IRes, IResult } from '@/api/common'
+import axios from '@/utils/request'
+import { base, IDevice } from './common'
+
+const uris = {
+  base: `${base}/collectdevice`,
+  page: `${base}/collectdevice/page`,
+  del: `${base}/collectdevice/deleteByIds`
+}
+
+export const addDevice = (data: Omit<IDevice, 'id'>) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'post', data })
+
+export const deleteDevice = (id: string) =>
+  axios.request<IRes<boolean>>({ url: `${uris.base}/${id}`, method: 'delete' })
+
+export const updateDevice = (data: IDevice) => axios.request<IRes<boolean>>({ url: uris.base, method: 'put', data })
+
+export const getDevice = (id: string) => axios.request<IResult<IDevice>>({ url: `${uris.base}/${id}`, method: 'get' })
+
+export const devicePage = (params: IDevice & IQueryCommon) =>
+  axios.request<IRes<IDevice[]>>({ url: uris.page, method: 'get', params })
+
+export const deleteDeviceBatch = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.del, method: 'delete', params: { ids } })

+ 50 - 0
src/views/spectrum/configuration/api/deviceType.ts

@@ -0,0 +1,50 @@
+import { IQueryCommon, IRes, IResult } from '@/api/common'
+import axios from '@/utils/request'
+import { base, IDeviceType, IDeviceTypeParam } from './common'
+
+const uris = {
+  base: `${base}/devicetypep`,
+  page: `${base}/devicetypep/page`,
+  del: `${base}/devicetypep/deleteByIds`,
+  param: {
+    base: `${base}/devicetargetp`,
+    page: `${base}/devicetargetp/page`,
+    del: `${base}/devicetargetp/deleteByIds`
+  }
+}
+
+export const addDeviceType = (data: Omit<IDeviceType, 'id'>) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'post', data })
+
+export const deleteDeviceType = (id: string) =>
+  axios.request<IRes<boolean>>({ url: `${uris.base}/${id}`, method: 'delete' })
+
+export const updateDeviceType = (data: IDeviceType) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'put', data })
+
+export const getDeviceType = (id: string) =>
+  axios.request<IResult<IDeviceType>>({ url: `${uris.base}/${id}`, method: 'get' })
+
+export const deviceTypesPage = (params: IDeviceType & IQueryCommon) =>
+  axios.request<IRes<IDeviceType[]>>({ url: uris.page, method: 'get', params })
+
+export const deleteDeviceTypeBatch = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.del, method: 'delete', params: { ids } })
+
+export const addDeviceTypeParam = (data: Omit<IDeviceTypeParam, 'id'>) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'post', data })
+
+export const deleteDeviceTypeParam = (id: string) =>
+  axios.request<IRes<boolean>>({ url: `${uris.base}/${id}`, method: 'delete' })
+
+export const updateDeviceTypeParam = (data: IDeviceTypeParam) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'put', data })
+
+export const getDeviceTypeParam = (id: string) =>
+  axios.request<IResult<IDeviceTypeParam>>({ url: `${uris.base}/${id}`, method: 'get' })
+
+export const deviceTypeParamPage = (params: IDeviceTypeParam & IQueryCommon) =>
+  axios.request<IRes<IDeviceTypeParam[]>>({ url: uris.page, method: 'get', params })
+
+export const deleteDeviceTypeParamBatch = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.del, method: 'delete', params: { ids } })

+ 35 - 0
src/views/spectrum/configuration/api/point.ts

@@ -0,0 +1,35 @@
+import { IQueryCommon, IRes, IResult } from '@/api/common'
+import axios from '@/utils/request'
+import { base, IPoint } from './common'
+
+const uris = {
+  base: `${base}/surveysite`,
+  page: `${base}/surveysite/page`,
+  del: `${base}/surveysite/deleteByIds`,
+  detail: `${base}/surveysite/details`,
+  discard: `${base}/surveysite/toVoid`,
+  list: `${base}/surveysite/list`
+}
+
+export const addPoint = (data: Omit<IPoint, 'id'>) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'post', data })
+
+export const deletePoint = (id: string) => axios.request<IRes<boolean>>({ url: `${uris.base}/${id}`, method: 'delete' })
+
+export const updatePoint = (data: IPoint) => axios.request<IRes<boolean>>({ url: uris.base, method: 'put', data })
+
+export const getPoint = (id: string) => axios.request<IResult<IPoint>>({ url: `${uris.base}/${id}`, method: 'get' })
+
+export const devicePage = (params: IPoint & IQueryCommon) =>
+  axios.request<IRes<IPoint[]>>({ url: uris.page, method: 'get', params })
+
+export const deletePointBatch = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.del, method: 'delete', params: { ids } })
+
+export const getDetail = (id: string) => axios.request<IResult<IPoint>>({ url: `${uris.detail}/${id}`, method: 'get' })
+
+export const discard = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.discard, method: 'get', params: { ids } })
+
+export const getAllPoints = (params: IPoint & IQueryCommon) =>
+  axios.request<IRes<IPoint>>({ url: uris.list, method: 'get', params })

+ 26 - 0
src/views/spectrum/configuration/api/standard.ts

@@ -0,0 +1,26 @@
+import { IQueryCommon, IRes, IResult } from '@/api/common'
+import axios from '@/utils/request'
+import { base, IStandard } from './common'
+
+const uris = {
+  base: `${base}/standardtargetp`,
+  page: `${base}/standardtargetp/page`,
+  del: `${base}/standardtargetp/deleteByIds`
+}
+
+export const addStandard = (data: Omit<IStandard, 'id'>) =>
+  axios.request<IRes<boolean>>({ url: uris.base, method: 'post', data })
+
+export const deleteStandard = (id: string) =>
+  axios.request<IRes<boolean>>({ url: `${uris.base}/${id}`, method: 'delete' })
+
+export const updateStandard = (data: IStandard) => axios.request<IRes<boolean>>({ url: uris.base, method: 'put', data })
+
+export const getStandard = (id: string) =>
+  axios.request<IResult<IStandard>>({ url: `${uris.base}/${id}`, method: 'get' })
+
+export const standardPage = (params: IStandard & IQueryCommon) =>
+  axios.request<IRes<IStandard[]>>({ url: uris.page, method: 'get', params })
+
+export const deleteStandardBatch = (ids: string) =>
+  axios.request<IRes<boolean>>({ url: uris.del, method: 'delete', params: { ids } })

+ 238 - 0
src/views/spectrum/configuration/type/ParamForm.vue

@@ -0,0 +1,238 @@
+<template>
+  <BaseDialog v-bind="$attrs" v-on="listeners" @submit="onSubmit" :loading="loading">
+    <el-form class="form" ref="form" v-bind="{ labelWidth: '6em', size: 'medium' }" :model="formData">
+      <el-form-item
+        v-for="{ name, label, type, required = false, rules, items, ...rest } of formItems"
+        :key="name"
+        :required="required"
+        :label="label"
+        :rules="rules"
+        :prop="name"
+      >
+        <el-row v-if="name === 'range'" type="flex" justify="space-between">
+          <el-col>
+            <el-form-item :rules="items[0].rules" :prop="items[0].name">
+              <el-input-number
+                v-model="formData[items[0].name]"
+                :placeholder="`${items[0].label}`"
+                v-bind="items[0].rest"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col style="flex: 0 0 2em; text-align: center">至</el-col>
+          <el-col>
+            <el-form-item :rules="items[1].rules" :prop="items[1].name">
+              <el-input-number
+                v-model="formData[items[1].name]"
+                :placeholder="`${items[1].label}`"
+                v-bind="items[1].rest"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-switch v-else-if="type === 'switch'" v-model="formData[name]" v-bind="rest" />
+        <el-input-number
+          v-else-if="type === 'number'"
+          v-model="formData[name]"
+          controls-position="right"
+          :placeholder="`请输入${label}`"
+          v-bind="rest"
+        />
+        <el-input
+          v-else
+          v-model="formData[name]"
+          :placeholder="`请输入${label}`"
+          :type="type || 'text'"
+          v-bind="rest"
+          clearable
+        >
+          <template slot="suffix" v-if="name === 'rate'"> 分钟 </template>
+        </el-input>
+      </el-form-item>
+    </el-form>
+  </BaseDialog>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import BaseDialog from '@/views/monitoring/components/BaseDialog/index.vue'
+import { ElForm } from 'element-ui/types/form'
+import { IDeviceTypeParam } from '@/views/monitoring/api'
+import { getDefalutNumberProp } from '@/views/monitoring/utils'
+
+const getDefaultData = () => ({ isDisplay: 1, sort: 0, rate: 1 })
+
+@Component({ name: 'ParamForm', components: { BaseDialog } })
+export default class ParamForm extends Vue {
+  @Prop({ type: Object, default: () => ({}) }) data!: object
+  @Prop({ type: Boolean, default: false }) loading!: boolean
+  $refs!: { form: ElForm }
+  formData: IDeviceTypeParam = getDefaultData()
+
+  get listeners() {
+    const { submit, ...rest } = this.$listeners
+    return rest
+  }
+
+  validatelrangeLow(_, value, callback) {
+    if (this.formData.lrangeUp && value >= +this.formData.lrangeUp) {
+      callback(new Error('下限需小于上限'))
+    } else {
+      if (this.formData.lrangeUp !== '') {
+        this.$refs.form.clearValidate('lrangeUp')
+      }
+      callback()
+    }
+  }
+  validatelrangeUp(_, value, callback) {
+    if (this.formData.lrangeLow && value <= +this.formData.lrangeLow) {
+      callback(new Error('上限需大于下限'))
+    } else {
+      if (this.formData.lrangeLow !== '') {
+        this.$refs.form.validateField('lrangeLow')
+      }
+      callback()
+    }
+  }
+  get formItems() {
+    return [
+      {
+        label: '参数名称',
+        name: 'name',
+        rules: [
+          { required: true, message: '参数名称不能为空!' },
+          { max: 20, message: '参数名称不超过20个字符' },
+          { pattern: /^[\u4e00-\u9fa5\w -]+$/, message: '允许输入汉字、英文、数字', trigger: 'blur' }
+        ],
+        size: 'small',
+        required: true
+      },
+      {
+        label: '参数代码',
+        name: 'code',
+        rules: [
+          { required: true, message: '参数代码不能为空!', trigger: 'blur' },
+          { max: 20, message: '参数代码不超过20个字符' },
+          { pattern: /^[a-zA-Z][\w-]*$/, message: '字母开头,允许输入英文、数字', trigger: 'blur' }
+        ],
+        size: 'small',
+        required: true
+      },
+      {
+        label: '参数简称',
+        name: 'codeAbridge',
+        rules: [
+          { required: false, message: '参数简称不能为空!', trigger: 'blur' },
+          { max: 20, message: '参数简称不超过20个字符' },
+          { pattern: /^[a-zA-Z][\w-]*$/, message: '字母开头,允许输入英文、数字', trigger: 'blur' }
+        ],
+        size: 'small'
+      },
+      {
+        label: '参数单位',
+        name: 'unit',
+        rules: [
+          { required: false, message: '参数单位不能为空!', trigger: 'blur' },
+          { max: 20, message: '参数单位不超过20个字符' }
+        ],
+        size: 'small'
+      },
+      {
+        label: '量程',
+        name: 'range',
+        items: [
+          {
+            label: '量程下限',
+            name: 'lrangeLow',
+            type: 'number',
+            rest: {
+              ...getDefalutNumberProp(),
+              precision: 2,
+              max: Number(this.formData.lrangeUp) || 9999999,
+              controls: false
+            },
+            rules: [{ validator: this.validatelrangeLow, trigger: 'blur' }]
+          },
+          {
+            label: '量程上限',
+            name: 'lrangeUp',
+            type: 'number',
+            rest: {
+              ...getDefalutNumberProp(),
+              precision: 2,
+              min: Number(this.formData.lrangeLow) || 0,
+              controls: false
+            },
+            rules: [{ validator: this.validatelrangeUp, trigger: 'blur' }]
+          }
+        ]
+      },
+      {
+        label: '采集频率',
+        name: 'rate',
+        type: 'number',
+        rules: [
+          { required: true, message: '数据采集频率不能为空!', trigger: 'blur' },
+          { type: 'integer', min: -1, max: 60 * 24 * 30, message: `数据采集频率须大于0小于${60 * 24 * 30}` }
+        ],
+        ...getDefalutNumberProp()
+      },
+      {
+        label: '是否显示',
+        name: 'isDisplay',
+        type: 'switch',
+        rules: [{ required: true, message: '请选择是否显示', trigger: 'blur' }],
+        size: 'small',
+        activeValue: 1,
+        inactiveValue: 0
+      },
+      {
+        label: '显示顺序',
+        name: 'sort',
+        type: 'number',
+        rules: [{ type: 'integer', min: -1, message: '显示顺序为数字' }],
+        size: 'small',
+        ...getDefalutNumberProp()
+      },
+      {
+        label: '备注',
+        name: 'note',
+        rules: [{ required: false, max: 255, message: '备注不能超过255个字符' }],
+        type: 'textarea',
+        rows: 4,
+        size: 'small'
+      }
+    ]
+  }
+  onSubmit() {
+    this.$refs.form.validate(
+      (valid) =>
+        valid &&
+        this.$emit('submit', { ...this.formData, codeAbridge: this.formData.codeAbridge || this.formData.code })
+    )
+  }
+
+  @Watch('data', { immediate: true })
+  setDefaultData({ lrangeLow, lrangeUp, isDisplay, id, ...rest }) {
+    this.formData = id
+      ? {
+          lrangeLow: lrangeLow || undefined,
+          lrangeUp: lrangeUp || undefined,
+          isDisplay: Number(isDisplay),
+          id,
+          ...rest
+        }
+      : getDefaultData()
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form {
+  >>> .el-input-number {
+    width: 100%;
+    .el-input__inner {
+      text-align: left;
+    }
+  }
+}
+</style>

+ 128 - 0
src/views/spectrum/configuration/type/TypeForm.vue

@@ -0,0 +1,128 @@
+<template>
+  <BaseDialog v-bind="$attrs" v-on="listeners" @submit="onSubmit" :loading="loading">
+    <el-form class="form" ref="form" v-bind="{ labelWidth: '8em', size: 'medium' }" :model="formData">
+      <el-form-item
+        v-for="{ name, label, rules, required = false, type = 'text', onChange, ...rest } of formItems"
+        :key="name"
+        :required="required"
+        :label="label"
+        :rules="rules"
+        :prop="name"
+      >
+        <el-switch v-if="type === 'switch'" v-model="formData[name]" v-bind="rest" @change="onChange" />
+        <el-input-number
+          v-else-if="type === 'number'"
+          v-model="formData[name]"
+          controls-position="right"
+          :placeholder="`请输入${label}`"
+          v-bind="rest"
+        />
+        <el-input v-else v-model="formData[name]" :placeholder="`请输入${label}`" clearable v-bind="rest">
+          <template slot="suffix" v-if="name === 'collectTime'">
+            分钟
+          </template>
+        </el-input>
+      </el-form-item>
+    </el-form>
+  </BaseDialog>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import BaseDialog from '@/views/monitoring/components/BaseDialog/index.vue'
+import { ElForm } from 'element-ui/types/form'
+
+const getDefaultValue = () => ({ sort: 1, isCollect: 1 })
+
+@Component({ name: 'TypeForm', components: { BaseDialog } })
+export default class TypeForm extends Vue {
+  @Prop({ type: Object, default: () => ({}) }) data!: object
+  @Prop({ type: Boolean, default: false }) loading!: boolean
+  $refs!: { form: ElForm }
+  formData: { [x: string]: string | number | boolean } = getDefaultValue()
+  get listeners() {
+    const { submit, ...rest } = this.$listeners
+    return rest
+  }
+  get formItems() {
+    return [
+      {
+        label: '设备类型名称',
+        name: 'name',
+        required: true,
+        rules: [
+          { required: true, message: '设备类型名称不能为空!' },
+          { max: 50, message: '设备类型名称不超过50个字符' },
+          { pattern: /^[\u4e00-\u9fa5\w -]+$/, message: '允许输入汉字、英文、数字' }
+        ],
+        size: 'small'
+      },
+      {
+        label: '设备类型代码',
+        name: 'typeCode',
+        rules: [
+          { required: false, message: '设备类型代码不能为空!' },
+          { max: 50, message: '设备类型代码不超过50个字符' },
+          { pattern: /^[\w-]+$/, message: '允许输入英文、数字' }
+        ],
+        size: 'small'
+      },
+      {
+        label: '是否归集',
+        name: 'isCollect',
+        required: true,
+        type: 'switch',
+        rules: [{ required: true, message: '请选择是否归集', trigger: 'change' }],
+        size: 'small',
+        activeValue: 1,
+        inactiveValue: 0,
+        onChange: this.onIsCollectChange
+      },
+      {
+        label: '数据归集时间',
+        name: 'collectTime',
+        rules: [
+          { required: !!this.formData.isCollect, message: '数据归集时间不能为空!' },
+          {
+            type: 'number',
+            message: '数据归集时间须为数字 ',
+            transform: (val) => (Number.isNaN(Number(val)) ? val : +val || -1)
+          },
+          { type: 'integer', min: -1, max: 60 * 24 * 30, message: `数据归集时间须大于0小于${60 * 24 * 30}` }
+        ],
+        size: 'small',
+        disabled: !this.formData.isCollect,
+        required: !!this.formData.isCollect,
+        maxLength: 5
+      },
+      {
+        label: '显示顺序',
+        name: 'sort',
+        type: 'number',
+        rules: [{ type: 'integer', min: -1, message: '显示顺序为数字' }],
+        min: 0,
+        max: 999999,
+        size: 'small',
+        precision: 0,
+        stepStrictly: true,
+        style: { width: '100%', textAlign: 'left' },
+        class: 'input-number'
+      }
+    ]
+  }
+  onIsCollectChange(val: 1 | 0) {
+    if (!val) {
+      this.formData.collectTime = undefined
+      this.$refs.form.clearValidate('collectTime')
+    }
+  }
+  onSubmit() {
+    this.$refs.form.validate((valid) => valid && this.$emit('submit', this.formData))
+  }
+
+  @Watch('data', { immediate: true })
+  setDefaultData(val: any) {
+    this.formData = val.id ? { ...val } : getDefaultValue()
+  }
+}
+</script>

+ 25 - 0
src/views/spectrum/configuration/utils.ts

@@ -0,0 +1,25 @@
+import { ElTableColumn } from 'element-ui/types/table-column'
+import { ColItem } from './api/common'
+
+export const alignLeft = (tooltips: boolean = true): Partial<ElTableColumn> => ({
+  align: 'left',
+  headerAlign: 'left',
+  showOverflowTooltip: tooltips
+})
+
+export const deviceTypeCols: ColItem[] = [
+  { type: 'selection', width: '50px' },
+  { type: 'index', label: '序号', width: '60px' },
+  { prop: 'name', label: '排水分区', minWidth: '78px', ...alignLeft() },
+  { prop: 'name', label: '监测分组', minWidth: '130px', ...alignLeft() },
+  { prop: 'name', label: '站点编码', minWidth: '78px', ...alignLeft() },
+  { prop: 'name', label: '站点名称', minWidth: '130px', ...alignLeft() },
+  { prop: 'name', label: '设备SN', minWidth: '78px', ...alignLeft() },
+  { prop: 'name', label: '设备类型', minWidth: '92px', ...alignLeft() },
+  { prop: 'name', label: '设备名称', minWidth: '130px', ...alignLeft() },
+  { prop: 'name', label: '负责人', minWidth: '51px', ...alignLeft() },
+  { prop: 'name', label: '联系方式', minWidth: '68px', ...alignLeft() },
+  { prop: 'name', label: '安装地址', minWidth: '68px', ...alignLeft() },
+  { prop: 'name', label: '安装时间', minWidth: '68px', ...alignLeft() },
+  { prop: 'name', label: '站点状态', minWidth: '68px' }
+]

+ 2 - 5
src/views/zhpt/index.vue

@@ -1,8 +1,5 @@
 <template>
-  <div
-    id="viewDiv"
-
-  >
+  <div id="viewDiv">
     <!-- <tf-dialog
       :show.sync="panels.tfDialog.Show"
       :hide.sync="panels.tfDialog.Hide"
@@ -36,7 +33,7 @@
             "
           /> -->
           <div id="mapView" class="mapView">
-            <cesium-map></cesium-map>
+            <!-- <cesium-map></cesium-map> -->
             <!-- <div
               id="any"
               ref="any"