houyaf vor 3 Jahren
Ursprung
Commit
3ff6d790ce

+ 13 - 0
src/api/biz/bizObjectApi.ts

@@ -27,6 +27,19 @@ export function getObjectByList(data: any) {
 }
 
 /**
+ * 获取Object列表
+ * @param bizId
+ * @returns
+ */
+export function getObjectListById(bizId: number) {
+  return apiRequest({
+    url: `/biz/object/${bizId}`,
+    method: 'GET',
+  })
+}
+
+
+/**
  * 根据Id获取Biz Object
  * @param bizId
  * @param objectId

+ 71 - 0
src/api/biz/bizObjectOAMMappingApi.ts

@@ -0,0 +1,71 @@
+import apiRequest from '@/network/http/apiRequest'
+
+/**
+ * 根据Id获取ObjectMapping
+ * @param bizId
+ * @param objectId
+ * @param oamId
+ * @returns
+ */
+export function getObjectOAMMappingListByOamId(bizId: number, objectId: number, oamId: number) {
+  return apiRequest({
+    url: `/biz/object/oam/mapping/${bizId}/${objectId}/${oamId}`,
+    method: 'GET',
+  })
+}
+
+/**
+ * 根据Id获取ObjectMapping
+ * @param bizId
+ * @param objectId
+ * @param oamId
+ * @param mappingId
+ * @returns
+ */
+export function getObjectOAMMappingById(bizId: number, objectId: number, oamId: number, mappingId: number) {
+  return apiRequest({
+    url: `/biz/object/oam/mapping/${bizId}/${objectId}/${oamId}/${mappingId}`,
+    method: 'GET',
+  })
+}
+
+/**
+ * 添加ObjectMapping
+ * @param data
+ * @returns
+ */
+export function createObjectOAMMapping(data: any) {
+  return apiRequest({
+    url: '/biz/object/oam/mapping/add',
+    method: 'POST',
+    data,
+  })
+}
+
+/**
+ * 更新ObjectMapping
+ * @param data
+ * @returns
+ */
+export function updateObjectOAMMapping(data: any) {
+  return apiRequest({
+    url: '/biz/object/oam/mapping/update',
+    method: 'PUT',
+    data,
+  })
+}
+
+/**
+ * 删除ObjectMapping
+ * @param bizId
+ * @param objectId
+ * @param oamId
+ * @param mappingId
+ * @returns
+ */
+export function deleteObjectOAMMappingById(bizId: number, objectId: number, oamId: number, mappingId: number) {
+  return apiRequest({
+    url: `/biz/object/oam/mapping/${bizId}/${objectId}/${oamId}/${mappingId}`,
+    method: 'DELETE',
+  })
+}

+ 12 - 0
src/api/model/modelObjectApi.ts

