瀏覽代碼

feat:生成微信账号绑定列表、维修记录、计控主板列表以及项目表页面,配置优化页面,配置完善路由

huang, kai (Contractor) 7 月之前
父節點
當前提交
e67eb19557

+ 338 - 0
admin.ui.plus-master/baoliubaoliu.html

@@ -0,0 +1,338 @@
+
+<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.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-input v-model="state.filter.projectCode" placeholder="单行输入" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                  <el-form-item label="选择时间">
+                    <el-date-picker
+                      v-model="state.filter.projectLaunchDate"
+                      type="datetimerange"
+                      value-format="YYYY-MM-DD HH:mm:ss"
+                      range-separator="To"
+                      start-placeholder="开始日期"
+                      end-placeholder="结束日期"
+                    />
+                  </el-form-item>
+                </el-col>
+  </el-form-item>
+            </el-form>
+  
+            <hr>
+  
+            <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
+              <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-CirclePlus" @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"  >
+          </el-table-column> 
+  <el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="150">
+          <template #default="{ row }" >
+                    <el-link
+                    class="my-el-link mr12 ml12"
+                    type="primary"
+                    icon="ele-Upload"
+                    @click="onDateUpdate(row)"
+                    :underline="false"
+                    target="_blank"
+                  >编辑</el-link>
+                  <el-link
+                    class="my-el-link mr12 ml12"
+                    type="primary"
+                    icon="ele-Upload"
+                    @click="gotoSoftwarePackage"
+                    :underline="false"
+                  >跳转到软件包</el-link>
+  </template>
+              </el-table-column>
+  </el-table>
+  <!-- <div class="my-flex my-flex-end" style="margin-top: 20px">
+              <el-pagination
+                v-model:currentPage="state.pageInput.CurrentPage"
+                v-model:page-size="state.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> -->
+            <div class="my-flex my-flex-end" style="margin-top: 20px">
+              <el-pagination 
+              v-model:currentPage="pageState.pageInput.currentPage"
+              v-model:page-size="pageState.pageInput.pageSize" 
+              :total="state.total" 
+              :page-sizes="[10, 15, 20, 50, 100]"
+              small 
+              background 
+              @size-change="onSizeChange" 
+              @current-change="onCurrentChange"
+              layout="total, sizes, prev, pager, next, jumper" />
+            </div>
+  </el-card>
+        </el-col>
+  </el-row>
+      </div>
+  
+      <el-dialog v-model="state.dialogVisible" :title="state.dialogTitle" width="50%"> 
+         <el-form :model="state.formData" label-width="120px">
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="state.formData.projectName" placeholder="请输入项目名称" />
+      </el-form-item>
+      <el-form-item label="项目编码" prop="projectCode">
+        <el-input v-model="state.formData.projectCode" placeholder="请输入项目编码" />
+      </el-form-item>
+      <el-form-item label="项目介绍" prop="projectDescription">
+        <el-input 
+          v-model="state.formData.projectDescription" 
+          type="textarea" 
+          :rows="3" 
+          placeholder="请输入项目介绍" 
+        />
+      </el-form-item>
+      <el-form-item label="项目上线时间" prop="projectLaunchDate">
+        <el-date-picker
+          v-model="state.formData.projectLaunchDate"
+          type="datetime"
+          placeholder="选择上线时间"
+          value-format="YYYY-MM-DD HH:mm:ss"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="state.dialogVisible = false">取消</el-button>
+      <el-button type="primary" @click="onSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+  
+  
+    </template>
+    <script setup lang="ts">
+    import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
+    import eventBus from "/@/utils/mitt";
+    import {Api} from "/@/api/admin/productionManagement/slelist";
+  import { ProjectGetPageDto } from "/@/api/admin/productionManagement/slelistDto";
+  import type { pageInput } from "/@/api/admin/productionManagement/slelistDto";
+  import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+  import { ElMessage } from "element-plus";
+  import { useRouter } from 'vue-router'
+  
+  const router = useRouter()
+  
+  // 使用组合式函数获取分页状态
+  const pageState = useDynamicPageSize(10, 15);
+  
+  /**数据对象*/
+    const state = reactive({
+      /**加载显示 */
+      loading: false,
+      /**条件查询模块 */
+        filter: {
+  /**项目名称 */
+          projectName: "",
+  /**项目编码 */
+          projectCode: "",
+  /**项目上线时间 */
+          projectLaunchDate:[] as string[],
+          beginTime:"",
+          endTime:""
+        },
+    /**表格信息 */
+  tableModel: [] as ProjectGetPageDto,
+      /**动态表头 */
+      dynamicColumns: [
+  { prop: 'projectName', label: '项目名称' },
+  { prop: 'projectCode', label: '项目编码' },
+  { prop: 'projectDescription', label: '项目介绍' },
+  { prop: 'projectLaunchDate', label: '项目上线时间' },],
+  /**分页标识 */
+      pageInput:{
+        CurrentPage: 1,
+        PageSize: 10,
+      } as pageInput,
+      /**分页总数 */
+      total: 0,
+    dialogVisible: false,
+    dialogTitle: "添加项目",
+    formData: {
+      projectName: "",
+      projectCode: "",
+      projectDescription: "",
+      projectLaunchDate: ""
+    } as ProjectGetPageDto
+  })
+  onMounted(() => {
+    state.pageInput.PageSize = pageState.pageInput.pageSize
+    init()
+  })
+  
+    onBeforeMount(() => {
+      eventBus.off('refreshView')
+    })
+  
+  /**
+   * 页条变化
+   * @param val
+   */
+   const onSizeChange = (val: number) => {
+    state.pageInput.PageSize = val
+    onQuery()
+  }
+  
+  /**
+   * 页数变化
+   * @param val
+   */
+  const onCurrentChange = (val: number) => {
+    state.pageInput.CurrentPage = val
+    onQuery()
+  }
+  
+    /**
+    * 监听变换
+    */
+    watch(
+    () => state.filter.projectLaunchDate,
+    (newVal) => {
+      if (newVal && newVal.length === 2) {
+        state.filter.beginTime = newVal[0]
+        state.filter.endTime = newVal[1]
+      } else {
+        state.filter.beginTime = ""
+        state.filter.endTime = ""
+      }
+    },
+    { deep: true }
+  )
+  /**条件查询 */
+  const onQuery = () => {
+    const { projectLaunchDate, ...filterParams } = state.filter
+    init({
+      ...state.pageInput,
+      Filter: filterParams
+    })
+  }
+  
+  // 初始化数据
+  const init = async (params?: any) => {
+    state.loading = true
+    try {
+      const res = await new Api().getList(params || {
+        ...state.pageInput,
+        Filter: {
+          projectName: state.filter.projectName,
+          projectCode: state.filter.projectCode,
+          beginTime: state.filter.beginTime,
+          endTime: state.filter.endTime
+        }
+      })
+      state.tableModel = res?.data?.list ?? []
+      state.total = res?.data?.total ?? 0
+    } catch (error) {
+      ElMessage.error("查询失败")
+    } finally {
+      state.loading = false
+    }
+  }
+  /**重置 */
+  const onReset = () => {
+    state.filter = {
+      projectName: "",
+      projectCode: "",
+      projectLaunchDate: [],
+      beginTime: "",
+      endTime: ""
+    }
+    onQuery()
+  }
+  /**编辑 */
+  const onDateUpdate = (row) => {
+    state.dialogTitle = "编辑项目"
+    state.formData = { ...row } // 深拷贝当前行数据到表单
+    state.dialogVisible = true
+  }
+  
+  const onAdd = () => {
+    state.dialogTitle = "添加项目"
+    state.dialogVisible = true
+    state.formData = {
+      projectName: "",
+      projectCode: "",
+      projectDescription: "",
+      projectLaunchDate: ""
+    }
+  }
+  
+  // 表单提交(新增或编辑)
+  const onSubmit = async () => {
+    try {
+      state.loading = true
+      let res
+      if (state.formData.id) {
+        // 编辑:调用更新接口
+        res = await new Api().updateProject(state.formData)
+        ElMessage.success("更新成功")
+      } else {
+        // 新增:调用添加接口
+        res = await new Api().uploadProject(state.formData)
+        ElMessage.success("添加成功")
+      }
+      state.dialogVisible = false
+      await init() // 刷新列表
+    } catch (error) {
+      ElMessage.error(state.formData.id ? "更新失败" : "添加失败")
+    } finally {
+      state.loading = false
+    }
+  }
+  
+  // 跳转到软件包页面
+  const gotoSoftwarePackage = () => {
+    router.push('/product/softwarePackageManagement')
+  }
+  </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>

