Browse Source

Merge remote-tracking branch 'origin/master'

master
wangwei_123 2 days ago
parent
commit
34afe269b1
  1. 5
      web/.env.dev
  2. 13
      web/.eslintrc.js
  3. 8
      web/pnpm-workspace.yaml
  4. 3
      web/src/api/gas/handdetector/index.ts
  5. 2
      web/src/utils/dict.ts
  6. 7
      web/src/views/HandDevice/Home/components/services/popup.service.ts
  7. 5
      web/src/views/HandDevice/Home/components/types/map.types.ts
  8. 26
      web/src/views/HandDevice/Home/index.vue
  9. 87
      web/src/views/gas/handalarm/index.vue
  10. 26
      web/src/views/gas/handdetector/HandDetectorForm.vue
  11. 6
      web/src/views/gas/handdetector/index.vue

5
web/.env.dev

@ -3,8 +3,9 @@ NODE_ENV=production
VITE_DEV=true VITE_DEV=true
# 请求路径 # 请求路径
VITE_BASE_URL='https://mobile.zdhlcn.com'
VITE_BASE_URL='https://lock.zdhlcn.com:9807'
# VITE_BASE_URL='https://mobile.zdhlcn.com'
# VITE_BASE_URL='https://lock.zdhlcn.com:9807'
VITE_BASE_URL=http://mobile.icpcdev.site
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
VITE_UPLOAD_TYPE=server VITE_UPLOAD_TYPE=server

13
web/.eslintrc.js

@ -60,18 +60,7 @@ module.exports = defineConfig({
'vue/require-default-prop': 'off', 'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off', 'vue/require-explicit-emits': 'off',
'vue/require-toggle-inside-transition': 'off', 'vue/require-toggle-inside-transition': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/html-self-closing':'off',
'vue/multi-word-component-names': 'off', 'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off', 'vue/no-v-html': 'off',
'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件 'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件

8
web/pnpm-workspace.yaml

@ -0,0 +1,8 @@
onlyBuiltDependencies:
- '@parcel/watcher'
- '@swc/core'
- core-js
- core-js-pure
- es5-ext
- esbuild
- vue-demi

3
web/src/api/gas/handdetector/index.ts

@ -22,6 +22,9 @@ export interface HandDetector {
accuracy?: number // 数值除数 accuracy?: number // 数值除数
sortOrder?: number // 排序 sortOrder?: number // 排序
remark?: string // 备注 remark?: string // 备注
time?: number // 时间
value?: number // 数值
} }
// GAS手持探测器 API // GAS手持探测器 API

2
web/src/utils/dict.ts

@ -174,6 +174,6 @@ export enum DICT_TYPE {
HAND_DETECTOR_FENCE_TYPE = 'hand_detector_fence_type', // HAND 手持探测器围栏类型 1:超出报警;2:进入报警 HAND_DETECTOR_FENCE_TYPE = 'hand_detector_fence_type', // HAND 手持探测器围栏类型 1:超出报警;2:进入报警
HAND_DETECTOR_FENCE_STATUS = 'hand_detector_fence_status', // HAND 手持探测器围栏状态 1:启用;2:禁用 HAND_DETECTOR_FENCE_STATUS = 'hand_detector_fence_status', // HAND 手持探测器围栏状态 1:启用;2:禁用
HAND_DETECTOR_ALARM_LEVEL = 'hand_detector_alarm_level', // HAND 手持探测器警报方式/级别 0:正常状态;1:一级警报;2:二级警报;3:弹窗警报 HAND_DETECTOR_ALARM_LEVEL = 'hand_detector_alarm_level', // HAND 手持探测器警报方式/级别 0:正常状态;1:一级警报;2:二级警报;3:弹窗警报
HAND_DETECTOR_HANDLE_STATUS = 'hand_detector_handle_status', // HAND 手持探测器处理状态 0:待处理;1:处理中;1:已处理
HAND_DETECTOR_HANDLE_STATUS = 'hand_detector_chandle_status', // HAND 手持探测器处理状态 0:待处理;1:处理中;1:已处理
HAND_DETECTOR_VALUE_DIRECTION = 'hand_detector_value_direction' // HAND 手持探测器最值方向 0:小;1:大 HAND_DETECTOR_VALUE_DIRECTION = 'hand_detector_value_direction' // HAND 手持探测器最值方向 0:小;1:大
} }

