1
0

4 کامیت‌ها 6054c9d757 ... 3534623637

نویسنده SHA1 پیام تاریخ
  huang, kai (Contractor) 3534623637 feat:加油机档案、微信账号绑定页面部分配置优化 3 هفته پیش
  huang, kai (Contractor) a6042f90e2 feat:完善页面优化 3 هفته پیش
  huang, kai (Contractor) 3c8f1d8e75 feat:微信绑定页面以及预警配置规则完善 3 هفته پیش
  huang, kai (Contractor) e67eb19557 feat:生成微信账号绑定列表、维修记录、计控主板列表以及项目表页面,配置优化页面,配置完善路由 3 هفته پیش
30فایلهای تغییر یافته به همراه1797 افزوده شده و 483 حذف شده
  1. 338 0
      admin.ui.plus-master/baoliubaoliu.html
  2. 76 0
      admin.ui.plus-master/package-lock.json
  3. 2 0
      admin.ui.plus-master/package.json
  4. 13 1
      admin.ui.plus-master/src/api/admin/PCBA/jikongzhubanDto.ts
  5. 36 0
      admin.ui.plus-master/src/api/admin/deviceAuthorization/problemData.ts
  6. 45 0
      admin.ui.plus-master/src/api/admin/deviceAuthorization/problemDataDto.ts
  7. 3 0
      admin.ui.plus-master/src/api/admin/productionManagement/QRBookDto.ts
  8. 29 27
      admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts
  9. 28 42
      admin.ui.plus-master/src/api/admin/productionManagement/slelistDto.ts
  10. 23 0
      admin.ui.plus-master/src/api/admin/reportManagement/vxList/vxList.ts
  11. 65 0
      admin.ui.plus-master/src/api/admin/reportManagement/vxList/vxListDto.ts
  12. 2 2
      admin.ui.plus-master/src/components/StatusBox.vue
  13. 9 6
      admin.ui.plus-master/src/views/admin/PCBA/boardSummary/index.vue
  14. 1 1
      admin.ui.plus-master/src/views/admin/authorize/oilUp/index.vue
  15. 13 9
      admin.ui.plus-master/src/views/admin/product/qrBook/index.vue
  16. 4 5
      admin.ui.plus-master/src/views/admin/product/record/index.vue
  17. 60 90
      admin.ui.plus-master/src/views/admin/product/slelist/components/ProjectDialog.vue
  18. 137 172
      admin.ui.plus-master/src/views/admin/product/slelist/index.vue
  19. 20 23
      admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue
  20. 5 6
      admin.ui.plus-master/src/views/admin/statement/alarmQuery/index.vue
  21. 71 24
      admin.ui.plus-master/src/views/admin/statement/jikongzhuban/index.vue
  22. 26 4
      admin.ui.plus-master/src/views/admin/statement/listOfOilEngines/index.vue
  23. 2 2
      admin.ui.plus-master/src/views/admin/statement/oilEngineDetails/index.vue
  24. 1 1
      admin.ui.plus-master/src/views/admin/statement/partsManagement/oilGun/index.vue
  25. 307 0
      admin.ui.plus-master/src/views/admin/statement/problemData/index.vue
  26. 30 8
      admin.ui.plus-master/src/views/admin/statement/repairList/index .vue
  27. 196 0
      admin.ui.plus-master/src/views/admin/statement/vxList/index.vue
  28. 202 55
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue
  29. 3 3
      admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue
  30. 50 2
      admin.ui.plus-master/yarn.lock

+ 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>

+ 76 - 0
admin.ui.plus-master/package-lock.json

@@ -30,9 +30,11 @@
         "fs-extra": "^11.2.0",
         "js-cookie": "^3.0.5",
         "js-table2excel": "^1.1.2",
+        "jsonstream": "^1.0.3",
         "jsplumb": "^2.15.6",
         "lodash": "^4.17.21",
         "mitt": "^3.0.0",
+        "ndjson": "^2.0.0",
         "nprogress": "^0.2.0",
         "path": "^0.12.7",
         "pinia": "^2.1.4",
@@ -5121,6 +5123,12 @@
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "license": "ISC"
+    },
     "node_modules/json5": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
@@ -5145,6 +5153,31 @@
         "graceful-fs": "^4.1.6"
       }
     },
