|
@@ -0,0 +1,292 @@
|
|
|
|
|
+<route lang="yaml">
|
|
|
|
|
+meta:
|
|
|
|
|
+ enabled: false
|
|
|
|
|
+</route>
|
|
|
|
|
+
|
|
|
|
|
+<script lang="ts" setup>
|
|
|
|
|
+import { getBizByList } from '@/api/biz/bizApi'
|
|
|
|
|
+import { getObjectByList } from '@/api/biz/bizObjectApi'
|
|
|
|
|
+import { getObjectOAMByList } from '@/api/biz/bizObjectOAMApi'
|
|
|
|
|
+import { updateApi } from '@/api/api/apiApi'
|
|
|
|
|
+
|
|
|
|
|
+interface TreeNode {
|
|
|
|
|
+ label: string
|
|
|
|
|
+ isLeaf: boolean
|
|
|
|
|
+ bizId: number
|
|
|
|
|
+ children?: TreeNode[]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+interface Object {
|
|
|
|
|
+ bizId: number
|
|
|
|
|
+ objectId: number
|
|
|
|
|
+ objectTitle: string
|
|
|
|
|
+ objectCode: string
|
|
|
|
|
+ comment: string
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const emit = defineEmits(['onSuccess'])
|
|
|
|
|
+
|
|
|
|
|
+const state = reactive({
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ keywords: '',
|
|
|
|
|
+ title: '',
|
|
|
|
|
+ treeData: [] as TreeNode[],
|
|
|
|
|
+ curBizId: 0,
|
|
|
|
|
+ curObjectId: 0,
|
|
|
|
|
+ objectList: [] as Object[],
|
|
|
|
|
+ objectOAMList: [] as Object[],
|
|
|
|
|
+ dialogState: 1,
|
|
|
|
|
+ search: {
|
|
|
|
|
+ apiId: 0,
|
|
|
|
|
+ keywords: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ formData: {
|
|
|
|
|
+ moduleId: 0,
|
|
|
|
|
+ apiId: 0,
|
|
|
|
|
+ bizId: 0,
|
|
|
|
|
+ objectId: 0,
|
|
|
|
|
+ oamId: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ objectOAMDetail: {},
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const leftTreeRef = ref()
|
|
|
|
|
+const getObjectOAMData = async () => {
|
|
|
|
|
+ const curBizId = state.curBizId
|
|
|
|
|
+ const curObjectId = state.curObjectId
|
|
|
|
|
+ if (curBizId > 0 && curObjectId > 0) {
|
|
|
|
|
+ state.loading = true
|
|
|
|
|
+ const { data } = await getObjectOAMByList({ bizId: curBizId })
|
|
|
|
|
+ state.objectOAMList = data
|
|
|
|
|
+ state.loading = false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getObjectData = async () => {
|
|
|
|
|
+ const curBizId = state.curBizId
|
|
|
|
|
+ if (curBizId > 0) {
|
|
|
|
|
+ state.loading = true
|
|
|
|
|
+ const { data } = await getObjectByList({ bizId: curBizId })
|
|
|
|
|
+ state.objectList = data
|
|
|
|
|
+ state.loading = false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getBizData = async () => {
|
|
|
|
|
+ const { data } = await getBizByList('')
|
|
|
|
|
+ const children: TreeNode[] = []
|
|
|
|
|
+ data.forEach((item: any) => {
|
|
|
|
|
+ return children.push({
|
|
|
|
|
+ label: item.bizTitle,
|
|
|
|
|
+ bizId: item.bizId,
|
|
|
|
|
+ isLeaf: true,
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ state.treeData = [
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '模型库',
|
|
|
|
|
+ isLeaf: false,
|
|
|
|
|
+ bizId: -1,
|
|
|
|
|
+ children,
|
|
|
|
|
+ },
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+ if (data && data.length > 0) {
|
|
|
|
|
+ state.curBizId = data[0].bizId
|
|
|
|
|
+ // nextTick(() => {
|
|
|
|
|
+ // leftTreeRef.value.setCurrentKey(data[0].modelId)
|
|
|
|
|
+ // })
|
|
|
|
|
+ await getObjectData()
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ getBizData()
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 模型选择
|
|
|
|
|
+const onTreeNodeClick = (node: TreeNode) => {
|
|
|
|
|
+ if (node.isLeaf) {
|
|
|
|
|
+ state.curBizId = node.bizId
|
|
|
|
|
+ getObjectData()
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const objectTableRef = ref()
|
|
|
|
|
+const dialogVisible = ref(false)
|
|
|
|
|
+const onObjectSel = async (row: { objectId: number }) => {
|
|
|
|
|
+ state.curObjectId = row.objectId
|
|
|
|
|
+ await getObjectOAMData()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const objectOAMTableRef = ref()
|
|
|
|
|
+const onObjectOAMSel = async (row: { bizId: number; objectId: number; oamId: number }) => {
|
|
|
|
|
+ state.formData.bizId = row.bizId
|
|
|
|
|
+ state.formData.objectId = row.objectId
|
|
|
|
|
+ state.formData.oamId = row.oamId
|
|
|
|
|
+ state.objectOAMDetail = row
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const onSave = async () => {
|
|
|
|
|
+ await updateApi(state.formData)
|
|
|
|
|
+ emit('onSuccess')
|
|
|
|
|
+ dialogVisible.value = false
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const onCancel = () => {
|
|
|
|
|
+ dialogVisible.value = false
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 点击选择
|
|
|
|
|
+defineExpose({
|
|
|
|
|
+ showModel(moduleId: number, apiId: number) {
|
|
|
|
|
+ state.search.apiId = apiId
|
|
|
|
|
+ state.formData.moduleId = moduleId
|
|
|
|
|
+ state.formData.apiId = apiId
|
|
|
|
|
+ dialogVisible.value = true
|
|
|
|
|
+ },
|
|
|
|
|
+})
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<template>
|
|
|
|
|
+ <el-drawer v-model="dialogVisible" :title="state.title" size="100%">
|
|
|
|
|
+ <el-row :gutter="10" style="height:100%">
|
|
|
|
|
+ <el-col :xs="24" :span="5" class="small-row">
|
|
|
|
|
+ <el-card style="height:100%">
|
|
|
|
|
+ <el-scrollbar class="tree">
|
|
|
|
|
+ <ElTree ref="leftTreeRef" :data="state.treeData" default-expand-all node-key="bizId" @node-click="onTreeNodeClick">
|
|
|
|
|
+ <template #default="{ node, data }">
|
|
|
|
|
+ <div class="custom-tree-node">
|
|
|
|
|
+ <div class="label" :title="node.label">
|
|
|
|
|
+ <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
|
|
|
|
|
+ <svg-icon name="uim:box" />
|
|
|
|
|
+ </el-icon>
|
|
|
|
|
+ <div class="text">
|
|
|
|
|
+ {{ data.label }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </ElTree>
|
|
|
|
|
+ </el-scrollbar>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+
|
|
|
|
|
+ <el-col :xs="24" :span="5" class="objectListtable lg-row">
|
|
|
|
|
+ <el-card style="height:100%">
|
|
|
|
|
+ <el-table
|
|
|
|
|
+ v-if="state.objectList && state.objectList.length > 0"
|
|
|
|
|
+ ref="objectTableRef"
|
|
|
|
|
+ v-loading="state.loading"
|
|
|
|
|
+ class="list-table"
|
|
|
|
|
+ :data="state.objectList" border :show-header="false"
|
|
|
|
|
+ stripe highlight-current-row height="100%" @row-click="onObjectSel"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-table-column prop="objectTitle" label="名称" header-align="center" align="center" minwidth="200" />
|
|
|
|
|
+ <el-table-column prop="objectCode" label="代码" header-align="center" align="center" minwidth="150" />
|
|
|
|
|
+ <el-table-column prop="objectType" label="类型" header-align="center" align="center" minwidth="150">
|
|
|
|
|
+ <template #default="scope">
|
|
|
|
|
+ <span v-if="scope.row.objectType === 1">实体对象</span>
|
|
|
|
|
+ <span v-else>视图对象</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="comment" label="说明" header-align="center" align="left" />
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ <el-Empty v-else />
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :span="5" class="objectOAMTableRef small-row">
|
|
|
|
|
+ <el-card style="height:100%">
|
|
|
|
|
+ <el-table
|
|
|
|
|
+ v-if="state.objectOAMList && state.objectOAMList.length > 0"
|
|
|
|
|
+ ref="objectOAMTableRef"
|
|
|
|
|
+ v-loading="state.loading"
|
|
|
|
|
+ class="list-table"
|
|
|
|
|
+ :data="state.objectOAMList"
|
|
|
|
|
+ border :show-header="false"
|
|
|
|
|
+ stripe highlight-current-row height="100%" @row-click="onObjectOAMSel"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-table-column prop="oamTitle" label="名称" header-align="center" align="center" minwidth="200" />
|
|
|
|
|
+ <el-table-column prop="oamType" label="类型" header-align="center" align="center" minwidth="150" />
|
|
|
|
|
+ <el-table-column prop="oamDesc" label="说明" header-align="center" align="left" />
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ <el-Empty v-else />
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :span="9" class="objectOAMTableRef">
|
|
|
|
|
+ <el-card style="height:100%">
|
|
|
|
|
+ <ul v-if="state.objectOAMDetail" class="result-container">
|
|
|
|
|
+ <li v-for="(value, key) in state.objectOAMDetail" :key="key">
|
|
|
|
|
+ <h3> {{ key }}</h3>
|
|
|
|
|
+ <p>{{ value }}</p>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ <el-Empty v-else />
|
|
|
|
|
+
|
|
|
|
|
+ <el-button type="success" @click="onSave">
|
|
|
|
|
+ 保存
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button type="info" @click="onCancel">
|
|
|
|
|
+ 取消
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </el-drawer>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
|
+:deep(.tree)
|
|
|
|
|
+{
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ .el-tree {
|
|
|
|
|
+ .el-tree-node__content {
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .is-current > .el-tree-node__content {
|
|
|
|
|
+ background-color: var(--el-color-primary-light-9);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .custom-tree-node {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ width: 0;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+
|
|
|
|
|
+ .label {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ width: calc(100% - 10px);
|
|
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
|
|
+
|
|
|
|
|
+ .text {
|
|
|
|
|
+ @include text-overflow;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ .actions {
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .actions {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ right: 10px;
|
|
|
|
|
+ top: 50%;
|
|
|
|
|
+ transform: translateY(-50%);
|
|
|
|
|
+
|
|
|
|
|
+ .el-button {
|
|
|
|
|
+ padding: 5px 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|