function.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /**
  2. * 生成拖拽表和关联表的 SQL
  3. * @param tableList 拖拽表数据
  4. * @param rangeFilterList 数据范围
  5. * @param addEditData 添加表单数据
  6. * @returns string
  7. */
  8. export function generateSql(tableList: any[] = [], rangeFilterList: any[] = [], addEditData: addEditDataType) {
  9. // 添加表明前缀
  10. const alphabet = 'abcdefghijklmnopqrstuvwxyz';
  11. addEditData.mindMapJSON.selectNodes.forEach((obj, index) => {
  12. obj.data.seqPrefix = alphabet[index % 26]; // 通过取余处理
  13. });
  14. // 用到的那些表
  15. const list = filterTableData(tableList, rangeFilterList, addEditData)
  16. const tableSqlList = generateDragAndDropTableSql(list, tableList)
  17. const relationshipSqlList = associationRelationshipArray(addEditData.mindMapJSON.selectNodes, list)
  18. // 生成拖拽表 SQL
  19. const tableSqlStr = `select ${tableSqlList.map(item => `${item.seqPrefix}.${item.columnName} as '${item.columnComment}'`).join(', ')}`
  20. // 生成关联关系 SQL
  21. const relationshipTableSqlStr = relationshipSqlList.map(item => item.paragraphSql).join(' ')
  22. console.log(tableSqlStr, '<======= 表格SQL')
  23. console.log(relationshipTableSqlStr, '<======= 关联关系SQL')
  24. return `${tableSqlStr} ${relationshipTableSqlStr}`
  25. }
  26. /**
  27. * 生成数据范围 SQL
  28. * @param rangeFilterList 数据范围数据
  29. * @param addEditData 新建表单页面数据
  30. * @returns string
  31. */
  32. export function rangeGetSql(rangeFilterList: any[] = [], addEditData: addEditDataType) {
  33. const alphabet = 'abcdefghijklmnopqrstuvwxyz';
  34. addEditData.mindMapJSON.selectNodes.forEach((obj, index) => {
  35. obj.data.seqPrefix = alphabet[index % 26]; // 通过取余处理
  36. });
  37. const nodes = addEditData.mindMapJSON.selectNodes.map(item => item.data)
  38. const list = rangeFilterList.filter(item => item.filterValueThree)
  39. const newList = list.map((item) => {
  40. let sql = ''
  41. const seqPrefix = nodes.find(node => node.tblName == item.tableName).seqPrefix
  42. // 自定义日期筛选条件
  43. if(['datetime', 'timetamp', 'timestamp'].includes(item.dataType) && item.filterValueTwo == '自定义' && !item.valueFlag) {
  44. const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
  45. sql = templateItem.sql.replace(/表别名/g, seqPrefix)
  46. .replace(/字段名称/g, item.columnName)
  47. .replace(/值1/g, item.filterValueThree[0])
  48. .replace(/值2/g, item.filterValueThree[1]);
  49. }
  50. // 普通日期筛选条件
  51. if(['datetime', 'timetamp', 'timestamp'].includes(item.dataType) && item.filterValueTwo != '自定义' && !item.valueFlag) {
  52. const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
  53. sql = templateItem.sql.replace(/表别名/g, seqPrefix)
  54. .replace(/字段名称/g, item.columnName)
  55. .replace(/值/g, item.filterValueThree)
  56. }
  57. // 文本框
  58. if(['varchar', 'text'].includes(item.dataType) && !item.valueFlag) {
  59. const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
  60. sql = `${seqPrefix}.${item.columnName} ${templateItem.sql} concat('%','${item.filterValueThree}','%')`
  61. }
  62. // 数字输入框
  63. if(['decimal', 'int'].includes(item.dataType) && !item.valueFlag) {
  64. const templateItem = (item.list || []).find((em: any) => em.value == item.filterValueTwo)
  65. sql = templateItem.sql.replace(/表别名/g, seqPrefix)
  66. .replace(/字段名称/g, item.columnName)
  67. .replace(/值/g, item.filterValueThree)
  68. }
  69. // 下拉框
  70. if(item.valueFlag) {
  71. sql = `${seqPrefix}.${item.columnName} = '${item.filterValueThree}`
  72. }
  73. return {
  74. ...item,
  75. strSQL: sql
  76. }
  77. })
  78. return `where ${newList.map((item: any) => item.strSQL).join(' and ')}`
  79. }
  80. /**
  81. * 生成关联关系 SQL 的数组
  82. * @param nodes 节点数据
  83. * @param list 用到的那些表
  84. * @returns Array
  85. */
  86. function associationRelationshipArray(nodes: any[] = [], _list: any[]) {
  87. const nodeList = nodes.map(item => item.data)
  88. const mainTable = nodeList.filter(item => item.seqPrefix == 'a').map(item => {
  89. return {
  90. ...item,
  91. paragraphSql: `from ${item.tblName} ${item.seqPrefix}`
  92. }
  93. })
  94. const newList = nodeList.filter(item => item.seqPrefix != 'a')
  95. const sqlList = newList.map(item => {
  96. const strSeqPrefix = nodeList.find(node => node.tblName == item.fromTbl).seqPrefix
  97. let strSql = `left join ${item.toTbl} ${item.seqPrefix} on ${strSeqPrefix}.${item.fromCol} = ${item.seqPrefix}.${item.toCol}`
  98. if(item.toTbl == 'sys_dict') {
  99. strSql = strSql + ` and ${item.seqPrefix}.code = '${item.dictCode}'`
  100. }
  101. item.paragraphSql = strSql
  102. return item
  103. })
  104. return [...mainTable, ...sqlList]
  105. }
  106. /**
  107. * 生成拖拽表 SQL 的数组
  108. * @param list 用到的那些表
  109. * @param tableList 拖拽表数据
  110. * @returns Array
  111. */
  112. function generateDragAndDropTableSql(list: any[] = [], tableList: any[] = []) {
  113. const result = tableList.filter(item1 => {
  114. return list.some(item2 => item2.tblName === item1.tableName);
  115. }).map(item1 => {
  116. const matchedItem2 = list.find(item2 => `${item2.tblName}_${item2.dictCode}` === `${item1.tableName}_${item1.dictCode}`);
  117. const matchedItem2s = list.find(item2 => item2.tblName === item1.tableName);
  118. return {
  119. seqPrefix: matchedItem2?.seqPrefix || matchedItem2s.seqPrefix,
  120. tblName: matchedItem2?.tblName || matchedItem2s.seqPrefix,
  121. columnComment: item1.columnComment,
  122. columnName: item1.columnName
  123. };
  124. });
  125. return result
  126. }
  127. /**
  128. * 过滤数据中所用到的表数据
  129. * @param tableList 拖拽表数据
  130. * @param rangeFilterList 数据范围数据
  131. * @param addEditData 新建表单页面数据
  132. * @returns Array
  133. */
  134. function filterTableData(tableList: any[] = [], rangeFilterList: any[] = [], addEditData: addEditDataType) {
  135. // 所有节点表数据
  136. const nodesAllDataList = addEditData.mindMapJSON.selectNodes.map(item => item.data)
  137. // tableList 所用到的表数据
  138. const tableNodesDataList = nodesAllDataList.filter(item1 =>
  139. tableList.some(item2 => item1.tblName === item2.tableName)
  140. );
  141. // rangeFilter 所用到的表数据
  142. const rangeFilterNodesDataList = nodesAllDataList.filter(item1 =>
  143. rangeFilterList.some(item2 => item1.tblName === item2.tableName)
  144. );
  145. // 所用到的表数据
  146. const tableUsedList = [...new Set([...tableNodesDataList, ...rangeFilterNodesDataList].filter(item => item.tblName))]
  147. return tableUsedList || []
  148. }