+    "node_modules/jsonparse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.0.0.tgz",
+      "integrity": "sha512-X8/pl4Q98FceotM1YzNYRcdRpYKgKB6nOKW9oNZk4qssFGfSxA6tUyPgEYsZA+MAQ8nR6nBZwE2GKpeeOIeN3A==",
+      "engines": [
+        "node >= 0.2.0"
+      ],
+      "license": "MIT"
+    },
+    "node_modules/jsonstream": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/jsonstream/-/jsonstream-1.0.3.tgz",
+      "integrity": "sha512-yMDWHPGzQRwdiXy6itGgemEviwAoDp5i78y7rdzUa9RVe01vLJku+byVtqxwwSvp1y9LYHWYd+8MkYvbeilCug==",
+      "deprecated": "use JSONStream instead",
+      "dependencies": {
+        "jsonparse": "~1.0.0",
+        "through": ">=2.2.7 <3"
+      },
+      "bin": {
+        "jsonstream": "index.js"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/jsplumb": {
       "version": "2.15.6",
       "resolved": "https://registry.npmmirror.com/jsplumb/-/jsplumb-2.15.6.tgz",
@@ -5927,6 +5960,34 @@
       "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
       "dev": true
     },
+    "node_modules/ndjson": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz",
+      "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "json-stringify-safe": "^5.0.1",
+        "minimist": "^1.2.5",
+        "readable-stream": "^3.6.0",
+        "split2": "^3.0.0",
+        "through2": "^4.0.0"
+      },
+      "bin": {
+        "ndjson": "cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ndjson/node_modules/through2": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+      "license": "MIT",
+      "dependencies": {
+        "readable-stream": "3"
+      }
+    },
     "node_modules/neo-async": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -7717,6 +7778,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/split2": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+      "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+      "license": "ISC",
+      "dependencies": {
+        "readable-stream": "^3.0.0"
+      }
+    },
     "node_modules/splitpanes": {
       "version": "3.1.5",
       "resolved": "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.1.5.tgz",
@@ -8068,6 +8138,12 @@
         "node": ">=12.22"
       }
     },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "license": "MIT"
+    },
     "node_modules/through2": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",

+ 2 - 0
admin.ui.plus-master/package.json

@@ -34,9 +34,11 @@
     "fs-extra": "^11.2.0",
     "js-cookie": "^3.0.5",
     "js-table2excel": "^1.1.2",
+    "jsonstream": "^1.0.3",
     "jsplumb": "^2.15.6",
     "lodash": "^4.17.21",
     "mitt": "^3.0.0",
+    "ndjson": "^2.0.0",
     "nprogress": "^0.2.0",
     "path": "^0.12.7",
     "pinia": "^2.1.4",

+ 13 - 1
admin.ui.plus-master/src/api/admin/PCBA/jikongzhubanDto.ts

@@ -53,11 +53,23 @@
       fuelId?: integer
    /** id */
       id?: integer
-
+    /** 开始查询时间 */
+    StartTime?: string | null
+    /** 结束查询时间 */
+    EndTime?: string | null
 }
 export interface pageInput {
       /**当前页数 */
       CurrentPage: number | any
       /**展示页数 */
       PageSize: number | any
+    }
+
+ export interface FilterType {
+      oilCompanyName: string;
+      stationName: string;
+      deviceStatus: string;
+      onlineStatus: string;
+      StartTime: string | null;
+      EndTime: string | null;
     }

+ 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
+    }

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

@@ -15,6 +15,9 @@ export interface QRBookFilter {
     StartTime?: string | null
     /** 结束查询时间 */
     EndTime?: string | null
+    time?:string
+    updateTime?: string | null
+
 }
 
 /**

+ 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'
         }

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

@@ -4,9 +4,9 @@
       <!--操作-->
       <el-col :xs="24">
         <el-card class="mt8" shadow="hover">
-          <el-form :model="state.filter" :inline="true" @submit.stop.prevent>
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom:-3vh">
             <el-form-item prop="name" style="width: 100%">
-              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="4" class="mb20">
                 <el-form-item label="主板类型">
                   <el-select v-model="state.filter.boardType" placeholder="">
                     <el-option v-for="(value, key) in PCBABoardType" :key="key" :label="value[1].name"
@@ -14,12 +14,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="4" class="mb20">
                 <el-form-item label="检测员">
                   <el-input v-model="state.filter.lastTestUser" placeholder="单行输入" clearable></el-input>
                 </el-form-item>
               </el-col>
-              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="4" class="mb20">
                 <el-form-item label="创建时间范围">
                   <el-date-picker
                     v-model="state.filter.createTimeRange"
@@ -33,11 +33,14 @@
               </el-col>
             </el-form-item>
           </el-form>
-          <div class="my-flex my-flex-start" style="margin-top: -38px;">
+
+          <hr>
+
+          <el-row  class="submit-button">
             <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
             <el-button type="primary" icon="ele-Document" @click="exportDataToExcel"> 导出 </el-button>
             <!--<el-button  type="primary" icon="ele-CirclePlus" @click="onBatExport"> 批量导出 </el-button>-->
-          </div>
+          </el-row>
         </el-card>
       </el-col>
       <!--表格-->

+ 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";
 
 // 使用组合式函数获取分页状态

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

@@ -32,7 +32,7 @@
                         </el-form-item>
                         
                         <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
-                            <el-form-item label="选择时间">
+                            <el-form-item label="选择修改时间">
                                     <el-date-picker v-model="qrBookData.time" type="datetimerange"
                                         value-format="YYYY-MM-DD HH:mm:ss" range-separator="To"
                                         start-placeholder="开始日期" end-placeholder="结束日期" />
@@ -46,7 +46,7 @@
                     <el-row justify="space-between" class="submit-button">
                         <el-row>
                             <el-button type="primary" icon="ele-Search" @click="getData()">查询</el-button>
-                            <el-button type="primary" plain icon="ele-RefreshRight" @click="clear()">清空</el-button>
+                            <el-button type="primary" icon="ele-RefreshRight" @click="clear">重置</el-button>
                         </el-row>
                         <el-row>
                             <el-button type="primary" icon="ele-CirclePlus" @click="uploadDialog">上传说明书</el-button>
@@ -177,13 +177,17 @@ const getData = async () => {
 
 //清除查询条件
 const clear = () => {
+    qrBookData.time='',
     qrBookData.Filter = {
-        author: "",
-        fileName: "",
-        startTime: null,
-        endTime: null
-    } as QRBookFilter
-
+        Author: "",
+        FileName: "",
+        // status:"",
+    /** 开始查询时间 */
+    StartTime:null,
+    /** 结束查询时间 */
+    EndTime:null,
+    } 
+    getData()
 }
 
 //下载