+ 36 - 0
admin.ui.plus-master/src/api/admin/deviceAuthorization/problemData.ts

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

+ 45 - 0
admin.ui.plus-master/src/api/admin/deviceAuthorization/problemDataDto.ts

@@ -0,0 +1,45 @@
+/** 查询信息输出 */
+  export interface ResultOutputPageOutputErrorCodeLibraryDto{
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+ data?:PageOutputErrorCodeLibraryDto[] | null
+}
+    export interface PageOutputErrorCodeLibraryDto{
+      /**
+      * 数据总数
+      * @format int64
+      */
+      total?: number
+      /** 数据 */
+      list?: ErrorCodeLibraryDto[] | null
+    }
+    export interface ErrorCodeLibraryDto{
+   /** 错误代码 */
+      errorCode?: string
+   /** 错误的详细描述 */
+      description?: string
+   /** 错误发生的模块或系统 */
+      module?: string
+   /** 错误的严重程度(轻微、普通、严重) */
+      severity?: string
+   /** 错误可能发生的原因 */
+      possibleCauses?: string
+   /** 诊断说明 */
+      suggestedFix?: string
+   /** 创建时间 */
+      createdTime?: string
+   /** 创建人 */
+      createdUserName?: string
+
+}
+export interface pageInput {
+      /**当前页数 */
+      CurrentPage: number | any
+      /**展示页数 */
+      PageSize: number | any
+    }

+ 29 - 27
admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts

@@ -1,51 +1,53 @@
 import { AxiosResponse } from 'axios'
-import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
 import { ProjectGetPageDto } from './slelistDto'