7
web/src/views/HandDevice/Home/components/services/popup.service.ts

@ -44,8 +44,11 @@ export class PopupService {
<div style="color: ${getStatusColor(status)};"> <div style="color: ${getStatusColor(status)};">
状态: ${getStatusLabel(status)} 状态: ${getStatusLabel(status)}
</div> </div>
<div style="margin-top: 4px; font-size: 10px; color: #666;">
坐标: ${markerData.coordinates[0].toFixed(6)}, ${markerData.coordinates[1].toFixed(6)}
<div>${markerData.gasChemical}</div>
<div>${markerData.value} ${markerData.unit ? markerData.unit : ''}</div>
<div>${markerData.time ? markerData.time : '-'} </div>
<div>
${markerData.coordinates[0].toFixed(6)}, ${markerData.coordinates[1].toFixed(6)}
</div> </div>
` `
} }

5
web/src/views/HandDevice/Home/components/types/map.types.ts

@ -46,7 +46,10 @@ export interface MarkerData extends HandDetector {
/** 标记标题 */ /** 标记标题 */
name: string name: string
/** 自定义数据 */ /** 自定义数据 */
data?: any
data?: any,
value?: number,
unit?: string,
time?: number
} }
// 地图组件 Props 接口 // 地图组件 Props 接口

26
web/src/views/HandDevice/Home/index.vue

