Commit 28d372fc authored by 曹泽华's avatar 曹泽华

数仓规划 物理模型

parent 8e044c3d
......@@ -5,6 +5,7 @@
treeWrapperClassName="h-[calc(100%-35px)] overflow-auto"
:clickRowToExpand="true"
:defaultExpandAll="true"
:checkable="prop.checkable"
:treeData="treeData"
:fieldNames="{ key: 'businessId', title: 'modelName' }"
@select="handleSelect"
......@@ -20,7 +21,12 @@
defineOptions({ name: 'DeptTree' });
const emit = defineEmits(['select']);
const prop = defineProps({
checkable: {
type: Boolean,
default: false,
},
});
const treeData = ref<TreeItem[]>([]);
const treeRef = ref<Nullable<TreeActionType>>(null);
function getTree() {
......
......@@ -7,21 +7,19 @@
:title="getTitle"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
<div class="modalBody">
<div class="title">导入文件选择</div>
<a-button style="margin-right: 10px">下载模板</a-button>
<a-button style="margin-right: 10px" type="primary">选择文件</a-button>
<div style="width: 200px">只能导入单个Excel文件,且单次导入不超过100000条数据</div>
</div>
<BasicForm @register="registerForm">
<template #fileMethods="{ model, field }">
<div style="display: flex">
<div>
<span style="padding-right: 20px">文件重名</span>
<RadioGroup v-model:value="value" name="radioGroup">
<Radio value="1">全部放弃</Radio>
<Radio value="2">全部替换</Radio>
<Radio value="3">自动重命名</Radio>
</RadioGroup>
<a-button>下载模板</a-button>
<a-button type="primary" style="margin-left: 5px">选择文件</a-button>
</div>
<div style="width: 200px; margin-top: -6px; margin-left: 5px"
>只能导入单个Excel文件,且单次导入不超过100000条数据</div
>
</div>
</template>
</BasicForm>
</BasicModal>
</template>
<script lang="ts" setup>
......
......@@ -10,18 +10,17 @@
<template #toolbar>
<a-button type="primary">建表记录</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0">批量建表</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0">设为待发布</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0" @click="handleWaitUpload">设为待发布</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0">发布</a-button>
<a-button type="primary">从元数据导入</a-button>
<a-button type="primary" @click="handleBaseImport">从元数据导入</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0">导出</a-button>
<a-button type="primary" @click="handleImport">导入</a-button>
<a-button type="primary" @click="handleCreateFolder">新建文件夹</a-button>
<a-button type="primary" @click="handleCreateFile">新建文件</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0" @click="handleDelete">删除</a-button>
<a-button type="primary" :disabled="getRowSelection().selectedRowKeys <=0" @click="handleDelete(record)">删除</a-button>
<RadioButtonGroup
@change="changeTable"
:options="labelName"
@click="changeTable()"
v-model:value="state"
/>
</template>
......@@ -55,6 +54,7 @@
<ModelModal @register="registerModal" @success="handleSuccess" />
<ImportModal @register="registerImport" />
<ModelAdd @register="registerModalAdd" />
<BaseImport @register="registerBaseImport" />
</PageWrapper>
</template>
<script lang="ts" setup>
......@@ -67,6 +67,7 @@
import ModelModal from './modelModal.vue';
import ImportModal from './importModal.vue';
import ModelAdd from './modelAdd.vue';
import BaseImport from './modelBaseImport.vue';
import { columnsData, columnsSystem, searchFormSchema } from './model.data';
import { useGo } from '@/hooks/web/usePage';
import { useRoute, onBeforeRouteLeave, useRouter } from 'vue-router';
......@@ -76,10 +77,11 @@
import RadioButtonGroup from '@/components/Form/src/components/RadioButtonGroup.vue';
const { push } = useRouter();
let baseImport = ref(false);
const state = ref('系统视图');
const labelName = ['数据视图', '系统视图'];
defineOptions({ name: 'AccountManagement' });
const { createMessage } = useMessage();
const { createMessage, createConfirm } = useMessage();
const filterStore = useFilterStore();
const route = useRoute();
const go = useGo();
......@@ -88,6 +90,7 @@
const [registerImport, { openModal: openImportModal }] = useModal();
const [registerModalAdd, { openModal: openModalAdd }] = useModal();
const [registerMoveUser, { openModal: openMoveUserModal }] = useModal();
const [registerBaseImport, { openModal: openBaseImportUserModal }] = useModal();
const searchInfo = reactive<Recordable>({});
const tableData = ref([]);
const [
......@@ -162,6 +165,14 @@
});
}
/** 从元数据导入*/
function handleBaseImport() {
baseImport.value = true;
openBaseImportUserModal(true, {
isUpdate: false,
});
}
/** 新建文件夹*/
function handleCreateFolder() {
openModalAdd(true, {
......@@ -210,12 +221,14 @@
/** 删除按钮*/
function handleDelete(record: Recordable) {
tableData.value.splice(
tableData.value.findIndex((item) => item.businessId === record.businessId),
1,
);
createMessage.success('删除成功!');
reload();
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '确认批量删除选中数据吗?',
onOk() {
createMessage.success('批量删除成功!');
},
});
}
/** 新增/编辑成功*/
......@@ -246,6 +259,21 @@
reload();
}
/**
* 设为待发布
*/
function handleWaitUpload() {
createConfirm({
iconType: 'success',
title: '设为待发布成功',
okText: '发布',
content: '设为待发布成功,是否选择发布?',
onOk() {
createMessage.success('发布成功!');
},
});
}
function handleView(record: Recordable) {
go('/system/account_detail/' + record.id);
}
......
import { BasicColumn, FormSchema } from '@/components/Table';
import {selectProps} from "ant-design-vue/es/select";
export const columnsSystem: BasicColumn[] = [
{
......@@ -128,13 +129,64 @@ export const importSchema: any[] = [
field: 'fileType',
label: '导入文件类型',
component: 'Select',
colProps: { lg: 24, md: 24 },
componentProps: {
options: [
{ label: 'Excel', value: 'Excel' },
{ label: 'Word', value: 'Word' },
{ label: 'Erwin(.xml)', value: '1' },
{ label: 'PowerDesigner(.ldm)', value: '2' },
{ label: 'Excel(.xlsx)', value: '3' },
],
},
},
{
field: 'fileMethods',
label: '导入文件选择',
slot: 'fileMethods',
colProps: { lg: 24, md: 24 },
},
{
field: 'fileRename',
label: '文件重名',
component: 'RadioGroup',
required: true,
colProps: { lg: 24, md: 24 },
componentProps: {
options: [
{ label: '全部放弃', value: '1' },
{ label: '全部替换', value: '2' },
{ label: '自动重命名', value: '3' },
],
},
},
];
export const baseImportSchema: any[] = [
{
field: 'modelId',
label: '导入路径',
component: 'TreeSelect',
colProps: { lg: 24, md: 24 },
componentProps: {
fieldNames: {
label: 'modelName',
value: 'businessId',
},
getPopupContainer: () => document.body,
},
},
{
field: 'fileRename',
label: '文件重名',
component: 'RadioGroup',
required: true,
colProps: { lg: 24, md: 24 },
componentProps: {
options: [
{ label: '全部放弃', value: '1' },
{ label: '全部替换', value: '2' },
{ label: '自动重命名', value: '3' },
],
},
},
];
/**查询表单*/
......@@ -167,6 +219,7 @@ export const searchFormSchema: FormSchema[] = [
label: ' ',
component: 'Select',
componentProps: {
mode: 'multiple',
placeholder: '调试状态',
options: [
{ label: '未调试', value: '未调试' },
......@@ -218,7 +271,7 @@ export const physicalModelFormSchema: any[] = [
},
];
/**新建文件*/
/**新建文件*/
export const physicalModelAdd: any[] = [
{
field: 'modelId',
......
<template>
<BasicModal
min-height="100"
width="30%"
v-bind="$attrs"
@register="registerBaseImport"
:title="getTitle"
@ok="handleSubmit"
>
<ModelTree :checkable="true" />
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { Radio, RadioGroup } from 'ant-design-vue';
import { ref, computed, unref, reactive } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
// import { formSchema } from './gradingResults.data';
import Icon from '@/components/Icon/Icon.vue';
import { useMessage } from '@/hooks/web/useMessage';
import { baseImportSchema } from '@/views/dataWarehousePlanning/physicalModel/model.data';
import ModelTree from '@/views/dataWarehousePlanning/physicalModel/ModelTree.vue';
import { PageWrapper } from '@/components/Page';
import { BasicTree } from '@/components/Tree';
defineOptions({ name: 'ImportModal' });
const emit = defineEmits(['success', 'register']);
const { createMessage } = useMessage();
const isUpdate = ref(true);
const rowId = ref('');
const value = ref<string>('1');
//获取接口数据并放在下拉框里(这里是打开了一个弹框)
//初始化表单
const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
labelWidth: 100,
baseColProps: { lg: 24, md: 24 },
schemas: baseImportSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
//初始化弹框
const [registerBaseImport, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
// 通过id获取行详情信息
// 塞值
setFieldsValue({
...data.record,
});
}
});
const getTitle = computed(() => '从元数据导入');
async function handleSubmit() {
try {
const values = await validate();
setModalProps({ confirmLoading: true });
// TODO custom api
closeModal();
emit('success', { isUpdate: unref(isUpdate), values: { ...values, id: rowId.value } });
} finally {
setModalProps({ confirmLoading: false });
}
}
</script>
<style lang="scss" scoped>
.modalBody {
display: flex;
align-items: center;
.title {
padding-right: 15px;
}
}
</style>
......@@ -154,8 +154,6 @@ export const TreeData: any[] = [
},
];
export const editTableData: any[] = [
{
businessId: 1,
......
......@@ -7,16 +7,14 @@
import { reactive, onMounted, ref, defineProps } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { useRoute, onBeforeRouteLeave, useRouter } from 'vue-router';
import { entityColumns, entityFormSchema, locailColumns } from './model.data';
import {entityColumns, entityFormSchema, locailColumns, PhysicalColumns} from './model.data';
import { useFilterStore } from '@/store/modules/filterData';
import { TreeData } from '@/views/dataWarehousePlanning/logicalModel/modelData';
import {
entityData,
logcialModel,
} from '@/views/dataWarehousePlanning/logicalModel/modelDetail/modelData';
import EntityModel from './entityModel.vue';
import { useModal } from '@/components/Modal';
import { DeleteTwoTone, PlusCircleTwoTone } from '@ant-design/icons-vue';
import {
locailData, PhysicalData,
sqlDevelopData
} from "@/views/dataWarehousePlanning/physicalModel/modelDetail/modelData";
const { push } = useRouter();
......@@ -69,16 +67,16 @@
pageNu: '1',
pageSize: '10',
pages: '1',
total: logcialModel.length,
total: PhysicalData.length,
code: '',
message: '',
data: logcialModel,
data: PhysicalData,
};
return { ...response };
},
rowKey: 'businessId',
// 列
columns: locailColumns,
columns: PhysicalColumns,
showIndexColumn: false,
rowSelection: false,
pagination: false,
......
......@@ -43,7 +43,7 @@ export const entityColumns: BasicColumn[] = [
},
];
export const locailColumns: BasicColumn[] = [
export const PhysicalColumns: BasicColumn[] = [
{
title: '名称',
dataIndex: 'name',
......@@ -120,119 +120,6 @@ export const entityFormSchema: FormSchema[] = [
colProps: { span: 4 },
},
];
export const connectionTable: BasicColumn[] = [
{
title: '名称',
dataIndex: 'name',
width: 150,
// onEditRow: true,
},
{
title: '父实体名称',
dataIndex: 'fatherName',
width: 150,
// onEditRow: true,
},
{
title: '父实体属性PK',
dataIndex: 'fatherPK',
width: 150,
// onEditRow: true,
},
{
title: '父端基数',
dataIndex: 'fatherNum',
width: 150,
// onEditRow: true,
},
{
title: '子实体名称',
dataIndex: 'sonName',
width: 150,
},
{
title: '子实体属性PK',
dataIndex: 'sonPK',
width: 150,
},
{
title: '子端基数',
dataIndex: 'sonNum',
width: 150,
},
];
export const connectionFormSchema: FormSchema[] = [
{
field: 'name',
component: 'Input',
componentProps: {
placeholder: '输入关联关系名称搜索',
},
colProps: { span: 4 },
},
];
export const crossTable: BasicColumn[] = [
{
title: '名称',
dataIndex: 'name',
width: 150,
// onEditRow: true,
},
{
title: '父逻辑模型名称',
dataIndex: 'fatherModelName',
width: 150,
// onEditRow: true,
},
{
title: '父实体名称',
dataIndex: 'fatherName',
width: 150,
// onEditRow: true,
},
{
title: '父实体属性PK',
dataIndex: 'fatherPK',
width: 150,
// onEditRow: true,
},
{
title: '父端基数',
dataIndex: 'fatherNum',
width: 150,
// onEditRow: true,
},
{
title: '子逻辑模型名称',
dataIndex: 'sonModelName',
width: 150,
},
{
title: '子实体名称',
dataIndex: 'sonName',
width: 150,
},
{
title: '子实体属性PK',
dataIndex: 'sonPK',
width: 150,
},
{
title: '子端基数',
dataIndex: 'sonNum',
width: 150,
},
];
export const crossFormSchema: FormSchema[] = [
{
field: 'name',
component: 'Input',
componentProps: {
placeholder: '输入关联关系名称搜索',
},
colProps: { span: 4 },
},
];
export const modelFormSchema: any[] = [
{
field: 'modelId',
......
import { FormSchema } from '@/components/Form';
import {BasicColumn} from "@/components/Table";
import { BasicColumn } from '@/components/Table';
import {PhysicalColumns} from "@/views/dataWarehousePlanning/physicalModel/modelDetail/model.data";
export const infoData = {
dataBase: '测试类型',
......@@ -37,66 +38,40 @@ export const searchFormSchema: FormSchema[] = [
];
export const entityData: any[] = [
{
businessId: '1',
name: 'dw_产品合约行情历史',
txt: 'dw_产品合约行情历史',
engName: 'dw_prd_contract_quot_h_s',
person: 'admin',
deptName: '机构管理/数据平台治理部',
name: 'yLtable_orc01',
dataBase: 'INCEPTOR',
modelId: '/sdfasdf/y_test/yl_table_orc01',
relateTime: '2023/10/20 17:38:29',
syncTime: '2024-11-01 13:44:16',
operateName: 'user',
},
{
businessId: '2',
name: 'dw_合约',
txt: 'dw_合约',
engName: 'dw_prd_contract_f',
person: 'admin',
deptName: '机构管理/数据平台治理部',
name: 'pltable_yca12',
dataBase: 'INCEPTOR',
modelId: '/sdfasdf/y_test/pltable_yca12',
relateTime: '2023/12/30 12:21:09',
syncTime: '2024-02-11 10:14:16',
operateName: 'user',
},
];
export const connectionData: any[] = [
{
name: '合约_行情',
fatherName: 'dw_合约',
fatherPK: '合约号',
fatherNum: '1',
sonName: 'dw_产品合约行情历史',
sonPK: '合约号',
sonNum: '1',
},
{
name: '合约_行情',
fatherName: 'dw_合约',
fatherPK: '合约号',
fatherNum: '1',
sonName: 'dw_产品合约行情历史',
sonPK: '合约号',
sonNum: '1',
},
{
name: '合约_行情',
fatherName: 'dw_合约',
fatherPK: '合约号',
fatherNum: '1',
sonName: 'dw_产品合约行情历史',
sonPK: '合约号',
sonNum: '1',
},
export const PhysicalData: any[] = [
{
name: '合约_行情',
fatherName: 'dw_合约',
fatherPK: '合约号',
fatherNum: '1',
sonName: 'dw_产品合约行情历史',
sonPK: '合约号',
sonNum: '1',
name: '逻辑模型1',
entityName: 'dwEntity',
modelId: '物理模型/共享工作区/1/test编镜',
relateDescribe: 'admin',
relateTime: '2024-10-20 12:14:46',
operateName: 'admin',
},
];
export const sqlDevelopData: any[] = [
{
name: '合约_行情',
fatherName: 'dw_合约',
fatherPK: '合约号',
fatherNum: '1',
sonName: 'dw_产品合约行情历史',
sonPK: '合约号',
sonNum: '1',
name: 'employee',
modelId: '/共享工作区/employee',
relateDescribe: '-',
relateTime: '2023-10-20 17:38:38',
operateName: 'admin',
},
];
<template>
<BasicModal
min-height="100"
width="30%"
min-height="200"
width="32%"
v-bind="$attrs"
@register="registerModal"
:title="getTitle"
@ok="handleSubmit"
>
<div style="width: 100%; height: 100%">
<img src="../../../../assets/images/debug.png" />
</div>
</BasicModal>
</template>
<script lang="ts" setup>
import { Radio, RadioGroup } from 'ant-design-vue';
import { ref, computed, unref, reactive } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
// import { formSchema } from './gradingResults.data';
import Icon from '@/components/Icon/Icon.vue';
import { useMessage } from '@/hooks/web/useMessage';
import { importSchema } from '@/views/dataWarehousePlanning/physicalModel/model.data';
import { ref, computed, unref, reactive } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
defineOptions({ name: 'DebugModal' });
defineOptions({ name: 'DebugModal' });
const emit = defineEmits(['success', 'register']);
const { createMessage } = useMessage();
const isUpdate = ref(true);
const rowId = ref('');
const value = ref<string>('1');
//获取接口数据并放在下拉框里(这里是打开了一个弹框)
//初始化表单
const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
labelWidth: 100,
baseColProps: { lg: 24, md: 24 },
schemas: importSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
//初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
const isUpdate = ref(true);
//获取接口数据并放在下拉框里(这里是打开了一个弹框)
//初始化表单
//初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({
confirmLoading: false,
height: 420,
});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
// 通过id获取行详情信息
// 塞值
setFieldsValue({
...data.record,
});
}
});
const getTitle = computed(() => '建表调试日志');
async function handleSubmit() {
try {
const values = await validate();
setModalProps({ confirmLoading: true });
// TODO custom api
closeModal();
emit('success', { isUpdate: unref(isUpdate), values: { ...values, id: rowId.value } });
} finally {
setModalProps({ confirmLoading: false });
}
}
const getTitle = computed(() => '建表调试日志');
</script>
<style lang="scss" scoped>
.modalBody {
display: flex;
align-items: center;
.title {
padding-right: 15px;
.erchart-img {
height: 100px;
}
}
</style>
......@@ -37,8 +37,8 @@
import { entityColumns, entityFormSchema } from './model.data';
import { useFilterStore } from '@/store/modules/filterData';
import Icon from '@/components/Icon/Icon.vue';
import { TreeData } from '@/views/dataWarehousePlanning/logicalModel/modelData';
import { entityData } from '@/views/dataWarehousePlanning/logicalModel/modelDetail/modelData';
import { TreeData } from '@/views/dataWarehousePlanning/physicalModel/modelData';
import { entityData } from '@/views/dataWarehousePlanning/physicalModel/modelDetail/modelData';
import EntityModel from './entityModel.vue';
import { useModal } from '@/components/Modal';
......
......@@ -39,12 +39,11 @@
import { useRoute, onBeforeRouteLeave, useRouter } from 'vue-router';
import { entityColumns, entityFormSchema, SqlDevelopColumns } from './model.data';
import { useFilterStore } from '@/store/modules/filterData';
import { TreeData } from '@/views/dataWarehousePlanning/logicalModel/modelData';
import { TreeData } from '@/views/dataWarehousePlanning/physicalModel/modelData';
import {
entityData,
sqlDevelop,
} from '@/views/dataWarehousePlanning/logicalModel/modelDetail/modelData';
import EntityModel from './entityModel.vue';
sqlDevelopData,
} from '@/views/dataWarehousePlanning/physicalModel/modelDetail/modelData';
import { useModal } from '@/components/Modal';
import { DeleteTwoTone, PlusOutlined } from '@ant-design/icons-vue';
......@@ -66,7 +65,7 @@
function handleEntityEditModel(record: Recordable) {
// 跳转到详情
push({
path: '/dataWarehousePlanning/logicalModel/entity-detail',
path: '/dataWarehousePlanning/physicalModel/entity-detail',
query: record,
});
}
......@@ -99,10 +98,10 @@
pageNu: '1',
pageSize: '10',
pages: '1',
total: sqlDevelop.length,
total: sqlDevelopData.length,
code: '',
message: '',
data: sqlDevelop,
data: sqlDevelopData,
};
return { ...response };
},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment