Procházet zdrojové kódy

feat:问题清单页面对齐 设备管理页面配置 加油机档案平台和版本号恢复

huang, kai (Contractor) před 1 měsícem
rodič
revize
f3d738ab2b
22 změnil soubory, kde provedl 1321 přidání a 339 odebrání
  1. 1 0
      admin.ui.plus-master/.env.development
  2. 1 0
      admin.ui.plus-master/.env.production
  3. 20 0
      admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts
  4. 15 1
      admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts
  5. 60 14
      admin.ui.plus-master/src/api/admin/AlarmService/userList.ts
  6. 167 5
      admin.ui.plus-master/src/api/admin/AlarmService/userListDto.ts
  7. 114 55
      admin.ui.plus-master/src/api/admin/Permission.ts
  8. 1 0
      admin.ui.plus-master/src/api/admin/Role.ts
  9. 86 35
      admin.ui.plus-master/src/api/admin/data-contracts.ts
  10. 4 4
      admin.ui.plus-master/src/api/admin/reportManagement/displayControl/displayControldto.ts
  11. 7 1
      admin.ui.plus-master/src/views/admin/application/applicationManage/components/org-form.vue
  12. 1 0
      admin.ui.plus-master/src/views/admin/application/applicationManage/index.vue
  13. 15 15
      admin.ui.plus-master/src/views/admin/statement/displayControl/index.vue
  14. 5 10
      admin.ui.plus-master/src/views/admin/statement/listOfOilEngines/index.vue
  15. 4 5
      admin.ui.plus-master/src/views/admin/statement/problemData/index.vue
  16. 85 26
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue
  17. 23 10
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue
  18. 329 153
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/userList/index.vue
  19. 7 1
      admin.ui.plus-master/src/views/example/application/applicationManage/components/org-form.vue
  20. 10 4
      admin.ui.plus-master/src/views/example/application/applicationManage/index.vue
  21. 136 0
      admin.ui.plus-master/src/views/example/application/equipment/components/equipment-edit.vue
  22. 230 0
      admin.ui.plus-master/src/views/example/application/equipment/index.vue

+ 1 - 0
admin.ui.plus-master/.env.development

@@ -4,6 +4,7 @@ ENV = 'development'
 # 本地环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
 #  VITE_API_URL = 'http://192.168.0.202:8003'
+# VITE_API_URL = 'http://localhost:8003'
 VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'

+ 1 - 0
admin.ui.plus-master/.env.production

@@ -10,6 +10,7 @@ VITE_PUBLIC_PATH = '/'
 # 线上环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
 # VITE_API_URL = 'http://localhost:8000'
+# VITE_API_URL = 'http://localhost:8003'
 VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'

+ 20 - 0
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesApi.ts

@@ -3,6 +3,26 @@ import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client
 import { alarmRluesFilterModel,PageInputAlarmRluesFilterModel } from "/@/api/admin/AlarmService/alarmRulesDto";
 
 export class alarmRulesApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * No description
+   *
+   * @tags
+   * @name GetList
+   * @summary 查询列表
+   * @request POST:'/api/app/push/get-push-users-page'
+   * @secure
+   */
+  getList = (data: any, params: RequestParams = {}) : any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/push/get-push-users-page',
+      method: 'POST',
+      body: data,
+      type: ContentType.Json,
+      secure: true,
+      format: 'json',
+      ...params
+    });
+
 
     /**
      * No description

+ 15 - 1
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -30,10 +30,12 @@ export interface alarmRluesFilterModel {
   triggerMethod2?: number | string | null;
   /**规则条件 */
   conditionsJson?: string | null;
-  MaintenanceJson?: string | null;
+  maintenanceJson?: string | null;
   /**推送用户中间表id */
   pushUserid?: Array<number>;
   id?: number;
+  condition?:string | null;
+  condition2?:string | null;
 }
 
 /**
@@ -42,6 +44,9 @@ export interface alarmRluesFilterModel {
 export interface alarmRluesFilterModel_SearchFilter {
   /**规则名称*/
   ruleName?: string,
+  Status?: string | null,
+  upload?: string | null,
+  isActive?:boolean | null
 }
 
 
@@ -61,3 +66,12 @@ export interface PageInputAlarmRluesFilterModel {
   filter?: alarmRluesFilterModel_SearchFilter
 }
 
+// /@/api/admin/AlarmService/alarmRulesDto.ts
+export interface UserListItem {
+  userPhone: any;
+  userId: any;
+  id: number; // 用户ID
+  userName: string; // 用户名
+  nickname?: string; // 昵称(可选)
+  phone?: string; // 手机号(可选)
+}

+ 60 - 14
admin.ui.plus-master/src/api/admin/AlarmService/userList.ts

@@ -1,7 +1,24 @@
 import { AxiosResponse } from 'axios'
-  import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client"
-  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
-    /**
+import { ContentType, HttpClient, RequestParams } from "/@/api/admin/http-client"
+import { PageInputPushUsersDto, PageInputWxUserinfo, PageOutputPushUsersDto, PushUsersDto, ResultOutputBoolean, ResultOutputPageOutputPushUsersDto, ResultOutputPageOutputWxUserinfo } from './userListDto';
+import axios from "axios";
+
+export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * 上传用户列表接口
+   * @param data PushUsersDto 数据
+   */
+  uploadPushUsers = (data: PushUsersDto): Promise<AxiosResponse<ResultOutputBoolean>> => {
+    return this.request({
+      path: "/api/app/push/upload-push-users",
+      method: "POST",
+      body: data,
+      type: ContentType.Json,
+      secure: true,
+    });
+  };
+
+  /**
    * No description
    *
    * @tags
@@ -10,14 +27,43 @@ import { AxiosResponse } from 'axios'
    * @request POST:'/api/app/push/get-push-users-page'
    * @secure
    */
-getList = (data:any ,params: RequestParams = {}) : any  =>
-      this.request<AxiosResponse,any>({
-        path:'/api/app/push/get-push-users-page',
-        method: 'POST',
-        body:data,
-        type: ContentType.Json,
-        secure: true,
-        format: 'json',
-        ...params
-      })
-    }
+  getList = (data: any, params: RequestParams = {}) : any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/push/get-push-users-page',
+      method: 'POST',
+      body: data,
+      type: ContentType.Json,
+      secure: true,
+      format: 'json',
+      ...params
+    });
+
+  // 获取微信用户列表
+  getWxUserPage = (data: PageInputWxUserinfo) => {
+    return this.request<ResultOutputPageOutputWxUserinfo>({
+      path: "/api/app/push/get-wx-user-page",
+      method: "POST",
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+    });
+  };
+}
+
+// /api/admin/AlarmService/userListApi.ts
+import request from "/@/utils/request"; // 引入项目请求工具
+
+// 微信用户分页查询接口
+export const getWxUserPage = (params: PageInputWxUserinfo) => {
+  return request<ResultOutputPageOutputWxUserinfo>({
+    url: '/api/app/push/get-wx-user-page',
+    method: 'POST',
+    data: params,
+  });
+};
+
+export class PushUsersApi {
+  async getPushUsersPage(params: PageInputPushUsersDto) {
+    return axios.post("/api/app/push/get-push-users-page", params);
+  }
+}

+ 167 - 5
admin.ui.plus-master/src/api/admin/AlarmService/userListDto.ts

@@ -36,8 +36,170 @@
 
 }
 export interface pageInput {
-      /**当前页数 */
-      CurrentPage: number | any
-      /**展示页数 */
-      PageSize: number | any
-    }
+  currentPage: number; // 非可选,必填整数
+  pageSize: number;
+    }
+
+    // 新增:微信用户分页输入参数
+export interface PageInputWxUserinfo {
+  currentPage?: number; // 当前页
+  pageSize?: number; // 每页大小
+  dynamicFilter?: DynamicFilterInfo; // 动态过滤条件
+  filter?: WxUserinfo; // 基础过滤条件
+}
+
+// 新增:微信用户信息
+export interface WxUserinfo {
+  name?: string; // 姓名
+  userName?: string; // 用户账号
+  phone?: string; // 手机号
+  openid?: string; // 微信OpenID
+  nickname?: string; // 昵称
+  
+  userid: number; // 移除可选标记,声明为必填
+  // 其他字段根据接口文档补充...
+}
+
+// 新增:分页结果输出
+export interface PageOutputWxUserinfo {
+  total: number; // 总数
+  list: WxUserinfo[]; // 列表数据
+}
+
+// 新增:接口响应类型
+export interface ResultOutputPageOutputWxUserinfo {
+  list: any
+  success: boolean;
+  code: string;
+  msg: string;
+  data: PageOutputWxUserinfo;
+}
+
+// /api/admin/AlarmService/userListDto.ts
+// 分页输入参数
+export interface PageInputWxUserinfo {
+  currentPage?: number; // 当前页码(从0开始)
+  pageSize?: number; // 每页大小
+  dynamicFilter?: DynamicFilterInfo; // 动态过滤条件
+  filter?: WxUserinfo; // 基础过滤条件
+}
+
+// 动态过滤条件
+export interface DynamicFilterInfo {
+  field?: string; // 过滤字段
+  operator?: DynamicFilterOperator; // 操作符
+  value?: string; // 过滤值
+  logic?: DynamicFilterLogic; // 逻辑符
+  filters?: DynamicFilterInfo[]; // 子过滤条件
+}
+
+
+
+
+// 微信用户信息
+export interface WxUserinfo {
+  userid: number; // 用户ID(主键)
+  userName?: string; // 用户账号
+  nickname?: string; // 微信昵称
+  phone?: string; // 手机号
+  openid?: string; // OpenID
+  // 其他字段...
+}
+
+// 分页响应结果
+export interface ResultOutputPageOutputWxUserinfo {
+  success: boolean;
+  code: string;
+  msg: string;
+  data: PageOutputWxUserinfo;
+}
+
+// 分页数据
+export interface PageOutputWxUserinfo {
+  total: number; // 总数
+  list: WxUserinfo[]; // 列表数据
+}
+
+// 定义表单验证规则类型
+interface FormRules {
+  [prop: string]: Array<{
+    required?: boolean;
+    message?: string;
+    trigger?: string | Array<string>;
+  }>;
+}
+
+export interface PageInputPushUsersDto {
+  currentPage?: number;
+  pageSize?: number;
+  dynamicFilter?: DynamicFilterInfo;
+  filter?: PushUsersDto;
+}
+
+export interface PushUsersDto {
+  userId?: number;
+  userName?: string;
+  nickname?: string;
+  userPhone?: string;
+  userOpenid?: string;
+  createtime?: string;
+  stime?: string;
+  etime?: string;
+}
+
+// 以下是通用过滤接口定义
+export interface DynamicFilterInfo {
+  field?: string;
+  operator?: DynamicFilterOperator;
+  value?: string;
+  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
+}
+
+// userListDto.ts
+export interface PushUsersDto {
+  userId?: number;      // 用户ID
+  userName?: string;    // 用户名称
+  nickname?: string;    // 微信昵称
+  userPhone?: string;   // 用户手机号
+  userOpenid?: string;  // 用户Openid
+  createtime?: string;  // 添加时间
+  stime?: string;       // 开始时间(可选)
+  etime?: string;       // 结束时间(可选)
+  // 不要包含 currentPage 和 pageSize!
+}
+
+// 上传接口响应类型
+export interface ResultOutputBoolean {
+  success: boolean;
+  code?: string;
+  msg?: string;
+  data?: boolean; // 响应示例中的 data 为 boolean
+}

+ 114 - 55
admin.ui.plus-master/src/api/admin/Permission.ts

@@ -487,14 +487,14 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request GET:/api/app/permission/get-permission
   * @secure
   */
-  getPermissionInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/permission/get-permission',
+  getPermissionInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/permission/get-permission',
       method: 'GET',
       secure: true,
       type: ContentType.Json,
       format: 'json',
-      query:query,
+      query: query,
       ...params
     })
   /**
@@ -506,7 +506,7 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request POST:/api/app/permission/delete-permission
   * @secure
   */
-  permissionDelete = ( query:oauthPermissionDto,params: RequestParams = {}):any =>
+  permissionDelete = (query: oauthPermissionDto, params: RequestParams = {}): any =>
     this.request<AxiosResponse, any>({
       path: `/api/app/permission/delete-permission`,
       method: 'POST',
@@ -524,25 +524,25 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request GET:/api/app/apply/get-apply
   * @secure
   */
-  getApplyInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/apply/get-apply',
+  getApplyInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/apply/get-apply',
       method: 'GET',
       secure: true,
       type: ContentType.Json,
       format: 'json',
-      query:query,
+      query: query,
       ...params
     })
-   /**
-   * No description
-   *
-   * @tags apply
-   * @name addApply
-   * @summary 新增、编辑应用
-   * @request POST:/api/app/permission/upload-permission
-   * @secure
-   */
+  /**
+  * No description
+  *
+  * @tags apply
+  * @name addApply
+  * @summary 新增、编辑应用
+  * @request POST:/api/app/permission/upload-permission
+  * @secure
+  */
   addApply = (data: OauthApplyDto, params: RequestParams = {}) =>
     this.request<AxiosResponse, any>({
       path: `/api/app/apply/upload-apply`,
@@ -552,16 +552,16 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
       type: ContentType.Json,
       ...params,
     })
- /**
-  * No description
-  *
-  * @tags apply
-  * @name applyDelete
-  * @summary 删除应用
-  * @request POST:/api/app/permission/delete-permission
-  * @secure
-  */
-  applyDelete = ( query:any,params: RequestParams = {}):any =>
+  /**
+   * No description
+   *
+   * @tags apply
+   * @name applyDelete
+   * @summary 删除应用
+   * @request POST:/api/app/permission/delete-permission
+   * @secure
+   */
+  applyDelete = (query: any, params: RequestParams = {}): any =>
     this.request<AxiosResponse, any>({
       path: `/api/app/apply/delete-apply`,
       method: 'POST',
@@ -579,14 +579,14 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request GET:/api/app/view/get-permission
   * @secure
   */
-  getViewInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/view/get-permission',
+  getViewInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/view/get-permission',
       method: 'GET',
       secure: true,
       type: ContentType.Json,
       format: 'json',
-      query:query,
+      query: query,
       ...params
     })
   /**
@@ -616,7 +616,7 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request POST:/api/app/view/delete-permission
   * @secure
   */
-  viewDelete = ( query:any,params: RequestParams = {}):any =>
+  viewDelete = (query: any, params: RequestParams = {}): any =>
     this.request<AxiosResponse, any>({
       path: `/api/app/view/delete-permission`,
       method: 'POST',
@@ -634,14 +634,14 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request GET:/api/app/role/get-role
   * @secure
   */
-  getRoleInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/role/get-role',
+  getRoleInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/role/get-role',
       method: 'GET',
       secure: true,
       type: ContentType.Json,
       format: 'json',
-      query:query,
+      query: query,
       ...params
     })
   /**
@@ -671,7 +671,7 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request POST:/api/app/role/delete-role
   * @secure
   */
-  roleDelete = ( query:any,params: RequestParams = {}):any =>
+  roleDelete = (query: any, params: RequestParams = {}): any =>
     this.request<AxiosResponse, any>({
       path: `/api/app/role/delete-role`,
       method: 'POST',
@@ -679,7 +679,7 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
       secure: true,
       type: ContentType.Json,
       ...params,
-  })
+    })
   /**
   * No description
   *
@@ -689,12 +689,12 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request POST:/api/app/role/assign
   * @secure
   */
-  roleMenuAssign = (data: any,query:any, params: RequestParams = {}) =>
+  roleMenuAssign = (data: any, query: any, params: RequestParams = {}) =>
     this.request<AxiosResponse, any>({
       path: `/api/app/role/assign`,
       method: 'POST',
       body: data,
-      query:query,
+      query: query,
       secure: true,
       type: ContentType.Json,
       ...params,
@@ -708,16 +708,16 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request POST:/api/app/operation-record/get-page
   * @secure
   */
-  getOperationInfo = (query:any ,params: RequestParams = {}) : any  =>
-  this.request<AxiosResponse,any>({
-    path:'/api/app/operation-record/get-page',
-    method: 'POST',
-    secure: true,
-    type: ContentType.Json,
-    format: 'json',
-    body:query,
-    ...params
-  })
+  getOperationInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/operation-record/get-page',
+      method: 'POST',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      body: query,
+      ...params
+    })
   /**
   * No description
   *
@@ -727,14 +727,73 @@ export class PermissionApi<SecurityDataType = unknown> extends HttpClient<Securi
   * @request GET:/api/app/role/get-role
   * @secure
   */
-  getMenuInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/role/get-permission',
+  getMenuInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/role/get-permission',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+
+
+  /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 查询设备列表
+  * @request GET:'/api/app/equipment/get-list-page'
+  * @secure
+  */
+  getEquipmentList = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/get-list-page',
       method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params
+    })
+
+    /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 添加或修改设备
+  * @request POST:'/api/app/equipment/upload'
+  * @secure
+  */
+  uploadEquipment = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/upload',
+      method: 'POST',
       secure: true,
       type: ContentType.Json,
       format: 'json',
-      query:query,
+      body: query,
       ...params
     })
+
+    /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 删除设备
+  * @request POST:'/api/app/equipment/delete'
+  * @secure
+  */
+  deleteEquipment = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/delete',
+      method: 'POST',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params
+    })
 }

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