-
-export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
-  /**
+  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+    /**
+   * No description
+   *
+   * @tags
+   * @name GetList
+   * @summary 查询列表
+   * @request POST:'/api/app/project/get-page'
+   * @secure
+   */
+getList = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/project/get-page',
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+        /**
    * 上传/添加项目
-   * @param data 项目数据
    */
   uploadProject = (data: ProjectGetPageDto, params: RequestParams = {}) => {
-    return this.request<AxiosResponse, any>({
+    return this.request({
       path: '/api/app/project/upload-project',
       method: 'POST',
       body: data,
       type: ContentType.Json,
-      secure: true,
       format: 'json',
       ...params
     })
   }
 
   /**
-   * 查询列表
+   * 更新项目
    */
-  getList = (data: any, params: RequestParams = {}) => {
-    return this.request<AxiosResponse, any>({
-      path: '/api/app/project/get-page',
+  updateProject = (data: ProjectGetPageDto & { id: string }, params: RequestParams = {}) => {
+    return this.request({
+      path: '/api/app/project/update-project',
       method: 'POST',
       body: data,
       type: ContentType.Json,
-      secure: true,
       format: 'json',
       ...params
     })
   }
-
-    /**
-   * 更新项目
-   */
-    updateProject = (data: ProjectGetPageDto & { id: string }, params: RequestParams = {}) => {
-      return this.request({
-        path: '/api/app/project/update-project',
-        method: 'POST',
-        body: data,
-        type: ContentType.Json,
-        format: 'json',
-        ...params
-      })
-    }
   
-}
+    }
+

+ 28 - 42
admin.ui.plus-master/src/api/admin/productionManagement/slelistDto.ts

@@ -1,48 +1,34 @@
 /** 查询信息输出 */
-  export interface ResultOutputPageOutputProjectGetPageDto{
-  /** 是否成功标记 */
-  success?: boolean
-  /** 编码 */
-  code?: string | null
-  /** 消息 */
-  msg?: string | null
-  /** 数据 */
- data?:PageOutputProjectGetPageDto[] | null
-   /**开始的时间 */
-   BeginTime?: string | null,
-   /**开始的时间 */
-   EndTime?: string | null,
-      /** 项目上线时间 */
-      projectLaunchDate?: string
-}
-    export interface PageOutputProjectGetPageDto{
-      /**
-      * 数据总数
-      * @format int64
-      */
-      total?: number
-      /** 数据 */
-      list?: ProjectGetPageDto[] | null
-    }
-    export interface ProjectGetPageDto{
+export interface ResultOutputPageOutputProjectGetPageDto{
+   /** 是否成功标记 */
+   success?: boolean
+   /** 编码 */
+   code?: string | null
+   /** 消息 */
+   msg?: string | null
+   /** 数据 */
+  data?:PageOutputProjectGetPageDto[] | null
+ }
+     export interface PageOutputProjectGetPageDto{
+       /**
+       * 数据总数
+       * @format int64
+       */
+       total?: number
+       /** 数据 */
+       list?: ProjectGetPageDto[] | null
+     }
+     export interface ProjectGetPageDto{
       id?: string
-   /** 项目名称 */
       projectName?: string
-   /** 项目编码 */
       projectCode?: string
-   /** 项目介绍 */
       projectDescription?: string
-   /** 项目上线时间 */
       projectLaunchDate?: string
-  /**开始的时间 */
-  BeginTime?: string | null,
-  /**开始的时间 */
-  EndTime?: string | null,
-}
-export interface pageInput {
-      /**当前页数 */
-      CurrentPage: number | any
-      /**展示页数 */
-      PageSize: number | any
-    }
-
+ 
+ }
+ export interface pageInput {
+       /**当前页数 */
+       CurrentPage: number | any
+       /**展示页数 */
+       PageSize: number | any
+     }

+ 23 - 0
admin.ui.plus-master/src/api/admin/reportManagement/vxList/vxList.ts

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

+ 65 - 0
admin.ui.plus-master/src/api/admin/reportManagement/vxList/vxListDto.ts

@@ -0,0 +1,65 @@
+/** 查询信息输出 */
+  export interface ResultOutputPageOutputWxUserinfo{
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+ data?:PageOutputWxUserinfo[] | null
+}
+    export interface PageOutputWxUserinfo{
+      /**
+      * 数据总数
+      * @format int64
+      */
+      total?: number
+      /** 数据 */
+      list?: WxUserinfo[] | null
+    }
+    export interface WxUserinfo{
+   /** 姓名 */
+      name?: string
+   /** 用户账号 */
+      userName?: string
+   /** 用户手机号 */
+      phone?: string
+   /** 用户的标识,对当前公众号唯一 */
+      openid?: string
+   /** 用户的语言,简体中文为zh_CN */
+      language?: string
+   /** 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 */
+      subscribe_time?: integer
+   /** 只有在用户将公众号绑定到微信开放平台账号后,才会出现该字段。 */
+      unionid?: string
+   /** 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 */
+      remark?: string
+   /** 用户所在的分组ID(兼容旧的用户分组接口) */
+      groupid?: integer
+   /** 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_REPRINT 他人转载,ADD_SCENE_LIVESTREAM 视频号直播,ADD_SCENE_CHANNELS 视频号,ADD_SCENE_WXA 小程序关注,ADD_SCENE_OTHERS 其他 */
+      subscribe_scene?: string
+   /** 用户昵称 */
+      nickname?: string
+   /** sex */
+      sex?: string
+   /** 用户个人资料填写的省份 */
+      province?: string
+   /** 普通用户个人资料填写的城市 */
+      city?: string
+   /** 国家,如中国为CN */
+      country?: string
+   /** headimgurl */
+      headimgurl?: string
+   /** 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) */
+      privilege?: string
+   /** userid */
+      userid?: integer
+
+}
+export interface pageInput {
+      /**当前页数 */
+      CurrentPage: number | any
+      /**展示页数 */
+      PageSize: number | any
+    }

+ 2 - 2
admin.ui.plus-master/src/components/StatusBox.vue

@@ -59,7 +59,7 @@
           case '未开启': return 'red'
           
           // 电子档案-安全装置
-          case "出厂注册": return 'blue'
+          case "出厂注册": return 'blue'
 
 
           case "禁用": return 'red'
@@ -111,7 +111,7 @@
           case '未开启': return 'red'
           
           // 电子档案-安全装置
-          case "出厂注册": return 'blue'
+          case "出厂注册": return 'blue'
 
           default: return 'red'
         }

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

@@ -125,7 +125,7 @@
   import eventBus from "/@/utils/mitt";
   import {Api} from "/@/api/admin/deviceAuthorization/oilUpApi";
 import { UpgradeManagementDto } from "/@/api/admin/deviceAuthorization/oilUpDto";
-import type { pageInput } from "@/api/admin/productionManagement/slelistDto";
+import type { pageInput } from "/@/api/admin/deviceAuthorization/oilUpDto";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
 
 // 使用组合式函数获取分页状态

+ 60 - 90
admin.ui.plus-master/src/views/admin/product/slelist/components/ProjectDialog.vue

@@ -1,92 +1,62 @@
 <template>
-    <el-dialog v-model="visible" :title="dialogTitle" width="50%" :close-on-click-modal="false">
-      <el-form :model="formData" label-width="120px">
-        <el-form-item label="项目名称" prop="projectName">
-          <el-input v-model="formData.projectName" placeholder="请输入项目名称" />
-        </el-form-item>
-        <el-form-item label="项目编码" prop="projectCode">
-          <el-input v-model="formData.projectCode" placeholder="请输入项目编码" />
-        </el-form-item>
-        <el-form-item label="项目介绍" prop="projectDescription">
-          <el-input v-model="formData.projectDescription" type="textarea" :rows="3" placeholder="请输入项目介绍" />
-        </el-form-item>
-        <el-form-item label="项目上线时间" prop="projectLaunchDate">
-          <el-date-picker
-            v-model="formData.projectLaunchDate"
-            type="datetime"
-            placeholder="选择上线时间"
-            value-format="YYYY-MM-DD HH:mm:ss"
-          />
-        </el-form-item>
-      </el-form>
-  
-      <template #footer>
-        <el-button @click="onCancel">取消</el-button>
-        <el-button type="primary" @click="onSubmit">确定</el-button>
-      </template>
-    </el-dialog>
-  </template>
-  
-  <script setup lang="ts">
-  import { defineProps, defineEmits, reactive, computed } from 'vue';
-  import { ElMessage } from 'element-plus';
-  import { Api } from '/@/api/admin/productionManagement/slelist';
-  
-  interface FormData {
-    projectName: string;
-    projectCode: string;
-    projectDescription: string;
-    projectLaunchDate: string | null;
+  <el-dialog :model-value="modelValue" @update:model-value="handleVisibleChange" :title="title" width="50%">
+    <el-form ref="formRef" :model="formData" label-width="120px">
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="formData.projectName" />
+      </el-form-item>
+      <el-form-item label="项目编码" prop="projectCode">
+        <el-input v-model="formData.projectCode" />
+      </el-form-item>
+      <el-form-item label="项目介绍" prop="projectDescription">
+        <el-input v-model="formData.projectDescription" type="textarea" :rows="3" />
+      </el-form-item>
+      <el-form-item label="上线时间" prop="projectLaunchDate">
+        <el-date-picker
+          v-model="formData.projectLaunchDate"
+          type="datetime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          placeholder="选择日期时间"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <el-button @click="handleCancel">取消</el-button>
+      <el-button type="primary" @click="handleSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance } from 'element-plus'
+
+const props = defineProps<{
+  modelValue: boolean
+  title: string
+  formData: any
+}>()
+
+const emit = defineEmits(['update:modelValue', 'submit'])
+
+const formRef = ref<FormInstance>()
+
+const handleVisibleChange = (newValue: boolean) => {
+  emit('update:modelValue', newValue)
+}
+
+const handleSubmit = async () => {
+  try {
+    await formRef.value?.validate()
+    emit('submit', props.formData)
+    emit('update:modelValue', false)
+  } catch (error) {
+    ElMessage.error('请填写完整表单')
   }
-  
-  const props = defineProps<{
-    modelValue: boolean; // 替代 defineModel
-    title: string;
-    editData?: Partial<FormData>;
-  }>();
-  
-  const emit = defineEmits<{
-    (e: 'update:modelValue', visible: boolean): void;
-    (e: 'success'): void;
-  }>();
-  
-  // 使用 computed 管理 dialog 显示状态
-  const visible = computed({
-    get: () => props.modelValue,
-    set: (val) => emit('update:modelValue', val),
-  });
-  
-  const formData = reactive<FormData>({
-    projectName: props.editData?.projectName || '',
-    projectCode: props.editData?.projectCode || '',
-    projectDescription: props.editData?.projectDescription || '',
-    projectLaunchDate: props.editData?.projectLaunchDate || null,
-  });
-  
-  const dialogTitle = props.title;
-  
-  const onCancel = () => {
-    visible.value = false;
-  };
-  
-  const onSubmit = async () => {
-    try {
-      const res = await new Api().uploadProject(formData);
-      if (res.data) {
-        ElMessage.success(dialogTitle === '添加项目' ? '添加成功' : '更新成功');
-        visible.value = false;
-        emit('success');
-      }
-    } catch (error) {
-      console.error('操作失败:', error);
-      ElMessage.error('操作失败');
-    }
-  };
-  </script>
-  
-  <style scoped>
-  .el-input,
-  .el-select {
-    width: 100%;
-  }
-  </style>
+}
+
+const handleCancel = () => {
+  emit('update:modelValue', false)
+}
+</script>

+ 137 - 172
admin.ui.plus-master/src/views/admin/product/slelist/index.vue

@@ -34,14 +34,12 @@
 
           <hr>
 
-          <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
+          <el-row justify="space-between" class="submit-button" style="margin-bottom:-6px">
             <el-row>
-              <el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-              <el-button  type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
-            </el-row>
-            <el-row>
-              <el-button  type="primary" icon="ele-CirclePlus" @click="onAdd"> 添加 </el-button>
-            </el-row>
+            <el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+            <el-button  type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+          </el-row>
+          <el-button  type="primary" icon="ele-CirclePlus" @click="onAdd"> 添加 </el-button>
           </el-row>
 </el-card>
       </el-col>
@@ -67,14 +65,15 @@
                   icon="ele-Upload"
                   @click="gotoSoftwarePackage"
                   :underline="false"
+                  target="_blank"
                 >跳转到软件包</el-link>
 </template>
             </el-table-column>
 </el-table>
-<!-- <div class="my-flex my-flex-end" style="margin-top: 20px">
+<div class="my-flex my-flex-end" style="margin-top: 20px">
             <el-pagination
-              v-model:currentPage="state.pageInput.CurrentPage"
-              v-model:page-size="state.pageInput.PageSize"
+              v-model:currentPage="pageState.pageInput.currentPage"
+              v-model:page-size="pageState.pageInput.pageSize"
               :total="state.total"
               :page-sizes="[10, 15, 20, 50, 100]"
               small
@@ -83,56 +82,39 @@
               @current-change="onCurrentChange"
               layout="total, sizes, prev, pager, next, jumper"
             />
-          </div> -->
-          <div class="my-flex my-flex-end" style="margin-top: 20px">
-            <el-pagination 
-            v-model:currentPage="pageState.pageInput.currentPage"
-            v-model:page-size="pageState.pageInput.pageSize" 
-            :total="state.total" 
-            :page-sizes="[10, 15, 20, 50, 100]"
-            small 
-            background 
-            @size-change="onSizeChange" 
-            @current-change="onCurrentChange"
-            layout="total, sizes, prev, pager, next, jumper" />
           </div>
 </el-card>
       </el-col>
 </el-row>
-    </div>
 
-    <el-dialog v-model="state.dialogVisible" :title="state.dialogTitle" width="50%"> 
-       <el-form :model="state.formData" label-width="120px">
-    <el-form-item label="项目名称" prop="projectName">
-      <el-input v-model="state.formData.projectName" placeholder="请输入项目名称" />
-    </el-form-item>
-    <el-form-item label="项目编码" prop="projectCode">
-      <el-input v-model="state.formData.projectCode" placeholder="请输入项目编码" />
-    </el-form-item>
-    <el-form-item label="项目介绍" prop="projectDescription">
-      <el-input 
-        v-model="state.formData.projectDescription" 
-        type="textarea" 
-        :rows="3" 
-        placeholder="请输入项目介绍" 
-      />
-    </el-form-item>
-    <el-form-item label="项目上线时间" prop="projectLaunchDate">
-      <el-date-picker
-        v-model="state.formData.projectLaunchDate"
-        type="datetime"
-        placeholder="选择上线时间"
-        value-format="YYYY-MM-DD HH:mm:ss"
-      />
-    </el-form-item>
-  </el-form>
-  <template #footer>
-    <el-button @click="state.dialogVisible = false">取消</el-button>
-    <el-button type="primary" @click="onSubmit">确定</el-button>
-  </template>
-</el-dialog>
+<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-form-item label="项目名称" prop="projectName">
+          <el-input v-model="formData.projectName" placeholder="请输入项目名称" clearable />
+        </el-form-item>
+        <el-form-item label="项目编码" prop="projectCode">
+          <el-input v-model="formData.projectCode" placeholder="请输入项目编码" clearable />
+        </el-form-item>
+        <el-form-item label="项目介绍" prop="projectDescription">
+          <el-input v-model="formData.projectDescription" type="textarea" :rows="3" placeholder="请输入项目介绍" />
+        </el-form-item>
+        <el-form-item label="上线时间" prop="projectLaunchDate">
+          <el-date-picker
+            v-model="formData.projectLaunchDate"
+            type="datetime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择上线时间"
+          />
+        </el-form-item>
+      </el-form>
 
+      <template #footer>
+        <el-button @click="dialogVisible = 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";
@@ -141,10 +123,9 @@
 import { ProjectGetPageDto } from "/@/api/admin/productionManagement/slelistDto";
 import type { pageInput } from "/@/api/admin/productionManagement/slelistDto";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
-import { ElMessage } from "element-plus";
-import { useRouter } from 'vue-router'
+import router from "/@/router";
+import { ElMessage } from 'element-plus'
 
-const router = useRouter()
 
 // 使用组合式函数获取分页状态
 const pageState = useDynamicPageSize(10, 15);
@@ -160,10 +141,7 @@ const pageState = useDynamicPageSize(10, 15);
 /**项目编码 */
         projectCode: "",
 /**项目上线时间 */
-        projectLaunchDate:[] as string[],
-        beginTime:"",
-        endTime:""
-      },
+        projectLaunchDate: "",},
   /**表格信息 */
 tableModel: [] as ProjectGetPageDto,
     /**动态表头 */
@@ -179,154 +157,141 @@ tableModel: [] as ProjectGetPageDto,
     } as pageInput,
     /**分页总数 */
     total: 0,
