1
0

7 Commits b20f376ebc ... 27dd898bad

Autor SHA1 Mensaje Fecha
  Zhenghanjv 27dd898bad Merge branch 'feature/应用使用记录' into develop hace 1 semana
  Zhenghanjv 2f2bcfc966 Merge branch 'develop' of http://dev.hsfuel.com:3000/adminTk/Web into develop hace 1 semana
  Zhenghanjv 916841ccd6 Merge branch 'develop' of http://dev.hsfuel.com:3000/adminTk/Web into feature/应用使用记录 hace 1 semana
  Zhenghanjv fa355b7ecd Merge branch 'feature/应用使用记录' into develop hace 1 semana
  Zhenghanjv 5db1e52106 地址改回公司生产云 hace 1 semana
  Zhenghanjv 39720b7bf6 feat:应用使用记录增加详情弹框 hace 1 mes
  Zhenghanjv bd70dfb0d6 feat:增加应用记录查询页面 hace 1 mes

+ 3 - 3
admin.ui.plus-master/.env.development

@@ -4,9 +4,9 @@ ENV = 'development'
 # 本地环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
 #VITE_API_URL = 'http://47.97.120.160:8070'
-VITE_API_URL = 'http://localhost:8000'
-#VITE_API_URL = 'http://imes.hsfuel.com:8070'
-#VITE_API_URL = 'http://dev.hsfuel.com:8070'
+#VITE_API_URL = 'http://localhost:8000'
+VITE_API_URL = 'http://imes.hsfuel.com:8070'
+# VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'
 
 

+ 4 - 4
admin.ui.plus-master/.env.production

@@ -9,8 +9,8 @@ VITE_PUBLIC_PATH = '/'
 
 # 线上环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
-#VITE_API_URL = 'http://47.97.120.160:8070'
-VITE_API_URL = 'http://localhost:8000'
-#VITE_API_URL = 'http://imes.hsfuel.com:8070'
-#VITE_API_URL = 'http://dev.hsfuel.com:8070'
+ #VITE_API_URL = 'http://47.97.120.160:8070'
+#VITE_API_URL = 'http://localhost:8000'
+VITE_API_URL = 'http://imes.hsfuel.com:8070'
+# VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 388 - 370
admin.ui.plus-master/LargeScreenVisualization/IofTV-Screen-main-deviceVision/package-lock.json


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 401 - 1022
admin.ui.plus-master/package-lock.json


+ 22 - 0
admin.ui.plus-master/src/api/appOperationRecord/api.ts

@@ -0,0 +1,22 @@
+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 GET:'/api/app/app-operation-record/get-record-page'
+   * @secure
+   */
+getList = (query:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/app-operation-record/get-record-page',
+        method: 'GET',
+        query:query,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+    }

+ 186 - 0
admin.ui.plus-master/src/api/appOperationRecord/dto.ts

