feat: 远程操作

master
李小林 8 months ago
parent 19668bc2d6
commit 5500611fba
  1. 19
      src/api/operate-result-args/index.ts
  2. 18
      src/api/operate-result-args/types.ts
  3. 27
      src/api/remote/index.ts
  4. 1
      src/api/remote/types.ts
  5. 8
      src/api/service/index.ts
  6. 15
      src/api/service/types.ts
  7. 8
      src/views/family/operate/order/components/OrderServiceParameterTable.vue
  8. 98
      src/views/family/operate/remote-operation/components/DeviceLinkInfo.vue
  9. 7
      src/views/family/operate/remote-operation/components/DeviceOperateLog.vue
  10. 82
      src/views/family/operate/remote-operation/components/DeviceService.vue
  11. 5
      src/views/family/operate/remote-operation/components/DeviceStatus.vue
  12. 23
      src/views/family/operate/remote-operation/components/OperateTabs.vue
  13. 205
      src/views/family/operate/remote-operation/components/RemoteOperateInfo.vue
  14. 109
      src/views/family/operate/remote-operation/components/RemoteOperateList.vue
  15. 108
      src/views/family/operate/remote-operation/components/ServiceParameter.vue

@ -0,0 +1,19 @@
import { AxiosPromise } from "axios";
import { FTTRInfoVO, ServiceCompareVO } from "@/api/operate-result-args/types";
import request from "@/utils/request";
export function getServiceCompareData(
devId?: number,
serviceName?: string
): AxiosPromise<ServiceCompareVO[]> {
return request({
url: `/api/operate-result-args/v1/device-service-parameter/${devId}/${serviceName}`,
method: "GET",
});
}
export function fttrPrimaryGateway(devId?: number): AxiosPromise<FTTRInfoVO[]> {
return request({
url: `/api/operate-result-args/v1/fttr-primary-gateway/${devId}`,
method: "GET",
});
}

@ -0,0 +1,18 @@
import { ParamInfo } from "@/api/operate-log/types";
export interface ServiceParamInfo {
parameterName?: string;
actualValue?: string;
remarks?: string;
expectationValue?: string;
}
export interface ServiceCompareVO {
title?: string;
list?: ServiceParamInfo[];
}
export interface FTTRInfoVO {
title?: string;
list?: ParamInfo[];
}

