DOVER-GLOBAL\10093976 hace 1 semana
padre
commit
139717c197

+ 34 - 31
admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts

@@ -1,30 +1,41 @@
 import { AxiosResponse } from 'axios'
-  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
 import { HistoricalVersionRecordDto, ProjectGetPageDto } from './slelistDto'
-import { log } from 'console'
-  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
-    deleteProject(value: string) {
-      throw new Error("Method not implemented.")
-    }
-    /**
-   * No description
-   *
+
+export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * 删除项目
+   * @param value 项目信息对象
+   */
+  deleteProject(value: ProjectGetPageDto) {
+    return this.request({
+      path: '/api/app/project/delete-project',
+      method: 'POST',
+      body: value,
+      type: ContentType.Json,
+      format: 'json',
+      secure: true
+    })
+  }
+
+  /**
+   * 查询列表
    * @tags
    * @name GetList
    * @summary 查询列表
    * @request POST:'/api/app/project/get-page'
    * @secure
    */
-getList = (data:any ,params: RequestParams = {}) : any  =>
-      this.request<AxiosResponse,any>({
-        path:'/api/app/project/get-page',
-        method: 'POST',
-        body:data,
-        type: ContentType.Json,
-        secure: true,
-        format: 'json',
-        ...params
-      })
+  getList = (data: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/project/get-page',
+      method: 'POST',
+      body: data,
+      type: ContentType.Json,
+      secure: true,
+      format: 'json',
+      ...params
+    })
 
   /**
    * 上传/添加项目
@@ -57,37 +68,29 @@ getList = (data:any ,params: RequestParams = {}) : any  =>
   /** 获取所有项目的主键,项目名称,项目编码 */
   getProjectMainInfo = () => {
     return this.request({
-      path:'/api/app/project/get-main-info',
-      method:'get',
+      path: '/api/app/project/get-main-info',
+      method: 'get',
     })
   }
 
-
-
   /**
    * 查询软件历史版本记录
-   *
    * @tags 软件管理
    * @name GetHistoricalVersionRecord
    * @summary 通过ID查询历史版本
    * @request POST:/api/app/software/get-historical-version-record
-   * @param id 软件包ID(可选参数)
    * @secure
    */
-  getHistory = (id: number | null, params: RequestParams = {}) : Promise<AxiosResponse<HistoricalVersionRecordDto>> => {
+  getHistory = (id: number | null, params: RequestParams = {}): Promise<AxiosResponse<HistoricalVersionRecordDto>> => {
     const requestData = id !== null ? { id } : {};
     
     return this.request({
       path: '/api/app/software/get-historical-version-record',
       method: 'POST',
-      query:requestData,
+      query: requestData,
       secure: true,
       format: 'json',
       ...params
     });
-    
   }
 }
-
-
-    

+ 49 - 38
admin.ui.plus-master/src/api/admin/productionManagement/slelistDto.ts

@@ -1,47 +1,50 @@
 /** 查询信息输出 */
-export interface ResultOutputPageOutputProjectGetPageDto{
-   /** 是否成功标记 */
-   success?: boolean
-   /** 编码 */
-   code?: string | null
-   /** 消息 */
-   msg?: string | null
-   /** 数据 */
-  data?:PageOutputProjectGetPageDto[] | null
- }
-     export interface PageOutputProjectGetPageDto{
-       /**
-       * 数据总数
-       * @format int64
-       */
-       total?: number
-       /** 数据 */
-       list?: ProjectGetPageDto[] | null
-     }
-     export interface ProjectGetPageDto{
-      id?: string
-      projectName?: string
-      projectCode?: string
-      projectDescription?: string
-      projectLaunchDate?: string
-      isUpdate?:boolean
- 
- }
- export interface pageInput {
-       /**当前页数 */
-       CurrentPage: number | any
-       /**展示页数 */
-       PageSize: number | any
-     }
+export interface ResultOutputPageOutputProjectGetPageDto {
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+  data?: PageOutputProjectGetPageDto[] | null
+}
+
+export interface PageOutputProjectGetPageDto {
+  /**
+   * 数据总数
+   * @format int64
+   */
+  total?: number
+  /** 数据 */
+  list?: ProjectGetPageDto[] | null
+}
+
+export interface ProjectGetPageDto {
+  id?: string
+  projectName?: string
+  projectCode?: string
+  projectDescription?: string
+  projectLaunchDate?: string
+  isUpdate?: boolean
+  createdTime?: string
+}
+
+export interface pageInput {
+  /** 当前页数 */
+  CurrentPage: number | any
+  /** 展示页数 */
+  PageSize: number | any
+}
 
-// src/api/admin/deviceAuthorization/dto/HistoricalVersionRecordDto.ts
+// 软件历史版本记录DTO
 export interface HistoricalVersionRecordDto {
-  guid:number;//项目guid
+  guid: number; // 项目guid
   projectName: string; // 项目名称
   projectCode: string; // 项目编码
   projectDescription: string; // 项目介绍
   projectLaunchDate: string; // 项目上线时间
-  createdTime: string; // 项目上线时间
+  createdTime: string; // 创建时间
   equipmentType: string; // 设备类型
   softwareType: string; // 软件类型
   softwareName: string; // 软件名称
@@ -70,4 +73,12 @@ export interface ResultOutputHistoricalVersionRecordDto {
   code: string;
   msg: string;
   data: HistoricalVersionRecordDto;
-}
+}
+
+// 通用布尔值结果输出
+export interface ResultOutputBoolean {
+  success: boolean;
+  code: string;
+  msg: string;
+  data: boolean;
+}

+ 159 - 114
admin.ui.plus-master/src/views/admin/product/slelist/index.vue

@@ -1,11 +1,10 @@
-
 <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 style="margin-bottom: -3vh;">
+      <!-- 操作区域 -->
+      <el-col :xs="24">
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
             <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="项目名称">
@@ -29,29 +28,30 @@
                   />
                 </el-form-item>
               </el-col>
-</el-form-item>
+            </el-form-item>
           </el-form>
 
           <hr>
 
           <el-row justify="space-between" class="submit-button" style="margin-bottom:-6px">
             <el-row>
-            <el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-            <el-button  type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
-          </el-row>
-          <el-button  type="primary" icon="ele-Plus" @click="onAdd"> 添加 </el-button>
+              <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+              <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+            </el-row>
+            <el-button type="primary" icon="ele-Plus" @click="onAdd"> 添加 </el-button>
           </el-row>
-</el-card>
+        </el-card>
       </el-col>
-<!--表格-->
-      <el-col  :xs="24" >
+
+      <!-- 表格区域 -->
+      <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 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="150">
-        <template #default="{ row }" >
-                  <el-link
+          <el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+            <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="200">
+              <template #default="{ row }">
+                <el-link
                   class="my-el-link mr12 ml12"
                   type="primary"
                   icon="ele-EditPen"
@@ -59,18 +59,25 @@
                   :underline="false"
                   target="_blank"
                 >编辑</el-link>
-         <el-link
-         class="my-el-link mr12 ml12"
-         type="primary"
-         icon="ele-Upload"       
-         @click="gotoSoftwarePackage(row)"
-         :underline="false"
-         target="_blank"
-         >跳转到软件包</el-link>
-         </template>
+                <el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-Upload"
+                  @click="gotoSoftwarePackage(row)"
+                  :underline="false"
+                  target="_blank"
+                >跳转到软件包</el-link>
+                <el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-Delete"
+                  @click="handleDelete(row)"
+                  :underline="false"
+                >删除</el-link>
+              </template>
             </el-table-column>
-</el-table>
-<div class="my-flex my-flex-end" style="margin-top: 20px">
+          </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"
@@ -83,11 +90,12 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </el-card>
       </el-col>
-</el-row>
+    </el-row>
 
-<el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
+    <!-- 新增/编辑弹窗 -->
+    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
       <el-form class="duiqi" ref="formRef" :model="formData" label-width="120px" :rules="rules" label-position="right">
         <el-form-item label="项目名称" prop="projectName">
           <el-input v-model="formData.projectName" placeholder="请输入项目名称" clearable />
@@ -114,61 +122,64 @@
       </template>
     </el-dialog>
 
-    </div>
-  </template>
-  <script setup lang="ts">
-  import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
-  import eventBus from "/@/utils/mitt";
-  import {Api} from "/@/api/admin/productionManagement/slelist";
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref } from "vue";
+import eventBus from "/@/utils/mitt";
+import { Api } from "/@/api/admin/productionManagement/slelist";
 import { ProjectGetPageDto } from "/@/api/admin/productionManagement/slelistDto";
 import type { pageInput } from "/@/api/admin/productionManagement/slelistDto";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
 import router from "/@/router";
 import { ElMessage } from 'element-plus'
 
