Ver Fonte

feat: 修改项提交

DOVER-GLOBAL\10093976 há 1 semana atrás
pai
commit
68366525d1
20 ficheiros alterados com 1515 adições e 601 exclusões
  1. 6 2
      admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts
  2. 23 0
      admin.ui.plus-master/src/api/admin/deviceAuthorization/kuaizhaoApi.ts
  3. 55 0
      admin.ui.plus-master/src/api/admin/deviceAuthorization/kuaizhaoDto.ts
  4. 46 106
      admin.ui.plus-master/src/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi.ts
  5. 66 3
      admin.ui.plus-master/src/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsDto.ts
  6. 294 0
      admin.ui.plus-master/src/views/admin/authorize/kuaizhao/index.vue
  7. 2 2
      admin.ui.plus-master/src/views/admin/statement/BlackBox/index.vue
  8. 1 1
      admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue
  9. 3 3
      admin.ui.plus-master/src/views/admin/statement/displayControl/index.vue
  10. 3 3
      admin.ui.plus-master/src/views/admin/statement/encodercontrols/index.vue
  11. 2 2
      admin.ui.plus-master/src/views/admin/statement/jikongzhuban/index.vue
  12. 3 3
      admin.ui.plus-master/src/views/admin/statement/listOfOilEngines/index.vue
  13. 556 289
      admin.ui.plus-master/src/views/admin/statement/moreOilEngineDetails/component/main.vue
  14. 97 40
      admin.ui.plus-master/src/views/admin/statement/moreOilEngineDetails/index.vue
  15. 134 1
      admin.ui.plus-master/src/views/admin/statement/oilEngineDetails/index.vue
  16. 1 1
      admin.ui.plus-master/src/views/admin/statement/partInformation/index.vue
  17. 2 2
      admin.ui.plus-master/src/views/admin/statement/partsManagement/oilGun/index.vue
  18. 4 3
      admin.ui.plus-master/src/views/admin/statement/taxcontrol/index.vue
  19. 167 94
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue
  20. 50 46
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

+ 6 - 2
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -9,8 +9,8 @@
 export interface alarmRluesFilterModel {
   /**规则名称*/
   ruleName?: string | null;
-  // 规则标签
-  labelId?: string | null;
+  // 标签参数(新增)
+  tag?: string | null;
   /**角色 */
   roleMappingId?: Array<number>;
   /**备注*/
@@ -41,6 +41,10 @@ export interface alarmRluesFilterModel {
   condition2?:string | null;
   cacheFilter?: Partial<alarmRluesFilterModel>;
   keyWord?:string | null; 
+  /**是否推送(新增) */
+  isPush?: boolean | null;
+  /**报警等级(新增) */
+  alarmLevel?: string | null;
 }
 
 /**

+ 23 - 0
admin.ui.plus-master/src/api/admin/deviceAuthorization/kuaizhaoApi.ts

@@ -0,0 +1,23 @@
+import { AxiosResponse } from 'axios'
+  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+    /**
+   * No description
+   *
+   * @tags
+   * @name GetList
+   * @summary 查询列表
+   * @request POST:'/api/app/fuel-dispenser/get-dispenser-snapshot-list'
+   * @secure
+   */
+getList = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/fuel-dispenser/get-dispenser-snapshot-list',
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+    }

+ 55 - 0
admin.ui.plus-master/src/api/admin/deviceAuthorization/kuaizhaoDto.ts

@@ -0,0 +1,55 @@
+/** 查询信息输出 */
+  export interface ResultOutputPageOutputDispenserSnapshotDto{
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+ data?:PageOutputDispenserSnapshotDto[] | null
+}
+    export interface PageOutputDispenserSnapshotDto{
+      /**
+      * 数据总数
+      * @format int64
+      */
+      total?: number
+      /** 数据 */
+      list?: DispenserSnapshotDto[] | null
+    }
+    export interface DispenserSnapshotDto{
+   /** 加油机出厂编号 */
+      dispenserSerialNum?: string
+   /** 加油机序列号 */
+      dispenserUuid?: string
+   /** 油枪主板ID */
+      nozzleControlMainBoard?: string
+   /** 油枪逻辑编号 */
+      nozzleControlName?: string
+   /** 安全装置UUID */
+      blackBoxUuid?: string
+   /** 计控主板UUId */
+      calculatorMainboardUuid?: string
+   /** 编码器UUID */
+      encoderControlUuid?: string
+   /** 监控微处理器UUID */
+      taxControlMainBoardUuid?: string
+   /** 智能型控制阀 UUID */
+      valveControlUuid?: string
+   /** 油气回收控制板UUID */
+      vaporRecoveryControlUuid?: string
+   /** 显示屏UUID */
+      displayControlUuid?: string
+   /** 计量器UUID */
+      meterUuid?: string
+   /** 创建时间 */
+      createTime?: string
+
+}
+export interface pageInput {
+      /**当前页数 */
+      CurrentPage: number | any
+      /**展示页数 */
+      PageSize: number | any
+    }

+ 46 - 106
admin.ui.plus-master/src/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi.ts

@@ -1,19 +1,29 @@
 import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client";
 import { AxiosResponse } from 'axios'
+import { 
+  FuelDispenserEntity, 
+  PageOutputAlarmHistoryDto, 
+  PageInputAlarmHistoryDto, 
+  PageOutputLifeCycleDto, 
+  PageInputLifeCycleDto,
+  PageInputSnapshotDto,
+  ResultOutputSnapshotDto
+} from "./oilEngineDetailsDto";
 
 export class OilEngineDetailsApi <SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
   timer = 500