@@ -0,0 +1,186 @@
+import { number } from "echarts"
+
+/** 查询信息输出 */
+export interface ResultOutputPageOutputRecordOutput {
+   /** 是否成功标记 */
+   success?: boolean
+   /** 编码 */
+   code?: string | null
+   /** 消息 */
+   msg?: string | null
+   /** 数据 */
+   data?: PageOutputRecordOutput[] | null
+}
+export interface PageOutputRecordOutput {
+   /**
+   * 数据总数
+   * @format int64
+   */
+   total?: number
+   /** 数据 */
+   list?: RecordOutput[] | null
+}
+export interface RecordOutput {
+   /** 油机唯一标识 */
+   machineId?: string
+   /** 应用的 app id */
+   appId?: string
+   /** 设备 sn */
+   sn?: string
+   /** 登录账户 */
+   account?: string
+   /** 使用类型 */
+   opreationType?: string
+   /** 使用记录 */
+   recodeJson?: string
+   /** 操作记录时间 */
+   createTime?: Date
+
+}
+/** 冷启动记录数据 */
+export interface ColdStartInfo {
+   /** 机型码 */
+   modelCode:string
+   /** 交叉出油油枪数据 */
+   nonStandeNozzleList:NonStandeNozzleInfo[]
+   /** 显示屏类型 */
+   displayType:string
+   /** 显示屏数量 */
+   displayCountList:DisplayCountInfo[]
+   /** 油机网络配置 */
+   machineIP:MachineNetWorkInfo
+   /** 多媒体屏配置 */
+   screenConfig:screenInfo
+   /** 打印机配置 */
+   printerConfig:PrinterInfo
+   /** 使用协议 */
+   agree:string
+   /** IFSF 音频设置 */
+   ifsfVolumeConfig:IFSFVolumeInfo
+}
+export interface NonStandeNozzleInfo {
+   /** 物理枪号 */
+   nozzleNum:number
+   /** 加油点 */
+   fpoint:number
+   /** 油品号 */
+   oilId:number
+   /** 马达号 */
+   motolNum:number
+}
+export interface DisplayCountInfo {
+   /** 加油点 */
+   fpoint:number
+   /** 显示屏数量 */
+   displayNum:number
+}
+export interface MachineNetWorkInfo {
+   /** network ip */
+   networkIP:string
+   /** network 网关 */
+   networkGateway:string
+   /** network 子网掩码 */
+   networkMask:string
+   /** IFSF network ip */
+   ifsfIP:string
+   /** IFSF network 网关 */
+   ifsfGateway:string
+   /** IFSF network 子网掩码 */
+   ifsfMask:string
+}
+export interface screenInfo {
+   /** 是否打开 VGAA */
+   isOpenVGAA:boolean
+   /** VGAA ip */
+   ipVGAA:string
+   /** VGAA 端口 */
+   portVGAA:number
+   /** VGAA 关联加油点 */
+   fpointVGAA:number[]
+
+   /** 是否打开 VGAB */
+   isOpenVGAB:boolean
+   /** VGAB ip */
+   ipVGAB:string
+   /** VGAB 端口 */
+   portVGAB:number
+   /** VGAB 关联加油点 */
+   fpointVGAB:number[]
+}
+export interface PrinterInfo {
+   /** 加油点 */
+   fpoint:number
+   /** 打印机地址 */
+   printerAdress:string
+   /** 打印机模式 */
+   printerMode:string
+}
+export interface IFSFVolumeInfo {
+   /** 是否打开 */
+   isOpen:boolean
+   /** 声音类型 */
+   type:string
+   /** 白天开始时间 */
+   dayTime:number
+   /** 晚上开始时间 */
+   nightTime:number
+   /** 白天声音 */
+   dayVolume:number
+   /** 晚上声音 */
+   nightVolume:number
+}
+
+/** 数据备份记录 */
+export interface BackResultInfo {
+   /** 备份结果 */
+   backResult:string
+}
+/** 数据还原记录 */
+export interface BackRestoreInfo {
+   /** 还原结果 */
+   restoreResult:string
+   /** 还原数据包 */
+   backInfo:string
+}
+
+/** 油机升级记录 */
+export interface UpgradeInfo {
+   /** 原版本 */
+   oldVersion:string
+   /** 升级包 */
+   newVersion:string
+   /** 升级结果 */
+   upgradeResult:string
+}
+
+/** 计控参数设置记录 */
+export interface LegalParamsInfo {
+   /** 设置的脉冲隐藏参数 */
+   pulseHideParams:number
+   /** 设置结果 */
+   result:string
+}
+
+/** 计控交易日志拷贝记录 */
+export interface LegalTransLogCopyInfo {
+   /** 拷贝油枪的加油点 */
+   fpoint:number
+   /** 拷贝油枪的内部枪号 */
+   interNum:number
+   /** 拷贝油枪的外部枪号 */
+   nozzle:number
+   /** 开始拷贝交易 */
+   startTrans:number
+   /** 结束拷贝交易 */
+   endTrans:number
+   /** 拷贝结果 */
+   result:string
+}
+
+
+export interface pageInput {
+   /**当前页数 */
+   CurrentPage: number | any
+   /**展示页数 */
+   PageSize: number | any
+}

+ 364 - 0
admin.ui.plus-master/src/views/example/application/appOperationRecord/components/record_detail.vue