@@ -107,6 +107,7 @@ getLabel = (
       format: 'json',
       ...params,
     })
+    
   /**
    * No description
    *

+ 86 - 35
admin.ui.plus-master/src/api/admin/data-contracts.ts

@@ -4411,13 +4411,13 @@ export interface oauthPermissionDto {
   /** 图标 */
   icon?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
   /** 视图id */
-  viewId?: number|null
-   /** 视图地址 */
-  viewPath?: string|null
+  viewId?: number | null
+  /** 视图地址 */
+  viewPath?: string | null
   /** 说明 */
   // description?: string | null
 }
@@ -4452,20 +4452,20 @@ export interface OauthPermission {
   /** 图标 */
   icon?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
   /** 视图id */
-  viewId?: string|null
+  viewId?: string | null
   /** 视图地址 */
-  viewPath?: string|null
+  viewPath?: string | null
   /** 展开 */
   opened?: boolean
   /** 说明 */
   // description?: string | null
 }
 /** 应用权限信息输出 */
-export interface ResultOutputListOauthPermission{
+export interface ResultOutputListOauthPermission {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4476,7 +4476,7 @@ export interface ResultOutputListOauthPermission{
   data?: OauthPermission[] | null
 }
 /** 应用请求参数 */
-export interface OauthApplyDto{
+export interface OauthApplyDto {
   id: number
   /** 应用id */
   appid?: string
@@ -4485,10 +4485,12 @@ export interface OauthApplyDto{
   /** 编码 */
   code?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
+  /** 最小可用版本 */
+  minVersion?: string | null
 }
 /** 应用 */
-export interface OauthApply{
+export interface OauthApply {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4507,6 +4509,8 @@ export interface OauthApply{
   isDeleted: boolean
   /** 版本 */
   version: number
+  /** 最小可用版本 */
+  minVersion: string | null
   /** 应用id */
   appid?: string
   /** 应用名称 */
@@ -4514,10 +4518,10 @@ export interface OauthApply{
   /** 编码 */
   code?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
 }
 /** 应用信息输出 */
-export interface ResultOutputListOauthApply{
+export interface ResultOutputListOauthApply {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4528,7 +4532,7 @@ export interface ResultOutputListOauthApply{
   data?: OauthApply[] | null
 }
 /** 应用视图 */
-export interface OauthView{
+export interface OauthView {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4554,12 +4558,12 @@ export interface OauthView{
   /** 视图地址 */
   path?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
 }
 /** 应用视图信息输出 */
-export interface ResultOutputListOauthView{
+export interface ResultOutputListOauthView {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4570,7 +4574,7 @@ export interface ResultOutputListOauthView{
   data?: OauthView[] | null
 }
 /** 视图请求参数 */
-export interface OauthViewDto{
+export interface OauthViewDto {
   id: number
   /** 上一级分组 */
   parentId?: string | null
@@ -4579,13 +4583,13 @@ export interface OauthViewDto{
   /** 视图地址 */
   path?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: string
 }
 /** 角色请求参数 */
-export interface OauthRoleDto{
-  id:number,
+export interface OauthRoleDto {
+  id: number,
   /** 上一级分组 */
   parentId?: string | null
   /** 角色名称 */
@@ -4593,14 +4597,14 @@ export interface OauthRoleDto{
   /** 编码 */
   code?: string | null
   /** 类型 */
-  type?:RoleType
+  type?: RoleType
   /** 说明 */
-  description?:string|null
+  description?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
 }
 /** 应用角色 */
-export interface OauthRole{
+export interface OauthRole {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4626,15 +4630,15 @@ export interface OauthRole{
   /** 编码 */
   code?: string | null
   /** 类型 */
-  type?:RoleType
+  type?: RoleType
   /** 说明 */
-  description?:string|null
+  description?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   appid: number
 }
 /** 应用角色信息输出 */
-export interface ResultOutputListOauthRole{
+export interface ResultOutputListOauthRole {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4645,9 +4649,9 @@ export interface ResultOutputListOauthRole{
   data?: OauthRole[] | null
 }
 /** 操作日志信息 */
-export interface OauthOperationRecordGetPageOutPut{
+export interface OauthOperationRecordGetPageOutPut {
   /** 操作类型 */
-  operationType?: string |null
+  operationType?: string | null
   /** 模块名称 */
   moduleName?: string | null
   /** 描述 */
@@ -4664,14 +4668,14 @@ export interface OauthOperationRecordGetPageOutPut{
   createdTime?: string | null
 }
 /** 操作日志输出信息 */
-export interface PageOutputOauthOperationRecordGetPageOutPut{
+export interface PageOutputOauthOperationRecordGetPageOutPut {
   /** 数据总数 */
-  total?: number |null
+  total?: number | null
   /** 数据 */
   list?: OauthOperationRecordGetPageOutPut[] | null
 }
 /** 操作日志信息输出 */
-export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut{
+export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4684,7 +4688,7 @@ export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut{
 
 export interface Filter {
   /** 操作类型 */
-  operationType?: string |null
+  operationType?: string | null
   /** 模块名称 */
   moduleName?: string | null
   /** 操作人 */
@@ -4738,7 +4742,54 @@ export interface ResultOutputListUserDto {
   /** 数据 */
   data?: UserDto[] | null
 }
-
+/** 设备管理查询信息输出基本格式 */
+export interface ResultOutputPageOutputEquipmentGetPageOutput {
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+  data?: PageOutputEquipmentGetPageOutput[] | null
+}
+/** 设备管理分页查询信息输出 */
+export interface PageOutputEquipmentGetPageOutput {
+  /**
+  * 数据总数
+  * @format int64
+  */
+  total?: number
+  /** 数据 */
+  list?: EquipmentGetPageOutput[] | null
+}
+/** 设备管理查询信息输出 */
+export interface EquipmentGetPageOutput {
+  /** id */
+  id?: number
+  /** appid */
+  appid:string,
+  /** 设备sn */
+  sn?: string
+  /** 登录账户 */
+  account?: string
+  /** 设备状态 */
+  status?: number
+  /** 最近一次登录时间 */
+  loginTime?: string
+  /** 登录有效期 */
+  validityTime?: string
+  /** 备注 */
+  remark?: string
+
+}
+/** 设备管理分页 */
+export interface pageInput {
+  /**当前页数 */
+  CurrentPage: number | any
+  /**展示页数 */
+  PageSize: number | any
+}
 
 
 

+ 4 - 4
admin.ui.plus-master/src/api/admin/reportManagement/displayControl/displayControldto.ts

@@ -24,13 +24,13 @@
       total?: number
       /** 数据 */
       list?: encodercontrolsDto[] | null
-      startDate?: string | null
-      endDate?: string | null
+      sdate?: string | null
+      edate?: string | null
       createTimeRange?: Array<string> | null
     }
     export interface encodercontrolsDto{
-      startDate?: string | null;
-      endDate?: string | null;
+      sdate?: string | null;
+      edate?: string | null;
       createTimeRange?: Array<string> | null; 
    /** 石油公司 */
       oilCompanyName?: string

+ 7 - 1
admin.ui.plus-master/src/views/admin/application/applicationManage/components/org-form.vue

@@ -26,6 +26,11 @@
               <el-input v-model="form.code" clearable />
             </el-form-item>
           </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="最小版本" prop="code">
+              <el-input v-model="form.minVersion" clearable />
+            </el-form-item>
+          </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
             <el-form-item label="排序">
               <el-input-number v-model="form.sort" />
@@ -69,7 +74,8 @@ const state = reactive({
     appid: '',
     name: '',
     code: '',
-    sort: ''
+    sort: '',
+    minVersion:'',
   } as OauthApplyDto,
 })
 

+ 1 - 0
admin.ui.plus-master/src/views/admin/application/applicationManage/index.vue

@@ -24,6 +24,7 @@
               <div class="flex delete" @click="onDelete(v)">X</div>
             </div>
             <div class="flex" style="flex: 1;">{{ v.name }}</div>
+            <div class="flex" style="flex: 1;">最小可用版本:{{ v.minVersion }}</div>
             <div class="flex" style="height: 50px;width: 100%;">
               <el-row style="width: 100%">
                 <el-col :span="8"><el-button style="width: 100%;height: 50px;border-radius: 0" type="primary" @click="toPermissPage(v)">权限</el-button></el-col>

+ 15 - 15
admin.ui.plus-master/src/views/admin/statement/displayControl/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.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">
-                <el-form-item label="序列号">
-                  <el-input v-model="state.filter.SerialNumber" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="显示屏编号">
+                  <el-input v-model="state.filter.SerialNumber" placeholder="请输入编号" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -22,7 +22,7 @@
                   <el-select v-model="state.filter.deviceStatus" placeholder="请选择状态">
                                    <el-option label="所有" :value="''"></el-option>
                                    <el-option v-for="(value, key) in FuelDispenserEnum" :key="key" :label="value" :value="key" />
-                                 </el-select> 
+                                 </el-select>   
                   </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -33,12 +33,12 @@
                                  </el-select>             
                 </el-form-item>
               </el-col>
-              <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-date-picker
                     v-model="state.filter.createTimeRange"
-                    type="daterange"
-                    value-format="YYYY-MM-DD"
+                    type="datetimerange"
+                    value-format="YYYY-MM-DD HH:mm:ss"
                     range-separator="To"
                     start-placeholder="开始日期"
                     end-placeholder="结束日期"
@@ -68,7 +68,7 @@
           <hr>
 
           <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
-            <el-button  type="primary" icon="ele-CirclePlus" @click="onQuery"> 查询 </el-button>
+            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
           </el-row>
 </el-card>
       </el-col>
@@ -149,8 +149,8 @@ const pageState = useDynamicPageSize(10, 15);
         FixTime: "",
 /**出厂时间 */
         SoldTime: "",
-        startDate:null,
-        endDate:null,
+        sdate:null,
+        edate:null,
         createTimeRange: [],
       },
   /**表格信息 */
@@ -160,7 +160,7 @@ tableModel: [] as encodercontrolsDto,
 { prop: 'oilCompanyName', label: '石油公司' },
 { prop: 'stationName', label: '加油站名称' },
 { prop: 'serialNumber', label: '显示屏编号' },
-{ prop: 'dispenserNumber', label: '油机号' },
+{ prop: 'dispenserNumber', label: '油机号'},
 { prop: 'nozzleNumber', label: '油枪号' },
 { prop: 'deviceStatus', label: '显示屏状态' },
 { prop: 'onlineStatus', label: '在线状态' },
@@ -222,11 +222,11 @@ const onCurrentChange = () =>{
   () => state.filter.createTimeRange,
   (newVal) => {
     if (newVal && newVal.length === 2) {
-      state.filter.startDate = newVal[0]; // yyyy-MM-dd 格式
-      state.filter.endDate = newVal[1];
+      state.filter.sdate = newVal[0]; // yyyy-MM-dd 格式
+      state.filter.edate = newVal[1];
     } else {
-      state.filter.startDate = null;
-      state.filter.endDate = null;
+      state.filter.sdate = null;
+      state.filter.edate = null;
     }
   }
 );

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

@@ -130,16 +130,11 @@
               </template>
             </el-table-column>
           </el-table>
-          <div class="my-flex my-flex-end" style="margin-top: 20px">
-             <el-pagination 
-              v-model:currentPage="pageState.pageInput.currentPage"
-              v-model:page-size="pageState.pageInput.pageSize"
-              :total="oilEngineData.total"
-              :page-sizes="[5, 10, 15, 20, 50, 100]"
-              layout="total, sizes, prev, pager, next, jumper"
-              @size-change="onSizeChange"
-              @current-change="onCurrentChange"
-            />
+                      <div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination v-model:currentPage="pageState.pageInput.currentPage"
+                            v-model:page-size="pageState.pageInput.pageSize" :total="oilEngineData.total"
+                            :page-sizes="[10, 15, 20, 50, 100]" small background @size-change="onSizeChange"
+                            @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
           </div>
         </el-card>
       </el-col>

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

@@ -34,7 +34,7 @@
 
           <el-row class="submit-button" style="margin-bottom: -1vh;">
             <el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-            <el-button  type="primary" icon="ele-CirclePlus" @click="onAdd"> 添加 </el-button>
+            <el-button  type="primary" icon="ele-Plus" @click="onAdd"> 添加 </el-button>
           </el-row>
 </el-card>
       </el-col>
@@ -73,10 +73,9 @@
 </el-card>
       </el-col>
 </el-row>
-
     <!-- 新增:弹窗组件 -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%" center>
-      <el-form ref="formRef" :model="formData" label-width="120px" :rules="rules" label-position="right">
+    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
+      <el-form ref="formRef" :model="formData" label-width="120px" :rules="rules">
         <el-form-item label="错误代码" prop="errorCode">
           <el-input v-model="formData.errorCode" placeholder="请输入错误代码" clearable />
         </el-form-item>
@@ -294,7 +293,7 @@ const handleSubmit = async () => {
 }
 
 /* 输入框标签固定四个字符宽度 */
-::v-deep .el-form-item__label {
+.el-form-item__label {
     // 字体大小14,4个字符,12px右间距
     width: 14*10px+12px;
     justify-content: start;

+ 85 - 26
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -27,9 +27,19 @@
       </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
-          <el-form-item label="推送用户:" style="width: 100%;" prop="roleMappingId">
-            <el-select v-model="Data.Filter.roleMappingId" multiple placeholder="请选择用户">
-              <el-option v-for="item in Data.roleList" :key="item.id" :label="item.name" :value="item.id" />
+          <el-form-item label="推送用户:" style="width: 100%;" prop="pushUserid">
+            <el-select
+              v-model="Data.Filter.pushUserid" 
+              placeholder="请选择用户"
+              multiple
+              style="width: 100%;"
+            > 
+              <el-option
+                v-for="user in Data.userList"
+                :key="user.id"
+                :label="`${user.userName} - ${user.nickname || user.phone}`" 
+                :value="user.id" 
+              />
             </el-select>
           </el-form-item>
         </el-form>
@@ -44,24 +54,24 @@
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="推送方式:" style="width: 100%;" prop="pushMethod">
-            <el-row style="width: 40%;">
+            <el-row style="width: 100%;">
               微信公众号<el-switch v-model="Data.radioValue1" style="margin-left: 3%;" @change="radioChange" />
             </el-row>
-            <el-row style="width: 40%;">
-              邮箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
+            <el-row style="width: 100%;">
+              邮&#8195;&#8195;&#8195;箱<el-switch v-model="Data.radioValue2" style="margin-left: 3%;" @change="radioChange" />
             </el-row>
           </el-form-item>
         </el-form>
       </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
-          <el-form-item label="模&#8195;&#8195;板:" style="width: 40%;" prop="mode1">
-            <el-select v-model="Data.mode1" class="m-2" placeholder="Select" v-if="Data.radioValue1" @change="modeChange">
+          <el-form-item label="模&#8195;&#8195;板:" style="width: 50%;" prop="mode1">
+            <el-select v-model="Data.mode1" class="m-2" placeholder="微信模板" v-if="Data.radioValue1" @change="modeChange">
               <el-option v-for="item in templateData.wxList" :key="item.id" :label="item.templateName" :value="item.id" />
             </el-select>
           </el-form-item>
-          <el-form-item style="width: 30%;" prop="mode2">
-            <el-select v-model="Data.mode2" class="m-2" placeholder="Select" v-if="Data.radioValue2" @change="modeChange">
+          <el-form-item label="&#8195;&#8195;&#8195;&#8195;" style="width: 100%;" prop="mode2">
+            <el-select v-model="Data.mode2" class="m-2" placeholder="邮箱模板" v-if="Data.radioValue2" @change="modeChange">
               <el-option v-for="item in templateData.emailList" :key="item.id" :label="item.name" :value="item.id" />
             </el-select>
           </el-form-item>
@@ -201,11 +211,11 @@
         <div v-for="(condition2, index) in Data.condition2" :key="index" 
              style="width: 100%;display: flex;justify-content: center;align-items: center; margin-top: 10px;">
           <el-form :inline="true" @submit.stop.prevent :model="condition2" :rules="condition2Rules">
-            <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 135%;">
+            <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 130%;">
               <el-row :gutter="20" style="width: 100%;">
                 <el-col :span="8">
                   <div style="display: flex; align-items: center;">
-                    <span style="margin-right: 13px;">维修类型:</span>
+                    <span style="margin-right: 13px;width: 90px;">维修类型:</span>
                     <el-form-item prop="proType">
                       <el-select v-model="condition2.proType" placeholder="请选择" style="flex: 1;">
                         <el-option 
@@ -268,6 +278,8 @@ import { pushTemplateApi } from "/@/api/admin/AlarmService/pushTemplateApi";
 import { TemplateFilterDto } from "/@/api/admin/AlarmService/pushTemplateDto";
 import eventBus from "/@/utils/mitt";
 import { ElMessage, type FormRules } from 'element-plus'
+import { UserListItem } from "/@/api/admin/AlarmService/alarmRulesDto"; // 用户数据类型
+
 
 // 条件验证规则
 const conditionRules = reactive<FormRules>({
@@ -288,7 +300,7 @@ const Data = reactive({
   Filter: {
     ruleName: '',
     roleMappingId: [],
-    labelId: null,
+    labelId: "",
     remark: '',
     pushMethod: '',
     pushTemplateMappingID: [],
@@ -298,13 +310,20 @@ const Data = reactive({
     triggerMethod: null, // 这里应根据实际情况设置默认值,比如0表示其中之一条件满足即触发
     triggerMethod2: null, // 这里应根据实际情况设置默认值,比如0表示其中之一条件满足即触发
     conditionsJson: '' as any,
-    MaintenanceJson: '' as any,
-    pushUserid: []
+    maintenanceJson: '' as any,
+    pushUserid: [] as number[], // 选中的用户ID数组
+    userName:"",
+    userPhone:"",
+    userId:"",
+    condition2:"",
+    condition:"",
+    mode1:""
   } as unknown as alarmRluesFilterModel,
   /** 角色列表 */
   roleList: [] as any,
   // 标签列表
   labelList: [] as any,
+  userList: [] as UserListItem[], // 用户列表
   /** 推送方式绑定数据 */
   radioValue1: false,
   radioValue2: false,
@@ -328,6 +347,32 @@ const Data = reactive({
   alarmproStatus: ["正在维修","结束维修"]
 })
 
+const getUserList = async () => {
+  try {
+    const res = await new alarmRulesApi().getList({
+      currentPage: 1, 
+      pageSize: 100,
+      filter: {
+        // 可选过滤条件(如用户名搜索)
+        userName: "",
+      },
+    });
+    
+    // 处理返回数据
+    Data.userList = res.data.list.map((user: UserListItem) => ({
+      id: user.userId,
+      userName: user.userName, // 下拉框显示名称
+      value: user.userId, // 选中值为用户ID
+      nickname: user.nickname,
+      phone: user.userPhone,
+    }));
+  } catch (error) {
+    console.error("获取用户列表失败:", error);
+    ElMessage.error("用户列表加载失败");
+  }
+};
+
+
 const templateData = reactive({
   Filter: {
     currentPage: 0,
@@ -414,10 +459,11 @@ const modeChange = (() => {
 })
 
 onMounted(() => {
-  getLabel()
-  getRole()
-  funSelect()
-})
+  getLabel();
+  getRole();
+  funSelect();
+  getUserList(); // 初始化时获取用户列表
+});
 
 // 添加报警条件
 const addCondition = () => {
@@ -500,7 +546,7 @@ const submitForm = async () => {
     ElMessage.warning('请选择标签')
     return
   }
-  if (!Data.Filter.roleMappingId || Data.Filter.roleMappingId.length === 0) {
+  if (!Data.Filter.pushUserid || Data.Filter.pushUserid.length === 0) {
     ElMessage.warning('请选择推送用户')
     return
   }
@@ -538,7 +584,16 @@ const submitForm = async () => {
       }
     }
   }
+  if (!Data.Filter.pushUserid || Data.Filter.pushUserid.length === 0) {
+    ElMessage.warning('请选择推送用户');
+    return;
+  }
   
+  let pushUserIds = Data.Filter.pushUserid;
+  if (!Array.isArray(pushUserIds)) {
+    pushUserIds = [pushUserIds]; // 转换为数组
+  }
+
   if (Data.showRepairConditions) {
     for (const cond of Data.condition2) {
       if (!cond.proType || !cond.proStatus) {
@@ -558,7 +613,8 @@ const submitForm = async () => {
   const submitData = {
     ...Data.Filter,
     conditionsJson: Data.showAlarmConditions ? JSON.stringify(Data.condition) : null,
-    MaintenanceJson: Data.showRepairConditions ? JSON.stringify(Data.condition2) : null
+    maintenanceJson: Data.showRepairConditions ? JSON.stringify(Data.condition2) : null,
+    pushUserid: pushUserIds,
   }
   
   console.log('提交数据', submitData)
@@ -580,13 +636,16 @@ const openDialog = (row: alarmRluesFilterModel) => {
   console.log(row)
   if(row){
     console.log(Data.Filter)
-    const { triggerMethod, triggerMethod2, ruleName, roleMappingId, labelId, ...rest } = Data.Filter;
+    const { triggerMethod, triggerMethod2, ruleName, roleMappingId, labelId,pushUserid,condition,condition2, ...rest } = Data.Filter;
     Data.Filter = { ...rest, ...row };
     Data.Filter.triggerMethod = triggerMethod || Data.Filter.triggerMethod;
     Data.Filter.triggerMethod2 = triggerMethod2 || Data.Filter.triggerMethod2;
     Data.Filter.roleMappingId = roleMappingId || Data.Filter.roleMappingId;
+    Data.Filter.condition2 = condition2 || Data.Filter.condition2;
+    Data.Filter.condition = condition || Data.Filter.condition;
     Data.Filter.labelId = labelId || Data.Filter.labelId;
     Data.Filter.ruleName = ruleName || Data.Filter.ruleName;
+    Data.Filter.pushUserid = pushUserid || Data.Filter.pushUserid;
 
     if (Data.Filter.isExclusive == '是') {
       Data.Filter.isExclusive = true;
@@ -617,9 +676,9 @@ const openDialog = (row: alarmRluesFilterModel) => {
     }
 
     // 解析维修条件
-    if (row.MaintenanceJson) {
+    if (row.maintenanceJson) {
       try {
-        const repairConditions = JSON.parse(row.MaintenanceJson);
+        const repairConditions = JSON.parse(row.maintenanceJson);
         if (repairConditions && repairConditions.length > 0) {
           Data.condition2 = repairConditions;
           Data.showRepairConditions = true;
@@ -642,7 +701,7 @@ const openDialog = (row: alarmRluesFilterModel) => {
       triggerMethod: null,
       triggerMethod2: null,
       conditionsJson: null,
-      MaintenanceJson: null,
+      maintenanceJson: null,
       pushUserid: []
     } as unknown as alarmRluesFilterModel;
   }
@@ -664,7 +723,7 @@ defineExpose({
   width: 60%;
 }
 
-.el-form .el-col.mb20 {
+.el-form .el-col{
   margin: 0 !important;
 }
 

+ 23 - 10
admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

@@ -13,13 +13,11 @@
                 </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>
-                             </el-form-item>
+                 <el-form-item label="状态">
+                   <el-select v-model="Data.Filter.isActive" placeholder="请选择状态">
+                     <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="推送方式">
@@ -63,7 +61,7 @@
             <el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation"
               width="100">
               <template #default="{ row }">
-                <el-link class="my-el-link mr12 ml12" @click="addAlarmRules(row)" type="primary" icon="ele-Edit"
+                <el-link class="my-el-link mr12 ml12" @click="addAlarmRules(row)" type="primary" icon="ele-EditPen"
                   :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>
@@ -110,14 +108,17 @@ const Data = reactive({
   /**条件查询模块 */
   Filter: {
     /** 规则名称 */
-    ruleName: ""
+    ruleName: "",
+    Status:"",
+    upload:"",
+    isActive:undefined
   } as alarmRluesFilterModel_SearchFilter,
   /**表格信息 */
   tableModel: [] as alarmRluesFilterModel[],
   /**动态表头 */
   dynamicColumns: [
     { prop: 'ruleName', label: '规则名称' },
-    { prop: 'companyName', label: '角色' },
+    { prop: 'userName', label: '用户' },
     { prop: 'pushMethod', label: '推送方式' },
     { prop: 'triggerMethod', label: '触发方式' },
     { prop: 'regular', label: '正则匹配' },
@@ -137,6 +138,18 @@ const Data = reactive({
   } as PageInputAlarmRluesFilterModel,
 })
 
+// 定义状态选项
+const StatusOptions = [
+  { value: '', label: '所有' },
+  { value: true, label: '启用' },
+  { value: false, label: '禁用' }
+];
+
+enum upload {
+  email="电子邮箱",
+  vx="微信"
+}
+
 /**引入组件*/
 const EditDialog = defineAsyncComponent(() => import('./components/add-alarmRules.vue'))
 const editDialogRef = ref()

+ 329 - 153
admin.ui.plus-master/src/views/admin/yujing/alarmRules/userList/index.vue

@@ -1,34 +1,23 @@
-
 <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.userName" 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.nickname" 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.userRole" placeholder="请输入用户角色" clearable></el-input>
-                </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-input v-model="state.filter.userPhone" 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-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="选择添加时间">
                   <el-date-picker
                     v-model="state.filter.createtime"
                     type="datetimerange"
@@ -39,41 +28,40 @@
                   />
                 </el-form-item>
               </el-col>
-</el-form-item>
+            </el-form-item>
           </el-form>
 
           <hr>
 
-<el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">
-  <el-row>
-<el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-<el-button  type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
-</el-row>
-<el-button  type="primary" icon="ele-Plus" @click="onAdd"> 添加 </el-button>
-
-</el-row>
-</el-card>
+          <el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">
+            <el-row>
+              <el-button type="primary" icon="ele-Search" @click="onQuery">查询</el-button>
+              <el-button type="primary" icon="ele-RefreshRight" @click="onReset">重置</el-button>
+            </el-row>
+            <el-button type="primary" icon="ele-Plus" @click="onAdd">添加</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 label="操作" fixed="right" header-align="center" align="center" class="right-operation" width="140">
+              <template #default="{ row }">
+                <el-link
                   class="my-el-link mr12 ml12"
                   type="primary"
-                  icon="ele-Upload"
+                  icon="ele-Delete"
                   @click="onDataDelete(row)"
                   :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"
@@ -86,146 +74,334 @@
               layout="total, sizes, prev, pager, next, jumper"
             />
           </div>
-</el-card>
+        </el-card>
       </el-col>
-</el-row>
-    </div>
-  </template>
-  <script setup lang="ts">
-  import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
-  import eventBus from "/@/utils/mitt";
-  import {Api} from "/@/api/admin/AlarmService/userList";
-import { PushUsersDto } from "/@/api/admin/AlarmService/userListDto";
-import type { pageInput } from "/@/api/admin/AlarmService/userListDto";
+    </el-row>
 
+    <!-- 添加用户弹窗 -->
+    <el-dialog 
+      v-model="addDialogVisible" 
+      title="添加用户"
+      @close="handleDialogClose"
+    >
+      <el-form 
+        :model="addForm" 
+        :rules="addFormRules" 
+        ref="addFormRef"
+        label-width="100px"
+      >
+        <!-- 用户名称下拉框 -->
+        <el-form-item label="用户名称" prop="userName">
+          <el-select
+            v-model="selectedUserId"
+            placeholder="请选择微信用户"
+            :options="wxUserOptions"
+            :loading="wxUserLoading"
+            @change="handleUserSelect"
+            filterable
+            remote
+            :remote-method="searchWxUsers"
+            :no-data-text="noDataText"
+            style="width: 300px;"
+          >
+            <el-option
+              v-for="user in wxUserOptions"
+              :key="user.userid"
+              :label="`${user.nickname || user.userName} - ${user.phone}`"
+              :value="user.userid"
+            />
+          </el-select>
+        </el-form-item>
+
+        <!-- 自动填充字段 -->
+        <el-form-item label="用户ID" prop="userId">
+          <el-input v-model="addForm.userId" disabled />
+        </el-form-item>
+        <el-form-item label="微信昵称" prop="nickname">
+          <el-input v-model="addForm.nickname" disabled />
+        </el-form-item>
+        <el-form-item label="用户手机号" prop="userPhone">
+          <el-input v-model="addForm.userPhone" disabled />
+        </el-form-item>
+        <el-form-item label="添加时间" prop="createtime">
+          <el-date-picker
+            v-model="addForm.createtime"
+            type="datetime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择添加时间"
+            required
+          />
+        </el-form-item>
+      </el-form>
+
+      <template #footer>
+        <el-button @click="addDialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleSubmit">确认添加</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import eventBus from "/@/utils/mitt";
+import { Api } from "/@/api/admin/AlarmService/userList";
+import { PushUsersDto } from "/@/api/admin/AlarmService/userListDto";
+import type { pageInput, WxUserinfo } from "/@/api/admin/AlarmService/userListDto";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage, FormRules } from "element-plus";
+import { getWxUserPage } from "/@/api/admin/AlarmService/userList";
 
-// 使用组合式函数获取分页状态
-const pageState = useDynamicPageSize(10, 15);
+const addDialogVisible = ref<boolean>(false);
+const noDataText = ref<string>('暂无匹配用户');
+const selectedUserId = ref<number | null>(null);
+const wxUserOptions = ref<WxUserinfo[]>([]);
+const wxUserLoading = ref(false);
+const wxUserPage = ref(1);
+const addFormRef = ref<HTMLFormElement | null>(null);
 
-/**数据对象*/
-  const state = reactive({
-    /**加载显示 */
-    loading: false,
-    /**条件查询模块 */
+const addFormRules = reactive<FormRules>({
+  userName: [{ required: true, message: "请选择用户", trigger: "change" }],
+  createtime: [{ required: true, message: "请选择添加时间", trigger: "change" }],
+});
+
+const addForm = reactive<PushUsersDto>({
+  userId: 0,
+  userName: "",
+  nickname: "",
+  userPhone: "",
+  userOpenid: "",
+  createtime: new Date().toISOString().split("T")[0] + "T00:00:00",
+  stime: "",
+  etime: "",
+});
+
+const handleSubmit = async () => {
+  if (!addFormRef.value) return;
+  await (addFormRef.value as any).validate(async (valid: boolean) => {
+    if (!valid) return;
+
+    try {
+      const uploadData: PushUsersDto = {
+        userId: addForm.userId,
+        userName: addForm.userName,
+        nickname: addForm.nickname,
+        userPhone: addForm.userPhone,
+        userOpenid: addForm.userOpenid,
+        createtime: addForm.createtime,
+        stime: addForm.createtime,
+        etime: addForm.createtime,
+      };
+
+      const res = await new Api().uploadPushUsers(uploadData);
+
+      if (res.success) {
+        ElMessage.success("用户上传成功");
+        resetForm();
+        addDialogVisible.value = false;
+        await init();
+      } else {
+        ElMessage.error(res.msg || "上传失败");
+      }
+    } catch (error) {
+      ElMessage.error("网络请求失败,请重试");
+    }
+  });
+};
+
+const handleDialogClose = () => {
+  resetForm();
+};
+
+const resetForm = () => {
+  addForm.userId = 0;
+  addForm.userName = "";
+  addForm.nickname = "";
+  addForm.userPhone = "";
+  addForm.userOpenid = "";
+  addForm.createtime = new Date().toISOString().split("T")[0] + "T00:00:00";
+  addForm.stime = "";
+  addForm.etime = "";
+  selectedUserId.value = null;
+  wxUserOptions.value = [];
+};
+
+const searchWxUsers = async (keyword: string) => {
+  if (keyword.length < 2 && keyword.trim() !== "") return;
+  
+  wxUserLoading.value = true;
+  wxUserPage.value = 1;
+  
+  try {
+    const res = await getWxUserPage({
+      currentPage: wxUserPage.value - 1,
+      pageSize: 20,
       filter: {
-/**用户名称 */
-        userName: "",
-/**微信昵称 */
-        nickname: "",
-/**用户角色 */
-        userRole: "",
-/**用户手机号 */
-        userPhone: "",
-/**添加时间 */
-        createtime: [] as string[]
+        nickname: keyword,
+        userName: keyword,
+        phone: keyword,
+        userid: 0
       },
-  /**表格信息 */
-tableModel: [] as PushUsersDto,
-    /**动态表头 */
-    dynamicColumns: [
-{ prop: 'userId', label: '用户id' },
-{ prop: 'userName', label: '用户名称' },
-{ prop: 'nickname', label: '微信昵称' },
-{ prop: 'userPhone', label: '用户手机号' },
-{ prop: 'userOpenid', label: '用户Openid' },
-{ prop: 'createtime', label: '添加时间' },],
-/**分页标识 */
-    pageInput:{
-      CurrentPage: 1,
-      PageSize: 10,
-    } as pageInput,
-    /**分页总数 */
-    total: 0,
-})
-  onMounted(() => {
-  // 初始化分页大小
-  state.pageInput.PageSize = pageState.pageInput.pageSize;
-    init()
-    eventBus.off('refreshView')
-    eventBus.on('refreshView', async () => {
-      await init()
-    })
-    console.log()
-  })
-  onBeforeMount(() => {
-    eventBus.off('refreshView')
-  })
-
-  /**
-* 页条变化
-* @param val
-*/
+    });
+    
+    if (res.success) {
+      wxUserOptions.value = res.data.list.map((user: { nickname: any; userName: any; phone: any; }) => ({
+        ...user,
+        label: `${user.nickname || user.userName} - ${user.phone}`,
+      }));
+    } else {
+      ElMessage.error(res.msg || "搜索用户失败");
+    }
+  } catch (error) {
+    ElMessage.error("网络请求失败,请重试");
+  } finally {
+    wxUserLoading.value = false;
+  }
+};
+
+const handleUserSelect = (userid: number | null) => {
+  if (!userid) return;
+  const user = wxUserOptions.value.find(u => u.userid === userid);
+  if (user) {
+    addForm.userId = user.userid;
+    addForm.userName = user.userName || "";
+    addForm.nickname = user.nickname || "";
+    addForm.userPhone = user.phone || "";
+    addForm.userOpenid = user.openid || "";
+  } else {
+    addForm.userId = 0;
+    addForm.userName = "";
+    addForm.nickname = "";
+    addForm.userPhone = "";
+    addForm.userOpenid = "";
+  }
+};
+
+watch(addDialogVisible, (visible) => {
+  if (visible) {
+    selectedUserId.value = null;
+    wxUserOptions.value = [];
+    searchWxUsers("");
+  }
+});
+
+const pageState = useDynamicPageSize(10, 15);
+
+const state = reactive({
+  loading: false,
+  wxUserList: [] as WxUserinfo[],
+  wxTotal: 0,
+  filter: {
+    userName: "",
+    userPhone: "",
+    createtime: [] as string[], // 存储时间范围数组 [startTime, endTime]
+  },
+  tableModel: [] as PushUsersDto[],
+  dynamicColumns: [
+    { prop: 'userId', label: '用户id' },
+    { prop: 'userName', label: '用户名称' },
+    { prop: 'nickname', label: '微信昵称' },
+    { prop: 'userPhone', label: '用户手机号' },
+    { prop: 'userOpenid', label: '用户Openid' },
+    { prop: 'createtime', label: '添加时间' },
+  ],
+  pageInput: {
+    currentPage: 1,
+    pageSize: 10,
+  } as pageInput,
+  total: 0,
+});
+
+onMounted(() => {
+  state.pageInput.pageSize = pageState.pageInput.pageSize;
+  init();
+  eventBus.on('refreshView', async () => await init());
+});
+
+onBeforeMount(() => {
+  eventBus.off('refreshView');
+});
+
 const onSizeChange = (val: number) => {
-  state.pageInput.PageSize = val
-  init()
-}
+  state.pageInput.pageSize = val;
+  init();
+};
 
-/**
- * 页数 变化
- * @param val
- */
 const onCurrentChange = (val: number) => {
-  state.pageInput.CurrentPage = val
-  init()
-}
-  /**
-  * 监听变换
-  */
-  watch(() => {})
-/**条件查询 */
-          const onQuery = () => {
-          init()
-        }
-        /**初始化 */
+  state.pageInput.currentPage = val;
+  init();
+};
+
+const onQuery = () => {
+  init();
+};
+
 const init = async () => {
   state.loading = true;
-  
-  // 处理时间范围
+
+  // 解析时间范围:从 createtime 数组中获取 start/end 时间
+  const [stime, etime] = state.filter.createtime || [];
+
+  // 构建过滤参数(与后端接口参数名匹配,如 startTime/endTime)
   const filterData = {
-    ...state.filter,
-    startTime: state.filter.createtime?.[0] || null, // 开始时间
-    endTime: state.filter.createtime?.[1] || null,   // 结束时间
-    createtime: undefined, // 避免发送 createtime 数组
+    userName: state.filter.userName,
+    userPhone: state.filter.userPhone,
+    stime, // 开始时间
+    etime,   // 结束时间
   };
 
-  const res: any = await new Api().getList({
-    ...state.pageInput,
-    Filter: filterData,
-  });
+  // 处理分页参数(确保 currentPage 为有效整数,后端从 0 开始分页)
+  const pageParams = {
+    currentPage: state.pageInput.currentPage - 1,
+    pageSize: state.pageInput.pageSize,
+  };
 
-  state.total = res?.data?.total ?? 0;
-  state.tableModel = res?.data?.list ?? [];
-  state.loading = false;
+  try {
+    // 调用查询接口,传递分页参数和过滤条件
+    const res = await new Api().getList({
+      ...pageParams,
+      filter: filterData, // 假设后端接口接收 filter 对象包含 startTime/endTime
+    });
+
+    state.total = res.data.total || 0;
+    state.tableModel = res.data.list || [];
+  } catch (error) {
+    ElMessage.error("数据加载失败");
+  } finally {
+    state.loading = false;
+  }
+};
+
+const onReset = () => {
+  state.filter = {
+    userName: "",
+    userPhone: "",
+    createtime: [], // 清空时间范围
+  };
+  init(); // 重置后重新查询
+};
+
+const onAdd = () => {
+  addDialogVisible.value = true;
+};
+
+const onDataDelete = (row: any) => {
+  // 待实现删除逻辑
 };
-/**添加 */
-        const onAdd=()=>{}
-/**重置 */
-        const onReset=()=>{
-          state.filter.userPhone='',
-        state.filter.userName= "",
-        state.filter.nickname="",
-        state.filter.userRole="",
-        state.filter.createtime=[]
-        }
-/**删除 */
-      const onDataDelete=(row)=>{}
 </script>
+
 <style scoped lang="scss">
 .el-input,
 .el-select {
   width: 240px;
 }
 
-/* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*6px+12px;
+  width: calc(14px * 6 + 12px);
   justify-content: start;
 }
 
-/* 数据表头 设置灰色样式 */
 ::v-deep .el-table th.el-table__cell {
   background-color: #F6F6F6;
 }
-  </style>
+</style>

+ 7 - 1
admin.ui.plus-master/src/views/example/application/applicationManage/components/org-form.vue

@@ -26,6 +26,11 @@
               <el-input v-model="form.code" clearable />
             </el-form-item>
           </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="最小版本" prop="code">
+              <el-input v-model="form.minVersion" clearable />
+            </el-form-item>
+          </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
             <el-form-item label="排序">
               <el-input-number v-model="form.sort" />
@@ -69,7 +74,8 @@ const state = reactive({
     appid: '',
     name: '',
     code: '',
-    sort: ''
+    sort: '',
+    minVersion:'',
   } as OauthApplyDto,
 })
 

+ 10 - 4
admin.ui.plus-master/src/views/example/application/applicationManage/index.vue

@@ -24,11 +24,14 @@
               <div class="flex delete" @click="onDelete(v)">X</div>
             </div>
             <div class="flex" style="flex: 1;">{{ v.name }}</div>
-            <div class="flex" style="height: 50px;width: 100%;">
+            <div class="flex" style="flex: 1;">最小可用版本:{{ v.minVersion }}</div>
+            <div class="flex" style="height: 75px;width: 100%;">
               <el-row style="width: 100%">
-                <el-col :span="8"><el-button style="width: 100%;height: 50px;border-radius: 0" type="primary" @click="toPermissPage(v)">权限</el-button></el-col>
-                <el-col :span="8"><el-button style="width: 98%;height: 50px;border-radius: 0;" type="primary" @click="toRolePage(v)">角色</el-button></el-col>
-                <el-col :span="8"><el-button style="width: 100%;height: 50px;border-radius: 0;" type="primary" @click="toViewPage(v)">视图</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0" type="primary" @click="toPermissPage(v)">权限</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;" type="primary" @click="toRolePage(v)">角色</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;" type="primary" @click="toViewPage(v)">视图</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="toEquipmentPage(v)">设备管理</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="onEdit(v)">修改</el-button></el-col>
               </el-row>
             </div>
           </div>
@@ -113,6 +116,9 @@ const toViewPage = (row: OauthApply) => {
 const toPermissPage = (row: OauthApply) => {
   router.push({path:`/platform/application/permissionManage/${row.name}`})
 }
+const toEquipmentPage = (row: OauthApply) => {
+  router.push({path:`/platform/application/equipment/${row.name}`})
+}
 </script>
 
 <style scoped lang="scss">

+ 136 - 0
admin.ui.plus-master/src/views/example/application/equipment/components/equipment-edit.vue

@@ -0,0 +1,136 @@
+<template>
+    <div class="admin-authorize-editInfo">
+      <el-dialog :title="formData.titleText" v-model="formData.isShowing" draggable width="769px">
+        <el-form :model="formData.editData"
+                 :rules="rules"
+                 ref="formRef"
+                 v-loading="formData.loading"
+                 size="default"
+                 label-width="80px">
+          <el-row :gutter="35">
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item label="SN" prop="sn">
+                <el-input v-model="formData.editData.sn" :disabled="formData.opration != 'add'" placeholder="请输入sn"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item label="账号" prop="account">
+                <el-input v-model="formData.editData.account" :disabled="formData.opration != 'add'" placeholder="请输入登录账号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="状态" prop="status">
+              <el-select :disabled="formData.opration == 'delete'" v-model="formData.editData.status" placeholder="请设置设备状态" >
+                <el-option v-for="(value, key) in statusType" :key="key" :label="value.name"  :value="value.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item  label="有效期" prop="validityTime">
+                <el-date-picker :disabled="formData.opration == 'delete'" v-model="formData.editData.validityTime" type="datetime"
+                                        value-format="YYYY-MM-DD HH:mm:ss" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button @click="onCancel" icon="ele-CircleClose" size="default">取 消</el-button>
+            <el-button type="primary" @click="onSubmit" size="default">确 认</el-button>
+          </span>
+        </template>
+      </el-dialog>
+    </div>
+  </template>
+  
+  <script setup lang="ts">
+  import {defineAsyncComponent, reactive, ref, watch, inject, computed} from "vue";
+  import {FormRules} from "element-plus";
+  import eventBus from "/@/utils/mitt";
+import { EquipmentGetPageOutput } from "/@/api/admin/data-contracts";
+import { PermissionApi } from "/@/api/admin/Permission";
+
+  /**数据对象 */
+  const formData = reactive({
+    isShowing:false,
+    loading: false,
+    opration:"add",
+    titleText:'',
+    editData:{} as EquipmentGetPageOutput
+  })
+
+  /**表单校验*/
+  const rules = reactive<FormRules>({
+    sn: [
+      { required: true, message: '请输入sn', trigger: 'blur' },
+    ],
+    account: [
+      { required: true, message: '请输入登录账户', trigger: 'blur' },
+    ],
+    status: [
+      { required: true, message: '请选择状态', trigger: 'blur' },
+    ],
+    validityTime: [
+      { required: true, message: '请确认有效期', trigger: 'blur' },
+    ]
+  })
+  
+  const statusType = reactive([
+    { name: "关闭", value: 0 }, // 红色表示关闭
+    { name: "开启", value: 1 }, // 绿色表示开启
+  ])
+  /**
+   * 表单对象
+   */
+  const formRef = ref()
+  
+  const openDialog = (opration:string,val:EquipmentGetPageOutput) => {
+    formData.isShowing = true
+    formData.opration = opration
+    if(opration == "edit"){
+      formData.editData = val
+      formData.titleText = '编辑设备'
+    } else if (opration == "delete") {
+      formData.editData = val
+      formData.titleText = '是否删除设备'
+    } else {
+      formData.editData = {} as EquipmentGetPageOutput
+      formData.titleText = '添加设备'
+      formData.editData.status = 1
+      formData.editData.appid = val.appid
+    }
+  }
+  
+  const onCancel = () => {
+    formData.editData = {} as EquipmentGetPageOutput
+  }
+
+  const onSubmit =  () => {
+    formRef.value.validate(async (valid: boolean) =>{
+      if(!valid) return
+
+      formData.loading = true
+
+      if(formData.opration == 'delete') {
+        let res = await new PermissionApi().deleteEquipment({id:formData.editData.id})
+      } else {
+        let request = JSON.parse(JSON.stringify(formData.editData)) 
+        let res = await new PermissionApi().uploadEquipment(request as EquipmentGetPageOutput)
+      }
+      
+      eventBus.emit('refreshView')
+
+      formData.editData = {} as EquipmentGetPageOutput
+      formData.loading = false
+      formData.isShowing = false
+    })
+  }
+  
+  defineExpose({
+    openDialog,
+  })
+  </script>
+  <style scoped lang="scss">
+  
+  </style>
+  

+ 230 - 0
admin.ui.plus-master/src/views/example/application/equipment/index.vue

@@ -0,0 +1,230 @@
+<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-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.appName" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
+            </el-form-item>
+           </el-col>
+           <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="设备sn">
+                  <el-input v-model="state.filter.SN" placeholder="请输入设备sn" 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.Account" 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.Status" placeholder="请选择设备状态" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form-item>
+          </el-form>
+
+          <hr>
+
+          <el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">
+          <el-row>
+            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+            <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+          </el-row>
+          <el-row>
+            <el-button type="primary" icon="ele-Plus" @click="onAdd"> 添加 </el-button>
+            </el-row>
+          </el-row>
+          </el-card>
+      </el-col>
+      <!--表格-->
+      <el-col :xs="24">
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+          <el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+            <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop"
+              :label="column.label">
+              <template #default="{ row }">
+                                <!-- 如果是状态列,使用 StatusBox 组件 -->
+                                <StatusBox 
+                                    v-if="column.prop === 'status'" 
+                                    :status="getStatusInfo(row[column.prop]).name"  />
+                                <!-- 其他列保持原有逻辑 -->
+                                <span v-else>
+                                    {{ row[column.prop] }}
+                                </span>
+                            </template>
+            </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" @click="onDateUpdate(row)"
+                  :underline="false" target="_blank">编辑</el-link>
+                <el-link class="my-el-link mr12 ml12" type="primary" icon="ele-Delete" @click="onDataDelete(row)"
+                  :underline="false" target="_blank">删除</el-link>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination v-model:currentPage="pageState.pageInput.currentPage"
+                            v-model:page-size="pageState.pageInput.pageSize" :total="state.total"
+                            :page-sizes="[10, 15, 20, 50, 100]" small background @size-change="onSizeChange"
+                            @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <EquipmentEditDialog ref="equipmentEditRef"></EquipmentEditDialog>
+  </div>
+</template>
+<script setup lang="ts">
+import { defineAsyncComponent, onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import eventBus from "/@/utils/mitt";
+import { EquipmentGetPageOutput } from "/@/api/admin/data-contracts";
+import type { pageInput } from "/@/api/admin/data-contracts";
+import { PermissionApi } from "/@/api/admin/Permission";
+import router from "/@/router";
+import StatusBox from "/@/components/StatusBox.vue";
+import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+
+
+
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
+
+/**引入组件*/
+const EquipmentEditDialog = defineAsyncComponent(() => import('./components/equipment-edit.vue'))
+const equipmentEditRef = ref()
+
+/**数据对象*/
+const state = reactive({
+  /**加载显示 */
+  loading: false,
+  appName:"",
+  /**条件查询模块 */
+  filter: {
+    /** appid */
+    Appid:"",
+    /**设备sn */
+    SN: null,
+    /**登录账户 */
+    Account: null,
+    /**设备状态 */
+    Status: null,
+  },
+  /**表格信息 */
+  tableModel: [] as unknown as EquipmentGetPageOutput,
+  /**动态表头 */
+  dynamicColumns: [
+    { prop: 'sn', label: '设备sn' },
+    { prop: 'account', label: '登录账户' },
+    { prop: 'status', label: '设备状态' },
+    { prop: 'loginTime', label: '最近一次登录时间' },
+    { prop: 'validityTime', label: '登录有效期' },],
+  /**分页标识 */
+  pageInput: {
+    CurrentPage: 1,
+    PageSize: 10,
+  } as pageInput,
+  /**分页总数 */
+  total: 0,
+})
+
+// 状态映射表
+const statusMap = {
+  0: { name: "关闭", color: "#F56C6C" }, // 红色表示关闭
+  1: { name: "开启", color: "#67C23A" }, // 绿色表示开启
+};
+
+// 根据 status 值获取映射后的对象
+const getStatusInfo = (status: number) => {
+  return statusMap[status] || { name: "未知状态", color: "#000" };
+};
+
+onMounted(() => {
+   // 初始化分页大小
+  state.pageInput.PageSize = pageState.pageInput.pageSize;
+  state.pageInput.CurrentPage = 1; // 初始化时重置为第一页
+  init()
+  eventBus.off('refreshView')
+  eventBus.on('refreshView', async () => {
+    await init()
+  })
+  console.log()
+})
+onBeforeMount(() => {
+  eventBus.off('refreshView')
+})
+/**
+* 监听变换
+*/
+// watch(() => { })
+/**条件查询 */
+const onQuery = async () => {
+  state.loading = true
+  const res: any = await new PermissionApi().getEquipmentList({ 
+    ...state.pageInput, 
+    "Filter.Appid":state.filter.Appid,
+    "Filter.SN":state.filter.SN,
+    "Filter.Account":state.filter.Account,
+    "Filter.Status":state.filter.Status,
+  })
+  state.total = res?.data?.total ?? 0
+  state.tableModel = res?.data?.list ?? []
+  state.loading = false
+}
+/**初始化 */
+const init = async () => {
+  state.loading = true
+  const name = router.currentRoute.value.params.id
+  const appData=await new PermissionApi().getApplyInfo({Name:name})
+  state.appName = appData.data[0].name
+  state.filter.Appid = appData.data[0].appid
+  state.loading = false
+  onQuery()
+}
+/**添加 */
+const onAdd = () => {
+  equipmentEditRef.value.openDialog('add',{appid:state.filter.Appid})
+}
+/**重置 */
+const onReset = () => { }
+/**编辑 */
+const onDateUpdate = (row) => {
+  equipmentEditRef.value.openDialog('edit',row)
+ }
+/**删除 */
+const onDataDelete = (row) => {
+  equipmentEditRef.value.openDialog('delete',row)
+ }
+
+const onSizeChange = () => {
+}
+
+const onCurrentChange = () => {
+}
+</script>
+<style scoped lang="scss">
+.el-input,
+.el-select {
+  width: 240px;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+  // 字体大小14,4个字符,12px右间距
+  width: 14*4px+12px;
+  justify-content: start;
+}
+
+/* 数据表头 设置灰色样式 */
+::v-deep .el-table th.el-table__cell {
+  background-color: #F6F6F6;
+}
+</style>