@ -8,6 +8,7 @@ import { HandDetector } from '@/api/gas/handdetector'
import { MarkerData } from './components/types/map.types' import { MarkerData } from './components/types/map.types'
import { Fence } from '@/api/gas/fence' import { Fence } from '@/api/gas/fence'
import { FenceApi } from '@/api/gas/fence' import { FenceApi } from '@/api/gas/fence'
import dayjs from 'dayjs'
const getDataTimer = ref<NodeJS.Timeout | null>(null) const getDataTimer = ref<NodeJS.Timeout | null>(null)
const markers = ref<MarkerData[]>([]) const markers = ref<MarkerData[]>([])
const fences = ref<Fence[]>([]) const fences = ref<Fence[]>([])
@ -16,14 +17,17 @@ const getMarkers = async () => {
console.log('getMarkers') console.log('getMarkers')
return await getLastestDetectorData().then((res: HandDetector[]) => { return await getLastestDetectorData().then((res: HandDetector[]) => {
res = res.filter((i) => i.enableStatus === 1) res = res.filter((i) => i.enableStatus === 1)
res = res.map((i) => {
var res2 = res.map((i) => {
return { return {
...i, ...i,
coordinates: [i.longitude, i.latitude], coordinates: [i.longitude, i.latitude],
data: []
data: [],
time: i.time ? dayjs(i.time).format('YYYY-MM-DD HH:mm:ss') : '',
value: i.value,
unit: i.unit
} }
}) })
markers.value = res as unknown as any[]
markers.value = res2 as unknown as any[]
inited.value = true inited.value = true
}) })
} }
@ -34,14 +38,14 @@ const getFences = async () => {
pageSize: 100 pageSize: 100
}).then((res) => { }).then((res) => {
console.log('getFences', res) console.log('getFences', res)
let fencesData = res.list as Fence[]
fencesData = fencesData.map((i) => {
return {
...i,
fenceRange: JSON.parse(i.fenceRange)
}
})
fences.value = fencesData as unknown as Fence[]
let fencesData = res.list as Fence[]
fencesData = fencesData.map((i) => {
return {
...i,
fenceRange: JSON.parse(i.fenceRange)
}
})
fences.value = fencesData as unknown as Fence[]
}) })
} }
onMounted(() => { onMounted(() => {

87
web/src/views/gas/handalarm/index.vue

@ -8,9 +8,9 @@
:inline="true" :inline="true"
label-width="120px" label-width="120px"
> >
<el-form-item label="持有人" prop="detectorId">
<el-form-item label="持有人" prop="name">
<el-select <el-select
v-model="queryParams.detectorId"
v-model="queryParams.name"
placeholder="请选择持有人" placeholder="请选择持有人"
clearable clearable
filterable filterable
@ -21,7 +21,7 @@
v-for="item in handDetectorStore.getHandDetectorList" v-for="item in handDetectorStore.getHandDetectorList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id"
:value="String(item.id)"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -34,22 +34,39 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="报警类型" prop="alarmType">
<el-form-item label="报警类型" prop="alarmLevel">
<el-select <el-select
v-model="queryParams.alarmType"
v-model="queryParams.alarmLevel"
placeholder="请选择报警类型" placeholder="请选择报警类型"
clearable clearable
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
v-for="item in handDetectorStore.getAlarmTypes" v-for="item in handDetectorStore.getAlarmTypes"
:key="item.id"
:key="item.level"
:label="item.name" :label="item.name"
:value="item.id"
:value="Number(item.level)"
/>
</el-select>
</el-form-item>
<!-- 气体类型 -->
<el-form-item label="气体类型" prop="gasType">
<el-select
v-model="queryParams.gasType"
placeholder="请选择气体类型"
clearable
class="!w-240px"
>
<el-option
v-for="item in handDetectorStore.getGasTypes"
:key="item.id"
:label="item.chemical"
:value="String(item.chemical)"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="开始时间" prop="tAlarmStart">
<!-- <el-form-item label="开始时间" prop="tAlarmStart">
<el-date-picker <el-date-picker
v-model="queryParams.tAlarmStart" v-model="queryParams.tAlarmStart"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@ -68,7 +85,7 @@
clearable clearable
class="!w-240px" class="!w-240px"
/> />
</el-form-item>
</el-form-item> -->
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option <el-option
@ -79,6 +96,19 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
@ -123,30 +153,27 @@
@selection-change="handleRowCheckboxChange" @selection-change="handleRowCheckboxChange"
> >
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
<el-table-column label="持有人" align="center" prop="detectorId">
<template #default="scope">
<el-table-column label="持有人" align="center" prop="name">
<!-- <template #default="scope">
{{ {{
handDetectorStore.getHandDetectorList.find((item) => item.id === scope.row.detectorId) handDetectorStore.getHandDetectorList.find((item) => item.id === scope.row.detectorId)
?.name ?.name
}} }}
</template>
</template> -->
</el-table-column> </el-table-column>
<el-table-column label="设备编号" align="center" prop="sn" /> <el-table-column label="设备编号" align="center" prop="sn" />
<el-table-column label="报警类型" align="center" prop="alarmType">
<el-table-column label="报警类型" align="center" prop="alarmLevel">
<template #default="scope"> <template #default="scope">
{{ {{
handDetectorStore.getAlarmTypes.find((item) => item.id === scope.row.alarmType)?.name
handDetectorStore.getAlarmTypes.find((item) => item.level === scope.row.alarmLevel)
?.name
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="气体类型" align="center" prop="gasType">
<template #default="scope">
{{ handDetectorStore.getGasTypes.find((item) => item.id === scope.row.gasType)?.name }}
</template>
</el-table-column>
<el-table-column label="首报值" align="center" prop="vAlarmFirst" />
<el-table-column label="最值" align="center" prop="vAlarmMaximum" />
<el-table-column
<el-table-column label="气体类型" align="center" prop="gasType"></el-table-column>
<!-- <el-table-column label="首报值" align="center" prop="vAlarmFirst" />
<el-table-column label="最值" align="center" prop="vAlarmMaximum" /> -->
<!-- <el-table-column
label="开始时间" label="开始时间"
align="center" align="center"
prop="tAlarmStart" prop="tAlarmStart"
@ -159,8 +186,16 @@
prop="tAlarmEnd" prop="tAlarmEnd"
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/>
<el-table-column label="状态" align="center" prop="status" />
/> -->
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
{{
getIntDictOptions(DICT_TYPE.HAND_DETECTOR_HANDLE_STATUS).find(
(item) => item.value === scope.row.status
)?.label
}}
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column <el-table-column
label="创建时间" label="创建时间"
@ -229,9 +264,9 @@ const total = ref(0) // 列表的总页数
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
detectorId: undefined,
name: undefined,
sn: undefined, sn: undefined,
alarmType: undefined,
alarmLevel: undefined, alarmLevel: undefined,
gasType: undefined, gasType: undefined,
unit: undefined, unit: undefined,

26
web/src/views/gas/handdetector/HandDetectorForm.vue

@ -13,16 +13,30 @@
<el-form-item label="持有人" prop="name"> <el-form-item label="持有人" prop="name">
<el-input v-model="formData.name" placeholder="请输入持有人" /> <el-input v-model="formData.name" placeholder="请输入持有人" />
</el-form-item> </el-form-item>
<!-- 围栏类型 -->
<el-form-item label="围栏类型" prop="fenceType">
<el-radio-group v-model="formData.fenceType" @change="fenceTypeChange">
<el-radio-button
v-for="dict in getIntDictOptions(DICT_TYPE.HAND_DETECTOR_FENCE_TYPE)"
:key="dict.value"
:value="dict.value"
>
{{ dict.label }}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="应用围栏" prop="fenceIdsArray"> <el-form-item label="应用围栏" prop="fenceIdsArray">
<el-select v-model="formData.fenceIdsArray" placeholder="请选择应用围栏" multiple> <el-select v-model="formData.fenceIdsArray" placeholder="请选择应用围栏" multiple>
<el-option <el-option
v-for="fence in fences"
v-for="fence in selectFences"
:key="fence.id" :key="fence.id"
:label="fence.name" :label="fence.name"
:value="fence.id" :value="fence.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="气体类型" prop="gasTypeId"> <el-form-item label="气体类型" prop="gasTypeId">
<el-select <el-select
v-model="formData.gasTypeId" v-model="formData.gasTypeId"
@ -121,6 +135,7 @@ const formData = ref({
name: undefined, name: undefined,
fenceIds: '', fenceIds: '',
fenceIdsArray: [], fenceIdsArray: [],
fenceType: undefined,
gasTypeId: undefined, gasTypeId: undefined,
gasChemical: '', gasChemical: '',
min: 0, min: 0,
@ -142,6 +157,14 @@ const formRules = reactive({
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
var selectFences=computed(()=>{
return props.fences.filter((item) => item.type === formData.value.fenceType)
})
/** 围栏类型改变时,应用围栏列表也会改变 */
const fenceTypeChange = () => {
formData.value.fenceIdsArray = []
}
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
@ -193,6 +216,7 @@ const resetForm = () => {
name: undefined, name: undefined,
fenceIds: '', fenceIds: '',
fenceIdsArray: [], fenceIdsArray: [],
fenceType: undefined,
gasTypeId: undefined, gasTypeId: undefined,
gasChemical: '', gasChemical: '',
min: 0, min: 0,

6
web/src/views/gas/handdetector/index.vue

@ -83,6 +83,12 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 围栏类型 -->
<el-table-column label="围栏类型" align="center" prop="fenceType">
<template #default="scope">
<DictTag :type="DICT_TYPE.HAND_DETECTOR_FENCE_TYPE" :value="scope.row.fenceType" v-if="scope.row.fenceType" />
</template>
</el-table-column>
<el-table-column label="气体类型" align="center" prop="gasTypeId"> <el-table-column label="气体类型" align="center" prop="gasTypeId">
<template #default="scope"> <template #default="scope">
{{ handDetectorStore.getGasTypes.find((item) => item.id === scope.row.gasTypeId)?.name }} {{ handDetectorStore.getGasTypes.find((item) => item.id === scope.row.gasTypeId)?.name }}

Loading…
Cancel
Save