@@ -281,7 +285,7 @@ const getStatusInfo = (status: string) => {
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
     // 字体大小14,4个字符,12px右间距
-    width: 14*4px+12px;
+    width: 14*6px+12px;
     justify-content: start;
 }
 

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

@@ -31,7 +31,6 @@
                   </el-select>
                 </el-form-item>
               </el-col>
-
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="厂商">
                   <el-input v-model.trim="bomModel.filterModel.manufacturer" placeholder="厂商" clearable></el-input>
@@ -65,14 +64,14 @@
       <el-col :xs="24">
         <el-card  style="overflow: hidden;"  class="my-fill mt8" shadow="never">
           <el-table v-loading="bomModel.loading" stripe :data="bomModel.bomListData" row-key="id" style="width: 100%">
-            <el-table-column prop="guid" label="序号" />
-            <el-table-column prop="manufacturer" label="厂商" />
+            <el-table-column prop="guid" label="序号" align="center" />
+            <el-table-column prop="manufacturer" label="厂商" align="center" />
             <el-table-column prop="bomName" label="部件名称" />
             <el-table-column prop="bomNo" label="物料号" />
             <el-table-column prop="bomProNo" label="生产编号" />
-            <el-table-column prop="barCode" label="条码" />
+            <el-table-column prop="barCode" label="条码" align="center"/>
             <el-table-column prop="software_v" label="软件版本" />
-            <el-table-column prop="status" label="状态" width="120">
+            <el-table-column prop="status" label="状态" align="center">
               <template #default="{ row }">
                 <!-- <div :style="{ color: getComponentStatusType(row.status).color }" class="bold-font">
                   {{ getComponentStatusType(row.status).name }}

+ 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;
 }
 

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

@@ -16,11 +16,6 @@
                   <el-input v-model="Data.Filter.gasStation" 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="Data.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="Data.Filter.serialNumber" placeholder="请输入序列号" clearable></el-input>
@@ -36,22 +31,11 @@
                   <el-input v-model="Data.Filter.alarmType" 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="Data.Filter.alarmDescription" 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="Data.Filter.alarmDevice" 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="Data.Filter.nozzleControlName" placeholder="请输入油枪" clearable></el-input>
-                </el-form-item>
-              </el-col>
-
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="报警时间">
                   <el-date-picker v-model="Data.time" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
@@ -92,18 +76,25 @@
                 width="150">
                 <template #default="{ row }">
     <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Download" size="small"
-      :underline="false" target="_blank">报警推送记录</el-link>
+      :underline="false" target="_blank" @click="toList">报警推送记录</el-link>
       <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-Edit" size="small"
-      :underline="false" target="_blank">油机详情</el-link>
+      :underline="false" target="_blank" @click="toPage(row)">油机详情</el-link>
       <el-link class="my-el-link mr12 ml12" :href="row.linkUrl" type="primary" icon="ele-InfoFilled" size="small"
       :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="Data.pageInput.currentPage" v-model:page-size="Data.pageInput.pageSize"
-              :total="Data.total" :page-sizes="[5, 15, 25, 50, 100]" small background @size-change="onSizeChange"
-              @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+            <el-pagination 
+            v-model:currentPage="pageState.pageInput.currentPage" 
+            v-model:page-size="pageState.pageInput.pageSize"
+            :total="Data.total" 
+            :page-sizes="[5, 10, 15, 25, 50, 100]" 
+            small 
+            background 
+            @size-change="onSizeChange"
+            @current-change="onCurrentChange" 
+            layout="total, sizes, prev, pager, next, jumper" />
           </div>
         </el-card>
       </el-col>