@ -6,6 +6,7 @@ import {
UnBindingForm,
} from "@/api/remote/types";
import { DeviceLinkVO } from "@/api/operate-log/types";
import { FTTRInfoVO, ServiceCompareVO } from "@/api/operate-result-args/types";
export function remoteDevInfo(devId: number): AxiosPromise<RemoteDevInfoVO> {
return request({
@ -49,3 +50,29 @@ export function remoteDeviceLinkInfo(
method: "GET",
});
}
export function serviceCompareParameter(
devId?: number,
serviceId?: number,
serviceVerName?: string,
serviceName?: string
): AxiosPromise<ServiceCompareVO[]> {
return request({
url: `/api/equipment/v1/remote/compare-parameter/${devId}/${serviceId}/${serviceVerName}/${serviceName}`,
method: "GET",
});
}
export function remoteFTTRPrimaryGateway(
devId: number
): AxiosPromise<FTTRInfoVO[]> {
return request({
url: `/api/equipment/v1/remote/fttp-primary-gateway/${devId}`,
method: "GET",
});
}
export function remoteFTTRSubGateway(devId: number) {
return request({
url: `/api/equipment/v1/remote/fttp-sub-gateway/${devId}`,
method: "GET",
});
}

@ -61,6 +61,7 @@ export interface DeviceInfo {
devOnline?: string;
devOnlineTime?: string;
devCreateTime?: string;
devTypeNameDetail?: string;
}
export interface RemoteOperateResult {
resultState?: string;

@ -3,10 +3,10 @@ import {
BusinessFile,
BusinessForm,
BusinessPageResult,
DeviceBusinessVO,
ServicePageResult,
} from "@/api/service/types";
import request from "@/utils/request";
import { Tr069DevTypeQuery, Tr069DevTypeVOPageResult } from "@/api/tr069/types";
export function tr069ServiceList(
data: PageQuery,
@ -115,3 +115,9 @@ export function deleteFileAPI(fileId?: number, servId?: number) {
method: "DELETE",
});
}
export function deviceTabs(devId?: number): AxiosPromise<DeviceBusinessVO[]> {
return request({
url: `/api/service/v1/tabs/${devId}`,
method: "GET",
});
}

@ -42,3 +42,18 @@ export interface Tr069Option {
key?: number;
label?: string;
}
export interface DeviceBusinessVO {
servId?: number;
servName?: string;
servVerName?: string;
servDisplayName?: string;
servDesc?: string;
servMapStatus?: string;
servStatusTime?: string;
}

@ -7,7 +7,7 @@
width="900"
>
<div class="any-table">
<el-table :data="tableData" v-loading="loading">
<el-table :data="tableData" v-loading="loading" max-height="550">
<el-table-column label="业务参数名称" prop="argsName" align="center" />
<el-table-column
label="业务参数新值"
@ -66,4 +66,8 @@ const getOrderServicePage = () => {
};
</script>
<style scoped></style>
<style scoped>
:deep(.el-dialog__body){
padding: 0 !important;
}
</style>

@ -3,22 +3,40 @@
<el-card shadow="never">
<template #header>
<div class="head-parent-right">
<el-button type="primary" @click="loadRemoteDeviceLinkInfo"
<el-button
type="primary"
:disabled="linkFlag"
:icon="Refresh"
@click="loadRemoteDeviceLinkInfo"
>获取设备链路信息</el-button
>
<div v-if="FTTRFlag" class="ml-2">
<el-button
type="primary"
:icon="Refresh"
@click="loadRemoteFTTRPrimaryGateway"
>刷新设备主网关信息</el-button
>
<el-button
type="primary"
:icon="Refresh"
@click="loadRemoteFTTRSubGateway"
>刷新设备子网关信息</el-button
>
</div>
</div>
</template>
<el-empty
description="暂无数据"
v-loading="loading"
v-if="tableData.length === 0"
v-if="tableData.length === 0 && FTTRData.length === 0"
/>
<div v-loading="loading">
<el-card
class="any-table"
v-for="(item, index) in tableData"
:key="index"
shadow="never"
v-loading="loading"
>
<template #header>
<span style="font-size: 14px; font-weight: 700">{{
@ -41,18 +59,66 @@
<el-table-column label="备注" align="left" prop="remarks" />
</el-table>
</el-card>
<el-divider />
<el-card
class="any-table"
v-for="(item, index) in FTTRData"
:key="index"
shadow="never"
>
<template #header>
<span style="font-size: 14px; font-weight: 700">{{
item.title
}}</span>
</template>
<el-table :data="item.list" highlight-current-row>
<el-table-column
label="参数名称"
align="left"
width="250"
prop="parameterName"
/>
<el-table-column
label="实际值"
align="left"
width="200"
prop="actualValue"
/>
<el-table-column label="备注" align="left" prop="remarks" />
</el-table>
</el-card>
</div>
</el-card>
</div>
</template>
<script setup lang="ts">
import { DeviceLinkVO } from "@/api/operate-log/types";
import { getDeviceLinkInfo, remoteDeviceLinkInfo } from "@/api/remote";
import {
getDeviceLinkInfo,
remoteDeviceLinkInfo,
remoteFTTRPrimaryGateway,
remoteFTTRSubGateway,
} from "@/api/remote";
import { Refresh } from "@element-plus/icons-vue";
import { FTTRInfoVO } from "@/api/operate-result-args/types";
import { fttrPrimaryGateway } from "@/api/operate-result-args";
import { DeviceInfo } from "@/api/remote/types";
const prop = defineProps<{
devId: number;
devTypeNameDetail?: string;
}>();
const loading = ref<boolean>(false);
const tableData = ref<DeviceLinkVO[]>([]);
const FTTRData = ref<FTTRInfoVO[]>([]);
const linkFlag = computed(() => {
return loading.value;
});
const FTTRFlag = computed(() => {
return (
prop.devTypeNameDetail == "FTTR" && prop.devTypeNameDetail != undefined
);
});
const loadDeviceLinkInfo = () => {
loading.value = true;
getDeviceLinkInfo(prop.devId)
@ -73,8 +139,32 @@ const loadRemoteDeviceLinkInfo = () => {
loading.value = false;
});
};
const loadFTTRInfo = () => {
fttrPrimaryGateway(prop.devId).then(({ data }) => {
FTTRData.value = data;
});
};
const loadRemoteFTTRPrimaryGateway = () => {
loading.value = true;
remoteFTTRPrimaryGateway(prop.devId)
.then(({ data }) => {
FTTRData.value = data;
})
.finally(() => {
loading.value = false;
});
};
const loadRemoteFTTRSubGateway = () => {
loading.value = true;
remoteFTTRSubGateway(prop.devId)
.then(() => {})
.finally(() => {
loading.value = false;
});
};
onMounted(() => {
loadDeviceLinkInfo();
loadFTTRInfo();
});
</script>

@ -35,24 +35,25 @@
</div>
<div class="any-table">
<el-table
border
:data="scope.row.paramInfoList"
highlight-current-row
>
<el-table-column
label="参数名称"
align="center"
align="left"
width="250"
prop="parameterName"
/>
<el-table-column
label="实际值"
align="center"
align="left"
width="100"
prop="actualValue"
/>
<el-table-column
label="备注"
align="center"
align="left"
prop="remarks"
/>
</el-table>

@ -0,0 +1,82 @@
<template>
<el-descriptions :column="3" border>
<el-descriptions-item
label="业务名称"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servName }}
</el-descriptions-item>
<el-descriptions-item
label="业务版本"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servVerName }}
</el-descriptions-item>
<el-descriptions-item
label="业务显示名称"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servDisplayName }}
</el-descriptions-item>
<el-descriptions-item
label="业务状态"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servMapStatus }}
</el-descriptions-item>
<el-descriptions-item
label="业务描述"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servDesc }}
</el-descriptions-item>
<el-descriptions-item
label="操作时间"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ service.servStatusTime }}
</el-descriptions-item>
</el-descriptions>
<service-parameter
:dev-id="prop.devId"
:service-name="service.servName"
:service-id="service.servId"
:service-ver-name="service.servVerName"
/>
</template>
<script setup lang="ts">
import { DeviceBusinessVO } from "@/api/service/types";
import ServiceParameter from "@/views/family/operate/remote-operation/components/ServiceParameter.vue";
const prop = defineProps<{
service: DeviceBusinessVO;
devId: number;
}>();
</script>
<style scoped></style>