-
 // 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
 
-/**数据对象*/
-  const state = reactive({
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
-      filter: {
-/**项目名称 */
-        projectName: "",
-/**项目编码 */
-        projectCode: "",
-/**项目上线时间 */
-        projectLaunchDate: "",},
-  /**表格信息 */
-tableModel: [] as ProjectGetPageDto,
-    /**动态表头 */
-    dynamicColumns: [
-{ prop: 'projectName', label: '项目名称' },
-{ prop: 'projectCode', label: '项目编码' },
-{ prop: 'projectDescription', label: '项目介绍' },
-{ prop: 'projectLaunchDate', label: '项目上线时间' },],
-/**分页标识 */
-    pageInput:{
-      CurrentPage: 1,
-      PageSize: 10,
-    } as pageInput,
-    /**分页总数 */
-    total: 0,
+/** 数据对象 */
+const state = reactive({
+  /** 加载显示 */
+  loading: false,
+  /** 条件查询模块 */
+  filter: {
+    /** 项目名称 */
+    projectName: "",
+    /** 项目编码 */
+    projectCode: "",
+    /** 项目上线时间 */
+    projectLaunchDate: "",
+  },
+  /** 表格信息 */
+  tableModel: [] as ProjectGetPageDto[],
+  /** 动态表头 */
+  dynamicColumns: [
+    { prop: 'projectName', label: '项目名称' },
+    { prop: 'projectCode', label: '项目编码' },
+    { prop: 'projectDescription', label: '项目介绍' },
+    { prop: 'projectLaunchDate', label: '项目上线时间' },
+  ],
+  /** 分页标识 */
+  pageInput: {
+    CurrentPage: 1,
+    PageSize: 10,
+  } as pageInput,
+  /** 分页总数 */
+  total: 0,
 })
 
 // 弹窗状态
 const dialogVisible = ref(false)
 const dialogTitle = ref('添加项目')
-const formData = ref({
+const formData = ref<Partial<ProjectGetPageDto>>({
   projectName: '',
   projectCode: '',
   projectDescription: '',
   projectLaunchDate: ''
 })
 const currentId = ref<string | null>(null)
+const formRef = ref<any>(null)
 
 // 表单验证规则
 const rules = reactive({
@@ -176,34 +187,38 @@ const rules = reactive({
   projectCode: [{ required: true, message: '请输入项目编码', trigger: 'blur' }]
 })
 
-  onMounted(() => {
-    init()
-    eventBus.off('refreshView')
-    eventBus.on('refreshView', async () => {
-      await init()
-    })
-    console.log()
-  })
-  onBeforeMount(() => {
-    eventBus.off('refreshView')
+onMounted(() => {
+  init()
+  eventBus.off('refreshView')
+  eventBus.on('refreshView', async () => {
+    await init()
   })
-  /**
-  * 监听变换
-  */
-  watch(() => {})
-/**条件查询 */
-          const onQuery = () => {
-          init()
-        }
-        /**初始化 */
-        const init = async () => {
-          state.loading = true
-          const res: any = await new Api().getList({ ...pageState.pageInput, Filter: state.filter })
-  state.tableModel = res?.data?.list ?? []
-  state.total = res?.data?.total ?? 0
-  state.loading = false
-        }
-/**添加 */
+})
+
+onBeforeMount(() => {
+  eventBus.off('refreshView')
+})
+
+/** 条件查询 */
+const onQuery = () => {
+  init()
+}
+
+/** 初始化 */
+const init = async () => {
+  state.loading = true
+  try {
+    const res: any = await new Api().getList({ ...pageState.pageInput, Filter: state.filter })
+    state.tableModel = res?.data?.list ?? []
+    state.total = res?.data?.total ?? 0
+  } catch (error) {
+    ElMessage.error('获取数据失败')
+  } finally {
+    state.loading = false
+  }
+}
+
+/** 添加 */
 const onAdd = () => {
   dialogTitle.value = '添加项目'
   formData.value = {
@@ -215,7 +230,8 @@ const onAdd = () => {
   currentId.value = null
   dialogVisible.value = true
 }
-/**重置 */
+
+/** 重置 */
 const onReset = () => {
   state.filter = {
     projectName: '',
@@ -224,8 +240,9 @@ const onReset = () => {
   }
   init()
 }
-/**编辑 */
-const onDateUpdate = (row: any) => {
+
+/** 编辑 */
+const onDateUpdate = (row: ProjectGetPageDto) => {
   dialogTitle.value = '编辑项目'
   formData.value = { ...row }
   currentId.value = row.id
@@ -235,6 +252,9 @@ const onDateUpdate = (row: any) => {
 // 提交表单
 const handleSubmit = async () => {
   try {
+    // 表单验证
+    await formRef.value.validate()
+    
     const api = new Api()
     if (currentId.value) {
       // 更新项目
@@ -242,37 +262,32 @@ const handleSubmit = async () => {
       ElMessage.success('更新成功')
     } else {
       // 添加项目
-      await api.uploadProject(formData.value)
+      await api.uploadProject(formData.value as ProjectGetPageDto)
       ElMessage.success('添加成功')
     }
 
     dialogVisible.value = false
     await init() // 刷新列表
-  } catch (e) {
+  } catch (error: any) {
+    if (error.name === 'ValidationError') return
     ElMessage.error('保存失败')
   }
 }
 
-      /**
- * 页条变化
- * @param val
- */
+/** 页条变化 */
 const onSizeChange = (val: number) => {
   state.pageInput.PageSize = val
   onQuery()
 }
 
-/**
- * 页数变化
- * @param val
- */
+/** 页数变化 */
 const onCurrentChange = (val: number) => {
   state.pageInput.CurrentPage = val
   onQuery()
 }
 
-  // 跳转到软件包页面
-const gotoSoftwarePackage = (row: any) => {
+// 跳转到软件包页面
+const gotoSoftwarePackage = (row: ProjectGetPageDto) => {
   router.push({
     path: '/product/softwarePackageManagement',
     query: {
@@ -281,11 +296,42 @@ const gotoSoftwarePackage = (row: any) => {
     }
   })
 }
+
+// 处理删除 - 点击直接调用接口
+const handleDelete = async (row: ProjectGetPageDto) => {
+  // 显示加载状态
+  state.loading = true
+  
+  try {
+    // 准备删除参数
+    const deleteParams = {
+      id: row.id,
+      projectCode: row.projectCode,
+      projectName: row.projectName
+    }
+
+    const api = new Api()
+    const response = await api.deleteProject(deleteParams)
+    
+    if (response?.data?.success) {
+      ElMessage.success('删除成功')
+      await init() // 刷新列表
+    } else {
+      ElMessage.error(response?.data?.msg || '删除失败')
+    }
+  } catch (error: any) {
+    console.error('删除失败:', error)
+    ElMessage.error(`删除失败: ${error.message || '网络异常'}`)
+  } finally {
+    // 关闭加载状态
+    state.loading = false
+  }
+}
 </script>
+
 <style scoped lang="scss">
 .el-input,
-.el-select
- {
+.el-select {
   width: 240px;
 }
 
@@ -311,5 +357,4 @@ const gotoSoftwarePackage = (row: any) => {
   text-align: right !important;
   justify-content: flex-end; /* 确保文本右对齐 */
 }
-
-  </style>
+</style>

+ 1 - 1
admin.ui.plus-master/src/views/admin/product/type/index.vue

@@ -84,7 +84,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="remark" label="备注" />
+            <el-table-column prop="createdTime" label="创建时间" />
 
 
             <!--            <el-table-column prop="createdTime" label="更新时间" >-->

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

@@ -1,11 +1,10 @@
-
 <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 style="margin-bottom: -3vh;">
+      <!-- 操作区域 -->
+      <el-col :xs="24">
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
             <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="石油公司">
@@ -20,21 +19,21 @@
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="显示屏状态">
                   <el-select v-model="state.filter.deviceStatus" placeholder="请选择状态">
-                                   <el-option label="所有" :value="''"></el-option>
-                                   <el-option v-for="(value, key) in FuelDispenserEnum" :key="key" :label="value" :value="key" />
-                                 </el-select>   
-                  </el-form-item>
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in FuelDispenserEnum" :key="key" :label="value" :value="key" />
+                  </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="state.filter.onlineStatus" placeholder="请选择在线状态">
-                                   <el-option label="所有" :value="''"></el-option>
-                                   <el-option v-for="(value, key) in OnlineStatus" :key="key" :label="value" :value="key" />
-                                 </el-select>             
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in OnlineStatus" :key="key" :label="value" :value="key" />
+                  </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-form-item label="选择时间">
                   <el-date-picker
                     v-model="state.filter.createTimeRange"
                     type="datetimerange"
@@ -45,37 +44,23 @@
                   />
                 </el-form-item>
               </el-col>
-<!-- <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="绑定加油机厂商">
-                  <el-input v-model="state.filter.BindingDispenserManufacturer" placeholder="单行输入" clearable></el-input>
-                </el-form-item>
-              </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-            <el-form-item label="选择时间">
-                  <el-date-picker
-                    v-model="state.filter.SoldTime"
-                    type="datetimerange"
-                    value-format="YYYY-MM-DD HH:mm:ss"
-                    range-separator="To"
-                    start-placeholder="Start date"
-                    end-placeholder="End date"
-                  />
-                </el-form-item>
-              </el-col> -->
-</el-form-item>
+            </el-form-item>
           </el-form>
 
           <hr>
 
           <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
-            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+            <el-row>
+              <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+              <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+            </el-row>
           </el-row>
-</el-card>
+        </el-card>
       </el-col>
-<!--表格-->
-      <el-col  :xs="24" >
+      <!-- 表格区域 -->
+      <el-col :xs="24">
         <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
-<el-table 
+          <el-table 
             ref="multipleTableRef" 
             v-loading="state.loading" 
             stripe 
@@ -100,7 +85,7 @@
               </template>
             </el-table-column>
           </el-table>
-<div class="my-flex my-flex-end" style="margin-top: 20px">
+          <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"
@@ -113,116 +98,159 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </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 { PageInput,encodercontrolsDto } from "/@/api/admin/reportManagement/displayControl/displayControldto";
-  import {Api} from "/@/api/admin/reportManagement/displayControl/displayControlapi";
-  import StatusBox from "/@/components/StatusBox.vue";
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import { useRoute } from "vue-router";
+import eventBus from "/@/utils/mitt";
+import { PageInput, encodercontrolsDto } from "/@/api/admin/reportManagement/displayControl/displayControldto";
+import { Api } from "/@/api/admin/reportManagement/displayControl/displayControlapi";
+import StatusBox from "/@/components/StatusBox.vue";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from "element-plus";
 
-  // 使用组合式函数获取分页状态
-const pageState = useDynamicPageSize(10, 15);
+// 初始化路由实例(接收参数)
+const route = useRoute();
+const multipleTableRef = ref<any>(null);
 
-/**数据对象*/
-  const state = reactive({
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
-      filter: {
-/**石油公司 */
-        OilCompanyName: "",
-/**序列号 */
-        SerialNumber: "",
-// 在线状态
-        onlineStatus:"",  
-/**绑定加油机厂商 */
-        BindingDispenserManufacturer: "",
-/**安全装置状态 */
-        deviceStatus: "",
-/**安装时间 */
-        FixTime: "",
-/**出厂时间 */
-        SoldTime: "",
-        sdate:null,
-        edate:null,
-        createTimeRange: [],
-      },
-  /**表格信息 */
-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: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },],
-/**分页标识 */
-    pageInput:{
-      currentPage: 1,
-      pageSize: 10,
-    } as PageInput,
-    /**分页总数 */
-    total: 0,
-})
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
 
-/**在线状态*/
+/** 状态枚举 */
 enum OnlineStatus {
   online = '在线',
   offline = '离线'
 }
 
-/**设备状态*/
 enum FuelDispenserEnum {
-  unregister="未备案",
-  produce="已生产",
-  register="已备案",
-  bind="已绑定油机",
-  factory="已出厂注册",
-  enable="已启用",
-  disable="维修中"
+  unregister = "未备案",
+  produce = "已生产",
+  register = "已备案",
+  bind = "已绑定油机",
+  factory = "已出厂注册",
+  enable = "已启用",
+  disable = "维修中"
 }
 
-  onMounted(() => {
-    // 初始化分页大小
-state.pageInput.pageSize = pageState.pageInput.pageSize;
-    init()
-    eventBus.off('refreshView')
-    eventBus.on('refreshView', async () => {
-      await init()
-    })
-    console.log()
-  })
-  onBeforeMount(() => {
-    eventBus.off('refreshView')
-  })
-  /**页条数变化*/
-const onSizeChange = () => {
-  init()
+/** 数据对象 */
+const state = reactive({
+  /** 加载显示 */
+  loading: false,
+  /** 条件查询模块 */
+  filter: {
+    // 石油公司
+    OilCompanyName: "",
+    // 序列号(显示屏编号)
+    SerialNumber: "",
+    // 在线状态
+    onlineStatus: "",
+    // 绑定加油机厂商
+    BindingDispenserManufacturer: "",
+    // 安全装置状态
+    deviceStatus: "",
+    // 安装时间
+    FixTime: "",
+    // 出厂时间
+    SoldTime: "",
+    // 时间范围
+    createTimeRange: [] as string[],
+    sdate: null,
+    edate: null,
+  },
+  /** 表格信息 */
+  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: 'bindingDispenserManufacturer', label: '绑定加油机厂商' },
+  ],
+  /** 分页总数 */
+  total: 0,
+  /** 分页标识 */
+  pageInput: {
+    currentPage: 1,
+    pageSize: 10,
+  } as PageInput,
+})
+
+/** 页面加载时接收参数并查询 */
+onMounted(async () => {
+  // 初始化分页大小
+  state.pageInput.pageSize = pageState.pageInput.pageSize;
+
+  // 从路由参数中获取显示屏编号
+  const { queryParam } = route.query;
+  if (queryParam && typeof queryParam === 'string') {
+    // 设置到序列号查询条件中
+    state.filter.SerialNumber = queryParam;
+  }
+
+  // 触发查询
+  await init();
+
+  // 监听路由参数变化(防止同页面刷新参数丢失)
+  watch(() => route.query, (newQuery) => {
+    if (newQuery.queryParam && typeof newQuery.queryParam === 'string') {
+      state.filter.SerialNumber = newQuery.queryParam;
+      init(); // 参数变化时重新查询
+    }
+  }, { immediate: false });
+});
+
+/** 页条数变化 */
+const onSizeChange = (val: number) => {
+  state.pageInput.pageSize = val;
+  init();
+}
+
+/** 页数变化 */
+const onCurrentChange = (val: number) => {
+  state.pageInput.currentPage = val;
+  init();
+}
+
+/** 条件查询 */
+const onQuery = () => {
+  init();
 }
 
-/**页数变化*/
-const onCurrentChange = () =>{
-  init()
+/** 重置查询条件 */
+const onReset = () => {
+  state.filter = {
+    OilCompanyName: "",
+    SerialNumber: "",
+    onlineStatus: "",
+    BindingDispenserManufacturer: "",
+    deviceStatus: "",
+    FixTime: "",
+    SoldTime: "",
+    createTimeRange: [],
+    sdate: null,
+    edate: null,
+  };
+  state.pageInput.currentPage = 1;
+  init();
 }
-  /**
-  * 监听变换
-  */
-  watch(
+
+/** 监听时间范围变化 */
+watch(
   () => state.filter.createTimeRange,
   (newVal) => {
     if (newVal && newVal.length === 2) {
-      state.filter.sdate = newVal[0]; // yyyy-MM-dd 格式
+      state.filter.sdate = newVal[0];
       state.filter.edate = newVal[1];
     } else {
       state.filter.sdate = null;
@@ -230,36 +258,54 @@ const onCurrentChange = () =>{
     }
   }
 );
-/**条件查询 */
-          const onQuery = () => {
-          init()
-        }
-        /**初始化 */
-        const init = async () => {
-          state.loading = true
-const res:any = await new Api().getList({...pageState.pageInput, Filter:state.filter})
-            state.total = res?.data?.total ?? 0
-state.tableModel = res?.data?.list ?? []
-          state.loading = false
-        
-          
-        }
+
+/** 初始化查询接口 */
+const init = async () => {
+  state.loading = true;
+  try {
+    // 处理查询参数
+    const params = {
+      ...state.pageInput,
+      filter: {
+        ...state.filter,
+        // 时间范围参数透传(根据接口要求调整)
+        sdate: state.filter.sdate,
+        edate: state.filter.edate,
+      }
+    };
+
+    // 调用显示屏查询接口
+    const res: any = await new Api().getList(params);
+    state.tableModel = res?.data?.list ?? [];
+    state.total = res?.data?.total ?? 0;
+  } catch (error) {
+    console.error('显示屏查询失败:', error);
+    ElMessage.error('数据加载失败,请重试');
+  } finally {
+    state.loading = false;
+  }
+}
+
+// 清理事件监听
+onBeforeMount(() => {
+  eventBus.off('refreshView');
+});
 </script>
+
 <style scoped lang="scss">
 .el-input,
 .el-select {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*5px+12px;
+  width: 14*5px + 12px;
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
+/* 数据表头样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
-  </style>
+</style>

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

@@ -1,85 +1,65 @@
-
 <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 style="margin-bottom: -3vh;">
+      <!-- 操作区域 -->
+      <el-col :xs="24">
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
             <el-form-item prop="name" style="width: 100%">
-<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="石油公司">
                   <el-input v-model="state.filter.OilCompanyName" 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.dateRange"
-                     format="YYYY-MM-DD"
-                      value-format="YYYY-MM-DD"
-                     type="daterange"
-                     start-placeholder="开始时间"
-                     end-placeholder="结束时间"
-                     :clearable="false"
-                   ></el-date-picker>
-                 </el-form-item>
-               </el-col>   
-<!-- <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="序列号">
-                  <el-input v-model="state.filter.SerialNumber" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="编码器编号">
+                  <el-input v-model="state.filter.SerialNumber" placeholder="请输入编码器编号" clearable></el-input>
                 </el-form-item>
               </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="绑定加油机厂商">
-                  <el-input v-model="state.filter.BindingDispenserManufacturer" placeholder="单行输入" clearable></el-input>
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="编码器状态">
+                  <el-select v-model="state.filter.DeviceStatus" placeholder="请选择状态">
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in DeviceStatusEnum" :key="key" :label="value" :value="key" />
+                  </el-select>
                 </el-form-item>
               </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="安全装置状态">
-                  <el-input v-model="state.filter.DeviceStatus" placeholder="单行输入" clearable></el-input>
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="在线状态">
+                  <el-select v-model="state.filter.onlineStatus" placeholder="请选择在线状态">
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in OnlineStatusEnum" :key="key" :label="value" :value="key" />
+                  </el-select>
                 </el-form-item>
               </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-            <el-form-item label="选择时间">
+              <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.FixTime"
-                    type="datetimerange"
-                    value-format="YYYY-MM-DD HH:mm:ss"
-                    range-separator="To"
-                    start-placeholder="Start date"
-                    end-placeholder="End date"
-                  />
+                    v-model="state.dateRange"
+                    format="YYYY-MM-DD"
+                    value-format="YYYY-MM-DD"
+                    type="daterange"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :clearable="false"
+                  ></el-date-picker>
                 </el-form-item>
               </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-            <el-form-item label="选择时间">
-                  <el-date-picker
-                    v-model="state.filter.SoldTime"
-                    type="datetimerange"
-                    value-format="YYYY-MM-DD HH:mm:ss"
-                    range-separator="To"
-                    start-placeholder="Start date"
-                    end-placeholder="End date"
-                  />
-                </el-form-item>
-              </el-col> -->
-
-
-
-</el-form-item>
+            </el-form-item>
           </el-form>
 
           <hr>
-<div class="my-flex my-flex-start" >
-<el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-</div>
-</el-card>
+
+          <div class="my-flex my-flex-start">
+            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+            <el-button type="primary" icon="ele-RefreshRight" @click="onReset" style="margin-left: 10px;"> 重置 </el-button>
+          </div>
+        </el-card>
       </el-col>
-<!--表格-->
-      <el-col  :xs="24" >
+      <!-- 表格区域 -->
+      <el-col :xs="24">
         <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
-<el-table 
+          <el-table 
             ref="multipleTableRef" 
             v-loading="state.loading" 
             stripe 
@@ -104,7 +84,7 @@
               </template>
             </el-table-column>
           </el-table>
-<div class="my-flex my-flex-end" style="margin-top: 20px">
+          <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"
@@ -117,94 +97,133 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </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 { PageInput,encodercontrolsDto } from "/@/api/admin/reportManagement/encodercontrols/encodercontrolsdto";
-  import {Api} from "/@/api/admin/reportManagement/encodercontrols/encodercontrolsapi";
-  import StatusBox from "/@/components/StatusBox.vue";
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import { useRoute } from "vue-router";
+import eventBus from "/@/utils/mitt";
+import { PageInput, encodercontrolsDto } from "/@/api/admin/reportManagement/encodercontrols/encodercontrolsdto";
+import { Api } from "/@/api/admin/reportManagement/encodercontrols/encodercontrolsapi";
+import StatusBox from "/@/components/StatusBox.vue";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from "element-plus";
 
-  // 使用组合式函数获取分页状态
+// 初始化路由实例(接收参数)
+const route = useRoute();
+const multipleTableRef = ref<any>(null);
+
+// 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
 
-/**数据对象*/
-  const state = reactive({
-    dateRange: [] as unknown as [string, string], // 用于存储日期范围
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
-      filter: {
-        startDate:"",
-        endDate:"",
-
-/**石油公司 */
-        OilCompanyName: "",
-/**序列号 */
-        SerialNumber: "",
-/**绑定加油机厂商 */
-        BindingDispenserManufacturer: "",
-/**安全装置状态 */
-        DeviceStatus: "",
-/**安装时间 */
-        FixTime: "",
-// 在线状态
-        onlineStatus:"",
-/**出厂时间 */
-        SoldTime: "",},
-  /**表格信息 */
-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: '出厂时间' },],
-/**分页标识 */
-    pageInput:{
-      currentPage: 1,
-      pageSize: 10,
-    } as PageInput,
-    /**分页总数 */
-    total: 0,
+/** 状态枚举 */
+enum OnlineStatusEnum {
+  online = '在线',
+  offline = '离线'
+}
+
+enum DeviceStatusEnum {
+  unregister = "未备案",
+  produce = "已生产",
+  register = "已备案",
+  bind = "已绑定油机",
+  factory = "已出厂注册",
+  enable = "已启用",
+  disable = "维修中"
+}
+
+/** 数据对象 */
+const state = reactive({
+  dateRange: [] as [string, string], // 用于存储日期范围
+  /** 加载显示 */
+  loading: false,
+  /** 条件查询模块 */
+  filter: {
+    // 开始日期
+    startDate: "",
+    // 结束日期
+    endDate: "",
+    // 石油公司
+    OilCompanyName: "",
+    // 序列号(编码器编号)
+    SerialNumber: "",
+    // 绑定加油机厂商
+    BindingDispenserManufacturer: "",
+    // 安全装置状态
+    DeviceStatus: "",
+    // 安装时间
+    FixTime: "",
+    // 在线状态
+    onlineStatus: "",
+    // 出厂时间
+    SoldTime: "",
+  },
+  /** 表格信息 */
+  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: '出厂时间' },
+  ],
+  /** 分页总数 */
+  total: 0,
+  /** 分页标识 */
+  pageInput: {
+    currentPage: 1,
+    pageSize: 10,
+  } as PageInput,
 })
-  onMounted(() => {
-    // 初始化分页大小
-state.pageInput.pageSize = pageState.pageInput.pageSize;
-    init()
-    eventBus.off('refreshView')
-    eventBus.on('refreshView', async () => {
-      await init()
-    })
-    console.log()
-  })
-  onBeforeMount(() => {
-    eventBus.off('refreshView')
-  })
-    /**页条数变化*/
-const onSizeChange = () => {
-  init()
+
+/** 页面加载时接收参数并查询 */
+onMounted(async () => {
+  // 初始化分页大小
+  state.pageInput.pageSize = pageState.pageInput.pageSize;
+
+  // 从路由参数中获取编码器编号
+  const { queryParam } = route.query;
+  if (queryParam && typeof queryParam === 'string') {
+    // 设置到序列号查询条件中
+    state.filter.SerialNumber = queryParam;
+  }
+
+  // 触发查询
+  await init();
+
+  // 监听路由参数变化(防止同页面刷新参数丢失)
+  watch(() => route.query, (newQuery) => {
+    if (newQuery.queryParam && typeof newQuery.queryParam === 'string') {
+      state.filter.SerialNumber = newQuery.queryParam;
+      init(); // 参数变化时重新查询
+    }
+  }, { immediate: false });
+});
+
+/** 页条数变化 */
+const onSizeChange = (val: number) => {
+  state.pageInput.pageSize = val;
+  init();
 }
 
-/**页数变化*/
-const onCurrentChange = () =>{
-  init()
+/** 页数变化 */
+const onCurrentChange = (val: number) => {
+  state.pageInput.currentPage = val;
+  init();
 }
-  /**
-  * 监听变换
-  */
-  watch(
+
+/** 监听日期范围变化 */
+watch(
   () => state.dateRange,
   (newVal) => {
     if (newVal && newVal.length === 2) {
@@ -216,23 +235,73 @@ const onCurrentChange = () =>{
     }
   }
 );
-/**条件查询 */
-          const onQuery = () => {
-          init()
-        }
-        /**初始化 */
-        const init = async () => {
+
+/** 条件查询 */
+const onQuery = () => {
+  init();
+}
+
+/** 重置查询条件 */
+const onReset = () => {
+  state.dateRange = [] as [string, string];
+  state.filter = {
+    startDate: "",
+    endDate: "",
+    OilCompanyName: "",
+    SerialNumber: "",
+    BindingDispenserManufacturer: "",
+    DeviceStatus: "",
+    FixTime: "",
+    onlineStatus: "",
+    SoldTime: "",
+  };
+  state.pageInput.currentPage = 1;
+  init();
+}
+
+/** 初始化查询接口 */
+const init = async () => {
   state.loading = true;
-  console.log("Request Payload:", { ...pageState.pageInput, Filter: state.filter });
-  const res: any = await new Api().getList({ ...pageState.pageInput, Filter: state.filter });
-  state.total = res?.data?.total ?? 0;
-  state.tableModel = res?.data?.list ?? [];
-  state.loading = false;
+  try {
+    // 调用编码器查询接口
+    const res: any = await new Api().getList({
+      ...state.pageInput,
+      Filter: state.filter
+    });
+    state.total = res?.data?.total ?? 0;
+    state.tableModel = res?.data?.list ?? [];
+  } catch (error) {
+    console.error('编码器查询失败:', error);
+    ElMessage.error('数据加载失败,请重试');
+  } finally {
+    state.loading = false;
+  }
 };
+
+// 清理事件监听
+onBeforeMount(() => {
+  eventBus.off('refreshView');
+});
 </script>
+
 <style scoped lang="scss">
-.my-flex{
+.my-flex {
   margin-top: 20px;
 }
 
-  </style>
+.el-input,
+.el-select {
+  width: 240px;
+}
+
+/* 输入框标签固定宽度 */
+::v-deep .el-form-item__label {
+  width: 14*5px + 12px;
+  justify-content: start;
+}
+
+/* 数据表头样式 */
+::v-deep .el-table th.el-table__cell {
+  background-color: #F6F6F6;
+}
+</style>

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

@@ -1,7 +1,7 @@
 <template>
   <div class="layout-pd">
     <el-row>
-      <!--操作-->
+      <!-- 操作区域 -->
       <el-col :xs="24">
         <el-card class="mt8" shadow="hover">
           <el-form :model="Data.Filter" @submit.stop.prevent>
@@ -48,7 +48,7 @@
           </el-row>
         </el-card>
       </el-col>
-      <!--表格-->
+      <!-- 表格区域 -->
       <el-col :xs="24">
         <el-card class="my-fill mt8" shadow="hover">
           <el-table 
@@ -64,6 +64,7 @@
               :prop="column.prop" 
               :label="column.label">
               <template #default="{ row }">
+                <!-- 状态列特殊处理 -->
                 <template v-if="column.prop === 'onlineStatus'">
                   <StatusBox :status="row.onlineStatus" />
                 </template>
@@ -73,6 +74,37 @@
                 <template v-else-if="column.prop === 'alarming'">
                   <StatusBox :status="row.alarming" />
                 </template>
+                <!-- 监控微处理器编号 - 跳转页面1 -->
+                <template v-else-if="column.prop === 'monitoringUUID'">
+                  <el-link 
+                    type="primary" 
+                    :underline="false"
+                    @click="handleMonitoringJump(row)"
+                  >
+                    {{ row[column.prop] }}
+                  </el-link>
+                </template>
+                <!-- 加密显示屏编号 - 跳转页面2 -->
+                <template v-else-if="column.prop === 'displayControlsUUID'">
+                  <el-link 
+                    type="primary" 
+                    :underline="false"
+                    @click="handleDisplayJump(row)"
+                  >
+                    {{ row[column.prop] }}
+                  </el-link>
+                </template>
+                <!-- 编码器编号 - 跳转页面3 -->
+                <template v-else-if="column.prop === 'encoderControlsUUID'">
+                  <el-link 
+                    type="primary" 
+                    :underline="false"
+                    @click="handleEncoderJump(row)"
+                  >
+                    {{ row[column.prop] }}
+                  </el-link>
+                </template>
+                <!-- 普通列 -->
                 <template v-else>
                   {{ row[column.prop] }}
                 </template>
@@ -88,49 +120,61 @@
       </el-col>
     </el-row>
   </div>
-
 </template>
 
 <script setup lang="ts" name="partsManagement/oilGun">
-import { onMounted, reactive, watch } from "vue";
+import { onMounted, reactive, watch, ref } from "vue";
+import { useRouter } from "vue-router";
 import { oilGunFilterModel_SearchFilter, oilGunFilterModel, PageInputoilGunFilterModel } from "/@/api/admin/reportManagement/oilGun/oilGunDto";
 import { OilGunApi } from "/@/api/admin/reportManagement/oilGun/oilGunApi";
 import StatusBox from "/@/components/StatusBox.vue";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from "element-plus";
+
+// 初始化路由实例
+const router = useRouter();
+const multipleTableRef = ref<any>(null);
 
 // 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
 
-/**页面对象 */
+/** 页面路径配置 */
+const pagePaths = {
+  monitoring: '/statement/taxcontrol/index', // 监控微处理器详情页路径
+  display: '/statement/displayControl/index', // 加密显示屏详情页路径
+  encoder: '/statement/encodercontrols/index' // 编码器详情页路径
+};
+
+/** 页面对象 */
 const Data = reactive({
-  time1: '',
+  time1: [] as string[],
   /** 选择框列表 */
   statusList: [] as any,
   supplierList: [] as any,
-  /**加载显示 */
+  /** 加载显示 */
   loading: false,
-  /**条件查询模块 */
+  /** 条件查询模块 */
   Filter: {
-    /**油枪号 */
+    /** 油枪号 */
     name: "",
-    /**加油站名称 */
+    /** 加油站名称 */
     StationName: "",
-    /**石油公司 */
+    /** 石油公司 */
     CompanyName: "",
-    /**在线状态 */
+    /** 在线状态 */
     onlineStatus: "",
-    /**出厂开始的时间 */
+    /** 出厂开始的时间 */
     OutBeginTime: "",
-    /**出厂结束的时间 */
+    /** 出厂结束的时间 */
     OutEndTime: "",
     // 作弊状态
-    cheatStatus:"",
+    cheatStatus: "",
     // 自锁状态
-    alarming:""
+    alarming: ""
   } as oilGunFilterModel_SearchFilter,
-  /**表格信息 */
+  /** 表格信息 */
   tableModel: [] as Array<oilGunFilterModel>,
-  /**动态表头 */
+  /** 动态表头 */
   dynamicColumns: [
     { prop: 'name', label: '油枪号' },
     { prop: 'companyName', label: '石油公司' },
@@ -148,9 +192,9 @@ const Data = reactive({
     { prop: 'soldTime', label: '安装时间' },
     { prop: 'supplierName', label: '加油机厂商' },
   ],
-  /**分页总数 */
+  /** 分页总数 */
   total: 0,
-  /**分页标识 */
+  /** 分页标识 */
   pageInput: {
     currentPage: 1,
     pageSize: 10,
@@ -164,78 +208,129 @@ const selectList = reactive({
     "启用",
     "备案",
     "维修",
-    "出厂注册"],
+    "出厂注册"
+  ],
   Level: [1, 2, 3, 4, 5]
-
 })
 
+/** 监控微处理器编号跳转(传递UUID参数) */
+const handleMonitoringJump = (row: oilGunFilterModel) => {
+  if (!row.monitoringUUID) {
+    ElMessage.warning("该记录没有监控微处理器编号,无法跳转");
+    return;
+  }
+  router.push({
+    path: pagePaths.monitoring,
+    query: {
+      queryParam: row.monitoringUUID, // 传递监控微处理器编号
+      source: 'monitoring' // 标识来源
+    }
+  });
+};
+
+/** 加密显示屏编号跳转 */
+const handleDisplayJump = (row: oilGunFilterModel) => {
+  if (!row.displayControlsUUID) {
+    ElMessage.warning("该记录没有加密显示屏编号,无法跳转");
+    return;
+  }
+  router.push({
+    path: pagePaths.display,
+    query: {
+      queryParam: row.displayControlsUUID,
+      source: 'display'
+    }
+  });
+};
+
+/** 编码器编号跳转 */
+const handleEncoderJump = (row: oilGunFilterModel) => {
+  if (!row.encoderControlsUUID) {
+    ElMessage.warning("该记录没有编码器编号,无法跳转");
+    return;
+  }
+  router.push({
+    path: pagePaths.encoder,
+    query: {
+      queryParam: row.encoderControlsUUID,
+      source: 'encoder'
+    }
+  });
+};
+
 onMounted(() => {
   // 初始化分页大小
-Data.pageInput.pageSize = pageState.pageInput.pageSize;
-  init()
+  Data.pageInput.pageSize = pageState.pageInput.pageSize;
+  init();
 })
 
 // 条件查询
 const init = async () => {
-  Data.loading = true
-  const res: any = await new OilGunApi().getPage({ ...Data.pageInput, filter: Data.Filter })
-  console.log(res)
-  Data.tableModel = res?.data.list ?? []
-  Data.total = res?.data?.total ?? 0
-  Data.loading = false
+  Data.loading = true;
+  try {
+    const res: any = await new OilGunApi().getPage({ 
+      ...Data.pageInput, 
+      filter: Data.Filter 
+    });
+    Data.tableModel = res?.data?.list ?? [];
+    Data.total = res?.data?.total ?? 0;
+  } catch (error) {
+    console.error('查询失败:', error);
+    ElMessage.error('数据加载失败,请重试');
+  } finally {
+    Data.loading = false;
+  }
 }
 
 const onQuery = () => {
-  init()
+  init();
 }
 
-/**重置查询条件 */
+/** 重置查询条件 */
 const resetQuery = () => {
-  Data.Filter.StationName = ''
-  Data.Filter.CompanyName = ''
-  Data.Filter.onlineStatus = ''
-  Data.Filter.OutBeginTime = ''
-  Data.Filter.OutEndTime = ''
-  Data.Filter.name = ''
-  Data.time1 = ''
-  Data.pageInput.currentPage = 1
-  Data.pageInput.pageSize = 10
+  Data.Filter = {
+    name: "",
+    StationName: "",
+    CompanyName: "",
+    onlineStatus: "",
+    OutBeginTime: "",
+    OutEndTime: "",
+    cheatStatus: "",
+    alarming: ""
+  };
+  Data.time1 = [];
+  Data.pageInput.currentPage = 1;
+  Data.pageInput.pageSize = 10;
 }
-/**重置 */
+
+/** 重置 */
 const onReset = () => {
-  resetQuery()
-  init()
+  resetQuery();
+  init();
 }
 
-/**
-* 页条变化
-* @param val
-*/
+/** 页条变化 */
 const onSizeChange = (val: number) => {
-  Data.pageInput.pageSize = val
-  init()
+  Data.pageInput.pageSize = val;
+  init();
 }
 
-/**
- * 页数 变化
- * @param val
- */
+/** 页数变化 */
 const onCurrentChange = (val: number) => {
-  Data.pageInput.currentPage = val
-  init()
+  Data.pageInput.currentPage = val;
+  init();
 }
 
-/**
- * 监听时间变换
- */
+/** 监听时间变换 */
 watch(() => Data.time1, (newVal) => {
-  if (newVal.length === 0) {
-    return
+  if (newVal && newVal.length === 2) {
+    Data.Filter.OutBeginTime = newVal[0];
+    Data.Filter.OutEndTime = newVal[1];
+  } else {
+    Data.Filter.OutBeginTime = "";
+    Data.Filter.OutEndTime = "";
   }
-  Data.Filter.OutBeginTime = newVal[0]?.[0] ?? ''
-  Data.Filter.OutEndTime = newVal[0]?.[1] ?? ''
 })
-
 </script>
 
 <style scoped lang="scss">
@@ -244,15 +339,23 @@ watch(() => Data.time1, (newVal) => {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  width: 14*4px + 12px;
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
+/* 数据表头样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
+
+/* 链接样式优化 */
+::v-deep .el-link {
+  cursor: pointer;
+  &:hover {
+    color: #4096ff;
+    text-decoration: underline;
+  }
+}
 </style>

+ 197 - 147
admin.ui.plus-master/src/views/admin/statement/taxcontrol/index.vue

@@ -1,11 +1,10 @@
-
 <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 style="margin-bottom: -3vh;">
+      <!-- 操作区域 -->
+      <el-col :xs="24">
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
             <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="石油公司">
@@ -17,29 +16,6 @@
                   <el-input v-model="state.filter.stationName" placeholder="请输入加油站名称" clearable></el-input>
                 </el-form-item>
               </el-col>
-<!-- 
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="绑定加油机厂商">
-                  <el-input v-model="state.filter.BindingDispenserManufacturer" placeholder="单行输入" clearable></el-input>
-                </el-form-item>
-              </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="安全装置状态">
-                  <el-input v-model="state.filter.DeviceStatus" placeholder="单行输入" clearable></el-input>
-                </el-form-item>
-              </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-            <el-form-item label="选择时间">
-                  <el-date-picker
-                    v-model="state.filter.FixTime"
-                    type="datetimerange"
-                    value-format="YYYY-MM-DD HH:mm:ss"
-                    range-separator="To"
-                    start-placeholder="Start date"
-                    end-placeholder="End date"
-                  />
-                </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.SerialNumber" placeholder="请输入序列号" clearable></el-input>
@@ -48,18 +24,18 @@
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="编码器状态">
                   <el-select v-model="state.filter.DeviceStatus" placeholder="请选择状态">
-                       <el-option label="所有" :value="''"></el-option>
-                        <el-option v-for="(value, key) in DeviceStatus" :key="key" :label="value" :value="key" />
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in DeviceStatus" :key="key" :label="value" :value="key" />
                   </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="state.filter.onlineStatus"  placeholder="请选择状态">
-                                   <el-option label="所有" :value="''"></el-option>
-                                   <el-option v-for="(value, key) in OnlineStatus" :key="key" :label="value" :value="key" />
-                                 </el-select>                
-                                </el-form-item>
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in OnlineStatus" :key="key" :label="value" :value="key" />
+                  </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="安装时间">
@@ -73,19 +49,24 @@
                   />
                 </el-form-item>
               </el-col>
-</el-form-item>
+            </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-row justify="space-between" class="submit-button" style="margin-bottom:-9px;">
+            <el-row>
+              <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+              <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+            </el-row>
+          </el-row>
+        </el-card>
       </el-col>
-<!--表格-->
-      <el-col  :xs="24" >
+      <!-- 表格区域 -->
+      <el-col :xs="24">
         <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
-<el-table 
+          <el-table 
             ref="multipleTableRef" 
             v-loading="state.loading" 
             stripe 
@@ -110,7 +91,7 @@
               </template>
             </el-table-column>
           </el-table>
-<div class="my-flex my-flex-end" style="margin-top: 20px">
+          <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"
@@ -123,137 +104,206 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </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 { PageInput,encodercontrolsDto } from "/@/api/admin/reportManagement/taxcontrol/taxcontroldto";
-  import {Api} from "/@/api/admin/reportManagement/taxcontrol/taxcontrolapi";
-  import StatusBox from "/@/components/StatusBox.vue";
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import { useRoute } from "vue-router";
+import eventBus from "/@/utils/mitt";
+import { PageInput, encodercontrolsDto } from "/@/api/admin/reportManagement/taxcontrol/taxcontroldto";
+import { Api } from "/@/api/admin/reportManagement/taxcontrol/taxcontrolapi";
+import StatusBox from "/@/components/StatusBox.vue";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from "element-plus";
 
-  // 使用组合式函数获取分页状态
-const pageState = useDynamicPageSize(10, 15);
+// 初始化路由实例(用于接收参数)
+const route = useRoute();
+const multipleTableRef = ref<any>(null);
 
-/**数据对象*/
-  const state = reactive({
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
-      filter: {
-/**石油公司 */
-        OilCompanyName: "",
-        // 加油站名称
-        stationName:"",
-        // 在线状态
-        onlineStatus:"",
-/**序列号 */
-        SerialNumber: "",
-/**绑定加油机厂商 */
-        BindingDispenserManufacturer: "",
-/**安全装置状态 */
-        DeviceStatus: "",
-/**安装时间 */
-        FixTime: "",
-/**出厂时间 */
-        SoldTime: "",},
-  /**表格信息 */
-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: '出厂时间' },],
-/**分页标识 */
-    pageInput:{
-      currentPage: 1,
-      pageSize: 10,
-    } as PageInput,
-    /**分页总数 */
-    total: 0,
-})
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
 
+/** 状态枚举 */
 enum DeviceStatus {
-  unregister="未备案",
-produce="已生产",
-register="已备案",
-bind="已绑定油机",
-factory="已出厂注册",
-enable="已启用",
-disable="维修中"
+  unregister = "未备案",
+  produce = "已生产",
+  register = "已备案",
+  bind = "已绑定油机",
+  factory = "已出厂注册",
+  enable = "已启用",
+  disable = "维修中"
 }
 
-/**在线状态*/
 enum OnlineStatus {
   online = '在线',
   offline = '离线'
 }
 
-  onMounted(() => {
-    // 初始化分页大小
-state.pageInput.pageSize = pageState.pageInput.pageSize;
-    init()
-    eventBus.off('refreshView')
-    eventBus.on('refreshView', async () => {
-      await init()
-    })
-    console.log()
-  })
-  onBeforeMount(() => {
-    eventBus.off('refreshView')
-  })
-  /**页条数变化*/
-const onSizeChange = () => {
-  init()
+/** 数据对象 */
+const state = reactive({
+  /** 加载显示 */
+  loading: false,
+  /** 条件查询模块 */
+  filter: {
+    // 石油公司
+    OilCompanyName: "",
+    // 加油站名称
+    stationName: "",
+    // 在线状态
+    onlineStatus: "",
+    // 序列号(监控微处理器编号)
+    SerialNumber: "",
+    // 绑定加油机厂商
+    BindingDispenserManufacturer: "",
+    // 安全装置状态
+    DeviceStatus: "",
+    // 安装时间
+    FixTime: "",
+    // 出厂时间
+    SoldTime: [], // 改为数组接收时间范围
+  },
+  /** 表格信息 */
+  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: '出厂时间' },
+  ],
+  /** 分页总数 */
+  total: 0,
+  /** 分页标识 */
+  pageInput: {
+    currentPage: 1,
+    pageSize: 10,
+  } as PageInput,
+})
+
+/** 页面加载时接收参数并查询 */
+onMounted(async () => {
+  // 初始化分页大小
+  state.pageInput.pageSize = pageState.pageInput.pageSize;
+  
+  // 从路由参数中获取传递的UUID
+  const { queryParam } = route.query;
+  if (queryParam && typeof queryParam === 'string') {
+    // 将UUID设置到序列号查询条件中
+    state.filter.SerialNumber = queryParam;
+  }
+  
+  // 触发查询
+  await init();
+
+  // 监听路由参数变化(防止同页面刷新参数丢失)
+  watch(() => route.query, (newQuery) => {
+    if (newQuery.queryParam && typeof newQuery.queryParam === 'string') {
+      state.filter.SerialNumber = newQuery.queryParam;
+      init(); // 参数变化时重新查询
+    }
+  }, { immediate: false });
+});
+
+/** 页条数变化 */
+const onSizeChange = (val: number) => {
+  state.pageInput.pageSize = val;
+  init();
+}
+
+/** 页数变化 */
+const onCurrentChange = (val: number) => {
+  state.pageInput.currentPage = val;
+  init();
+}
+
+/** 条件查询 */
+const onQuery = () => {
+  init();
 }
 
-/**页数变化*/
-const onCurrentChange = () =>{
-  init()
+/** 重置查询条件 */
+const onReset = () => {
+  state.filter = {
+    OilCompanyName: "",
+    stationName: "",
+    onlineStatus: "",
+    SerialNumber: "",
+    BindingDispenserManufacturer: "",
+    DeviceStatus: "",
+    FixTime: "",
+    SoldTime: [],
+  };
+  state.pageInput.currentPage = 1;
+  init();
 }
-  /**
-  * 监听变换
-  */
-  watch(() => {})
-/**条件查询 */
-          const onQuery = () => {
-          init()
-        }
-        /**初始化 */
-        const init = async () => {
-          state.loading = true
-const res:any = await new Api().getList({...pageState.pageInput, Filter:state.filter})
-            state.total = res?.data?.total ?? 0
-state.tableModel = res?.data?.list ?? []
-          state.loading = false
-        }
+
+/** 初始化查询接口 */
+const init = async () => {
+  state.loading = true;
+  try {
+    // 处理时间范围参数(如果有)
+    const timeRange = state.filter.SoldTime as string[];
+    const params = {
+      ...state.pageInput,
+      filter: {
+        ...state.filter,
+        // 时间范围拆分为开始和结束时间(根据接口要求调整字段名)
+        SoldBeginTime: timeRange?.[0] || "",
+        SoldEndTime: timeRange?.[1] || "",
+      }
+    };
+
+    // 调用监控微处理器查询接口
+    const res: any = await new Api().getList(params);
+    state.tableModel = res?.data?.list ?? [];
+    state.total = res?.data?.total ?? 0;
+  } catch (error) {
+    console.error('监控微处理器查询失败:', error);
+    ElMessage.error('数据加载失败,请重试');
+  } finally {
+    state.loading = false;
+  }
+}
+
+// 清理事件监听
+onBeforeMount(() => {
+  eventBus.off('refreshView');
+});
 </script>
+
 <style scoped lang="scss">
 .el-input,
 .el-select {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*5px+12px;
+  width: 14*5px + 12px;
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
+/* 数据表头样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
-  </style>
+
+/* 链接样式优化 */
+::v-deep .el-link {
+  cursor: pointer;
+  &:hover {
+    color: #4096ff;
+    text-decoration: underline;
+  }
+}
+</style>

+ 133 - 47
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -67,9 +67,27 @@
                 </div>
               </template>
             </el-tree>
-            <!-- <div style="margin-top: 10px; font-size: 12px; color: #666;">
-              选中的用户ID: {{ selectedUserIds.length > 0 ? selectedUserIds.join(',') : '无' }}
-            </div> -->
+          </el-form-item>
+        </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">
+            <el-select 
+              v-model="Data.Filter.alarmLevel" 
+              placeholder="请选择报警等级" 
+              clearable
+              @change="handleAlarmLevelChange"
+            >
+              <el-option 
+                v-for="item in alarmLevelDict" 
+                :key="item.id" 
+                :label="`${item.name}(${item.value})`" 
+                :value="item.value"
+              ></el-option>
+            </el-select>
           </el-form-item>
         </el-form>
       </div>
@@ -111,18 +129,26 @@
       <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">
-            <el-row style="width: 100%;">
-              微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
-            </el-row>
-            <el-row style="width: 100%;">
-              邮&#8195;&#8195;&#8195;箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
+            <!-- 推送总开关 -->
+            <el-row style="width: 100%;margin-bottom: 10px;">
+              是否推送<el-switch v-model="Data.pushEnabled" style="margin-left: 3%;" />
             </el-row>
+            
+            <!-- 微信和邮箱开关(仅在总开关打开时显示) -->
+            <template v-if="Data.pushEnabled">
+              <el-row style="width: 100%;">
+                微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
+              </el-row>
+              <el-row style="width: 100%;">
+                邮&#8195;&#8195;&#8195;箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
+              </el-row>
+            </template>
           </el-form-item>
         </el-form>
       </div>
       
-      <!-- 模板选择 -->
-      <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+      <!-- 模板选择(受总开关控制) -->
+      <div style="width: 100%;display: flex;justify-content: center;align-items: center;" v-if="Data.pushEnabled">
         <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">
@@ -322,6 +348,18 @@ import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
 import eventBus from "/@/utils/mitt";
 import { ElMessage, type FormRules } from 'element-plus'
 import { UserListItem, StationItem } from "/@/api/admin/AlarmService/alarmRulesDto";
+import { DictApi } from "/@/api/admin/Dict";
+import { PageInputDictGetPageDto } from "/@/api/admin/data-contracts";
+
+// 报警等级字典项接口定义
+interface DictItem {
+  id: number;
+  name: string;
+  code: string;
+  value: string;
+  enabled: boolean;
+  sort: number;
+}
 
 // 状态标识:是否为编辑模式
 const isEditing = ref(false);
@@ -358,10 +396,14 @@ const condition2Rules = reactive<FormRules>({
   Right: [{ required: true, message: '请选择维修状态', trigger: 'change' }]
 })
 
+// 报警等级字典数据
+const alarmLevelDict = ref<DictItem[]>([]);
+
 const Data = reactive({
   isShowDialog: false,
   showAlarmConditions: false,
   showRepairConditions: false,
+  pushEnabled: false, // 推送总开关状态
   stationList: [] as StationItem[],
   Filter: {
     ruleName: '',
@@ -387,8 +429,9 @@ const Data = reactive({
     condition2: "",
     condition: "",
     mode1: '',
-    id: 0
-  } as unknown as alarmRluesFilterModel,
+    id: 0,
+    alarmLevel: undefined, // 新增:报警等级筛选值
+  } as unknown as alarmRluesFilterModel & { alarmLevel?: string },
   roleList: [] as any,
   labelList: [] as any,
   userList: [] as UserListItem[],
@@ -442,7 +485,7 @@ const handleNodeClick = (data: any, node: any) => {
   }
 };
 
-// 处理用户选择 - 核心修复:确保正确提取用户ID
+// 处理用户选择
 const handleUserCheck = (data: any, checkInfo: any) => {
   // 获取所有选中的节点ID
   const allCheckedIds = checkInfo.checkedKeys || [];
@@ -458,8 +501,6 @@ const handleUserCheck = (data: any, checkInfo: any) => {
   const uniqueUserIds = [...new Set(userIds)];
   selectedUserIds.value = uniqueUserIds;
   Data.Filter.pushUserid = uniqueUserIds;
-  
-  console.log('过滤后的用户ID:', uniqueUserIds);
 };
 
 // 监听油站选择变化
@@ -467,7 +508,12 @@ const handleStationChange = (values: number[]) => {
   Data.Filter.stationid = [...values];
 };
 
-// 获取用户列表 - 确保用户ID有效
+// 处理报警等级变化
+const handleAlarmLevelChange = (value: string) => {
+  Data.Filter.alarmLevel = value;
+};
+
+// 获取用户列表
 const getUserList = async () => {
   try {
     const res = await new alarmRulesApi().getWxUserRole({});
@@ -499,8 +545,6 @@ const getUserList = async () => {
       roleName: role,
       users: users
     }));
-    
-    console.log('处理后的用户列表:', Data.userList);
   } catch (error) {
     console.error("获取用户列表失败:", error);
     ElMessage.error("用户列表加载失败");
@@ -525,6 +569,34 @@ const getStationList = async () => {
   }
 };
 
+// 获取报警等级字典数据
+const fetchAlarmLevelDict = async () => {
+  try {
+    // 构造字典查询参数
+    const data: PageInputDictGetPageDto = {
+      CurrentPage: 1,
+      PageSize: 100,
+      Filter: {
+        dictTypeId: 685895581360197, // 报警等级字典类型ID
+        name: ""
+      }
+    };
+    
+    // 调用字典接口
+    const res = await new DictApi().getPage(data);
+    
+    // 处理返回数据
+    if (res.success && res.data) {
+      alarmLevelDict.value = res.data.list || [];
+      console.log("报警等级字典数据获取成功", alarmLevelDict.value);
+    } else {
+      console.error("获取报警等级字典数据失败", res.msg);
+    }
+  } catch (error) {
+    console.error("获取报警等级字典数据异常", error);
+  }
+};
+
 // 设置油站选择
 const setStationSelection = (ids: number[]) => {
   if (!stationListLoaded.value) {
@@ -564,13 +636,17 @@ const templateData = reactive({
 })
 
 const radioChange = () => {
-  if (Data.radioValue1) {
-    Data.Filter.pushMethod = 'wx'
-    if (Data.radioValue2) {
-      Data.Filter.pushMethod += ',email'
+  if (Data.pushEnabled) { // 只有总开关打开时才处理推送方式
+    if (Data.radioValue1) {
+      Data.Filter.pushMethod = 'wx'
+      if (Data.radioValue2) {
+        Data.Filter.pushMethod += ',email'
+      }
+    } else {
+      Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
     }
   } else {
-    Data.Filter.pushMethod = Data.radioValue2 ? 'email' : '';
+    Data.Filter.pushMethod = ''; // 总开关关闭时清空推送方式
   }
 };
 
@@ -620,12 +696,12 @@ const funSelect = async () => {
 const modeChange = () => {
   Data.Filter.pushTemplateMappingID = [];
   
-  if (Data.radioValue1 && Data.mode1) {
+  if (Data.pushEnabled && 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.radioValue2 && Data.mode2) {
+  if (Data.pushEnabled && Data.radioValue2 && Data.mode2) {
     const emailItem = templateData.emailList.find((item: any) => item.id === Data.mode2);
     if (emailItem) Data.Filter.pushTemplateMappingID.push(Number(emailItem.id));
   }
@@ -672,11 +748,13 @@ const resetForm = () => {
     condition2: "",
     condition: "",
     mode1: '',
-    id: 0
-  } as unknown as alarmRluesFilterModel;
+    id: 0,
+    alarmLevel: undefined, // 重置报警等级筛选
+  } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
   
   Data.radioValue1 = false;
   Data.radioValue2 = false;
+  Data.pushEnabled = false; // 重置总开关状态
   Data.mode1 = '';
   Data.mode2 = '';
   Data.showAlarmConditions = false;
@@ -692,6 +770,7 @@ onMounted(() => {
   funSelect();
   getUserList();
   getStationList();
+  fetchAlarmLevelDict(); // 加载报警等级字典数据
 });
 
 // 添加报警条件
@@ -742,7 +821,7 @@ const removeCondition2 = () => {
   }
 }
 
-// 提交表单 - 增强验证逻辑
+// 提交表单
 const submitForm = async () => {
   console.log('提交时选中的用户ID:', selectedUserIds.value);
   
@@ -752,7 +831,7 @@ const submitForm = async () => {
     return
   }
   
-  // 验证推送用户 - 确保数组存在且有值
+  // 验证推送用户
   if (!Array.isArray(selectedUserIds.value) || selectedUserIds.value.length === 0) {
     ElMessage.warning('请选择推送用户');
     return;
@@ -764,14 +843,21 @@ const submitForm = async () => {
     return;
   }
   
-  // 验证模板选择
-  if (Data.radioValue1 && !Data.mode1) {
-    ElMessage.warning('请选择微信模板')
-    return
-  }
-  if (Data.radioValue2 && !Data.mode2) {
-    ElMessage.warning('请选择邮箱模板')
-    return
+  // 如果开启了推送,验证模板选择
+  if (Data.pushEnabled) {
+    if (Data.radioValue1 && !Data.mode1) {
+      ElMessage.warning('请选择微信模板')
+      return
+    }
+    if (Data.radioValue2 && !Data.mode2) {
+      ElMessage.warning('请选择邮箱模板')
+      return
+    }
+    // 验证至少选择一种推送方式
+    if (!Data.radioValue1 && !Data.radioValue2) {
+      ElMessage.warning('请至少选择一种推送方式')
+      return
+    }
   }
   
   // 准备提交数据
@@ -779,10 +865,11 @@ const submitForm = async () => {
     ...Data.Filter,
     conditionsJson: Data.showAlarmConditions ? JSON.stringify(Data.condition) : null,
     maintenanceJson: Data.showRepairConditions ? JSON.stringify(Data.condition2) : null,
-    pushUserid: selectedUserIds.value, // 使用树形选择的用户ID
+    pushUserid: selectedUserIds.value,
     stationid: selectedStationIds.value,
     pushTemplateMappingID: Data.Filter.pushTemplateMappingID,
-    labelId: Data.Filter.labelId || null
+    labelId: Data.Filter.labelId || null,
+    alarmLevel: Data.Filter.alarmLevel // 包含报警等级筛选值
   }
   
   try {
@@ -805,19 +892,18 @@ const submitForm = async () => {
 /**
  * 打开表单对话框
  */
-const openDialog = (row?: alarmRluesFilterModel) => {
+const openDialog = (row?: alarmRluesFilterModel & { alarmLevel?: string }) => {
   try {
     isEditing.value = !!row;
     resetForm();
     
     if (row) {
-      // 处理用户ID - 确保正确转换为数字数组
+      // 处理用户ID
       let pushUserIds: number[] = [];
       if (row.pushUserid) {
         if (Array.isArray(row.pushUserid)) {
           pushUserIds = row.pushUserid.map(id => Number(id)).filter(id => !isNaN(id) && id > 0);
         } else if (typeof row.pushUserid === 'string') {
-          // 处理逗号分隔的ID字符串
           pushUserIds = row.pushUserid
             .split(',')
             .map(id => Number(id))
@@ -848,13 +934,15 @@ const openDialog = (row?: alarmRluesFilterModel) => {
             : [Number(row.pushTemplateMappingID)]) : [],
         stationid: stationIds,
         labelId: row.labelId?.toString() || "",
-        id: row.id || 0
-      } as unknown as alarmRluesFilterModel;
+        id: row.id || 0,
+        alarmLevel: row.alarmLevel // 设置报警等级
+      } as unknown as alarmRluesFilterModel & { alarmLevel?: string };
       
-      // 处理推送方式
+      // 处理推送方式和总开关状态
       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();
@@ -946,8 +1034,6 @@ defineExpose({
   align-items: center;
   width: 100%;
   padding: 2px 0;
-  
-
 }
 
 .expand-btn {