-  dialogVisible: false,
-  dialogTitle: "添加项目",
-  formData: {
-    projectName: "",
-    projectCode: "",
-    projectDescription: "",
-    projectLaunchDate: ""
-  } as ProjectGetPageDto
 })
-onMounted(() => {
-  state.pageInput.PageSize = pageState.pageInput.pageSize
-  init()
+
+// 弹窗状态
+const dialogVisible = ref(false)
+const dialogTitle = ref('添加项目')
+const formData = ref({
+  projectName: '',
+  projectCode: '',
+  projectDescription: '',
+  projectLaunchDate: ''
 })
+const currentId = ref<string | null>(null)
 
+// 表单验证规则
+const rules = reactive({
+  projectName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
+  projectCode: [{ required: true, message: '请输入项目编码', trigger: 'blur' }]
+})
+
+  onMounted(() => {
+    init()
+    eventBus.off('refreshView')
+    eventBus.on('refreshView', async () => {
+      await init()
+    })
+    console.log()
+  })
   onBeforeMount(() => {
     eventBus.off('refreshView')
   })
-
-/**
- * 页条变化
- * @param val
- */
- const onSizeChange = (val: number) => {
-  state.pageInput.PageSize = val
-  onQuery()
-}
-
-/**
- * 页数变化
- * @param val
- */
-const onCurrentChange = (val: number) => {
-  state.pageInput.CurrentPage = val
-  onQuery()
-}
-
   /**
   * 监听变换
   */
-  watch(
-  () => state.filter.projectLaunchDate,
-  (newVal) => {
-    if (newVal && newVal.length === 2) {
-      state.filter.beginTime = newVal[0]
-      state.filter.endTime = newVal[1]
-    } else {
-      state.filter.beginTime = ""
-      state.filter.endTime = ""
-    }
-  },
-  { deep: true }
-)
+  watch(() => {})
 /**条件查询 */
-const onQuery = () => {
-  const { projectLaunchDate, ...filterParams } = state.filter
-  init({
-    ...state.pageInput,
-    Filter: filterParams
-  })
-}
-
-// 初始化数据
-const init = async (params?: any) => {
-  state.loading = true
-  try {
-    const res = await new Api().getList(params || {
-      ...state.pageInput,
-      Filter: {
-        projectName: state.filter.projectName,
-        projectCode: state.filter.projectCode,
-        beginTime: state.filter.beginTime,
-        endTime: state.filter.endTime
-      }
-    })
-    state.tableModel = res?.data?.list ?? []
-    state.total = res?.data?.total ?? 0
-  } catch (error) {
-    ElMessage.error("查询失败")
-  } finally {
-    state.loading = false
+          const onQuery = () => {
+          init()
+        }
+        /**初始化 */
+        const init = async () => {
+          state.loading = true
+          const res: any = await new Api().getList({ ...state.pageInput, Filter: state.filter })
+  state.tableModel = res?.data?.list ?? []
+  state.total = res?.data?.total ?? 0
+  state.loading = false
+        }
+/**添加 */
+const onAdd = () => {
+  dialogTitle.value = '添加项目'
+  formData.value = {
+    projectName: '',
+    projectCode: '',
+    projectDescription: '',
+    projectLaunchDate: ''
   }
+  currentId.value = null
+  dialogVisible.value = true
 }
 /**重置 */
 const onReset = () => {
   state.filter = {
-    projectName: "",
-    projectCode: "",
-    projectLaunchDate: [],
-    beginTime: "",
-    endTime: ""
+    projectName: '',
+    projectCode: '',
+    projectLaunchDate: ''
   }
-  onQuery()
+  init()
 }
 /**编辑 */
-const onDateUpdate = (row) => {
-  state.dialogTitle = "编辑项目"
-  state.formData = { ...row } // 深拷贝当前行数据到表单
-  state.dialogVisible = true
-}
-      const onAdd = () => {
-  state.dialogTitle = "添加项目"
-  state.dialogVisible = true
-  state.formData = {
-    projectName: "",
-    projectCode: "",
-    projectDescription: "",
-    projectLaunchDate: ""
-  }
+const onDateUpdate = (row: any) => {
+  dialogTitle.value = '编辑项目'
+  formData.value = { ...row }
+  currentId.value = row.id
+  dialogVisible.value = true
 }
 
-// 表单提交(新增或编辑)
-const onSubmit = async () => {
+// 提交表单
+const handleSubmit = async () => {
   try {
-    state.loading = true
-    let res
-    if (state.formData.id) {
-      // 编辑:调用更新接口
-      res = await new Api().updateProject(state.formData)
-      ElMessage.success("更新成功")
+    const api = new Api()
+    if (currentId.value) {
+      // 更新项目
+      await api.updateProject({ ...formData.value, id: currentId.value })
+      ElMessage.success('更新成功')
     } else {
-      // 新增:调用添加接口
-      res = await new Api().uploadProject(state.formData)
-      ElMessage.success("添加成功")
+      // 添加项目
+      await api.uploadProject(formData.value)
+      ElMessage.success('添加成功')
     }
-    state.dialogVisible = false
+
+    dialogVisible.value = false
     await init() // 刷新列表
-  } catch (error) {
-    ElMessage.error(state.formData.id ? "更新失败" : "添加失败")
-  } finally {
-    state.loading = false
+  } catch (e) {
+    ElMessage.error('保存失败')
   }
 }
 
-// 跳转到软件包页面
-const gotoSoftwarePackage = () => {
-  router.push('/product/softwarePackageManagement')
+      /**
+ * 页条变化
+ * @param val
+ */
+const onSizeChange = (val: number) => {
+  state.pageInput.PageSize = val
+  onQuery()
 }
+
+/**
+ * 页数变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  state.pageInput.CurrentPage = val
+  onQuery()
+}
+
+  // 跳转到软件包页面
+  const gotoSoftwarePackage = () => {
+    router.push('/product/softwarePackageManagement')
+  }
 </script>
 <style scoped lang="scss">
 .el-input,
-.el-select {
+.el-select
+ {
   width: 240px;
 }
 
+.el-date-picker {
+  width: 240px !important;
+}
+
+
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  // 字体大小14,5个字符,12px右间距
+  width: 14*5px+12px;
   justify-content: start;
 }
 

+ 5 - 6
admin.ui.plus-master/src/views/admin/statement/alarmQuery/index.vue

@@ -1,4 +1,3 @@
-
 <template>
   <div class="layout-pd">
     <el-row>
@@ -7,18 +6,18 @@
         <el-card class="mt8"  shadow="hover" >
 <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom:-20px;">
             <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.pushUser" placeholder="单行输入" clearable></el-input>
                 </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-input v-model="state.filter.isPushed" 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-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="推送时间">
                   <el-date-picker
                     v-model="state.filter.pushTime"
                     type="datetimerange"
@@ -193,7 +192,7 @@ const onCurrentChange = (val: number) => {
   * 监听变换
   */
   watch(() => {})
-  
+
 /**条件查询 */
           const onQuery = () => {
           init()

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

@@ -9,26 +9,30 @@
             <el-form-item prop="name" style="width: 100%">
 <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" 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="6" :xl="4" class="mb20">
                 <el-form-item label="站点名称">
-                  <el-input v-model="state.filter.stationName" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.stationName" placeholder="请输入站点名称" clearable></el-input>
                 </el-form-item>
               </el-col>
 <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-                <el-form-item label="状态">
-                  <el-input v-model="state.filter.deviceStatus" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="计控主板状态">
+                  <el-select v-model="state.filter.deviceStatus" placeholder="请选择计控主板状态">
+                    <el-option v-for="option in deviceStatusList" :key="option.value" :label="option.label" :value="option.value"></el-option>
+                  </el-select>
                 </el-form-item>
               </el-col>
 <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
                 <el-form-item label="在线状态">
-                  <el-input v-model="state.filter.onlineStatus" placeholder="单行输入" clearable></el-input>
+                  <el-select v-model="state.filter.onlineStatus" placeholder="请选择在线状态">
+                    <el-option v-for="option in onlineStatusList" :key="option.value" :label="option.label" :value="option.value"></el-option>
+                  </el-select>
                 </el-form-item>
               </el-col>
 <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
-            <el-form-item label="选择时间">
+            <el-form-item label="选择安装时间">
                   <el-date-picker
                     v-model="state.filter.fixTime"
                     type="datetimerange"
@@ -44,8 +48,9 @@
 
           <hr>
 
-          <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
+          <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-RefreshRight" @click="onReset"> 重置 </el-button>
           </el-row>
 </el-card>
       </el-col>
@@ -154,6 +159,21 @@ tableModel: [] as EncodercontrolsDto,
     /**分页总数 */
     total: 0,
 })
+
+const onlineStatusList = [
+     {label:'所有', value:''},
+     {label:'在线', value:'在线'},
+     {label:'离线', value: '离线'},
+]
+
+const deviceStatusList = [
+     {label:'所有', value:''},
+     {label:'启用', value:'启用'},
+     {label:'已注册', value:'已注册'},
+     {label:'未知', value:'未知'},
+     {label:'禁用', value:'禁用'},
+]
+
   onMounted(() => {
     state.pageInput.PageSize = pageState.pageInput.pageSize
 
@@ -178,6 +198,7 @@ tableModel: [] as EncodercontrolsDto,
         /**初始化 */
         const init = async () => {
           state.loading = true
+          console.log('Filter:', state.filter);
 const res:any = await new Api().getList({...state.pageInput, Filter:state.filter})
             state.total = res?.data?.total ?? 0
 state.tableModel = res?.data?.list ?? []
@@ -205,6 +226,17 @@ const onCurrentChange = (val: number) => {
   state.pageInput.CurrentPage = val
   onQuery()
 }
+
+const onReset = () => {
+  state.filter = {
+    stationName: '',
+    oilCompanyName: '',
+    deviceStatus: '',
+    onlineStatus:'',
+    fixTime:''
+  }
+  init()
+}
 </script>
 <style scoped lang="scss">
 .el-input,
@@ -215,7 +247,7 @@ const onCurrentChange = (val: number) => {
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
   // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
+  width: 14*6px+12px;
   justify-content: start;
 }
 

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

@@ -194,7 +194,7 @@
         </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%">
@@ -210,7 +210,7 @@
               @current-change="onLifeCycleCurrentChange" 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="放大的图片" />

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

@@ -0,0 +1,307 @@
+
+<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.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-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-form-item>
+          </el-form>
+
+          <hr>
+
+          <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-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"  >
+        </el-table-column> 
+<el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="140">
+        <template #default="{ row }" >
+<el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-Upload"
+                  @click="onDateUpdate(row)"
+                  :underline="false"
+                  target="_blank"
+                >编辑</el-link>
+</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>
+
+    <!-- 新增:弹窗组件 -->
+    <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-form-item label="错误代码" prop="errorCode">
+          <el-input v-model="formData.errorCode" placeholder="请输入错误代码" clearable />
+        </el-form-item>
+        <el-form-item label="错误描述" prop="description">
+          <el-input v-model="formData.description" placeholder="请输入错误描述" clearable />
+        </el-form-item>
+        <el-form-item label="错误模块" prop="module">
+          <el-input v-model="formData.module" placeholder="请输入错误模块" clearable />
+        </el-form-item>
+        <el-form-item label="严重程度" prop="severity">
+          <el-select v-model="formData.severity" placeholder="请选择">
+            <el-option label="轻微" value="轻" />
+            <el-option label="普通" value="普" />
+            <el-option label="严重" value="严" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="可能原因" prop="possibleCauses">
+          <el-input v-model="formData.possibleCauses" type="textarea" :rows="3" placeholder="请输入可能原因" />
+        </el-form-item>
+        <el-form-item label="诊断说明" prop="suggestedFix">
+          <el-input v-model="formData.suggestedFix" type="textarea" :rows="3" placeholder="请输入诊断说明" />
+        </el-form-item>
+      </el-form>
+
+      <template #footer>
+        <el-button @click="dialogVisible = 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/deviceAuthorization/problemData";
+import { ErrorCodeLibraryDto } from "/@/api/admin/deviceAuthorization/problemDataDto";
+import type { pageInput } from "/@/api/admin/deviceAuthorization/problemDataDto";
+import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import router from "/@/router";
+import { ElMessage } from 'element-plus'
+
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
+
+/**数据对象*/
+  const state = reactive({
+    /**加载显示 */
+    loading: false,
+    /**条件查询模块 */
+      filter: {
+/**错误代码 */
+        errorCode: "",
+/**错误发生的模块或系统 */
+        module: "",
+/**错误的严重程度(轻微、普通、严重) */
+        severity: "",},
+  /**表格信息 */
+tableModel: [] as ErrorCodeLibraryDto,
+    /**动态表头 */
+    dynamicColumns: [
+{ prop: 'errorCode', label: '错误代码' },
+{ prop: 'description', label: '错误描述' },
+{ prop: 'module', label: '错误模块' },
+{ prop: 'severity', label: '严重程度' },
+{ prop: 'possibleCauses', label: '错误原因' },
+{ prop: 'suggestedFix', label: '诊断说明' },
+{ prop: 'createdTime', label: '创建时间' },
+{ prop: 'createdUserName', label: '创建人' },
+],
+/**分页标识 */
+    pageInput:{
+      CurrentPage: 1,
+      PageSize: 10,
+    } as pageInput,
+    /**分页总数 */
+    total: 0,
+})
+
+// 弹窗状态
+const dialogVisible = ref(false)
+const dialogTitle = ref('添加问题')
+const formData = ref({
+  errorCode: '',
+  description: '',
+  module: '',
+  severity: '',
+  possibleCauses: '',
+  suggestedFix: ''
+})
+const currentId = ref<string | null>(null)
+
+// 表单验证规则
+const rules = reactive({
+  errorCode: [{ required: true, message: '请输入错误代码', trigger: 'blur' }],
+  description: [{ required: true, message: '请输入错误描述', trigger: 'blur' }]
+})
+
+
+  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
+ */
+ const onSizeChange = (val: number) => {
+  state.pageInput.PageSize = val
+  onQuery()
+}
+
+/**
+ * 页数变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  state.pageInput.CurrentPage = val
+  onQuery()
+}
+
+  /**
+  * 监听变换
+  */
+  watch(() => {})
+/**条件查询 */
+const onQuery = () => {
+  // 清除筛选条件
+  state.filter.errorCode = ''
+  state.filter.module = ''
+  state.filter.severity = ''
+  init()
+}
+  /**初始化 */
+  const init = async () => {
+  state.loading = true
+  const params = {
+    ...state.pageInput,
+    Filter: state.filter,
+    _t: Date.now() // 防止缓存
+  }
+  console.log('getList 请求参数:', params) // 打印请求参数
+  const res: any = await new Api().getList(params)
+
+  console.log('接口返回:', res) // 打印接口返回信息
+
+  state.tableModel = res?.data?.list ?? []
+  state.total = res?.data?.total ?? 0
+  state.loading = false
+}
+/**添加 */
+const onAdd = () => {
+  dialogTitle.value = '添加问题'
+  formData.value = {
+    errorCode: '',
+    description: '',
+    module: '',
+    severity: '',
+    possibleCauses: '',
+    suggestedFix: ''
+  }
+  currentId.value = null
+  dialogVisible.value = true
+}
+/**编辑 */
+const onDateUpdate = (row: any) => {
+  dialogTitle.value = '编辑问题'
+  formData.value = { ...row }
+  currentId.value = row.id
+  dialogVisible.value = true
+}
+
+// 提交表单
+const handleSubmit = async () => {
+  try {
+    const api = new Api()
+    if (currentId.value) {
+      // 更新问题
+      await api.uploadProject({ ...formData.value, id: currentId.value })
+      ElMessage.success('更新成功')
+    } else {
+      // 添加问题
+      await api.uploadProject(formData.value)
+      ElMessage.success('添加成功')
+
+      // 新增:重置筛选条件,并回到第一页
+      state.filter.errorCode = ''
+      state.filter.module = ''
+      state.filter.severity = ''
+      state.pageInput.CurrentPage = 1 // 回到第一页
+      state.pageInput.PageSize = 50 // 或者更大的值,根据需要调整
+    }
+
+    dialogVisible.value = false
+    await init() // 刷新列表
+  } catch (e) {
+    ElMessage.error('保存失败')
+  }
+}
+</script>
+<style scoped lang="scss">
+.el-input,
+.el-select {
+    width: 240px;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+    // 字体大小14,4个字符,12px右间距
+    width: 14*10px+12px;
+    justify-content: start;
+}
+
+/* 数据表头 设置灰色样式 */
+::v-deep .el-table th.el-table__cell {
+    background-color: #F6F6F6;
+}
+  </style>

+ 30 - 8
admin.ui.plus-master/src/views/admin/statement/repairList/index .vue

@@ -8,18 +8,22 @@
 <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.filter.status" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="站点名称">
+                  <el-input v-model="state.filter.stationName" placeholder="请输入站点名称" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
-                <el-form-item label="维修类型">
-                  <el-input v-model="state.filter.type" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="维修状态">
+                  <el-select v-model="state.filter.status" placeholder="请选择维修状态">
+                    <el-option v-for="option in maintenanceStatusOptions" :key="option.value" :label="option.label" :value="option.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-input v-model="state.filter.stationName" placeholder="单行输入" clearable></el-input>
+                <el-form-item label="维修类型">
+                  <el-select v-model="state.filter.status" placeholder="请选择维修类型">
+                    <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">
@@ -39,8 +43,9 @@
 
           <hr>
 
-          <el-row justify="space-between" class="submit-button" style="margin-bottom: -1vh;">
+          <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-RefreshRight" @click="onReset"> 重置 </el-button>
           </el-row>
 
 </el-card>
@@ -114,7 +119,7 @@ const pageState = useDynamicPageSize(10, 15);
 tableModel: [] as MaintenanceDto,
     /**动态表头 */
     dynamicColumns: [
-{ prop: 'createdDate', label: '维修时间' },
+{ prop: 'stationName', label: '站点名称' },
 { prop: 'createdBy', label: '维修人员' },
 { prop: 'status', label: '维修状态' },
 { prop: 'type', label: '维修类型' },
@@ -128,6 +133,13 @@ tableModel: [] as MaintenanceDto,
     /**分页总数 */
     total: 0,
 })
+
+const maintenanceStatusOptions = [
+  { label: '所有', value: '' },
+  { label: '进行中', value: '进行中' },
+  { label: '结束维修', value: '结束维修' }
+];
+
   onMounted(() => {
     init()
     eventBus.off('refreshView')
@@ -174,6 +186,16 @@ state.tableModel = res?.data?.list ?? []
         }
 /**详情 */
       const onDataDetail=(row: any)=>{}
+
+const onReset = () => {
+  state.filter = {
+    stationName: '',
+    type: '',
+    status: '',
+    createdDate:''
+  }
+  init()
+}
 </script>
 <style scoped lang="scss">
 .el-input,

+ 194 - 0
admin.ui.plus-master/src/views/admin/statement/vxList/index.vue

@@ -0,0 +1,194 @@
+
+<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.filter.name" 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.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.phone" 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:-6px">
+            <el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+          </el-row>
+</el-card>
+      </el-col>
+<!--表格-->
+      <el-col  :xs="24" >
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+<el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+        <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label"  >
+        </el-table-column> 
+<el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="140">
+        <template #default="{ row }" >
+<el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-Upload"
+                  @click="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="state.pageInput.CurrentPage"
+              v-model:page-size="state.pageInput.PageSize"
+              :total="state.total"
+              :page-sizes="[10, 15, 20, 50, 100]"
+              small
+              background
+              @size-change="onSizeChange"
+              @current-change="onCurrentChange"
+              layout="total, sizes, prev, pager, next, jumper"
+            />
+          </div>
+</el-card>
+      </el-col>
+</el-row>
+    </div>
+  </template>
+  <script setup lang="ts">
+  import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
+  import eventBus from "/@/utils/mitt";
+  import {Api} from "/@/api/admin/reportManagement/vxList/vxList";
+import { WxUserinfo } from "/@/api/admin/reportManagement/vxList/vxListDto";
+import type { pageInput } from "/@/api/admin/reportManagement/vxList/vxListDto";
+
+
+
+/**数据对象*/
+  const state = reactive({
+    /**加载显示 */
+    loading: false,
+    /**条件查询模块 */
+      filter: {
+/**姓名 */
+        name: "",
+/**用户账号 */
+        userName: "",
+/**用户手机号 */
+        phone: "",},
+  /**表格信息 */
+tableModel: [] as WxUserinfo,
+    /**动态表头 */
+    dynamicColumns: [
+{ prop: 'name', label: '姓名' },
+{ prop: 'userName', label: '账号' },
+{ prop: 'phone', label: '手机号' },
+{ prop: 'openid', label: 'openid' },
+{ prop: 'language', label: '语言' },
+{ prop: 'subscribe_time', label: '关注时间' },
+{ prop: 'unionid', label: 'unionid' },
+{ prop: 'remark', label: '备注' },
+{ prop: 'subscribe_scene', label: '关注渠道' },
+{ prop: 'nickname', label: '微信昵称' },
+{ prop: 'sex', label: '性别' },
+{ prop: 'province', label: '省份' },
+{ prop: 'city', label: '城市' },
+{ prop: 'country', label: '国家' },
+// { prop: 'groupid', label: '用户所在的分组ID' },
+// { prop: 'headimgurl', label: 'headimgurl' },
+// { prop: 'privilege', label: '用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)' },
+],
+/**分页标识 */
+    pageInput:{
+      CurrentPage: 1,
+      PageSize: 10,
+    } as pageInput,
+    /**分页总数 */
+    total: 0,
+})
+  onMounted(() => {
+    init()
+    eventBus.off('refreshView')
+    eventBus.on('refreshView', async () => {
+      await init()
+    })
+    console.log()
+  })
+  onBeforeMount(() => {
+    eventBus.off('refreshView')
+  })
+  /**
+  * 监听变换
+  */
+  watch(() => {})
+/**条件查询 */
+          const onQuery = () => {
+          init()
+        }
+        /**初始化 */
+        const init = async () => {
+          state.loading = true
+const res:any = await new Api().getList({...state.pageInput, Filter:state.filter})
+            state.total = res?.data?.total ?? 0
+state.tableModel = res?.data?.list ?? []
+          state.loading = false
+        }
+/**删除 */
+      const onDataDelete=(row)=>{}
+
+      /**
+ * 页条变化
+ * @param val
+ */
+ const onSizeChange = (val: number) => {
+  state.pageInput.PageSize = val
+  onQuery()
+}
+
+/**
+ * 页数变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  state.pageInput.CurrentPage = val
+  onQuery()
+}
+</script>
+<style scoped lang="scss">
+.el-input,
+.el-select
+ {
+  width: 240px;
+}
+
+.el-date-picker {
+  width: 240px !important;
+}
+
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+  // 字体大小14,5个字符,12px右间距
+  width: 14*5px+12px;
+  justify-content: start;
+}
+
+/* 数据表头 设置灰色样式 */
+::v-deep .el-table th.el-table__cell {
+  background-color: #F6F6F6;
+}
+  </style>