| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /**
- * 生成拖拽表和关联表的 SQL
- * @param tableList 拖拽表数据
- * @param rangeFilterList 数据范围
- * @param addEditData 添加表单数据
- * @returns string
- */
- export function generateSql(tableList: any[] = [], rangeFilterList: any[] = [], addEditData: addEditDataType) {
- // 添加表明前缀
- const alphabet = 'abcdefghijklmnopqrstuvwxyz';
- addEditData.mindMapJSON.selectNodes.forEach((obj, index) => {
- obj.data.seqPrefix = alphabet[index % 26]; // 通过取余处理
- });
- // 用到的那些表
- const list = filterTableData(tableList, rangeFilterList, addEditData)
- const tableSqlList = generateDragAndDropTableSql(list, tableList)
- const relationshipSqlList = associationRelationshipArray(addEditData.mindMapJSON.selectNodes, list)
- // 生成拖拽表 SQL
- const tableSqlStr = `select ${tableSqlList.map(item => `${item.seqPrefix}.${item.columnName} as '${item.columnComment}'`).join(', ')}`
- // 生成关联关系 SQL
- const relationshipTableSqlStr = relationshipSqlList.map(item => item.paragraphSql).join(' ')
- console.log(tableSqlStr, '<======= 表格SQL')
- console.log(relationshipTableSqlStr, '<======= 关联关系SQL')
- return `${tableSqlStr} ${relationshipTableSqlStr}`
- }
- /**
- * 生成数据范围 SQL
- * @param rangeFilterList 数据范围数据
- * @param addEditData 新建表单页面数据
- * @returns string
- */
- export function rangeGetSql(rangeFilterList: any[] = [], addEditData: addEditDataType) {
- const alphabet = 'abcdefghijklmnopqrstuvwxyz';
- addEditData.mindMapJSON.selectNodes.forEach((obj, index) => {
- obj.data.seqPrefix = alphabet[index % 26]; // 通过取余处理
- });
- const nodes = addEditData.mindMapJSON.selectNodes.map(item => item.data)
- const list = rangeFilterList.filter(item => item.filterValueThree)
- const newList = list.map((item) => {
- let sql = ''
- const seqPrefix = nodes.find(node => node.tblName == item.tableName).seqPrefix
- // 自定义日期筛选条件
- if(['datetime', 'timetamp', 'timestamp'].includes(item.dataType) && item.filterValueTwo == '自定义' && !item.valueFlag) {
- const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
- sql = templateItem.sql.replace(/表别名/g, seqPrefix)
- .replace(/字段名称/g, item.columnName)
- .replace(/值1/g, item.filterValueThree[0])
- .replace(/值2/g, item.filterValueThree[1]);
- }
- // 普通日期筛选条件
- if(['datetime', 'timetamp', 'timestamp'].includes(item.dataType) && item.filterValueTwo != '自定义' && !item.valueFlag) {
- const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
- sql = templateItem.sql.replace(/表别名/g, seqPrefix)
- .replace(/字段名称/g, item.columnName)
- .replace(/值/g, item.filterValueThree)
- }
- // 文本框
- if(['varchar', 'text'].includes(item.dataType) && !item.valueFlag) {
- const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
- sql = `${seqPrefix}.${item.columnName} ${templateItem.sql} concat('%','${item.filterValueThree}','%')`
- }
- // 数字输入框
- if(['decimal', 'int'].includes(item.dataType) && !item.valueFlag) {
- const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
- sql = templateItem.sql.replace(/表别名/g, seqPrefix)
- .replace(/字段名称/g, item.columnName)
- .replace(/值/g, item.filterValueThree)
- }
- // 下拉框
- if(item.valueFlag) {
- sql = `${seqPrefix}.${item.columnName} = '${item.filterValueThree}'`
- }
- return {
- ...item,
- strSQL: sql
- }
- })
- return newList.length ? `where ${newList.map((item: any) => item.strSQL).join(' and ')}` : ''
- }
- /**
- * 根据数据范围生成需要转译的(人名,部门)的数组
- * @param addEditData 新建表单页面数据
- * @param rangeFilterList 数据范围
- * @returns Array
- */
- export function translatingArray(rangeFilterList: any[] = []) {
- // 只需要过滤出需要转译的(人名,部门)的数组
- const newRangeFilterList = rangeFilterList.filter(item => item.transType > 0 && item.filterValueThree)
- // const newRangeFilterList = rangeFilterList
- const list = newRangeFilterList.map((item: any) => {
- return {
- tblName: item.tableName,
- tblAlias: item.seqPrefix,
- colName: item.columnName,
- useVal: item.filterValueThree,
- transType: item.transType
- }
- })
- return list
- }
- /**
- * 生成关联关系 SQL 的数组
- * @param nodes 节点数据
- * @param list 用到的那些表
- * @returns Array
- */
- function associationRelationshipArray(nodes: any[] = [], _list: any[]) {
- const nodeList = nodes.map(item => item.data)
- const mainTable = nodeList.filter(item => item.seqPrefix == 'a').map(item => {
- return {
- ...item,
- paragraphSql: `from ${item.tblName} ${item.seqPrefix}`
- }
- })
- const newList = nodeList.filter(item => item.seqPrefix != 'a')
- const sqlList = newList.map(item => {
- const strSeqPrefix = nodeList.find(node => node.tblName == item.fromTbl).seqPrefix
- let strSql = `left join ${item.toTbl} ${item.seqPrefix} on ${strSeqPrefix}.${item.fromCol} = ${item.seqPrefix}.${item.toCol}`
- if(item.toTbl == 'sys_dict') {
- strSql = strSql + ` and ${item.seqPrefix}.code = '${item.dictCode}'`
- }
- item.paragraphSql = strSql
- return item
- })
- return [...mainTable, ...sqlList]
- }
- /**
- * 生成拖拽表 SQL 的数组
- * @param list 用到的那些表
- * @param tableList 拖拽表数据
- * @returns Array
- */
- function generateDragAndDropTableSql(list: any[] = [], tableList: any[] = []) {
- const result = tableList.filter(item1 => {
- return list.some(item2 => item2.tblName === item1.tableName);
- }).map(item1 => {
- const matchedItem2 = list.find(item2 => `${item2.tblName}_${item2.dictCode}` === `${item1.tableName}_${item1.dictCode}`);
- const matchedItem2s = list.find(item2 => item2.tblName === item1.tableName);
- return {
- seqPrefix: matchedItem2?.seqPrefix || matchedItem2s.seqPrefix,
- tblName: matchedItem2?.tblName || matchedItem2s.seqPrefix,
- columnComment: item1.columnComment,
- columnName: item1.columnName
- };
- });
- return result
- }
- /**
- * 过滤数据中所用到的表数据
- * @param tableList 拖拽表数据
- * @param rangeFilterList 数据范围数据
- * @param addEditData 新建表单页面数据
- * @returns Array
- */
- function filterTableData(tableList: any[] = [], rangeFilterList: any[] = [], addEditData: addEditDataType) {
- // 所有节点表数据
- const nodesAllDataList = addEditData.mindMapJSON.selectNodes.map(item => item.data)
- // tableList 所用到的表数据
- const tableNodesDataList = nodesAllDataList.filter(item1 =>
- tableList.some(item2 => item1.tblName === item2.tableName)
- );
- // rangeFilter 所用到的表数据
- const rangeFilterNodesDataList = nodesAllDataList.filter(item1 =>
- rangeFilterList.some(item2 => item1.tblName === item2.tableName)
- );
- // 所用到的表数据
- const tableUsedList = [...new Set([...tableNodesDataList, ...rangeFilterNodesDataList].filter(item => item.tblName))]
- return tableUsedList || []
- }
|