diff --git a/api/app/lib/controllers/metadataAcquisition/taskHandle.js b/api/app/lib/controllers/metadataAcquisition/taskHandle.js index fb1e5ee..4886a28 100644 --- a/api/app/lib/controllers/metadataAcquisition/taskHandle.js +++ b/api/app/lib/controllers/metadataAcquisition/taskHandle.js @@ -1,8 +1,10 @@ const Automate = require('sequelize-automate-freesun') const moment = require('moment'); - +//@toto删除数据库源时 同步删除该数据源资源目录树下元数据 +//数据源 数据库配置信息不能更改 若需更改则需要删除数据源重新配置 async function handleTask(app, task) { + const transaction = await app.fs.dc.orm.transaction(); try { const { models } = app.fs.dc const dataSource = await models.DataSource.findOne({ @@ -14,9 +16,7 @@ async function handleTask(app, task) { if (dataSource) { const dbOptions = createDbOptions(dataSource.config); const automate = new Automate(dbOptions, {}); - const tables = await automate.getTables() - - //创建或更新库元数据 + const tables = await automate.getTables(); const dataToSave = { code: dataSource.config.database, name: dataSource.config.database, @@ -28,16 +28,104 @@ async function handleTask(app, task) { createAt: moment(), updateAt: null, user: { id: 1, name: "超级管理员", username: "SuperAdmin" }, - attributesParam: null + attributesParam: null, + catalogKey: 'rc' } - // const databaseRslt = await models.MetadataDatabase.create(dataToSave) - //创建或更新表元数据 - //创建或更新字段&索引&外键元数据 - // MetadataDatabase - // console.log(databaseRslt) + //初始化数据 新增 数据库 表 字段索引外键数据 + let databaseFind = await models.MetadataDatabase.findOne({ + where: { + code: dataSource.config.database, + type: '库', + catalog: dataSource.mountPath, + }//目录树下库只会存在一个 判断是否有库类型元数据 没有则新增库和表元数据 有库数据则比较更新表类型元数据 全量更新字段索引数据 + }) + + if (databaseFind) { //更新表类型元数据 + const newTableNames = [] + Object.keys(tables).forEach(key => { newTableNames.push(key) }); + + //删除不存在表元数据 + await models.MetadataDatabase.destroy({ + where: { + name: { $notIn: newTableNames }, + type: '表', + catalog: dataSource.mountPath, + } + }) + + //录入新增的表元数据 + const metaDatabaseTables = await models.MetadataDatabase.findAll({ + where: { + type: '表', + catalog: dataSource.mountPath, + } + }) + + const tableBodys = [] + Object.keys(tables).forEach(table => { + if (!metaDatabaseTables.find(s => s.code == table)) { + dataToSave.parent = databaseFind.id; + dataToSave.name = table; + dataToSave.code = table; + dataToSave.type = '表'; + const tableObj = { ...dataToSave } + tableBodys.push(tableObj) + } + }); + await models.MetadataDatabase.bulkCreate(tableBodys, { returning: true }); + + } else { //新增库、表类型数据 + //库类型元数据存储 + const databaseRslt = await models.MetadataDatabase.create(dataToSave) + //表元数据存储 + if (databaseRslt && databaseRslt.id) { + const tableBodys = [] + Object.keys(tables).forEach(table => { + dataToSave.parent = databaseRslt.id; + dataToSave.name = table; + dataToSave.code = table; + dataToSave.type = '表'; + const tableObj = { ...dataToSave } + tableBodys.push(tableObj) + }); + await models.MetadataDatabase.bulkCreate(tableBodys, { returning: true }); + } + } + + const metaDatabaseTables = await models.MetadataDatabase.findAll({ + where: { + type: '表', + catalog: dataSource.mountPath, + } + }) + + //字段/索引/外键全量更新 先删除之前的字段 再录入新的数据 + await models.MetadataDatabase.destroy({ + where: { + type: { $in: ['字段', '索引', '外键'] }, + catalog: dataSource.mountPath, + } + }) + + const fieldBodys = [] + for (let table of metaDatabaseTables) { + Object.keys(tables[table.name].structures).forEach(key => { + dataToSave.parent = table.id; + dataToSave.name = tables[table.name].structures[key].comment || key; + dataToSave.code = key; + dataToSave.type = '字段'; + const tableObj = { ...dataToSave } + fieldBodys.push(tableObj) + }) + } + const fieldRslt = await models.MetadataDatabase.bulkCreate(fieldBodys); + if (fieldRslt) { + //日志记录 + } } } catch (error) { + await transaction.rollback(); app.fs.logger.error(`sechedule: handleTask, error: ${error}`); } }