houyaf 3 år sedan
förälder
incheckning
c4616a7764

+ 0 - 79
src/api/api/apiTransUnitApi.ts

@@ -1,79 +0,0 @@
-import apiRequest from '@/network/http/apiRequest'
-
-/**
- * 获取Atu列表
- * @param data
- * @returns
- */
-export function getAtuByList(data: any) {
-  return apiRequest({
-    url: '/paas/api/atu',
-    method: 'GET',
-    params: data,
-  })
-}
-
-/**
- * 根据Id获取Atu
- * @param apiId
- * @param atuId
- * @returns
- */
-export function getAtuById(moduleId: number, apiId: number, atuId: number) {
-  return apiRequest({
-    url: `/paas/api/atu/${moduleId}/${apiId}/${atuId}`,
-    method: 'GET',
-  })
-}
-
-/**
- * 添加Atu
- * @param data
- * @returns
- */
-export function createAtu(data: any) {
-  return apiRequest({
-    url: '/paas/api/atu/add',
-    method: 'POST',
-    data,
-  })
-}
-
-/**
- * 更新Atu
- * @param data
- * @returns
- */
-export function updateAtu(data: any) {
-  return apiRequest({
-    url: '/paas/api/atu/update',
-    method: 'PUT',
-    data,
-  })
-}
-
-/**
- * 删除Atu
- * @param moduleId
- * @param apiId
- * @param atuId
- * @returns
- */
-export function deleteAtuById(moduleId: number, apiId: number, atuId: number) {
-  return apiRequest({
-    url: `/paas/api/atu/${moduleId}/${apiId}/${atuId}`,
-    method: 'DELETE',
-  })
-}
-
-/**
- * 生成参数
- * @param apiCode
- * @returns
- */
-export function generateParamsByCode(apiCode: string) {
-  return apiRequest({
-    url: `/paas/api/atu/generate/params/${apiCode}`,
-    method: 'GET',
-  })
-}

+ 5 - 5
src/api/biz/bizObjectAttrApi.ts

@@ -7,7 +7,7 @@ import apiRequest from '@/network/http/apiRequest'
  */
 export function getObjectAttrByList(data: any) {
   return apiRequest({
-    url: '/biz/object/attribute',
+    url: '/biz/object/attr',
     method: 'GET',
     params: data,
   })
@@ -22,7 +22,7 @@ export function getObjectAttrByList(data: any) {
  */
 export function getObjectAttrById(bizId: number, objectId: number, attrId: number) {
   return apiRequest({
-    url: `/biz/object/attribute/${bizId}/${objectId}/${attrId}`,
+    url: `/biz/object/attr/${bizId}/${objectId}/${attrId}`,
     method: 'GET',
   })
 }
@@ -34,7 +34,7 @@ export function getObjectAttrById(bizId: number, objectId: number, attrId: numbe
  */
 export function createObjectAttr(data: any) {
   return apiRequest({
-    url: '/biz/object/attribute/add',
+    url: '/biz/object/attr/add',
     method: 'POST',
     data,
   })
@@ -47,7 +47,7 @@ export function createObjectAttr(data: any) {
  */
 export function updateObjectAttr(data: any) {
   return apiRequest({
-    url: '/biz/object/attribute/update',
+    url: '/biz/object/attr/update',
     method: 'PUT',
     data,
   })
@@ -62,7 +62,7 @@ export function updateObjectAttr(data: any) {
  */
 export function deleteObjectAttrById(bizId: number, objectId: number, attrId: number) {
   return apiRequest({
-    url: `/biz/object/attribute/${bizId}/${objectId}/${attrId}`,
+    url: `/biz/object/attr/${bizId}/${objectId}/${attrId}`,
     method: 'DELETE',
   })
 }

+ 5 - 5
src/api/model/modelObjectAttrApi.ts

@@ -7,7 +7,7 @@ import apiRequest from '@/network/http/apiRequest'
  */
 export function getObjectAttrByList(data: any) {
   return apiRequest({
-    url: '/model/object/attribute',
+    url: '/model/object/attr',
     method: 'GET',
     params: data,
   })
@@ -22,7 +22,7 @@ export function getObjectAttrByList(data: any) {
  */
 export function getObjectAttrById(modelId: number, objectId: number, attrId: number) {
   return apiRequest({
-    url: `/model/object/attribute/${modelId}/${objectId}/${attrId}`,
+    url: `/model/object/attr/${modelId}/${objectId}/${attrId}`,
     method: 'GET',
   })
 }
@@ -34,7 +34,7 @@ export function getObjectAttrById(modelId: number, objectId: number, attrId: num
  */
 export function createObjectAttr(data: any) {
   return apiRequest({
-    url: '/model/object/attribute/add',
+    url: '/model/object/attr/add',
     method: 'POST',
     data,
   })
@@ -47,7 +47,7 @@ export function createObjectAttr(data: any) {
  */
 export function updateObjectAttr(data: any) {
   return apiRequest({
-    url: '/model/object/attribute/update',
+    url: '/model/object/attr/update',
     method: 'PUT',
     data,
   })
@@ -62,7 +62,7 @@ export function updateObjectAttr(data: any) {
  */
 export function deleteObjectAttrById(modelId: number, objectId: number, attrId: number) {
   return apiRequest({
-    url: `/model/object/attribute/${modelId}/${objectId}/${attrId}`,
+    url: `/model/object/attr/${modelId}/${objectId}/${attrId}`,
     method: 'DELETE',
   })
 }

+ 7 - 7
src/router/modules/model.ts

@@ -4,9 +4,9 @@ const Layout = () => import('@/layouts/index.vue')
 
 const routes: RouteRecordRaw[] = [
   {
-    path: '/model/attr',
+    path: '/model',
     component: Layout,
-    redirect: '/model/attr/index',
+    redirect: '/model/index',
     name: 'model',
     meta: {
       title: '模型管理',
@@ -21,29 +21,29 @@ const routes: RouteRecordRaw[] = [
           title: '对象定义',
           sidebar: false,
           breadcrumb: false,
-          activeMenu: '/model/attr',
+          activeMenu: '/model',
         },
       },
       {
-        path: 'model/attr/:modelId/:objectId',
+        path: 'object/attr/:modelId/:objectId',
         name: 'modelObjectEdit',
         component: () => import('@/views/model/attr/index.vue'),
         meta: {
           title: '对象编辑',
           sidebar: false,
-          activeMenu: '/model/',
+          activeMenu: '/model',
           cache: true,
           noCache: 'modelObjectEdit',
         },
       },
       {
-        path: 'model/attr/oam/:modelId/:objectId',
+        path: 'object/oam/:modelId/:objectId',
         name: 'modelObjectOAM',
         component: () => import('@/views/model/oam/index.vue'),
         meta: {
           title: '行为定义',
           sidebar: false,
-          activeMenu: '/model/',
+          activeMenu: '/model',
           cache: true,
           noCache: 'modelObjectOAM',
         },

+ 190 - 0
src/views/biz/oam/components/objectOAM.vue

@@ -0,0 +1,190 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup>
+import type { FormInstance, FormRules } from 'element-plus'
+import { createObjectOAM, getObjectOAMById, updateObjectOAM } from '@/api/biz/bizObjectOAMApi'
+const emit = defineEmits(['success'])
+
+const formRef = ref<FormInstance>()
+const formRules = ref<FormRules>({
+  oamTitle: [
+    { required: true, message: '请输入标题', trigger: 'blur' },
+  ],
+  oamDesc: [
+    { required: false, message: '请输入描述', trigger: 'blur' },
+  ],
+})
+
+const state = reactive({
+  title: '',
+  dialogVisible: false,
+  loading: false,
+  formData: {
+    bizId: 0,
+    objectId: 0,
+    oamId: 0,
+    oamTitle: '',
+    oamType: 0,
+    sqlType: 0,
+    sqlStatement: '',
+    sqlSelect: '',
+    sqlFrom: '',
+    sqlWhere: '',
+    sqlOrder: '',
+    sqlCount: '',
+    oamDesc: '',
+  },
+  actionType: 1,
+})
+
+onMounted(() => {})
+
+const getData = async () => {
+  const { bizId, objectId, oamId } = state.formData
+  state.loading = true
+  const { data } = await getObjectOAMById(bizId, objectId, oamId)
+  state.loading = false
+  state.formData = data
+}
+
+function onSubmit() {
+  formRef.value && formRef.value.validate(async (valid) => {
+    if (valid) {
+      if (state.actionType === 1) {
+        await createObjectOAM(state.formData)
+        state.dialogVisible = false
+        emit('success')
+      }
+      else {
+        await updateObjectOAM(state.formData)
+        state.dialogVisible = false
+        emit('success')
+      }
+    }
+  })
+}
+
+function onCancel() {
+  state.dialogVisible = false
+}
+
+function resetFormData() {
+  state.formData = {
+    bizId: 0,
+    objectId: 0,
+    oamId: 0,
+    oamType: 0,
+    oamTitle: '',
+    sqlType: 0,
+    sqlStatement: '',
+    sqlSelect: '',
+    sqlFrom: '',
+    sqlWhere: '',
+    sqlOrder: '',
+    sqlCount: '',
+    oamDesc: '',
+  }
+}
+
+defineExpose({
+  showAddModel(bizId: number, objectId: number) {
+    resetFormData()
+    state.title = '新增对象行为'
+    state.actionType = 1
+    state.formData.bizId = bizId
+    state.formData.objectId = objectId
+    state.dialogVisible = true
+  },
+  showEditModel(modelId: number, objectId: number, oamId: number) {
+    resetFormData()
+    state.title = '编辑对象行为'
+    state.formData.bizId = modelId
+    state.formData.objectId = objectId
+    state.formData.oamId = oamId
+    state.actionType = 2
+    state.dialogVisible = true
+    getData()
+  },
+})
+</script>
+
+<template>
+  <div>
+    <el-dialog v-model="state.dialogVisible" :title="state.title" width="600px" :close-on-click-modal="false" append-to-body destroy-on-close>
+      <div v-loading="state.loading">
+        <el-form ref="formRef" :model="state.formData" :rules="formRules" label-width="120px" label-suffix=":">
+          <el-form-item label="行为名称" prop="oamTitle">
+            <el-input v-model="state.formData.oamTitle" placeholder="请输入标题" />
+          </el-form-item>
+
+          <el-form-item label="类型" prop="oamType">
+            <el-radio-group v-model="state.formData.oamType">
+              <el-radio :label="1">
+                基于Pk查询
+              </el-radio>
+              <el-radio :label="2">
+                多笔查询
+              </el-radio>
+              <el-radio :label="3">
+                分页查询
+              </el-radio>
+              <el-radio :label="4">
+                新增
+              </el-radio>
+              <el-radio :label="5">
+                修改
+              </el-radio>
+              <el-radio :label="6">
+                删除
+              </el-radio>
+              <el-radio :label="7">
+                非Pk单笔查询
+              </el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item label="类型" prop="sqlType">
+            <el-radio-group v-model="state.formData.sqlType">
+              <el-radio :label="1">
+                DQL(数据查询)
+              </el-radio>
+              <el-radio :label="2">
+                DML(数据操纵)
+              </el-radio>
+              <el-radio :label="3">
+                DDL(数据定义)
+              </el-radio>
+              <el-radio :label="4">
+                DCL(数据控制)
+              </el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item label="SQL" prop="sqlStatement">
+            <el-input v-model="state.formData.sqlStatement" type="textarea" rows="5" placeholder="请输入SQL" />
+          </el-form-item>
+
+          <el-form-item label="Count" prop="sqlCount">
+            <el-input v-model="state.formData.sqlCount" type="textarea" rows="5" placeholder="请输入SQL" />
+          </el-form-item>
+
+          <el-form-item label="简要说明" prop="oamDesc">
+            <el-input v-model="state.formData.oamDesc" type="textarea" rows="3" placeholder="请输入标题" />
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <template #footer>
+        <el-button size="large" @click="onCancel">
+          取消
+        </el-button>
+        <el-button type="primary" size="large" @click="onSubmit">
+          保存
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>

+ 321 - 0
src/views/biz/oam/index.vue

@@ -0,0 +1,321 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup name="PagesExampleTable">
+import type { FormInstance } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import ObjectOAMComponent from './components/objectOAM.vue'
+import useSettingsStore from '@/store/modules/settings'
+import { getObjectById } from '@/api/biz/bizObjectApi'
+import { deleteObjectOAMById, getObjectOAMById, getObjectOAMByList } from '@/api/biz/bizObjectOAMApi'
+import { oamType } from '@/utils/tool'
+
+const settingsStore = useSettingsStore()
+const route = useRoute()
+const router = useRouter()
+const tabbar = useTabbar()
+
+const bizId = parseInt(route.params.bizId.toString())
+const objectId = parseInt(route.params.objectId.toString())
+
+interface TreeNode {
+  label: string
+  isLeaf: boolean
+  oamId: number
+  children?: TreeNode[]
+}
+
+interface ObjectOAM {
+  bizId: number
+  objectId: number
+  oamId: number
+  oamTitle: string
+  oamCode: string
+  oamType: number
+  oamStatement: string
+  oamDesc: string
+
+  sqlStatement: string
+  sqlSelect: string
+  sqlFrom: string
+  sqlWhere: string
+  sqlOrder: string
+}
+
+const state = reactive({
+  loading: false,
+  objectTitle: '',
+  objectCode: '',
+  objectType: 0,
+  keywords: '',
+  curOamId: 0,
+  oamList: [],
+  treeData: [] as TreeNode[],
+  oam: {} as ObjectOAM,
+  dialogState: 1,
+  search: {
+    bizId,
+    objectId,
+    keywords: '',
+  },
+  params: '',
+  result: '',
+})
+
+const leftTreeRef = ref()
+
+const getObjectData = async () => {
+  state.loading = true
+  const { data } = await getObjectById(bizId, objectId)
+  state.objectTitle = data.objectTitle
+  state.objectCode = data.objectCode
+  state.objectType = data.objectType
+  state.loading = false
+}
+
+const getObjectOAMData = async () => {
+  const curOamId = state.curOamId
+  if (curOamId > 0) {
+    state.loading = true
+    const { data } = await getObjectOAMById(bizId, objectId, curOamId)
+    state.oam = data
+    state.loading = false
+  }
+}
+
+const getOAMTree = async () => {
+  const { data } = await getObjectOAMByList(state.search)
+  const children: TreeNode[] = []
+  data.forEach((item: any) => {
+    return children.push({
+      label: item.oamTitle,
+      oamId: item.oamId,
+      isLeaf: true,
+    })
+  })
+  state.treeData = [
+    {
+      label: '对象行为',
+      isLeaf: false,
+      oamId: -1,
+      children,
+    },
+  ]
+
+  if (data && data.length > 0) {
+    state.curOamId = data[0].oamId
+    nextTick(() => {
+      leftTreeRef.value.setCurrentKey(data[0].oamId)
+    })
+    await getObjectOAMData()
+  }
+}
+
+onMounted(() => {
+  getObjectData()
+  getOAMTree()
+})
+
+const formRef = ref<FormInstance>()
+
+// Object OAM选择
+const onTreeNodeClick = (node: TreeNode) => {
+  if (node.isLeaf) {
+    state.curOamId = node.oamId
+    getObjectOAMData()
+  }
+}
+
+const objectOAMRef = ref()
+const onAdd = () => {
+  window.console.log(bizId)
+  window.console.log(objectId)
+  objectOAMRef.value.showAddModel(bizId, objectId)
+}
+
+const onEdit = () => {
+  objectOAMRef.value.showEditModel(bizId, objectId, state.curOamId)
+}
+
+const onDelete = (data: { modelId: number; objectId: number; oamId: number; oamTitle: string }) => {
+  const { modelId, objectId, oamId, oamTitle } = data
+  ElMessageBox.confirm(`确认删除「${oamTitle}」吗?`, '确认信息').then(async () => {
+    await deleteObjectOAMById(modelId, objectId, oamId)
+    await getOAMTree()
+    ElMessage.success({
+      message: '删除成功',
+      center: true,
+    })
+  })
+}
+
+// 选择对象模型回调
+const onSuccess = () => {
+  getOAMTree()
+}
+
+// 返回列表页
+function goBack() {
+  if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
+    tabbar.close({ name: 'modelList' })
+  }
+  else {
+    router.push({ name: 'modelList' })
+  }
+}
+</script>
+
+<template>
+  <div class="absolute-container">
+    <page-header :title="state.objectTitle" :content="state.objectCode ">
+      <el-button size="default" round @click="goBack">
+        <template #icon>
+          <el-icon>
+            <svg-icon name="i-ep:arrow-left" />
+          </el-icon>
+        </template>
+        返回
+      </el-button>
+    </page-header>
+    <div class="page-main">
+      <LayoutContainer left-side-width="300px" hide-left-side-toggle>
+        <template #leftSide>
+          <el-scrollbar class="tree">
+            <ElTree ref="leftTreeRef" :data="state.treeData" default-expand-all node-key="oamId" @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 class="code">
+                      {{ oamType(data.oamType) }}
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </ElTree>
+          </el-scrollbar>
+        </template>
+
+        <div class="form">
+          <tool-header>
+            <template #right>
+              <el-button type="primary" @click="onAdd">
+                添加
+              </el-button>
+
+              <el-button type="primary" @click="onEdit">
+                编辑
+              </el-button>
+            </template>
+          </tool-header>
+          <page-main title="SQL">
+            <div class="question">
+              <ol class="answer">
+                <li><span>Sql</span><br>{{ state.oam.sqlStatement }}</li>
+                <li><span>Select</span><br>{{ state.oam.sqlSelect }}</li>
+                <li><span>From </span><br>{{ state.oam.sqlFrom }}</li>
+                <li><span>Where</span><br>{{ state.oam.sqlWhere }}</li>
+                <li><span>Order</span><br>{{ state.oam.sqlOrder }}</li>
+                <li><span>说明</span><br>{{ state.oam.oamDesc }}</li>
+              </ol>
+            </div>
+          </page-main>
+        </div>
+      </LayoutContainer>
+    </div>
+    <ObjectOAMComponent ref="objectOAMRef" @success="getOAMTree" />
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.absolute-container {
+  :deep(.left-side) {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+
+    .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;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+.question {
+  .answer {
+    margin: 20px 0 0;
+    padding-left: 20px;
+    font-size: 16px;
+    color: var(--el-text-color-secondary);
+
+    li {
+      margin-bottom: 10px;
+      line-height: 1.5;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+
+    span {
+      color: var(--el-text-color-primary);
+      font-weight: bold;
+    }
+  }
+}
+</style>

+ 0 - 291
src/views/paas/atu/components/ModelObjectSelector.vue

@@ -1,291 +0,0 @@
-<route lang="yaml">
-meta:
-  enabled: false
-</route>
-
-<script lang="ts" setup>
-import { getModelByList } from '@/api/model/modelApi'
-import { getObjectByList } from '@/api/model/modelObjectApi'
-import { getObjectOAMByList } from '@/api/model/modelObjectOAMApi'
-import { createAtu } from '@/api/api/apiTransUnitApi'
-
-interface TreeNode {
-  label: string
-  isLeaf: boolean
-  modelId: number
-  children?: TreeNode[]
-}
-
-interface Object {
-  modelId: number
-  objectId: number
-  objectTitle: string
-  objectCode: string
-  comment: string
-}
-
-const emit = defineEmits(['onSuccess'])
-
-const state = reactive({
-  loading: false,
-  keywords: '',
-  title: '',
-  models: [] as TreeNode[],
-  curModelId: 0,
-  curObjectId: 0,
-  objectList: [] as Object[],
-  objectOAMList: [] as Object[],
-  dialogState: 1,
-  search: {
-    apiId: 0,
-    keywords: '',
-  },
-  formData: {
-    moduleId: 0,
-    apiId: 0,
-    modelId: 0,
-    objectId: 0,
-    oamId: 1,
-  },
-  objectOAMDetail: {},
-})
-
-const leftTreeRef = ref()
-const getObjectOAMData = async () => {
-  const curModelId = state.curModelId
-  const curObjectId = state.curObjectId
-  if (curModelId > 0 && curObjectId > 0) {
-    state.loading = true
-    const { data } = await getObjectOAMByList({ modelId: curModelId })
-    state.objectOAMList = data
-    state.loading = false
-  }
-}
-
-const getObjectData = async () => {
-  const curModelId = state.curModelId
-  if (curModelId > 0) {
-    state.loading = true
-    const { data } = await getObjectByList({ modelId: curModelId })
-    state.objectList = data
-    state.loading = false
-  }
-}
-
-const getModelData = async () => {
-  const { data } = await getModelByList('')
-  const children: TreeNode[] = []
-  data.forEach((item: any) => {
-    return children.push({
-      label: item.modelTitle,
-      modelId: item.modelId,
-      isLeaf: true,
-    })
-  })
-  state.models = [
-    {
-      label: '模型库',
-      isLeaf: false,
-      modelId: -1,
-      children,
-    },
-  ]
-
-  if (data && data.length > 0) {
-    state.curModelId = data[0].modelId
-    // nextTick(() => {
-    //   leftTreeRef.value.setCurrentKey(data[0].modelId)
-    // })
-    await getObjectData()
-  }
-}
-
-onMounted(() => {
-  getModelData()
-})
-
-// 模型选择
-const onTreeNodeClick = (node: TreeNode) => {
-  if (node.isLeaf) {
-    state.curModelId = node.modelId
-    getObjectData()
-  }
-}
-
-const objectTableRef = ref()
-const dialogVisible = ref(false)
-const onObjectSel = async (row: { objectId: any }) => {
-  state.curObjectId = row.objectId
-  await getObjectOAMData()
-}
-
-const objectOAMTableRef = ref()
-const onObjectOAMSel = async (row: { modelId: any; objectId: any; oamId: any }) => {
-  state.formData.modelId = row.modelId
-  state.formData.objectId = row.objectId
-  state.formData.oamId = row.oamId
-  state.objectOAMDetail = row
-}
-
-const onSave = async () => {
-  await createAtu(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.models" default-expand-all node-key="modelId" @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>

+ 0 - 314
src/views/paas/atu/index.vue

@@ -1,314 +0,0 @@
-<route lang="yaml">
-meta:
-  enabled: false
-</route>
-
-<script lang="ts" setup name="PagesExampleTable">
-import type { FormInstance } from 'element-plus'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import ModelObjectSelector from './components/ModelObjectSelector.vue'
-import useSettingsStore from '@/store/modules/settings'
-import { getApiById } from '@/api/api/apiApi'
-import { deleteAtuById, generateParamsByCode, getAtuByList } from '@/api/api/apiTransUnitApi'
-import { createX, deleteX, getX, patchX, updateX } from '@/api/api/apiGatewayApi'
-
-const settingsStore = useSettingsStore()
-const route = useRoute()
-const router = useRouter()
-const tabbar = useTabbar()
-
-const moduleId = parseInt(route.params.moduleId.toString())
-const apiId = parseInt(route.params.apiId.toString())
-
-const state = reactive({
-  loading: false,
-  apiTitle: '',
-  apiCode: '',
-  apiType: 0,
-  keywords: '',
-  atuList: [],
-  dialogState: 1,
-  search: {
-    moduleId,
-    apiId,
-    keywords: '',
-  },
-  params: '',
-  result: '',
-})
-
-const ModelObjectSelectorRef = ref()
-const getAtuData = async () => {
-  const { data } = await getAtuByList(state.search)
-  state.atuList = data
-  state.loading = false
-}
-
-// 查询数据
-const getData = async () => {
-  state.loading = true
-  const { data } = await getApiById(moduleId, apiId)
-  state.apiTitle = data.apiTitle
-  state.apiCode = data.apiCode
-  state.apiType = data.apiType
-  await getAtuData()
-}
-
-onMounted(() => {
-  getData()
-})
-
-const formRef = ref<FormInstance>()
-
-const onAdd = () => {
-  ModelObjectSelectorRef.value.showModel(moduleId, apiId)
-}
-
-const onDelete = (data: { moduleId: number; apiId: number; atuId: number; objectTitle: string }) => {
-  const { moduleId, apiId, atuId, objectTitle } = data
-  ElMessageBox.confirm(`确认删除「${objectTitle}」吗?`, '确认信息').then(async () => {
-    await deleteAtuById(moduleId, apiId, atuId)
-    await getData()
-    ElMessage.success({
-      message: '删除成功',
-      center: true,
-    })
-  })
-}
-
-const onGenerateParams = async () => {
-  const { data } = await generateParamsByCode(state.apiCode)
-  state.params = JSON.stringify(data)
-}
-
-const onExecute = async () => {
-  try {
-    const apiType = state.apiType
-    const apiCode = state.apiCode
-    const params = JSON.parse(state.params)
-    if (apiType === 1) {
-      const { data } = await getX(apiCode, params)
-      state.result = JSON.stringify(data)
-    }
-    else if (apiType === 2) {
-      const { data } = await createX(apiCode, params)
-      state.result = JSON.stringify(data)
-    }
-    else if (apiType === 3) {
-      const { data } = await updateX(apiCode, params)
-      state.result = JSON.stringify(data)
-    }
-    else if (apiType === 4) {
-      const { data } = await patchX(apiCode, params)
-      state.result = JSON.stringify(data)
-    }
-    else if (apiType === 5) {
-      const { data } = await deleteX(apiCode, params)
-      state.result = JSON.stringify(data)
-    }
-  }
-  catch (err) {
-    ElMessage.error('提交失败')
-  }
-}
-// 选择对象模型回调
-const onObjectSelSuccess = () => {
-  getData()
-}
-
-// 返回列表页
-function goBack() {
-  if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
-    tabbar.close({ name: 'paas_api' })
-  }
-  else {
-    router.push({ name: 'paas_api' })
-  }
-}
-</script>
-
-<template>
-  <div class="absolute-container">
-    <page-header :title="state.apiTitle" :content="state.apiCode">
-      <el-button size="default" round @click="goBack">
-        <template #icon>
-          <el-icon>
-            <svg-icon name="i-ep:arrow-left" />
-          </el-icon>
-        </template>
-        返回
-      </el-button>
-    </page-header>
-    <div class="page-main">
-      <LayoutContainer left-side-width="650px" hide-left-side-toggle>
-        <template #leftSide>
-          <el-space wrap>
-            <el-button type="primary" size="default" @click="onAdd">
-              <template #icon>
-                <el-icon>
-                  <svg-icon name="i-ep:plus" />
-                </el-icon>
-              </template>
-            </el-button>
-          </el-space>
-
-          <el-table v-loading="state.loading" class="list-table" :data="state.atuList" border stripe highlight-current-row height="100%">
-            <el-table-column type="index" label="序号" header-align="center" align="center" width="70" />
-
-            <el-table-column prop="modelTitle" label="模型" header-align="center" align="center" min-width="150px" />
-
-            <el-table-column prop="objectTitle" label="对象" header-align="center" align="center" min-width="150px" />
-
-            <el-table-column prop="oamTitle" label="行为" header-align="center" align="center" />
-
-            <el-table-column label="操作" width="140" align="center" fixed="right">
-              <template #default="scope">
-                <el-button-group>
-                  <el-button type="danger" size="small" plain @click="onDelete(scope.row)">
-                    <template #icon>
-                      <el-icon>
-                        <svg-icon name="i-ep:delete" />
-                      </el-icon>
-                    </template>
-                  </el-button>
-                </el-button-group>
-              </template>
-            </el-table-column>
-          </el-table>
-        </template>
-
-        <div class="form">
-          <tool-header>
-            <template #right>
-              <el-button type="primary" @click="onGenerateParams">
-                生成参数
-              </el-button>
-            </template>
-          </tool-header>
-          <el-form ref="formRef" label-width="100px" label-position="top">
-            <el-form-item label="数据参数" prop="code">
-              <el-input v-model="state.params" type="textarea" rows="10" placeholder="数据" />
-            </el-form-item>
-            <el-form-item v-if="state.result" label="生成参数" prop="code">
-              <el-input v-model="state.result" type="textarea" rows="10" placeholder="数据" readonly />
-            </el-form-item>
-            <div class="action-bottom">
-              <el-button type="primary" @click="onExecute">
-                立即执行
-              </el-button>
-            </div>
-          </el-form>
-          <ModelObjectSelector ref="ModelObjectSelectorRef" @on-success="onObjectSelSuccess" />
-        </div>
-      </LayoutContainer>
-    </div>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.absolute-container {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-
-  .page-header {
-    margin-bottom: 0;
-  }
-
-  .page-main {
-    flex: 1;
-    overflow: auto;
-    display: flex;
-    flex-direction: column;
-
-    .flex-container {
-      position: static;
-
-      :deep(.left-side) {
-        overflow: auto;
-        display: flex;
-        flex-direction: column;
-      }
-
-      :deep(.main-container) {
-        height: 100%;
-        display: flex;
-        flex-direction: column;
-
-        .empty {
-          flex: 1;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          font-size: 32px;
-          color: var(--el-text-color-placeholder);
-        }
-      }
-    }
-
-    .form {
-      flex: 1;
-      min-height: 0;
-      display: flex;
-      flex-direction: column;
-
-      .el-form {
-        flex: 1;
-        min-height: 0;
-        display: flex;
-        flex-direction: column;
-
-        .columns-table {
-          flex: 1;
-          height: 0;
-          display: flex;
-          flex-direction: column;
-
-          :deep(.el-form-item__content) {
-            min-height: 0;
-
-            .el-table {
-              height: 100%;
-            }
-          }
-        }
-      }
-
-      .action-bottom {
-        padding-top: 2px;
-        text-align: center;
-      }
-
-      .el-table {
-        .el-table__row {
-          .index {
-            display: inline-block;
-          }
-
-          .delete {
-            display: none;
-          }
-
-          &:hover {
-            .index {
-              display: none;
-            }
-
-            .delete {
-              display: inline-block;
-            }
-          }
-
-          .el-tag.sortable,
-          .el-tag.sortable .el-icon {
-            cursor: s-resize;
-          }
-        }
-      }
-    }
-
-  }
-}
-</style>