+  
   /**
-  * No description
+  * 获取油机详情基本信息
   *
-  * @tags
+  * @tags 油机详情
   * @name GetBasicInfo
   * @summary 获取油机详情基本信息
   * @request POST:/api/app/fuel-dispenser/get-dispensers
   * @secure
   */
   getBasicInfoDto = (data: any, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
+    this.request<AxiosResponse<FuelDispenserEntity>, FuelDispenserEntity>({
       path: `/api/app/fuel-dispenser/get-dispensers`,
       method: 'POST',
       query: data,
@@ -23,39 +33,17 @@ export class OilEngineDetailsApi <SecurityDataType = unknown> extends HttpClient
     })
 
 
-  // getBasicInfoDto = () =>
-  //   new Promise(resolve => {
-  //     setTimeout(()=>{
-  //       resolve({
-  //         data:{
-  //           oilEngineNumber:"4",
-  //           serialNumber:"1904344P",
-  //           oilCompanies:"中石化安徽宣城石油分公司深爱的深爱的",
-  //           fuelDispenserManufacturer:"托肯恒山科技(广州)有限公司",
-  //           gasStation:"中石化安徽宣城金陵加油站",
-  //           specifications:"THD2244B2",
-  //           measuringRange:"2L-50L",
-  //           accuracyLevel:"0.3",
-  //           factoryCode:"1904344P",
-  //           onlineStatus:"离线",
-  //           alarmStatus:"严重报警",
-  //           imgUrl:"upload/2023/09/15/65048ee6-9b3f-2234-0097-734b351ca09d.png"
-  //         }
-  //       })
-  //     },this.timer)
-  //   })
-
   /**
-  * No description
+  * 获取油机详情报警历史列表信息
   *
-  * @tags
-  * @name GetAlarmHistoryDto
+  * @tags 油机详情
+  * @name GetAlarmHistory
   * @summary 获取油机详情报警历史列表信息
   * @request POST:/api/app/fuel-dispenser/get-alarm-history
   * @secure
   */
-  getAlarmHistoryDto = (data: any, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
+  getAlarmHistoryDto = (data: PageInputAlarmHistoryDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse<PageOutputAlarmHistoryDto>, PageOutputAlarmHistoryDto>({
       path: `/api/app/fuel-dispenser/get-alarm-history`,
       method: 'POST',
       body: data,
@@ -63,59 +51,19 @@ export class OilEngineDetailsApi <SecurityDataType = unknown> extends HttpClient
       type: ContentType.Json,
       ...params,
     })
-  // getAlarmHistoryDto = () =>
-  //   new Promise(resolve => {
-  //     setTimeout(() => {
-  //       resolve({
-  //         total:100,
-  //         list:[{
-  //           time:'2023-07-23 09:36',
-  //           gasStation:"中化安徽宣城金陵加油站",
-  //           fillingMachine:"4",
-  //           fuelDispenserSerialNumber:"1904344P",
-  //           alarmSource:"云平台",
-  //           alarmType:"加油机离线",
-  //           alarmDescription:"加油机(监督装置)长期离线"
-  //         },{
-  //           time:'2023-07-23 09:36',
-  //           gasStation:"中化安徽宣城金陵加油站",
-  //           fillingMachine:"4",
-  //           fuelDispenserSerialNumber:"1904344P",
-  //           alarmSource:"云平台",
-  //           alarmType:"加油机离线",
-  //           alarmDescription:"加油机(监督装置)长期离线"
-  //         },{
-  //           time:'2023-07-23 09:36',
-  //           gasStation:"中化安徽宣城金陵加油站",
-  //           fillingMachine:"4",
-  //           fuelDispenserSerialNumber:"1904344P",
-  //           alarmSource:"云平台",
-  //           alarmType:"加油机离线",
-  //           alarmDescription:"加油机(监督装置)长期离线"
-  //         },{
-  //           time:'2023-07-23 09:36',
-  //           gasStation:"中化安徽宣城金陵加油站",
-  //           fillingMachine:"4",
-  //           fuelDispenserSerialNumber:"1904344P",
-  //           alarmSource:"云平台",
-  //           alarmType:"加油机离线",
-  //           alarmDescription:"加油机(监督装置)长期离线"
-  //         }]
-  //       })
-  //     },this.timer)
-  //   })
+
 
   /**
-  * No description
+  * 获取油机详情生命周期列表信息
   *
-  * @tags
-  * @name GetLifeCycleDto
+  * @tags 油机详情
+  * @name GetLifeCycle
   * @summary 获取油机详情生命周期列表信息
   * @request POST:/api/app/fuel-dispenser/get-life-cycle
   * @secure
   */
-  getLifeCycleDto = (data: any, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
+  getLifeCycleDto = (data: PageInputLifeCycleDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse<PageOutputLifeCycleDto>, PageOutputLifeCycleDto>({
       path: `/api/app/fuel-dispenser/get-life-cycle`,
       method: 'POST',
       body: data,
@@ -123,33 +71,25 @@ export class OilEngineDetailsApi <SecurityDataType = unknown> extends HttpClient
       type: ContentType.Json,
       ...params,
     })
-  // getLifeCycleDto = () =>
-  //   new Promise(resolve => {
-  //     setTimeout(() => {
-  //       resolve({
-  //         total:100,
-  //         list:[{
-  //           time:"2023-07-23 09:36",
-  //           operator:"托肯",
-  //           operatorID:"123",
-  //           operation:"132",
-  //         },{
-  //           time:"2023-07-23 09:36",
-  //           operator:"托肯",
-  //           operatorID:"123",
-  //           operation:"132",
-  //         },{
-  //           time:"2023-07-23 09:36",
-  //           operator:"托肯",
-  //           operatorID:"123",
-  //           operation:"132",
-  //         },{
-  //           time:"2023-07-23 09:36",
-  //           operator:"托肯",
-  //           operatorID:"123",
-  //           operation:"132",
-  //         }]
-  //       })
-  //     },this.timer)
-  //   })
-}
+
+
+  /**
+  * 获取油机快照列表
+  *
+  * @tags 油机详情
+  * @name GetSnapshotList
+  * @summary 获取油机快照列表
+  * @request POST:/api/app/fuel-dispenser/get-dispenser-snapshot-list
+  * @secure
+  */
+  getSnapshotList = (data: PageInputSnapshotDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse<ResultOutputSnapshotDto>, ResultOutputSnapshotDto>({
+      path: `/api/app/fuel-dispenser/get-dispenser-snapshot-list`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+
+}

+ 66 - 3
admin.ui.plus-master/src/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsDto.ts

@@ -52,7 +52,10 @@ export interface FuelDispenserEntity{
   accuracyLevel: string
   /**规格参数*/
   modelSpec: string
+  /**图片URL*/
+  imgurl?: string
 }
+
 /** 油机详情输出信息 */
 export interface ResultOutputList {
   /** 是否成功标记 */
@@ -64,6 +67,7 @@ export interface ResultOutputList {
   /** 数据 */
   data?: FuelDispenserEntity | null
 }
+
 /**
  * And=0,Or=1
  * @format int32
@@ -75,6 +79,7 @@ export type DynamicFilterLogic = 0 | 1
  * @format int32
  */
 export type DynamicFilterOperator = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18
+
 export interface DynamicFilterInfo {
   field?: string | null
   /** Contains=0,StartsWith=1,EndsWith=2,NotContains=3,NotStartsWith=4,NotEndsWith=5,Equal=6,Equals=7,Eq=8,NotEqual=9,GreaterThan=10,GreaterThanOrEqual=11,LessThan=12,LessThanOrEqual=13,Range=14,DateRange=15,Any=16,NotAny=17,Custom=18 */
@@ -84,6 +89,7 @@ export interface DynamicFilterInfo {
   logic?: DynamicFilterLogic
   filters?: DynamicFilterInfo[] | null
 }
+
 /**
  * 油机详情报警历史列表信息
  */
@@ -107,6 +113,7 @@ export  interface AlarmHistoryDto{
   /**id*/
   alarmHistoryID: number,
 }
+
 /** 分页信息输入 */
 export interface PageInputAlarmHistoryDto{
   /**
@@ -135,8 +142,7 @@ export interface PageOutputAlarmHistoryDto{
 }
 
 /**结果输出*/
-export interface ResultOutputPageOutputAlarmHistoryDto
-{
+export interface ResultOutputPageOutputAlarmHistoryDto {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -146,6 +152,7 @@ export interface ResultOutputPageOutputAlarmHistoryDto
   /** 分页信息输出 */
   data?: PageOutputAlarmHistoryDto
 }
+
 /**
  * 油机详情生命周期列表信息
  */
@@ -163,6 +170,7 @@ export  interface LifeCycleDto{
   /**id*/
   lifeCycleID?: number,
 }
+
 /** 分页信息输入 */
 export interface PageInputLifeCycleDto{
   /**
@@ -191,7 +199,7 @@ export interface PageOutputLifeCycleDto{
 }
 
 /**结果输出*/
-export interface ResultOutputPageOutputLifeCycleDto{
+export interface ResultOutputPageOutputLifeCycleDto {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -201,3 +209,58 @@ export interface ResultOutputPageOutputLifeCycleDto{
   /** 分页信息输出 */
   data?: PageOutputLifeCycleDto
 }
+
+/**
+ * 快照列表数据
+ */
+export interface SnapshotDto {
+  dispenserSerialNum: string; // 加油机出厂编号
+  dispenserUuid: string; // 加油机序列号
+  nozzleControlMainBoard: string; // 油枪主板ID
+  nozzleControlName: string; // 油枪逻辑编号
+  blackBoxUuid: string; // 安全装置UUID
+  calculatorMainboardUuid: string; // 计控主板UUId
+  encoderControlUuid: string; // 编码器UUID
+  taxControlMainBoardUuid: string; // 监控微处理器UUID
+  valveControlUuid: string; // 智能型控制阀 UUID
+  vaporRecoveryControlUuid: string; // 油气回收控制板UUID
+  displayControlUuid: string; // 显示屏UUID
+  meterUuid: string; // 计量器UUID
+  createTime: string; // 创建时间
+}
+
+/** 快照列表分页输入 */
+export interface PageInputSnapshotDto {
+  currentPage?: number;
+  pageSize?: number;
+  dynamicFilter?: DynamicFilterInfo;
+  filter?: {
+    dispenserSerialNum?: string;
+    dispenserUuid?: string;
+    nozzleControlMainBoard?: string;
+    nozzleControlName?: string;
+    blackBoxUuid?: string;
+    calculatorMainboardUuid?: string;
+    encoderControlUuid?: string;
+    taxControlMainBoardUuid?: string;
+    valveControlUuid?: string;
+    vaporRecoveryControlUuid?: string;
+    displayControlUuid?: string;
+    meterUuid?: string;
+    createTime?: string;
+  };
+}
+
+/** 快照列表分页输出 */
+export interface PageOutputSnapshotDto {
+  total?: number;
+  list?: SnapshotDto[];
+}
+
+/** 快照列表结果输出 */
+export interface ResultOutputSnapshotDto {
+  success?: boolean;
+  code?: string | null;
+  msg?: string | null;
+  data?: PageOutputSnapshotDto;
+}

+ 294 - 0
admin.ui.plus-master/src/views/admin/authorize/kuaizhao/index.vue

@@ -0,0 +1,294 @@
+<template>
+    <div class="layout-pd">
+      <el-row>
+  <!--操作-->
+        <el-col :xs="24" >
+          <el-card class="mt8"  shadow="hover" >
+  <el-form :model="state.filter" :inline="true" @submit.stop.prevent>
+              <el-form-item prop="name" style="width: 100%">
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="加油机出厂编号">
+                    <el-input v-model="state.filter.dispenserSerialNum" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="加油机序列号">
+                    <el-input v-model="state.filter.dispenserUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="油枪主板ID">
+                    <el-input v-model="state.filter.nozzleControlMainBoard" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="油枪逻辑编号">
+                    <el-input v-model="state.filter.nozzleControlName" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="安全装置UUID">
+                    <el-input v-model="state.filter.blackBoxUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="计控主板UUId">
+                    <el-input v-model="state.filter.calculatorMainboardUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="编码器UUID">
+                    <el-input v-model="state.filter.encoderControlUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="监控微处理器UUID">
+                    <el-input v-model="state.filter.taxControlMainBoardUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="智能型控制阀 UUID">
+                    <el-input v-model="state.filter.valveControlUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="油气回收控制板UUID">
+                    <el-input v-model="state.filter.vaporRecoveryControlUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="显示屏UUID">
+                    <el-input v-model="state.filter.displayControlUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="计量器UUID">
+                    <el-input v-model="state.filter.meterUuid" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+  <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+              <el-form-item label="选择时间">
+                    <el-date-picker
+                      v-model="state.filter.createTime"
+                      type="datetimerange"
+                      value-format="YYYY-MM-DD HH:mm:ss"
+                      range-separator="To"
+                      start-placeholder="开始日期"
+                      end-placeholder="结束日期"
+                    />
+                  </el-form-item>
+                </el-col>
+  </el-form-item>
+            </el-form>
+            
+            <hr>
+
+            
+  <el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">
+  <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+  </el-row>
+  </el-card>
+        </el-col>
+  <!--表格-->
+        <el-col  :xs="24" >
+          <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+          <el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+  <el-table-column type="selection" width="50"></el-table-column>
+
+          <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label"  >
+          </el-table-column> 
+  <el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="140">
+          <template #default="{ row }" >
+  <el-link
+                    class="my-el-link mr12 ml12"
+                    type="primary"
+                    icon="ele-Upload"
+                    @click="onDateUpdate(row)"
+                    :underline="false"
+                    target="_blank"
+                  >编辑</el-link>
+  <el-link
+                    class="my-el-link mr12 ml12"
+                    type="primary"
+                    icon="ele-Upload"
+                    @click="onDataDetail(row)"
+                    :underline="false"
+                    target="_blank"
+                  >详情</el-link>
+  <el-link
+                    class="my-el-link mr12 ml12"
+                    type="primary"
+                    icon="ele-Upload"
+                    @click="onDataDelete(row)"
+                    :underline="false"
+                    target="_blank"
+                  >删除</el-link>
+  </template>
+              </el-table-column>
+  </el-table>
+  <div class="my-flex my-flex-end" style="margin-top: 20px">
+              <el-pagination
+                v-model:currentPage="pageState.pageInput.currentPage"
+                v-model:page-size="pageState.pageInput.pageSize"
+                :total="state.total"
+                :page-sizes="[10, 15, 20, 50, 100]"
+                small
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                layout="total, sizes, prev, pager, next, jumper"
+              />
+            </div>
+  </el-card>
+        </el-col>
+  </el-row>
+      </div>
+    </template>
+    <script setup lang="ts">
+    import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
+    import eventBus from "/@/utils/mitt";
+    import {Api} from "/@/api/admin/deviceAuthorization/kuaizhaoApi";
+  import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+
+    // 使用组合式函数获取分页状态
+  const pageState = useDynamicPageSize(10, 15);
+  import { DispenserSnapshotDto } from "/@/api/admin/deviceAuthorization/kuaizhaoDto";
+      import type { pageInput } from "/@/api/admin/deviceAuthorization/kuaizhaoDto"
+      
+  /**数据对象*/
+    const state = reactive({
+      /**加载显示 */
+      loading: false,
+      /**条件查询模块 */
+        filter: {
+  /**加油机出厂编号 */
+          dispenserSerialNum: "",
+  /**加油机序列号 */
+          dispenserUuid: "",
+  /**油枪主板ID */
+          nozzleControlMainBoard: "",
+  /**油枪逻辑编号 */
+          nozzleControlName: "",
+  /**安全装置UUID */
+          blackBoxUuid: "",
+  /**计控主板UUId */
+          calculatorMainboardUuid: "",
+  /**编码器UUID */
+          encoderControlUuid: "",
+  /**监控微处理器UUID */
+          taxControlMainBoardUuid: "",
+  /**智能型控制阀 UUID */
+          valveControlUuid: "",
+  /**油气回收控制板UUID */
+          vaporRecoveryControlUuid: "",
+  /**显示屏UUID */
+          displayControlUuid: "",
+  /**计量器UUID */
+          meterUuid: "",
+  /**创建时间 */
+          createTime: null as [string, string] | null,
+        },
+    /**表格信息 */
+  tableModel: [] as DispenserSnapshotDto[],
+      /**动态表头 */
+      dynamicColumns: [
+  { prop: 'dispenserSerialNum', label: '加油机出厂编号' },
+  { prop: 'dispenserUuid', label: '加油机序列号' },
+  { prop: 'nozzleControlMainBoard', label: '油枪主板ID' },
+  { prop: 'nozzleControlName', label: '油枪逻辑编号' },
+  { prop: 'blackBoxUuid', label: '安全装置UUID' },
+  { prop: 'calculatorMainboardUuid', label: '计控主板UUId' },
+  { prop: 'encoderControlUuid', label: '编码器UUID' },
+  { prop: 'taxControlMainBoardUuid', label: '监控微处理器UUID' },
+  { prop: 'valveControlUuid', label: '智能型控制阀 UUID' },
+  { prop: 'vaporRecoveryControlUuid', label: '油气回收控制板UUID' },
+  { prop: 'displayControlUuid', label: '显示屏UUID' },
+  { prop: 'meterUuid', label: '计量器UUID' },
+  { prop: 'createTime', label: '创建时间' },],
+  /**分页标识 */
+      pageInput:{
+        CurrentPage: 1,
+        PageSize: 10,
+      } as pageInput,
+      /**分页总数 */
+      total: 0,
+  })
+    onMounted(() => {
+      // 初始化分页大小
+      state.pageInput.pageSize = pageState.pageInput.pageSize; 
+      init()
+      eventBus.off('refreshView')
+      eventBus.on('refreshView', async () => {
+        await init()
+      })
+      console.log()
+    })
+    onBeforeMount(() => {
+      eventBus.off('refreshView')
+    })
+    /**
+    * 监听变换
+    */
+    watch(() => {})
+  /**条件查询 */
+            const onQuery = () => {
+            init()
+          }
+          /**初始化 */
+          const init = async () => {
+            state.loading = true
+            // 处理查询参数,移除空的时间范围
+            const filterParams = { ...state.filter };
+            if (!filterParams.createTime || filterParams.createTime.length !== 2) {
+              delete filterParams.createTime;
+            }
+  const res:any = await new Api().getList({...pageState.pageInput, Filter: filterParams})
+              state.total = res?.data?.total ?? 0
+  state.tableModel = res?.data?.list ?? []
+            state.loading = false
+          }
+  /**编辑 */
+        const onDateUpdate=(row)=>{}
+  /**详情 */
+        const onDataDetail=(row)=>{}
+  /**删除 */
+        const onDataDelete=(row)=>{}
+
+    /**
+  * 页条变化
+  * @param val
+  */
+  const onSizeChange = (val: number) => {
+    state.pageInput.PageSize = val
+    //需按照页面对象修改Data
+    init()
+  }
+
+  /**
+   * 页数 变化
+   * @param val
+   */
+  const onCurrentChange = (val: number) => {
+    state.pageInput.CurrentPage = val
+    //需按照页面对象修改Data
+    init()
+  }
+    </script>
+  <style scoped lang="scss">
+    .el-input,
+  .el-select {
+    width: 240px;
+  }
+
+  /* 输入框标签固定四个字符宽度 */
+  ::v-deep .el-form-item__label {
+    // 字体大小14,5个字符,12px右间距
+    width: 14*5px+12px;
+    justify-content: start;
+  }
+
+  /* 数据表头 设置灰色样式 */
+  ::v-deep .el-table th.el-table__cell {
+    background-color: #F6F6F6;
+  }
+    </style>

+ 2 - 2
admin.ui.plus-master/src/views/admin/statement/BlackBox/index.vue

@@ -152,8 +152,6 @@ const FuelDispenserEnum = {
 tableModel: [] as BlackBoxDto,
     /**动态表头 */
     dynamicColumns: [
-{ prop: 'stationName', label: '加油站名称' },
-{ prop: 'oilCompanyName', label: '石油公司' },
 { prop: 'softwareVersion', label: '软件版本号' },
 { prop: 'hardwareVersion', label: '硬件版本号' },
 { prop: 'serialNumber', label: '序列号' },
@@ -163,6 +161,8 @@ tableModel: [] as BlackBoxDto,
 { prop: 'deviceStatus', label: '安全装置状态' },
 { prop: 'fixTime', label: '安装时间' },
 { prop: 'soldTime', label: '出厂时间' },
+{ prop: 'stationName', label: '加油站名称' },
+{ prop: 'oilCompanyName', label: '石油公司' },
 { prop: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },
 { prop: 'componentManufacturer', label: '部件出厂加油机厂商' },],
 

+ 1 - 1
admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue

@@ -167,7 +167,6 @@ const Data = reactive({
   } as alarmFilterModel_SearchFilter,
   tableModel: [] as Array<alarmFilterModel>,
   dynamicColumns: [
-    { prop: 'gasStation', label: '加油站名称',width: 300 },
     { prop: 'name', label: '油机号' },
     { prop: 'serialNumber', label: '序列号' },
     { prop: 'alarmSource', label: '报警来源' },
@@ -176,6 +175,7 @@ const Data = reactive({
     { prop: 'alarmDevice', label: '报警设备' },
     // { prop: 'nozzleControlName', label: '油枪' },
     { prop: 'createdDate', label: '报警时间' },
+    { prop: 'gasStation', label: '加油站名称',width: 300 },
     { prop: '', label: '诊断说明' },
     { prop: '', label: '是否推送' },
   ],

+ 3 - 3
admin.ui.plus-master/src/views/admin/statement/displayControl/index.vue

@@ -166,15 +166,15 @@ const state = reactive({
   tableModel: [] as encodercontrolsDto[],
   /** 动态表头 */
   dynamicColumns: [
-    { prop: 'oilCompanyName', label: '石油公司' },
-    { prop: 'stationName', label: '加油站名称' },
     { prop: 'serialNumber', label: '显示屏编号' },
     { prop: 'dispenserNumber', label: '油机号' },
     { prop: 'nozzleNumber', label: '油枪号' },
     { prop: 'deviceStatus', label: '显示屏状态' },
     { prop: 'onlineStatus', label: '在线状态' },
     { prop: 'fixTime', label: '安装时间' },
-    { prop: 'soldTime', label: '出厂时间' }
+    { prop: 'soldTime', label: '出厂时间' },
+    { prop: 'oilCompanyName', label: '石油公司' },
+    { prop: 'stationName', label: '加油站名称' },
   ],
   /** 分页总数 */
   total: 0,

+ 3 - 3
admin.ui.plus-master/src/views/admin/statement/encodercontrols/index.vue

@@ -166,16 +166,16 @@ const state = reactive({
   tableModel: [] as encodercontrolsDto[],
   /** 动态表头 */
   dynamicColumns: [
-    { prop: 'oilCompanyName', label: '石油公司' },
-    { prop: 'stationName', label: '加油站名称' },
     { prop: 'serialNumber', label: '编码器编号' },
-    { prop: 'bindingDispenserManufacturer', label: '加油机厂商' },
     { prop: 'dispenserNumber', label: '油机号' },
     { prop: 'nozzleNumber', label: '油枪号' },
     { prop: 'deviceStatus', label: '编码器状态' },
     { prop: 'onlineStatus', label: '在线状态' },
     { prop: 'fixTime', label: '安装时间' },
     { prop: 'soldTime', label: '出厂时间' },
+    { prop: 'oilCompanyName', label: '石油公司' },
+    { prop: 'stationName', label: '加油站名称' },
+    { prop: 'bindingDispenserManufacturer', label: '加油机厂商' },
   ],
   /** 分页总数 */
   total: 0,

+ 2 - 2
admin.ui.plus-master/src/views/admin/statement/jikongzhuban/index.vue

@@ -142,8 +142,6 @@ const pageState = useDynamicPageSize(10, 15);
 tableModel: [] as EncodercontrolsDto,
     /**动态表头 */
     dynamicColumns: [
-{ prop: 'oilCompanyName', label: '石油公司' },
-{ prop: 'stationName', label: '加油站名称' },
 { prop: 'serialNumber', label: '序列号' },
 { prop: 'softwareVersion', label: '软件版本号' },
 { prop: 'hardwareVersion', label: '硬件版本号' },
@@ -151,6 +149,8 @@ tableModel: [] as EncodercontrolsDto,
 { prop: 'onlineStatus', label: '在线状态' },
 { prop: 'fixTime', label: '安装时间' },
 { prop: 'soldTime', label: '出厂时间' },
+{ prop: 'oilCompanyName', label: '石油公司' },
+{ prop: 'stationName', label: '加油站名称' },
 { prop: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },
 ],
 /**分页标识 */

+ 3 - 3
admin.ui.plus-master/src/views/admin/statement/listOfOilEngines/index.vue

@@ -92,8 +92,6 @@
           <el-table v-loading="oilEngineData.loading" stripe :data="oilEngineData.tableModel" row-key="id"
             style="width: 100%" id="myTable" ref="myTable">
             <el-table-column prop="name" label="油机号" />
-            <el-table-column prop="oilCompany" label="石油公司" />
-            <el-table-column prop="gasStation" label="加油站" />
             <el-table-column prop="serialNumber" label="序列号" />
             <el-table-column prop="model" label="加油机机型" align="center"/>
             <el-table-column prop="platform" label="平台" align="center"/>     
@@ -103,7 +101,9 @@
             <el-table-column prop="manufactureDate" label="出厂时间" />
             <el-table-column prop="startupDate" label="启动时间" />
             <el-table-column prop="installationDate" label="安装时间" />
-            <el-table-column prop="deviceStatus" label="设备状态">
+            <el-table-column prop="deviceStatus" label="设备状态"/>
+            <el-table-column prop="oilCompany" label="石油公司" />
+            <el-table-column prop="gasStation" label="加油站" >
               <template #default="{ row }">
                 <div :style="{ color: getColor(getOilEngineStatus(row.deviceStatus)) }" class="bold-font">
                 <StatusBox :status="getOilEngineStatus(row.deviceStatus)" />

+ 556 - 289
admin.ui.plus-master/src/views/admin/statement/moreOilEngineDetails/component/main.vue

@@ -1,178 +1,377 @@
 <template>
     <div class="all-con" style="position: relative;">
-        <el-icon style="position: absolute;left: -15px;top: 17px;">
-            <component style="color:#fff;background-color: #3d3dff;height: 2.5em;border-radius:5px 0 0 5px;"
-                :is="showicon ? CaretLeft : CaretRight" @click="onShowHide" />
+        <el-icon style="position: absolute;left: -15px;top: 17px;z-index: 10;">
+            <component 
+                style="color:#fff;background-color: #3d3dff;height: 2.5em;border-radius:5px 0 0 5px;"
+                :is="showicon ? CaretLeft : CaretRight" 
+                @click="onShowHide" 
+            />
         </el-icon>
         <el-card class="oilInfo-bottom one">
-            <el-row :gutter="10" style="text-align: center;line-height: 2em;height: 2em">
-
+            <el-row :gutter="10" style="text-align: center;line-height: 2em;height: 2em;position: relative;">
                 <el-col :span="1">
-                    <div :style="isDisplay == 1 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(1)">概览
-                    </div>
+                    <div :style="isDisplay == 1 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(1)">概览</div>
                 </el-col>
                 <el-col :span="2">
-                    <div :style="isDisplay == 2 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(2)">报警
-                    </div>
+                    <div :style="isDisplay == 2 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(2)">报警</div>
                 </el-col>
                 <el-col :span="3" class="oilInfo-bottom">
-                    <div :style="isDisplay == 3 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(3)">
-                        ECQS编码状态
-                    </div>
+                    <div :style="isDisplay == 3 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(3)">ECQS编码状态</div>
                 </el-col>
                 <el-col :span="3" class="oilInfo-bottom">
-                    <div :style="isDisplay == 4 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(4)">
-                        维修记录
-                    </div>
+                    <div :style="isDisplay == 4 ? 'border-bottom:1px solid blue' : 'border:none'" @click="display(4)">维修记录</div>
                 </el-col>
-                <el-row :span="15" class="oilInfo-bottom to-flex" style="position: absolute;right: 0;">
-                    <div style="margin-right: 1em;">
-                        图例:
-                    </div>
-                    <div style="margin-right: 2em;">
-                        <div class="status-point" style="background-color:#5b53f9;right: 18.5em;top: 0.75em;" />
+                <!-- 右侧图例 -->
+                <el-col :span="15" class="oilInfo-bottom to-flex" style="display: flex;justify-content: flex-end;">
+                    <div style="margin-right: 1em;">图例:</div>
+                    <div style="margin-right: 2em;display: flex;align-items: center;">
+                        <div class="status-point" style="background-color:#5b53f9;margin-right: 5px;" />
                         在线
                     </div>
-                    <div style="margin-right: 0.75em;">
-                        <div class="status-point" style="background-color:#9f9fa3;right: 14.5em;top: 0.75em;" />
+                    <div style="margin-right: 0.75em;display: flex;align-items: center;">
+                        <div class="status-point" style="background-color:#9f9fa3;margin-right: 5px;" />
                         离线
                     </div>
-                    <div style="margin-right: 0.75em;">
+                    <div style="margin-right: 0.75em;display: flex;align-items: center;">
                         <img :src="uurl" style="width: 1em;margin-right: 0.25em;">
                         校验成功
                     </div>
-                    <div style="margin-right: 2em;">
+                    <div style="margin-right: 0.75em;display: flex;align-items: center;">
                         <img :src="urrl" style="width: 1em;margin-right: 0.25em;">
                         校验失败
                     </div>
-                </el-row>
+                </el-col>
             </el-row>
         </el-card>
+
         <div class="tip-con">
-            <el-alert v-if="detailsData.list.onlineStatus === '离线'" title="加油机长时间离线" type="error"
-                class="mb15"></el-alert>
-            <el-alert v-if="detailsData.list.onlineStatus === '在线'" title="加油机长时间在线" type="success"
-                class="mb15"></el-alert>
+            <el-alert v-if="detailsData.list.onlineStatus === '离线'" title="加油机长时间离线" type="error" class="mb15"></el-alert>
+            <el-alert v-if="detailsData.list.onlineStatus === '在线'" title="加油机长时间在线" type="success" class="mb15"></el-alert>
         </div>
-        <!-- 油机内容 -->
-        <el-text tag="b" style="color: #000">油机详情</el-text>
-        <el-card class="oilInfo-con oilInfo-bottom">
-            <el-row class='oilInfo-bottom'>
-                <img class="oilInfo-img" :src="url">
+
+        <!-- 概览内容 -->
+        <template v-if="isDisplay == 1">
+            <!-- 油机内容 -->
+            <el-text tag="b" style="color: #000">油机详情</el-text>
+            <el-card class="oilInfo-con oilInfo-bottom">
+                <el-row class='oilInfo-bottom'>
+                    <img class="oilInfo-img" :src="url">
+                    <div>
+                        <el-col :span="24" class="oilInfo-bottom">
+                            <div class="status-point oilInfo-con-first"
+                                :style="detailsData.list.onlineStatus == '在线' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'" />
+                            <span style="margin:0 0.5em 0 1em">{{ detailsData.list.name }}号机油机</span>
+                            <img :src="uurl" style="width: 1.5em;margin-top: 0.3vh;">
+                        </el-col>
+                        <el-col :span="24" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>出厂编号:</span>{{ detailsData.list.serialNumber }}
+                        </el-col>
+                        <el-col :span="24" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>制造商:</span>{{ detailsData.list.manufacturer }}
+                        </el-col>
+                    </div>
+                </el-row>
                 <div>
-                    <el-col :span="24" class="oilInfo-bottom">
-                        <div class="status-point oilInfo-con-first"
-                            :style="detailsData.list.onlineStatus == '在线' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'" />
-                        <span style="margin:0 0.5em 0 1em">{{ detailsData.list.name }}号机油机</span>
-                        <img :src="uurl" style="width: 1.5em;margin-top: 0.3vh;">
-                    </el-col>
-                    <el-col :span="24" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>出厂编号:</span>{{ detailsData.list.serialNumber }}
-                    </el-col>
-                    <el-col :span="24" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>制造商:</span>{{ detailsData.list.manufacturer }}
-                    </el-col>
+                    <el-row :gutter="20">
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>机型:</span>{{ detailsData.list.model }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>规格参数:</span>{{ detailsData.list.modelSpec }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>测量范围:</span>{{ detailsData.list.measureRang }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>准确度等级:</span>{{ detailsData.list.accuracyLevel }}
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>生产日期:</span>{{ detailsData.list.createdTime }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>安装日期:</span>{{ detailsData.list.installationDate }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>启用日期:</span>{{ detailsData.list.startupDate }}
+                        </el-col>
+                        <el-col :span="6" class="oilInfo-bottom">
+                            <span class='oilInfo-item'>累计在线时间:</span>{{ detailsData.list.onlineDesc }}
+                        </el-col>
+                    </el-row>
                 </div>
+            </el-card>
+
+            <!-- 油枪列表 -->
+            <el-row :gutter="10" class="oilInfo-bottom" style="align-items: center;">
+                <el-col :span="2" class="oilInfo-bottom">
+                    <el-text tag="b" style="color: #000">油枪列表</el-text>
+                </el-col>
+                <el-col :span="2" class="oilInfo-bottom">
+                    <div class="oilLabel-con" @click="isOnline('所有')"
+                        :style="flagData.isFlag == '所有' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
+                        所有
+                    </div>
+                </el-col>
+                <el-col :span="2" class="oilInfo-bottom">
+                    <div class="oilLabel-con" @click="isOnline('在线')"
+                        :style="flagData.isFlag == '在线' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
+                        在线
+                    </div>
+                </el-col>
+                <el-col :span="2" class="oilInfo-bottom">
+                    <div class="oilLabel-con" @click="isOnline('离线')"
+                        :style="flagData.isFlag == '离线' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
+                        离线
+                    </div>
+                </el-col>
+                <el-col :span="3" class="oilInfo-bottom">
+                    <div class="oilLabel-con" style="background-color: #89898b;  width: 6em;">校验通过</div>
+                </el-col>
+                <el-col :span="3" class="oilInfo-bottom">
+                    <div class="oilLabel-con" style="background-color: #89898b;  width: 6em;">校验失败</div>
+                </el-col>
             </el-row>
-            <div>
-                <el-row :gutter="20">
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>机型:</span>{{ detailsData.list.model }}
-                    </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>规格参数:</span>{{ detailsData.list.modelSpec }}
-                    </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>测量范围:</span>{{ detailsData.list.measureRang }}
-                    </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>准确度等级:</span>{{ detailsData.list.accuracyLevel }}
-                    </el-col>
-                </el-row>
-                <el-row :gutter="20">
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>生产日期:</span>{{ detailsData.list.createdTime }}
+
+            <el-row :gutter="16" style="margin-top:10px;" :key="flagData.keyData">
+                <el-col :span="8" v-for="(item, index) in listcom" :key="index">
+                    <el-card class="oilInfo-msg oilInfo-bottom"
+                        @click="toParts(item)">
+                        <el-row class="oilInfo-bottom">
+                            <img :src="urll" class="oilInfo-img">
+                            <div>
+                                <el-col :span="24" class="oilInfo-bottom">
+                                    <el-text tag="b">逻辑枪号:{{ item.name }}</el-text>
+                                    <div style="position: absolute;right: 10%;top: 5%;">
+                                        <div class="status-point"
+                                            :style="item.onlineStatus == '在线' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'">
+                                        </div>
+                                        <img :src="uurl" style="width: 1.5em;margin-top: 0.3vh;margin-left: 1vh;">
+                                    </div>
+                                </el-col>
+                                <el-col :span="24" class="oilInfo-bottom">
+                                    <span class="oilInfo-item-two">物理枪号:</span>{{ item.mainBoard_NozzleNo }}
+                                </el-col>
+                                <el-col :span="24" class="oilInfo-bottom">
+                                    <span class="oilInfo-item-two">自锁功能:</span>{{ item.alarming }}
+                                </el-col>
+                            </div>
+                        </el-row>
+                        <el-row class="oilInfo-bottom">
+                            <span class="oilInfo-item-two">油品:</span>{{ item.fuelName }}
+                        </el-row>
+                        <el-row>
+                            <span class="oilInfo-item-two">ECQS编码:</span>{{ item.code }}
+                        </el-row>
+                    </el-card>
+                </el-col>
+            </el-row>
+        </template>
+
+        <!-- 报警内容 -->
+        <template v-if="isDisplay == 2">
+            <el-text tag="b" style="color: #000">报警记录</el-text>
+            <el-card class="oilInfo-con oilInfo-bottom">
+                <el-table
+                    :data="tableData.list"
+                    border
+                    style="width: 100%;"
+                    v-loading="tableData.loading"
+                >
+                    <el-table-column
+                        prop="alarmType"
+                        label="报警类型"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="alarmContent"
+                        label="报警内容"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="createdDate"
+                        label="报警时间"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="status"
+                        label="处理状态"
+                        width="120"
+                    >
+                        <template #default="scope">
+                            <el-tag :type="scope.row.status === '已处理' ? 'success' : 'warning'">
+                                {{ scope.row.status }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-card>
+        </template>
+
+        <!-- ECQS编码状态内容 -->
+        <template v-if="isDisplay == 3">
+            <el-text tag="b" style="color: #000">ECQS编码状态</el-text>
+            <el-card class="oilInfo-con oilInfo-bottom">
+                <!-- ECQS筛选条件 -->
+                <el-row :gutter="20" class="oilInfo-bottom" style="margin-bottom: 15px;">
+                    <el-col :span="6">
+                        <el-input 
+                            v-model="ecqsFilter.code" 
+                            placeholder="请输入ECQS编码" 
+                            clearable
+                        ></el-input>
                     </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>安装日期:</span>{{ detailsData.list.installationDate }}
+                    <el-col :span="6">
+                        <el-select 
+                            v-model="ecqsFilter.status" 
+                            placeholder="请选择ECQS状态"
+                            clearable
+                        >
+                            <el-option label="校验成功" value="success"></el-option>
+                            <el-option label="校验失败" value="fail"></el-option>
+                            <el-option label="待校验" value="pending"></el-option>
+                        </el-select>
                     </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>启用日期:</span>{{ detailsData.list.startupDate }}
+                    <el-col :span="2">
+                        <el-button type="primary" @click="searchEcqs">搜索</el-button>
                     </el-col>
-                    <el-col :span="6" class="oilInfo-bottom">
-                        <span class='oilInfo-item'>累计在线时间:</span>{{ detailsData.list.onlineDesc }}
+                    <el-col :span="2">
+                        <el-button @click="resetEcqsFilter">重置</el-button>
                     </el-col>
                 </el-row>
-            </div>
-        </el-card>
-        <el-row :gutter="10" class="oilInfo-bottom">
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <el-text tag="b" style="color: #000">油枪列表</el-text>
-            </el-col>
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <div class="oilLabel-con" @click="isOnline('所有')"
-                    :style="flagData.isFlag == '所有' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
-                    所有
-                </div>
-            </el-col>
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <div class="oilLabel-con" @click="isOnline('在线')"
-                    :style="flagData.isFlag == '在线' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
-                    在线</div>
-            </el-col>
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <div class="oilLabel-con" @click="isOnline('离线')"
-                    :style="flagData.isFlag == '离线' ? 'background-color:#4d4dff' : 'background-color:#89898b'">
-                    离线</div>
-            </el-col>
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <div class="oilLabel-con" style="background-color: #89898b;  width: 6em;">校验通过</div>
-            </el-col>
-            <el-col :span="0.5" class="oilInfo-bottom">
-                <div class="oilLabel-con" style="background-color: #89898b;  width: 6em;">校验失败</div>
-            </el-col>
-        </el-row>
-        <el-row :gutter="16" style="margin-top:10px;" :key="flagData.keyData">
-            <el-col :span="8" v-for="(item, index) in listcom" v-bind:key="index">
-                <el-card class="oilInfo-msg oilInfo-bottom"
-                    @click="toParts(item.name, item.mainBoard_NozzleNo, item.onlineStatus, item.fuelName, item.alarming, item.code)">
-                    <el-row class="oilInfo-bottom">
-                        <img :src="urll" class="oilInfo-img">
-                        <div>
-                            <el-col :span="24" class="oilInfo-bottom">
-                                <el-text tag="b">逻辑枪号:{{ item.name }}</el-text>
-                                <div style="position: absolute;right: 10%;top: 5%;">
-                                    <div class="status-point"
-                                        :style="item.onlineStatus == '在线' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'">
-                                    </div>
-                                    <img :src="uurl" style="width: 1.5em;margin-top: 0.3vh;margin-left: 1vh;">
-                                </div>
-                            </el-col>
-                            <el-col :span="24" class="oilInfo-bottom">
-                                <span class="oilInfo-item-two">物理枪号:</span>{{
-                                    item.mainBoard_NozzleNo }}
-                            </el-col>
-                            <el-col :span="24" class="oilInfo-bottom">
-                                <span class="oilInfo-item-two">自锁功能:</span>{{ item.alarming }}
-                            </el-col>
-                        </div>
-                    </el-row>
-                    <el-row class="oilInfo-bottom">
-                        <span class="oilInfo-item-two">油品:</span>{{ item.fuelName }}
-                    </el-row>
-                    <el-row>
-                        <span class="oilInfo-item-two">ECQS编码:</span>{{ item.code }}
-                    </el-row>
-                </el-card>
-            </el-col>
-        </el-row>
-    </div>
 
+                <!-- ECQS编码状态表格 -->
+                <el-table
+                    :data="ecqsTableData"
+                    border
+                    style="width: 100%;"
+                    v-loading="ecqsLoading"
+                >
+                    <el-table-column
+                        prop="id"
+                        label="加油机"
+                        width="80"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="id"
+                        label="油机序列号"
+                        width="80"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="name"
+                        label="加油枪"
+                    ></el-table-column>
+                     <el-table-column
+                        prop="code"
+                        label="ECQS编码"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="status"
+                        label="编码状态"
+                        width="120"
+                    >
+                        <template #default="scope">
+                            <el-tag 
+                                :type="scope.row.status === 'success' ? 'success' : 
+                                       scope.row.status === 'fail' ? 'danger' : 'warning'"
+                            >
+                                {{ scope.row.status === 'success' ? '校验成功' : 
+                                   scope.row.status === 'fail' ? '校验失败' : '待校验' }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        prop="lastCheckTime"
+                        label="最后校验时间"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="description"
+                        label="描述"
+                    ></el-table-column>
+                    <el-table-column
+                        label="操作"
+                        width="120"
+                    >
+                        <template #default="scope">
+                            <el-button 
+                                type="text" 
+                                size="small"
+                                @click="viewEcqsDetails(scope.row)"
+                            >
+                                详情
+                            </el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+
+                <!-- 分页 -->
+                <el-pagination
+                    class="oilInfo-bottom"
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page="ecqsPagination.currentPage"
+                    :page-sizes="[5, 10, 20, 50]"
+                    :page-size="ecqsPagination.pageSize"
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="ecqsPagination.total"
+                ></el-pagination>
+            </el-card>
+        </template>
+
+        <!-- 维修记录内容 -->
+        <template v-if="isDisplay == 4">
+            <el-text tag="b" style="color: #000">维修记录</el-text>
+            <el-card class="oilInfo-con oilInfo-bottom">
+                <el-table
+                    :data="maintenanceData"
+                    border
+                    style="width: 100%;"
+                >
+                    <el-table-column
+                        prop="maintainNo"
+                        label="维修单号"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="maintainType"
+                        label="维修类型"
+                        width="120"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="content"
+                        label="维修内容"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="maintainTime"
+                        label="维修时间"
+                        width="180"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="person"
+                        label="维修人员"
+                        width="120"
+                    ></el-table-column>
+                    <el-table-column
+                        prop="status"
+                        label="状态"
+                        width="120"
+                    >
+                        <template #default="scope">
+                            <el-tag :type="scope.row.status === '已完成' ? 'success' : 'info'">
+                                {{ scope.row.status }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-card>
+        </template>
+    </div>
 </template>
 
 <script setup lang="ts">
 import { computed, onMounted, reactive, ref, watch } from "vue";
-//import { CirclePlusFilled } from '@element-plus/icons-vue'
 import { NozzlecontrolDtl } from "/@/api/admin/reportManagement/moreOilEngineDetails/moreOilEngineDetailsDto";
 import { OilEngineDetailsApi } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi";
 import { FuelDispenserEntity, AlarmHistoryDto } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsDto"
@@ -183,114 +382,134 @@ import urll from "/@/assets/youqiang.png";
 import uurl from "/@/assets/map/IconParkSolidCheckOne.png";
 import urrl from "/@/assets/map/IconParkSolidCloseOne.png";
 
-
 import {
     Document,
     Menu as IconMenu,
     Location,
     Setting,
-    CaretRight,
     CaretLeft,
+    CaretRight,
 } from '@element-plus/icons-vue'
 
 /******************************数据对象***************************************/
-
-
-/**
- * 接收index.vue传的id,传递 菜单栏控制参数
- */
 const props = defineProps({
     id: String,
 })
 
 const emit = defineEmits(['getIcon'])
 
-/**
- * 表格数据对象
- */
+// 报警记录数据
 const tableData = reactive({
     loading: false,
     list: [] as Array<AlarmHistoryDto>
 })
 
-/**
- * 油机详情数据对象
- */
+// 油机详情数据
 const detailsData = reactive({
     loading: false,
     list: {} as FuelDispenserEntity
 })
 
-/**
- * 油机列表详情数据对象
- */
+// 油枪列表数据
 const oilListData = reactive({
     loading: false,
     list: [] as Array<NozzlecontrolDtl>
 })
-/**
- * 油机列表初始ID
- */
+
+// ECQS编码状态相关数据
+const ecqsFilter = reactive({
+    code: '',
+    status: ''
+})
+
+const ecqsPagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0
+})
+
+// 模拟ECQS表格数据
+const ecqsTableData = ref([
+    {
+        id: 1,
+        code: 'ECQS123456',
+        name: '1号枪',
+        status: 'success',
+        lastCheckTime: '2023-10-01 10:30:00',
+        description: 'ECQS编码校验成功'
+    },
+    {
+        id: 2,
+        code: 'ECQS123457',
+        name: '2号枪',
+        status: 'fail',
+        lastCheckTime: '2023-10-01 11:15:00',
+        description: 'ECQS编码校验失败,编码格式错误'
+    },
+    {
+        id: 3,
+        code: 'ECQS123458',
+        name: '3号枪',
+        status: 'pending',
+        lastCheckTime: '',
+        description: '等待ECQS编码校验'
+    },
+    {
+        id: 4,
+        code: 'ECQS123459',
+        name: '4号枪',
+        status: 'success',
+        lastCheckTime: '2023-10-01 09:45:00',
+        description: 'ECQS编码校验成功'
+    },
+    {
+        id: 5,
+        code: 'ECQS123460',
+        name: '5号枪',
+        status: 'fail',
+        lastCheckTime: '2023-10-01 14:20:00',
+        description: 'ECQS编码校验失败,编码已过期'
+    }
+])
+
+// 模拟维修记录数据
+const maintenanceData = ref([
+    {
+        maintainNo: 'MT202310001',
+        maintainType: '常规保养',
+        content: '更换密封圈,清洁过滤器',
+        maintainTime: '2023-10-01 09:00:00',
+        person: '张三',
+        status: '已完成'
+    },
+    {
+        maintainNo: 'MT202309015',
+        maintainType: '故障维修',
+        content: '修复计量不准问题',
+        maintainTime: '2023-09-15 14:30:00',
+        person: '李四',
+        status: '已完成'
+    }
+])
+
 const initID = ref()
-const toPage = () => {
+const toPage = (path: string) => {
     const id = props.id
-    router.push({ path: `/statement/${id}/more/moreAlert` })
+    if (id) {
+        router.push({ path: `/statement/${id}/more/${path}` })
+    }
 }
 
-/**
- * 油枪列表相关数据
- */
 let listcom = JSON.parse(JSON.stringify(oilListData.list))
 let flagData = reactive({
     keyData: 0,
     isFlag: '所有'
 })
-/******************************数据对象***************************************/
-
-/*******************************方法**************************************/
 
-// /**
-//  * 变换时改样式
-//  * @param event
-//  * @param item
-//  */
-// const onCardChange = (event, item) => {
-//   // console.log(event)
-//   // console.log(item);
-//   let ele = event.target
-//
-//   if( ele.getAttribute('name') !== 'card') {
-//     ele = ele.closest('.card')
-//   }
-//
-//   if(ele.classList.contains("active-card")) return
-//
-//   initID.value = item.oilEngineName
-//
-//   const parentElement = document.getElementById('top-conId')
-//   const myElement = parentElement.querySelector('.active-card')
-//
-//   if(myElement){
-//     myElement.classList.remove('active-card')
-//   }
-//
-//   ele.classList.add("active-card")
-// }
-
-watch(() => initID.value, () => {
-    initTableData()
-    initDetailsData()
-})
-watch(props, (val) => {
-    init()
-})
 /*******************************方法**************************************/
-
-/**********************************初始化***********************************/
-/**
- * 格式化日期
- */
-const formatDate = (val) => {
+// 日期格式化
+const formatDate = (val: any) => {
+    if (!val) return ''
     const date = new Date(val)
     const year: number = date.getFullYear();
     const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
@@ -300,195 +519,243 @@ const formatDate = (val) => {
     const seconds: string = date.getSeconds().toString().padStart(2, '0');
     return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
 }
-/**
- * 初始化油机列表详情数据对象
- */
+
+// 初始化油枪列表数据
 const initOilListData = async () => {
     oilListData.loading = true
     const fuelId = props.id
-    const { data } = await new MoreOilEngineDetailsApi().getOilListData({ Fuelid: fuelId })
-    oilListData.list = data
+    if (fuelId) {
+        try {
+            const { data } = await new MoreOilEngineDetailsApi().getOilListData({ Fuelid: fuelId })
+            oilListData.list = data || []
+            listcom = [...oilListData.list]
+            flagData.keyData = Math.random()
+        } catch (error) {
+            console.error('初始化油枪列表失败:', error)
+        }
+    }
     oilListData.loading = false
-    listcom = data
-    flagData.keyData = Math.random()
 }
 
-/**
- * 初始化表格数据对象
- */
+// 初始化报警记录数据
 const initTableData = async () => {
     tableData.loading = true
     const fuelId = props.id
-    const filter = { fuelId: fuelId }
-    const pageInput = { currentPage: 1, pageSize: 5 }
-    const { data } = await new OilEngineDetailsApi().getAlarmHistoryDto({ ...pageInput, filter: filter })
-    tableData.list = data.list
-    tableData.list = tableData.list?.map((item) => {
-        if (item.createdDate !== null) {
-            item.createdDate = formatDate(item.createdDate)
+    if (fuelId) {
+        try {
+            const { data } = await new OilEngineDetailsApi().getAlarmHistoryDto({ 
+                currentPage: 1, 
+                pageSize: 5,
+                filter: { fuelId } 
+            })
+            tableData.list = (data.list || []).map((item) => ({
+                ...item,
+                createdDate: item.createdDate ? formatDate(item.createdDate) : '',
+                status: item.status ? '已处理' : '未处理'
+            }))
+        } catch (error) {
+            console.error('初始化报警记录失败:', error)
         }
-        return item
-    })
+    }
     tableData.loading = false
 }
 
-/**
- * 初始化油机详情数据对象
- */
+// 初始化油机详情数据
 const initDetailsData = async () => {
     detailsData.loading = true
     const fuelId = props.id
-    const { data } = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: fuelId })
-    detailsData.list = data
-    if (detailsData.list.createdTime !== null) {
-        detailsData.list.createdTime = formatDate(detailsData.list.createdTime)
-    }
-    if (detailsData.list.installationDate !== null) {
-        detailsData.list.installationDate = formatDate(detailsData.list.installationDate)
-    }
-    if (detailsData.list.startupDate !== null) {
-        detailsData.list.startupDate = formatDate(detailsData.list.startupDate)
-    }
-    if (detailsData.list.onlineStatus !== null) {
-        if (detailsData.list.onlineStatus === 'offline') {
-            detailsData.list.onlineStatus = '离线'
-        } else {
-            detailsData.list.onlineStatus = '在线'
-        }
-    }
-    if (detailsData.list.deviceStatus !== null) {
-        if (detailsData.list.deviceStatus === 'enable') {
-            detailsData.list.deviceStatus = '启用'
-        } else if (detailsData.list.deviceStatus === 'factory') {
-            detailsData.list.deviceStatus = '出厂注册'
-        } else {
-            detailsData.list.deviceStatus = '备案'
+    if (fuelId) {
+        try {
+            const { data } = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: fuelId })
+            detailsData.list = {
+                ...data,
+                createdTime: data.createdTime ? formatDate(data.createdTime) : '',
+                installationDate: data.installationDate ? formatDate(data.installationDate) : '',
+                startupDate: data.startupDate ? formatDate(data.startupDate) : '',
+                onlineStatus: data.onlineStatus === 'offline' ? '离线' : '在线'
+            }
+        } catch (error) {
+            console.error('初始化油机详情失败:', error)
         }
     }
     detailsData.loading = false
 }
 
+// 初始化ECQS数据
+const initEcqsData = () => {
+    ecqsPagination.total = ecqsTableData.value.length
+}
+
+// 初始化所有数据
 const init = () => {
     initDetailsData()
     initTableData()
     initOilListData()
+    initEcqsData()
 }
 
+// 页面挂载时初始化
 onMounted(() => {
     init()
 })
 
-// 路由跳转 -- 部件信息图
-const toParts = ((name: any, NozzleNo: any, status: any, fuelName: any, alarming: any, code: any) => {
+// 油枪点击事件
+const toParts = (item: NozzlecontrolDtl) => {
+    if (!item || !item.name || !item.mainBoard_NozzleNo) {
+        console.warn('油枪数据不完整,无法跳转')
+        return
+    }
     router.push({
         path: `/statement/partInformation`,
         query: {
-            name: name,
-            NozzleNo: NozzleNo,
-            status: status,
-            fuelName: fuelName,
-            alarming: alarming,
-            code: code
+            name: item.name,
+            NozzleNo: item.mainBoard_NozzleNo,
+            status: item.onlineStatus,
+            fuelName: item.fuelName,
+            alarming: item.alarming,
+            code: item.code
         }
     })
-})
-/**********************************初始化***********************************/
+}
 
+// 油枪在线状态筛选
 const isOnline = (statu: string) => {
-    if (statu == '所有') {
-        listcom = JSON.parse(JSON.stringify(oilListData.list))
+    if (statu === '所有') {
+        listcom = [...oilListData.list]
     } else {
-        listcom = oilListData.list.filter((data) => {
-            return data.onlineStatus === statu
-        })
+        listcom = oilListData.list.filter(data => data.onlineStatus === statu)
     }
     flagData.keyData = Math.random()
     flagData.isFlag = statu
 }
 
-
+// 标签页切换
 const isDisplay = ref(1)
-// 内容区顶部导航 变换
 const display = (num: number) => {
     isDisplay.value = num
-    if (num == 2) {
-        toPage()
+    switch(num) {
+        case 2:
+            toPage('moreAlert')
+            break
+        case 3:
+            // ECQS编码状态在当前页面显示,不跳转
+            break
+        case 4:
+            toPage('maintenanceRecord')
+            break
+        default:
+            // 概览页面逻辑
+            break
     }
 }
 
-// 菜单栏的显示与隐藏
+// ECQS相关方法
+const searchEcqs = () => {
+    console.log('搜索ECQS编码状态', ecqsFilter)
+    ecqsPagination.currentPage = 1
+    // 实际项目中这里会根据筛选条件调用API获取数据
+}
+
+const resetEcqsFilter = () => {
+    ecqsFilter.code = ''
+    ecqsFilter.status = ''
+}
+
+const viewEcqsDetails = (row: any) => {
+    console.log('查看ECQS详情', row)
+    // 可以跳转到详情页或显示详情弹窗
+}
+
+const handleSizeChange = (val: number) => {
+    ecqsPagination.pageSize = val
+    // 实际项目中这里会根据新的页大小重新获取数据
+}
+
+const handleCurrentChange = (val: number) => {
+    ecqsPagination.currentPage = val
+    // 实际项目中这里会根据新的页码重新获取数据
+}
+
+// 显示/隐藏侧边栏
 let showicon = ref(true)
 const onShowHide = () => {
     showicon.value = !showicon.value
     emit('getIcon', showicon.value)
 }
 
+// 监听ID变化,重新初始化数据
+watch(() => props.id, () => {
+    init()
+})
 </script>
 
 <style scoped lang="scss">
 .all-con {
     flex: 1;
     margin-left: 20px;
-
-
+    padding-right: 20px;
 }
 
 .oilInfo-bottom {
     margin-bottom: 10px;
 }
 
-.oilInfo-top {
-    margin-bottom: 10px;
-}
-
 .oilInfo-con {
     width: 100%;
-    height: 25%;
+    min-height: 250px;
     border-radius: 10px;
-
 }
 
 .oilInfo-item {
-    color: rgb(173, 171, 171)
+    color: rgb(173, 171, 171);
+    margin-right: 8px;
 }
 
 .oilInfo-img {
     margin-right: 20px;
     width: 80px;
     height: 80px;
-    // background-color: #ccc;
     border-radius: 8px;
 }
 
 .oilLabel-con {
-    background-color: #89898b;
     height: 1.5em;
-    width: 3.9em;
     line-height: 1.5em;
     text-align: center;
     border-radius: 999rem;
     color: #fff;
+    cursor: pointer;
 }
 
 .oilInfo-msg {
-    height: 200px;
+    height: 280px;
+    cursor: pointer;
+    transition: all 0.2s;
+
+    &:hover {
+        box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    }
 
     .oilInfo-item-two {
-        color: rgb(173, 171, 171)
+        color: rgb(173, 171, 171);
+        margin-right: 8px;
     }
 }
 
-// 小圆点
 .status-point {
     display: inline-block;
     width: 10px;
     height: 10px;
     border-radius: 50%;
-    margin-right: 10px;
 }
 
 .oilInfo-con-first {
-    left: 7em;
-    top: 0.5em;
+    position: relative;
+    top: 0.3em;
+}
+
+.to-flex {
+    display: flex;
+    align-items: center;
 }
 </style>

+ 97 - 40
admin.ui.plus-master/src/views/admin/statement/moreOilEngineDetails/index.vue

@@ -1,49 +1,56 @@
 <template>
   <div class="layout-pd" style="height: 100%;width: 100%;">
     <el-row style="height: 100%;width: 100%; display: flex;">
-
       <!-- 菜单栏 -->
-      <el-menu default-active="-1" class="el-menu-vertical-demo" text-color="black" @open="handleOpen"
-        @close="handleClose" v-if="showicon" unique-opened>
+      <el-menu 
+        default-active="-1" 
+        class="el-menu-vertical-demo" 
+        text-color="black" 
+        @open="handleOpen"
+        @close="handleClose" 
+        v-if="showicon" 
+        :default-openeds="defaultOpeneds" 
+        collapse-transition="false"
+        :unique-opened="false"
+      >
         <el-menu-item index="-1">
           <span>整站</span>
         </el-menu-item>
-        <el-sub-menu :index="oilItem.id" v-for="oilItem in fuelList" :key="oilItem.id">
+        <el-sub-menu :index="String(oilItem.id)" v-for="oilItem in fuelList" :key="oilItem.id">
           <template #title>
-            <div>
+            <div style="position: relative; padding-left: 1.5em;">
               <div class="status-point menu-point-second"
                 :style="oilItem.onlineStatus == 'online' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'" />
               <span>{{ oilItem.name }}号机</span>
             </div>
-
           </template>
           <el-menu-item-group>
-            <el-menu-item :index="oilItem.id - item.name" v-for="(item, index) in oilItem.oilList" v-bind:key="index">
+            <el-menu-item 
+              :index="`${oilItem.id}-${index}`" 
+              v-for="(item, index) in oilItem.oilList" 
+              :key="index"
+              style="padding-left: 3em;"
+            >
               <div class="status-point menu-point-first"
                 :style="item.onlineStatus == '在线' ? 'background-color:#5b53f9' : 'background-color:#9f9fa3'" />
-              {{
-                item.mainBoard_NozzleNo
-              }}{{ item.name }}号枪
+              {{ item.mainBoard_NozzleNo }}{{ item.name }}号枪
             </el-menu-item>
           </el-menu-item-group>
         </el-sub-menu>
       </el-menu>
 
       <mainView :id="getId" @getIcon="getValue"></mainView>
-
     </el-row>
   </div>
 </template>
 
 <script setup lang="ts">
-import { computed, defineAsyncComponent, onMounted, onUpdated, reactive, ref, watch } from "vue";
-//import { CirclePlusFilled } from '@element-plus/icons-vue'
+import { defineAsyncComponent, onMounted, reactive, ref, watch } from "vue";
 import { OilEngineDetailsApi } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi";
 import router from "/@/router";
 import { MoreOilEngineDetailsApi } from "/@/api/admin/reportManagement/moreOilEngineDetails/moreOilEngineDetailsApi";
 import { FuelDispenserDto_SearchFilter, PageInputFuelDispenserDto } from "/@/api/admin/reportManagement/listOfOilEngines/listOfOilEnginesDto";
 import { ListOfOilEnginesApi } from "/@/api/admin/reportManagement/listOfOilEngines/listOfOilEnginesApi";
-import { nextTick } from "process";
 
 
 // 引入组件
@@ -56,9 +63,11 @@ const getValue = (data: boolean) => {
   showicon.value = data
 }
 
+// 添加默认展开项
+const defaultOpeneds = ref<string[]>([]) 
 
 const handleOpen = (key: string, keyPath: string[]) => {
-  if (key == '-1') {
+  if (key === '-1') {
     getId.value = router.currentRoute.value.params.id
   } else {
     getId.value = key
@@ -98,29 +107,62 @@ let data = ref('') as any
 data.value = localStorage.getItem("name")
 
 const getMenuData = async () => {
-  if (data.value == null) return
+  if (data.value === null) return
+  
   oilEngineData.filterModel.gasStation = data.value
-  const res: any =
-    await new ListOfOilEnginesApi().getPage({ ...oilEngineData.pageInput, filter: oilEngineData.filterModel })
-
-  res.data.list.forEach(async (item: any) => {
-    await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: item.fuelId }).then(async (res) => {
-      let list = [] as any
-      await new MoreOilEngineDetailsApi().getOilListData({ Fuelid: item.fuelId }).then((r) => {
-        list = r.data
-      })
-      fuelList.value.push({ 'id': item.fuelId, 'name': res.data.name, 'onlineStatus': res.data.onlineStatus, 'oilList': list })
+  try {
+    const res: any = await new ListOfOilEnginesApi().getPage({ 
+      ...oilEngineData.pageInput, 
+      filter: oilEngineData.filterModel 
     })
-  })
 
+    // 使用Promise.all等待所有异步请求完成
+    const promises = res.data.list.map(async (item: any) => {
+      try {
+        const basicInfo = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: item.fuelId });
+        const oilList = await new MoreOilEngineDetailsApi().getOilListData({ Fuelid: item.fuelId });
+        return {
+          id: item.fuelId,
+          name: basicInfo.data?.name || '未知',
+          onlineStatus: basicInfo.data?.onlineStatus || 'offline',
+          oilList: oilList.data || []
+        };
+      } catch (error) {
+        console.error(`获取油机${item.fuelId}数据失败:`, error);
+        return {
+          id: item.fuelId,
+          name: '数据加载失败',
+          onlineStatus: 'offline',
+          oilList: []
+        };
+      }
+    });
+
+    // 等待所有油机数据加载完成
+    const results = await Promise.all(promises);
+    fuelList.value = results;
+    
+    // 确保DOM更新后再设置默认展开项
+    setTimeout(() => {
+      defaultOpeneds.value = results.map(item => String(item.id));
+      console.log('默认展开项:', defaultOpeneds.value);
+    }, 0);
+    
+  } catch (error) {
+    console.error('获取菜单数据失败:', error);
+  }
 }
 
+// 监听fuelList变化,确保默认展开项正确设置
+watch(fuelList, (newVal) => {
+  if (newVal.length > 0) {
+    defaultOpeneds.value = newVal.map(item => String(item.id));
+  }
+})
+
 onMounted(() => {
   getMenuData()
-
 })
-
-
 </script>
 
 <style scoped lang="scss">
@@ -128,41 +170,56 @@ onMounted(() => {
 .el-menu,
 .el-menu-item-group {
   background-color: #fff;
-  color: #606266
+  color: #606266;
+  border-right: none;
 }
 
-::v-deep.el-submenu .el-menu-item {
+::v-deep .el-submenu .el-menu-item {
   width: auto !important;
 }
 
+::v-deep .el-menu--vertical .el-submenu.is-opened .el-submenu__title {
+  border-bottom: 1px solid #f0f0f0;
+}
+
 .el-menu span,
 .el-menu-item {
-  color: #606266
+  color: #606266;
 }
 
-// 小圆点
+// 小圆点样式优化
 .status-point {
   display: inline-block;
   width: 6px;
   height: 6px;
   border-radius: 50%;
-  position: absolute;
-  right: 10%;
-  top: 30%;
-  margin-right: 30px;
 }
 
 .menu-point-first {
+  position: absolute;
   left: 2em;
-  top: 1.8em;
+  top: 50%;
+  transform: translateY(-50%);
 }
 
 .menu-point-second {
+  position: absolute;
   left: 0.7em;
-  top: 1.8em;
+  top: 50%;
+  transform: translateY(-50%);
 }
 
 .one {
   --el-card-padding: 10px
 }
+
+// 菜单标题样式优化
+::v-deep .el-submenu__title {
+  position: relative;
+  padding-left: 1.5em !important;
+}
+
+::v-deep .el-menu-item {
+  position: relative;
+}
 </style>

+ 134 - 1
admin.ui.plus-master/src/views/admin/statement/oilEngineDetails/index.vue

@@ -218,6 +218,34 @@
           </div>
         </el-card>
       </el-col>
+
+      <!-- 快照列表 -->
+      <el-col :xs="24">
+        <el-card class="mt8 my-fill" shadow="hover" header="快照列表" :style="{ height: '45vh' }">
+          <el-table v-loading="snapshotList.loading" stripe :data="snapshotList.list" row-key="dispenserUuid" style="width: 100%">
+            <el-table-column prop="createTime" label="创建时间" />
+            <el-table-column prop="dispenserSerialNum" label="加油机出厂编号" />
+            <el-table-column prop="nozzleControlName" label="油枪逻辑编号" />
+            <el-table-column prop="calculatorMainboardUuid" label="计控主板ID" />
+            <el-table-column prop="encoderControlUuid" label="编码器ID" />
+            <el-table-column prop="taxControlMainBoardUuid" label="监控微处理器ID" />
+          </el-table>
+          <div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination 
+              v-model:currentPage="snapshotList.pageInput.currentPage"
+              v-model:page-size="snapshotList.pageInput.pageSize" 
+              :default-page-size="5" 
+              :total="snapshotList.total"
+              :page-sizes="[5, 10, 15, 20, 50, 100]" 
+              small 
+              background 
+              @size-change="onSnapshotSizeChange"
+              @current-change="onSnapshotCurrentChange" 
+              layout="total, sizes, prev, pager, next, jumper" 
+            />
+          </div>
+        </el-card>
+      </el-col>
     </el-row>
     <el-dialog v-model="bigImgDto.isShow" :close-on-click-modal="true" :show-close="false" width="80%">
       <img :src="getImageUrl(bigImgDto.imgurl)" class="fullscreen-image" alt="放大的油机图片" />
@@ -249,6 +277,44 @@ interface PageInputMaintenanceDto {
   pageSize: number;
 }
 
+// 快照列表数据类型定义
+interface SnapshotDto {
+  dispenserSerialNum: string; // 加油机出厂编号
+  dispenserUuid: string; // 加油机序列号
+  nozzleControlMainBoard: string; // 油枪主板ID
+  nozzleControlName: string; // 油枪逻辑编号
+  blackBoxUuid: string; // 安全装置UUID
+  calculatorMainboardUuid: string; // 计控主板UUId
+  encoderControlUuid: string; // 编码器UUID
+  taxControlMainBoardUuid: string; // 监控微处理器UUID
+  valveControlUuid: string; // 智能型控制阀 UUID
+  vaporRecoveryControlUuid: string; // 油气回收控制板UUID
+  displayControlUuid: string; // 显示屏UUID
+  meterUuid: string; // 计量器UUID
+  createTime: string; // 创建时间
+}
+
+interface PageInputSnapshotDto {
+  currentPage: number;
+  pageSize: number;
+  dynamicFilter?: DynamicFilterInfo;
+  filter?: {
+    dispenserSerialNum?: string;
+    dispenserUuid?: string;
+    nozzleControlMainBoard?: string;
+    nozzleControlName?: string;
+    blackBoxUuid?: string;
+    calculatorMainboardUuid?: string;
+    encoderControlUuid?: string;
+    taxControlMainBoardUuid?: string;
+    valveControlUuid?: string;
+    vaporRecoveryControlUuid?: string;
+    displayControlUuid?: string;
+    meterUuid?: string;
+    createTime?: string;
+  };
+}
+
 /******************************数据对象***************************************/
 const baseUrl = import.meta.env.VITE_API_URL
 
@@ -300,6 +366,17 @@ const maintenanceRecord = reactive({
   total: 0
 })
 
+// 快照列表数据对象
+const snapshotList = reactive({
+  loading: false,
+  list: [] as Array<SnapshotDto>,
+  pageInput: {
+    currentPage: 1,
+    pageSize: 5
+  } as PageInputSnapshotDto,
+  total: 0
+})
+
 /*******************************方法**************************************/
 /**
  * 处理图片URL,解决显示问题
@@ -399,6 +476,19 @@ const onMaintenanceCurrentChange = (val: number) => {
   getMaintenanceRecord();
 }
 
+/**
+ * 快照列表分页事件
+ */
+const onSnapshotSizeChange = (val: number) => {
+  snapshotList.pageInput.pageSize = val;
+  getSnapshotList();
+}
+
+const onSnapshotCurrentChange = (val: number) => {
+  snapshotList.pageInput.currentPage = val;
+  getSnapshotList();
+}
+
 /*********************************数据获取方法************************************/
 const getBasicInfo = async () => {
   basicInfo.loading = true;
@@ -515,12 +605,55 @@ const getMaintenanceRecord = async () => {
   }
 }
 
+/**
+ * 获取快照列表数据
+ */
+const getSnapshotList = async () => {
+  snapshotList.loading = true;
+  try {
+    // 获取油机的序列号,用于过滤快照列表
+    const dispenserSerialNum = basicInfo.info.serialNumber || '';
+    const dispenserUuid = basicInfo.info.fuelId || '';
+    
+    // 构造请求参数
+    const requestData = {
+      ...snapshotList.pageInput,
+      filter: {
+        dispenserSerialNum: dispenserSerialNum,
+        dispenserUuid: dispenserUuid
+      }
+    };
+    
+    // 调用快照列表接口
+    const { data } = await new OilEngineDetailsApi().getSnapshotList(requestData);
+    
+    // 处理接口返回数据
+    if (data && data.success && data.data && data.data.list && Array.isArray(data.data.list)) {
+      snapshotList.list = data.data.list.map(item => ({
+        ...item,
+        createTime: formatDate(item.createTime)
+      }));
+      snapshotList.total = data.data.total || 0;
+    } else {
+      snapshotList.list = [];
+      snapshotList.total = 0;
+    }
+  } catch (error) {
+    console.error('获取快照列表失败:', error);
+    snapshotList.list = [];
+    snapshotList.total = 0;
+  } finally {
+    snapshotList.loading = false;
+  }
+};
+
 /*********************************初始化************************************/
 onMounted(() => {
   getBasicInfo();
   getAlarmHistory();
   getLifeCycle();
   getMaintenanceRecord();
+  getSnapshotList();
 });
 </script>
 
@@ -604,4 +737,4 @@ onMounted(() => {
     overflow: auto;
   }
 }
-</style>
+</style>

+ 1 - 1
admin.ui.plus-master/src/views/admin/statement/partInformation/index.vue

@@ -157,7 +157,7 @@
         </el-col>
     </div>
 
-</template>
+</template> 
 
 <script setup lang="ts" name="">
 import { onMounted, reactive, ref } from 'vue';

+ 2 - 2
admin.ui.plus-master/src/views/admin/statement/partsManagement/oilGun/index.vue

@@ -177,8 +177,6 @@ const Data = reactive({
   /** 动态表头 */
   dynamicColumns: [
     { prop: 'name', label: '油枪号' },
-    { prop: 'companyName', label: '石油公司' },
-    { prop: 'stationName', label: '加油站名称' },
     { prop: 'fuelName', label: '油品' },
     { prop: 'alarming', label: '自锁' },
     { prop: 'fuelId', label: '油机ID' },
@@ -189,6 +187,8 @@ const Data = reactive({
     { prop: 'encoderControlsUUID', label: '编码器编号' },
     { prop: 'productTime', label: '出厂时间' },
     { prop: 'soldTime', label: '安装时间' },
+    { prop: 'companyName', label: '石油公司' },
+    { prop: 'stationName', label: '加油站名称' },
     { prop: 'supplierName', label: '加油机厂商' },
   ],
   /** 分页总数 */

+ 4 - 3
admin.ui.plus-master/src/views/admin/statement/taxcontrol/index.vue

@@ -170,16 +170,17 @@ const state = reactive({
   tableModel: [] as encodercontrolsDto[],
   /** 动态表头 */
   dynamicColumns: [
-    { prop: 'oilCompanyName', label: '石油公司' },
-    { prop: 'stationName', label: '加油站名称' },
+
     { prop: 'serialNumber', label: '监控微处理器编号' },
-    { prop: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },
     { prop: 'dispenserNumber', label: '油机号' },
     { prop: 'nozzleNumber', label: '油枪号' },
     { prop: 'deviceStatus', label: '监控微处理器状态' },
     { prop: 'onlineStatus', label: '在线状态' },
     { prop: 'fixTime', label: '安装时间' },
     { prop: 'soldTime', label: '出厂时间' },
+    { prop: 'oilCompanyName', label: '石油公司' },
+    { prop: 'stationName', label: '加油站名称' },
+    { prop: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },
   ],
   /** 分页总数 */
   total: 0,

+ 167 - 94
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -26,9 +26,14 @@
       <!-- 标签选择 -->
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
-          <el-form-item label="标签:" style="width: 100%;" prop="labelId">
-            <el-select v-model="Data.Filter.labelId" placeholder="请选择标签">
-              <el-option v-for="item in Data.labelList" :key="item.id" :label="item.name" :value="item.id.toString()" />
+          <el-form-item label="标签:" style="width: 100%;" prop="tag">
+            <el-select v-model="Data.Filter.tag" placeholder="请选择标签">
+              <el-option 
+                v-for="item in Data.labelList" 
+                :key="item.id" 
+                :label="item.name" 
+                :value="item.code"  
+              />
             </el-select>
           </el-form-item>
         </el-form>
@@ -54,7 +59,6 @@
               <template #default="{ node, data }">
                 <div class="tree-node-content">
                   <span :class="{'role-node': data.isRole}">{{ data.label }}</span>
-                  <!-- 角色节点显示展开/折叠按钮 -->
                   <el-button 
                     v-if="data.isRole" 
                     type="text" 
@@ -62,7 +66,6 @@
                     @click.stop="toggleRoleExpand(node)"
                     class="expand-btn"
                   >
-                    <!-- {{ node.expanded ? '折叠' : '展开' }} -->
                   </el-button>
                 </div>
               </template>
@@ -71,7 +74,7 @@
         </el-form>
       </div>
       
-      <!-- 新增:报警等级筛选下拉框 -->
+      <!-- 报警等级筛选下拉框 -->
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="报警等级:" style="width: 100%;" prop="alarmLevel">
@@ -85,7 +88,7 @@
                 v-for="item in alarmLevelDict" 
                 :key="item.id" 
                 :label="`${item.name}(${item.value})`" 
-                :value="item.value"
+                :value="item.code" 
               ></el-option>
             </el-select>
           </el-form-item>
@@ -125,17 +128,17 @@
         </el-form>
       </div>
       
-      <!-- 推送方式选择 -->
+      <!-- 推送方式选择(包含总开关isPush) -->
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
-            <!-- 推送总开关 -->
+            <!-- 推送总开关(对应isPush参数) -->
             <el-row style="width: 100%;margin-bottom: 10px;">
-              是否推送<el-switch v-model="Data.pushEnabled" style="margin-left: 3%;" />
+              是否推送<el-switch v-model="Data.isPush" style="margin-left: 3%;" />
             </el-row>
             
             <!-- 微信和邮箱开关(仅在总开关打开时显示) -->
-            <template v-if="Data.pushEnabled">
+            <template v-if="Data.isPush">
               <el-row style="width: 100%;">
                 微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
               </el-row>
@@ -148,7 +151,7 @@
       </div>
       
       <!-- 模板选择(受总开关控制) -->
-      <div style="width: 100%;display: flex;justify-content: center;align-items: center;" v-if="Data.pushEnabled">
+      <div style="width: 100%;display: flex;justify-content: center;align-items: center;" v-if="Data.isPush">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="模&#8195;&#8195;板:" style="width: 50%;" prop="mode1">
             <el-select v-model="Data.mode1" class="m-2" placeholder="微信模板" v-if="Data.radioValue1" @change="modeChange">
@@ -339,7 +342,7 @@
 </template>
 
 <script setup lang="ts" name="AlarmRuleDialog">
-import { onMounted, reactive, ref, nextTick, watch, computed } from 'vue';
+import { onMounted, reactive, ref, nextTick, computed, watch } from 'vue';
 import { alarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
 import { alarmRulesApi, stationApi } from "/@/api/admin/AlarmService/alarmRulesApi";
 import { RoleApi } from '/@/api/admin/Role'
@@ -355,7 +358,7 @@ import { PageInputDictGetPageDto } from "/@/api/admin/data-contracts";
 interface DictItem {
   id: number;
   name: string;
-  code: string;
+  code: string; // 数据字典编码
   value: string;
   enabled: boolean;
   sort: number;
@@ -403,12 +406,12 @@ const Data = reactive({
   isShowDialog: false,
   showAlarmConditions: false,
   showRepairConditions: false,
-  pushEnabled: false, // 推送总开关状态
+  isPush: false, // 是否推送(总开关,对应isPush参数)
   stationList: [] as StationItem[],
   Filter: {
     ruleName: '',
     roleMappingId: [] as number[],
-    labelId: "",
+    tag: "", // 标签参数(存储编码code)
     remark: '',
     pushMethod: '',
     pushTemplateMappingID: [] as number[],
@@ -430,17 +433,17 @@ const Data = reactive({
     condition: "",
     mode1: '',
     id: 0,
-    alarmLevel: undefined, // 新增:报警等级筛选值
+    alarmLevel: undefined, // 报警等级参数(存储编码code)
   } as unknown as alarmRluesFilterModel & { alarmLevel?: string },
   roleList: [] as any,
-  labelList: [] as any,
+  labelList: [] as Array<{ id: string; name: string; code: string }>, // 标签列表(包含code)
   userList: [] as UserListItem[],
-  radioValue1: false,
-  radioValue2: false,
-  mode1: '',
-  mode2: '',
-  condition: [{ Left: '', inthe: '', Right: '' }],
-  condition2: [{ Right: '', Left: '' }],
+  radioValue1: false, // 微信推送开关
+  radioValue2: false, // 邮箱推送开关
+  mode1: '', // 微信模板ID
+  mode2: '', // 邮箱模板ID
+  condition: [{ Left: '', inthe: '', Right: '' }], // 报警条件
+  condition2: [{ Left: '', Right: '' }], // 维修条件
   alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"],
   alarmType: ["加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"],
   alarmSource: ['云平台', '安全装置'],
@@ -448,17 +451,16 @@ const Data = reactive({
   alarmproStatus: ["正在维修","结束维修"]
 })
 
-// 转换用户列表为树形结构数据 - 确保用户ID为数字,角色ID为字符串
+// 转换用户列表为树形结构数据
 const treeUserData = computed(() => {
   return Data.userList.map((group: any) => {
-    // 为角色生成唯一ID(字符串类型,带前缀)
     const roleId = `role_${group.roleName.replace(/\s+/g, '_')}`;
     return {
       id: roleId,
       label: `角色:${group.roleName}`,
       isRole: true,
       children: group.users.map((user: any) => ({
-        id: Number(user.id), // 强制转换为数字类型
+        id: Number(user.id),
         label: user.name || `用户${user.id}`,
         phone: user.phone || '',
         isRole: false,
@@ -487,17 +489,9 @@ const handleNodeClick = (data: any, node: any) => {
 
 // 处理用户选择
 const handleUserCheck = (data: any, checkInfo: any) => {
-  // 获取所有选中的节点ID
   const allCheckedIds = checkInfo.checkedKeys || [];
-  
-  // 过滤出用户ID(仅保留数字类型,排除角色ID)
   const userIds = allCheckedIds
-    .filter((id: any) => {
-      // 角色ID是带前缀的字符串,用户ID是数字
-      return typeof id === 'number' && !isNaN(id);
-    });
-  
-  // 去重并更新选中的用户ID
+    .filter((id: any) => typeof id === 'number' && !isNaN(id));
   const uniqueUserIds = [...new Set(userIds)];
   selectedUserIds.value = uniqueUserIds;
   Data.Filter.pushUserid = uniqueUserIds;
@@ -522,7 +516,6 @@ const getUserList = async () => {
     
     userDataArray.forEach((roleObj: any) => {
       const roleName = roleObj.roleName || '未知角色';
-      // 过滤出有效用户(确保ID存在且可转换为数字)
       const validUsers = (roleObj.users || []).filter((user: any) => {
         const id = Number(user.id);
         return !isNaN(id) && id > 0;
@@ -533,7 +526,7 @@ const getUserList = async () => {
           userMap.set(roleName, []);
         }
         userMap.get(roleName)!.push({
-          id: Number(userObj.id), // 确保ID是数字
+          id: Number(userObj.id),
           name: userObj.name || `用户${userObj.id}`,
           phone: userObj.phone || '',
           roleName: roleName
@@ -563,16 +556,16 @@ const getStationList = async () => {
     };
     const res = await new stationApi().getStationList(requestData);
     Data.stationList = res.data?.list || [];
-    stationListLoaded = ref(true);
+    stationListLoaded.value = true;
   } catch (error) {
-    stationListLoaded = ref(true);
+    console.error("获取油站列表失败:", error);
+    stationListLoaded.value = true;
   }
 };
 
 // 获取报警等级字典数据
 const fetchAlarmLevelDict = async () => {
   try {
-    // 构造字典查询参数
     const data: PageInputDictGetPageDto = {
       CurrentPage: 1,
       PageSize: 100,
@@ -582,13 +575,16 @@ const fetchAlarmLevelDict = async () => {
       }
     };
     
-    // 调用字典接口
     const res = await new DictApi().getPage(data);
-    
-    // 处理返回数据
     if (res.success && res.data) {
-      alarmLevelDict.value = res.data.list || [];
-      console.log("报警等级字典数据获取成功", alarmLevelDict.value);
+      alarmLevelDict.value = res.data.list.map((item: any) => ({
+        id: item.id,
+        name: item.name,
+        code: item.code,
+        value: item.value,
+        enabled: item.enabled,
+        sort: item.sort
+      })) as DictItem[];
     } else {
       console.error("获取报警等级字典数据失败", res.msg);
     }
@@ -597,9 +593,10 @@ const fetchAlarmLevelDict = async () => {
   }
 };
 
-// 设置油站选择
+// 设置油站选择 - 修复油站信息不回显问题
 const setStationSelection = (ids: number[]) => {
   if (!stationListLoaded.value) {
+    // 确保油站数据加载完成后再设置选中状态
     const checkLoaded = setInterval(() => {
       if (stationListLoaded.value) {
         clearInterval(checkLoaded);
@@ -616,6 +613,7 @@ const setStationSelection = (ids: number[]) => {
   nextTick(() => {
     selectedStationIds.value = [...validIds];
     Data.Filter.stationid = [...validIds];
+    // 强制刷新选择器
     stationSelectKey.value++;
   });
 };
@@ -635,8 +633,9 @@ const templateData = reactive({
   emailList: [] as any
 })
 
+// 推送方式变化处理
 const radioChange = () => {
-  if (Data.pushEnabled) { // 只有总开关打开时才处理推送方式
+  if (Data.isPush) { // 仅当总开关打开时处理
     if (Data.radioValue1) {
       Data.Filter.pushMethod = 'wx'
       if (Data.radioValue2) {
@@ -646,11 +645,11 @@ const radioChange = () => {
       Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
     }
   } else {
-    Data.Filter.pushMethod = ''; // 总开关关闭时清空推送方式
+    Data.Filter.pushMethod = ''; // 总开关关闭时清空
   }
 };
 
-// 获取报警标签
+// 获取标签列表
 const getLabel = async () => {
   try {
     const res = await new RoleApi().getLabel({
@@ -662,7 +661,8 @@ const getLabel = async () => {
     })
     Data.labelList = res.data?.list?.map((item: any) => ({
       id: item.id.toString(),
-      name: item.name
+      name: item.name,
+      code: item.code // 存储标签编码
     })) || []
   } catch (error) {
     console.error('获取标签失败:', error)
@@ -693,15 +693,16 @@ const funSelect = async () => {
   }
 }
 
+// 模板变化处理
 const modeChange = () => {
   Data.Filter.pushTemplateMappingID = [];
   
-  if (Data.pushEnabled && Data.radioValue1 && Data.mode1) {
+  if (Data.isPush && Data.radioValue1 && Data.mode1) {
     const wxItem = templateData.wxList.find((item: any) => item.id === Data.mode1);
     if (wxItem) Data.Filter.pushTemplateMappingID.push(Number(wxItem.id));
   }
   
-  if (Data.pushEnabled && Data.radioValue2 && Data.mode2) {
+  if (Data.isPush && Data.radioValue2 && Data.mode2) {
     const emailItem = templateData.emailList.find((item: any) => item.id === Data.mode2);
     if (emailItem) Data.Filter.pushTemplateMappingID.push(Number(emailItem.id));
   }
@@ -721,13 +722,15 @@ const handleDialogOpen = () => {
 
 // 重置表单
 const resetForm = () => {
+  // 重置用户选择
   selectedUserIds.value = [];
   expandedKeys.value = [];
   
+  // 重置表单数据
   Data.Filter = {
     ruleName: '',
     roleMappingId: [],
-    labelId: "",
+    tag: "", 
     remark: '',
     pushMethod: '',
     pushTemplateMappingID: [],
@@ -749,28 +752,52 @@ const resetForm = () => {
     condition: "",
     mode1: '',
     id: 0,
-    alarmLevel: undefined, // 重置报警等级筛选
+    alarmLevel: undefined,
   } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
   
+  // 重置推送相关状态
+  Data.isPush = false;
   Data.radioValue1 = false;
   Data.radioValue2 = false;
-  Data.pushEnabled = false; // 重置总开关状态
   Data.mode1 = '';
   Data.mode2 = '';
+  
+  // 重置条件配置
   Data.showAlarmConditions = false;
   Data.showRepairConditions = false;
   Data.condition = [{ Left: '', inthe: '', Right: '' }];
   Data.condition2 = [{ Left: '', Right: '' }];
+  
+  // 重置油站选择
   selectedStationIds.value = [];
+  
+  // 确保树形组件重置
+  nextTick(() => {
+    if (userTreeRef.value) {
+      userTreeRef.value.setCheckedKeys([]);
+    }
+  });
 };
 
+// 监听用户数据加载完成后,更新树形组件选中状态
+watch(
+  () => Data.userList.length,
+  (newVal) => {
+    if (newVal > 0 && selectedUserIds.value.length > 0 && userTreeRef.value) {
+      nextTick(() => {
+        userTreeRef.value.setCheckedKeys(selectedUserIds.value);
+      });
+    }
+  }
+);
+
 onMounted(() => {
   getLabel();
   getRole();
   funSelect();
   getUserList();
   getStationList();
-  fetchAlarmLevelDict(); // 加载报警等级字典数据
+  fetchAlarmLevelDict();
 });
 
 // 添加报警条件
@@ -823,8 +850,6 @@ const removeCondition2 = () => {
 
 // 提交表单
 const submitForm = async () => {
-  console.log('提交时选中的用户ID:', selectedUserIds.value);
-  
   // 验证规则名称
   if (!Data.Filter.ruleName) {
     ElMessage.warning('请输入规则名称')
@@ -843,8 +868,8 @@ const submitForm = async () => {
     return;
   }
   
-  // 如果开启了推送,验证模板选择
-  if (Data.pushEnabled) {
+  // 验证推送配置(当isPush为true时)
+  if (Data.isPush) {
     if (Data.radioValue1 && !Data.mode1) {
       ElMessage.warning('请选择微信模板')
       return
@@ -853,7 +878,6 @@ const submitForm = async () => {
       ElMessage.warning('请选择邮箱模板')
       return
     }
-    // 验证至少选择一种推送方式
     if (!Data.radioValue1 && !Data.radioValue2) {
       ElMessage.warning('请至少选择一种推送方式')
       return
@@ -868,8 +892,9 @@ const submitForm = async () => {
     pushUserid: selectedUserIds.value,
     stationid: selectedStationIds.value,
     pushTemplateMappingID: Data.Filter.pushTemplateMappingID,
-    labelId: Data.Filter.labelId || null,
-    alarmLevel: Data.Filter.alarmLevel // 包含报警等级筛选值
+    tag: Data.Filter.tag || null,
+    isPush: Data.isPush,
+    alarmLevel: Data.Filter.alarmLevel
   }
   
   try {
@@ -883,6 +908,8 @@ const submitForm = async () => {
     }
     eventBus.emit('refreshView');
     Data.isShowDialog = false;
+    // 提交成功后重置表单
+    resetForm();
   } catch (error) {
     console.error(`${isEditing.value ? '更新' : '保存'}失败:`, error);
     ElMessage.error(`${isEditing.value ? '更新' : '保存'}失败,请稍后重试`);
@@ -890,15 +917,15 @@ const submitForm = async () => {
 }
 
 /**
- * 打开表单对话框
+ * 打开表单对话框 - 修复编辑时推送用户和油站信息被清空的问题
  */
-const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
+const openDialog = (row?: any) => {
   try {
     isEditing.value = !!row;
     resetForm();
     
     if (row) {
-      // 处理用户ID
+      // 处理用户ID - 修复推送用户不回显问题
       let pushUserIds: number[] = [];
       if (row.pushUserid) {
         if (Array.isArray(row.pushUserid)) {
@@ -913,11 +940,11 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
         }
       }
       
-      // 设置用户选择
+      // 立即设置选中的用户ID
       selectedUserIds.value = pushUserIds;
       Data.Filter.pushUserid = pushUserIds;
       
-      // 处理油站ID
+      // 处理油站ID - 修复油站信息不回显问题
       const stationIds = row.stationid
         ? (Array.isArray(row.stationid) 
           ? row.stationid.map(Number) 
@@ -933,21 +960,39 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
             ? row.pushTemplateMappingID.map(Number) 
             : [Number(row.pushTemplateMappingID)]) : [],
         stationid: stationIds,
-        labelId: row.labelId?.toString() || "",
         id: row.id || 0,
-        alarmLevel: row.alarmLevel // 设置报警等级
+        tag: row.tag || "",
+        alarmLevel: row.alarmLevel || ""
       } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
       
-      // 处理推送方式和总开关状态
+      // 处理标签编码回显
+      if (row.tag) {
+        let tagItem = Data.labelList.find((item: any) => item.code === row.tag);
+        if (!tagItem && typeof row.tag === 'string') {
+          tagItem = Data.labelList.find((item: any) => item.id === row.tag);
+        }
+        Data.Filter.tag = tagItem?.code || row.tag;
+      }
+      
+      // 处理报警等级编码回显
+      if (row.alarmLevel) {
+        let levelItem = alarmLevelDict.value.find((item: any) => item.code === row.alarmLevel);
+        if (!levelItem) {
+          levelItem = alarmLevelDict.value.find((item: any) => item.value === row.alarmLevel);
+        }
+        Data.Filter.alarmLevel = levelItem?.code || row.alarmLevel;
+      }
+      
+      // 处理推送开关和方式
+      Data.isPush = row.isPush !== undefined ? row.isPush : false;
       const pushMethods = Array.isArray(row.pushMethod) 
         ? row.pushMethod 
         : (row.pushMethod?.split(',') || []);
-      Data.pushEnabled = pushMethods.length > 0;
       Data.radioValue1 = pushMethods.includes('wx');
       Data.radioValue2 = pushMethods.includes('email');
       radioChange();
       
-      // 处理油站数据
+      // 处理油站数据 - 确保油站选择正确设置
       setStationSelection(stationIds);
       
       // 处理模板
@@ -960,6 +1005,53 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
         const emailItem = templateData.emailList.find((item: any) => item.id === strId);
         if (emailItem) Data.mode2 = strId;
       });
+      
+      // 处理报警条件
+      if (row.conditionsJson) {
+        try {
+          const conditions = JSON.parse(row.conditionsJson);
+          if (Array.isArray(conditions) && conditions.length > 0) {
+            Data.condition = conditions;
+            Data.showAlarmConditions = true;
+          }
+        } catch (e) {
+          console.error('解析报警条件失败:', e);
+        }
+      }
+      
+      // 处理维修条件
+      if (row.maintenanceJson) {
+        try {
+          const maintenanceConditions = JSON.parse(row.maintenanceJson);
+          if (Array.isArray(maintenanceConditions) && maintenanceConditions.length > 0) {
+            Data.condition2 = maintenanceConditions;
+            Data.showRepairConditions = true;
+          }
+        } catch (e) {
+          console.error('解析维修条件失败:', e);
+        }
+      }
+      
+      // 确保用户数据加载完成后设置树形组件选中状态
+      if (Data.userList.length > 0) {
+        nextTick(() => {
+          if (userTreeRef.value) {
+            userTreeRef.value.setCheckedKeys(selectedUserIds.value);
+          }
+        });
+      } else {
+        // 如果用户数据尚未加载,等待加载完成后再设置
+        const checkUserLoaded = setInterval(() => {
+          if (Data.userList.length > 0) {
+            clearInterval(checkUserLoaded);
+            nextTick(() => {
+              if (userTreeRef.value) {
+                userTreeRef.value.setCheckedKeys(selectedUserIds.value);
+              }
+            });
+          }
+        }, 100);
+      }
     }
 
     Data.isShowDialog = true;
@@ -970,25 +1062,6 @@ const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
   }
 };
 
-// 监听模板列表加载完成
-watch(
-  () => [templateData.wxList.length, templateData.emailList.length],
-  () => {
-    if (isEditing.value && Data.Filter.pushTemplateMappingID.length > 0) {
-      const templateIds = Data.Filter.pushTemplateMappingID.map(id => id.toString());
-      Data.mode1 = '';
-      Data.mode2 = '';
-      templateIds.forEach(strId => {
-        const wxItem = templateData.wxList.find((item: any) => item.id === strId);
-        if (wxItem) Data.mode1 = strId;
-        const emailItem = templateData.emailList.find((item: any) => item.id === strId);
-        if (emailItem) Data.mode2 = strId;
-      });
-      modeChange();
-    }
-  }
-);
-
 defineExpose({
   openDialog,
 })
@@ -1057,4 +1130,4 @@ defineExpose({
 ::v-deep .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
   background-color: #f5f7fa;
 }
-</style>
+</style>

+ 50 - 46
admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

@@ -26,6 +26,15 @@
                   </el-select>
                 </el-form-item>
               </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="是否推送">
+                  <el-select v-model="Data.Filter.isPush" placeholder="请选择是否推送">
+                    <el-option label="所有" :value="undefined"></el-option>
+                    <el-option label="是" :value="true"></el-option>
+                    <el-option label="否" :value="false"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
             </el-form-item>
           </el-form>
 
@@ -50,6 +59,11 @@
             style="width: 100%">
             <el-table-column v-for="column in Data.dynamicColumns" :key="column.prop" :prop="column.prop"
               :label="column.label" />
+            <el-table-column label="是否推送" width="100" align="center" show-overflow-tooltip>
+              <template #default="{ row }">
+                <span>{{ row.isPush ? '是' : '否' }}</span>
+              </template>
+            </el-table-column>
             <el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
               <template #default="{ row }">
                 <StatusBox :status="row.isActive ? '启用' : '禁用'" />
@@ -99,6 +113,7 @@ import { alarmRulesApi } from "/@/api/admin/AlarmService/alarmRulesApi";
 import eventBus from "/@/utils/mitt";
 import StatusBox from '/@/components/StatusBox.vue';
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from 'element-plus';
 
 
 // 使用组合式函数获取分页状态
@@ -119,12 +134,15 @@ const Data = reactive({
     Status:"",
     upload:"",
     pushMethod:"",
-    isActive:undefined
-  } as alarmRluesFilterModel_SearchFilter,
+    isActive:undefined,
+    isPush: undefined // 新增:是否推送筛选
+  } as alarmRluesFilterModel_SearchFilter & { isPush?: boolean | undefined },
   /**表格信息 */
-  tableModel: [] as alarmRluesFilterModel[],
+  tableModel: [] as any[], // 修改为any[]以保留完整数据
   /**动态表头 */
   dynamicColumns: [
+    { prop: 'tag', label: '标签' },
+    { prop: 'alarmLevel', label: '报警等级' },
     { prop: 'ruleName', label: '规则名称' },
     { prop: 'pushMethod', label: '推送方式' },
     { prop: 'keyWord', label: '关键字匹配' },
@@ -151,7 +169,8 @@ const StatusOptions = [
 // 推送方式映射
 const pushMethods = {
   "wx": "微信",
-  "email": "电子邮箱"
+  "email": "电子邮箱",
+  "wx,email": "微信+电子邮箱"
 };
 
 /**引入组件*/
@@ -166,9 +185,10 @@ const init = async () => {
   try {
     const res: any = await new alarmRulesApi().getData({ ...Data.pageInput, filter: Data.Filter });
     console.log("获取规则列表:", res);
+    // 保存原始数据,不修改,解决编辑时数据丢失问题
     Data.tableModel = res?.data?.list ?? [];
-    Data.total = res?.data?.total ?? 0; // 使用接口返回的总条数
-    formatTableData(); // 格式化表格数据
+    Data.total = res?.data?.total ?? 0;
+    formatTableData(); // 格式化表格显示数据,但保留原始数据
   } catch (error) {
     console.error("获取规则列表失败:", error);
     Data.tableModel = [];
@@ -178,18 +198,20 @@ const init = async () => {
   }
 }
 
-// 格式化表格数据(仅用于展示,保留原始数据)
+// 格式化表格数据(仅用于显示,不修改原始数据)
 const formatTableData = () => {
   Data.tableModel.forEach((item: any) => {
-    // 保存原始模板ID数组(用于后续操作)
-    item.originalPushTemplateIds = [...(item.pushTemplateMappingID || [])];
+    // 保存原始数据,用于编辑时恢复
+    item.originalData = { ...item };
     
     // 处理推送方式(展示用)
     if (item.pushMethod) {
       const pushList = item.pushMethod.split(',');
-      item.pushMethod = pushList.map((method: string) => {
+      item.pushMethodDisplay = pushList.map((method: string) => {
         return pushMethods[method] || method;
       }).join(',');
+    } else {
+      item.pushMethodDisplay = '';
     }
     
     // 处理是否互斥(展示用)
@@ -197,7 +219,9 @@ const formatTableData = () => {
     
     // 处理模板显示(展示用,将数组转为字符串)
     if (Array.isArray(item.pushTemplateMappingID) && item.pushTemplateMappingID.length > 0) {
-      item.pushTemplateMappingID = item.pushTemplateMappingID.join(',');
+      item.pushTemplateMappingIDDisplay = item.pushTemplateMappingID.join(',');
+    } else {
+      item.pushTemplateMappingIDDisplay = '';
     }
   });
 }
@@ -215,7 +239,8 @@ const resetQuery = () => {
     Status: "",
     upload: "",
     pushMethod: "",
-    isActive: undefined
+    isActive: undefined,
+    isPush: undefined // 重置是否推送筛选
   };
 }
 
@@ -227,11 +252,13 @@ const onReset = () => {
 }
 
 /** 
- * 添加/编辑规则
+ * 添加/编辑规则 - 修复传递数据不完整的问题
 */
-const addAlarmRules = ((row?: alarmRluesFilterModel) => {
+const addAlarmRules = ((row?: any) => {
   if (editDialogRef.value) {
-    editDialogRef.value.openDialog(row);
+    // 传递原始数据而非格式化后的数据
+    const dataToPass = row ? row.originalData || row : null;
+    editDialogRef.value.openDialog(dataToPass);
   }
 })
 
@@ -267,36 +294,16 @@ const toDelete = async (id?: number) => {
   }
 }
 
-// 切换启用/禁用状态(核心修复)
+// 切换启用/禁用状态
 const toToggleStatus = async (row: any) => {
   try {
-    // 1. 恢复推送方式原始值(后端需要的格式)
-    let originalPushMethod = '';
-    if (row.pushMethod.includes('微信') && row.pushMethod.includes('电子邮箱')) {
-      originalPushMethod = 'wx,email';
-    } else if (row.pushMethod.includes('微信')) {
-      originalPushMethod = 'wx';
-    } else if (row.pushMethod.includes('电子邮箱')) {
-      originalPushMethod = 'email';
-    }
-
-    // 2. 恢复模板ID为整数数组(关键修复:后端需要Int64[])
-    let templateIds: number[] = [];
-    if (row.originalPushTemplateIds && Array.isArray(row.originalPushTemplateIds)) {
-      // 使用保存的原始数组
-      templateIds = row.originalPushTemplateIds.map(Number);
-    } else if (row.pushTemplateMappingID) {
-      // 从展示用的字符串还原为数组(兼容处理)
-      templateIds = row.pushTemplateMappingID.split(',').map(id => Number(id));
-    }
-
-    // 3. 准备更新数据
+    // 使用原始数据进行更新,避免使用格式化后的数据
+    const originalData = row.originalData || row;
+    
+    // 准备更新数据
     const updatedData = {
-      ...row,
-      isActive: !row.isActive,
-      pushMethod: originalPushMethod,
-      pushTemplateMappingID: templateIds, // 确保是整数数组
-      isExclusive: row.isExclusiveDisplay === "是" // 恢复互斥状态为布尔值
+      ...originalData,
+      isActive: !originalData.isActive
     };
 
     await new alarmRulesApi().addForm(updatedData);
@@ -324,9 +331,6 @@ onMounted(async () => {
   })
 })
 
-// 引入ElMessage
-import { ElMessage } from 'element-plus';
-
 </script>
 
 <style scoped lang="scss">
@@ -350,4 +354,4 @@ import { ElMessage } from 'element-plus';
 .my-el-link {
   margin: 0 6px;
 }
-</style>
+</style>