@@ -0,0 +1,364 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="state.showDialog"
+      destroy-on-close
+      :title="title"
+      draggable
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      width="600px"
+    >
+      <el-card header="基本信息" class="mt8" shadow="hover">
+        <el-row :gutter="35">
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <span>操作类型:{{ form.opreationType }}</span>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <span>油机唯一标识:{{ form.machineId }}</span>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <span>账户:{{ form.account }}</span>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <span>sn:{{ form.sn }}</span>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <span>操作时间:{{ form.createTime }}</span>
+          </el-col>
+        </el-row>
+      </el-card>
+      
+      <el-card v-if="form.opreationType == '冷启动'" header="机型" class="mt8" style="width: 100%;" shadow="hover" >
+        <el-col v-if="state.coldStartInfo.modelCode!= undefined && state.coldStartInfo.modelCode.length > 0" :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>机型码:{{ state.coldStartInfo.modelCode }}</span>
+        </el-col>
+        <el-col v-if="state.coldStartInfo.nonStandeNozzleList != undefined && state.coldStartInfo.nonStandeNozzleList.length > 0" :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>交叉出油配置</span>
+          <el-table :data="state.coldStartInfo.nonStandeNozzleList" stripe style="width: 100%;">
+            <el-table-column v-for="colume in state.nonstandNozzledynamicColumns" :key="colume" :prop="colume.prop" :label="colume.label" />
+          </el-table>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '冷启动'" header="显示屏配置" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" style="margin-bottom: 3%;">
+          <span>显示屏类型:{{ state.coldStartInfo.displayType }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-table :data="state.coldStartInfo.displayCountList" stripe style="width: 100%;">
+            <el-table-column v-for="colume in state.displayCountdynamicColumns" :key="colume" :prop="colume.prop" :label="colume.label" />
+          </el-table>
+        </el-col>
+      </el-card>
+      
+      <el-card v-if="form.opreationType == '冷启动'" header="油机ip" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>network ip:{{ state.coldStartInfo.machineIP.networkIP }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>network 网关:{{ state.coldStartInfo.machineIP.networkGateway }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>network 子网掩码:{{ state.coldStartInfo.machineIP.networkMask }}</span>
+        </el-col>
+        <hr style="margin: 3% 0%;height: 1px;" />
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF network ip:{{ state.coldStartInfo.machineIP.ifsfIP }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF network 网关:{{ state.coldStartInfo.machineIP.ifsfGateway }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF network 子网掩码:{{ state.coldStartInfo.machineIP.ifsfMask }}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '冷启动'" header="多媒体大屏配置" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>是否连接A面大屏:{{ state.coldStartInfo.screenConfig.isOpenVGAA == true ? "打开" : "关闭" }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>A面大屏IP:{{ state.coldStartInfo.screenConfig.ipVGAA }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>A面大屏端口:{{ state.coldStartInfo.screenConfig.portVGAA }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>A面大屏关联加油点:{{ state.coldStartInfo.screenConfig.fpointVGAA.join(',') }}</span>
+        </el-col>
+        <hr style="margin: 3% 0%;height: 1px;" />
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>是否连接B面大屏:{{ state.coldStartInfo.screenConfig.isOpenVGAB == true ? "打开" : "关闭" }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>B面大屏IP:{{ state.coldStartInfo.screenConfig.ipVGAB }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>B面大屏端口:{{ state.coldStartInfo.screenConfig.portVGAB }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>B面大屏关联加油点:{{ state.coldStartInfo.screenConfig.fpointVGAB.join(',') }}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '冷启动'" header="打印机配置" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-table :data="state.coldStartInfo.printerConfig" stripe style="width: 100%;">
+            <el-table-column v-for="colume in state.printConfigdynamicColumns" :key="colume" :prop="colume.prop" :label="colume.label" />
+          </el-table>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '冷启动'" header="协议配置" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>配置协议:{{ state.coldStartInfo.agree }}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '冷启动'" header="IFSF 音频配置" class="mt8" style="width: 100%;" shadow="hover">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>是否开启IFSF音频:{{ state.coldStartInfo.ifsfVolumeConfig.isOpen == true ? "打开" : "关闭" }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF 语音播报类型:{{ state.coldStartInfo.ifsfVolumeConfig.type }}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF 白天开始时间:{{ state.coldStartInfo.ifsfVolumeConfig.dayTime }} 点</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF 晚上开始时间:{{ state.coldStartInfo.ifsfVolumeConfig.nightTime }} 点</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF 白天音量:{{ state.coldStartInfo.ifsfVolumeConfig.dayVolume }} 级</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>IFSF 晚上音量:{{ state.coldStartInfo.ifsfVolumeConfig.nightTime }} 级</span>
+        </el-col>
+      </el-card>
+        
+      <el-card v-if="form.opreationType == '数据备份'" header="数据备份" class="mt8" shadow="hover" >
+        <span>备份结果:{{ state.dataBackInfo.backResult}}</span>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '数据还原'" header="数据还原" class="mt8" shadow="hover" >
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>还原包:{{ state.dataRestoreInfo.backInfo}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>还原结果:{{ state.dataRestoreInfo.restoreResult}}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '油机升级'" header="油机升级" class="mt8" shadow="hover" >
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>旧版本:{{ state.machineUpgradeInfo.oldVersion}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>升级包:{{ state.machineUpgradeInfo.newVersion}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>升级结果:{{ state.machineUpgradeInfo.upgradeResult}}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '计控参数'" header="计控参数" class="mt8" shadow="hover" >
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>设置的脉冲隐藏参数:{{ state.legalParamsInfo.pulseHideParams}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>设置结果:{{ state.legalParamsInfo.result}}</span>
+        </el-col>
+      </el-card>
+
+      <el-card v-if="form.opreationType == '计控交易日志'" header="计控交易日志" class="mt8" shadow="hover" >
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>拷贝油枪的加油点:{{ state.legalLogCopyInfo.fpoint}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>拷贝油枪的内部枪号:{{ state.legalLogCopyInfo.interNum}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>拷贝油枪的外部枪号:{{ state.legalLogCopyInfo.nozzle}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>开始拷贝日志:{{ state.legalLogCopyInfo.startTrans}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>结束拷贝日志:{{ state.legalLogCopyInfo.endTrans}}</span>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <span>拷贝结果:{{ state.legalLogCopyInfo.result}}</span>
+        </el-col>
+      </el-card>
+
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="onCancel" size="default">取 消</el-button>
+          <el-button type="primary" @click="onSure" size="default" :loading="state.sureLoading">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts" setup name="admin/org/form">
+import { reactive, toRefs, ref, PropType } from 'vue'
+import { OauthApplyDto,OauthApply } from '/@/api/admin/data-contracts'
+import { PermissionApi } from '/@/api/admin/Permission'
+import eventBus from '/@/utils/mitt'
+import { BackRestoreInfo, BackResultInfo, ColdStartInfo, LegalParamsInfo, LegalTransLogCopyInfo, RecordOutput, UpgradeInfo } from '/@/api/appOperationRecord/dto'
+import { number } from 'echarts'
+import { it } from 'node:test'
+
+defineProps({
+  title: {
+    type: String,
+    default: '',
+  },
+  orgTreeData: {
+    type: Array as PropType<OauthApply[]>,
+    default: () => [],
+  },
+})
+
+const formRef = ref()
+const state = reactive({
+  showDialog: false,
+  sureLoading: false,
+  /** 操作记录数据 */
+  form: {} as RecordOutput,
+  /**交叉出油动态表头 */
+  nonstandNozzledynamicColumns: [
+    { prop: 'nozzleNum', label: '物理枪号' },
+    { prop: 'fpoint', label: '加油点' },
+    { prop: 'oilId', label: '油品号' },
+    { prop: 'motolNum', label: '马达号' }],
+
+  /**显示屏数量动态表头 */
+  displayCountdynamicColumns: [
+    { prop: 'fpoint', label: '加油点' },
+    { prop: 'displayNum', label: '显示屏数量' }],
+
+  /**打印机配置动态表头 */
+  printConfigdynamicColumns: [
+    { prop: 'fpoint', label: '加油点' },
+    { prop: 'printerAdress', label: '打印机地址' },
+    { prop: 'printerMode', label: '打印机模式' }],  
+  /** 冷启动记录 */
+  coldStartInfo:{} as ColdStartInfo,
+  /** 数据备份记录 */
+  dataBackInfo:{} as BackResultInfo,
+  /** 数据还原记录 */
+  dataRestoreInfo:{} as BackRestoreInfo,
+  /** 油机升级记录 */
+  machineUpgradeInfo:{} as UpgradeInfo,
+  /** 计控参数设置记录 */
+  legalParamsInfo:{} as LegalParamsInfo,
+  /** 计控交易日志拷贝记录 */
+  legalLogCopyInfo:{} as LegalTransLogCopyInfo
+})
+
+const { form } = toRefs(state)
+
+// 打开对话框
+const open = async (row: any = {}) => {
+  // if (row.id > 0) {
+  //   const res = await new PermissionApi().getApplyInfo({ id: row.id }, { loading: true })
+
+  //   if (res?.success) {
+  //     let formData = res.data as OauthApplyDto
+  //     state.form = formData
+  //   }
+  // } else {
+  //   state.form = {} as OauthApplyDto
+  // }
+  
+  state.form=row
+
+  getRecord()
+  state.showDialog = true
+}
+
+/** 将操作记录json转对象 */
+const getRecord = () => {
+  clearRecord()
+
+  if(form.value.recodeJson) {
+    if(state.form.opreationType == "冷启动") {
+      state.coldStartInfo = JSON.parse(form.value.recodeJson)
+    }
+    if(state.form.opreationType == "数据备份"){
+      state.dataBackInfo = JSON.parse(form.value.recodeJson)
+    }
+    if(state.form.opreationType == "数据还原"){
+      state.dataRestoreInfo = JSON.parse(form.value.recodeJson)
+    }
+    if(state.form.opreationType == "油机升级"){
+      state.machineUpgradeInfo = JSON.parse(form.value.recodeJson)
+    }
+    if(state.form.opreationType == "计控参数"){
+      state.legalParamsInfo = JSON.parse(form.value.recodeJson)
+    }
+    if(state.form.opreationType == "计控交易日志"){
+      state.legalLogCopyInfo = JSON.parse(form.value.recodeJson)
+    }
+  }
+}
+
+/** 清空操作记录对象 */
+const clearRecord = () => {
+  /** 冷启动记录 */
+  state.coldStartInfo = {} as ColdStartInfo
+  /** 数据备份记录 */
+  state.dataBackInfo = {} as BackResultInfo,
+  /** 数据还原记录 */
+  state.dataRestoreInfo = {} as BackRestoreInfo,
+  /** 油机升级记录 */
+  state.machineUpgradeInfo = {} as UpgradeInfo,
+  /** 计控参数设置记录 */
+  state.legalParamsInfo = {} as LegalParamsInfo,
+  /** 计控交易日志拷贝记录 */
+  state.legalLogCopyInfo = {} as LegalTransLogCopyInfo
+}
+
+/** 转多媒体屏设置 */
+const trunScreenConfig = () => {
+  var screenFpointsA = ""
+    info.fpointVGAA.array.forEach((element:number) => {
+      screenFpointsA += element + ","
+    });
+    screenFpointsA.slice(0,screenFpointsA.length - 1)
+
+    var screenFpointsB = ""
+    info.fpointVGAB.array.forEach((element:number) => {
+      screenFpointsB += element + ","
+    });
+    screenFpointsB.slice(0,screenFpointsB.length - 1)
+
+    const screenConfig = {
+       isOpenVGAA: info.isOpenVGAA == true ? "打开" : "关闭",
+       ipVGAA: info.ipVGAA,
+       portVGAA: info.portVGAA,
+       fpointVGAA: screenFpointsA,
+       isOpenVGAB: info.isOpenVGAB == true ? "打开" : "关闭",
+       ipVGAB: info.ipVGAB,
+       portVGAB: info.portVGAB,
+       fpointVGAB: screenFpointsB
+    }
+}
+
+// 取消
+const onCancel = () => {
+  state.showDialog = false
+}
+
+// 确定
+const onSure = () => {
+  state.showDialog = false
+}
+
+defineExpose({
+  open,
+})
+</script>

+ 235 - 0
admin.ui.plus-master/src/views/example/application/appOperationRecord/index.vue

@@ -0,0 +1,235 @@
+<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>
+            <el-form-item prop="name" style="width: 100%">
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="应用">
+                  <el-input v-model="state.appName" disabled></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.MachineId" 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="设备sn">
+                  <el-input v-model="state.filter.SN" 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.Account" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="使用类型">
+                  <el-input v-model="state.filter.OpreationType" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form-item>
+          </el-form>
+
+          <hr>
+
+
+          <el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">
+            <el-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>
+      <!--表格-->
+      <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 type="selection" width="50"></el-table-column>
+
+            <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="onDataDetail(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>
+
+    <RecordDetailDialog ref="recordDetailRef"></RecordDetailDialog>
+  </div>
+</template>
+<script setup lang="ts">
+import { defineAsyncComponent, onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import eventBus from "/@/utils/mitt";
+import { Api } from "/@/api/appOperationRecord/api";
+import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
+import { RecordOutput } from "/@/api/appOperationRecord/dto";
+import type { pageInput } from "/@/api/appOperationRecord/dto"
+import router from "/@/router";
+import { PermissionApi } from "/@/api/admin/Permission";
+import { ElMessage } from "element-plus";
+
+/**引入组件*/
+const RecordDetailDialog = defineAsyncComponent(() => import('./components/record_detail.vue'))
+const recordDetailRef = ref()
+
+/**数据对象*/
+const state = reactive({
+  /**加载显示 */
+  loading: false,
+  /** 应用名称 */
+  appName: "",
+  /**条件查询模块 */
+  filter: {
+    /**油机唯一标识 */
+    MachineId: "",
+    /**应用的 app id */
+    AppId: "",
+    /**设备 sn */
+    SN: "",
+    /**登录账户 */
+    Account: "",
+    /**使用类型 */
+    OpreationType: "",
+  },
+  /**表格信息 */
+  tableModel: [] as RecordOutput,
+  /**动态表头 */
+  dynamicColumns: [
+    { prop: 'machineId', label: '油机唯一标识' },
+    { prop: 'sn', label: '设备 sn' },
+    { prop: 'account', label: '登录账户' },
+    { prop: 'opreationType', label: '使用类型' },
+    // { prop: 'recodeJson', label: '使用记录' },
+    { prop: 'createTime', label: '操作记录时间' },],
+  /**分页标识 */
+  pageInput: {
+    CurrentPage: 1,
+    PageSize: 10,
+  } as pageInput,
+  /**分页总数 */
+  total: 0,
+})
+onMounted(() => {
+  // 初始化分页大小
+  state.pageInput.PageSize = pageState.pageInput.pageSize;
+  init()
+  eventBus.off('refreshView')
+  eventBus.on('refreshView', async () => {
+    await init()
+  })
+  console.log()
+})
+onBeforeMount(() => {
+  eventBus.off('refreshView')
+})
+/**
+* 监听变换
+*/
+// watch(() => { })
+/**条件查询 */
+const onQuery = async () => {
+  state.loading = true;
+  try {
+    const res: any = await new Api().getList({ 
+      ...pageState.pageInput, 
+      "Filter.MachineId": state.filter.MachineId,
+      "Filter.SN": state.filter.SN,
+      "Filter.Account": state.filter.Account,
+      "Filter.AppId": state.filter.AppId,
+      "Filter.OpreationType": state.filter.OpreationType
+    })
+    state.total = res?.data?.total ?? 0
+    state.tableModel = res?.data?.list ?? []
+  } catch (error) {
+    console.error('获取操作记录列表失败:', error);
+    ElMessage.error('获取操作记录列表失败');
+  } finally {
+    state.loading = false;
+  }
+  
+}
+/**初始化 */
+const init = async () => {
+
+  try {
+    const name = router.currentRoute.value.params.id;
+    const appData = await new PermissionApi().getApplyInfo({ Name: name });
+    state.appName = appData.data[0].name;
+    state.filter.AppId = appData.data[0].appid;
+  } catch (error) {
+    console.error('获取应用信息失败:', error);
+    ElMessage.error('获取应用信息失败');
+  } finally {
+    state.loading = false;
+    onQuery();
+  }
+
+  state.loading = true
+  
+  state.loading = false
+}
+/**重置 */
+const onReset = () => { }
+/**详情 */
+const onDataDetail = (row) => {
+  recordDetailRef.value.open(row)
+}
+
+/**
+* 页条变化
+* @param val
+*/
+const onSizeChange = (val: number) => {
+  state.pageInput.PageSize = val
+  //需按照页面对象修改Data
+  onQuery()
+}
+
+/**
+ * 页数 变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  state.pageInput.CurrentPage = val
+  //需按照页面对象修改Data
+  onQuery()
+}
+</script>
+<style scoped lang="scss">
+.el-input,
+.el-select {
+  width: 240px;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::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>

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

@@ -31,7 +31,8 @@
                 <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;" type="primary" @click="toRolePage(v)">角色</el-button></el-col>
                 <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;" type="primary" @click="toViewPage(v)">视图</el-button></el-col>
                 <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="toEquipmentPage(v)">设备管理</el-button></el-col>
-                <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="onEdit(v)">修改</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="toRecordPage(v)">操作记录</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="onEdit(v)">修改</el-button></el-col>
               </el-row>
             </div>
           </div>
@@ -119,6 +120,9 @@ const toPermissPage = (row: OauthApply) => {
 const toEquipmentPage = (row: OauthApply) => {
   router.push({path:`/application/equipment/${row.name}`})
 }
+const toRecordPage = (row: OauthApply) => {
+  router.push({path:`/application/appOperationRecord/${row.name}`})
+}
 </script>
 <!-- sss -->
 

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio