浏览代码

feat:5.0文档部分修改

DOVER-GLOBAL\10093976 2 天之前
父节点
当前提交
1b1babac93
共有 25 个文件被更改,包括 1760 次插入1016 次删除
  1. 56 34
      admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts
  2. 108 6
      admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts
  3. 1 0
      admin.ui.plus-master/src/api/admin/deviceAuthorization/softwarePackageManagementDto.ts
  4. 1 1
      admin.ui.plus-master/src/api/admin/productionManagement/QRBookDto.ts
  5. 3 0
      admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts
  6. 7 7
      admin.ui.plus-master/src/views/admin/PCBA/boardFunctionResult/index.vue
  7. 6 6
      admin.ui.plus-master/src/views/admin/PCBA/boardFunctionSummary/index.vue
  8. 6 6
      admin.ui.plus-master/src/views/admin/PCBA/boardList/index.vue
  9. 7 7
      admin.ui.plus-master/src/views/admin/PCBA/boardSummary/index.vue
  10. 7 7
      admin.ui.plus-master/src/views/admin/PCBA/boardTestRecord/index.vue
  11. 2 2
      admin.ui.plus-master/src/views/admin/application/softwarePackageManagement/index.vue
  12. 1 1
      admin.ui.plus-master/src/views/admin/authorize/oilUp/index.vue
  13. 2 2
      admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/components/search-history.vue
  14. 191 144
      admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/index.vue
  15. 18 18
      admin.ui.plus-master/src/views/admin/product/qrBook/index.vue
  16. 5 5
      admin.ui.plus-master/src/views/admin/product/record/index.vue
  17. 2 2
      admin.ui.plus-master/src/views/admin/product/type/index.vue
  18. 1 1
      admin.ui.plus-master/src/views/admin/statement/associationManagement/index.vue
  19. 2 2
      admin.ui.plus-master/src/views/admin/statement/encodercontrols/index.vue
  20. 266 171
      admin.ui.plus-master/src/views/admin/statement/oilEngineDetails/index.vue
  21. 3 3
      admin.ui.plus-master/src/views/admin/statement/problemData/index.vue
  22. 4 1
      admin.ui.plus-master/src/views/admin/statement/repairList/index .vue
  23. 444 135
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/Level.vue
  24. 472 348
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue
  25. 145 107
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

+ 56 - 34
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts

@@ -1,6 +1,6 @@
 import { AxiosResponse } from 'axios'
 import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client";
-import { alarmRluesFilterModel,PageInputAlarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
+import { alarmRluesFilterModel, PageInputAlarmRluesFilterModel, PageInputStationGetPageDto } from "/@/api/admin/AlarmService/alarmRulesDto";
 
 export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
   /**
@@ -45,14 +45,14 @@ export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<Securi
         })
 
     /**
- * No description
- *
- * @tags
- * @name getData
- * @summary 查询规则
- * @request POST:
- * @secure
- */
+     * No description
+     *
+     * @tags
+     * @name getData
+     * @summary 查询规则
+     * @request POST:
+     * @secure
+     */
     getData = (data: PageInputAlarmRluesFilterModel, params: RequestParams = {}) =>
         this.request<alarmRluesFilterModel, any>({
             path: '/api/app/push/get-push-rule',
@@ -64,30 +64,31 @@ export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<Securi
             ...params
         })
 
-        /**
- * No description
- *
- * @tags
- * @name deliteData
- * @summary 删除规则
- * @request POST:
- * @secure
- */
-        deliteData = (
-            data?: {
-              /** @format int64 */
-              id?: number
-            },
-            params: RequestParams = {}
-          ) =>
-            this.request<AxiosResponse, any>({
-              path: `/api/app/push/delete-push-rule`,
-              method: 'POST',
-              body: data,
-              secure: true,
-              type: ContentType.Json,
-              ...params,
-            })
+    /**
+     * No description
+     *
+     * @tags
+     * @name deliteData
+     * @summary 删除规则
+     * @request POST:
+     * @secure
+     */
+    deliteData = (
+        data?: {
+          /** @format int64 */
+          id?: number
+        },
+        params: RequestParams = {}
+      ) =>
+        this.request<AxiosResponse, any>({
+          path: `/api/app/push/delete-push-rule`,
+          method: 'POST',
+          body: data,
+          secure: true,
+          type: ContentType.Json,
+          ...params,
+        })
+  
   static addForm: any;
   static updateForm: any;
 
@@ -105,6 +106,27 @@ export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<Securi
       format: 'json',
       ...params
     });
-
 }
 
+// 油站相关API
+export class stationApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * 获取油站列表
+   *
+   * @tags
+   * @name getStationList
+   * @summary 获取油站列表
+   * @request POST:/api/app/fuel-dispenser/get-station-list
+   * @secure
+   */
+  getStationList = (data: PageInputStationGetPageDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/fuel-dispenser/get-station-list',
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      ...params
+    });
+}

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

@@ -34,6 +34,8 @@ export interface alarmRluesFilterModel {
   maintenanceJson?: string | null;
   /**推送用户中间表id */
   pushUserid?: Array<number>;
+  /**油站ID数组 */
+  stationid?: Array<number>;
   id?: number;
   condition?:string | null;
   condition2?:string | null;
@@ -54,8 +56,7 @@ export interface alarmRluesFilterModel_SearchFilter {
 
 }
 
-
-/** 分页信息输入 */
+/** 分页信息输入 - 报警规则 */
 export interface PageInputAlarmRluesFilterModel {
   /**
    * 当前页标
@@ -71,14 +72,115 @@ export interface PageInputAlarmRluesFilterModel {
   filter?: alarmRluesFilterModel_SearchFilter
 }
 
-// /@/api/admin/AlarmService/alarmRulesDto.ts
+/** 分页信息输入 - 油站查询 */
+export interface PageInputStationGetPageDto {
+  /**
+   * 当前页标
+   * @format int32
+   */
+  currentPage?: number
+  /**
+   * 每页大小
+   * @format int32
+   */
+  pageSize?: number
+  dynamicFilter?: DynamicFilterInfo
+  filter?: StationGetPageDto
+}
+
+/** 油站查询过滤条件 */
+export interface StationGetPageDto {
+  province?: string;
+  name?: string;
+  contact?: string;
+  phone?: string;
+  city?: string;
+  type?: string;
+}
+
+/** 油站信息项 */
+export interface StationItem {
+  alarming?: boolean;
+  districtCode?: string;
+  city?: string;
+  cityCode?: string;
+  type?: string;
+  registerNo?: string;
+  province?: string;
+  contact?: string;
+  modifiedBy?: number;
+  id?: number;
+  lat?: number;
+  address?: string;
+  lng?: number;
+  test?: boolean;
+  business?: boolean;
+  provinceCode?: string;
+  alarmTime?: string;
+  dispensersTotal?: number;
+  createdDate?: string;
+  phone?: string;
+  createdBy?: number;
+  district?: string;
+  name?: string;
+  modifiedDate?: number;
+  noticesTotal?: number;
+  nozzleControlsTotal?: number;
+  companyID?: number;
+}
+
+/** 用户信息项 */
 export interface UserListItem {
   id: number; // 用户ID
   nickname?: string; // 昵称(可选)
   phone?: string; // 手机号(可选)
-  roleName: string; // 新增字段,用于存储角色名称
-  name?:string
-  names?:string
+  roleName: string; // 角色名称
+  name?: string;
+  names?: string;
+}
+
+/** 动态过滤信息 */
+export interface DynamicFilterInfo {
+  field?: string;
+  operator?: DynamicFilterOperator;
+  value?: any;
+  logic?: DynamicFilterLogic;
+  filters?: DynamicFilterInfo[];
+}
+
+/** 动态过滤操作符 */
+export enum DynamicFilterOperator {
+  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
+}
 
+/** 动态过滤逻辑 */
+export enum DynamicFilterLogic {
+  And = 0,
+  Or = 1
 }
 
+/** 分页输入 - 油站查询 */
+export interface PageInputStationGetPageDto {
+  currentPage?: number;
+  pageSize?: number;
+  dynamicFilter?: DynamicFilterInfo;
+  filter?: StationGetPageDto;
+}

+ 1 - 0
admin.ui.plus-master/src/api/admin/deviceAuthorization/softwarePackageManagementDto.ts

@@ -24,6 +24,7 @@ export  interface softwarePackageManagement_SearchFilter{
   EndTime?: string | null,
   projectName?:string | null,
   projectCode?:string | null,
+    state?: number | null;  
 }
 
 /**

+ 1 - 1
admin.ui.plus-master/src/api/admin/productionManagement/QRBookDto.ts

@@ -19,7 +19,7 @@ export interface QRBookFilter {
     EndTime?: string | null
     time?:string
     updateTime?: string | null
-    status?: number
+    status?: number | null
 
 }
 

+ 3 - 0
admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts

@@ -3,6 +3,9 @@ import { AxiosResponse } from 'axios'
 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
    *

+ 7 - 7
admin.ui.plus-master/src/views/admin/PCBA/boardFunctionResult/index.vue

@@ -10,12 +10,17 @@
                 <!-- 第一行 -->
                 <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                   <el-form-item label="序列号">
-                    <el-input v-model="state.filter.serno" placeholder="单行输入" clearable></el-input>
+                    <el-input v-model="state.filter.serno" 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.exserno" placeholder="单行输入" clearable></el-input>
+                    <el-input v-model="state.filter.exserno" 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.lastTestUser" placeholder="请输入最新检测员" clearable></el-input>
                   </el-form-item>
                 </el-col>
                 <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -47,11 +52,6 @@
                     </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-input v-model="state.filter.lastTestUser" 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

+ 6 - 6
admin.ui.plus-master/src/views/admin/PCBA/boardFunctionSummary/index.vue

@@ -8,18 +8,18 @@
 <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="主板类型">
+                <el-form-item label="检测员">
+                  <el-input v-model="state.filter.lastTestUser" 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-select v-model="state.filter.boardType" placeholder="">
                     <el-option v-for="(value, key) in PCBABoardType" :key="key" :label="value[1].name"
                       :value="Number(value[1].value)" />
                   </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-input v-model="state.filter.lastTestUser" 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

+ 6 - 6
admin.ui.plus-master/src/views/admin/PCBA/boardList/index.vue

@@ -13,7 +13,12 @@
               </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.exserno" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.exserno" 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.lastTestUser" placeholder="请输入最新检测员" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -32,11 +37,6 @@
                   </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-input v-model="state.filter.lastTestUser" 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

+ 7 - 7
admin.ui.plus-master/src/views/admin/PCBA/boardSummary/index.vue

@@ -6,7 +6,12 @@
         <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="4" 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.lastTestUser" 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-select v-model="state.filter.boardType" placeholder="">
                     <el-option v-for="(value, key) in PCBABoardType" :key="key" :label="value[1].name"
@@ -14,12 +19,7 @@
                   </el-select>
                 </el-form-item>
               </el-col>
-              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="4" class="mb20">
-                <el-form-item label="检测员">
-                  <el-input v-model="state.filter.lastTestUser" placeholder="单行输入" clearable></el-input>
-                </el-form-item>
-              </el-col>
-              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="4" class="mb20">
+              <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.createTimeRange"

+ 7 - 7
admin.ui.plus-master/src/views/admin/PCBA/boardTestRecord/index.vue

@@ -8,12 +8,17 @@
             <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.serno" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.serno" 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.exserno" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.exserno" 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.user" placeholder="请输入测试员" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -44,11 +49,6 @@
                   </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-input v-model="state.filter.user" 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-select v-model="state.filter.result" placeholder="">

+ 2 - 2
admin.ui.plus-master/src/views/admin/application/softwarePackageManagement/index.vue

@@ -16,12 +16,12 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="软件名称">
-                  <el-input v-model="softwareData.Filter.softwareName" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="softwareData.Filter.softwareName" 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="softwareData.Filter.version" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="softwareData.Filter.version" placeholder="请输入版本" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">

+ 1 - 1
admin.ui.plus-master/src/views/admin/authorize/oilUp/index.vue

@@ -59,7 +59,7 @@
   <!-- 按钮 -->
   <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
       <el-row>
-        <el-button type="primary" icon="ele-CirclePlus" @click="''">升级软件</el-button>
+        <el-button type="primary" icon="ele-Plus" @click="''">升级软件</el-button>
       </el-row>
       <el-row>
           <el-button type="primary" icon="ele-Search" @click="onQuery">查询</el-button>

+ 2 - 2
admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/components/search-history.vue

@@ -95,8 +95,8 @@
       </el-form>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="onCancel" icon="el-icon-close" size="default">取消</el-button>
-          <el-button type="primary" :icon="formData.editIcon" @click="handleSubmit" size="default">
+          <el-button @click="onCancel" size="default">取消</el-button>
+          <el-button type="primary" @click="handleSubmit" size="default">
             {{formData.buttonText}}
           </el-button>
         </span>

+ 191 - 144
admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/index.vue

@@ -1,14 +1,14 @@
 <template>
   <div class="layout-pd">
     <el-row>
-      <!--操作-->
+      <!-- 操作区域 -->
       <el-col :xs="24">
         <el-card class="mt8" shadow="hover">
           <el-form :model="softwareData.Filter" @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-select v-model="softwareData.Filter.softwareType" placeholder="请选择软件类型">
+                  <el-select v-model="softwareData.Filter.softwareType" placeholder="请选择软件类型" clearable>
                     <el-option label="所有" :value="''"></el-option>
                     <el-option v-for="(value, key) in softwareType" :key="key" :label="value[1].name"
                       :value="Number(value[1].value)" />
@@ -17,7 +17,7 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="软件名称">
-                  <el-input v-model="softwareData.Filter.softwareName" placeholder="请软件名称" clearable></el-input>
+                  <el-input v-model="softwareData.Filter.softwareName" placeholder="请输入软件名称" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -27,7 +27,7 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="设备类型">
-                  <el-select v-model="softwareData.Filter.equipmentType" placeholder="请选择设备类型">
+                  <el-select v-model="softwareData.Filter.equipmentType" placeholder="请选择设备类型" clearable>
                     <el-option label="所有" :value="''"></el-option>
                     <el-option v-for="(value, key) in equipmentType" :key="key" :label="value[1].name"
                       :value="Number(value[1].value)" />
@@ -35,16 +35,20 @@
                 </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  placeholder="请选择上传状态">
-                                   <el-option label="所有" :value="''"></el-option>
-                                   <el-option label="已发布" :value="''"></el-option>
-                                   <el-option label="待发布" :value="''"></el-option>
-                                   <el-option label="失效" :value="''"></el-option>
-                                 </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="softwareData.Filter.state" 
+                    placeholder="请选择上传状态"
+                    clearable
+                  >
+                    <el-option label="所有" :value=undefined></el-option>
+                    <el-option label="待发布" :value="0"></el-option>
+                    <el-option label="已发布" :value="1"></el-option>
+                    <el-option label="失效" :value="2"></el-option>
+                  </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-date-picker 
                   v-model="softwareData.time" 
@@ -60,7 +64,7 @@
 
           <hr>
 
-          <!-- 按钮  -->
+          <!-- 按钮区域 -->
           <el-row justify="space-between" class="submit-button">
             <el-row>
               <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
@@ -72,7 +76,8 @@
           </el-row>
         </el-card>
       </el-col>
-      <!--表格-->
+      
+      <!-- 表格区域 -->
       <el-col :xs="24">
         <el-card class="my-fill mt8" shadow="hover">
           <el-table v-loading="softwareData.loading" stripe :data="softwareData.tableModel" row-key="id"
@@ -81,16 +86,20 @@
               :label="column.label">
               <template #default="{ row }">
                 <span :style="getColor(column.prop, row)">
-               <!-- 如果是状态列,使用 StatusBox 组件 -->
-              <StatusBox 
-               v-if="column.prop === 'state'" 
-               :status="getStatusInfo(row[column.prop]).name"  />
-               <!-- 其他列保持原有逻辑 -->
-               <span 
-                v-else 
-                :style="getColor(column.prop, row)">
-                {{ getProp(column.prop, row) }}
-           </span>
+                  <!-- 数字签名列特殊处理 - 仅显示两行 -->
+                  <template v-if="column.prop === 'digitalSignature'">
+                    <div class="signature-truncated">{{ getProp(column.prop, row) }}</div>
+                  </template>
+                  <!-- 状态列 -->
+                  <StatusBox 
+                    v-else-if="column.prop === 'state'" 
+                    :status="getStatusInfo(row[column.prop]).name"  />
+                  <!-- 其他列 -->
+                  <span 
+                    v-else 
+                    :style="getColor(column.prop, row)">
+                    {{ getProp(column.prop, row) }}
+                  </span>
                 </span>
               </template>
             </el-table-column>
@@ -132,7 +141,6 @@
 </template>
 
 <script setup lang="ts">
-
 import { defineAsyncComponent, onBeforeMount, onMounted, reactive, ref, watch } from "vue";
 import { useGlobalCacheStore } from "/@/stores/globalCacheStore";
 import {
@@ -153,54 +161,54 @@ import { useRoute } from "vue-router";
 // 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
 
-/**引入组件*/
+/** 引入组件 */
 const EditDialog = defineAsyncComponent(() => import('./components/form-edit.vue'))
 const SearchHistory = defineAsyncComponent(() => import('./components/search-history.vue'))
-
 const DownloadDialog = defineAsyncComponent(() => import('./components/table-download.vue'))
-// import {pageInput} from "/@/api/admin/shareDto/shareDto";
+
+// 组件引用
 const editDialogRef = ref()
 const downloadDialogRef = ref()
 const SearchHistoryRef = ref()
+const downloadLink = ref()
 
-
-
-
-/**获取全局缓存*/
+/** 获取全局缓存 */
 const globalCacheStore = useGlobalCacheStore()
-/**设备类型缓存*/
+/** 设备类型缓存 */
 const equipmentType = ref(globalCacheStore.getGlobalStore().get('equipmentType'))
-/**软件类型缓存*/
+/** 软件类型缓存 */
 const softwareType = ref(globalCacheStore.getGlobalStore().get('softwareType'))
-/**软件包状态缓存*/
+/** 软件包状态缓存 */
 const softwarePackageStatus = ref(globalCacheStore.getGlobalStore().get('softwarePackageStatus'))
 
-/**软件包管理对象*/
+/** 软件包管理对象 */
 const softwareData = reactive({
   time: '',
-  /**加载显示 */
+  /** 加载显示 */
   loading: false,
-  /**条件查询模块 */
+  /** 条件查询模块 */
   Filter: {
-    /**软件类型 */
+    /** 软件类型 */
     softwareType: "",
     // 项目名称
     projectName: "",
     projectCode: "",
-    /**软件名称 */
+    /** 软件名称 */
     softwareName: "",
-    /**版本 */
+    /** 版本 */
     version: "",
-    /**设备类型*/
+    /** 设备类型 */
     equipmentType: "",
-    /**开始的时间 */
+    /** 状态 0-待发布 1-已发布 2-失效 */
+    state: undefined,
+    /** 开始的时间 */
     BeginTime: null,
-    /**开始的时间 */
+    /** 结束的时间 */
     EndTime: null,
-  } as softwarePackageManagement_SearchFilter,
-  /**表格信息 */
+  } as unknown as softwarePackageManagement_SearchFilter,
+  /** 表格信息 */
   tableModel: [] as unknown as softwarePackageManagement_TableData,
-  /**动态表头 */
+  /** 动态表头 */
   dynamicColumns: [
     { prop: 'date', label: '日期' },
     { prop: 'projectName', label: '项目名称' },
@@ -216,22 +224,21 @@ const softwareData = reactive({
     { prop: 'digitalSignature', label: '数字签名' },
     { prop: 'explain', label: '软件包更新说明' },
   ],
-  /**分页标识 */
+  /** 分页标识 */
   pageInput: {
     CurrentPage: 1,
     PageSize: 10,
   } as pageInput,
-  /**分页总数 */
+  /** 分页总数 */
   total: 0,
 } as unknown as softwarePackageManagement_AllDto)
 
-const downloadLink = ref()
-/**条件查询 */
+/** 条件查询 */
 const onQuery = () => {
   init()
 }
 
-/**将Filter对象成.的连接方式*/
+/** 将Filter对象转为.的连接方式 */
 const flattenObject = (obj, parentKey = '') => {
   const result = {};
   for (const key in obj) {
@@ -245,18 +252,24 @@ const flattenObject = (obj, parentKey = '') => {
       }
     }
   }
-
   return result;
 }
 
-/**初始化 */
+/** 初始化数据加载 */
 const init = async () => {
   softwareData.loading = true
-  const query = flattenObject({ Filter: softwareData.Filter })
-  const res: any = await new SoftwarePackageManagementApi().getPageData({ ...softwareData.pageInput, Filter: softwareData.Filter })
-  softwareData.tableModel = res?.data?.list ?? []
-  softwareData.total = res?.data?.total ?? 0
-  softwareData.loading = false
+  try {
+    const res: any = await new SoftwarePackageManagementApi().getPageData({ 
+      ...softwareData.pageInput, 
+      Filter: softwareData.Filter 
+    })
+    softwareData.tableModel = res?.data?.list ?? []
+    softwareData.total = res?.data?.total ?? 0
+  } catch (error) {
+    console.error('数据加载失败:', error)
+  } finally {
+    softwareData.loading = false
+  }
 }
 
 const route = useRoute()
@@ -271,28 +284,29 @@ onMounted(() => {
     softwareData.Filter.projectCode = route.query.projectCode as string
   }
   init()
+  
   eventBus.off('refreshView')
   eventBus.on('refreshView', async () => {
     await init()
   })
-  console.log()
-  
 })
 
 onBeforeMount(() => {
   eventBus.off('refreshView')
 })
 
-/**
- * 监听时间变换
- */
+/** 监听时间变换 */
 watch(() => softwareData.time, (newVal) => {
-  if (newVal.length === 0) {
-    return
+  if (newVal && newVal.length === 2) {
+    softwareData.Filter.BeginTime = newVal[0].toString()
+    softwareData.Filter.EndTime = newVal[1].toString()
+  } else {
+    softwareData.Filter.BeginTime = null
+    softwareData.Filter.EndTime = null
   }
-  softwareData.Filter.BeginTime = newVal?.[0].toString()
-  softwareData.Filter.EndTime = newVal?.[1].toString()
 })
+
+/** 监听路由参数变化 */
 watch(
   () => route.query,
   (newQuery) => {
@@ -306,7 +320,8 @@ watch(
   },
   { immediate: true } // 立即执行
 )
-/**重置查询条件 */
+
+/** 重置查询条件 */
 const resetQuery = () => {
   softwareData.Filter.softwareType = ''
   softwareData.Filter.projectCode = ''
@@ -314,123 +329,127 @@ const resetQuery = () => {
   softwareData.Filter.softwareName = ''
   softwareData.Filter.version = ''
   softwareData.Filter.equipmentType = ''
-  softwareData.Filter.BeginTime = ''
-  softwareData.Filter.EndTime = ''
+  softwareData.Filter.state = null
+  softwareData.Filter.BeginTime = null
+  softwareData.Filter.EndTime = null
   softwareData.time = ''
   softwareData.pageInput.CurrentPage = 1
 }
 
-/**重置 */
+/** 重置按钮事件 */
 const onReset = () => {
   resetQuery()
   init()
 }
 
-/**添加*/
+/** 添加软件包 */
 const onAdd = () => {
   editDialogRef.value.openDialog()
 }
 
-/**编辑弹窗 */
+/** 编辑软件包 */
 const editTableData = (row) => {
   editDialogRef.value.openDialog(row)
 }
 
-/**历史版本弹窗 */
+/** 查看历史版本 */
 const searchHistory = (row) => {
   SearchHistoryRef.value.openDialog(row.guid)
 }
 
-/**发布*/
-const onRelease = (row) => {
-  //downloadUrl
+/** 发布软件包 */
+const onRelease = async (row) => {
   softwareData.loading = true;
-  (row as softwarePackageManagement_TableData).state = 1
-  var RowData = JSON.parse(JSON.stringify(row))
-  var res = new SoftwarePackageManagementApi().addData(RowData as softwarePackageManagement_TableData)
-  softwareData.loading = false
+  try {
+    const RowData = JSON.parse(JSON.stringify(row))
+    RowData.state = 1 // 设置为已发布状态
+    await new SoftwarePackageManagementApi().addData(RowData as softwarePackageManagement_TableData)
+    // 重新加载数据
+    init()
+  } catch (error) {
+    console.error('发布失败:', error)
+  } finally {
+    softwareData.loading = false
+  }
 }
 
-/**下载*/
-const onDownload = (row) => {
+/** 下载软件包 */
+const onDownload = async (row) => {
   softwareData.loading = true;
-  var RowData = JSON.parse(JSON.stringify(row))
-  const params = RowData as softwarePackageManagement_TableData
-  //const link = downloadLink.value;
-  //const url = `http://localhost:8000/api/app/software/download-file`;
-  //link.href = url;
-  //link.click();
-  const filename = params.fileName?.toString();
-  const { userInfos } = storeToRefs(useUserInfo());
-  const accessToken = userInfos.value.token
-  const token = `Bearer ${accessToken}`
-  var myHeaders = new Headers();
-  myHeaders.append("Authorization", token);
-
-  const requestOptions: RequestInit = {
-    method: 'GET',
-    headers: myHeaders,
-    redirect: 'follow', // 此处使用枚举值 'follow'
-  };
-
-  /* var res =  new SoftwarePackageManagementApi().DownloadFile(row as softwarePackageManagement_TableData) */
-  const fileUrl = import.meta.env.VITE_API_URL + '/api/app/software/download-file?guid=' + params.guid; // 替换为实际文件URL
-  fetch(fileUrl, requestOptions)
-    .then(response => response.blob())
-    .then(blob => {
-      const link = document.createElement('a');
-      link.href = URL.createObjectURL(blob);
-      link.download = filename;
-      link.click();
-      softwareData.loading = false
-    })
-    .catch(error => {
-      console.error('下载失败:', error);
-      softwareData.loading = false
-    });
-  // var res =  new SoftwarePackageManagementApi().DownloadFile(RowData as softwarePackageManagement_TableData)
-
+  try {
+    const params = row as softwarePackageManagement_TableData
+    const filename = params.fileName?.toString();
+    const { userInfos } = storeToRefs(useUserInfo());
+    const accessToken = userInfos.value.token
+    const token = `Bearer ${accessToken}`
+    
+    const myHeaders = new Headers();
+    myHeaders.append("Authorization", token);
+
+    const requestOptions: RequestInit = {
+      method: 'GET',
+      headers: myHeaders,
+      redirect: 'follow'
+    };
+
+    const fileUrl = import.meta.env.VITE_API_URL + '/api/app/software/download-file?guid=' + params.guid;
+    const response = await fetch(fileUrl, requestOptions)
+    const blob = await response.blob()
+    
+    const link = document.createElement('a');
+    link.href = URL.createObjectURL(blob);
+    link.download = filename || 'software_package';
+    link.click();
+    
+    // 释放URL对象
+    URL.revokeObjectURL(link.href);
+  } catch (error) {
+    console.error('下载失败:', error);
+  } finally {
+    softwareData.loading = false
+  }
 }
 
-/**失效*/
-const onFailure = (row) => {
+/** 失效软件包 */
+const onFailure = async (row) => {
   softwareData.loading = true;
-  (row as softwarePackageManagement_TableData).state = 2
-  var RowData = JSON.parse(JSON.stringify(row))
-  var res = new SoftwarePackageManagementApi().addData(RowData as softwarePackageManagement_TableData)
-  softwareData.loading = false
+  try {
+    const RowData = JSON.parse(JSON.stringify(row))
+    RowData.state = 2 // 设置为失效状态
+    await new SoftwarePackageManagementApi().addData(RowData as softwarePackageManagement_TableData)
+    // 重新加载数据
+    init()
+  } catch (error) {
+    console.error('设置失效失败:', error)
+  } finally {
+    softwareData.loading = false
+  }
 }
 
-/**下载记录*/
+/** 查看下载记录 */
 const onDownloadRecord = (id) => {
   downloadDialogRef.value.openDialog(id)
-  //alert('下载记录')
 }
 
-/**页条数变化*/
+/** 页条数变化 */
 const onSizeChange = () => {
   init()
 }
 
-/**页数变化*/
+/** 页数变化 */
 const onCurrentChange = () => {
   init()
 }
 
-/**过滤数字的属性*/
+/** 处理表格数据显示 */
 const getProp = (val, row) => {
-  //debugger
-  // var sss = row[val];
-  // var fdsdfsd = String(row[val]);
-  //if(!row[val]) return null
   if (val === 'softwareType') return softwareType.value.get(String(row[val])).name
   if (val === 'equipmentType') return equipmentType.value.get(String(row[val])).name
   if (val === 'state') return softwarePackageStatus.value.get(String(row[val])).name
-  // <StatusBox :status="softwarePackageStatus.value.get(String(row[val])).name" />
-
   return row[val]
 }
 
+/** 获取状态显示颜色 */
 const getColor = (val, row) => {
   if (val === 'state') {
     const code = softwarePackageStatus.value.get(String(row[val])).code.split('_')
@@ -439,7 +458,6 @@ const getColor = (val, row) => {
   return {}
 }
 
-
 // 状态映射表 
 const statusMap = {
   "0": { name: "待发布"}, 
@@ -459,14 +477,13 @@ const getStatusInfo = (status: string) => {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  width: 88px;
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
+/* 数据表头样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
@@ -474,4 +491,34 @@ const getStatusInfo = (status: string) => {
 .el-link {
   padding: 5px;
 }
+
+/* 按钮区域样式 */
+.submit-button {
+  margin-top: 16px;
+}
+
+/* 操作列样式调整 */
+.right-operation {
+  ::v-deep .el-table__cell {
+    padding: 8px 0 !important;
+  }
+}
+
+.my-el-link {
+  &:hover {
+    opacity: 0.8;
+  }
+}
+
+/* 数字签名显示样式 - 仅显示两行 */
+.signature-truncated {
+  display: -webkit-box;
+  -webkit-line-clamp: 2; /* 限制显示2行 */
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100%;
+  word-break: break-all; /* 处理长单词和URL */
+  line-height: 1.5; /* 适当调整行高 */
+}
 </style>

+ 18 - 18
admin.ui.plus-master/src/views/admin/product/qrBook/index.vue

@@ -8,31 +8,31 @@
                         <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="qrBookData.Filter.Author" placeholder="单行输入"
+                                    <el-input v-model="qrBookData.Filter.Author" 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="qrBookData.Filter.FileName" placeholder="单行输入"
+                                    <el-input v-model="qrBookData.Filter.FileName" 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="qrBookData.Filter.ProjectName" placeholder="单行输入"
+                                    <el-input v-model="qrBookData.Filter.ProjectName" 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-select  placeholder="请选择上传状态">
-                                   <el-option label="所有" :value="''"></el-option>
-                                   <el-option label="开启" :value="''"></el-option>
-                                   <el-option label="关闭" :value="''"></el-option>
+                                  <el-select v-model="qrBookData.Filter.status" placeholder="请选择上传状态" clearable>
+                                   <el-option label="所有" :value=null></el-option>
+                                   <el-option label="开启" :value="1"></el-option>
+                                   <el-option label="关闭" :value="0"></el-option>
                                  </el-select>
                              </el-form-item>
                            </el-col>
@@ -60,7 +60,7 @@
                             <el-button type="primary" icon="ele-RefreshRight" @click="clear">重置</el-button>
                         </el-row>
                         <el-row>
-                            <el-button type="primary" icon="ele-CirclePlus" @click="uploadDialog">上传说明书</el-button>
+                            <el-button type="primary" icon="ele-Plus" @click="uploadDialog">上传说明书</el-button>
                         </el-row>
                     </el-row>
                 </el-card>
@@ -151,11 +151,11 @@ const qrBookData = reactive({
     Filter: {
         Author: "",
         FileName: "",
-        ProjectName:"",
-        status:'',
+        ProjectName: "",
+        status: null, // 绑定状态筛选值
         StartTime: null,
         EndTime: null
-    } as QRBookFilter,
+    } as unknown as QRBookFilter,
     // 表数据
     tableModel: [] as QRBookPageSearchResponse[],
     // 表头
@@ -188,6 +188,7 @@ const getData = async () => {
         "Filter.Author": qrBookData.Filter.Author,
         "Filter.FileName": qrBookData.Filter.FileName,
         "Filter.ProjectName": qrBookData.Filter.ProjectName,
+        "Filter.status": qrBookData.Filter.status,  // 传递状态筛选条件
         "Filter.StartTime": qrBookData.Filter.StartTime,
         "Filter.EndTime": qrBookData.Filter.EndTime
     })
@@ -198,15 +199,14 @@ const getData = async () => {
 
 //清除查询条件
 const clear = () => {
-    qrBookData.time='',
+    qrBookData.time = '',
     qrBookData.Filter = {
         Author: "",
         FileName: "",
-        // status:"",
-    /** 开始查询时间 */
-    StartTime:null,
-    /** 结束查询时间 */
-    EndTime:null,
+        ProjectName: "",
+        status: null, 
+        StartTime: null,
+        EndTime: null,
     } 
     getData()
 }
@@ -314,4 +314,4 @@ const getStatusInfo = (status: string) => {
 ::v-deep .el-table th.el-table__cell {
     background-color: #F6F6F6;
 }
-</style>
+</style>

+ 5 - 5
admin.ui.plus-master/src/views/admin/product/record/index.vue

@@ -9,17 +9,17 @@
             <el-form-item class="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="bomModel.filterModel.bomMateNo" placeholder="物料号" clearable></el-input>
+                  <el-input v-model="bomModel.filterModel.bomMateNo" 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="bomModel.filterModel.bomProNo" placeholder="生产编码" clearable></el-input>
+                  <el-input v-model="bomModel.filterModel.bomProNo" 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="bomModel.filterModel.bomName" placeholder="部件名称" clearable></el-input>
+                  <el-input v-model="bomModel.filterModel.bomName" placeholder="请输入部件名称" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -33,13 +33,13 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="厂商">
-                  <el-input v-model.trim="bomModel.filterModel.manufacturer" placeholder="厂商" clearable></el-input>
+                  <el-input v-model.trim="bomModel.filterModel.manufacturer" 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.trim="bomModel.filterModel.barcode" placeholder="条码" clearable></el-input>
+                  <el-input v-model.trim="bomModel.filterModel.barcode" placeholder="请输入条码" clearable></el-input>
                 </el-form-item>
               </el-col>
             </el-form-item>

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

@@ -9,12 +9,12 @@
             <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.filterModel.bomMateNo" placeholder="物料编号" clearable></el-input>
+                  <el-input v-model="state.filterModel.bomMateNo" 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.filterModel.bomName" placeholder="部件名称" clearable></el-input>
+                  <el-input v-model="state.filterModel.bomName" placeholder="请输入部件名称" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">

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

@@ -8,7 +8,7 @@
             <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="Data.Filter.name" placeholder="用户名" clearable></el-input>
+                  <el-input v-model="Data.Filter.name" placeholder="请输入用户名" clearable></el-input>
                 </el-form-item>
               </el-col>
             </el-form-item>

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

@@ -7,9 +7,9 @@
         <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="6" :xl="4" 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-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">

+ 266 - 171
admin.ui.plus-master/src/views/admin/statement/oilEngineDetails/index.vue

@@ -1,8 +1,7 @@
-<!--油机详情页面-->
 <template>
   <div class="layout-pd oilInfo">
     <el-row>
-      <!--基本信息-->
+      <!-- 基本信息 -->
       <el-col :xs="24">
         <el-card class="mt8" header="基本信息" shadow="hover">
           <div class="basicInformation" v-loading="basicInfo.loading">
@@ -148,7 +147,7 @@
             </div>
             <div class="basicInformation-right">
               <div @click="showBigPic(basicInfo.imgurl)">
-                <el-image loading="lazy" alt="fgg" class="img" fit="contain" :src="basicInfo.imgurl">
+                <el-image loading="lazy" alt="油机图片" class="img" fit="contain" :src="getImageUrl(basicInfo.imgurl)">
                   <template #error>
                     <div class="image-slot">
                       <el-icon><icon-picture /></el-icon>
@@ -161,9 +160,9 @@
         </el-card>
       </el-col>
 
-      <!--报警历史-->
+      <!-- 报警历史 -->
       <el-col :xs="24">
-        <el-card class="mt8 my-fill" shadow="hover" header="报警历史" :style="{ height: '45vh' }" >
+        <el-card class="mt8 my-fill" shadow="hover" header="报警历史" :style="{ height: '45vh' }">
           <el-table v-loading="alarmHistory.loading" stripe :data="alarmHistory.list" row-key="id" style="width: 100%">
             <el-table-column prop="createdDate" label="时间" />
             <el-table-column prop="gasStation" label="加油站" />
@@ -194,26 +193,34 @@
         </el-card>
       </el-col>
 
-      <!-- 生产日志
+      <!-- 维修记录 -->
       <el-col :xs="24">
-        <el-card class="mt8 my-fill" shadow="hover" header="生命周期" :style="{ height: '45vh' }">
-          <el-table v-loading="lifeCycle.loading" stripe :data="lifeCycle.list" row-key="id" style="width: 100%">
-            <el-table-column prop="createdDate" label="时间" />
-            <el-table-column prop="operator" label="操作人" />
-            <el-table-column prop="operatorID" label="操作人ID" />
-            <el-table-column prop="operation" label="操作" />
+        <el-card class="mt8 my-fill" shadow="hover" header="维修记录" :style="{ height: '45vh' }">
+          <el-table v-loading="maintenanceRecord.loading" stripe :data="maintenanceRecord.list" row-key="id" style="width: 100%">
+            <el-table-column prop="createdDate" label="维修时间" />
+            <el-table-column prop="stationName" label="站点名称" />
+            <el-table-column prop="type" label="维修类型" />
+            <el-table-column prop="description" label="维修描述" />
           </el-table>
           <div class="my-flex my-flex-end" style="margin-top: 20px">
-            <el-pagination v-model:currentPage="lifeCycle.pageInput.currentPage"
-              v-model:page-size="lifeCycle.pageInput.pageSize" :default-page-size="5" :total="lifeCycle.total"
-              :page-sizes="[5, 10, 15, 20, 50, 100]" small background @size-change="onLifeCycleSizeChange"
-              @current-change="onLifeCycleCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+            <el-pagination 
+              v-model:currentPage="maintenanceRecord.pageInput.currentPage"
+              v-model:page-size="maintenanceRecord.pageInput.pageSize" 
+              :default-page-size="5" 
+              :total="maintenanceRecord.total"
+              :page-sizes="[5, 10, 15, 20, 50, 100]" 
+              small 
+              background 
+              @size-change="onMaintenanceSizeChange"
+              @current-change="onMaintenanceCurrentChange" 
+              layout="total, sizes, prev, pager, next, jumper" 
+            />
           </div>
         </el-card>
-      </el-col> -->
+      </el-col>
     </el-row>
     <el-dialog v-model="bigImgDto.isShow" :close-on-click-modal="true" :show-close="false" width="80%">
-      <img :src="bigImgDto.imgurl" class="fullscreen-image" alt="放大的图片" />
+      <img :src="getImageUrl(bigImgDto.imgurl)" class="fullscreen-image" alt="放大的油机图片" />
     </el-dialog>
   </div>
 </template>
@@ -224,36 +231,38 @@ import { onMounted, reactive, ref } from "vue";
 import { OilEngineDetailsApi } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsApi";
 import router from "/@/router";
 import { FuelDispenserEntity, PageInputAlarmHistoryDto, AlarmHistoryDto, PageInputLifeCycleDto, LifeCycleDto } from "/@/api/admin/reportManagement/oilEngineDetails/oilEngineDetailsDto"
-import imgurl from "/@/assets/oilpngpng.png";
+import defaultImg from "/@/assets/oilpngpng.png";
+// 导入维修记录接口
+import { Api as MaintenanceApi } from "/@/api/admin/PCBA/repairList"; // 根据实际路径调整
+
+// 维修记录数据类型定义
+interface MaintenanceRecordDto {
+  id: number;
+  createdDate: string; // 维修时间
+  type: string; // 维修类型
+  description: string; // 维修描述
+  stationName: string; // 站点名称
+}
 
+interface PageInputMaintenanceDto {
+  currentPage: number;
+  pageSize: number;
+}
 
 /******************************数据对象***************************************/
-
-/**
- * 获取当前环境请求的URL前缀
- */
 const baseUrl = import.meta.env.VITE_API_URL
 
-/**
- * 显示大图数据对象
- */
 const bigImgDto = reactive({
   isShow: false,
-  imgurl
+  imgurl: ''
 })
 
-/**
- * 油机详情 - 基本信息 - 数据对象
- */
 const basicInfo = reactive({
   loading: false,
   info: {} as FuelDispenserEntity,
-  imgurl
+  imgurl: ''
 })
 
-/**
- * 油机详情 - 报警历史 - 数据对象
- */
 const alarmHistory = reactive({
   loading: false,
   list: [] as Array<AlarmHistoryDto>,
@@ -263,14 +272,10 @@ const alarmHistory = reactive({
   } as PageInputAlarmHistoryDto,
   total: 0,
   Filter: {
-    /**油机id */
     fuelId: 0
   }
 })
 
-/**
- * 油机详情 - 生命周期 - 数据对象
- */
 const lifeCycle = reactive({
   loading: false,
   list: [] as Array<LifeCycleDto>,
@@ -280,173 +285,243 @@ const lifeCycle = reactive({
   } as PageInputLifeCycleDto,
   total: 0,
   Filter: {
-    /**油机id */
     fuelId: 0
   }
 })
 
-/***************************数据对象***************************************/
-
+// 维修记录数据对象
+const maintenanceRecord = reactive({
+  loading: false,
+  list: [] as Array<MaintenanceRecordDto>,
+  pageInput: {
+    currentPage: 1,
+    pageSize: 5
+  } as PageInputMaintenanceDto,
+  total: 0
+})
 
 /*******************************方法**************************************/
+/**
+ * 处理图片URL,解决显示问题
+ */
+const getImageUrl = (imgPath: string) => {
+  // 如果没有图片路径,返回默认图片
+  if (!imgPath) {
+    return defaultImg;
+  }
+  
+  // 如果是完整URL,直接返回
+  if (imgPath.startsWith('http://') || imgPath.startsWith('https://')) {
+    return imgPath;
+  }
+  
+  // 处理相对路径,拼接baseUrl
+  // 避免重复添加斜杠
+  const base = baseUrl.endsWith('/') ? baseUrl : baseUrl + '/';
+  const path = imgPath.startsWith('/') ? imgPath.substring(1) : imgPath;
+  return base + path;
+}
 
 /**
  * 展示大图
- * @param val
  */
-const showBigPic = (val) => {
-  if (val) {
-    bigImgDto.imgUrl = val
-  } else {
-    bigImgDto.imgUrl = ''
-  }
-  bigImgDto.isShow = true
+const showBigPic = (val: string) => {
+  bigImgDto.imgurl = val;
+  bigImgDto.isShow = true;
 }
 
 /**
  * 查看更多
  */
 const toPage = () => {
-  const id = router.currentRoute.value.params.id
+  const id = router.currentRoute.value.params.id;
   router.push({
     path: `/statement/${id}/more`
-  })
+  });
 }
+
 /**
  * 格式化日期
  */
-const formatDate = (val) => {
-  const date = new Date(val)
-  const year: number = date.getFullYear();
-  const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
-  const day: string = date.getDate().toString().padStart(2, '0');
-  const hours: string = date.getHours().toString().padStart(2, '0');
-  const minutes: string = date.getMinutes().toString().padStart(2, '0');
-  const seconds: string = date.getSeconds().toString().padStart(2, '0');
-  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-/**
- * 油机详情 - 报警历史 - 页条变化
- * @param val
- */
-const onAlarmHistorySizeChange = (val) => {
-  alarmHistory.pageInput.pageSize = val
-  getAlarmHistory()
+const formatDate = (val: string) => {
+  if (!val) return '';
+  try {
+    const date = new Date(val);
+    const year: number = date.getFullYear();
+    const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
+    const day: string = date.getDate().toString().padStart(2, '0');
+    const hours: string = date.getHours().toString().padStart(2, '0');
+    const minutes: string = date.getMinutes().toString().padStart(2, '0');
+    const seconds: string = date.getSeconds().toString().padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  } catch (error) {
+    console.error('日期格式化失败:', error);
+    return val;
+  }
 }
 
 /**
- * 油机详情 - 报警历史 - 页码变化
- * @param val
+ * 报警历史分页事件
  */
-const onAlarmHistoryCurrentChange = (val) => {
-  alarmHistory.pageInput.currentPage = val
-  getAlarmHistory()
+const onAlarmHistorySizeChange = (val: number) => {
+  alarmHistory.pageInput.pageSize = val;
+  getAlarmHistory();
 }
 
-/**
- * 油机详情 - 生命周期 - 页条变化
- * @param val
- */
-const onLifeCycleSizeChange = (val) => {
-  lifeCycle.pageInput.pageSize = val
-  getLifeCycle()
+const onAlarmHistoryCurrentChange = (val: number) => {
+  alarmHistory.pageInput.currentPage = val;
+  getAlarmHistory();
 }
 
 /**
- * 油机详情 - 生命周期 - 页码变化
- * @param val
+ * 生命周期分页事件
  */
-const onLifeCycleCurrentChange = (val) => {
-  lifeCycle.pageInput.currentPage = val
-  getLifeCycle()
+const onLifeCycleSizeChange = (val: number) => {
+  lifeCycle.pageInput.pageSize = val;
+  getLifeCycle();
 }
 
-/*********************************方法************************************/
-
-
-/**********************************初始化***********************************/
+const onLifeCycleCurrentChange = (val: number) => {
+  lifeCycle.pageInput.currentPage = val;
+  getLifeCycle();
+}
 
 /**
- * 获取 油机详情 - 基本信息 - 数据对对象
+ * 维修记录分页事件
  */
-const flag = ref('')
-const getBasicInfo = async () => {
-  basicInfo.loading = true
-  basicInfo.imgUrl = baseUrl + '/' + basicInfo.imgUrl
-  const fuelId = router.currentRoute.value.params.id
-  const { data } = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: fuelId })
-  basicInfo.info = data
-
-  localStorage.setItem('name', data.gasStation)
+const onMaintenanceSizeChange = (val: number) => {
+  maintenanceRecord.pageInput.pageSize = val;
+  getMaintenanceRecord();
+}
 
+const onMaintenanceCurrentChange = (val: number) => {
+  maintenanceRecord.pageInput.currentPage = val;
+  getMaintenanceRecord();
+}
 
-  if (basicInfo.info.createdTime !== null) {
-    basicInfo.info.createdTime = formatDate(basicInfo.info.createdTime)
-  }
-  if (basicInfo.info.installationDate !== null) {
-    basicInfo.info.installationDate = formatDate(basicInfo.info.installationDate)
-  }
-  if (basicInfo.info.startupDate !== null) {
-    basicInfo.info.startupDate = formatDate(basicInfo.info.startupDate)
-  }
-  if (basicInfo.info.modifiedTime !== null) {
-    basicInfo.info.modifiedTime = formatDate(basicInfo.info.modifiedTime)
-  }
-  if (basicInfo.info.onlineStatus !== null) {
+/*********************************数据获取方法************************************/
+const getBasicInfo = async () => {
+  basicInfo.loading = true;
+  try {
+    const fuelId = router.currentRoute.value.params.id;
+    const { data } = await new OilEngineDetailsApi().getBasicInfoDto({ Fuelid: fuelId });
+    basicInfo.info = data;
+    
+    // 存储加油站名称
+    localStorage.setItem('name', data.gasStation || '');
+    
+    // 处理图片路径
+    basicInfo.imgurl = data.imgurl || '';
+    
+    // 日期格式化
+    if (basicInfo.info.createdTime) basicInfo.info.createdTime = formatDate(basicInfo.info.createdTime);
+    if (basicInfo.info.installationDate) basicInfo.info.installationDate = formatDate(basicInfo.info.installationDate);
+    if (basicInfo.info.startupDate) basicInfo.info.startupDate = formatDate(basicInfo.info.startupDate);
+    if (basicInfo.info.modifiedTime) basicInfo.info.modifiedTime = formatDate(basicInfo.info.modifiedTime);
+    
+    // 状态文本转换
     if (basicInfo.info.onlineStatus === 'offline') {
-      basicInfo.info.onlineStatus = '离线'
-    } else {
-      basicInfo.info.onlineStatus = '在线'
+      basicInfo.info.onlineStatus = '离线';
+    } else if (basicInfo.info.onlineStatus) {
+      basicInfo.info.onlineStatus = '在线';
     }
-  }
-  if (basicInfo.info.deviceStatus !== null) {
+    
     if (basicInfo.info.deviceStatus === 'enable') {
-      basicInfo.info.deviceStatus = '启用'
+      basicInfo.info.deviceStatus = '启用';
     } else if (basicInfo.info.deviceStatus === 'factory') {
-      basicInfo.info.deviceStatus = '出厂注册'
-    } else {
-      basicInfo.info.deviceStatus = '备案'
+      basicInfo.info.deviceStatus = '出厂注册';
+    } else if (basicInfo.info.deviceStatus) {
+      basicInfo.info.deviceStatus = '备案';
     }
+  } catch (error) {
+    console.error('获取基本信息失败:', error);
+  } finally {
+    basicInfo.loading = false;
   }
-  basicInfo.loading = false
 }
 
-/**
- * 获取 油机详情 - 报警历史 - 数据对对象
- */
 const getAlarmHistory = async () => {
-  alarmHistory.loading = true
-  alarmHistory.Filter.fuelId = router.currentRoute.value.params.id
-  const { data } = await new OilEngineDetailsApi().getAlarmHistoryDto({ ...alarmHistory.pageInput, filter: alarmHistory.Filter })
-  alarmHistory.total = data.total
-  alarmHistory.list = data.list
-  alarmHistory.loading = false
+  alarmHistory.loading = true;
+  try {
+    alarmHistory.Filter.fuelId = router.currentRoute.value.params.id;
+    const { data } = await new OilEngineDetailsApi().getAlarmHistoryDto({ 
+      ...alarmHistory.pageInput, 
+      filter: alarmHistory.Filter 
+    });
+    alarmHistory.total = data.total;
+    alarmHistory.list = data.list;
+  } catch (error) {
+    console.error('获取报警历史失败:', error);
+    alarmHistory.list = [];
+    alarmHistory.total = 0;
+  } finally {
+    alarmHistory.loading = false;
+  }
 }
 
-/**
- * 获取 油机详情 - 生命周期 - 数据对对象
- */
 const getLifeCycle = async () => {
-  lifeCycle.loading = true
-  lifeCycle.Filter.fuelId = router.currentRoute.value.params.id
-  const { data } = await new OilEngineDetailsApi().getLifeCycleDto({ ...lifeCycle.pageInput, filter: lifeCycle.Filter })
-  lifeCycle.total = data.total
-  lifeCycle.list = data.list
-  lifeCycle.loading = false
+  lifeCycle.loading = true;
+  try {
+    lifeCycle.Filter.fuelId = router.currentRoute.value.params.id;
+    const { data } = await new OilEngineDetailsApi().getLifeCycleDto({ 
+      ...lifeCycle.pageInput, 
+      filter: lifeCycle.Filter 
+    });
+    lifeCycle.total = data.total;
+    lifeCycle.list = data.list;
+  } catch (error) {
+    console.error('获取生命周期数据失败:', error);
+    lifeCycle.list = [];
+    lifeCycle.total = 0;
+  } finally {
+    lifeCycle.loading = false;
+  }
 }
 
 /**
- * 初始化
+ * 获取维修记录数据
  */
-onMounted(() => {
-  getBasicInfo()
-  getAlarmHistory()
-  getLifeCycle()
-})
+const getMaintenanceRecord = async () => {
+  maintenanceRecord.loading = true;
+  try {
+    const fuelId = router.currentRoute.value.params.id;
+    // 构造请求参数
+    const requestData = {
+      ...maintenanceRecord.pageInput,
+      fuelId: fuelId
+    };
+    
+    // 调用维修记录接口
+    const maintenanceApi = new MaintenanceApi();
+    const response = await maintenanceApi.getList(requestData);
+    
+    // 处理接口返回数据
+    if (response && response.items && Array.isArray(response.items)) {
+      maintenanceRecord.list = response.items.map(item => ({
+        ...item,
+        createdDate: formatDate(item.createdDate)
+      }));
+      maintenanceRecord.total = response.total || 0;
+    } else {
+      maintenanceRecord.list = [];
+      maintenanceRecord.total = 0;
+    }
+  } catch (error) {
+    console.error('获取维修记录失败:', error);
+    maintenanceRecord.list = [];
+    maintenanceRecord.total = 0;
+  } finally {
+    maintenanceRecord.loading = false;
+  }
+}
 
 /*********************************初始化************************************/
-
-
+onMounted(() => {
+  getBasicInfo();
+  getAlarmHistory();
+  getLifeCycle();
+  getMaintenanceRecord();
+});
 </script>
 
 <style scoped lang="scss">
@@ -454,36 +529,40 @@ onMounted(() => {
   font-weight: 500;
 
   .basicInformation {
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: space-between;
-
-  .basicInformation-left {
-    flex: 1;
-    min-width: 300px;
-    max-width: calc(100% - 320px); /* 图片区域留出空间 */
-    display: grid;
-    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
-    gap: 10px 20px;
-    align-content: start;
-    
-    .item {
-      min-width: 0; /* 防止内容溢出 */
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+
+    .basicInformation-left {
+      flex: 1;
+      min-width: 300px;
+      max-width: calc(100% - 320px);
+      display: grid;
+      grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+      gap: 10px 20px;
+      align-content: start;
+      
+      .item {
+        min-width: 0;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
     }
-  }
 
-  .basicInformation-right {
-    flex: 0 0 300px;
-    padding: 0 10px;
-    /* 保持原有图片样式 */
+    .basicInformation-right {
+      flex: 0 0 300px;
+      padding: 0 10px;
 
       .img {
         width: 220px;
         height: 170px;
         cursor: pointer;
+        transition: transform 0.3s ease;
+      }
+      
+      .img:hover {
+        transform: scale(1.02);
       }
 
       .image-slot {
@@ -508,5 +587,21 @@ onMounted(() => {
     max-height: 80vh;
     object-fit: contain;
   }
+  
+  .my-fill {
+    display: flex;
+    flex-direction: column;
+  }
+  
+  .el-table {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+  }
+  
+  .el-table__body-wrapper {
+    flex: 1;
+    overflow: auto;
+  }
 }
 </style>

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

@@ -9,17 +9,17 @@
             <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.errorCode" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.errorCode" 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.module" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.module" 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-select placeholder="请输入在线状态">
+                <el-select placeholder="请输入严重程度">
                   <el-option label="所有" :value="''"></el-option>
                   <el-option label="轻微" :value="'轻'"></el-option>
                   <el-option label="普通" :value="'普'"></el-option>

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

@@ -124,7 +124,10 @@ tableModel: [] as MaintenanceDto,
 { prop: 'status', label: '维修状态' },
 { prop: 'type', label: '维修类型' },
 { prop: 'description', label: '维修描述' },
-{ prop: 'stationName', label: '站点名称' },],
+{ prop: 'stationName', label: '站点名称' },
+{ prop: 'createdDate', label: '创建时间' },
+
+],
 /**分页标识 */
     pageInput:{
       CurrentPage: 1,

+ 444 - 135
admin.ui.plus-master/src/views/admin/yujing/alarmRules/Level.vue

@@ -1,22 +1,16 @@
-
 <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.alarmLevelName" 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.conditionsJson" 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-select v-model="state.filter.isActive" placeholder="请选择启用状态" clearable>
@@ -25,44 +19,40 @@
                   </el-select>
                 </el-form-item>
               </el-col>
-                <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-select 
-  v-model="state.filter.level" 
-  placeholder="请选择报警等级" 
-  clearable>
-  <el-option 
-    v-for="item in state.alarmLevelDict" 
-    :key="item.id" 
-    :label="`${item.name}(${item.value})`" 
-    :value="item.value"
-  >
-</el-option>
-</el-select>
+                  <el-select 
+                    v-model="state.filter.level" 
+                    placeholder="请选择报警等级" 
+                    clearable>
+                    <el-option 
+                      v-for="item in state.alarmLevelDict" 
+                      :key="item.id" 
+                      :label="`${item.name}(${item.value})`" 
+                      :value="item.value"
+                    ></el-option>
+                  </el-select>
                 </el-form-item>
               </el-col>
-
-</el-form-item>
+            </el-form-item>
           </el-form>
 
           <hr>
 
           <el-row class="submit-button">
-<el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-<el-button  type="primary" icon="ele-Plus" @click="openDialog(undefined)"> 添加 </el-button>
-            </el-row>
-</el-card>
+            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+            <el-button type="primary" icon="ele-Plus" @click="openDialog(undefined)"> 添加 </el-button>
+          </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 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="140">
-        <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="140">
+              <template #default="{ row }">
+                <el-link
                   class="my-el-link mr12 ml12"
                   type="primary"
                   icon="ele-EditPen"
@@ -78,10 +68,10 @@
                   :underline="false"
                   target="_blank"
                 >删除</el-link>
-</template>
+              </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"
@@ -94,15 +84,15 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </el-card>
       </el-col>
-</el-row>
+    </el-row>
 
- <!-- 报警等级添加/修改弹窗 -->
+    <!-- 报警等级添加/修改弹窗 -->
     <el-dialog
       v-model="dialogVisible"
       :title="isEdit ? '修改报警等级' : '添加报警等级'"
-      width="500px"
+      width="75%"
       :before-close="handleDialogClose"
     >
       <el-form
@@ -110,49 +100,154 @@
         :model="formData"
         :rules="rules"
         label-width="100px"
+        class="dialog-form"
       >
         <el-form-item label="报警等级名称" prop="alarmLevelName">
           <el-input v-model="formData.alarmLevelName" placeholder="请输入报警等级名称"></el-input>
         </el-form-item>
-<!-- 弹窗中的报警等级下拉框 -->
-<el-form-item label="报警等级" prop="level">
-  <el-select v-model="formData.level" placeholder="请选择报警等级" clearable>
-    <el-option 
-      v-for="item in state.alarmLevelDict" 
-      :key="item.id" 
-      :label="item.name" 
-      :value="item.value"
-    ></el-option>
-  </el-select>
-</el-form-item>
-        <el-form-item label="规则条件" prop="conditionsJson">
-          <el-input v-model="formData.conditionsJson" type="textarea" :rows="4" placeholder="请输入规则条件"></el-input>
+        
+        <!-- 弹窗中的报警等级下拉框 -->
+        <el-form-item label="报警等级" prop="level">
+          <el-select v-model="formData.level" placeholder="请选择报警等级" clearable>
+            <el-option 
+              v-for="item in state.alarmLevelDict" 
+              :key="item.id" 
+              :label="item.name" 
+              :value="item.value"
+            ></el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="是否启用" prop="isActive">
+        
+        <!-- 报警条件配置区域 -->
+        <div class="condition-section">
+          <div class="condition-header">
+            <span class="condition-title">报警条件配置</span>
+            <el-button 
+              type="primary" 
+              icon="ele-Plus" 
+              size="small" 
+              @click="addCondition"
+              class="add-btn"
+            />
+          </div>
+          
+          <!-- 报警条件部分 -->
+          <div v-if="showAlarmConditions" class="conditions-container">
+            <div 
+              v-for="(condition, index) in conditions" 
+              :key="index" 
+              class="condition-item"
+            >
+              <el-form 
+                :inline="true" 
+                @submit.stop.prevent 
+                :model="condition" 
+                :rules="conditionRules"
+                class="condition-form"
+              >
+                <el-form-item 
+                  :label="index === 0 ? '条件:' : '附加条件:'" 
+                  class="condition-label"
+                >
+                  <el-row :gutter="20" class="condition-row">
+                    <!-- 报警设备 -->
+                    <el-col :span="8" class="condition-col">
+                      <div class="condition-field">
+                        <span class="field-name">报警设备:</span>
+                        <el-form-item prop="Left" class="field-input">
+                          <el-select v-model="condition.Left" placeholder="请选择">
+                            <el-option 
+                              v-for="item in alarmEquipment" 
+                              :key="item" 
+                              :label="item" 
+                              :value="item"
+                            />
+                          </el-select>
+                        </el-form-item>
+                      </div>
+                    </el-col>
+                    
+                    <!-- 报警类型 -->
+                    <el-col :span="8" class="condition-col">
+                      <div class="condition-field">
+                        <span class="field-name">报警类型:</span>
+                        <el-form-item prop="inthe" class="field-input">
+                          <el-select v-model="condition.inthe" placeholder="请选择">
+                            <el-option 
+                              v-for="item in alarmType" 
+                              :key="item" 
+                              :label="item" 
+                              :value="item"
+                            />
+                          </el-select>
+                        </el-form-item>
+                      </div>
+                    </el-col>
+                    
+                    <!-- 报警来源 -->
+                    <el-col :span="8" class="condition-col">
+                      <div class="condition-field">
+                        <span class="field-name">报警来源:</span>
+                        <el-form-item prop="Right" class="field-input">
+                          <el-select v-model="condition.Right" placeholder="请选择">
+                            <el-option 
+                              v-for="item in alarmSource" 
+                              :key="item" 
+                              :label="item" 
+                              :value="item"
+                            />
+                          </el-select>
+                        </el-form-item>
+                        <!-- 删除按钮 -->
+                        <el-button 
+                          v-if="conditions.length > 1"
+                          type="primary" 
+                          icon="ele-Minus" 
+                          size="small" 
+                          @click="removeCondition(index)"
+                          class="remove-btn"
+                        />
+                      </div>
+                    </el-col>
+                  </el-row>
+                </el-form-item>
+              </el-form>
+            </div>
+          </div>
+        </div>
+        
+        <el-form-item label="是否启用" prop="isActive" class="form-item">
           <el-select v-model="formData.isActive" placeholder="请选择启用状态">
             <el-option label="启用" :value="true"></el-option>
             <el-option label="停用" :value="false"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="启用时间" prop="activationTime">
+        
+        <el-form-item label="启用时间" prop="activationTime" class="form-item">
           <el-date-picker
             v-model="formData.activationTime"
             type="datetime"
             placeholder="请选择启用时间"
             format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
+            :editable="false" 
+            :input-readonly="true"  
           ></el-date-picker>
         </el-form-item>
-        <el-form-item label="停用时间" prop="deactivationTime">
+        
+        <el-form-item label="停用时间" prop="deactivationTime" class="form-item">
           <el-date-picker
             v-model="formData.deactivationTime"
             type="datetime"
             placeholder="请选择停用时间"
             format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
+            :editable="false"  
+            :input-readonly="true"  
           ></el-date-picker>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+        
+        <el-form-item label="备注" prop="remark" class="form-item">
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息"></el-input>
         </el-form-item>
       </el-form>
@@ -165,17 +260,16 @@
     </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/AlarmService/alarmLevel";
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref, watch, nextTick } from "vue";
+import eventBus from "/@/utils/mitt";
+import { Api } from "/@/api/admin/AlarmService/alarmLevel";
 import { AlarmLevelDto } from "/@/api/admin/AlarmService/alarmLevelDto";
 import type { pageInput, ResultOutputPageOutputAlarmLevelDto } from "/@/api/admin/AlarmService/alarmLevelDto";
 import { DictApi } from "/@/api/admin/Dict";
-
-
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
-import { ElMessage } from "element-plus";
+import { ElMessage, type FormRules } from "element-plus";
 import { PageInputDictGetPageDto, ResultOutputPageOutputDictGetPageOutput } from "/@/api/admin/data-contracts";
 
 interface DictItem {
@@ -196,44 +290,66 @@ const dialogVisible = ref(false);
 const isEdit = ref(false); // 是否为编辑模式
 const currentRowId = ref<number | undefined>(undefined); // 当前操作的记录ID
 
-/**数据对象*/
-  const state = reactive({
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
-      filter: {
-/**报警等级名称 */
-        alarmLevelName: "",
-/**规则条件 */
-        conditionsJson: "",
-/**是否启用 */
-        isActive: undefined,
-      level:undefined
-      },
-  /**表格信息 */
-tableModel: [] as AlarmLevelDto[],
+// 报警条件相关状态 - 默认不显示
+const showAlarmConditions = ref(false);
+const conditions = ref([{
+  Left: '',
+  inthe: '',
+  Right: ''
+}]);
+
+// 报警条件验证规则
+const conditionRules = reactive<FormRules>({
+  Left: [{ required: true, message: '请选择报警设备', trigger: 'change' }],
+  inthe: [{ required: true, message: '请选择报警类型', trigger: 'change' }],
+  Right: [{ required: true, message: '请选择报警来源', trigger: 'change' }]
+});
+
+// 报警设备、类型和来源选项
+const alarmEquipment = ["安全装置", "编码器", "计控主板", "监控微处理器", "智能型控制阀", 
+                       "油气回收控制板", "显示屏", "计量器", "加油机", "油枪"];
+const alarmType = ["加油机离线", "通信异常", "非法部件", "厂商不符", "绑定错误", 
+                  "监控微处理器报警", "安全装置报警", "加油机报警", "检定"];
+const alarmSource = ['云平台', '安全装置'];
 
+/**数据对象 */
+const state = reactive({
+  /**加载显示 */
+  loading: false,
+  /**条件查询模块 */
+  filter: {
+    /**报警等级名称 */
+    alarmLevelName: "",
+    /**规则条件 */
+    conditionsJson: "",
+    /**是否启用 */
+    isActive: undefined,
+    level: undefined
+  },
+  /**表格信息 */
+  tableModel: [] as AlarmLevelDto[],
   alarmLevelDict: [] as DictItem[], // 报警等级字典数据
-    /**动态表头 */
-    dynamicColumns: [
-{ prop: 'alarmLevelName', label: '报警等级名称' },
-{ prop: 'level', label: '报警等级' },
-{ prop: 'conditionsJson', label: '规则条件' },
-{ prop: 'isActive', label: '是否启用' },
-{ prop: 'activationTime', label: '启用时间' },
-{ prop: 'deactivationTime', label: '停用时间' },
-{ prop: 'remark', label: '备注' },],
-/**分页标识 */
-    pageInput:{
-      CurrentPage: 1,
-      PageSize: 10,
-    } as pageInput,
-    /**分页总数 */
-    total: 0,
-})
+  /**动态表头 */
+  dynamicColumns: [
+    { prop: 'alarmLevelName', label: '报警等级名称' },
+    { prop: 'level', label: '报警等级' },
+    { prop: 'conditionsJson', label: '规则条件' },
+    { prop: 'isActive', label: '是否启用' },
+    { prop: 'activationTime', label: '启用时间' },
+    { prop: 'deactivationTime', label: '停用时间' },
+    { prop: 'remark', label: '备注' },
+  ],
+  /**分页标识 */
+  pageInput: {
+    CurrentPage: 1,
+    PageSize: 10,
+  } as pageInput,
+  /**分页总数 */
+  total: 0,
+});
 
 // 表单数据
-const formData = reactive<AlarmLevelDto>({
+const formData = reactive<AlarmLevelDto & { conditionsJson?: string }>({
   alarmLevelName: "",
   level: undefined,
   conditionsJson: "",
@@ -244,13 +360,11 @@ const formData = reactive<AlarmLevelDto>({
 });
 
 // 表单验证规则
-const rules = {
+const rules = reactive<FormRules>({
   alarmLevelName: [{ required: true, message: "请输入报警等级名称", trigger: "blur" }],
-  level: [{ required: true, message: "请输入报警等级", trigger: "blur" }],
-  conditionsJson: [{ required: true, message: "请输入规则条件", trigger: "blur" }],
+  level: [{ required: true, message: "请选择报警等级", trigger: "change" }],
   isActive: [{ required: true, message: "请选择启用状态", trigger: "change" }],
-};
-
+});
 
 onMounted(() => {
   // 初始化分页大小
@@ -264,7 +378,6 @@ onMounted(() => {
   eventBus.on('refreshView', async () => {
     await init();
   });
-  console.log();
 });
 
 // 获取报警等级字典数据的函数
@@ -276,7 +389,7 @@ const fetchAlarmLevelDict = async () => {
       CurrentPage: 1,
       PageSize: 100,
       Filter: {
-        dictTypeId: 685895581360197, 
+        dictTypeId: 685895581360197,
         name: "" // 可选的名称筛选
       }
     };
@@ -298,23 +411,23 @@ const fetchAlarmLevelDict = async () => {
     state.loading = false;
   }
 };
-  /**
-  * 监听变换
-  */
-  watch(() => {})
+
+/** 监听变换 */
+watch(() => { })
+
 /**条件查询 */
-          const onQuery = () => {
-          init()
-        }
+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
-        }
+/**初始化 */
+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;
+};
 
 /** 打开添加/编辑弹窗 */
 const openDialog = (row: AlarmLevelDto | undefined) => {
@@ -329,15 +442,32 @@ const openDialog = (row: AlarmLevelDto | undefined) => {
     // 填充表单数据
     formData.alarmLevelName = row.alarmLevelName || "";
     formData.level = row.level || 0;
-    formData.conditionsJson = row.conditionsJson || "";
     formData.isActive = row.isActive || undefined;
     formData.activationTime = row.activationTime || "";
     formData.deactivationTime = row.deactivationTime || "";
     formData.remark = row.remark || "";
+    
+    // 解析条件数据 - 有数据才显示
+    if (row.conditionsJson) {
+      try {
+        const parsedConditions = JSON.parse(row.conditionsJson);
+        conditions.value = parsedConditions.length ? parsedConditions : [{ Left: '', inthe: '', Right: '' }];
+        showAlarmConditions.value = true;
+      } catch (e) {
+        console.error('解析条件数据失败:', e);
+        conditions.value = [{ Left: '', inthe: '', Right: '' }];
+        showAlarmConditions.value = false;
+      }
+    } else {
+      conditions.value = [{ Left: '', inthe: '', Right: '' }];
+      showAlarmConditions.value = false;
+    }
   } else {
-    // 添加模式
+    // 添加模式 - 默认不显示条件
     isEdit.value = false;
     currentRowId.value = undefined;
+    conditions.value = [{ Left: '', inthe: '', Right: '' }];
+    showAlarmConditions.value = false;
   }
   
   // 显示弹窗
@@ -347,13 +477,16 @@ const openDialog = (row: AlarmLevelDto | undefined) => {
 /** 重置表单 */
 const resetForm = () => {
   formData.alarmLevelName = "";
-  formData.level = 0;
+  formData.level = undefined;
   formData.conditionsJson = "";
   formData.isActive = undefined;
   formData.activationTime = "";
   formData.deactivationTime = "";
   formData.remark = "";
   
+  conditions.value = [{ Left: '', inthe: '', Right: '' }];
+  showAlarmConditions.value = false; // 重置为不显示
+  
   if (formRef.value) {
     formRef.value.validate(() => {});
   }
@@ -364,17 +497,72 @@ const handleDialogClose = () => {
   dialogVisible.value = false;
 };
 
+/** 添加报警条件 - 点击加号才显示 */
+const addCondition = () => {
+  if (!showAlarmConditions.value) {
+    // 首次点击加号,显示条件区域
+    showAlarmConditions.value = true;
+  } else {
+    // 已有条件时,验证最后一个条件是否完整
+    const lastCondition = conditions.value[conditions.value.length - 1];
+    if (!lastCondition.Left || !lastCondition.inthe || !lastCondition.Right) {
+      ElMessage.warning('请先填写当前条件的所有字段');
+      return;
+    }
+    // 添加新条件
+    conditions.value.push({
+      Left: '',
+      inthe: '',
+      Right: ''
+    });
+    
+    // 触发重渲染以更新验证规则
+    nextTick(() => {
+      if (formRef.value) {
+        formRef.value.validate(() => {});
+      }
+    });
+  }
+};
+
+/** 删除报警条件 */
+const removeCondition = (index: number) => {
+  if (conditions.value.length <= 1) {
+    // 只剩一个条件时,隐藏整个区域
+    conditions.value = [{ Left: '', inthe: '', Right: '' }];
+    showAlarmConditions.value = false;
+  } else {
+    // 移除指定条件
+    conditions.value.splice(index, 1);
+  }
+};
+
 /** 提交表单 */
 const handleSubmit = () => {
   if (!formRef.value) return;
   
+  // 验证条件是否完整(如果显示的话)
+  if (showAlarmConditions.value) {
+    for (const cond of conditions.value) {
+      if (!cond.Left || !cond.inthe || !cond.Right) {
+        ElMessage.warning('请填写所有条件的字段');
+        return;
+      }
+    }
+  }
+  
   formRef.value.validate(async (isValid) => {
     if (isValid) {
       try {
+        // 将条件转换为JSON字符串(没显示则为空)
+        formData.conditionsJson = showAlarmConditions.value 
+          ? JSON.stringify(conditions.value) 
+          : "";
+          
         let res: any;
         
         if (isEdit.value && currentRowId.value) {
-          // 编辑请求 - 使用update接口而不是add接口
+          // 编辑请求
           formData.id = currentRowId.value;
           res = await new Api().addAlarmLevel(formData);
           ElMessage.success('修改成功');
@@ -432,6 +620,7 @@ const handleDelete = async (id: number) => {
     state.loading = false;
   }
 };
+
 /** 页条大小变化 */
 const onSizeChange = (val: number) => {
   state.pageInput.PageSize = val;
@@ -448,13 +637,12 @@ const onCurrentChange = (val: number) => {
 <style scoped lang="scss">
 .el-input,
 .el-select {
-  width: 240px;
+  width: 100%;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  width: 100px;
   justify-content: start;
 }
 
@@ -466,4 +654,125 @@ const onCurrentChange = (val: number) => {
 .el-link {
   padding: 5px;
 }
-  </style>
+
+// 弹窗表单样式优化
+.dialog-form {
+  width: 100%;
+  padding: 0 20px;
+}
+
+.form-item {
+  margin-bottom: 15px;
+}
+
+// 条件配置区域样式
+.condition-section {
+  width: 100%;
+  margin: 15px 0;
+  padding: 10px;
+  border: 1px solid #e5e7eb;
+  border-radius: 4px;
+}
+
+.condition-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 15px;
+  padding-bottom: 10px;
+  border-bottom: 1px dashed #e5e7eb;
+}
+
+.condition-title {
+  font-size: 16px;
+  font-weight: 500;
+  color: #333;
+}
+
+.add-btn {
+  width: 32px;
+  height: 32px;
+  padding: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.conditions-container {
+  margin-top: 10px;
+}
+
+.condition-item {
+  margin-bottom: 15px;
+  padding: 10px;
+  background-color: #f9fafb;
+  border-radius: 4px;
+}
+
+.condition-form {
+  width: 100%;
+}
+
+.condition-label {
+  min-width: 80px;
+  padding-right: 10px;
+}
+
+.condition-row {
+  width: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.condition-col {
+  padding: 0 10px;
+  box-sizing: border-box;
+}
+
+.condition-field {
+  display: flex;
+  align-items: center;
+  width: 100%;
+}
+
+.field-name {
+  width: 80px;
+  text-align: right;
+  margin-right: 10px;
+  white-space: nowrap;
+}
+
+.field-input {
+  flex: 1;
+  margin-bottom: 0;
+}
+
+.remove-btn {
+  width: 32px;
+  height: 32px;
+  padding: 0;
+  margin-left: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+::v-deep .condition-form .el-form-item {
+  margin-bottom: 0;
+}
+
+::v-deep .condition-form .el-select .el-input {
+  width: 100%;
+}
+
+// 日期选择器样式优化
+::v-deep .el-date-editor .el-input {
+  width: 100%;
+}
+
+// 禁用手动输入的日期选择器样式
+::v-deep .el-date-editor .el-input__inner[readonly] {
+  background-color: #ffffff;
+  cursor: pointer;
+}
+</style>

文件差异内容过多而无法显示
+ 472 - 348
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue


+ 145 - 107
admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

@@ -1,4 +1,3 @@
-<!-- 规则列表 -- 表格 -->
 <template>
   <div class="layout-pd">
     <el-row>
@@ -18,15 +17,15 @@
                      <el-option v-for="item in StatusOptions" :key="item.value" :label="item.label" :value="item.value" />
                    </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.pushMethod" placeholder="请选择推送方式">
-                                   <el-option label="所有" :value="''"></el-option>
-                    <el-option v-for="(value, key) in upload" :key="key" :label="value" :value="key" />
-                                 </el-select>
-                             </el-form-item>
-                           </el-col>
+              </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.pushMethod" placeholder="请选择推送方式">
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in pushMethods" :key="key" :label="value" :value="key" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
             </el-form-item>
           </el-form>
 
@@ -39,7 +38,7 @@
               <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
             </el-row>
             <el-row>
-              <el-button type="primary" icon="ele-Plus" @click="addAlarmRules('')"> 添加 </el-button>
+              <el-button type="primary" icon="ele-Plus" @click="addAlarmRules()"> 添加 </el-button>
             </el-row>
           </el-row>
         </el-card>
@@ -64,8 +63,8 @@
                   :underline="false" target="_blank">编辑</el-link>
                 <el-link class="my-el-link mr12 ml12" @click="toDelete(row.id)" type="primary" icon="ele-Delete"
                   :underline="false" target="_blank">删除</el-link>
-                <el-link class="my-el-link mr12 ml12" @click="toOpen(row)" type="primary" icon="ele-SwitchButton"
-                  :underline="false" target="_blank">启用</el-link>
+                <el-link class="my-el-link mr12 ml12" @click="toToggleStatus(row)" type="primary" icon="ele-SwitchButton"
+                  :underline="false" target="_blank">{{ row.isActive ? '禁用' : '启用' }}</el-link>
               </template>
             </el-table-column>
 
@@ -127,16 +126,11 @@ const Data = reactive({
   /**动态表头 */
   dynamicColumns: [
     { prop: 'ruleName', label: '规则名称' },
-    // { prop: 'userName', label: '用户' },
     { prop: 'pushMethod', label: '推送方式' },
-    // { prop: 'triggerMethod', label: '触发方式' },
     { prop: 'keyWord', label: '关键字匹配' },
     { prop: 'taskPriority', label: '优先级' },
-    // { prop: 'isExclusive', label: '是否互斥' },
-    // { prop: 'stationName', label: '推送方式' },
     { prop: 'pushTemplateMappingID', label: '模板' },
     { prop: 'remark', label: '备注' },
-
   ],
   /**分页总数 */
   total: 0,
@@ -154,48 +148,91 @@ const StatusOptions = [
   { value: false, label: '禁用' }
 ];
 
-enum upload {
-  "电子邮箱"="电子邮箱",
-  "微信"="微信"
-}
+// 推送方式映射
+const pushMethods = {
+  "wx": "微信",
+  "email": "电子邮箱"
+};
 
 /**引入组件*/
 const EditDialog = defineAsyncComponent(() => import('./components/add-alarmRules.vue'))
 const editDialogRef = ref()
+const multipleTableRef = ref()
 
 
-// // 条件查询
+// 条件查询
 const init = async () => {
-  Data.loading = true
-  const res: any = await new alarmRulesApi().getData({ ...Data.pageInput, filter: Data.Filter })
-  console.log(res)
-  Data.tableModel = res?.data.list ?? []
-  Data.total = res?.data?.list.length ?? 0   // 接口中没有总的数据量
-  Data.loading = false
-  pushMethodChange()
+  Data.loading = true;
+  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(); // 格式化表格数据
+  } catch (error) {
+    console.error("获取规则列表失败:", error);
+    Data.tableModel = [];
+    Data.total = 0;
+  } finally {
+    Data.loading = false;
+  }
+}
+
+// 格式化表格数据(仅用于展示,保留原始数据)
+const formatTableData = () => {
+  Data.tableModel.forEach((item: any) => {
+    // 保存原始模板ID数组(用于后续操作)
+    item.originalPushTemplateIds = [...(item.pushTemplateMappingID || [])];
+    
+    // 处理推送方式(展示用)
+    if (item.pushMethod) {
+      const pushList = item.pushMethod.split(',');
+      item.pushMethod = pushList.map((method: string) => {
+        return pushMethods[method] || method;
+      }).join(',');
+    }
+    
+    // 处理是否互斥(展示用)
+    item.isExclusiveDisplay = item.isExclusive ? "是" : "否";
+    
+    // 处理模板显示(展示用,将数组转为字符串)
+    if (Array.isArray(item.pushTemplateMappingID) && item.pushTemplateMappingID.length > 0) {
+      item.pushTemplateMappingID = item.pushTemplateMappingID.join(',');
+    }
+  });
 }
 
 const onQuery = () => {
-  init()
-  console.log("查询")
+  Data.pageInput.currentPage = 1; // 重置到第一页
+  init();
+  console.log("执行查询");
 }
 
 /**重置查询条件 */
 const resetQuery = () => {
-  Data.Filter.ruleName = ''
+  Data.Filter = {
+    ruleName: "",
+    Status: "",
+    upload: "",
+    pushMethod: "",
+    isActive: undefined
+  };
 }
+
 /**重置 */
 const onReset = () => {
-  resetQuery()
-  init()
+  resetQuery();
+  Data.pageInput.currentPage = 1;
+  init();
 }
 
 /** 
- * 添加规则
+ * 添加/编辑规则
 */
-const addAlarmRules = ((row: any) => {
-  editDialogRef.value.openDialog(row)
-  init()
+const addAlarmRules = ((row?: alarmRluesFilterModel) => {
+  if (editDialogRef.value) {
+    editDialogRef.value.openDialog(row);
+  }
 })
 
 /**
@@ -203,95 +240,92 @@ const addAlarmRules = ((row: any) => {
 * @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();
 }
 
-/** 数据转换 */
-const pushMethodChange = (() => {
-  // 推送方式
-  Data.tableModel.forEach((item: any) => {
-    const pushList = item['pushMethod'].split(',')
-    for (var i = 0; i < pushList.length; i++) {
-      if (pushList[i] == 'wx') {
-        pushList[i] = "微信"
-      } else if (pushList[i] == 'email') {
-        pushList[i] = "电子邮箱"
-      }
-    }
-    item['pushMethod'] = pushList.toString()
+// 删除操作
+const toDelete = async (id?: number) => {
+  if (!id) return;
+  
+  try {
+    await new alarmRulesApi().deliteData({ 'id': id });
+    ElMessage.success('删除成功');
+    eventBus.emit('refreshView');
+  } catch (error) {
+    console.error('删除失败:', error);
+    ElMessage.error('删除失败');
+  }
+}
 
-    // 是否互斥
-    if (item['isExclusive'] == true) {
-      item['isExclusive'] = "是"
-    } else {
-      item['isExclusive'] = "否"
+// 切换启用/禁用状态(核心修复)
+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';
     }
-  })
-})
-
-// 操作
-const toDelete = (async (id?: number) => {
-  await new alarmRulesApi().deliteData({ 'id': id }).then(() => {
-    eventBus.emit('refreshView')
-  })
 
-})
-
-const toOpen = (async (row: any) => {
-  row.isActive = !row.isActive
-  const data = { ...row } as any
-
-  if (data.isExclusive == '是') {
-    data.isExclusive = true
-    console.log(1)
-  } else {
-    data.isExclusive = false
-  }
-  if (data.pushMethod == '') {
-    return
-  } else {
-    if (data.pushMethod == '微信') {
-      data.pushMethod = 'wx'
-    } else if (data.pushMethod == '电子邮箱') {
-      data.pushMethod = 'email'
-    } else {
-      data.pushMethod = 'wx,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));
     }
-  }
-
 
-  await new alarmRulesApi().addForm(data).then(() => {
-    eventBus.emit('refreshView')
-  })
-})
+    // 3. 准备更新数据
+    const updatedData = {
+      ...row,
+      isActive: !row.isActive,
+      pushMethod: originalPushMethod,
+      pushTemplateMappingID: templateIds, // 确保是整数数组
+      isExclusive: row.isExclusiveDisplay === "是" // 恢复互斥状态为布尔值
+    };
+
+    await new alarmRulesApi().addForm(updatedData);
+    ElMessage.success(`已${updatedData.isActive ? '启用' : '禁用'}该规则`);
+    eventBus.emit('refreshView');
+  } catch (error) {
+    console.error('状态更新失败:', error);
+    ElMessage.error('状态更新失败');
+  }
+}
 
 // 挂载前
 onBeforeMount(() => {
-  eventBus.off('refreshView')
+  eventBus.off('refreshView');
 })
 
 // 挂载时
 onMounted(async () => {
   // 初始化分页大小
   Data.pageInput.pageSize = pageState.pageInput.pageSize;
-  await init()
-  eventBus.off('refreshView')
+  await init();
+  eventBus.off('refreshView');
   eventBus.on('refreshView', async () => {
-    await init()
+    await init();
   })
 })
 
-
+// 引入ElMessage
+import { ElMessage } from 'element-plus';
 
 </script>
 
@@ -301,15 +335,19 @@ onMounted(async () => {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
+/* 输入框标签固定宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  width: 80px;
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
+/* 数据表头样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
-</style>
+
+/* 操作按钮样式 */
+.my-el-link {
+  margin: 0 6px;
+}
+</style>

部分文件因为文件数量过多而无法显示