1230 lines
50 KiB
Vue
1230 lines
50 KiB
Vue
<template>
|
|
<div class="DeviceModel">
|
|
<el-dialog v-model="modelDialogVisible" :title="modelDialogTitle" :width="400" @close="cancelModelForm" :close-on-click-modal="false" draggable>
|
|
<el-form ref="modelFormRef" :model="modelForm" :rules="modelFormRules" label-width="110">
|
|
<el-form-item prop="iotModelName" :label="ModelFieldsEnums['iotModelName']">
|
|
<el-input
|
|
:disabled="modelDialogState === ModelDialogTitleStateType['detail']"
|
|
v-model="modelForm.iotModelName"
|
|
:placeholder="'请输入' + ModelFieldsEnums['iotModelName']"
|
|
></el-input>
|
|
</el-form-item>
|
|
<el-form-item prop="iotModelCode" :label="ModelFieldsEnums['iotModelCode']">
|
|
<el-input
|
|
:disabled="!(modelDialogState === ModelDialogTitleStateType['add'])"
|
|
v-model="modelForm.iotModelCode"
|
|
:placeholder="'请输入' + ModelFieldsEnums['iotModelCode']"
|
|
></el-input>
|
|
</el-form-item>
|
|
<el-form-item prop="objectType" :label="ModelFieldsEnums['objectType']">
|
|
<el-select
|
|
:disabled="modelDialogState === ModelDialogTitleStateType['detail']"
|
|
v-model="modelForm.objectType"
|
|
:placeholder="'请选择' + ModelFieldsEnums['objectType']"
|
|
>
|
|
<el-option
|
|
v-for="item in deviceTypeList"
|
|
:key="item.equipmentTypeId"
|
|
:label="item.equipmentTypeName"
|
|
:value="item.equipmentTypeId"
|
|
></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer v-if="modelDialogState !== ModelDialogTitleStateType['detail']">
|
|
<el-button type="primary" @click="submitModelForm" :loading="submitModelLoading">保存</el-button>
|
|
<el-button @click="cancelModelForm">取消</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
<el-container class="containerPart">
|
|
<el-aside class="asidePart">
|
|
<el-header class="asideHeader">
|
|
<el-input
|
|
v-model="searchModelValue"
|
|
:suffix-icon="Search"
|
|
clearable
|
|
@input="debounceSearchModel"
|
|
placeholder="请输入模型名称"
|
|
class="searchModelInput"
|
|
></el-input>
|
|
<el-tooltip effect="light" content="新增物模型" placement="bottom">
|
|
<el-button :icon="Plus" @click="openModel('add')"></el-button>
|
|
</el-tooltip>
|
|
</el-header>
|
|
<el-main class="treeMain">
|
|
<el-tree
|
|
ref="modelTreeRef"
|
|
node-key="id"
|
|
:data="treeData"
|
|
:props="DeviceModelPropReplace"
|
|
class="treePart"
|
|
@node-contextmenu="modelContextMenu"
|
|
@node-click="modelNodeClick"
|
|
highlight-current
|
|
>
|
|
</el-tree>
|
|
</el-main>
|
|
</el-aside>
|
|
<el-container class="mainContainer">
|
|
<el-header class="mainHeader">
|
|
<div class="mainHeaderCenter">
|
|
<el-input
|
|
clearable
|
|
class="modelAttributeSearchInput"
|
|
v-model="modelAttributeAndServiceInputValue"
|
|
:placeholder="modelAttributeAndServiceInputPlaceHolder"
|
|
></el-input>
|
|
<el-radio-group v-model="modelAttributeSearchRadio">
|
|
<el-radio value="Name">名称</el-radio>
|
|
<el-radio value="Code">编码</el-radio>
|
|
</el-radio-group>
|
|
<el-button :icon="Search" type="primary" @click="searchModelAttribute">查询</el-button>
|
|
</div>
|
|
<div class="mainHeaderRight">
|
|
<el-button :icon="Plus" type="primary" @click="addModelAttributeAndService">新增</el-button>
|
|
<el-upload ref="uploadRef" :show-file-list="false" :limit="1" :http-request="upLoadModel" :on-exceed="handleExceed">
|
|
<template #trigger>
|
|
<el-button :icon="Upload">导入</el-button>
|
|
</template>
|
|
</el-upload>
|
|
<el-button :icon="Download" @click="downLoadModel">导出</el-button>
|
|
</div>
|
|
</el-header>
|
|
<el-main class="mainMain">
|
|
<el-tabs v-model="ModelTabs" @tab-change="changeTabs" class="tabsPart">
|
|
<el-tab-pane :label="modelTabsType['attribute']" name="attribute">
|
|
<el-table
|
|
ref="attributeTableRef"
|
|
:data="attributeTableData"
|
|
@sort-change="sortChange"
|
|
class="tablePart"
|
|
highlight-current-row
|
|
>
|
|
<el-table-column
|
|
prop="porder"
|
|
:label="ModelAttributeFieldsEnums['porder']"
|
|
align="center"
|
|
sortable="custom"
|
|
width="80"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="attributeName"
|
|
:label="ModelAttributeFieldsEnums['attributeName']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="attributeCode"
|
|
:label="ModelAttributeFieldsEnums['attributeCode']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="attributeTypeName"
|
|
:label="ModelAttributeFieldsEnums['attributeTypeName']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column fixed="right" label="操作" width="130" align="center">
|
|
<template #default="scope">
|
|
<div class="tableOperate">
|
|
<a @click="editAttributeForm(scope.row)">编辑</a>
|
|
<a>|</a>
|
|
<el-popconfirm title="确定删除么?" @confirm="delAttributeForm(scope.row)">
|
|
<template #reference>
|
|
<a>删除</a>
|
|
</template>
|
|
</el-popconfirm>
|
|
</div>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-tab-pane>
|
|
<el-tab-pane :label="modelTabsType['service']" name="service">
|
|
<el-table ref="serviceTableRef" :data="serviceTableData" @sort-change="sortChange" class="tablePart">
|
|
<el-table-column
|
|
prop="porder"
|
|
:label="ModelServiceFieldsEnums['porder']"
|
|
align="center"
|
|
sortable="custom"
|
|
width="80"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="serviceName"
|
|
:label="ModelServiceFieldsEnums['serviceName']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="serviceCode"
|
|
:label="ModelServiceFieldsEnums['serviceCode']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column
|
|
prop="serviceTypeName"
|
|
:label="ModelServiceFieldsEnums['serviceTypeName']"
|
|
align="center"
|
|
sortable="custom"
|
|
></el-table-column>
|
|
<el-table-column fixed="right" label="操作" min-width="80" align="center">
|
|
<template #default="scope">
|
|
<div class="tableOperate">
|
|
<a @click="editServiceForm(scope.row)">编辑</a>
|
|
<a>|</a>
|
|
<el-popconfirm title="确定删除么?" @confirm="delServiceForm(scope.row)">
|
|
<template #reference>
|
|
<a>删除</a>
|
|
</template>
|
|
</el-popconfirm>
|
|
</div>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
<div class="mainFooter">
|
|
<el-pagination
|
|
v-model:current-page="currentPage"
|
|
v-model:page-size="currentPageSize"
|
|
:total="pageTotal"
|
|
:page-sizes="pagePagination"
|
|
background
|
|
:pager-count="7"
|
|
layout="prev, pager, next, jumper,sizes,total"
|
|
@change="getcurrentPage"
|
|
></el-pagination>
|
|
</div>
|
|
</el-main>
|
|
</el-container>
|
|
</el-container>
|
|
<ContextMenu :pos="contextMenuPos" v-model:visible="modelOperateVisible">
|
|
<template #default>
|
|
<div class="modelOperate">
|
|
<el-button @click="openModel('detail', curContextMenuTreeData)" :icon="Reading">查看</el-button>
|
|
<!-- <el-button @click="openModel('add')" :icon="DocumentAdd">新增</el-button> -->
|
|
<el-button @click="openModel('edit', curContextMenuTreeData)" :icon="DocumentChecked">修改</el-button>
|
|
<el-popconfirm title="确认删除?" @confirm="delModel">
|
|
<template #reference>
|
|
<el-button :icon="DocumentDelete" @click.stop>删除</el-button>
|
|
</template>
|
|
</el-popconfirm>
|
|
</div>
|
|
</template>
|
|
</ContextMenu>
|
|
<el-dialog v-model="attributeVisible" :title="attributeFormTitle" @close="closeAttributeForm" :width="600" draggable :close-on-click-modal="false">
|
|
<el-form ref="attributeFormRef" :model="attributeForm" label-width="100" :rules="attributeAndServiceRules">
|
|
<el-form-item :label="ModelAttributeFieldsEnums['attributeName']" prop="attributeName">
|
|
<el-input v-model="attributeForm.attributeName" :placeholder="'请输入' + ModelAttributeFieldsEnums['attributeName']"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelAttributeFieldsEnums['attributeCode']" prop="attributeCode">
|
|
<el-input v-model="attributeForm.attributeCode" :placeholder="'请输入' + ModelAttributeFieldsEnums['attributeCode']"></el-input>
|
|
</el-form-item>
|
|
<div class="formRowStyle">
|
|
<el-form-item :label="ModelAttributeFieldsEnums['attributeTypeName']" prop="attributeType">
|
|
<el-select
|
|
v-model="attributeForm.attributeType"
|
|
:placeholder="'请选择' + ModelAttributeFieldsEnums['attributeTypeName']"
|
|
@change="attributeTypeChange"
|
|
>
|
|
<el-option label="模拟量" :value="138"></el-option>
|
|
<el-option label="累积量" :value="139"></el-option>
|
|
<el-option label="离散量" :value="140"></el-option>
|
|
<el-option label="计算量" :value="199"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<template
|
|
v-if="attributeForm.attributeType === 138 || attributeForm.attributeType === 139 || attributeForm.attributeType === 199"
|
|
>
|
|
<el-form-item :label="ModelAttributeFieldsEnums['dataType']" prop="dataType">
|
|
<el-select v-model="attributeForm.dataType" :placeholder="'请选择' + ModelAttributeFieldsEnums['dataType']">
|
|
<el-option v-for="v in attributeFormDataTypeOptions" :key="v.value" :label="v.value" :value="v.value"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
</template>
|
|
<el-form-item v-if="attributeForm.attributeType === 140" :label="ModelAttributeFieldsEnums['porder']" prop="porder">
|
|
<el-input v-model="attributeForm.porder" :placeholder="'请输入' + ModelAttributeFieldsEnums['porder']"></el-input>
|
|
</el-form-item>
|
|
</div>
|
|
<div class="formRowStyle">
|
|
<el-form-item v-if="attributeForm.attributeType !== 140" :label="ModelAttributeFieldsEnums['porder']" prop="porder">
|
|
<el-input v-model="attributeForm.porder" :placeholder="'请输入' + ModelAttributeFieldsEnums['porder']"></el-input>
|
|
</el-form-item>
|
|
<el-form-item
|
|
v-if="attributeForm.attributeType === 138 || attributeForm.attributeType === 139 || attributeForm.attributeType === 199"
|
|
:label="ModelAttributeFieldsEnums['unit']"
|
|
prop="unit"
|
|
>
|
|
<el-input v-model="attributeForm.unit" :placeholder="'请输入' + ModelAttributeFieldsEnums['unit']"></el-input>
|
|
</el-form-item>
|
|
</div>
|
|
<el-form-item v-if="attributeForm.attributeType === 140" :label="ModelAttributeFieldsEnums['level']" prop="level">
|
|
<el-select v-model="attributeForm.level" :placeholder="'请选择' + ModelAttributeFieldsEnums['level']">
|
|
<el-option v-for="v in attributeFormDataLevelOptions" :key="v.value" :label="v.label" :value="v.value"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<div class="formRowSplitFiledStyle">
|
|
<el-form-item v-if="attributeForm.attributeType === 140" :label="ModelAttributeFieldsEnums['stateDesc']" prop="stateDesc0">
|
|
<el-input v-model="attributeForm.stateDesc0" placeholder="请输入状态0描述"></el-input>
|
|
</el-form-item>
|
|
<el-form-item v-if="attributeForm.attributeType === 140" prop="stateDesc1" label-width="10">
|
|
<el-input v-model="attributeForm.stateDesc1" placeholder="请输入状态1描述"></el-input>
|
|
</el-form-item>
|
|
</div>
|
|
<el-form-item :label="ModelAttributeFieldsEnums['subSystem']" prop="subSystem">
|
|
<el-input v-model="attributeForm.subSystem" :placeholder="'请输入' + ModelAttributeFieldsEnums['subSystem']"></el-input>
|
|
</el-form-item>
|
|
<el-form-item v-if="attributeForm.attributeType === 138" :label="ModelAttributeFieldsEnums['highSpeed']" prop="highSpeed">
|
|
<el-checkbox v-model="attributeForm.highSpeed"></el-checkbox>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelAttributeFieldsEnums['visible']" prop="visible">
|
|
<el-checkbox v-model="attributeForm.visible"></el-checkbox>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelAttributeFieldsEnums['confidential']" prop="confidential">
|
|
<el-checkbox v-model="attributeForm.confidential"></el-checkbox>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button type="primary" @click="submitAttributeForm" :loading="submitAttributeLoading">保存</el-button>
|
|
<el-button @click="closeAttributeForm">取消</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
<el-dialog v-model="serviceVisible" :title="serviceFormTitle" @close="closeServiceForm" :width="600" draggable :close-on-click-modal="false">
|
|
<el-form ref="serviceFormRef" :model="serviceForm" label-width="100" :rules="attributeAndServiceRules">
|
|
<el-form-item :label="ModelServiceFieldsEnums['serviceName']" prop="serviceName">
|
|
<el-input v-model="serviceForm.serviceName" :placeholder="'请输入' + ModelServiceFieldsEnums['serviceName']"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelServiceFieldsEnums['serviceCode']" prop="serviceCode">
|
|
<el-input v-model="serviceForm.serviceCode" :placeholder="'请输入' + ModelServiceFieldsEnums['serviceCode']"></el-input>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelServiceFieldsEnums['serviceTypeName']" prop="serviceType">
|
|
<el-select v-model="serviceForm.serviceType" :placeholder="'请选择' + ModelServiceFieldsEnums['serviceTypeName']">
|
|
<el-option label="遥调" :value="146"></el-option>
|
|
<el-option label="遥控" :value="147"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item :label="ModelServiceFieldsEnums['porder']" prop="porder">
|
|
<el-input v-model="serviceForm.porder" :placeholder="'请输入' + ModelServiceFieldsEnums['porder']"></el-input>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button type="primary" @click="submitServiceForm" :loading="submitServiceLoading">保存</el-button>
|
|
<el-button @click="closeServiceForm">取消</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { reactive, ref, computed } from 'vue'
|
|
import {
|
|
ElContainer,
|
|
ElAside,
|
|
ElHeader,
|
|
ElMain,
|
|
ElTree,
|
|
ElInput,
|
|
ElMessage,
|
|
ElRadioGroup,
|
|
ElRadio,
|
|
ElButton,
|
|
ElTabs,
|
|
ElTabPane,
|
|
ElTable,
|
|
ElUpload,
|
|
FormInstance,
|
|
UploadRequestOptions,
|
|
TreeNode,
|
|
TreeInstance,
|
|
UploadInstance,
|
|
genFileId,
|
|
UploadProps,
|
|
UploadRawFile,
|
|
TableInstance,
|
|
} from 'element-plus'
|
|
import { Reading, DocumentAdd, DocumentChecked, DocumentDelete, Search, Plus, Download, Upload } from '@element-plus/icons-vue'
|
|
import {
|
|
ModelFieldsEnums,
|
|
AddModelType,
|
|
UpdateModelType,
|
|
ModelDialogTitleStateType,
|
|
ModelDialogTitleStateValueType,
|
|
ModelDialogTitleStateKeyType,
|
|
radioGroupType,
|
|
modelTabsTypeKeyType,
|
|
modelTabsType,
|
|
AddModelAttributeType,
|
|
UpdateModelAttributeType,
|
|
UpdateModelServiceType,
|
|
AddModelServiceType,
|
|
ModelAttributeFieldsEnums,
|
|
ModelAttributeTableType,
|
|
ModelServiceTableType,
|
|
ModelServiceFieldsEnums,
|
|
ModelAttributeType,
|
|
AttributeDialogTitleStateType,
|
|
attributeTypeDataType,
|
|
serviceDialogTitleStateType,
|
|
GetModelServiceType,
|
|
GetModelAttributeType,
|
|
DeviceType,
|
|
} from './type'
|
|
import {
|
|
getModelListReq,
|
|
addModelReq,
|
|
updateModelReq,
|
|
delModelReq,
|
|
getModelAttributeListReq,
|
|
addModelAttributeReq,
|
|
updateModelAttributeReq,
|
|
delModelAttributeReq,
|
|
getModelServiceListReq,
|
|
addModelServiceReq,
|
|
updateModelServiceReq,
|
|
delModelServiceReq,
|
|
downloadModelReq,
|
|
uploadModelReq,
|
|
getDeviceTypeEnumReq,
|
|
} from '/@/api/backend/deviceModel/request'
|
|
import ContextMenu from './contextMenu.vue'
|
|
import { encrypt_aes, generateRandomNumber } from '/@/utils/crypto'
|
|
import { debounce } from 'lodash'
|
|
|
|
const DeviceModelPropReplace = {
|
|
label: 'iotModelName',
|
|
}
|
|
const modelTreeRef = ref<TreeInstance>()
|
|
const treeData = ref<(AddModelType & UpdateModelType)[]>([])
|
|
const originTreeData = ref<(AddModelType & UpdateModelType)[]>([])
|
|
|
|
const searchModelValue = ref('')
|
|
const searchModel = () => {
|
|
if (searchModelValue.value === '') {
|
|
treeData.value = originTreeData.value
|
|
return
|
|
}
|
|
const reg = new RegExp(searchModelValue.value)
|
|
const result = []
|
|
for (let item of originTreeData.value) {
|
|
if (reg.test(item.iotModelName)) {
|
|
result.push(item)
|
|
}
|
|
}
|
|
treeData.value = result
|
|
}
|
|
const debounceSearchModel = debounce(searchModel, 100)
|
|
const modelFormRef = ref<FormInstance>()
|
|
const modelDialogVisible = ref(false)
|
|
const modelDialogState = ref<ModelDialogTitleStateValueType>(ModelDialogTitleStateType['detail'])
|
|
const modelDialogTitle = computed(() => {
|
|
return modelDialogState.value === ModelDialogTitleStateType['detail']
|
|
? '查看物模型'
|
|
: modelDialogState.value === ModelDialogTitleStateType['edit']
|
|
? '新增物模型'
|
|
: '编辑物模型'
|
|
})
|
|
const originModelForm: AddModelType & UpdateModelType = {
|
|
iotModelName: '',
|
|
objectType: null,
|
|
iotModelCode: '',
|
|
revision: 1,
|
|
createdBy: undefined,
|
|
createdTime: undefined,
|
|
updatedBy: undefined,
|
|
updatedTime: undefined,
|
|
id: null,
|
|
}
|
|
|
|
const modelForm = ref<AddModelType & UpdateModelType>(JSON.parse(JSON.stringify(originModelForm)))
|
|
const modelFormRules = {
|
|
iotModelName: [{ required: true, message: '请输入物模型名称', trigger: 'blur' }],
|
|
iotModelCode: [{ required: true, message: '请输入物模型编码', trigger: 'blur' }],
|
|
objectType: [{ required: true, message: '请选择物模型类型', trigger: 'blur' }],
|
|
}
|
|
const submitModelLoading = ref(false)
|
|
const submitModelForm = () => {
|
|
modelFormRef.value?.validate((valid) => {
|
|
if (valid) {
|
|
submitModelLoading.value = true
|
|
if (modelDialogState.value === ModelDialogTitleStateType['add']) {
|
|
addModelReq(modelForm.value)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('新增物模型成功')
|
|
modelDialogVisible.value = false
|
|
getModelList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
|
|
})
|
|
.finally(() => {
|
|
submitModelLoading.value = false
|
|
})
|
|
} else if (modelDialogState.value === ModelDialogTitleStateType['edit']) {
|
|
updateModelReq(modelForm.value)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('修改物模型成功')
|
|
modelDialogVisible.value = false
|
|
getModelList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '修改失败')
|
|
})
|
|
.finally(() => {
|
|
submitModelLoading.value = false
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
const getModelList = (name?: string) => {
|
|
return new Promise((resolve) => {
|
|
getModelListReq({ iotModelName: name })
|
|
.then((res) => {
|
|
if (res.success) {
|
|
originTreeData.value = res.data!
|
|
treeData.value = res.data!
|
|
resolve(res.data![0])
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '查询失败')
|
|
})
|
|
})
|
|
}
|
|
const cancelModelForm = () => {
|
|
modelForm.value = JSON.parse(JSON.stringify(originModelForm))
|
|
modelFormRef.value?.resetFields()
|
|
modelDialogVisible.value = false
|
|
}
|
|
const deviceTypeList = ref<DeviceType[]>([])
|
|
|
|
const modelOperateVisible = ref(false)
|
|
const contextMenuPos = ref({
|
|
x: 0,
|
|
y: 0,
|
|
})
|
|
const curContextMenuTreeData = ref<AddModelType & UpdateModelType>()
|
|
const modelContextMenu = (event: any, data: TreeNode) => {
|
|
contextMenuPos.value.x = event.pageX
|
|
contextMenuPos.value.y = event.pageY
|
|
curContextMenuTreeData.value = JSON.parse(JSON.stringify(data))
|
|
modelOperateVisible.value = true
|
|
}
|
|
const modelNodeClick = (target: TreeNode) => {
|
|
curContextMenuTreeData.value = JSON.parse(JSON.stringify(target))
|
|
initSortData()
|
|
modelAttributeAndServiceInputValue.value = ''
|
|
if (currentPage.value !== 1) {
|
|
currentPage.value = 1
|
|
return
|
|
}
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList()
|
|
} else {
|
|
getServiceList()
|
|
}
|
|
}
|
|
const openModel = (type: ModelDialogTitleStateKeyType, data?: AddModelType & UpdateModelType) => {
|
|
modelDialogState.value = ModelDialogTitleStateType[type]
|
|
if (type !== 'add') {
|
|
modelForm.value = JSON.parse(JSON.stringify(data!))
|
|
}
|
|
// modelOperateVisible.value = false
|
|
modelDialogVisible.value = true
|
|
}
|
|
const delModel = () => {
|
|
delModelReq({ id: curContextMenuTreeData.value!.id! })
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('删除物模型成功')
|
|
getModelList()
|
|
modelOperateVisible.value = false
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '删除失败')
|
|
})
|
|
}
|
|
|
|
const attributeTableRef = ref<TableInstance>()
|
|
const serviceTableRef = ref<TableInstance>()
|
|
|
|
const modelAttributeAndServiceInputPlaceHolder = computed(() => {
|
|
return '请输入' + (ModelTabs.value === 'attribute' ? '属性' : '方法') + (modelAttributeSearchRadio.value === 'Name' ? '名称' : '编码')
|
|
})
|
|
const modelAttributeAndServiceInputValue = ref('')
|
|
const searchModelAttribute = () => {
|
|
if (modelAttributeSearchRadio.value === 'Name') {
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList({ type: modelAttributeSearchRadio.value, value: modelAttributeAndServiceInputValue.value })
|
|
} else if (ModelTabs.value === 'service') {
|
|
getServiceList({ type: modelAttributeSearchRadio.value, value: modelAttributeAndServiceInputValue.value })
|
|
}
|
|
} else if (modelAttributeSearchRadio.value === 'Code') {
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList({ type: modelAttributeSearchRadio.value, value: modelAttributeAndServiceInputValue.value })
|
|
} else if (ModelTabs.value === 'service') {
|
|
getServiceList({ type: modelAttributeSearchRadio.value, value: modelAttributeAndServiceInputValue.value })
|
|
}
|
|
}
|
|
}
|
|
|
|
const modelAttributeSearchRadio = ref<radioGroupType>('Name')
|
|
|
|
const ModelTabs = ref<modelTabsTypeKeyType>('attribute')
|
|
const changeTabs = (name: any) => {
|
|
if (name === 'attribute') {
|
|
getAttributeList()
|
|
} else {
|
|
getServiceList()
|
|
}
|
|
}
|
|
const initSortData = () => {
|
|
sortData.attributeOrderColumn = undefined
|
|
sortData.attributeOrderType = undefined
|
|
sortData.serviceOrderColumn = undefined
|
|
sortData.serviceOrderType = undefined
|
|
attributeTableRef.value!.clearSort()
|
|
serviceTableRef.value!.clearSort()
|
|
}
|
|
const sortData = reactive<{
|
|
attributeOrderColumn: string | undefined
|
|
attributeOrderType: 'desc' | 'asc' | undefined
|
|
serviceOrderColumn: string | undefined
|
|
serviceOrderType: 'desc' | 'asc' | undefined
|
|
}>({
|
|
attributeOrderColumn: undefined,
|
|
attributeOrderType: undefined,
|
|
serviceOrderColumn: undefined,
|
|
serviceOrderType: undefined,
|
|
})
|
|
const sortChange = ({
|
|
prop,
|
|
order,
|
|
}: {
|
|
prop: keyof typeof ModelAttributeFieldsEnums | keyof typeof ModelServiceFieldsEnums
|
|
order: 'ascending' | 'descending' | null
|
|
}) => {
|
|
const propEnums = {
|
|
attributeCode: 'attribute_code',
|
|
attributeName: 'attribute_name',
|
|
attributeTypeName: 'attribute_type',
|
|
porder: 'porder',
|
|
serviceCode: 'service_code',
|
|
serviceName: 'service_name',
|
|
serviceTypeName: 'service_type',
|
|
}
|
|
const orderType = order === 'ascending' ? 'asc' : order === 'descending' ? 'desc' : undefined
|
|
const filed = propEnums[prop as keyof typeof propEnums]
|
|
if (ModelTabs.value === 'attribute') {
|
|
sortData.attributeOrderColumn = orderType ? filed : undefined
|
|
sortData.attributeOrderType = orderType
|
|
} else if (ModelTabs.value === 'service') {
|
|
sortData.serviceOrderColumn = orderType ? filed : undefined
|
|
sortData.serviceOrderType = orderType
|
|
}
|
|
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList()
|
|
} else if (ModelTabs.value === 'service') {
|
|
getServiceList()
|
|
}
|
|
}
|
|
|
|
const attributeTableData = ref<ModelAttributeTableType[]>([])
|
|
const editAttributeForm = (data: AddModelAttributeType & UpdateModelAttributeType) => {
|
|
attributeFormTitle.value = AttributeDialogTitleStateType['edit']
|
|
const copyData = JSON.parse(JSON.stringify(data))
|
|
const stateDescArr = copyData.stateDesc?.split('|')
|
|
copyData.stateDesc0 = stateDescArr?.[0] ?? ''
|
|
copyData.stateDesc1 = stateDescArr?.[1] ?? ''
|
|
attributeForm.value = copyData
|
|
attributeVisible.value = true
|
|
}
|
|
const delAttributeForm = (data: AddModelAttributeType & UpdateModelAttributeType) => {
|
|
delModelAttributeReq({ id: data.id! })
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('删除物模型属性成功')
|
|
getAttributeList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '删除失败')
|
|
})
|
|
}
|
|
|
|
const getAttributeList = ({
|
|
type,
|
|
value,
|
|
}: {
|
|
type?: radioGroupType
|
|
value?: string
|
|
} = {}) => {
|
|
const attributeName = modelAttributeSearchRadio.value === 'Name' ? modelAttributeAndServiceInputValue.value : undefined
|
|
const attributeCode = modelAttributeSearchRadio.value === 'Code' ? modelAttributeAndServiceInputValue.value : undefined
|
|
const requestData: GetModelAttributeType = {
|
|
iotModelId: curContextMenuTreeData.value!.id!,
|
|
attributeName,
|
|
attributeCode,
|
|
pageNum: currentPage.value,
|
|
pageSize: currentPageSize.value,
|
|
orderColumn: sortData.attributeOrderColumn,
|
|
orderType: sortData.attributeOrderType,
|
|
}
|
|
if (type === 'Name') {
|
|
requestData.attributeName = value
|
|
} else if (type === 'Code') {
|
|
requestData.attributeCode = value
|
|
}
|
|
|
|
getModelAttributeListReq(requestData)
|
|
.then((res) => {
|
|
if (res.rows && res.rows.length > 0) {
|
|
attributeTableData.value = res.rows!.map((item) => {
|
|
return {
|
|
...item,
|
|
attributeTypeName:
|
|
item.attributeType === 138
|
|
? '模拟量'
|
|
: item.attributeType === 139
|
|
? '累积量'
|
|
: item.attributeType === 140
|
|
? '离散量'
|
|
: item.attributeType === 199
|
|
? '计算量'
|
|
: item.attributeType!,
|
|
highSpeed: item.highSpeed === 1,
|
|
visible: item.visible === 1,
|
|
confidential: item.confidential === 1,
|
|
}
|
|
})
|
|
pageTotal.value = res.total
|
|
} else {
|
|
if (res.rows && res.rows.length === 0) {
|
|
attributeTableData.value = []
|
|
pageTotal.value = res.total
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '查询失败')
|
|
})
|
|
}
|
|
|
|
const getServiceList = ({
|
|
type,
|
|
value,
|
|
}: {
|
|
type?: radioGroupType
|
|
value?: string
|
|
} = {}) => {
|
|
const serviceName = modelAttributeSearchRadio.value === 'Name' ? modelAttributeAndServiceInputValue.value : undefined
|
|
const serviceCode = modelAttributeSearchRadio.value === 'Code' ? modelAttributeAndServiceInputValue.value : undefined
|
|
const requestData: GetModelServiceType = {
|
|
iotModelId: curContextMenuTreeData.value!.id!,
|
|
serviceName,
|
|
serviceCode,
|
|
pageNum: currentPage.value,
|
|
pageSize: currentPageSize.value,
|
|
orderColumn: sortData.serviceOrderColumn,
|
|
orderType: sortData.serviceOrderType,
|
|
}
|
|
if (type === 'Name') {
|
|
requestData.serviceName = value
|
|
} else if (type === 'Code') {
|
|
requestData.serviceCode = value
|
|
}
|
|
getModelServiceListReq(requestData)
|
|
.then((res) => {
|
|
if (res.rows && res.rows.length > 0) {
|
|
serviceTableData.value = res.rows!.map((item) => {
|
|
return {
|
|
...item,
|
|
serviceTypeName: item.serviceType === 146 ? '遥调' : item.serviceType === 147 ? '遥控' : item.serviceType!,
|
|
}
|
|
})
|
|
pageTotal.value = res.total
|
|
} else {
|
|
if (res.rows && res.rows.length === 0) {
|
|
serviceTableData.value = []
|
|
pageTotal.value = res.total
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '查询失败')
|
|
})
|
|
}
|
|
|
|
const serviceTableData = ref<ModelServiceTableType[]>([])
|
|
|
|
const editServiceForm = (data: AddModelServiceType & UpdateModelServiceType) => {
|
|
serviceFormTitle.value = serviceDialogTitleStateType['edit']
|
|
serviceForm.value = JSON.parse(JSON.stringify(data))
|
|
serviceVisible.value = true
|
|
}
|
|
const delServiceForm = (data: AddModelServiceType & UpdateModelServiceType) => {
|
|
delModelServiceReq({ id: data.id! })
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('删除物模型方法成功')
|
|
getServiceList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '删除失败')
|
|
})
|
|
}
|
|
|
|
const attributeVisible = ref(false)
|
|
const attributeFormTitle = ref(AttributeDialogTitleStateType['add'])
|
|
const attributeFormDataTypeOptions: { value: attributeTypeDataType }[] = [
|
|
{ value: 'float' },
|
|
{ value: 'double' },
|
|
{ value: 'tinyint' },
|
|
{ value: 'smallint' },
|
|
{ value: 'int' },
|
|
{ value: 'bigint' },
|
|
]
|
|
const attributeFormDataLevelOptions = [
|
|
{ value: 0, label: '提示' },
|
|
{ value: 1, label: '告警' },
|
|
{ value: 2, label: '故障' },
|
|
]
|
|
const originAttributeForm: AddModelAttributeType & UpdateModelAttributeType = {
|
|
id: null,
|
|
iotModelId: '',
|
|
attributeCode: '',
|
|
attributeName: '',
|
|
attributeType: null,
|
|
porder: null,
|
|
highSpeed: false,
|
|
subSystem: '',
|
|
dataType: '',
|
|
visible: true,
|
|
unit: '',
|
|
stateDesc: '',
|
|
level: undefined,
|
|
confidential: false,
|
|
revision: 1,
|
|
createdBy: undefined,
|
|
createdTime: undefined,
|
|
updatedBy: undefined,
|
|
updatedTime: undefined,
|
|
}
|
|
const attributeFormRef = ref<FormInstance>()
|
|
const attributeForm = ref<AddModelAttributeType & UpdateModelAttributeType>(JSON.parse(JSON.stringify(originAttributeForm)))
|
|
|
|
const attributeTypeChange = (value: ModelAttributeType) => {
|
|
if (value === 140) {
|
|
attributeForm.value.dataType = ''
|
|
} else {
|
|
attributeForm.value.dataType = 'float'
|
|
}
|
|
}
|
|
|
|
const closeAttributeForm = () => {
|
|
attributeVisible.value = false
|
|
attributeForm.value = JSON.parse(JSON.stringify(originAttributeForm))
|
|
attributeFormRef.value?.resetFields()
|
|
}
|
|
const submitAttributeLoading = ref(false)
|
|
const submitAttributeForm = () => {
|
|
attributeFormRef.value?.validate((valid: boolean) => {
|
|
if (valid) {
|
|
submitAttributeLoading.value = true
|
|
const copyFormData = JSON.parse(JSON.stringify(attributeForm.value))
|
|
copyFormData.highSpeed = copyFormData.highSpeed ? 1 : 0
|
|
copyFormData.visible = copyFormData.visible ? 1 : 0
|
|
copyFormData.confidential = copyFormData.confidential ? 1 : 0
|
|
if (copyFormData.stateDesc0 || copyFormData.stateDesc1) {
|
|
copyFormData.stateDesc = (copyFormData?.stateDesc0 ?? '') + '|' + (copyFormData?.stateDesc1 ?? '')
|
|
}
|
|
delete copyFormData.stateDesc0
|
|
delete copyFormData.stateDesc1
|
|
if (attributeFormTitle.value === AttributeDialogTitleStateType['add']) {
|
|
copyFormData.iotModelId = curContextMenuTreeData.value!.id!
|
|
addModelAttributeReq(copyFormData)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('新增物模型属性成功')
|
|
closeAttributeForm()
|
|
getAttributeList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
|
|
})
|
|
.finally(() => {
|
|
submitAttributeLoading.value = false
|
|
})
|
|
} else if (attributeFormTitle.value === AttributeDialogTitleStateType['edit']) {
|
|
updateModelAttributeReq(copyFormData)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('修改物模型属性成功')
|
|
closeAttributeForm()
|
|
getAttributeList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '修改失败')
|
|
})
|
|
.finally(() => {
|
|
submitAttributeLoading.value = false
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
const serviceVisible = ref(false)
|
|
const serviceFormTitle = ref(serviceDialogTitleStateType['add'])
|
|
const originServiceForm: AddModelServiceType & UpdateModelServiceType = {
|
|
id: null,
|
|
iotModelId: '',
|
|
serviceCode: '',
|
|
serviceName: '',
|
|
serviceType: null,
|
|
porder: null,
|
|
revision: 1,
|
|
createdBy: undefined,
|
|
createdTime: undefined,
|
|
updatedBy: undefined,
|
|
updatedTime: undefined,
|
|
}
|
|
const serviceFormRef = ref<FormInstance>()
|
|
const serviceForm = ref<AddModelServiceType & UpdateModelServiceType>(JSON.parse(JSON.stringify(originServiceForm)))
|
|
const closeServiceForm = () => {
|
|
serviceVisible.value = false
|
|
serviceForm.value = JSON.parse(JSON.stringify(originServiceForm))
|
|
serviceFormRef.value?.resetFields()
|
|
}
|
|
const submitServiceLoading = ref(false)
|
|
const submitServiceForm = () => {
|
|
serviceFormRef.value?.validate((valid: boolean) => {
|
|
if (valid) {
|
|
submitServiceLoading.value = true
|
|
if (serviceFormTitle.value === serviceDialogTitleStateType['add']) {
|
|
serviceForm.value.iotModelId = curContextMenuTreeData.value!.id!
|
|
addModelServiceReq(serviceForm.value)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('新增物模型方法成功')
|
|
closeServiceForm()
|
|
getServiceList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
|
|
})
|
|
.finally(() => {
|
|
submitServiceLoading.value = false
|
|
})
|
|
} else if (serviceFormTitle.value === serviceDialogTitleStateType['edit']) {
|
|
updateModelServiceReq(serviceForm.value)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('修改物模型方法成功')
|
|
closeServiceForm()
|
|
getServiceList()
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '修改失败')
|
|
})
|
|
.finally(() => {
|
|
submitServiceLoading.value = false
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
const codeReg = /^[a-zA-Z][a-zA-Z0-9_]*$/
|
|
const attributeAndServiceRules = {
|
|
attributeCode: [
|
|
{ required: true, message: '请输入属性编码', trigger: 'blur' },
|
|
{
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
if (!codeReg.test(value)) {
|
|
callback(new Error('必须为字母开头,不能包含特殊字符'))
|
|
} else {
|
|
callback()
|
|
}
|
|
},
|
|
trigger: 'blur',
|
|
},
|
|
],
|
|
attributeName: [{ required: true, message: '请输入属性名称', trigger: 'blur' }],
|
|
attributeType: [{ required: true, message: '请选择属性类型', trigger: 'change' }],
|
|
serviceCode: [
|
|
{ required: true, message: '请输方法编码', trigger: 'blur' },
|
|
{
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
if (!codeReg.test(value)) {
|
|
callback(new Error('必须为字母开头,不能包含特殊字符'))
|
|
} else {
|
|
callback()
|
|
}
|
|
},
|
|
trigger: 'blur',
|
|
},
|
|
],
|
|
serviceName: [{ required: true, message: '请输入方法名称', trigger: 'blur' }],
|
|
serviceType: [{ required: true, message: '请选择方法类型', trigger: 'change' }],
|
|
porder: [{ required: true, message: '请输入序号', trigger: 'blur' }],
|
|
}
|
|
|
|
const addModelAttributeAndService = () => {
|
|
if (ModelTabs.value === 'attribute') {
|
|
attributeFormTitle.value = AttributeDialogTitleStateType['add']
|
|
attributeVisible.value = true
|
|
} else {
|
|
serviceFormTitle.value = serviceDialogTitleStateType['add']
|
|
serviceVisible.value = true
|
|
}
|
|
}
|
|
|
|
const upLoadModel = (file: UploadRequestOptions) => {
|
|
const formData = new FormData()
|
|
formData.append('file', file.file)
|
|
const v = generateRandomNumber(16)
|
|
const id = encrypt_aes(curContextMenuTreeData.value!.id!, v)
|
|
formData.append('id', id)
|
|
return uploadModelReq(formData, v)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
ElMessage.success('上传物模型成功')
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList()
|
|
} else {
|
|
getServiceList()
|
|
}
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '上传失败')
|
|
})
|
|
}
|
|
|
|
const uploadRef = ref<UploadInstance>()
|
|
const handleExceed: UploadProps['onExceed'] = (files) => {
|
|
uploadRef.value!.clearFiles()
|
|
const file = files[0] as UploadRawFile
|
|
file.uid = genFileId()
|
|
uploadRef.value!.handleStart(file)
|
|
uploadRef.value!.submit()
|
|
}
|
|
|
|
const downLoadModel = () => {
|
|
downloadModelReq({ id: curContextMenuTreeData.value!.id! }).then((res: any) => {
|
|
const downloadUrl = window.URL.createObjectURL(res)
|
|
const a = document.createElement('a')
|
|
a.href = downloadUrl
|
|
a.download = '物模型' + new Date().getTime()
|
|
document.body.appendChild(a)
|
|
a.click()
|
|
window.URL.revokeObjectURL(downloadUrl)
|
|
document.body.removeChild(a)
|
|
})
|
|
}
|
|
|
|
const currentPage = ref(1)
|
|
const currentPageSize = ref(20)
|
|
const pageTotal = ref(0)
|
|
const pagePagination = ref([20, 50, 100])
|
|
const getcurrentPage = () => {
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList()
|
|
} else if (ModelTabs.value === 'service') {
|
|
getServiceList()
|
|
}
|
|
}
|
|
|
|
getModelList().then((res) => {
|
|
curContextMenuTreeData.value = JSON.parse(JSON.stringify(res))
|
|
modelTreeRef.value?.setCurrentKey(curContextMenuTreeData.value!.id!)
|
|
if (ModelTabs.value === 'attribute') {
|
|
getAttributeList()
|
|
} else {
|
|
getServiceList()
|
|
}
|
|
})
|
|
|
|
getDeviceTypeEnumReq()
|
|
.then((res) => {
|
|
if (res.success) {
|
|
deviceTypeList.value = res.data!
|
|
} else {
|
|
ElMessage.error(res.msg)
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
ElMessage.error(err?.response?.data?.msg ?? '获取设备类型失败')
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
$headerHeight: 60px;
|
|
$defaultBackgroundColor: #fff;
|
|
$defaultAsideWidth: 260px;
|
|
$paginationHeight: 32px;
|
|
.DeviceModel {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 100%;
|
|
.containerPart {
|
|
width: 100%;
|
|
height: 100%;
|
|
.asidePart {
|
|
width: $defaultAsideWidth;
|
|
height: 100%;
|
|
border-right: 1px solid #eaebed;
|
|
.asideHeader {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
gap: 5px;
|
|
.el-button {
|
|
width: 35px;
|
|
height: 40px;
|
|
}
|
|
.searchModelInput {
|
|
height: 40px;
|
|
}
|
|
}
|
|
.treeMain {
|
|
height: calc(100% - $headerHeight);
|
|
overflow-y: auto;
|
|
.treePart {
|
|
height: 100%;
|
|
background-color: $defaultBackgroundColor;
|
|
}
|
|
}
|
|
}
|
|
.mainContainer {
|
|
width: calc(100% - $defaultAsideWidth);
|
|
height: 100%;
|
|
.mainHeader {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
height: $headerHeight;
|
|
padding: 0 20px;
|
|
border-bottom: 1px solid #eaebed;
|
|
.modelAttributeSearchInput {
|
|
height: 40px;
|
|
width: 220px;
|
|
}
|
|
.mainHeaderCenter {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
width: 480px;
|
|
}
|
|
.mainHeaderRight {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
width: 280px;
|
|
}
|
|
.el-button {
|
|
width: 88px;
|
|
height: 40px;
|
|
}
|
|
}
|
|
.mainMain {
|
|
height: calc(100% - $headerHeight);
|
|
.tabsPart {
|
|
height: calc(100% - $paginationHeight);
|
|
:deep(.el-tabs__content) {
|
|
height: calc(100% - 55px);
|
|
.el-tab-pane {
|
|
height: 100%;
|
|
}
|
|
}
|
|
.tablePart {
|
|
height: 100%;
|
|
}
|
|
.tableOperate {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
a {
|
|
margin: 5px;
|
|
color: #0064aa;
|
|
font-weight: 600;
|
|
&:hover {
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.mainFooter {
|
|
display: flex;
|
|
justify-content: right;
|
|
background-color: #fff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.modelOperate {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
width: 80px;
|
|
height: 110px;
|
|
.el-button {
|
|
margin: 0;
|
|
}
|
|
}
|
|
}
|
|
.formRowStyle {
|
|
display: flex;
|
|
.el-select {
|
|
width: 184px;
|
|
}
|
|
.el-input {
|
|
width: 184px;
|
|
}
|
|
}
|
|
.formRowSplitFiledStyle {
|
|
display: flex;
|
|
.el-input {
|
|
width: 229px;
|
|
}
|
|
}
|
|
</style>
|