@@ -119,6 +110,7 @@ import { ElTable } from 'element-plus'
 import { alarmFilterModel_SearchFilter, alarmFilterModel, PageInputAlarmFilterModel } from "/@/api/admin/reportManagement/alarm/alarmDto";
 import { AlarmApi } from "/@/api/admin/reportManagement/alarm/alarmApi";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import router from "/@/router";
 
 
 // 使用组合式函数获取分页状态
@@ -229,8 +221,6 @@ const resetQuery = () => {
   Data.Filter.CreateBeginTime = ''
   Data.Filter.CreateEndTime = ''
   Data.time = ''
-  Data.pageInput.currentPage = 1
-  Data.pageInput.pageSize = 10000
 }
 
 /**重置 */
@@ -257,7 +247,14 @@ const onCurrentChange = (val: number) => {
   init()
 }
 
+const toPage = (row: {fuelId: any; 
+}) => {
+  router.push({ path: `/statement/${row.fuelId}` })
+}
 
+const toList = () =>{
+  router.push({ path:`/authorize/statement/alarmQuery`})
+}
 
 </script>
 

+ 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()

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

@@ -1,4 +1,3 @@
-
 <template>
   <div class="layout-pd">
     <el-row>
@@ -7,30 +6,34 @@
         <el-card class="mt8"  shadow="hover" >
 <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
             <el-form-item prop="name" style="width: 100%">
-<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="石油公司">
-                  <el-input v-model="state.filter.oilCompanyName" placeholder="单行输入" clearable></el-input>
+                  <el-input v-model="state.filter.oilCompanyName" placeholder="请输入石油公司" clearable></el-input>
                 </el-form-item>
               </el-col>
-<el-col :xs="24" :sm="12" :md="8" :lg="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.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-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="计控主板状态">
+                  <el-select v-model="state.filter.deviceStatus" placeholder="请选择计控主板状态">
+                    <el-option 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-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" 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-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+            <el-form-item label="选择安装时间">
                   <el-date-picker
-                    v-model="state.filter.fixTime"
+                    v-model="state.fixTime"
                     type="datetimerange"
                     value-format="YYYY-MM-DD HH:mm:ss"
                     range-separator="To"
@@ -44,8 +47,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>
@@ -106,7 +110,7 @@
   import eventBus from "/@/utils/mitt";
   import {Api} from "/@/api/admin/PCBA/jikongzhuban";
 import { EncodercontrolsDto } from "/@/api/admin/PCBA/jikongzhubanDto";
-import type { pageInput } from "/@/api/admin/PCBA/jikongzhubanDto";
+import type { FilterType, pageInput } from "/@/api/admin/PCBA/jikongzhubanDto";
 import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
 import StatusBox from "/@/components/StatusBox.vue";
 import router from "/@/router";
@@ -117,6 +121,7 @@ const pageState = useDynamicPageSize(10, 15);
 
 /**数据对象*/
   const state = reactive({
+    fixTime: "",
     /**加载显示 */
     loading: false,
     /**条件查询模块 */
@@ -130,7 +135,9 @@ const pageState = useDynamicPageSize(10, 15);
 /**在线状态 */
         onlineStatus: "",
 /**安装时间 */
-        fixTime: "",},
+        StartTime: null,
+        EndTime: null
+      } as FilterType,
   /**表格信息 */
 tableModel: [] as EncodercontrolsDto,
     /**动态表头 */
@@ -154,6 +161,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
 
@@ -170,19 +192,30 @@ tableModel: [] as EncodercontrolsDto,
   /**
   * 监听变换
   */
-  watch(() => {})
+  watch(() => state.fixTime, (val) => {
+    if (val?.length === 0) {
+    state.filter.StartTime = null;
+    state.filter.EndTime = null;
+  } else {
+    state.filter.StartTime = val?.[0].toString();
+    state.filter.EndTime = val?.[1].toString();
+  }
+})
 /**条件查询 */
           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
-        }
+  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 ?? []
+  state.loading = false
+}
         
 /**详情 */
 const toPage = (row: { fuelId: any; }) => {
@@ -205,6 +238,20 @@ const onCurrentChange = (val: number) => {
   state.pageInput.CurrentPage = val
   onQuery()
 }
+
+const onReset = () => {
+  state.fixTime = "";
+  state.filter = {
+    stationName: '',
+    oilCompanyName: '',
+    deviceStatus: '',
+    onlineStatus: '',
+    StartTime: null,
+    EndTime: null,
+  }
+  init()
+}
+
 </script>
 <style scoped lang="scss">
 .el-input,
@@ -215,7 +262,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;
 }
 

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

@@ -23,7 +23,7 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="设备状态">
-                  <el-select v-model="oilEngineData.filterModel.deviceStatus" placeholder="请输入设备状态">
+                  <el-select v-model="oilEngineData.filterModel.deviceStatus" placeholder="请选择设备状态">
                     <el-option label="所有" :value="''"></el-option>
                     <el-option v-for="(value, key) in FuelDispenserEnum" :key="key" :label="value" :value="key" />
                   </el-select>
@@ -32,17 +32,30 @@
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="在线状态">
-                  <el-select v-model="oilEngineData.filterModel.onlineStatus" placeholder="请输入在线状态">
+                  <el-select v-model="oilEngineData.filterModel.onlineStatus" placeholder="请选择在线状态">
                     <el-option label="所有" :value="''"></el-option>
                     <el-option v-for="(value, key) in OnlineStatus" :key="key" :label="value" :value="key" />
                   </el-select>
                   <!-- <el-input v-model="oilEngineData.filterModel.onlineStatus" placeholder="请输入在线状态" clearable></el-input> -->
                 </el-form-item>
+              </el-col>
+                             <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="平台类型">
+                  <el-select v-model="oilEngineData.filterModel.platformType" placeholder="请选择平台类型">
+                    <el-option label="所有" :value="''"></el-option>
+                    <el-option v-for="(value, key) in platformType" :key="key" :label="value" :value="key" />
+                  </el-select>
+                </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="序列号">
                   <el-input v-model="oilEngineData.filterModel.serialNumber" 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  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="安装时间">
@@ -83,7 +96,8 @@
             <el-table-column prop="gasStation" label="加油站" />
             <el-table-column prop="serialNumber" label="序列号" />
             <el-table-column prop="model" label="加油机机型" />
-            <el-table-column prop="gunCount" label="加油机枪数量" />
+            <el-table-column prop="" label="平台" align="center"/>       
+            <el-table-column prop="gunCount" label="加油机枪数量" align="center" />
             <!-- <el-table-column prop="manufacturer"  label="加油机厂商" /> -->
             <el-table-column prop="manufactureDate" label="出厂时间" />
             <el-table-column prop="startupDate" label="启动时间" />