@ -40,7 +40,10 @@
</el-descriptions-item>
</el-descriptions>
<device-ability :type-and-ver-id="typeAndVerId" />
<device-link-info :dev-id="devId" />
<device-link-info
:dev-id="devId"
:dev-type-name-detail="deviceInfo.devTypeNameDetail"
/>
</template>
<script setup lang="ts">

@ -4,21 +4,36 @@
<el-tab-pane label="设备状态信息">
<device-status :dev-id="devId" :type-and-ver-id="prop.typeAndVerId" />
</el-tab-pane>
<el-tab-pane :label="label" v-for="(label, index) in tabs" :key="index">{{
label
}}</el-tab-pane>
<el-tab-pane
:label="item.servName"
v-for="item in tabs"
:key="item.servId"
>
<device-service :dev-id="prop.devId" :service="item" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import DeviceStatus from "@/views/family/operate/remote-operation/components/DeviceStatus.vue";
import { deviceTabs } from "@/api/service";
import { DeviceBusinessVO } from "@/api/service/types";
import DeviceService from "@/views/family/operate/remote-operation/components/DeviceService.vue";
const prop = defineProps<{
devId: number;
typeAndVerId: number;
}>();
const tabs = ref<string[]>([]);
const tabs = ref<DeviceBusinessVO[]>([]);
const loadTabs = () => {
deviceTabs(prop.devId).then(({ data }) => {
tabs.value = data;
});
};
onMounted(() => {
loadTabs();
});
</script>
<style scoped></style>

@ -187,183 +187,52 @@
>
{{ remote.devTypeNameDetail }}
</el-descriptions-item>
<el-descriptions-item
label="远程操作"
label-align="left"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div>
<el-dropdown split-button placement="right">
远程操作列表
<template #dropdown>
<el-dropdown-menu>
<el-scrollbar height="300">
<div v-hasPerm="['family:remote:parameter:tree']">
<el-dropdown-item>设备参数树浏览</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:ping:test']">
<el-dropdown-item divided
>设备Ping测试
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:profiles:upload']">
<el-dropdown-item divided
>设备配置文件上传
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:terminal:log_file']">
<el-dropdown-item divided
>获取设备终端日志文件
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:change']">
<el-dropdown-item divided>设备更换</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:reload']">
<el-dropdown-item divided
>设备远程重启
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:profiles:issued']">
<el-dropdown-item divided
>设备厂商配置文件下发
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:full_service:issued']">
<el-dropdown-item divided
>设备全业务配置下发
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:soft_ver:upgrade']">
<el-dropdown-item divided
>设备软件版本升级
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:loop_back:diagnosis']">
<el-dropdown-item divided
>ATMF5Loopback诊断
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dsl_loop:diagnosis']">
<el-dropdown-item divided>DslLoop诊断</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:monitor']">
<el-dropdown-item divided>设备监控</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:ida:diagnosis']">
<el-dropdown-item divided>IAD诊断</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:service_port:binding']">
<el-dropdown-item divided
>修改业务端口绑定
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:terminal:registration']">
<el-dropdown-item divided
>开启终端注册页面
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:speed:operation']">
<el-dropdown-item divided>测速操作</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:reset:graphs']">
<el-dropdown-item divided
>终端重置数图
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:iptv:multicast']">
<el-dropdown-item divided
>重置IPTV组播
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:node:customize']">
<el-dropdown-item divided
>自定义节点定制
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_4:itv_2_3']">
<el-dropdown-item divided
>宽带14;ITV 23
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_3_4:itv_1_2']">
<el-dropdown-item divided
>宽带34;ITV 12
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1:itv_2_3_4']">
<el-dropdown-item divided
>宽带1口;ITV 234
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_3_4:itv_2']">
<el-dropdown-item divided
>宽带134;ITV 2
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_2_3_4']">
<el-dropdown-item divided
>宽带1 234
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_3:itv_2']">
<el-dropdown-item divided
>三合一终端宽带13;ITV 2
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:info:update']">
<el-dropdown-item divided
>通用信息修改
</el-dropdown-item>
</div>
</el-scrollbar>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" border>
<el-descriptions-item
label="其他操作"
label-align="left"
align="center"
label-class-name="my-label"
label-class-name="my-label2"
class-name="my-content"
width="150px"
>
<div>
<el-dropdown split-button placement="left">
其他操作列表
<template #dropdown>
<el-dropdown-menu>
<el-scrollbar height="300">
<el-dropdown-item @click="skipDevOrder"
>设备工单</el-dropdown-item
<div class="flex justify-center">
<remote-operate-list />
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipDevOrder"
>设备工单</el-button
>
<el-dropdown-item divided @click="skipDevTask2"
>设备任务列表</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipDevTask2"
>设备任务列表</el-button
>
<el-dropdown-item divided @click="skipProfiles"
>终端配置文件</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipProfiles"
>终端配置文件</el-button
>
<el-dropdown-item divided @click="skipTerminalLogFiles"
>终端日志文件</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipTerminalLogFiles"
>终端日志文件</el-button
>
<el-dropdown-item divided @click="skipDeviceOperateLog"
>设备操作日志</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipDeviceOperateLog"
>设备操作日志</el-button
>
<el-dropdown-item divided @click="skipSoapPackageLog"
>SOAP包日志</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipSoapPackageLog"
>SOAP包日志</el-button
>
<el-dropdown-item divided @click="skipDevTypeVerLog"
>软件版本对外接口调用信息</el-dropdown-item
<el-divider direction="vertical" />
<el-button type="primary" link @click="skipDevTypeVerLog"
>软件版本对外接口调用信息</el-button
>
</el-scrollbar>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</el-descriptions-item>
</el-descriptions>
@ -378,6 +247,7 @@ import { DeviceInfo, RemoteDevInfoVO, UnBindingForm } from "@/api/remote/types";
import { remoteDevInfo, remoteUnbindingLogicId } from "@/api/remote";
import { InfoFilled } from "@element-plus/icons-vue";
import OperateTabs from "@/views/family/operate/remote-operation/components/OperateTabs.vue";
import RemoteOperateList from "@/views/family/operate/remote-operation/components/RemoteOperateList.vue";
const route = useRoute();
const router = useRouter();
@ -398,6 +268,7 @@ const getData = () => {
devOnline: data.devOnline,
devOnlineTime: data.devOnlineTime,
devCreateTime: data.devCreateTime,
devTypeNameDetail: data.devTypeNameDetail,
};
})
.finally(() => {
@ -477,4 +348,12 @@ onMounted(() => {
:deep(.my-label) {
background: var(--el-color-white) !important;
}
:deep(.my-label2) {
width: 0 !important;
display: none !important;
background: var(--el-color-white) !important;
}
:deep(.el-divider--vertical) {
height: 2.2em !important;
}
</style>

@ -0,0 +1,109 @@
<template>
<el-dropdown split-button placement="right">
远程操作列表
<template #dropdown>
<el-dropdown-menu>
<el-scrollbar height="300">
<div v-hasPerm="['family:remote:parameter:tree']">
<el-dropdown-item>设备参数树浏览</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:ping:test']">
<el-dropdown-item divided>设备Ping测试 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:profiles:upload']">
<el-dropdown-item divided>设备配置文件上传 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:terminal:log_file']">
<el-dropdown-item divided>获取设备终端日志文件 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:change']">
<el-dropdown-item divided>设备更换</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:reload']">
<el-dropdown-item divided>设备远程重启 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:profiles:issued']">
<el-dropdown-item divided>设备厂商配置文件下发 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:full_service:issued']">
<el-dropdown-item divided>设备全业务配置下发 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:soft_ver:upgrade']">
<el-dropdown-item divided>设备软件版本升级 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:loop_back:diagnosis']">
<el-dropdown-item divided>ATMF5Loopback诊断 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dsl_loop:diagnosis']">
<el-dropdown-item divided>DslLoop诊断</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:dev:monitor']">
<el-dropdown-item divided>设备监控</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:ida:diagnosis']">
<el-dropdown-item divided>IAD诊断</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:service_port:binding']">
<el-dropdown-item divided>修改业务端口绑定 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:terminal:registration']">
<el-dropdown-item divided>开启终端注册页面 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:speed:operation']">
<el-dropdown-item divided>测速操作</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:reset:graphs']">
<el-dropdown-item divided>终端重置数图 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:iptv:multicast']">
<el-dropdown-item divided>重置IPTV组播 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:node:customize']">
<el-dropdown-item divided>自定义节点定制 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_4:itv_2_3']">
<el-dropdown-item divided>宽带14;ITV 23 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_3_4:itv_1_2']">
<el-dropdown-item divided>宽带34;ITV 12 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1:itv_2_3_4']">
<el-dropdown-item divided>宽带1口;ITV 234 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_3_4:itv_2']">
<el-dropdown-item divided>宽带134;ITV 2 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_2_3_4']">
<el-dropdown-item divided>宽带1 234 </el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:broadband_1_3:itv_2']">
<el-dropdown-item divided
>三合一终端宽带13;ITV 2
</el-dropdown-item>
</div>
<div v-hasPerm="['family:remote:info:update']">
<el-dropdown-item divided>通用信息修改 </el-dropdown-item>
</div>
</el-scrollbar>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script setup lang="ts"></script>
<style scoped>
.button-container {
display: flex;
flex-wrap: wrap;
border-left: 1px solid #ebeef5;
}
.button-wrapper {
width: calc(100% / 9); /* 假设每行有6个按钮可以根据需要调整 */
padding: 10px;
box-sizing: border-box;
}
.button-wrapper {
border-bottom: 1px solid #ebeef5;
}
</style>

@ -0,0 +1,108 @@
<template>
<div class="mt-4">
<el-card shadow="never">
<template #header>
<div class="head-parent-right">
<el-button
type="primary"
@click="compareParameter"
plain
:disabled="disableFlag"
>业务参数对照</el-button
>
<el-button type="primary" plain>重置业务</el-button>
</div>
</template>
<el-empty
description="暂无数据"
v-loading="loading"
v-if="vo.length === 0"
/>
<el-card
class="any-table"
shadow="never"
v-for="(item, index) in vo"
:key="index"
v-loading="loading"
>
<template #header>
<span style="font-size: 14px; font-weight: 700">{{
item.title
}}</span>
</template>
<el-table :data="item.list">
<el-table-column
label="参数名称"
align="left"
width="200"
prop="parameterName"
/>
<el-table-column
label="期望值"
align="left"
width="300"
prop="expectationValue"
/>
<el-table-column
label="实际值"
align="left"
width="300"
prop="actualValue"
/>
<el-table-column label="备注" align="left" prop="remarks" />
</el-table>
</el-card>
</el-card>
</div>
</template>
<script setup lang="ts">
import { getServiceCompareData } from "@/api/operate-result-args";
import { ServiceCompareVO } from "@/api/operate-result-args/types";
import { serviceCompareParameter } from "@/api/remote";
const prop = defineProps<{
devId: number;
serviceName?: string;
serviceVerName?: string;
serviceId?: number;
}>();
const vo = ref<ServiceCompareVO[]>([]);
const loading = ref<boolean>(false);
const loadData = () => {
loading.value = true;
getServiceCompareData(prop.devId, prop.serviceName)
.then(({ data }) => {
vo.value = data;
})
.finally(() => {
loading.value = false;
});
};
const disableFlag = computed(() => {
return loading.value;
});
const compareParameter = () => {
loading.value = true;
serviceCompareParameter(
prop.devId,
prop.serviceId,
prop.serviceVerName,
prop.serviceName
)
.then(({ data }) => {
vo.value = data;
})
.finally(() => {
loading.value = false;
});
};
onMounted(() => {
loadData();
});
</script>
<style scoped>
:deep(.el-card__body) {
padding: 0 0 0 0;
}
</style>
Loading…
Cancel
Save