@@ -42,6 +42,18 @@ export function getObjectById(modelId: number, objectId: number) {
 /**
  * 根据Id获取Object
  * @param modelId
+ * @returns
+ */
+export function getObjectListById(modelId: number) {
+  return apiRequest({
+    url: `/model/object/${modelId}`,
+    method: 'GET',
+  })
+}
+
+/**
+ * 根据Id获取Object
+ * @param modelId
  * @param bizId
  * @param objectId
  * @returns

+ 53 - 0
src/components/BizObejctSelector/index.vue

@@ -0,0 +1,53 @@
+<script lang="ts" setup name="BizObjectSelector">
+import { getObjectListById } from '@/api/biz/bizObjectApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+  bizId: number
+}>(), {
+  modelValue: 0,
+  bizId: 0,
+})
+const emit = defineEmits(['update:modelValue'])
+interface BizObject {
+  bizId: number
+  objectId: number
+  objectTitle: string
+}
+const objectId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+const state = reactive({
+  loading: false,
+  dataList: [] as BizObject[],
+})
+
+const getData = async () => {
+  const bizId = props.bizId
+  if (bizId > 0) {
+    state.loading = true
+    const { data } = await getObjectListById(bizId)
+    state.loading = false
+    state.dataList = data
+  }
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="objectId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择业务对象" value-key="objectId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.objectId"
+      :label="item.objectTitle"
+      :value="item.objectId"
+    />
+  </el-select>
+</template>

+ 58 - 0
src/components/BizObjectAttrSelector/index.vue

@@ -0,0 +1,58 @@
+<script lang="ts" setup name="BizObjectAttrSelector">
+import { getObjectAttrListById } from '@/api/biz/bizObjectAttrApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+  bizId: number
+  objectId: number
+}>(), {
+  modelValue: 0,
+  bizId: 0,
+  objectId: 0,
+})
+const emit = defineEmits(['update:modelValue'])
+interface BizObjectAttr {
+  bizId: number
+  objectId: number
+  objectTitle: string
+  attrId: number
+  attrTitle: string
+}
+const objectId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+const state = reactive({
+  loading: false,
+  dataList: [] as BizObjectAttr[],
+})
+
+const getData = async () => {
+  const bizId = props.bizId
+  const objectId = props.objectId
+  if (bizId > 0 && objectId > 0) {
+    state.loading = true
+    const { data } = await getObjectAttrListById(bizId, objectId)
+    state.loading = false
+    state.dataList = data
+  }
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="objectId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择属性" value-key="attrId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.attrId"
+      :label="item.attrTitle"
+      :value="item.attrId"
+    />
+  </el-select>
+</template>

+ 50 - 0
src/components/BizRuleSelector/index.vue

@@ -0,0 +1,50 @@
+<script lang="ts" setup name="BizRuleSelector">
+import { getBizRuleByList } from '@/api/biz/bizRuleApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+}>(), {
+  modelValue: 0,
+})
+
+const emit = defineEmits(['update:modelValue'])
+interface BizRule {
+  ruleId: number
+  ruleTitle: string
+}
+
+const ruleId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+
+const state = reactive({
+  loading: false,
+  dataList: [] as BizRule[],
+})
+
+const getData = async () => {
+  state.loading = true
+  const { data } = await getBizRuleByList({})
+  state.loading = false
+  state.dataList = data
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="ruleId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择业务规则" value-key="ruleId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.ruleId"
+      :label="item.ruleTitle"
+      :value="item.ruleId"
+    />
+  </el-select>
+</template>

+ 47 - 0
src/components/BizSelector/index.vue

@@ -0,0 +1,47 @@
+<script lang="ts" setup name="BizSelector">
+import { getBizByList } from '@/api/biz/bizApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+}>(), {
+  modelValue: 0,
+})
+const emit = defineEmits(['update:modelValue'])
+interface Biz {
+  bizId: number
+  bizTitle: string
+}
+const bizId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+const state = reactive({
+  loading: false,
+  dataList: [] as Biz[],
+})
+
+const getData = async () => {
+  state.loading = true
+  const { data } = await getBizByList({})
+  state.loading = false
+  state.dataList = data
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="bizId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择业务模型" value-key="bizId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.bizId"
+      :label="item.bizTitle"
+      :value="item.bizId"
+    />
+  </el-select>
+</template>

+ 53 - 0
src/components/ModelObjectSelector/index.vue

@@ -0,0 +1,53 @@
+<script lang="ts" setup name="ModelObjectSelector">
+import { getObjectListById } from '@/api/model/modelObjectApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+  modelId: number
+}>(), {
+  modelValue: 0,
+  bizId: 0,
+})
+const emit = defineEmits(['update:modelValue'])
+interface ModelObject {
+  modelId: number
+  objectId: number
+  objectTitle: string
+}
+const objectId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+const state = reactive({
+  loading: false,
+  dataList: [] as ModelObject[],
+})
+
+const getData = async () => {
+  const modelId = props.modelId
+  if (modelId > 0) {
+    state.loading = true
+    const { data } = await getObjectListById(modelId)
+    state.loading = false
+    state.dataList = data
+  }
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="objectId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择业务对象" value-key="objectId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.objectId"
+      :label="item.objectTitle"
+      :value="item.objectId"
+    />
+  </el-select>
+</template>

+ 47 - 0
src/components/ModelSelector/index.vue

@@ -0,0 +1,47 @@
+<script lang="ts" setup name="ModelSelector">
+import { getModelByList } from '@/api/model/modelApi'
+const props = withDefaults(defineProps<{
+  modelValue: number
+}>(), {
+  modelValue: 0,
+})
+const emit = defineEmits(['update:modelValue'])
+interface Model {
+  modelId: number
+  modelTitle: string
+}
+const modelId = computed({
+  get: () => {
+    return props.modelValue
+  },
+  set: (val) => {
+    emit('update:modelValue', val)
+  },
+})
+const state = reactive({
+  loading: false,
+  dataList: [] as Model[],
+})
+
+const getData = async () => {
+  state.loading = true
+  const { data } = await getModelByList({})
+  state.loading = false
+  state.dataList = data
+}
+onMounted(() => {
+  getData ()
+})
+</script>
+
+<template>
+  <el-select v-model="modelId" v-loading="state.loading" style="width: 100%" filterable placeholder="请选择数据模型" value-key="modelId">
+    <el-option key="0" label="请选择" :value="0" disabled />
+    <el-option
+      v-for="item in state.dataList"
+      :key="item.modelId"
+      :label="item.modelTitle"
+      :value="item.modelId"
+    />
+  </el-select>
+</template>

+ 6 - 0
src/types/components.d.ts

@@ -13,6 +13,10 @@ declare module '@vue/runtime-core' {
     Auth: typeof import('./../components/Auth/index.vue')['default']
     AuthAll: typeof import('./../components/AuthAll/index.vue')['default']
     BatchActionBar: typeof import('./../components/BatchActionBar/index.vue')['default']
+    BizObejctSelector: typeof import('./../components/BizObejctSelector/index.vue')['default']
+    BizObjectAttrSelector: typeof import('./../components/BizObjectAttrSelector/index.vue')['default']
+    BizRuleSelector: typeof import('./../components/BizRuleSelector/index.vue')['default']
+    BizSelector: typeof import('./../components/BizSelector/index.vue')['default']
     Chip: typeof import('./../components/Chip/index.vue')['default']
     ColorfulCard: typeof import('./../components/ColorfulCard/index.vue')['default']
     Copyright: typeof import('./../components/Copyright/index.vue')['default']
@@ -28,6 +32,8 @@ declare module '@vue/runtime-core' {
     ImagesUpload: typeof import('./../components/ImagesUpload/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']
     LayoutContainer: typeof import('./../components/LayoutContainer/index.vue')['default']
+    ModelObjectSelector: typeof import('./../components/ModelObjectSelector/index.vue')['default']
+    ModelSelector: typeof import('./../components/ModelSelector/index.vue')['default']
     PageHeader: typeof import('./../components/PageHeader/index.vue')['default']
     PageMain: typeof import('./../components/PageMain/index.vue')['default']
     PcasCascader: typeof import('./../components/PcasCascader/index.vue')['default']

+ 3 - 2
src/views/api/api/index.vue

@@ -3,7 +3,7 @@ meta:
   enabled: false
 </route>
 
-<script lang="ts" setup>
+<script lang="ts" setup name="apiIndex">
 import { ElMessage, ElMessageBox } from 'element-plus'
 import PSApi from './components/Api.vue'
 import { getBizData } from '@/api/biz/bizApi'
@@ -133,7 +133,7 @@ const onApiDelete = (row: any) => {
 }
 
 // 编辑对象
-const onApiTrans = (row: { apiId: number }) => {
+const onApiDebug = (row: { apiId: number }) => {
   if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
     tabbar.open({
       name: 'apiTrans',
@@ -257,6 +257,7 @@ async function onChangeStatus(row: { apiId: number; status: number }) {
             <el-table-column label="操作" header-align="center" align="center" width="210">
               <template #default="scope">
                 <el-button type="warning" size="small" plain @click="onApiEdit(scope.row)">编辑</el-button>
+                <el-button type="warning" size="small" plain @click="onApiDebug(scope.row)">调试</el-button>
                 <el-button type="danger" size="small" plain @click="onApiDelete(scope.row)">删除</el-button>
               </template>
             </el-table-column>

+ 16 - 4
src/views/api/log/index.vue

@@ -1,4 +1,4 @@
-<script lang="ts" setup>
+<script lang="ts" setup name="apiLog">
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { deleteApiLogById, getApiLogByPage } from '@/api/api/apiLogApi'
 const { pagination, getParams, onSizeChange, onCurrentChange } = usePagination()
@@ -135,11 +135,23 @@ const onReqDel = async (data: { apiTitle: any; reqId: number }) => {
           <el-table ref="apiReqTableRef" v-loading="state.loading" class="list-table" :data="state.dataList" size="small" border stripe highlight-current-row>
             <el-table-column type="index" align="center" label="序号" width="60" />
 
-            <el-table-column align="center" width="100" label="接口名称" prop="apiTitle" />
+            <el-table-column align="center" width="100" label="接口名称" prop="apiTitle">
+              <template #default="scope">
+                <span>{{ scope.row.apiTitle }}</span>
+              </template>
+            </el-table-column>
 
-            <el-table-column align="center" label="调用者IP" prop="appTitle" />
+            <el-table-column align="center" label="调用者IP" prop="appTitle">
+              <template #default="scope">
+                <span>{{ scope.row.appTitle }}</span>
+              </template>
+            </el-table-column>
 
-            <el-table-column align="center" label="创建时间" prop="reqTime" />
+            <el-table-column align="center" label="创建时间" prop="reqTime">
+              <template #default="scope">
+                <span>{{ reqTime }}</span>
+              </template>
+            </el-table-column>
 
             <el-table-column label="操作" header-align="center" align="center" width="220">
               <template #default="scope">

+ 0 - 287
src/views/biz/mapping/components/ModelObjectSelector.vue

@@ -1,287 +0,0 @@
-<route lang="yaml">
-meta:
-  enabled: false
-</route>
-
-<script lang="ts" setup name="bizObjectMapping">
-import { selectForBizObjectMapping } from '@/api/model/modelObjectApi'
-import { getModelByList } from '@/api/model/modelApi'
-import { createObjectMapping } from '@/api/biz/bizObjectMappingApi'
-
-const emit = defineEmits(['success'])
-
-interface TreeNode {
-  label: string
-  isLeaf: boolean
-  modelId: number
-  children?: TreeNode[]
-}
-
-interface Object {
-  modelId: number
-  objectId: number
-  objectTitle: string
-  objectCode: string
-  comment: string
-}
-
-const state = reactive({
-  title: '',
-  loading: false,
-  treeData: [] as TreeNode[],
-  objectList: [] as Object[],
-  dialogState: 1,
-  search: {
-    modelId: 0,
-    bizId: 0,
-    objectId: 0,
-    keywords: '',
-  },
-  formData: {
-    bizId: 0,
-    objectId: 0,
-    mappingModelId: 0,
-    mappingObjectId: 0,
-  },
-  dialogVisible: false,
-})
-
-const leftTreeRef = ref()
-const modelRef = ref()
-const getObjectData = async () => {
-  const { modelId, bizId, objectId } = state.search
-  state.loading = true
-  const { data } = await selectForBizObjectMapping(modelId, bizId, objectId)
-  state.loading = false
-  state.objectList = data
-}
-
-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.treeData = [
-    {
-      label: '数据模型库',
-      isLeaf: false,
-      modelId: -1,
-      children,
-    },
-  ]
-
-  if (data && data.length > 0) {
-    state.search.modelId = data[0].modelId
-    nextTick(() => {
-      leftTreeRef.value.setCurrentKey(data[0].modelId)
-    })
-    await getObjectData()
-  }
-}
-
-onMounted(() => {
-  getModelData()
-})
-
-// 模型选择
-const onTreeNodeClick = (node: TreeNode) => {
-  if (node.isLeaf) {
-    state.search.modelId = node.modelId
-    getObjectData()
-  }
-}
-
-function onCancel() {
-  state.dialogVisible = false
-}
-
-const onModelObjectMapping = async (row: any) => {
-  state.formData.mappingModelId = row.modelId
-  state.formData.mappingObjectId = row.objectId
-  await createObjectMapping(state.formData)
-  state.dialogVisible = false
-  emit('success')
-}
-
-defineExpose({
-  showModel(bizId: number, objectId: number) {
-    state.title = '新增业务对象映射'
-    state.formData.bizId = bizId
-    state.formData.objectId = objectId
-    state.search.bizId = bizId
-    state.search.objectId = objectId
-    state.dialogVisible = true
-  },
-})
-</script>
-
-<template>
-  <el-drawer v-model="state.dialogVisible" :title="state.title" size="80%">
-    <div class="absolute-container">
-      <tool-header title="数据模型" />
-
-      <div class="page-main">
-        <LayoutContainer left-side-width="250px" hide-left-side-toggle>
-          <template #leftSide>
-            <el-scrollbar class="tree">
-              <ElTree ref="leftTreeRef" :data="state.treeData" 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="bx:bxs-component" />
-                      </el-icon>
-                      <div class="text">
-                        {{ data.label }}
-                      </div>
-                    </div>
-                  </div>
-                </template>
-              </ElTree>
-            </el-scrollbar>
-          </template>
-
-          <div class="container">
-            <tool-bar>
-              <template #right>
-                <el-input v-model="state.search.keywords" placeholder="请输入名称,支持模糊查询" style="padding-right: 10px;" clearable />
-                <el-button type="primary" @click="getObjectData">
-                  <template #icon>
-                    <el-icon>
-                      <svg-icon name="i-ep:search" />
-                    </el-icon>
-                  </template>
-                </el-button>
-              </template>
-            </tool-bar>
-
-            <el-table ref="modelObjectTableRef" v-loading="state.loading" class="list-table" :data="state.objectList" size="small" border stripe highlight-current-row height="100%">
-              <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
-
-              <el-table-column prop="objectTitle" label="名称" header-align="center" align="center" width="200">
-                <template #default="scope">
-                  <el-icon>
-                    <svg-icon name="uim:box" />
-                  </el-icon>
-                  <span>{{ scope.row.objectTitle }}</span>
-                </template>
-              </el-table-column>
-
-              <el-table-column prop="objectCode" label="代码" header-align="center" align="center" width="150">
-                <template #default="scope">
-                  <span>{{ scope.row.objectCode }}</span>
-                </template>
-              </el-table-column>
-
-              <el-table-column prop="objectType" label="类型" header-align="center" align="center" width="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">
-                <template #default="scope">
-                  <span>{{ scope.row.comment }}</span>
-                </template>
-              </el-table-column>
-
-              <el-table-column label="操作" header-align="center" align="center" width="220">
-                <template #default="scope">
-                  <el-button type="primary" size="small" plain @click="onModelObjectMapping(scope.row)">
-                    选择
-                  </el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </div>
-        </layoutcontainer>
-      </div>
-    </div>
-  </el-drawer>
-</template>
-
-<style lang="scss" scoped>
-.container {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-}
-
-.absolute-container {
-  :deep(.left-side) {
-    display: flex;
-    flex-direction: column;
-    height: 100%;
-
-    .btns {
-      display: inline-flex;
-      width: 100%;
-      margin-bottom: var(--container-padding);
-
-      .add {
-        width: 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;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-</style>

+ 9 - 307
src/views/biz/oam/index.vue

@@ -5,14 +5,14 @@ meta:
 
 <script lang="ts" setup name="BizObjectOAM">
 import { ElMessage, ElMessageBox } from 'element-plus'
-import ObjectOAMRuleComponent from '../rule/components/objectOAMRule.vue'
+import BizObjectOAMParamsListComponent from '../oam_params/index.vue'
+import BizObjectOAMRuleListComponent from '../oam_rule/index.vue'
+import BizObjectOAMMappingListComponent from '../oam_mapping/index.vue'
 import ObjectOAMComponent from './components/objectOAM.vue'
 import useSettingsStore from '@/store/modules/settings'
 import { getObjectById } from '@/api/biz/bizObjectApi'
 import { deleteObjectOAMById, getObjectOAMById, getObjectOAMListByObjectId } from '@/api/biz/bizObjectOAMApi'
-import { getObjectOAMRuleListByOamId } from '@/api/biz/bizObjectOAMRuleApi'
-import { dataType, oamType, sqlType } from '@/utils/tool'
-import { createObjectOAMParams, deleteObjectOAMParamsById, getObjectOAMParamsListByOamId, updateObjectOAMParams } from '@/api/biz/bizObjectOAMParamsApi'
+import { oamType, sqlType } from '@/utils/tool'
 
 const settingsStore = useSettingsStore()
 const route = useRoute()
@@ -47,21 +47,6 @@ interface ObjectOAM {
   sqlCount: string
 }
 
-interface ObjectOAMParams {
-  bizId: number
-  objectId: number
-  oamId: number
-  paramsId: number
-  logicalOperator: string
-  compareOperator: string
-  paramsTarget: string
-  paramsValue: string
-  paramsType: number
-  paramsRemark: string
-  sortNo: number
-  isEdit: boolean
-}
-
 const state = reactive({
   loading: false,
   objectTitle: '',
@@ -70,10 +55,8 @@ const state = reactive({
   keywords: '',
   curOamId: 0,
   oamList: [],
-  objectOamRuleList: [],
   treeData: [] as TreeNode[],
   oam: {} as ObjectOAM,
-  params: [] as ObjectOAMParams[],
   dialogState: 1,
   search: {
     bizId,
@@ -105,26 +88,6 @@ const getObjectOAMData = async () => {
   }
 }
 
-const getObjectOAMParams = async () => {
-  const curOamId = state.curOamId
-  if (curOamId > 0) {
-    state.loading = true
-    const { data } = await getObjectOAMParamsListByOamId(bizId, objectId, curOamId)
-    state.params = data
-    state.loading = false
-  }
-}
-
-const getObjectOAMRuleList = async () => {
-  const curOamId = state.curOamId
-  if (curOamId > 0) {
-    state.loading = true
-    const { data } = await getObjectOAMRuleListByOamId(bizId, objectId, curOamId)
-    state.objectOamRuleList = data
-    state.loading = false
-  }
-}
-
 const getOAMTree = async () => {
   const { data } = await getObjectOAMListByObjectId(bizId, objectId)
   state.treeData = []
@@ -143,8 +106,6 @@ const getOAMTree = async () => {
       leftTreeRef.value.setCurrentKey(data[0].oamId)
     })
     await getObjectOAMData()
-    await getObjectOAMParams()
-    await getObjectOAMRuleList()
   }
 }
 
@@ -158,8 +119,6 @@ const onTreeNodeClick = async (node: TreeNode) => {
   if (node.isLeaf) {
     state.curOamId = node.oamId
     await getObjectOAMData()
-    await getObjectOAMParams()
-    await getObjectOAMRuleList()
   }
 }
 
@@ -190,94 +149,6 @@ const onSuccess = () => {
 }
 
 const activeName = ref('first')
-
-// 查询参数
-const paramsTableRef = ref()
-const paramsTableKey = ref(0)
-
-const logicalOperators = [
-  {
-    label: 'AND',
-    value: 'AND',
-  },
-  {
-    label: 'OR',
-    value: 'OR',
-  },
-  {
-    label: 'NOT',
-    value: 'NOT',
-  },
-]
-
-function onParamsAdd() {
-  state.params.push({
-    bizId,
-    objectId,
-    oamId: state.curOamId,
-    paramsId: 0,
-    logicalOperator: 'AND',
-    paramsTarget: '', // 名称
-    compareOperator: '=', // 代码
-    paramsValue: '',
-    paramsType: 0,
-    paramsRemark: '',
-    sortNo: 0,
-    isEdit: true,
-  })
-  state.actionType = 1
-}
-
-function onParamsEdit(row: any) {
-  row.isEdit = true
-  state.actionType = 2
-}
-
-async function onParamsDelete(row: any) {
-  const oamId = state.curOamId
-  const paramsId = row.paramsId
-  await deleteObjectOAMParamsById(bizId, objectId, oamId, paramsId)
-  ElMessage.success('删除成功')
-}
-
-function onParamsCancel(row: any, index: number) {
-  row.isEdit = false
-  if (state.actionType === 1) {
-    state.params.splice(index, 1)
-  }
-  state.actionType = 0
-}
-
-async function onParamsSave(row: any) {
-  row.isEdit = false
-  if (state.actionType === 1) {
-    await createObjectOAMParams(row)
-    ElMessage.success('新增成功')
-  }
-  else {
-    await updateObjectOAMParams(row)
-    ElMessage.success('修改成功')
-  }
-}
-
-// 业务规则
-const objectOAMRuleRef = ref()
-const onObjectOAMRuleSearch = async () => {
-  await getObjectOAMRuleList()
-}
-
-const onObjectOAMRuleAdd = () => {
-  objectOAMRuleRef.value.showAddModel(bizId, objectId, state.curOamId)
-}
-
-const onObjectOAMRuleEdit = (row: { orId: number }) => {
-  objectOAMRuleRef.value.showEditModel(bizId, objectId, state.curOamId, row.orId)
-}
-
-const onObjectOAMRuleDelete = (row: { }) => {
-
-}
-
 // 返回列表页
 function goBack() {
   if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
@@ -412,191 +283,22 @@ function goBack() {
               </el-descriptions>
 
               <div v-if="state.oam && state.oam.sqlType === 1" class="container">
-                <tool-bar>
-                  <template #left>
-                    <h5>查询条件参数</h5>
-                  </template>
-                  <template #right>
-                    <el-button type="default" @click="onParamsAdd">
-                      <template #icon>
-                        <el-icon>
-                          <svg-icon name="i-ep:plus" />
-                        </el-icon>
-                      </template>
-                    </el-button>
-                  </template>
-                </tool-bar>
-
-                <el-table ref="paramsTableRef" :key="paramsTableKey" :data="state.params" class="list-table" size="small" border stripe highlight-current-row>
-                  <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
-
-                  <el-table-column label="条件关系" header-align="center" align="center" width="150">
-                    <template #default="scope">
-                      <el-select v-if="scope.row.isEdit" v-model="scope.row.logicalOperator" placeholder="请选择">
-                        <el-option
-                          v-for="item in logicalOperators"
-                          :key="item.value"
-                          :label="item.label"
-                          :value="item.value"
-                        />
-                      </el-select>
-                      <span v-else>{{ scope.row.logicalOperator }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="参数名称" header-align="center" align="center" width="150">
-                    <template #default="scope">
-                      <el-input v-if="scope.row.isEdit" v-model="scope.row.paramsTarget" size="small" />
-                      <span v-else>{{ scope.row.paramsTarget }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="运算符" header-align="center" align="center" width="120">
-                    <template #default="scope">
-                      <el-input v-if="scope.row.isEdit" v-model="scope.row.compareOperator" size="small" />
-                      <span v-else>{{ scope.row.compareOperator }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="值" header-align="center" align="center" width="120">
-                    <template #default="scope">
-                      <el-input v-if="scope.row.isEdit" v-model="scope.row.paramsValue" size="small" />
-                      <span v-else>{{ scope.row.paramsValue }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="类型" header-align="center" align="center" width="120">
-                    <template #default="scope">
-                      <data-type-selector v-if="scope.row.isEdit" v-model="scope.row.paramsType" />
-                      <span v-else>{{ dataType(scope.row.paramsType) }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="备注">
-                    <template #default="scope">
-                      <el-input v-if="scope.row.isEdit" v-model="scope.row.paramsRemark" size="small" />
-                      <span v-else>{{ scope.row.paramsRemark }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column header-align="center" align="center" width="70">
-                    <template #header>
-                      排序
-                    </template>
-                    <template #default>
-                      <el-tag type="info" class="sortable">
-                        <el-icon>
-                          <svg-icon name="i-ep:d-caret" />
-                        </el-icon>
-                      </el-tag>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="操作" width="140" align="center">
-                    <template #default="scope">
-                      <template v-if="scope.row.isEdit">
-                        <el-button type="primary" plain size="small" @click="onParamsSave(scope.row)">
-                          保存
-                        </el-button>
-                        <el-button type="primary" plain size="small" @click="onParamsCancel(scope.row, scope.$index)">
-                          取消
-                        </el-button>
-                      </template>
-                      <template v-else>
-                        <el-button type="primary" plain size="small" @click="onParamsEdit(scope.row)">
-                          编辑
-                        </el-button>
-                        <el-popconfirm title="是否要删除此行?" style="margin-left: 10px;" @confirm="onParamsDelete(scope.row)">
-                          <template #reference>
-                            <el-button type="danger" plain size="small">
-                              删除
-                            </el-button>
-                          </template>
-                        </el-popconfirm>
-                      </template>
-                    </template>
-                  </el-table-column>
-                </el-table>
+                <BizObjectOAMParamsListComponent :bizId="state.bizId" :objectId="state.objectId" :oamId="state.curOamId" />
               </div>
             </el-tab-pane>
 
             <el-tab-pane label="业务规则" name="two">
-              <div class="container">
-                <tool-bar>
-                  <template #left>
-                    <h5>业务规则</h5>
-                  </template>
-
-                  <template #right>
-                    <el-input v-model="state.search.keywords" placeholder="请输入名称,支持模糊查询" style="padding-right: 10px;" clearable />
-                    <el-button type="primary" @click="onObjectOAMRuleSearch">
-                      <template #icon>
-                        <el-icon>
-                          <svg-icon name="i-ep:search" />
-                        </el-icon>
-                      </template>
-                    </el-button>
-
-                    <el-button type="primary" size="default" @click.stop="onObjectOAMRuleAdd">
-                      <template #icon>
-                        <el-icon>
-                          <svg-icon name="i-ep:plus" />
-                        </el-icon>
-                      </template>
-                      业务规则
-                    </el-button>
-                  </template>
-                </tool-bar>
-
-                <el-table
-                  ref="objectRuleTableRef"
-                  v-loading="state.loading"
-                  size="small"
-                  class="list-table"
-                  :data="state.objectOamRuleList" border stripe highlight-current-row height="100%"
-                >
-                  <el-table-column type="index" label="序号" header-align="center" align="center" width="70" />
+              <BizObjectOAMRuleListComponent :bizId="state.bizId" :objectId="state.objectId" :oamId="state.curOamId" />
+            </el-tab-pane>
 
-                  <el-table-column prop="objectTitle" label="对象名称" header-align="center" align="center">
-                    <template #default="scope">
-                      <el-icon>
-                        <svg-icon name="uim:box" />
-                      </el-icon>
-                      <span> &nbsp;&nbsp;{{ scope.row.objectTitle }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column prop="targetAttrTitle" label="目标属性" header-align="center" align="center">
-                    <template #default="scope">
-                      <span> {{ scope.row.targetAttrTitle }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column prop="ruleTitle" label="应用规则" header-align="center" align="center">
-                    <template #default="scope">
-                      <span> {{ scope.row.ruleTitle }}</span>
-                    </template>
-                  </el-table-column>
-
-                  <el-table-column label="操作" header-align="center" align="center" width="230">
-                    <template #default="scope">
-                      <el-button type="warning" size="small" plain @click="onObjectOAMRuleEdit(scope.row)">
-                        编辑
-                      </el-button>
-                      <el-button type="danger" size="small" plain @click="onObjectOAMRuleDelete(scope.row)">
-                        删除
-                      </el-button>
-                    </template>
-                  </el-table-column>
-                </el-table>
-              </div>
+            <el-tab-pane label="对象映射" name="three">
+              <BizObjectOAMMappingListComponent :bizId="state.bizId" :objectId="state.objectId" :oamId="state.curOamId" />
             </el-tab-pane>
           </el-tabs>
         </div>
       </LayoutContainer>
     </div>
     <ObjectOAMComponent ref="objectOAMRef" @success="getOAMTree" />
-    <ObjectOAMRuleComponent ref="objectOAMRuleRef" @success="getObjectOAMRuleList" />
   </div>
 </template>
 

+ 258 - 0
src/views/biz/oam_mapping/index.vue

@@ -0,0 +1,258 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup name="BizObjectOAMParamsList">
+import type { FormInstance, FormRules } from 'element-plus'
+import { ElMessage } from 'element-plus'
+import { createObjectOAMMapping, deleteObjectOAMMappingById, getObjectOAMMappingListByOamId, updateObjectOAMMapping } from '@/api/biz/bizObjectOAMMappingApi'
+const props = withDefaults(defineProps<{
+  bizId: number
+  objectId: number
+  oamId: number
+}>(), {
+  bizId: 0,
+  objectId: 0,
+  oamId: 0,
+})
+
+interface ObjectOAMMapping {
+  bizId: number
+  objectId: number
+  oamId: number
+  mappingId: number
+  mappingModelId: number
+  mappingModelTitle: string
+  mappingObjectId: number
+  mappingObjectCode: string
+  mappingObjectTitle: string
+  mappingObjectOAM: number
+  sortNo: number
+  isEdit: boolean
+}
+
+// 数据
+const state = reactive({
+  title: '',
+  dialogVisible: false,
+  loading: false,
+  conditions: {
+    keywords: '',
+    bizId: props.bizId,
+    objectId: props.objectId,
+    oamId: props.oamId,
+  },
+  dataList: [] as ObjectOAMMapping[],
+  actionType: 1,
+})
+
+const formRef = ref<FormInstance>()
+const formRules = reactive<FormRules>({
+  mappingModelId: [
+    { required: true, message: '请输入数据模型', trigger: 'blur' },
+  ],
+  mappingObjectId: [
+    { required: true, message: '请输入对象', trigger: 'blur' },
+  ],
+  mappingObjectOAM: [
+    { required: true, message: '请输入对像行为', trigger: 'blur' },
+  ],
+})
+
+// 查询数据
+const getData = async () => {
+  state.loading = true
+  const { bizId, objectId, oamId } = state.conditions
+  const { data } = await getObjectOAMMappingListByOamId(bizId, objectId, oamId)
+  state.loading = false
+  state.dataList = data
+  data.forEach((m: ObjectOAMMapping) => {
+    m.isEdit = false
+  })
+}
+
+const mappingTableRef = ref()
+const mappingTableKey = ref(0)
+
+function onParamAdd() {
+  state.dataList.push({
+    bizId: props.bizId,
+    objectId: props.objectId,
+    oamId: props.oamId,
+    mappingId: 0,
+    mappingModelId: 0,
+    mappingModelTitle: '',
+    mappingObjectId: 0,
+    mappingObjectCode: '',
+    mappingObjectTitle: '',
+    mappingObjectOAM: 1,
+    sortNo: 1,
+    isEdit: true,
+  })
+  state.actionType = 1
+}
+
+function onMappingEdit(row: any) {
+  row.isEdit = true
+  state.actionType = 2
+}
+
+async function onMappingDelete(row: any) {
+  const { bizId, objectId, oamId } = state.conditions
+  const mappingId = row.mappingId
+  await deleteObjectOAMMappingById(bizId, objectId, oamId, mappingId)
+  ElMessage.success('删除成功')
+}
+
+function onMappingCancel(row: any, index: number) {
+  row.isEdit = false
+  if (state.actionType === 1) {
+    state.dataList.splice(index, 1)
+  }
+  state.actionType = 0
+}
+
+async function onMappingSave(row: any) {
+  row.isEdit = false
+  if (state.actionType === 1) {
+    await createObjectOAMMapping(row)
+    state.dialogVisible = false
+    ElMessage.success('新增成功')
+  }
+  else {
+    await updateObjectOAMMapping(row)
+    state.dialogVisible = false
+    ElMessage.success('修改成功')
+  }
+}
+
+onMounted(() => {
+  // getData()
+  // nextTick(() => {
+  // })
+})
+</script>
+
+<template>
+  <div class="container">
+    <tool-bar>
+      <template #left>
+        <h5>数据对象映射</h5>
+      </template>
+      <template #right>
+        <el-input placeholder="请输入关键词筛选" clearable style="width: 200px;" />
+        <el-button style="margin-left:10px" @click="getData">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:search" />
+            </el-icon>
+          </template>
+        </el-button>
+
+        <el-button type="default" @click="onParamAdd">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:plus" />
+            </el-icon>
+          </template>
+        </el-button>
+      </template>
+    </tool-bar>
+
+    <el-table ref="mappingTableRef" :key="mappingTableKey" :data="state.dataList" class="list-table" size="small" border stripe highlight-current-row>
+      <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
+
+      <el-table-column label="数据模型" header-align="center" align="center" width="200">
+        <template #default="scope">
+          <model-object-selector v-if="scope.row.isEdit" v-model="scope.row.mappingModelId" size="small" />
+          <span v-else>{{ scope.row.mappingModelTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="对象" header-align="center" align="center" width="200">
+        <template #default="scope">
+          <el-input v-if="scope.row.isEdit" v-model="scope.row.mappingObjectId" size="small" />
+          <span v-else>{{ scope.row.mappingObjectTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="值" header-align="center" align="center" >
+        <template #default="scope">
+          <el-input v-if="scope.row.isEdit" v-model="scope.row.mappingObjectOAM" size="small" />
+          <span v-else>{{ scope.row.mappingObjectOAM }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column header-align="center" align="center" width="70">
+        <template #header>
+          排序
+        </template>
+        <template #default>
+          <el-tag type="info" class="sortable">
+            <el-icon>
+              <svg-icon name="i-ep:d-caret" />
+            </el-icon>
+          </el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" width="140" align="center">
+        <template #default="scope">
+          <template v-if="scope.row.isEdit">
+            <el-button type="primary" plain size="small" @click="onMappingSave(scope.row)">
+              保存
+            </el-button>
+            <el-button type="primary" plain size="small" @click="onMappingCancel(scope.row, scope.$index)">
+              取消
+            </el-button>
+          </template>
+          <template v-else>
+            <el-button type="primary" plain size="small" @click="onMappingEdit(scope.row)">
+              编辑
+            </el-button>
+            <el-popconfirm title="是否要删除此行?" style="margin-left: 10px;" @confirm="onMappingDelete(scope.row)">
+              <template #reference>
+                <el-button type="danger" plain size="small">
+                  删除
+                </el-button>
+              </template>
+            </el-popconfirm>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.page-main {
+  :deep(.el-table) {
+    height: 100%;
+
+    .el-table__row {
+      .index {
+        display: inline-block;
+      }
+
+      .delete {
+        display: none;
+      }
+
+      &:hover {
+        .index {
+          display: none;
+        }
+
+        .delete {
+          display: inline-block;
+        }
+      }
+    }
+  }
+  h5{
+    padding: 0;
+    margin: 0;
+  }
+}
+</style>

+ 68 - 27
src/views/biz/params/index.vue → src/views/biz/oam_params/index.vue

@@ -3,7 +3,7 @@ meta:
   enabled: false
 </route>
 
-<script lang="ts" setup name="BizObjectParamsList">
+<script lang="ts" setup name="BizObjectOAMParamsList">
 import type { FormInstance, FormRules } from 'element-plus'
 import { ElMessage } from 'element-plus'
 import { dataType } from '@/utils/tool'
@@ -18,14 +18,21 @@ const props = withDefaults(defineProps<{
   oamId: 0,
 })
 
+const bizId = props.bizId
+const objectId = props.objectId
+const oamId = props.oamId
+
 interface ObjectOAMParams {
   bizId: number
   objectId: number
   oamId: number
   paramsId: number
+  logicalOperator: string
+  compareOperator: string
   paramsTarget: string
-  paramsOperator: string
   paramsValue: string
+  paramsType: number
+  paramsRemark: string
   sortNo: number
   isEdit: boolean
 }
@@ -41,7 +48,7 @@ const state = reactive({
     objectId: props.objectId,
     oamId: props.oamId,
   },
-  params: [] as ObjectOAMParams[],
+  dataList: [] as ObjectOAMParams[],
   actionType: 1,
 })
 
@@ -61,10 +68,9 @@ const formRules = reactive<FormRules>({
 // 查询数据
 const getData = async () => {
   state.loading = true
-  const { bizId, objectId, oamId } = state.conditions
   const { data } = await getObjectOAMParamsListByOamId(bizId, objectId, oamId)
   state.loading = false
-  state.params = data
+  state.dataList = data
   data.forEach((param: ObjectOAMParams) => {
     param.isEdit = false
   })
@@ -73,42 +79,60 @@ const getData = async () => {
 const paramsTableRef = ref()
 const paramsTableKey = ref(0)
 
-function onAttrAdd() {
-  state.params.push({
-    bizId: props.bizId,
-    objectId: props.objectId,
-    oamId: props.oamId,
+const logicalOperators = [
+  {
+    label: 'AND',
+    value: 'AND',
+  },
+  {
+    label: 'OR',
+    value: 'OR',
+  },
+  {
+    label: 'NOT',
+    value: 'NOT',
+  },
+]
+
+function onParamAdd() {
+  state.dataList.push({
+    bizId,
+    objectId,
+    oamId,
     paramsId: 0,
+    logicalOperator: 'AND',
     paramsTarget: '', // 名称
-    paramsOperator: '', // 代码
+    compareOperator: '=', // 代码
     paramsValue: '',
+    paramsType: 0,
+    paramsRemark: '',
     sortNo: 0,
     isEdit: true,
   })
   state.actionType = 1
 }
 
-function onAttrEdit(row: any) {
+function onParamEdit(row: any) {
   row.isEdit = true
   state.actionType = 2
 }
 
-async function onAttrDelete(row: any) {
+async function onParamDelete(row: any) {
   const { bizId, objectId, oamId } = state.conditions
   const paramsId = row.paramsId
   await deleteObjectOAMParamsById(bizId, objectId, oamId, paramsId)
   ElMessage.success('删除成功')
 }
 
-function onAttrCancel(row: any, index: number) {
+function onParamCancel(row: any, index: number) {
   row.isEdit = false
   if (state.actionType === 1) {
-    state.params.splice(index, 1)
+    state.dataList.splice(index, 1)
   }
   state.actionType = 0
 }
 
-async function onAttrSave(row: any) {
+async function onParamSave(row: any) {
   row.isEdit = false
   if (state.actionType === 1) {
     await createObjectOAMParams(row)
@@ -123,9 +147,9 @@ async function onAttrSave(row: any) {
 }
 
 onMounted(() => {
-  // getData()
-  // nextTick(() => {
-  // })
+  getData()
+  nextTick(() => {
+  })
 })
 </script>
 
@@ -133,7 +157,7 @@ onMounted(() => {
   <div class="container">
     <tool-bar>
       <template #left>
-        <h5>对象属性</h5>
+        <h5>查询条件</h5>
       </template>
       <template #right>
         <el-input placeholder="请输入关键词筛选" clearable style="width: 200px;" />
@@ -145,7 +169,7 @@ onMounted(() => {
           </template>
         </el-button>
 
-        <el-button type="default" @click="onAttrAdd">
+        <el-button type="default" @click="onParamAdd">
           <template #icon>
             <el-icon>
               <svg-icon name="i-ep:plus" />
@@ -158,6 +182,20 @@ onMounted(() => {
     <el-table ref="paramsTableRef" :key="paramsTableKey" :data="state.params" class="list-table" size="small" border stripe highlight-current-row>
       <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
 
+      <el-table-column label="条件关系" header-align="center" align="center" width="150">
+        <template #default="scope">
+          <el-select v-if="scope.row.isEdit" v-model="scope.row.logicalOperator" placeholder="请选择">
+            <el-option
+              v-for="item in logicalOperators"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+          <span v-else>{{ scope.row.logicalOperator }}</span>
+        </template>
+      </el-table-column>
+
       <el-table-column label="参数名称" header-align="center" align="center" width="150">
         <template #default="scope">
           <el-input v-if="scope.row.isEdit" v-model="scope.row.paramsTarget" size="small" />
@@ -167,8 +205,8 @@ onMounted(() => {
 
       <el-table-column label="运算符" header-align="center" align="center" width="120">
         <template #default="scope">
-          <el-input v-if="scope.row.isEdit" v-model="scope.row.paramsOperator" size="small" />
-          <span v-else>{{ scope.row.paramsOperator }}</span>
+          <el-input v-if="scope.row.isEdit" v-model="scope.row.compareOperator" size="small" />
+          <span v-else>{{ scope.row.compareOperator }}</span>
         </template>
       </el-table-column>
 
@@ -209,18 +247,18 @@ onMounted(() => {
       <el-table-column label="操作" width="140" align="center">
         <template #default="scope">
           <template v-if="scope.row.isEdit">
-            <el-button type="primary" plain size="small" @click="onAttrSave(scope.row)">
+            <el-button type="primary" plain size="small" @click="onParamSave(scope.row)">
               保存
             </el-button>
-            <el-button type="primary" plain size="small" @click="onAttrCancel(scope.row, scope.$index)">
+            <el-button type="primary" plain size="small" @click="onParamCancel(scope.row, scope.$index)">
               取消
             </el-button>
           </template>
           <template v-else>
-            <el-button type="primary" plain size="small" @click="onAttrEdit(scope.row)">
+            <el-button type="primary" plain size="small" @click="onParamEdit(scope.row)">
               编辑
             </el-button>
-            <el-popconfirm title="是否要删除此行?" style="margin-left: 10px;" @confirm="onAttrDelete(scope.row)">
+            <el-popconfirm title="是否要删除此行?" style="margin-left: 10px;" @confirm="onParamDelete(scope.row)">
               <template #reference>
                 <el-button type="danger" plain size="small">
                   删除
@@ -235,6 +273,9 @@ onMounted(() => {
 </template>
 
 <style lang="scss" scoped>
+.container {
+  margin-top: 10px;
+}
 .page-main {
   :deep(.el-table) {
     height: 100%;

+ 0 - 0
src/views/biz/rule/components/ObjectAttrSelector.vue → src/views/biz/oam_rule/components/ObjectAttrSelector.vue


+ 0 - 0
src/views/biz/rule/components/ObjectOAMRule.vue → src/views/biz/oam_rule/components/ObjectOAMRule.vue


+ 252 - 0
src/views/biz/oam_rule/index.vue

@@ -0,0 +1,252 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup name="BizObjectOAMRuleList">
+import type { FormInstance, FormRules } from 'element-plus'
+import { ElMessage } from 'element-plus'
+import { createObjectOAMRule, deleteObjectOAMRuleById, getObjectOAMRuleListByOamId, updateObjectOAMRule } from '@/api/biz/bizObjectOAMRuleApi'
+const props = withDefaults(defineProps<{
+  bizId: number
+  objectId: number
+  oamId: number
+}>(), {
+  bizId: 0,
+  objectId: 0,
+  oamId: 0,
+})
+
+const bizId = props.bizId
+const objectId = props.objectId
+const oamId = props.oamId
+
+interface ObjectOAMRule {
+  bizId: number
+  objectId: number
+  oamId: number
+  orId: number
+  ruleId: number
+  ruleTitle: string
+  targetAttrId: number
+  targetAttrTitle: string
+  targetAttrCode: string
+  sortNo: number
+  isEdit: boolean
+}
+
+// 数据
+const state = reactive({
+  title: '',
+  dialogVisible: false,
+  loading: false,
+  conditions: {
+    keywords: '',
+    bizId: props.bizId,
+    objectId: props.objectId,
+    oamId: props.oamId,
+  },
+  dataList: [] as ObjectOAMRule[],
+  actionType: 1,
+})
+
+const formRef = ref<FormInstance>()
+const formRules = reactive<FormRules>({
+  mappingModelId: [
+    { required: true, message: '请输入数据模型', trigger: 'blur' },
+  ],
+  mappingObjectId: [
+    { required: true, message: '请输入对象', trigger: 'blur' },
+  ],
+  mappingObjectOAM: [
+    { required: true, message: '请输入对像行为', trigger: 'blur' },
+  ],
+})
+
+// 查询数据
+const getData = async () => {
+  state.loading = true
+  const { bizId, objectId, oamId } = state.conditions
+  const { data } = await getObjectOAMRuleListByOamId(bizId, objectId, oamId)
+  state.loading = false
+  state.dataList = data
+  data.forEach((m: ObjectOAMRule) => {
+    m.isEdit = false
+  })
+}
+
+const ruleTableRef = ref()
+const ruleTableKey = ref(0)
+
+function onParamAdd() {
+  state.dataList.push({
+    bizId,
+    objectId,
+    oamId,
+    orId: 0,
+    ruleId: 0,
+    ruleTitle: '',
+    targetAttrId: 0,
+    targetAttrTitle: '',
+    targetAttrCode: '',
+    sortNo: 1,
+    isEdit: true,
+  })
+  state.actionType = 1
+}
+
+function onRuleEdit(row: any) {
+  row.isEdit = true
+  state.actionType = 2
+}
+
+async function onRuleDelete(row: any) {
+  const orId = row.orId
+  await deleteObjectOAMRuleById(bizId, objectId, oamId, orId)
+  ElMessage.success('删除成功')
+}
+
+function onRuleCancel(row: any, index: number) {
+  row.isEdit = false
+  if (state.actionType === 1) {
+    state.dataList.splice(index, 1)
+  }
+  state.actionType = 0
+}
+
+async function onRuleSave(row: any) {
+  row.isEdit = false
+  if (state.actionType === 1) {
+    await createObjectOAMRule(row)
+    state.dialogVisible = false
+    ElMessage.success('新增成功')
+  }
+  else {
+    await updateObjectOAMRule(row)
+    state.dialogVisible = false
+    ElMessage.success('修改成功')
+  }
+}
+
+onMounted(() => {
+  // getData()
+  // nextTick(() => {
+  // })
+})
+</script>
+
+<template>
+  <div class="container">
+    <tool-bar>
+      <template #left>
+        <h5>业务规则</h5>
+      </template>
+      <template #right>
+        <el-input placeholder="请输入关键词筛选" clearable style="width: 200px;" />
+        <el-button style="margin-left:10px" @click="getData">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:search" />
+            </el-icon>
+          </template>
+        </el-button>
+
+        <el-button type="default" @click="onParamAdd">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:plus" />
+            </el-icon>
+          </template>
+        </el-button>
+      </template>
+    </tool-bar>
+
+    <el-table ref="mappingTableRef" :key="ruleTableKey" :data="state.dataList" class="list-table" size="small" border stripe highlight-current-row>
+      <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
+
+      <el-table-column label="业务规则" header-align="center" align="center" width="200">
+        <template #default="scope">
+          <biz-rule-selector v-if="scope.row.isEdit" v-model="scope.row.ruleId" size="small" />
+          <span v-else>{{ scope.row.ruleTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="应用属性" header-align="center" align="center" width="200">
+        <template #default="scope">
+          <biz-object-attr-selector v-if="scope.row.isEdit" v-model="scope.row.targetAttrId" size="small" />
+          <span v-else>{{ scope.row.targetAttrTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column header-align="center" align="center" width="70">
+        <template #header>
+          排序
+        </template>
+        <template #default>
+          <el-tag type="info" class="sortable">
+            <el-icon>
+              <svg-icon name="i-ep:d-caret" />
+            </el-icon>
+          </el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" width="140" align="center">
+        <template #default="scope">
+          <template v-if="scope.row.isEdit">
+            <el-button type="primary" plain size="small" @click="onRuleSave(scope.row)">
+              保存
+            </el-button>
+            <el-button type="primary" plain size="small" @click="onRuleCancel(scope.row, scope.$index)">
+              取消
+            </el-button>
+          </template>
+          <template v-else>
+            <el-button type="primary" plain size="small" @click="onRuleEdit(scope.row)">
+              编辑
+            </el-button>
+            <el-popconfirm title="是否要删除此行?" style="margin-left: 10px;" @confirm="onRuleDelete(scope.row)">
+              <template #reference>
+                <el-button type="danger" plain size="small">
+                  删除
+                </el-button>
+              </template>
+            </el-popconfirm>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.page-main {
+  :deep(.el-table) {
+    height: 100%;
+
+    .el-table__row {
+      .index {
+        display: inline-block;
+      }
+
+      .delete {
+        display: none;
+      }
+
+      &:hover {
+        .index {
+          display: none;
+        }
+
+        .delete {
+          display: inline-block;
+        }
+      }
+    }
+  }
+  h5{
+    padding: 0;
+    margin: 0;
+  }
+}
+</style>

+ 1 - 3
src/views/biz/mapping/index.vue → src/views/biz/object/components/ObjectMapping.vue

@@ -5,10 +5,9 @@ meta:
 
 <script lang="ts" setup name="BizObjectMappingList">
 import { ElMessage } from 'element-plus'
-import ModelObjectSelector from '@/views/biz/mapping/components/ModelObjectSelector.vue'
 import {
   deleteObjectMappingById,
-  getObjectAttrListById, getObjectMappingByList,
+  getObjectAttrListById,
 } from '@/api/biz/bizObjectMappingApi'
 const props = withDefaults(defineProps<{
   bizId: number
@@ -125,7 +124,6 @@ onMounted(() => {
         </el-table-column>
       </el-table>
     </div>
-    <ModelObjectSelector ref="modelObjectSelector" @success="getData" />
   </div>
 </template>
 

+ 2 - 2
src/views/biz/object/index.vue

@@ -5,8 +5,8 @@ meta:
 
 <script lang="ts" setup name="bizObjectDetails">
 import type { TabsPaneContext } from 'element-plus'
-import BizObjectAttrListComponent from '../attr/index.vue'
-import BizObjectMappingListComponent from '../mapping/index.vue'
+import BizObjectAttrListComponent from '../object_attr/index.vue'
+import BizObjectMappingListComponent from './components/ObjectMapping.vue'
 import BizObjectComponent from '@/views/biz/object/components/Object.vue'
 import { getObjectById } from '@/api/biz/bizObjectApi'
 import useSettingsStore from '@/store/modules/settings'

+ 0 - 0
src/views/biz/attr/components/AttrList.vue → src/views/biz/object_attr/components/AttrList.vue


+ 0 - 0
src/views/biz/attr/index.vue → src/views/biz/object_attr/index.vue