ソースを参照

refactor(device-stats): 合并滞留统计为告警统计并优化相关代码

- 将异常滞留和一般滞留统计合并为统一的告警统计功能
- 更新API接口、类型定义和表格展示逻辑
- 优化事件类型下拉列表获取方式
- 简化统计类型切换逻辑
liujia 1 ヶ月 前
コミット
ffdf08a800

+ 5 - 12
src/api/stats/index.ts

@@ -8,16 +8,9 @@ export const statsFallQuery = (
   return request.post('/stats/fallQuery', params)
 }
 
-// 异常滞留统计
-export const statsAlarmRetentionQuery = (
-  params: TYPE.StatsAlarmRetentionQueryParams
-): Promise<ResponseData<TYPE.StatsAlarmRetentionQueryData>> => {
-  return request.post('/stats/alarmRetentionQuery', params)
-}
-
-// 一般滞留统计
-export const statsGeneralRetentionQuery = (
-  params: TYPE.StatsGeneralRetentionQueryParams
-): Promise<ResponseData<TYPE.StatsGeneralRetentionQueryData>> => {
-  return request.post('/stats/generalRetentionQuery', params)
+// 告警统计
+export const statsAlarmQuery = (
+  params: TYPE.AtatsAlarmQueryParams
+): Promise<ResponseData<TYPE.StatsAlarmQueryData>> => {
+  return request.post('/stats/alarmEventsQuery', params)
 }

+ 25 - 72
src/api/stats/types.ts

@@ -64,88 +64,41 @@ export interface StatsFallQueryData {
 }
 
 /**
- * 异常滞留入参
- * @description: 分页查询设备的异常滞留统计信息
- * @param devId 设备ID
- * @param tenantId 租户id
- * @param createTimeStart 起始时间 格式yyyy-MM-dd
- * @param createTimeEnd 结束时间 格式yyyy-MM-dd
- * @param pageNo 页码
- * @param pageSize 每页条数
- * @param eventType 事件类型 0:异常滞留 1:异常消失 2:异常起夜 3:异常入厕
- */
-export interface StatsAlarmRetentionQueryParams extends StatsFallQueryParams {
-  eventType: ID // 事件类型 0:异常滞留 1:异常消失 2:异常起夜 3:异常入厕
-}
-
-/**
- * 异常滞留出参 rows
- */
-export interface StatsAlarmRetentionQueryDataRow {
-  alarmEventId: ID // 告警表主键ID
-  devId: ID // 设备表主键ID
-  pose: string // 姿势
-  poseName: string // 姿势名称
-  stayTimeId: string // 事件表主键id
-  eventType: string // 告警类型
-  eventTypeName: string // 告警类型名称
-  isHandle: SwitchType // 是否处理:0-未处理,1-已处理
-}
-
-/**
- * 异常滞留出参
- */
-export interface StatsAlarmRetentionQueryData {
-  rows: StatsAlarmRetentionQueryDataRow[]
-  total: number
-  pageNum: number
-  pageSize: number
-  outTotalPageNum: boolean
-  totalPageNum: number
-}
-
-/**
- * 一般滞留入参
- * @description: 分页查询设备的一般滞留统计信息
- * @param devId 设备ID
- * @param tenantId 租户id
- * @param createTimeStart 起始时间 格式yyyy-MM-dd
- * @param createTimeEnd 结束时间 格式yyyy-MM-dd
- * @param pageNo 页码
- * @param pageSize 每页条数
- * @param type 类型 0:一般滞留事件 2:马桶滞留事件
+ * 告警统计入参
  */
-export interface StatsGeneralRetentionQueryParams extends StatsFallQueryParams {
-  type: ID // 类型 0:一般滞留事件 2:马桶滞留事件
+export interface AtatsAlarmQueryParams {
+  pageNo: number // 页码
+  pageSize: number // 每页条数
+  clientId?: ID // 设备ID
+  tenantId?: ID // 租户id
+  createTimeStart: string // 起始时间 格式yyyy-MM-dd
+  createTimeEnd: string // 结束时间 格式yyyy-MM-dd
+  eventType?: ID // 事件类型 0:跌倒 1:跌倒恢复 2:跌倒异常 3:跌倒异常恢复 4:跌倒异常恢复
 }
 
 /**
- * 一般滞留出参 rows
+ * 告警统计出参 rows
  */
-export interface StatsGeneralRetentionQueryDataRows {
-  createId: ID // 创建人
-  updateId: ID // 修改人
-  createTime: string // 创建时间
-  updateTime: string // 更新时间
-  isDeleted: SwitchType // 	删除标记:0-未删除,1-已删除
-  remark: string // 备注
-  stayTimeId: ID // stay_time表主键id
-  devId: ID // 设备表主键id
-  clientId: ID // 设备clientId
+export interface StatsAlarmQueryDataRow {
+  id: ID // 主键ID
+  clientId: ID // 设备ID
+  tenantId: ID // 租户ID
   devName: string // 设备名称
-  type: ID // 停留类型
-  typeName: string // 停留类型名称
-  enterTime: string // 进入时间
-  leaveTime: string // 离开时间
-  stayTime: number // 停留时长(秒)
-  childStayTime: StatsGeneralRetentionQueryDataRows[] // 子停留信息
+  uuid: string // 告警事件uuid
+  planUuid: string // 告警计划uuid
+  eventType: string // 事件类型
+  eventTypeName: string // 事件类型名称
+  info: string //事件内容
+  isHandle: SwitchType // 是否处理
+  createTime: ID // 事件发生时间
+  remark: string // 备注
 }
 
 /**
- * 一般滞留出参
+ * 告警统计出参
  */
-export interface StatsGeneralRetentionQueryData {
-  rows: StatsGeneralRetentionQueryDataRows[]
+export interface StatsAlarmQueryData {
+  rows: StatsAlarmQueryDataRow[]
   total: number
   pageNum: number
   pageSize: number

+ 39 - 0
src/views/device/detail/components/deviceStatsDrawer/const.ts

@@ -30,6 +30,45 @@ export const fallColumns = [
   },
 ]
 
+// 告警统计列表表头
+export const alarmColumns = [
+  {
+    title: '发生时间',
+    dataIndex: 'createTime',
+    key: 'createTime',
+    align: 'center',
+    width: 150,
+  },
+  {
+    title: '事件类型',
+    dataIndex: 'eventType',
+    key: 'eventType',
+    align: 'center',
+    width: 150,
+  },
+  {
+    title: '事件内容',
+    dataIndex: 'info',
+    key: 'info',
+    align: 'center',
+    width: 150,
+  },
+  {
+    title: '处理状态',
+    key: 'isHandle',
+    dataIndex: 'isHandle',
+    align: 'center',
+    width: 150,
+  },
+  {
+    title: '备注',
+    key: 'remark',
+    dataIndex: 'remark',
+    align: 'center',
+    width: 150,
+  },
+]
+
 //异常滞留统计列表表头
 export const alarmRetentionColumns = [
   {

+ 56 - 106
src/views/device/detail/components/deviceStatsDrawer/index.vue

@@ -11,8 +11,7 @@
     <template #extra>
       <a-radio-group v-model:value="tableType" button-style="solid" size="small">
         <a-radio-button value="fall">跌倒统计</a-radio-button>
-        <a-radio-button value="alarmRetention">异常滞留</a-radio-button>
-        <a-radio-button value="generalRetention">一般滞留</a-radio-button>
+        <a-radio-button value="alarm">告警统计</a-radio-button>
       </a-radio-group>
     </template>
 
@@ -26,26 +25,16 @@
           />
         </a-form-item>
 
-        <a-form-item v-if="tableType === 'alarmRetention'" label="告警类型">
+        <a-form-item v-if="tableType === 'alarm'" label="告警类型">
           <a-select
             v-model:value="searchState.eventType"
             placeholder="请选择"
-            style="width: 120px"
+            style="width: 150px"
             :options="alarmEventTypeOptions"
             @change="searchHandler"
           />
         </a-form-item>
 
-        <a-form-item v-if="tableType === 'generalRetention'" label="滞留类型">
-          <a-select
-            v-model:value="searchState.type"
-            placeholder="请选择"
-            style="width: 120px"
-            :options="stayEventTypeOptions"
-            @change="searchHandler"
-          />
-        </a-form-item>
-
         <a-form-item>
           <a-space>
             <a-button type="primary" @click="searchHandler"> 搜索 </a-button>
@@ -97,16 +86,13 @@
 <script setup lang="ts">
 import { computed, ref, watch } from 'vue'
 import { useSearch } from '@/hooks/useSearch'
-import { fallColumns, generalRetentionColumns, alarmRetentionColumns } from './const'
+import { fallColumns, alarmColumns } from './const'
 import * as statsApi from '@/api/stats'
-import type {
-  StatsFallQueryDataRow,
-  StatsAlarmRetentionQueryDataRow,
-  StatsGeneralRetentionQueryDataRows,
-} from '@/api/stats/types'
-import { useDict } from '@/hooks/useDict'
+import type { StatsFallQueryDataRow, StatsAlarmQueryDataRow } from '@/api/stats/types'
+import { useDict, type DictItem } from '@/hooks/useDict'
 import { useDictName } from '@/hooks/useDictName'
 import { formatSeconds } from '@/utils'
+import * as alarmApi from '@/api/alarm'
 
 defineOptions({
   name: 'DeviceStatsDrawer',
@@ -130,27 +116,12 @@ const props = withDefaults(defineProps<Props>(), {
   width: 900,
 })
 
-watch(
-  () => props.open,
-  (newVal) => {
-    if (newVal) {
-      console.log('🌸🌸 DeviceStatsDrawer PROPS 🌸🌸', props)
-      fetchList()
-    }
-  },
-  {
-    immediate: true,
-  }
-)
-
 // 表格统计类型展示 跌倒、一般滞留、异常滞留
-const tableType = ref<'fall' | 'generalRetention' | 'alarmRetention'>('fall')
+const tableType = ref<'fall' | 'alarm'>('fall')
 
 const columns = computed(() => {
-  if (tableType.value === 'generalRetention') {
-    return generalRetentionColumns
-  } else if (tableType.value === 'alarmRetention') {
-    return alarmRetentionColumns
+  if (tableType.value === 'alarm') {
+    return alarmColumns
   } else {
     return fallColumns
   }
@@ -192,15 +163,29 @@ const close = async () => {
 
 // 获取字典数据
 const { dictList: personPoseList, fetchDict: fetchPersonPose } = useDict('person_pose') // 姿势字典
-const { dictList: alarmEventTypeList, fetchDict: fetchAlarmEventType } = useDict('alarm_event_type') // 异常告警字典
-const { dictList: stayEventTypeList, fetchDict: fetchStayEventType } = useDict('stay_event_type') // 停留类型字典
 fetchPersonPose()
-fetchAlarmEventType()
-fetchStayEventType()
 
+const alarmEventTypeList = ref<DictItem[]>([])
 const { dictNameMap: personPoseName } = useDictName(personPoseList)
 const { dictNameMap: alarmEventTypeName } = useDictName(alarmEventTypeList)
-const { dictNameMap: stayEventTypeName } = useDictName(stayEventTypeList)
+
+const fetchEventTypeList = async () => {
+  try {
+    const res = await alarmApi.getAlarmEventTypeList()
+    console.log('获取事件类型下拉列表成功✅', res)
+    const data = res.data
+    alarmEventTypeList.value =
+      (Array.isArray(data) &&
+        data.map((item) => ({
+          label: item.eventDesc,
+          value: item.eventVal,
+        }))) ||
+      []
+  } catch (err) {
+    console.log('获取事件类型下拉列表失败❌', err)
+  }
+}
+fetchEventTypeList()
 
 // 异常滞留 事件类型
 const alarmEventTypeOptions = computed(() => [
@@ -213,28 +198,14 @@ const alarmEventTypeOptions = computed(() => [
     value: item.value,
   })),
 ])
-// 一般滞留 滞留类型
-const stayEventTypeOptions = computed(() => [
-  {
-    label: '全部',
-    value: null,
-  },
-  ...stayEventTypeList.value.map((item) => ({
-    label: item.label,
-    value: item.value,
-  })),
-])
 
-const tableList = ref<
-  (StatsFallQueryDataRow | StatsGeneralRetentionQueryDataRows | StatsAlarmRetentionQueryDataRow)[]
->([])
+const tableList = ref<(StatsFallQueryDataRow | StatsAlarmQueryDataRow)[]>([])
 const tableTotal = ref<number>(0)
 const current = ref<number>(1)
 const pageSize = ref<number>(10)
 
 const fallList = ref<StatsFallQueryDataRow[]>([])
-const generalRetentionList = ref<StatsGeneralRetentionQueryDataRows[]>([])
-const alarmRetentionList = ref<StatsAlarmRetentionQueryDataRow[]>([])
+const alarmList = ref<StatsAlarmQueryDataRow[]>([])
 
 // 搜索
 const searchHandler = async () => {
@@ -281,61 +252,30 @@ const fetchFallList = async () => {
   }
 }
 
-// 获取一般滞留数据
-const fetchGeneralRetentionList = async () => {
-  console.log('🚀🚀🚀fetchGeneralRetentionList')
-  try {
-    loading.value = true
-    const res = await statsApi.statsGeneralRetentionQuery({
-      pageNo: current.value,
-      pageSize: pageSize.value,
-      devId: props.devId,
-      createTimeStart: searchState.createTimeStart,
-      createTimeEnd: searchState.createTimeEnd,
-      type: searchState.type as ID,
-    })
-    console.log('✅ 获取一般滞留统计数据成功', res)
-    const { rows, total } = res.data
-    generalRetentionList.value = rows as StatsGeneralRetentionQueryDataRows[]
-    generalRetentionList.value.forEach((item) => {
-      console.log('item.pose', item)
-      item.typeName = stayEventTypeName(String(item.type))
-    })
-    tableList.value = generalRetentionList.value
-    tableTotal.value = Number(total)
-    loading.value = false
-  } catch (error) {
-    console.error('❌ 获取一般滞留统计数据失败', error)
-    loading.value = false
-  }
-}
-
-// 获取异常滞留数据
-const fetchAlarmRetentionList = async () => {
-  console.log('🚀🚀🚀fetchAlarmRetentionList')
+// 获取告警统计数据
+const fetchAlarmList = async () => {
+  console.log('🚀🚀🚀fetchAlarmList')
   try {
     loading.value = true
-    const res = await statsApi.statsAlarmRetentionQuery({
+    const res = await statsApi.statsAlarmQuery({
       pageNo: current.value,
       pageSize: pageSize.value,
-      devId: props.devId,
+      clientId: props.devId,
       createTimeStart: searchState.createTimeStart,
       createTimeEnd: searchState.createTimeEnd,
       eventType: searchState.eventType as ID,
     })
-    console.log('✅ 获取异常滞留统计数据成功', res)
+    console.log('✅ 获取告警统计数据成功', res)
     const { rows, total } = res.data
-    alarmRetentionList.value = rows as StatsAlarmRetentionQueryDataRow[]
-    alarmRetentionList.value.forEach((item) => {
-      console.log('item.pose', item)
-      item.poseName = personPoseName(String(item.pose))
+    alarmList.value = rows as StatsAlarmQueryDataRow[]
+    alarmList.value.forEach((item) => {
       item.eventTypeName = alarmEventTypeName(String(item.eventType))
     })
-    tableList.value = alarmRetentionList.value
+    tableList.value = alarmList.value
     tableTotal.value = Number(total)
     loading.value = false
   } catch (error) {
-    console.error('❌ 获取异常滞留统计数据失败', error)
+    console.error('❌ 获取告警统计数据失败', error)
     loading.value = false
   }
 }
@@ -344,11 +284,8 @@ const fetchList = () => {
   if (tableType.value === 'fall') {
     fetchFallList()
   }
-  if (tableType.value === 'generalRetention') {
-    fetchGeneralRetentionList()
-  }
-  if (tableType.value === 'alarmRetention') {
-    fetchAlarmRetentionList()
+  if (tableType.value === 'alarm') {
+    fetchAlarmList()
   }
 }
 
@@ -359,6 +296,19 @@ watch(
   },
   { immediate: true }
 )
+
+watch(
+  () => props.open,
+  (newVal) => {
+    if (newVal) {
+      console.log('🌸🌸 DeviceStatsDrawer PROPS 🌸🌸', props)
+      fetchList()
+    }
+  },
+  {
+    immediate: true,
+  }
+)
 </script>
 
 <style scoped lang="less">