@@ -177,6 +191,8 @@ const oilEngineData = reactive({
     deviceStatus: "",
     /**在线状态*/
     onlineStatus: "",
+    // 平台类型
+    platformType:'',
     /**序列号*/
     serialNumber: "",
     /**开始时间*/
@@ -205,6 +221,12 @@ enum OnlineStatus {
   online = '在线',
   offline = '离线'
 }
+// 平台类型
+enum platformType {
+    TQC= 'TQC',
+    TQCPro='TQC+',
+    Unknown='未知'
+}
 /**将filterModel对象成.的连接方式*/
 const flattenObject = (obj, parentKey = '') => {
   const result = {};
@@ -373,7 +395,7 @@ onBeforeMount(() => {
 /* 输入框标签固定四个字符宽度 */
 ::v-deep .el-form-item__label {
   // 字体大小14,5个字符,12px右间距
-  width: 14*5px+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="放大的图片" />

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

@@ -29,7 +29,7 @@
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
-                <el-form-item label="出厂时间" style="width:310px">
+                <el-form-item label="出厂时间">
                   <el-date-picker v-model="Data.time1" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
                     range-separator="To" start-placeholder="开始日期" end-placeholder="结束日期" />
                 </el-form-item>

+ 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,

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

@@ -0,0 +1,196 @@
+
+<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})
+console.log('Response data:', res.data); 
+console.log('Filter parameters:', {...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>

+ 202 - 55
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -1,7 +1,7 @@
 <!-- 报警规则添加列表 -->
 <template>
   <div class="layout-pd">
-    <el-dialog v-model="Data.isShowDialog" style="width: 60%;">
+    <el-dialog v-model="Data.isShowDialog" style="width: 75%;">
       <!--操作-->
       <div style="width: 100%;display: flex;justify-content: left;align-items: center;">
         <h1 style="margin-bottom: 10px;font-size: 30px;">报警推送规则</h1>
@@ -19,7 +19,7 @@
       <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%;">
-            <el-select v-model="Data.Filter.roleMappingId" multiple placeholder="请选择角色">
+            <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-select>
           </el-form-item>
@@ -85,11 +85,17 @@
       </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;级:" style="width: 100%;">
+          <el-form-item label="&#8195;优先级:" style="width: 100%;">
             <el-input-number v-model="Data.Filter.taskPriority" :controls="false" :min=1 :max=9 />
           </el-form-item>
         </el-form>
       </div>
+      <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+        <el-form :inline="true" @submit.stop.prevent>
+         <el-form-item label="报警条件配置" style="width: 100%;">
+          </el-form-item>
+        </el-form>
+      </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="触发方式:" style="width: 100%;">
@@ -100,35 +106,130 @@
           </el-form-item>
         </el-form>
       </div>
-      <div v-for="(index) in Data.num" :key="index"
-        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: 100%;">
-            <el-select v-model="Data.selectValue1[index]" class="m-2" placeholder="Select" style="width: 20%;">
-              <el-option v-for="item in Data.condition" :key="item" :label="item" :value="item"
-                @click="selectChange(Data.selectValue1[index])" />
-            </el-select>
-            <!-- 符号 -->
-            <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
-              <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
-            </el-select>
-            <el-select v-model="Data.selectValue2[index]" class="m-2" placeholder="Select" style="width: 20%;">
-              <el-option v-for="item in Data.selectCondition" :key="item" :label="item" :value="item" />
-            </el-select>
-            <label style="margin-left: 5%;">报警等级</label>
-            <!-- 符号 -->
-            <el-select class="sign" style="width: 7%;" suffix-icon="" v-model="Data.seDefault">
-              <el-option v-for="(item, index) in Data.selectList" :key="index" :value="item" selectd />
-            </el-select>
-            <el-select v-model="Data.selectValue3[index]" class="m-2" placeholder="Select" style="width: 20%;">
-              <el-option v-for="item in Data.alarmLevel" :key="item" :label="item" :value="item" />
+  
+<!-- 条件部分 -->
+<div v-for="(condition, index) in Data.condition" :key="index" 
+     style="width: 100%;display: flex;justify-content: center;align-items: center; margin-top: 10px;">
+  <el-form :inline="true" @submit.stop.prevent>
+    <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 100%;">
+      <el-row :gutter="20" style="width: 140%;">
+        <!-- 报警设备 -->
+        <el-col :span="8">
+          <div style="display: flex; align-items: center;">
+            <span style="margin-right: 13px;">报警设备:</span>
+            <el-select v-model="condition.equipment" placeholder="请选择" style="flex: 1;">
+              <el-option 
+                v-for="item in Data.alarmEquipment" 
+                :key="item" 
+                :label="item" 
+                :value="item"
+              />
+            </el-select>&#8195;&
+          </div>
+        </el-col>
+        
+        <!-- 报警类型 -->
+        <el-col :span="8">
+          <div style="display: flex; align-items: center;">
+            <span style="margin-right: 13px;">报警类型:</span>
+            <el-select v-model="condition.type" placeholder="请选择" style="flex: 1;">
+              <el-option 
+                v-for="item in Data.alarmType" 
+                :key="item" 
+                :label="item" 
+                :value="item"
+              />
+            </el-select>&#8195;&
+          </div>
+        </el-col>
+        
+        <!-- 报警来源 -->
+        <el-col :span="8">
+          <div style="display: flex; align-items: center;">
+            <span style="margin-right: 13px;">报警来源:</span>
+            <el-select v-model="condition.source" placeholder="请选择" style="flex: 1;">
+              <el-option 
+                v-for="item in Data.alarmSource" 
+                :key="item" 
+                :label="item" 
+                :value="item"
+              />
             </el-select>
+          </div>
+        </el-col>
+      </el-row>
+    </el-form-item>
+  </el-form>
+</div>
+<!-- 添加按钮 -->
+<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+  <el-button type="primary" icon="ele-Plus" style="font-size: large" @click="addCondition" />
+  <el-button  v-if="Data.condition.length > 1" type="primary" icon="ele-Minus" style="font-size: large" @click="removeCondition" />
+</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%;">
           </el-form-item>
         </el-form>
       </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
-        <el-button :icon="CirclePlusFilled" style="font-size: large" @click="add" />
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="触发方式:" style="width: 100%;">
+            <el-radio-group v-model="Data.Filter.triggerMethod">
+              <el-radio :label="0">其中之一条件满足即触发</el-radio>
+              <el-radio :label="1">全部满足时触发</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
       </div>
+<!-- 条件部分 -->
+<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>
+    <el-form-item :label="index === 0 ? '条&#8195;&#8195;件:' : '附加条件:'" style="width: 100%;">
+      <el-row :gutter="20" style="width: 140%;">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center;">
+            <span style="margin-right: 13px;">维修类型:</span>
+            <el-select v-model="condition2.proType" placeholder="请选择" style="flex: 1;">
+              <el-option 
+                v-for="item in Data.alarmproType" 
+                :key="item" 
+                :label="item" 
+                :value="item"
+              />
+            </el-select>&#8195;&
+          </div>
+        </el-col>
+        
+        <el-col :span="8">
+          <div style="display: flex; align-items: center;">
+            <span style="margin-right: 13px;">维修状态:</span>
+            <el-select v-model="condition2.proStatus" placeholder="请选择" style="flex: 1;">
+              <el-option 
+                v-for="item in Data.alarmproStatus" 
+                :key="item" 
+                :label="item" 
+                :value="item"
+              />
+            </el-select>
+
+          </div>
+        </el-col>
+      </el-row>
+    </el-form-item>
+  </el-form>
+</div>
+<!-- 添加按钮 -->
+<div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+  <el-button type="primary" icon="ele-Plus" style="font-size: large" @click="add" />
+  <el-button  v-if="Data.condition2.length > 1" type="primary" icon="ele-Minus" style="font-size: large" @click="removeCondition2" />
+</div>
+
+      <!-- <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+        <el-button :icon="CirclePlusFilled" style="font-size: large" @click="add" />
+      </div> -->
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent style="width: 60%;">
           <el-row justify="end" style="margin-top: 30px;">
@@ -195,12 +296,24 @@ const Data = reactive({
   mode2: '',
   /** 条件选择 */
   selectCondition: [] as Array<string>,
-  condition: ['报警设备', '报警类型', '报警来源'],
-  alarmEquipment: ['加油枪', '编码器', '加密显示屏', '监控微处理器'],
-  alarmType: ['绑定错误'],
+  condition: [    {  // 初始条件
+      equipment: '',
+      type: '',
+      source: ''
+    }],
+  condition2: [    {  // 初始条件
+      proType:'',
+      proStatus:''
+    }],
+  alarmEquipment: ["安全装置","编码器","计控主板","监控微处理器","智能型控制阀","油气回收控制板","显示屏","计量器","加油机","油枪"
+],
+  alarmType: [	"加油机离线","通信异常","非法部件","厂商不符","绑定错误","监控微处理器报警","安全装置报警","加油机报警","检定"
+],
   alarmSource: ['云平台', '安全监督装置'],
   alarmLevel: [1, 2],
 
+  alarmproType:["油机维修","装置维修"],
+  alarmproStatus:["正在维修","结束维修"]
 })
 
 const templateData = reactive({
@@ -218,12 +331,6 @@ const templateData = reactive({
   emailList: [] as any
 })
 
-// 数量增加 - 实现dom节点的增加
-const add = (() => {
-  Data.num += 1
-
-})
-
 const radioChange = (() => {
   if (Data.radioValue1 == true) {
     Data.Filter.pushMethod = 'wx'
@@ -239,16 +346,6 @@ const radioChange = (() => {
   }
 })
 
-const selectChange = ((key: any) => {
-  if (key == '报警设备') {
-    Data.selectCondition = Data.alarmEquipment
-  } else if (key == '报警类型') {
-    Data.selectCondition = Data.alarmType
-  } else if (key == '报警来源') {
-    Data.selectCondition = Data.alarmSource
-  }
-})
-
 // 获取角色列表
 const getRole = async () => {
   const res = await new RoleApi().getList()
@@ -262,12 +359,12 @@ const funSelect = async () => {
   const res = await new pushTemplateApi().getData(templateData.Filter)
   const data = res?.data
   templateData.wxList = (data as any)?.filter((item: any) => {
-    if (item.templateType == "wx") {
+    if (item.templateType == "微信") {
       return { 'id': item.id, 'name': item.templateName }
     }
   })
   templateData.emailList = (data as any)?.filter((item: any) => {
-    if (item.templateType == "email") {
+    if (item.templateType == "邮箱") {
       return { 'id': item.id, 'name': item.templateName }
     }
   })
@@ -304,15 +401,15 @@ watch([() => [...Data.selectValue1], () => [...Data.selectValue2], () => [...Dat
 
 // 保存提交内容
 const toSave = async () => {
-  console.log('提交数据')
-  console.log(Data.Filter)
+  // 将条件数组赋值给Filter
+  Data.Filter.conditionsJson = JSON.stringify(Data.condition);
+  
+  console.log('提交数据', Data.Filter);
   await new alarmRulesApi().addForm(Data.Filter).then((res) => {
-    console.log(res)
-    eventBus.emit('refreshView')
-  })
-  Data.isShowDialog = false
-  // reset()
-
+    console.log(res);
+    eventBus.emit('refreshView');
+  });
+  Data.isShowDialog = false;
 }
 
 // 重置
@@ -394,6 +491,35 @@ defineExpose({
 })
 
 
+// 添加条件
+const addCondition = () => {
+  Data.condition.push({
+    equipment: '',
+    type: '',
+    source: ''
+  });
+}
+
+const add = () => {
+  Data.condition2.push({
+    proStatus: '',
+    proType: ''
+  });
+}
+
+// 删除条件
+const removeCondition = (index: number) => {
+  if (Data.condition.length > 1) { // 至少保留一个条件
+    Data.condition.pop();
+  }
+}
+
+// 删除条件
+const removeCondition2 = (index: number) => {
+  if (Data.condition2.length > 1) { // 至少保留一个条件
+    Data.condition2.pop();
+  }
+}
 </script>
 
 <style scoped lang="scss">
@@ -436,4 +562,25 @@ defineExpose({
 .el-select-dropdown__item {
   text-align: center;
 }
+
+/* 添加或修改以下样式 */
+.el-row {
+  margin-bottom: 20px;
+}
+.el-col {
+  padding: 0 10px;
+}
+.condition-label {
+  min-width: 80px;
+  text-align: right;
+  margin-right: 10px;
+}
+/* 添加以下样式 */
+.dynamic-condition {
+  margin-top: 15px;
+  padding: 10px;
+  border: 1px solid #ebeef5;
+  border-radius: 4px;
+  background-color: #fafafa;
+}
 </style>

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

@@ -9,7 +9,7 @@
             <el-form-item prop="name" style="width: 100%">
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                 <el-form-item label="规则名称">
-                  <el-input v-model="Data.time1" placeholder="请输入规则名称" clearable></el-input>
+                  <el-input v-model="Data.Filter.ruleName" placeholder="请输入规则名称" clearable></el-input>
                 </el-form-item>
               </el-col>
               <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -146,9 +146,9 @@ const editDialogRef = ref()
 const init = async () => {
   Data.loading = true
   const res: any = await new alarmRulesApi().getData({ ...Data.pageInput, filter: Data.Filter })
-  // console.log(res)
+  console.log(res)
   Data.tableModel = res?.data ?? []
-  // Data.total = res?.data?.length ?? 0   // 接口中没有总的数据量
+  Data.total = res?.data?.length ?? 0   // 接口中没有总的数据量
   Data.loading = false
   pushMethodChange()
 }

+ 50 - 2
admin.ui.plus-master/yarn.lock

@@ -3036,6 +3036,11 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
   integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
 
+json-stringify-safe@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+  integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
 json5@^1.0.1:
   version "1.0.2"
   resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz"
@@ -3052,6 +3057,19 @@ jsonfile@^6.0.1:
   optionalDependencies:
     graceful-fs "^4.1.6"
 
+jsonparse@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.0.0.tgz"
+  integrity sha512-X8/pl4Q98FceotM1YzNYRcdRpYKgKB6nOKW9oNZk4qssFGfSxA6tUyPgEYsZA+MAQ8nR6nBZwE2GKpeeOIeN3A==
+
+jsonstream@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/jsonstream/-/jsonstream-1.0.3.tgz"
+  integrity sha512-yMDWHPGzQRwdiXy6itGgemEviwAoDp5i78y7rdzUa9RVe01vLJku+byVtqxwwSvp1y9LYHWYd+8MkYvbeilCug==
+  dependencies:
+    jsonparse "~1.0.0"
+    through ">=2.2.7 <3"
+
 jsplumb@^2.15.6:
   version "2.15.6"
   resolved "https://registry.npmmirror.com/jsplumb/-/jsplumb-2.15.6.tgz"
@@ -3454,7 +3472,7 @@ minimatch@^5.1.0:
   dependencies:
     brace-expansion "^2.0.1"
 
-minimist@^1.2.0, minimist@^1.2.6:
+minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
   version "1.2.8"
   resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
   integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -3564,6 +3582,17 @@ natural-compare@^1.4.0:
   resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz"
   integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
 
+ndjson@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz"
+  integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==
+  dependencies:
+    json-stringify-safe "^5.0.1"
+    minimist "^1.2.5"
+    readable-stream "^3.6.0"
+    split2 "^3.0.0"
+    through2 "^4.0.0"
+
 neo-async@^2.5.0:
   version "2.6.2"
   resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
@@ -4234,7 +4263,7 @@ readable-stream@^2.3.8:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@3:
   version "3.6.2"
   resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
   integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -4720,6 +4749,13 @@ split-string@^3.0.1, split-string@^3.0.2:
   dependencies:
     extend-shallow "^3.0.0"
 
+split2@^3.0.0:
+  version "3.2.2"
+  resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz"
+  integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
+  dependencies:
+    readable-stream "^3.0.0"
+
 splitpanes@^3.1.5:
   version "3.1.5"
   resolved "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.1.5.tgz"
@@ -4894,6 +4930,11 @@ throttle-debounce@5.0.0:
   resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz"
   integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==
 
+"through@>=2.2.7 <3":
+  version "2.3.8"
+  resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
 through2@^2.0.0:
   version "2.0.5"
   resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
@@ -4902,6 +4943,13 @@ through2@^2.0.0:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
+through2@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz"
+  integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
+  dependencies:
+    readable-stream "3"
+
 timers-browserify@^2.0.4:
   version "2.0.12"
   resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz"