소스 검색

feat: dataroom后端初始化提交

dataroom后端初始化提交
hong.yang 2 년 전
부모
커밋
4f933800ae
100개의 변경된 파일6269개의 추가작업 그리고 0개의 파일을 삭제
  1. 41 0
      DataRoom/.gitignore
  2. 38 0
      DataRoom/CONTRIBUTING.md
  3. 201 0
      DataRoom/LICENSE
  4. 135 0
      DataRoom/README.md
  5. 20 0
      DataRoom/SECURITY.md
  6. 202 0
      DataRoom/dataroom-core/pom.xml
  7. 28 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/DataRoomConfig.java
  8. 39 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/ObjectMapperConfiguration.java
  9. 43 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java
  10. 80 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/constant/DataRoomConst.java
  11. 214 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/constant/PageDesignConstant.java
  12. 45 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/controller/SuperController.java
  13. 14 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dao/DataRoomBaseDao.java
  14. 35 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dto/SearchDTO.java
  15. 19 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dto/SortField.java
  16. 35 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/entity/SuperEntity.java
  17. 66 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/exception/DataRoomGlobalExceptionHandler.java
  18. 32 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/exception/GlobalException.java
  19. 15 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/dao/PageDao.java
  20. 23 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/dto/BasePageDTO.java
  21. 68 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/PageEntity.java
  22. 63 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/type/BasePageDTOTypeHandler.java
  23. 100 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/service/IBasePageService.java
  24. 88 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java
  25. 14 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/BizComponentDao.java
  26. 20 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java
  27. 55 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentEntity.java
  28. 72 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/IBizComponentService.java
  29. 110 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java
  30. 78 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Btn.java
  31. 76 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Chart.java
  32. 55 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Field.java
  33. 22 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Filter.java
  34. 17 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/InParam.java
  35. 59 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Linkage.java
  36. 78 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/CustomComponentChart.java
  37. 91 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/RemoteComponentChart.java
  38. 90 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenBorderChart.java
  39. 80 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenButtonChart.java
  40. 37 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenCurrentTimeChart.java
  41. 59 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenDecorationChart.java
  42. 65 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenDigitalFlopChart.java
  43. 22 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenIframeChart.java
  44. 118 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenInputChart.java
  45. 51 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenLinkChart.java
  46. 86 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenMapChart.java
  47. 32 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenPictureChart.java
  48. 68 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenScrollBoardChart.java
  49. 42 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenScrollRankingChart.java
  50. 22 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenSvgsChart.java
  51. 87 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTablesChart.java
  52. 38 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTextChart.java
  53. 52 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTimeCountDownChart.java
  54. 36 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenVideoChart.java
  55. 17 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/datasource/BaseChartDataSource.java
  56. 95 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/datasource/DataSetDataSource.java
  57. 110 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/controller/ChartDataController.java
  58. 56 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/dto/ChartDataSearchDTO.java
  59. 267 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/service/BaseChartDataService.java
  60. 58 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/service/ChartMockData.java
  61. 69 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/vo/ChartDataVO.java
  62. 498 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/common/DbCommon.java
  63. 65 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/OracleTypes.java
  64. 144 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportConstant.java
  65. 34 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportDbType.java
  66. 64 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportLimit.java
  67. 49 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/CategoryTreeController.java
  68. 89 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DataSourceController.java
  69. 73 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DatasetController.java
  70. 57 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DatasetProcessController.java
  71. 59 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DsController.java
  72. 62 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/OriginalTableController.java
  73. 13 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/CategoryTreeDao.java
  74. 56 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasetDao.java
  75. 16 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasetProcessDao.java
  76. 14 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasourceConfigDao.java
  77. 13 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DsDao.java
  78. 14 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/OriginalTableDao.java
  79. 32 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DataSetQueryDto.java
  80. 22 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DataSourceDto.java
  81. 31 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DatasetParamDto.java
  82. 37 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DatasetProcessTestSearchDto.java
  83. 35 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/ExecuteDto.java
  84. 19 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/NameCheckRepeatDto.java
  85. 42 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/OriginalTableDto.java
  86. 48 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/CategoryTree.java
  87. 62 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasetEntity.java
  88. 88 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasetProcessEntity.java
  89. 99 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasourceConfig.java
  90. 59 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/OriginalTable.java
  91. 54 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/SqlConditionModel.java
  92. 44 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/ViewSqlProcessModel.java
  93. 38 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/CalculateFieldConfigModel.java
  94. 23 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/ChildrenFilter.java
  95. 29 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/ChildrenRelateModel.java
  96. 25 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/DataSourceInfoModel.java
  97. 34 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/FilterConditionModel.java
  98. 22 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/TableRelateModel.java
  99. 23 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/params/IParamsService.java
  100. 35 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/params/ParamsClient.java

+ 41 - 0
DataRoom/.gitignore

@@ -0,0 +1,41 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+# 忽略配置文件提交
+application-*.yml
+!application-demo.yml
+
+logs
+upload.sh
+

+ 38 - 0
DataRoom/CONTRIBUTING.md

@@ -0,0 +1,38 @@
+## 如何贡献
+
+感谢您对我们的项目感兴趣,并愿意为其做出贡献!以下是一些指南,帮助您开始:
+
+### 提交问题
+
+如果您在使用本项目时遇到了任何问题,请先查看现有的 Issue 列表以确认是否已经有人提出该问题。如果没有,请按照以下步骤提交新问题:
+
+1. 点击 Issues 标签页。
+2. 单击 New issue 按钮。
+3. 输入问题的标题和详细描述。
+4. 单击 Submit new issue 按钮。
+
+### 提交 Pull Request
+
+如果您希望修改代码或者添加新功能,可以通过提交 Pull Request 的方式进行。请按照以下步骤进行:
+
+1. Fork 本项目。
+2. 创建一个新分支,提交您的修改。
+3. 在您的 forked repository 页面上点击 New pull request 按钮。
+4. 输入您的 Pull Request 描述信息,并提交请求。
+
+### 代码规范
+
+我们非常注重代码风格和规范。为了保持代码的一致性和易读性,请遵循以下规则:
+
+- 使用 4 个空格缩进。
+- 行宽度不超过 80 个字符。
+- 函数和变量名使用下划线连接。
+
+### 社区行为准则
+
+我们希望社区成员能够遵守以下行为准则:
+
+- 尊重他人,不进行攻击、嘲讽等行为。
+- 积极参与社区活动,分享知识和经验。
+- 禁止发布任何形式的广告、垃圾邮件等信息。
+- 尊重知识产权,不侵犯他人的版权或专利等权益。

+ 201 - 0
DataRoom/LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 135 - 0
DataRoom/README.md

@@ -0,0 +1,135 @@
+## 📚简介
+<p align="center">
+	<img alt="logo" width="50" src="./doc/logo.png">
+</p>
+
+🔥基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器,具备大屏目录管理、大屏设计、大屏预览能力,支持MySQL、Oracle、PostgreSQL、JSON等数据集接入,对于复杂数据处理还可以使用Groovy脚本数据集,使用简单,完全免费,代码开源。
+
+<p align="center">
+    <img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/gcpaas/gc-starter-bigscreen?style=social">
+	<img alt="GitHub forks" src="https://img.shields.io/github/forks/gcpaas/gc-starter-bigscreen?style=social">
+	<img alt="GitHub license" src="https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg">
+    <img alt="Maven Central" src="https://img.shields.io/maven-central/v/com.gccloud/dataroom-core">
+	<img alt="Company" src="https://img.shields.io/badge/Author-科大国创云网科技有限公司-blue.svg">
+  	<img alt="QQ" src="https://img.shields.io/badge/QQ-322302395-blue.svg">
+</p>
+
+-------------------------------------------------------------------------------
+## 效果图
+
+#### 管理页
+<img alt="logo" src="./doc/images/home.png">
+
+#### 设计器
+<img alt="logo" src="./doc/images/design01.png">
+
+## 优势
+
+* 一站式大屏解决方案,从**数据处理**->**大屏设计**->**大屏预览**->**生产使用**
+* 支持**多种数据集接入**,可用于生产
+* 支持🔥**独立部署**,不对原有工程产生影响,适用于老项目
+* 支持🔥**嵌入式集成**,与项目无缝融合,引入依赖包即可,无其他系统框架依赖,减少运维成本,适用于新项目
+* 支持🔥**组件在线、离线开发**,在线开发简单组件、离线开发复杂组件
+* 支持自定义接口权限、数据权限,轻松对接🔥**Shiro、Security**等认证框架,保证大屏数据安全
+
+## 功能
+- [x] 支持大屏管理、设计、预览、导出、集成
+- [x] 支持图层上下调整,支持置于顶层、置于底层
+- [x] 支持图画布组件框选、组合、取消组合、锁定、批量删除、复制功能
+- [x] 支持文本、图片、轮播表、排名表、翻牌器、基础表格、倒计时、系统时间、外链
+- [x] 支持基础折线图、梯形图、柱状图、面积图、条形图、饼图、环图、水波图、仪表盘、进度条、词云图、雷达图、漏斗图等
+- [x] 支持15种边框组件,支持动画、渐变色设置,支持水平线、垂直线设置
+- [x] 支持10多种修饰组件,支持动画、渐变色设置
+- [x] 支持资源管理,包含LOGO、3D图标、2D图表、修饰、背景等上百个大屏设计资源,资源支持自定义上传
+- [x] 支持组件管理,支持组件化设计,包含系统组件、自定义组件、业务组件,一键复用组件
+- [x] 支持数据源管理,支持MySQL、ClickHouse、PostgreSQL、Oracle
+- [x] 支持数据集管理,支持原始数据集、自助数据集、存储过程数据集、JSON数据集、脚本数据集、HTTP数据集,接入不同来源数据
+- [x] 支持自定义接口权限、数据权限,保证大屏数据安全
+- [x] 支持组件自定义规范,按照规范开发自己的大屏组件,满足特殊需求,如:自定义网络拓扑
+
+## 链接
+
+* [使用手册、二次开发、部署手册、常见问题](https://www.yuque.com/chuinixiongkou/bigscreen/index)
+* [前端代码仓库(GitHub)](https://github.com/gcpaas/gc-starter-bigscreen-ui)、[前端代码仓库(码云)](https://gitee.com/gcpaas/gc-starter-bigscreen-ui)
+* [后端代码仓库(GitHub)](https://github.com/gcpaas/gc-starter-bigscreen)、 [后端代码仓库(码云)](https://gitee.com/gcpaas/gc-starter-bigscreen)
+
+-------------------------------------------------------------------------------
+
+## 如何集成
+
+下面介绍如何在SpringBoot项目中集成大屏,[📘前端大屏地址在这里](https://github.com/gcpaas/gc-starter-bigscreen-ui)
+
+### 1. 引入依赖
+
+在项目的`pom.xml`文件`<dependencies>`标签中加入以下内容:
+
+```xml
+<dependency>
+    <groupId>com.gccloud</groupId>
+    <artifactId>gc-starter-bigscreen-core</artifactId>
+    <version>最新版本号</version>
+</dependency>
+```
+
+点击<a href="https://central.sonatype.com/artifact/com.gccloud/gc-starter-bigscreen-core">查询最新版本号</a>
+
+### 2. 初始化SQL
+
+执行 doc/init.sql 文件
+
+### 3. 修改配置文件
+
+修改`application-${spring.profiles.active}.yml`配置信息,其中 `${spring.profiles.active}`配置在`application.yml`文件中定义
+
+```yaml
+mybatis-plus:
+  # mybatis plus xml配置文件扫描,多个通过分号隔开
+  mapper-locations: classpath*:mapper/**/*.xml
+  # xml中别名文件扫描,多个通过逗号隔开
+  type-handlers-package: com.gccloud
+spring:
+  resources:
+    static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:${gc.starter.file.basePath}
+  # 静态资源配置
+  mvc:
+    throw-exception-if-no-handler-found: true
+    # 静态资源访问接口前缀
+    static-path-pattern: /static/**
+    view:
+      prefix: classpath:/static/
+      suffix: .html
+gc:
+  starter:
+    file:
+      # 一个存储文件的绝对路径,需要有写入权限
+      basePath: /root/big-screen
+      # 静态资源访问接口前缀
+      urlPrefix: http://127.0.0.1:${server.port}/${server.servlet.context-path}/static/
+```
+
+以上配置根据项目实际情况进行合并
+
+### 4. 启动类配置扫描包路径
+
+```java
+@SpringBootApplication(scanBasePackages = {BigScreenConst.ScanPackage.COMPONENT})
+@MapperScan(value = {BigScreenConst.ScanPackage.DAO})
+```
+
+## 演示DEMO
+
+<a href="http://gcpaas.gccloud.com/bigScreen"> http://gcpaas.gccloud.com/bigScreen </a>
+
+
+## 联系我们
+<img alt="Email" src="https://img.shields.io/badge/Email-tech@ustcinfo.com-blue.svg">
+
+<img alt="QQ群" src="https://img.shields.io/badge/QQ群-322302395-blue.svg">
+
+<p>
+    <img alt="logo" width="200" src="./doc/images/qq.jpeg">
+</p>
+
+## License
+
+Apache License 2.0

+ 20 - 0
DataRoom/SECURITY.md

@@ -0,0 +1,20 @@
+# 安全策略
+
+本文档描述了我们团队如何处理安全问题和漏洞。如果您发现了潜在的安全问题,请发送电子邮件至 tech@ustcinfo.com。
+
+## 报告漏洞
+
+如果您发现了漏洞,请按照以下步骤报告:
+
+1. 发送电子邮件至 tech@ustcinfo.com,并提供有关漏洞的详细信息。
+2. 我们将尽快回复,确认收到您的漏洞报告。
+3. 我们会评估漏洞的严重性,并决定是否需要紧急修复。
+4. 一旦修复程序可用,我们将联系您并要求您验证它们是否已解决漏洞。 
+
+## 安全问题处理时间
+
+我们承诺在漏洞报告收到后的24小时内回应,并在60天内解决所有已确认的漏洞。如果无法在该时间内解决,则我们将向您提供更新,并解释原因。
+
+## 安全策略更新
+
+我们保留随时更改此安全策略的权利,因此请经常查看以获取最新信息。如果您对我们的安全策略有任何疑问,请随时与我们联系。

+ 202 - 0
DataRoom/dataroom-core/pom.xml

@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.gccloud</groupId>
+        <artifactId>dataroom</artifactId>
+        <version>0.0.1.2023061401.Alpha</version>
+    </parent>
+
+    <artifactId>dataroom-core</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <!--   swagger相关依赖  -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>${swagger.annotations.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>${swagger.bootstrap.version}</version>
+        </dependency>
+        <!--   lombok依赖  -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+        </dependency>
+        <!--   mybatis相关依赖  -->
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis</artifactId>
+            <version>${mybatis.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-core</artifactId>
+            <version>${mybatis.plus.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.mybatis</groupId>
+                    <artifactId>mybatis</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-spring</artifactId>
+            <version>${mybatis-spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis.plus.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+            <version>${mybatis.plus.version}</version>
+        </dependency>
+        <!--   工具  -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons-collections4.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+        <!--  jackson  -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>${jackson.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${jackson.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-json-org</artifactId>
+            <version>${jackson.core.version}</version>
+        </dependency>
+        <!--  groovy  -->
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <type>pom</type>
+            <version>${groovy.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.kohsuke</groupId>
+            <artifactId>groovy-sandbox</artifactId>
+            <version>1.19</version>
+        </dependency>
+        <!--  caffeine缓存  -->
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+        <!-- 数据库 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>p6spy</groupId>
+            <artifactId>p6spy</artifactId>
+            <version>${p6spy.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+            <version>${ojdbc8.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>${postgresql.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.clickhouse</groupId>
+            <artifactId>clickhouse-jdbc</artifactId>
+            <version>${clickhouse.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.9.1</version>
+        </dependency>
+    </dependencies>
+</project>

+ 28 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/DataRoomConfig.java

@@ -0,0 +1,28 @@
+package com.gccloud.dataroom.core.config;
+
+import com.gccloud.dataroom.core.config.bean.FileConfig;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 基础框架基础配置
+ *
+ * @Author maoshufeng
+ * @Date 2020-06-16
+ * @Version 1.0.0
+ */
+@Slf4j
+@Configuration
+@ConfigurationProperties(prefix = "gc.starter")
+@Data
+public class DataRoomConfig {
+
+    /**
+     * 文件存储配置
+     */
+    @NestedConfigurationProperty
+    private FileConfig file = new FileConfig();
+}

+ 39 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/ObjectMapperConfiguration.java

@@ -0,0 +1,39 @@
+package com.gccloud.dataroom.core.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.jsonorg.JSONArraySerializer;
+import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule;
+import com.gccloud.dataroom.core.constant.DataRoomConst;
+import lombok.extern.slf4j.Slf4j;
+import org.json.JSONArray;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Slf4j
+@Configuration
+@ConditionalOnProperty(prefix = "gc.starter.component", name = "ObjectMapperConfiguration", havingValue = "ObjectMapperConfiguration", matchIfMissing = true)
+public class ObjectMapperConfiguration {
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    @PostConstruct
+    public void init() {
+        log.info(DataRoomConst.Console.LINE);
+        log.info("注册 Jackson JsonOrgModule 模块");
+        // 不注册该模块会导致 @RequestBody 为 JSONObject 时属性无法填充
+        JsonOrgModule jsonOrgModule = new JsonOrgModule();
+        objectMapper.registerModule(jsonOrgModule);
+
+        SimpleModule simpleModule = new SimpleModule();
+        // 解决 接口响应中包含JSONObject 或 JSONArray时, 序列化失败,变成{empty: false} 的问题
+        simpleModule.addSerializer(JSONArray.class, JSONArraySerializer.instance);
+        objectMapper.registerModule(simpleModule);
+
+        log.info(DataRoomConst.Console.LINE);
+    }
+}

+ 43 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java

@@ -0,0 +1,43 @@
+package com.gccloud.dataroom.core.config.bean;
+
+import com.google.common.collect.Sets;
+import lombok.Data;
+
+import java.util.Set;
+
+/**
+ * 文件存储配置
+ */
+@Data
+public class FileConfig {
+    /**
+     * 文件存储的基础路径
+     */
+    private String basePath;
+    /**
+     * 文件地址前缀
+     */
+    private String urlPrefix;
+    /**
+     * 允许的上传文件后缀类型
+     */
+    private Set<String> allowedFileExtensionName = Sets.newHashSet(
+            "txt",
+            "pdf",
+            "xls",
+            "xlsx",
+            "csv",
+            "doc",
+            "docx",
+            "png",
+            "jpg",
+            "gif",
+            "mp4",
+            "mov",
+            "mp3",
+            "rar",
+            "zip",
+            "ppt",
+            "svg"
+    );
+}

+ 80 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/constant/DataRoomConst.java

@@ -0,0 +1,80 @@
+package com.gccloud.dataroom.core.constant;
+
+/**
+ * @author liuchengbiao
+ * @date 2020-06-21 13:33
+ */
+public interface DataRoomConst {
+    /**
+     * 控制台
+     */
+    interface Console {
+        /**
+         * 控制台line
+         */
+        String LINE = "----------------------------------------";
+    }
+
+    /**
+     * 删除标志位
+     */
+    interface DelFlag {
+        /**
+         * 删除
+         */
+        int DELETE = 1;
+        /**
+         * 未删除
+         */
+        int NOAMAL = 0;
+    }
+
+    /**
+     * 响应
+     */
+    interface Response {
+        /**
+         * 响应码
+         */
+        interface Code {
+            /**
+             * 未登录
+             */
+            int NO_LOGIN = 401;
+            /**
+             * 无权限
+             */
+            int NO_ACCESS = 403;
+            /**
+             * 资源不存在
+             */
+            int NO_FOUNT = 404;
+            /**
+             * 服务端异常
+             */
+            int SERVER_ERROR = 500;
+            /**
+             * 成功
+             */
+            int SUCCESS = 200;
+        }
+    }
+
+    /**
+     * 扫描包路径
+     */
+    interface ScanPackage {
+
+        /**
+         * 基础包路径
+         */
+        String COMPONENT = "com.gccloud.dataroom";
+
+        /**
+         * dao路径
+         */
+        String DAO = "com.gccloud.dataroom.core.**.dao";
+
+    }
+
+}

+ 214 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/constant/PageDesignConstant.java

@@ -0,0 +1,214 @@
+package com.gccloud.dataroom.core.constant;
+
+/**
+ * @author zhang.tianming
+ */
+public interface PageDesignConstant {
+
+    /**
+     * 页面类型
+     */
+    interface Type {
+        /**
+         * 大屏
+         */
+        String BIG_SCREEN = "bigScreen";
+
+        /**
+         * 大屏组件
+         */
+        String COMPONENT = "component";
+    }
+
+
+    interface CategoryType {
+        /**
+         * 大屏目录
+         */
+        String BIG_SCREEN = "bigScreenCatalog";
+
+        /**
+         * 大屏模板目录
+         */
+        String BIG_SCREEN_TEMPLATE = "bigScreenTemplateCatalog";
+
+        /**
+         * 资源库目录
+         */
+        String RESOURCE = "resourceCatalog";
+
+        /**
+         * 组件库目录
+         */
+        String COMPONENT = "componentCatalog";
+
+    }
+    /**
+     * 大屏
+     */
+    interface DataRoom {
+
+        /**
+         * 组件类型
+         */
+        interface Type {
+
+            /**
+             * 表格
+             */
+            String TABLES = "tables";
+
+            /**
+             * 外链
+             */
+            String IFRAME = "iframeChart";
+
+            /**
+             * 倒计时
+             */
+            String TIME_COUNT_DOWN = "timeCountDown";
+
+            /**
+             * 当前时间
+             */
+            String CURRENT_TIME = "currentTime";
+
+            /**
+             * 文本
+             */
+            String TEXT = "texts";
+
+            /**
+             * 装饰边框
+             */
+            String BORDER = "border";
+
+            /**
+             * 滚动面板
+             */
+            String SCREEN_SCROLL_BOARD = "screenScrollBoard";
+
+            /**
+             * 滚动排行榜
+             */
+            String SCREEN_SCROLL_RANKING = "screenScrollRanking";
+            /**
+             * 自定义组件
+             */
+            String CUSTOM_COMPONENT = "customComponent";
+
+            /**
+             * 地图
+             */
+            String MAP = "map";
+
+            /**
+             * 图标
+             */
+            String SVGS = "svgs";
+
+            /**
+             * 数字翻牌器
+             */
+            String DIGITAL_FLOP = "digitalFlop";
+
+            /**
+             * 视频
+             */
+            String VIDEO = "video";
+
+            /**
+             * 输入框
+             */
+            String INPUT = "input";
+
+            /**
+             * 按钮
+             */
+            String BUTTON = "button";
+
+            /**
+             * 超链接
+             */
+            String LINK = "linkChart";
+        }
+
+        interface Operator {
+            /**
+             * 等于
+             */
+            String EQUAL = "=";
+            /**
+             * 不等于
+             */
+            String NOT_EQUAL = "!=";
+            /**
+             * 大于
+             */
+            String GREATER_THAN = ">";
+            /**
+             * 小于
+             */
+            String LESS_THAN = "<";
+            /**
+             * 大于等于
+             */
+            String GREATER_THAN_OR_EQUAL = ">=";
+            /**
+             * 小于等于
+             */
+            String LESS_THAN_OR_EQUAL = "<=";
+            /**
+             * 在...之中
+             */
+            String IN = "IN";
+            /**
+             * 不在...之中
+             */
+            String NOT_IN = "NOT IN";
+            /**
+             * 包含
+             */
+            String LIKE = "LIKE";
+            /**
+             * 为空
+             */
+            String IS_NULL = "IS NULL";
+            /**
+             * 不为空
+             */
+            String IS_NOT_NULL = "IS NOT NULL";
+
+
+        }
+
+        interface Aggregate {
+            /**
+             * 统计
+             */
+            String COUNT = "COUNT";
+            /**
+             * 求和
+             */
+            String SUM = "SUM";
+            /**
+             * 平均值
+             */
+            String AVG = "AVG";
+            /**
+             * 最大值
+             */
+            String MAX = "MAX";
+            /**
+             * 最小值
+             */
+            String MIN = "MIN";
+            /**
+             * 统计不重复值
+             */
+            String COUNT_DISTINCT = "COUNT_DISTINCT";
+        }
+    }
+
+
+}

+ 45 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/controller/SuperController.java

@@ -0,0 +1,45 @@
+package com.gccloud.dataroom.core.controller;
+
+import com.gccloud.dataroom.core.exception.GlobalException;
+import com.gccloud.dataroom.core.vo.R;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author liuchengbiao
+ * @date 2020-06-17 13:37
+ */
+public class SuperController {
+
+    public <T> R<T> success(T data) {
+        return R.success(data);
+    }
+
+    public <T> R<T> success() {
+        return R.success();
+    }
+
+    public <T> R<T> error() {
+        return R.error();
+    }
+
+    /**
+     * 字符串数组更改
+     *
+     * @param idStr
+     * @return
+     */
+    public List<String> convert(String idStr) {
+        //判断id是否为空
+        if (Strings.isBlank(idStr)) {
+            throw new GlobalException("id不允许为空");
+        }
+        // 将ids 拆分为数组,分隔符为"-"
+        String[] idStrArr = StringUtils.split(idStr, "-");
+        return Arrays.stream(idStrArr).map(id -> (id)).collect(Collectors.toList());
+    }
+}

+ 14 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dao/DataRoomBaseDao.java

@@ -0,0 +1,14 @@
+package com.gccloud.dataroom.core.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @ClassName BaseDao
+ * @Description BaseDao
+ * @Author maoshufeng
+ * @Date 2020-06-16 11:09
+ * @Version 1.0
+ */
+public interface DataRoomBaseDao<T> extends BaseMapper<T> {
+
+}

+ 35 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dto/SearchDTO.java

@@ -0,0 +1,35 @@
+package com.gccloud.dataroom.core.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 查询DTO,其他查询可以继承该类实现查询条件扩展
+ *
+ * @Author maoshufeng
+ * @Date 2020-06-13 15:08
+ * @Version 1.0
+ */
+@Data
+@ApiModel
+public class SearchDTO {
+
+    @ApiModelProperty(notes = "当前显示页数")
+    private Integer current;
+
+    @ApiModelProperty(notes = "每页展示数据条数")
+    private Integer size;
+
+    @ApiModelProperty(notes = "查询条件")
+    private String searchKey;
+
+    @ApiModelProperty(notes = "排序(支持多个字段,按照顺序进行先后排序)")
+    private Map<String,String> sortFieldMap;
+
+    @ApiModelProperty(notes = "排序(支持多个字段,按照顺序进行先后排序)")
+    private List<String> sortFieldOrderList;
+}

+ 19 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/dto/SortField.java

@@ -0,0 +1,19 @@
+package com.gccloud.dataroom.core.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 排序
+ */
+@Data
+@ApiModel
+public class SortField {
+
+    @ApiModelProperty(notes = "待排序的属性")
+    private String fieldName;
+
+    @ApiModelProperty(notes = "排序的方式")
+    private String order;
+}

+ 35 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/entity/SuperEntity.java

@@ -0,0 +1,35 @@
+package com.gccloud.dataroom.core.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.gccloud.dataroom.core.constant.DataRoomConst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author liuchengbiao
+ * @date 2020-07-07 10:02
+ */
+@Data
+@ApiModel
+public class SuperEntity implements Serializable {
+
+    @TableId
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
+    @ApiModelProperty(notes = "创建时间")
+    private Date createDate;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(notes = "更新时间")
+    private Date updateDate;
+
+    @TableLogic(delval = DataRoomConst.DelFlag.DELETE + "", value = DataRoomConst.DelFlag.NOAMAL + "")
+    @ApiModelProperty(notes = "删除标识(0:正常,1:删除)", hidden = true)
+    private Integer delFlag = 0;
+}

+ 66 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/exception/DataRoomGlobalExceptionHandler.java

@@ -0,0 +1,66 @@
+package com.gccloud.dataroom.core.exception;
+
+import com.gccloud.dataroom.core.constant.DataRoomConst;
+import com.gccloud.dataroom.core.vo.R;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全局异常处理
+ *
+ * @Author maoshufeng
+ * @Date 2020-06-19
+ * @Version 1.0.0
+ */
+@RestControllerAdvice
+@Slf4j
+@ConditionalOnProperty(prefix = "gc.starter.component", name = "DataRoomGlobalExceptionHandler", havingValue = "DataRoomGlobalExceptionHandler", matchIfMissing = true)
+public class DataRoomGlobalExceptionHandler {
+
+    @PostConstruct
+    public void init() {
+        log.info(DataRoomConst.Console.LINE);
+        log.info("初始化默认全局异常处理,如果和项目中的全局异常处理冲突,可以在配置文件中配置gc.starter.component.DataRoomGlobalExceptionHandler=false禁用该全局异常处理");
+        log.info(DataRoomConst.Console.LINE);
+    }
+
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public R<String> httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        log.error(ExceptionUtils.getStackTrace(e));
+        R<String> r = new R<String>();
+        r.setCode(DataRoomConst.Response.Code.SERVER_ERROR);
+        r.setMsg("不支持该请求方式");
+        return r;
+    }
+
+    /**
+     * 处理自定义异常
+     */
+    @ExceptionHandler(GlobalException.class)
+    public R<String> exception(HttpServletRequest request, GlobalException e) {
+        log.error(ExceptionUtils.getStackTrace(e));
+        R<String> r = new R<>();
+        r.setCode(e.getCode());
+        r.setMsg(e.getMessage());
+        return r;
+    }
+
+    @ExceptionHandler(IllegalArgumentException.class)
+    public R<String> illegalArgumentException(Exception e) {
+        log.error(ExceptionUtils.getStackTrace(e));
+        return R.error("参数非法");
+    }
+
+    @ExceptionHandler(Exception.class)
+    public R<String> handleException(Exception e) {
+        log.error(ExceptionUtils.getStackTrace(e));
+        return R.error("服务器异常");
+    }
+}

+ 32 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/exception/GlobalException.java

@@ -0,0 +1,32 @@
+package com.gccloud.dataroom.core.exception;
+
+import com.gccloud.dataroom.core.constant.DataRoomConst;
+import lombok.Data;
+
+/**
+ * @author liuchengbiao
+ * @date 2020-06-12 16:11
+ */
+@Data
+public class GlobalException extends RuntimeException {
+
+    private int code = DataRoomConst.Response.Code.SERVER_ERROR;
+
+    public GlobalException(String msg) {
+        super(msg);
+    }
+
+    public GlobalException(String msg, Throwable e) {
+        super(msg, e);
+    }
+
+    public GlobalException(String msg, int code) {
+        super(msg);
+        this.setCode(code);
+    }
+
+    public GlobalException(String msg, int code, Throwable e) {
+        super(msg, e);
+        this.setCode(code);
+    }
+}

+ 15 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/dao/PageDao.java

@@ -0,0 +1,15 @@
+package com.gccloud.dataroom.core.module.basic.dao;
+
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import com.gccloud.dataroom.core.module.basic.entity.PageEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author qianxing
+ * @Date 2022/06/07
+ * @Version 1.0.0
+ */
+@Mapper
+public interface PageDao extends DataRoomBaseDao<PageEntity> {
+
+}

+ 23 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/dto/BasePageDTO.java

@@ -0,0 +1,23 @@
+package com.gccloud.dataroom.core.module.basic.dto;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 用于反序列化和序列化的
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")
+public class BasePageDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(notes = "所属应用编码")
+    private String appCode;
+
+}

+ 68 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/PageEntity.java

@@ -0,0 +1,68 @@
+package com.gccloud.dataroom.core.module.basic.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.basic.dto.BasePageDTO;
+import com.gccloud.dataroom.core.module.basic.entity.type.BasePageDTOTypeHandler;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 页面基本信息表
+ *
+ * @Author qianxing
+ * @Date 2022/06/07
+ * @Version 1.0.0
+ */
+@Data
+@TableName(value = "big_screen_page", autoResultMap = true)
+@ApiModel
+public class PageEntity extends SuperEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(notes = "页面中文名称")
+    private String name;
+
+    @ApiModelProperty(notes = "页面编码,页面唯一标识符")
+    private String code;
+
+    @ApiModelProperty(notes = "父节点编码/所属分组编码")
+    private String parentCode;
+
+    /**
+     * 参考:{@link PageDesignConstant.Type}
+     */
+    @ApiModelProperty(notes = "页面类型")
+    private String type;
+
+    @ApiModelProperty(notes = "大屏首页封面")
+    private String coverPicture;
+
+    @ApiModelProperty(notes = "页面图标")
+    private String icon;
+
+    @ApiModelProperty(notes = "图标颜色")
+    private String iconColor;
+
+    @ApiModelProperty(notes = "具体组件配置、JSON格式")
+    @TableField(typeHandler = BasePageDTOTypeHandler.class)
+    private BasePageDTO config;
+
+    @ApiModelProperty(notes = "备注")
+    private String remark;
+
+    @ApiModelProperty(notes = "排序")
+    private Integer orderNum;
+
+    @ApiModelProperty(notes = "所属应用编码")
+    private String appCode;
+
+
+
+}

+ 63 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/type/BasePageDTOTypeHandler.java

@@ -0,0 +1,63 @@
+package com.gccloud.dataroom.core.module.basic.entity.type;
+
+import com.gccloud.dataroom.core.module.basic.dto.BasePageDTO;
+import com.gccloud.dataroom.core.utils.JSON;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * JSONObject 与 字符串自动转换
+ *
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@MappedJdbcTypes(JdbcType.VARCHAR)
+@MappedTypes(BasePageDTO.class)
+public class BasePageDTOTypeHandler extends BaseTypeHandler<BasePageDTO> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement preparedStatement, int i, BasePageDTO obj, JdbcType jdbcType) throws SQLException {
+        String data = JSON.toJSONString(obj);
+        preparedStatement.setString(i, data);
+    }
+
+    @Override
+    public BasePageDTO getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
+        String data = resultSet.getString(columnName);
+        if (StringUtils.isBlank(data)) {
+            return null;
+        }
+        BasePageDTO basePageDTO = JSON.parseObject(data, BasePageDTO.class);
+        return basePageDTO;
+    }
+
+    @Override
+    public BasePageDTO getNullableResult(ResultSet resultSet, int i) throws SQLException {
+        String data = resultSet.getString(i);
+        if (StringUtils.isBlank(data)) {
+            return null;
+        }
+        BasePageDTO basePageDTO = JSON.parseObject(data, BasePageDTO.class);
+        return basePageDTO;
+    }
+
+    @Override
+    public BasePageDTO getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
+        String data = callableStatement.getString(i);
+        if (StringUtils.isBlank(data)) {
+            return null;
+        }
+        BasePageDTO basePageDTO = JSON.parseObject(data, BasePageDTO.class);
+        return basePageDTO;
+    }
+}
+

+ 100 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/service/IBasePageService.java

@@ -0,0 +1,100 @@
+package com.gccloud.dataroom.core.module.basic.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.gccloud.dataroom.core.service.ISuperService;
+import com.gccloud.dataroom.core.utils.AssertUtils;
+import com.gccloud.dataroom.core.module.basic.entity.PageEntity;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+public interface IBasePageService extends ISuperService<PageEntity> {
+
+    /**
+     * 获取指定类型页面所有名称
+     *
+     * @param type
+     * @return
+     */
+    default Set<String> getAllName(String type) {
+        AssertUtils.isTrue(StringUtils.isNotBlank(type), "type不能为空");
+        LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PageEntity::getType, type);
+        queryWrapper.select(PageEntity::getName);
+        List<PageEntity> list = getBaseDao().selectList(queryWrapper);
+        Set<String> allName = list.stream().map(PageEntity::getName).collect(Collectors.toSet());
+        return allName;
+    }
+
+    /**
+     * 根据编码查询
+     *
+     * @param code
+     * @return
+     */
+    default PageEntity getByCode(String code) {
+        AssertUtils.isTrue(StringUtils.isNotBlank(code), "页面编码不能为空");
+        LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PageEntity::getCode, code);
+        PageEntity pageEntity = getBaseDao().selectOne(queryWrapper);
+        return pageEntity;
+    }
+
+    /**
+     * 名称查重
+     * @param entity
+     * @return
+     */
+    default boolean checkNameRepeat(PageEntity entity) {
+        AssertUtils.isTrue(StringUtils.isNotBlank(entity.getName()), "名称不能为空");
+        LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(entity.getAppCode()), PageEntity::getAppCode, entity.getAppCode())
+                .eq(PageEntity::getName, entity.getName())
+                .eq(PageEntity::getType, entity.getType())
+                .ne(StringUtils.isNotBlank(entity.getId()), PageEntity::getId, entity.getId());
+        return getBaseDao().selectCount(queryWrapper) > 0;
+    }
+
+    /**
+     * 名称查重
+     * @param appCode
+     * @param name
+     * @param id
+     * @param type
+     * @return
+     */
+    default boolean checkNameRepeat(String appCode, String name, String id, String type) {
+        AssertUtils.isTrue(StringUtils.isNotBlank(name), "名称不能为空");
+        LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(appCode), PageEntity::getAppCode, appCode)
+                .eq(PageEntity::getName, name)
+                .eq(PageEntity::getType, type)
+                .ne(StringUtils.isNotBlank(id), PageEntity::getId, id);
+        return getBaseDao().selectCount(queryWrapper) > 0;
+    }
+
+
+    /**
+     * 编码查重
+     * @param entity
+     * @return
+     */
+    default boolean checkCodeRepeat(PageEntity entity) {
+        AssertUtils.isTrue(StringUtils.isNotBlank(entity.getCode()), "编码不能为空");
+        LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(entity.getAppCode()), PageEntity::getAppCode, entity.getAppCode())
+                .eq(PageEntity::getCode, entity.getCode())
+                .eq(PageEntity::getType, entity.getType())
+                .ne(StringUtils.isNotBlank(entity.getId()), PageEntity::getId, entity.getId());
+        return getBaseDao().selectCount(queryWrapper) > 0;
+    }
+
+}

+ 88 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java

@@ -0,0 +1,88 @@
+package com.gccloud.dataroom.core.module.biz.component.controller;
+
+import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentSearchDTO;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity;
+import com.gccloud.dataroom.core.module.biz.component.service.IBizComponentService;
+import com.gccloud.dataroom.core.vo.PageVO;
+import com.gccloud.dataroom.core.vo.R;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 13:43
+ */
+@Slf4j
+@RestController
+@RequestMapping("/bigScreen/bizComponent")
+@Api(tags = "业务组件")
+@ApiSort(value = 110)
+public class BizComponentController {
+
+
+    @Resource
+    private IBizComponentService bizComponentService;
+
+
+    @GetMapping("/page")
+    @ApiOperation(value = "分页", position = 10, notes = "分页查询业务组件", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "current", value = "页码", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "size", value = "每页条数", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "name", value = "名称模糊查询", paramType = "query", dataType = "string")
+    })
+    public R<PageVO<BizComponentEntity>> getPage(@ApiParam(name = "查询", value = "传入查询的业务条件", required = true) BizComponentSearchDTO searchDTO) {
+        PageVO<BizComponentEntity> page = bizComponentService.getPage(searchDTO);
+        return R.success(page);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value = "新增", notes = "新增", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<String> add(@ApiParam(name = "新增", value = "传入新增的业务条件", required = true) @RequestBody BizComponentEntity entity) {
+        String code = bizComponentService.add(entity);
+        return R.success(code);
+    }
+
+
+    @PostMapping("/update")
+    @ApiOperation(value = "修改", notes = "修改", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> update(@ApiParam(name = "修改", value = "传入修改的业务条件", required = true) @RequestBody BizComponentEntity entity) {
+        bizComponentService.update(entity);
+        return R.success();
+    }
+
+    @PostMapping("/copy/{code}")
+    @ApiOperation(value = "复制", notes = "复制", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<String> copy( @PathVariable String code) {
+        String newCode = bizComponentService.copy(code);
+        return R.success(newCode);
+    }
+
+    @PostMapping("/delete/{id}")
+    @ApiOperation(value = "删除", notes = "删除", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> delete(@ApiParam(name = "删除", value = "传入删除的业务条件", required = true) @PathVariable String id) {
+        bizComponentService.delete(id);
+        return R.success();
+    }
+
+    @GetMapping("/info/{code}")
+    @ApiOperation(value = "根据编码获取组件", notes = "根据编码获取组件", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<BizComponentEntity> getInfoByCode(@ApiParam(name = "根据编码获取组件", value = "传入根据编码获取组件的业务条件", required = true) @PathVariable String code) {
+        BizComponentEntity entity = bizComponentService.getInfoByCode(code);
+        return R.success(entity);
+    }
+
+    @PostMapping("/name/repeat")
+    @ApiOperation(value = "名称查重", notes = "名称查重", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> nameRepeat(@RequestBody BizComponentEntity entity) {
+        return R.success(bizComponentService.checkName(entity.getId(), entity.getName()));
+    }
+
+
+
+}

+ 14 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/BizComponentDao.java

@@ -0,0 +1,14 @@
+package com.gccloud.dataroom.core.module.biz.component.dao;
+
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 11:39
+ */
+@Mapper
+public interface BizComponentDao extends DataRoomBaseDao<BizComponentEntity> {
+}

+ 20 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java

@@ -0,0 +1,20 @@
+package com.gccloud.dataroom.core.module.biz.component.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 11:41
+ */
+@Data
+public class BizComponentSearchDTO extends SearchDTO {
+
+    @ApiModelProperty(value = "所属分组")
+    private String type;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+}

+ 55 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentEntity.java

@@ -0,0 +1,55 @@
+package com.gccloud.dataroom.core.module.biz.component.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 页面基本信息表
+ *
+ * @Author qianxing
+ * @Date 2022/06/07
+ * @Version 1.0.0
+ */
+@Data
+@TableName(value = "big_screen_biz_component")
+@ApiModel
+public class BizComponentEntity extends SuperEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(notes = "业务组件中文名称")
+    private String name;
+
+    @ApiModelProperty(notes = "业务组件编码,页面唯一标识符")
+    @TableField(updateStrategy = FieldStrategy.NEVER)
+    private String code;
+
+    @ApiModelProperty(notes = "业务组件所属分组")
+    private String type;
+
+    @ApiModelProperty(notes = "组件封面")
+    private String coverPicture;
+
+    @ApiModelProperty(notes = "vue组件内容")
+    private String vueContent;
+
+    @ApiModelProperty(notes = "组件配置内容")
+    private String settingContent;
+
+    @ApiModelProperty(notes = "备注")
+    private String remark;
+
+    @ApiModelProperty(notes = "排序")
+    private Integer orderNum;
+
+    @ApiModelProperty(notes = "模块编码")
+    private String moduleCode;
+
+}

+ 72 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/IBizComponentService.java

@@ -0,0 +1,72 @@
+package com.gccloud.dataroom.core.module.biz.component.service;
+
+import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentSearchDTO;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity;
+import com.gccloud.dataroom.core.service.ISuperService;
+import com.gccloud.dataroom.core.vo.PageVO;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 11:39
+ */
+public interface IBizComponentService extends ISuperService<BizComponentEntity> {
+
+    /**
+     * 获取组件列表分页
+     * @param searchDTO
+     * @return
+     */
+    PageVO<BizComponentEntity> getPage(BizComponentSearchDTO searchDTO);
+
+    /**
+     * 获取组件列表
+     * @param searchDTO
+     * @return
+     */
+    List<BizComponentEntity> getList(BizComponentSearchDTO searchDTO);
+
+
+    /**
+     * 根据编码获取组件
+     * @param code
+     * @return
+     */
+    BizComponentEntity getInfoByCode(String code);
+
+    /**
+     * 新增组件
+     * @param entity
+     * @return
+     */
+    String add(BizComponentEntity entity);
+
+    /**
+     * 更新组件
+     * @param entity
+     */
+    void update(BizComponentEntity entity);
+
+    /**
+     * 复制
+     * @param code
+     * @return
+     */
+    String copy(String code);
+
+    /**
+     * 删除组件
+     * @param id
+     */
+    void delete(String id);
+
+    /**
+     * 名称查重
+     * @param id
+     * @param name
+     * @return
+     */
+    boolean checkName(String id, String name);
+}

+ 110 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java

@@ -0,0 +1,110 @@
+package com.gccloud.dataroom.core.module.biz.component.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gccloud.dataroom.core.exception.GlobalException;
+import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentSearchDTO;
+import com.gccloud.dataroom.core.module.biz.component.dao.BizComponentDao;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity;
+import com.gccloud.dataroom.core.module.biz.component.service.IBizComponentService;
+import com.gccloud.dataroom.core.utils.CodeGenerateUtils;
+import com.gccloud.dataroom.core.vo.PageVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 13:35
+ */
+@Service
+public class BizComponentServiceImpl extends ServiceImpl<BizComponentDao, BizComponentEntity> implements IBizComponentService {
+
+    @Override
+    public PageVO<BizComponentEntity> getPage(BizComponentSearchDTO searchDTO) {
+        LambdaQueryWrapper<BizComponentEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotBlank(searchDTO.getName()), BizComponentEntity::getName, searchDTO.getName());
+        queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getType()), BizComponentEntity::getType, searchDTO.getType());
+        return this.page(searchDTO, queryWrapper);
+        
+    }
+
+    @Override
+    public List<BizComponentEntity> getList(BizComponentSearchDTO searchDTO) {
+        LambdaQueryWrapper<BizComponentEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotBlank(searchDTO.getName()), BizComponentEntity::getName, searchDTO.getName());
+        queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getType()), BizComponentEntity::getType, searchDTO.getType());
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public BizComponentEntity getInfoByCode(String code) {
+        if (StringUtils.isBlank(code)) {
+            throw new GlobalException("组件编码不能为空");
+        }
+        LambdaQueryWrapper<BizComponentEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BizComponentEntity::getCode, code);
+        List<BizComponentEntity> list = list(queryWrapper);
+        if (list.size() == 0) {
+            throw new GlobalException("组件不存在");
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public String add(BizComponentEntity entity) {
+        boolean repeat = this.checkName(null, entity.getName());
+        if (repeat) {
+            throw new GlobalException("组件名称重复");
+        }
+        String code = CodeGenerateUtils.generate("bizComponent");
+        entity.setCode(code);
+        this.save(entity);
+        return code;
+    }
+
+    @Override
+    public void update(BizComponentEntity entity) {
+        boolean repeat = this.checkName(entity.getId(), entity.getName());
+        if (repeat) {
+            throw new GlobalException("组件名称重复");
+        }
+        this.updateById(entity);
+    }
+
+    @Override
+    public String copy(String code) {
+        BizComponentEntity copyFrom = this.getInfoByCode(code);
+        if (copyFrom == null) {
+            throw new GlobalException("源业务组件不存在");
+        }
+        copyFrom.setId(null);
+        copyFrom.setName(copyFrom.getName() + "_复制");
+        while(this.checkName(null, copyFrom.getName())) {
+            copyFrom.setName(copyFrom.getName() + "_复制");
+        }
+        copyFrom.setCode(CodeGenerateUtils.generate("bizComponent"));
+        this.save(copyFrom);
+        return copyFrom.getCode();
+    }
+
+    @Override
+    public void delete(String id) {
+        if (StringUtils.isBlank(id)) {
+            throw new GlobalException("组件id不能为空");
+        }
+        this.removeById(id);
+    }
+
+    @Override
+    public boolean checkName(String id, String name) {
+        LambdaQueryWrapper<BizComponentEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BizComponentEntity::getName, name);
+        if (StringUtils.isNotBlank(id)) {
+            queryWrapper.ne(BizComponentEntity::getId, id);
+        }
+        return this.count(queryWrapper) > 0;
+    }
+}

+ 78 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Btn.java

@@ -0,0 +1,78 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.HashMap;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/1/11 15:20
+ */
+@Data
+public class Btn {
+
+    @ApiModelProperty(notes = "按钮名称")
+    private String name;
+
+    @ApiModelProperty(notes = "按钮标签")
+    private String remark;
+
+    @ApiModelProperty(notes = "按钮类型")
+    private String type;
+
+    @ApiModelProperty(notes = "折叠到更多")
+    private boolean isPackUp = false;
+
+    @ApiModelProperty(notes = "按钮动作")
+    private Action action;
+
+    @ApiModelProperty(notes = "按钮是否可用")
+    private boolean enable;
+
+    @ApiModelProperty(notes = "按钮自定义属性")
+    private Attribute customize;
+
+    @ApiModelProperty(notes = "列点击绑定列")
+    private String columnCode;
+
+
+    @Data
+    public static class Action {
+
+        @ApiModelProperty(notes = "动作类型")
+        private String type;
+
+        @ApiModelProperty(notes = "动作脚本")
+        private String script;
+
+        @ApiModelProperty(notes = "打开页面类型的配置")
+        private HashMap<String, Object> page;
+
+        @ApiModelProperty(notes = "打开表单类型的配置")
+        private HashMap<String, Object> form;
+
+        @ApiModelProperty(notes = "组件能力类型的配置")
+        private HashMap<String, Object> component;
+
+        @ApiModelProperty(notes = "javascript类型的配置")
+        private HashMap<String, Object> js;
+
+    }
+
+    @Data
+    private static class Attribute {
+
+        @ApiModelProperty(notes = "按钮图标")
+        private String icon;
+
+        @ApiModelProperty(notes = "按钮颜色")
+        private String style;
+
+        @ApiModelProperty(notes = "按钮大小")
+        private String size;
+    }
+
+
+}

+ 76 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Chart.java

@@ -0,0 +1,76 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.gccloud.dataroom.core.module.chart.components.datasource.BaseChartDataSource;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Charts图表
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")
+public class Chart {
+
+    @ApiModelProperty(notes = "图表唯一标识")
+    private String code;
+
+    @ApiModelProperty(notes = "数据源")
+    private BaseChartDataSource dataSource;
+
+    @ApiModelProperty(notes = "显示图表标题")
+    private Boolean showTitle = true;
+
+    @ApiModelProperty(notes = "图表标题")
+    private String title;
+
+    @ApiModelProperty(notes = "组件类型")
+    private String type;
+
+    @ApiModelProperty(notes = "宽度")
+    private Integer w = 1;
+
+    @ApiModelProperty(notes = "高度")
+    private Integer h = 1;
+
+    @ApiModelProperty(notes = "X坐标点")
+    private Integer x = 0;
+
+    @ApiModelProperty(notes = "Y坐标点")
+    private Integer y = 1;
+
+    @ApiModelProperty(notes = "Z图层")
+    private Integer z;
+
+    @ApiModelProperty(notes = "分组标识")
+    private String group;
+
+    @ApiModelProperty(notes = "锁定")
+    private Boolean locked = false;
+
+    @ApiModelProperty(notes = "联动")
+    private Linkage linkage = new Linkage();
+
+    @ApiModelProperty(notes = "联动入参配置")
+    private List<InParam> inParams;
+
+    @ApiModelProperty(notes = "出码用到的图表信息")
+    private CodeGeneratorInfo codeGeneratorInfo = new CodeGeneratorInfo();
+
+    @Data
+    public static class CodeGeneratorInfo {
+
+        @ApiModelProperty(notes = "图表数据查询接口地址")
+        private String dataUrl;
+
+        @ApiModelProperty(notes = "图表组件配置是否完善")
+        private Boolean configComplete;
+
+    }
+
+}

+ 55 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Field.java

@@ -0,0 +1,55 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/1/11 15:22
+ */
+@Data
+public class Field {
+
+    @ApiModelProperty(notes = "参数名称")
+    private String name;
+
+    @ApiModelProperty(notes = "参数标签")
+    private String label;
+
+    @ApiModelProperty(notes = "组件类型")
+    private String component;
+
+    @ApiModelProperty(notes = "查询规则")
+    private String queryRule;
+
+    @ApiModelProperty(notes = "是否显示")
+    private boolean display;
+
+    @ApiModelProperty(notes = "枚举值配置")
+    private Enumeration enumeration;
+
+    @Data
+    public static class Enumeration {
+
+        @ApiModelProperty(notes = "数据集")
+        private String dataSetKey;
+
+        @ApiModelProperty(notes = "数据集类型,前端使用")
+        private String dataSetType;
+
+        @ApiModelProperty(notes = "显示字段")
+        private String itemKeyName;
+
+        @ApiModelProperty(notes = "值字段")
+        private String itemValueName;
+
+        @ApiModelProperty(value = "参数")
+        private List<DatasetParamDto> params;
+
+    }
+
+}

+ 22 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Filter.java

@@ -0,0 +1,22 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 过滤条件
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+public class Filter {
+    @ApiModelProperty(notes = "表格列")
+    private String column;
+    @ApiModelProperty(notes = "条件")
+    private String operator;
+    @ApiModelProperty(notes = "值")
+    private List<String> value;
+}

+ 17 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/InParam.java

@@ -0,0 +1,17 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/1/4 16:48
+ */
+@Data
+public class InParam {
+
+    private String name;
+
+    private String code;
+
+}

+ 59 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Linkage.java

@@ -0,0 +1,59 @@
+package com.gccloud.dataroom.core.module.chart.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/1/4 16:39
+ */
+@Data
+public class Linkage {
+
+    @ApiModelProperty(notes = "联动执行的逻辑")
+    private Action action;
+
+    @ApiModelProperty(notes = "组件的唯一标识,用于知道和谁做联动")
+    private List<Component> components;
+
+    @Data
+    public static class Action {
+
+        @ApiModelProperty("联动类型")
+        private String type;
+
+        @ApiModelProperty("联动执行的逻辑")
+        private String script;
+    }
+
+    @Data
+    public static class Component {
+
+        @ApiModelProperty("组件的唯一标识,用于知道和谁做联动")
+        private String componentKey;
+
+        @ApiModelProperty("使用数据模型已有的关联关系进行联动查询")
+        private boolean linkByRelation;
+
+        @ApiModelProperty("映射关系")
+        private List<Mapping> maps;
+    }
+
+    @Data
+    public static class Mapping {
+
+        @ApiModelProperty("源字段")
+        private String sourceField;
+
+        @ApiModelProperty("目标字段")
+        private String targetField;
+
+        @ApiModelProperty("查询规则")
+        private String queryRule;
+    }
+
+
+}

+ 78 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/CustomComponentChart.java

@@ -0,0 +1,78 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 自定义组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/28 14:25
+ */
+@Data
+public class CustomComponentChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.CUSTOM_COMPONENT;
+
+    @ApiModelProperty(notes = "自定义处理配置脚本")
+    private String optionHandler;
+
+    @ApiModelProperty(notes = "自定义处理数据源脚本")
+    private String dataHandler;
+
+    @ApiModelProperty(notes = "组件的构造函数分类")
+    private String chartType;
+
+    @ApiModelProperty(notes = "组件的配置,直接从g2官网复制")
+    private Object option;
+
+    @ApiModelProperty(notes = "右侧面板自定义配置")
+    private List<Setting> setting;
+
+    @ApiModelProperty(notes = "组件的唯一名称")
+    private String name;
+
+
+    @Data
+    public static class Setting {
+
+        @ApiModelProperty(notes = "配置项名称")
+        private String label;
+
+        @ApiModelProperty(notes = "配置项组件类型")
+        private String type;
+
+        @ApiModelProperty(notes = "配置项字段")
+        private String field;
+
+        @ApiModelProperty(notes = "配置项对应options中的字段")
+        private String optionField;
+
+        @ApiModelProperty(notes = "是否多选")
+        private Boolean multiple;
+
+        @ApiModelProperty(notes = "值")
+        private Object value;
+
+        @ApiModelProperty(notes = "所属tab页")
+        private String tabName;
+
+        @ApiModelProperty(notes = "多选时选项")
+        private Object options;
+
+        @ApiModelProperty(notes = "步长")
+        private Integer step;
+
+        @ApiModelProperty(notes = "所属样式分组")
+        private String groupName;
+
+    }
+
+
+
+}

+ 91 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/RemoteComponentChart.java

@@ -0,0 +1,91 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 自定义组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/28 14:25
+ */
+@Data
+public class RemoteComponentChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.CUSTOM_COMPONENT;
+
+    @ApiModelProperty(notes = "自定义处理配置脚本")
+    private String optionHandler;
+
+    @ApiModelProperty(notes = "自定义处理数据源脚本")
+    private String dataHandler;
+
+    @ApiModelProperty(notes = "组件的构造函数分类")
+    private String chartType;
+
+    @ApiModelProperty(notes = "组件的配置,直接从g2官网复制")
+    private Object option;
+
+    @ApiModelProperty(notes = "右侧面板自定义配置")
+    private List<Setting> setting;
+
+    @ApiModelProperty(notes = "组件的唯一名称")
+    private String name;
+
+    @ApiModelProperty(notes = "自定义")
+    private Customize customize = new Customize();
+
+
+    @Data
+    public static class Setting {
+
+        @ApiModelProperty(notes = "配置项名称")
+        private String label;
+
+        @ApiModelProperty(notes = "配置项组件类型")
+        private String type;
+
+        @ApiModelProperty(notes = "配置项字段")
+        private String field;
+
+        @ApiModelProperty(notes = "配置项对应options中的字段")
+        private String optionField;
+
+        @ApiModelProperty(notes = "是否多选")
+        private Boolean multiple;
+
+        @ApiModelProperty(notes = "值")
+        private Object value;
+
+        @ApiModelProperty(notes = "所属tab页")
+        private String tabName;
+
+        @ApiModelProperty(notes = "多选时选项")
+        private Object options;
+
+        @ApiModelProperty(notes = "步长")
+        private Integer step;
+
+        @ApiModelProperty(notes = "所属样式分组")
+        private String groupName;
+
+    }
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "用户从外部传入的自定义的vue文件所在目录名称")
+        private String vueSysComponentDirName;
+
+        @ApiModelProperty(notes = "业务组件表唯一标识")
+        private String vueBizComponentCode;
+    }
+
+
+
+}

+ 90 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenBorderChart.java

@@ -0,0 +1,90 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 边框图表
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/16 10:29
+ */
+@Data
+public class ScreenBorderChart extends Chart {
+
+    @ApiModelProperty(notes = "个性化配置")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "边框主颜色")
+        private String borderMainColor;
+
+        @ApiModelProperty(notes = "边框次颜色")
+        private String borderSecondaryColor;
+
+        @ApiModelProperty(notes = "背景颜色")
+        private String backgroundColor;
+
+        @ApiModelProperty(notes = "边框颜色")
+        private String borderColor;
+
+        @ApiModelProperty(notes = "边框宽度")
+        private Integer borderWidth;
+
+        @ApiModelProperty(notes = "是否翻转")
+        private Boolean reverse;
+
+        @ApiModelProperty(notes = "单次动画时长")
+        private Integer dur;
+
+        @ApiModelProperty(notes = "颜色类型")
+        private String colorType;
+
+        @ApiModelProperty(notes = "渐变色0值")
+        private String gradientColor0;
+
+        @ApiModelProperty(notes = "渐变色1值")
+        private String gradientColor1;
+
+        @ApiModelProperty(notes = "渐变色色值改变方向")
+        private String gradientDirection;
+
+        @ApiModelProperty(notes = "透明度")
+        private Integer opacity;
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String fontColor;
+
+        @ApiModelProperty(notes = "字体粗细")
+        private Integer fontWeight;
+
+        @ApiModelProperty(notes = "中心文本")
+        private String text;
+
+        @ApiModelProperty(notes = "长度")
+        private Integer height;
+
+        @ApiModelProperty(notes = "宽度")
+        private Integer width;
+
+        @ApiModelProperty(notes = "左上圆角")
+        private Integer radiusLeftTop;
+
+        @ApiModelProperty(notes = "右上圆角")
+        private Integer radiusRightTop;
+
+        @ApiModelProperty(notes = "左下圆角")
+        private Integer radiusLeftBottom;
+
+        @ApiModelProperty(notes = "右下圆角")
+        private Integer radiusRightBottom;
+
+    }
+
+}

+ 80 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenButtonChart.java

@@ -0,0 +1,80 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 按钮组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenButtonChart extends Chart {
+    
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.BUTTON;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @ApiModelProperty(notes = "名称")
+    private String name;
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "类型")
+        private String type;
+
+        @ApiModelProperty(notes = "背景颜色")
+        private String backgroundColor;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String fontColor;
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "边框样式")
+        private BorderStyle borderStyle;
+
+        @ApiModelProperty(notes = "")
+        private List<Object> bindComponents;
+
+        @ApiModelProperty(notes = "图标")
+        private Icon icon;
+
+    }
+
+    @Data
+    public static class Icon {
+        @ApiModelProperty(notes = "图标名称")
+        private String name;
+
+        @ApiModelProperty(notes = "位置")
+        private String position;
+    }
+
+    @Data
+    public static class BorderStyle {
+
+        @ApiModelProperty(notes = "边框颜色")
+        private String borderColor;
+
+        @ApiModelProperty(notes = "边框宽度")
+        private Integer borderWidth;
+
+        @ApiModelProperty(notes = "边框样式")
+        private String borderStyle;
+
+        @ApiModelProperty(notes = "边框圆角")
+        private Integer borderRadius;
+
+    }
+
+}

+ 37 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenCurrentTimeChart.java

@@ -0,0 +1,37 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/16 16:44
+ */
+@Data
+public class ScreenCurrentTimeChart extends Chart {
+
+    @ApiModelProperty(notes = "时间格式")
+    private String dateFormat;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.CURRENT_TIME;
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize = 14;
+
+        @ApiModelProperty(notes = "字体权重")
+        private Integer fontWeight = 700;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+    }
+}

+ 59 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenDecorationChart.java

@@ -0,0 +1,59 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 装饰
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/16 9:53
+ */
+@Data
+public class ScreenDecorationChart extends Chart {
+
+    @ApiModelProperty(notes = "个性化配置")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "装饰颜色1")
+        private String decorationColor1;
+
+        @ApiModelProperty(notes = "装饰颜色2")
+        private String decorationColor2;
+
+        @ApiModelProperty(notes = "是否反转")
+        private Boolean reverse;
+
+        @ApiModelProperty(notes = "动画时长")
+        private Integer dur;
+
+        @ApiModelProperty(notes = "扫描动画时长")
+        private Integer scanDur;
+
+        @ApiModelProperty(notes = "光晕动画时长")
+        private Integer haloDur;
+
+        @ApiModelProperty(notes = "标题")
+        private String title;
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "字体粗细")
+        private Integer fontWeight;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+
+        @ApiModelProperty(notes = "边框颜色")
+        private String borderColor;
+
+        @ApiModelProperty(notes = "边框宽度")
+        private Integer borderWidth;
+    }
+
+}

+ 65 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenDigitalFlopChart.java

@@ -0,0 +1,65 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/5/24 14:36
+ */
+@Data
+public class ScreenDigitalFlopChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.DIGITAL_FLOP;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+
+        @ApiModelProperty(notes = "背景颜色")
+        private String bgColor;
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "宽度")
+        private Integer width;
+
+        @ApiModelProperty(notes = "圆角")
+        private Integer borderRadius;
+
+        @ApiModelProperty(notes = "格式化")
+        private Integer formatter;
+
+        @ApiModelProperty(notes = "字体粗细")
+        private String fontWeight;
+
+        @ApiModelProperty(notes = "左侧插槽")
+        private String slotLeft;
+
+        @ApiModelProperty(notes = "右侧插槽")
+        private String slotRight;
+
+        @ApiModelProperty(notes = "右侧margin")
+        private Integer marginRight;
+
+        @ApiModelProperty(notes = "数字位数")
+        private Integer numberDigits;
+
+        @ApiModelProperty(notes = "占位符")
+        private String placeHolder;
+
+
+
+    }
+
+}

+ 22 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenIframeChart.java

@@ -0,0 +1,22 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenIframeChart extends Chart {
+
+    @ApiModelProperty(notes = "外链地址")
+    private String url;
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.IFRAME;
+
+}

+ 118 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenInputChart.java

@@ -0,0 +1,118 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 输入框
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenInputChart extends Chart {
+    
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.INPUT;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "是否显示标题")
+        private boolean showTitle;
+
+        @ApiModelProperty(notes = "标题")
+        private String title;
+
+        @ApiModelProperty(notes = "标题样式")
+        private TitleStyle titleStyle;
+
+        @ApiModelProperty(notes = "输入框样式")
+        private InputStyle inputStyle;
+
+        @ApiModelProperty(notes = "占位符样式")
+        private PlaceholderStyle placeholderStyle;
+
+        @ApiModelProperty(notes = "边框样式")
+        private BorderStyle borderStyle;
+
+        @ApiModelProperty(notes = "背景样式")
+        private BackgroundStyle backgroundStyle;
+
+        @ApiModelProperty(notes = "输入值")
+        private String value;
+
+        @ApiModelProperty(notes = "图标")
+        private Icon icon;
+
+    }
+
+    @Data
+    public static class Icon {
+        @ApiModelProperty(notes = "图标名称")
+        private String name;
+
+        @ApiModelProperty(notes = "位置")
+        private String position;
+    }
+
+    @Data
+    public static class InputStyle {
+        @ApiModelProperty(notes = "输入值字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "输入值字体颜色")
+        private String color;
+
+    }
+
+    @Data
+    public static class TitleStyle {
+        @ApiModelProperty(notes = "标题大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "标题颜色")
+        private String color;
+
+        @ApiModelProperty(notes = "标题间距")
+        private Integer marginRight;
+    }
+
+    @Data
+    public static class BorderStyle {
+        @ApiModelProperty(notes = "边框颜色")
+        private String borderColor;
+
+        @ApiModelProperty(notes = "边框宽度")
+        private Integer borderWidth;
+
+        @ApiModelProperty(notes = "边框样式")
+        private String borderStyle;
+
+        @ApiModelProperty(notes = "边框圆角")
+        private Integer borderRadius;
+    }
+
+    @Data
+    public static class BackgroundStyle {
+        @ApiModelProperty(notes = "背景颜色")
+        private String backgroundColor;
+    }
+
+
+    @Data
+    public static class PlaceholderStyle {
+
+        @ApiModelProperty(notes = "占位符")
+        private String placeholder;
+
+        @ApiModelProperty(notes = "占位符字体颜色")
+        private String placeholderColor;
+
+    }
+}

+ 51 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenLinkChart.java

@@ -0,0 +1,51 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 链接组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenLinkChart extends Chart {
+    
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.LINK;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "字体粗细")
+        private Integer fontWeight;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+
+        @ApiModelProperty(notes = "标题")
+        private String title;
+
+        @ApiModelProperty(notes = "链接地址")
+        private String url;
+
+        @ApiModelProperty(notes = "打开方式")
+        private String openType;
+
+        @ApiModelProperty(notes = "弹窗宽度")
+        private Integer dialogW;
+
+        @ApiModelProperty(notes = "弹窗高度")
+        private Integer dialogH;
+
+    }
+}

+ 86 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenMapChart.java

@@ -0,0 +1,86 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 地图组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenMapChart extends Chart {
+
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.MAP;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "是否显示文字")
+        private Boolean mapName;
+
+        @ApiModelProperty(notes = "地图背景色")
+        private String backgroundColor;
+
+        @ApiModelProperty(notes = "是否打点")
+        private Boolean scatter;
+
+        @ApiModelProperty(notes = "悬浮框背景色")
+        private String tooltipBackgroundColor;
+
+        @ApiModelProperty(notes = "悬浮框边框色")
+        private String borderColor;
+
+        @ApiModelProperty(notes = "打点图背景颜色")
+        private String scatterBackgroundColor;
+
+        @ApiModelProperty(notes = "打点图文字颜色")
+        private String scatterColor;
+
+        @ApiModelProperty(notes = "分割线颜色")
+        private String mapLineColor;
+
+        @ApiModelProperty(notes = "地图级别")
+        private String level;
+
+        @ApiModelProperty(notes = "范围")
+        private String scope;
+
+        @ApiModelProperty(notes = "地图区域颜色")
+        private String areaColor;
+
+        @ApiModelProperty(notes = "是否开启筛选")
+        private Boolean visual;
+
+        @ApiModelProperty(notes = "筛选范围")
+        private String[] range;
+
+        @ApiModelProperty(notes = "从上到下的颜色")
+        private String[] rangeColor;
+
+        @ApiModelProperty(notes = "地图数据")
+        private String dataMap;
+
+        @ApiModelProperty(notes = "经度")
+        private String xaxis;
+
+        @ApiModelProperty(notes = "纬度")
+        private String yaxis;
+
+        @ApiModelProperty(notes = "名称")
+        private String name;
+
+        @ApiModelProperty(notes = "值")
+        private String value;
+
+    }
+
+
+}

+ 32 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenPictureChart.java

@@ -0,0 +1,32 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 图片
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/16 10:30
+ */
+@Data
+public class ScreenPictureChart extends Chart {
+
+    @ApiModelProperty(notes = "自定义")
+    private Customize customize;
+
+    @Data
+    public static class Customize {
+        @ApiModelProperty(notes = "透明度")
+        private Integer opacity;
+
+        @ApiModelProperty(notes = "圆角")
+        private Integer radius;
+
+        @ApiModelProperty(notes = "图片地址")
+        private String url;
+
+    }
+
+}

+ 68 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenScrollBoardChart.java

@@ -0,0 +1,68 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/22 14:50
+ */
+@Data
+public class ScreenScrollBoardChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.SCREEN_SCROLL_BOARD;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize{
+
+        @ApiModelProperty(notes = "列配置")
+        private List<HashMap<String, Object>> columnConfig;
+
+        @ApiModelProperty(notes = "滚动条数")
+        private Integer rowNum;
+
+        @ApiModelProperty(notes = "表头背景色")
+        private String headerBGC;
+
+        @ApiModelProperty(notes = "奇数行背景色")
+        private String oddRowBGC;
+
+        @ApiModelProperty(notes = "偶数行背景色")
+        private String evenRowBGC;
+
+        @ApiModelProperty(notes = "滚动间隔时间")
+        private Integer waitTime;
+
+        @ApiModelProperty(notes = "表头高度")
+        private Integer headerHeight;
+
+        @ApiModelProperty(notes = "列宽")
+        private List<String> columnWidth;
+
+        @ApiModelProperty(notes = "对齐方式")
+        private List<String> align;
+
+        @ApiModelProperty(notes = "是否显示行号")
+        private Boolean index;
+
+        @ApiModelProperty(notes = "序号表头")
+        private String indexHeader;
+
+        @ApiModelProperty(notes = "滚动方向")
+        private String carousel;
+
+        @ApiModelProperty(notes = "鼠标悬停是否暂停")
+        private Boolean hoverPause;
+    }
+
+}

+ 42 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenScrollRankingChart.java

@@ -0,0 +1,42 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/22 16:10
+ */
+@Data
+public class ScreenScrollRankingChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.SCREEN_SCROLL_RANKING;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "滚动条数")
+        private Integer rowNum;
+
+        @ApiModelProperty(notes = "滚动间隔时间")
+        private Integer waitTime;
+
+        @ApiModelProperty(notes = "是否轮播")
+        private String carousel;
+
+        @ApiModelProperty(notes = "单位")
+        private String unit;
+
+        @ApiModelProperty(notes = "是否自动排序")
+        private Boolean sort;
+
+    }
+
+}

+ 22 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenSvgsChart.java

@@ -0,0 +1,22 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenSvgsChart extends Chart {
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.SVGS;
+
+    @ApiModelProperty(notes = "图标")
+    private String icon;
+
+}

+ 87 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTablesChart.java

@@ -0,0 +1,87 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Btn;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.module.chart.bean.Field;
+import com.gccloud.dataroom.core.module.chart.components.datasource.BaseChartDataSource;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenTablesChart extends Chart {
+    @ApiModelProperty(notes = "数据源")
+    private BaseChartDataSource dataSource;
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.TABLES;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @ApiModelProperty(notes = "快速筛选项配置")
+    private List<Field> fields;
+
+    @ApiModelProperty(notes = "查询表单按钮")
+    private List<Btn> btns;
+
+    @ApiModelProperty(notes = "操作按钮")
+    private List<Btn> opts;
+
+    @ApiModelProperty(notes = "列按钮")
+    private List<Btn> colBtns;
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "是否前端分页")
+        private boolean webPagination = false;
+
+        @ApiModelProperty(notes = "分页页长,0表示不分页,仅在服务端分页未开启时生效")
+        private Integer pageSize;
+
+        /**
+         * 大屏表格属性
+         */
+
+        @ApiModelProperty(notes = "表格主题")
+        private String theme = "dark";
+
+        @ApiModelProperty(notes = "表格头部背景颜色")
+        private String headerBackgroundColor = "#1d1d1d";
+
+        @ApiModelProperty(notes = "表格头部字体颜色")
+        private String headerFontColor = "#ffffff";
+
+        @ApiModelProperty(notes = "表格头部字体大小")
+        private Integer headerFontSize = 14;
+
+        @ApiModelProperty(notes = "表格主体背景颜色")
+        private String bodyBackgroundColor = "#1d1d1d";
+
+        @ApiModelProperty(notes = "表格主体字体颜色")
+        private String bodyFontColor = "#ffffff";
+
+        @ApiModelProperty(notes = "表格主体字体大小")
+        private Integer bodyFontSize = 14;
+
+        @ApiModelProperty(notes = "是否开启斑马纹")
+        private boolean stripe = false;
+
+        @ApiModelProperty(notes = "表格偶数行背景颜色")
+        private String evenRowBackgroundColor;
+
+        @ApiModelProperty(notes = "表格奇数行背景颜色")
+        private String oddRowBackgroundColor;
+
+    }
+
+
+}

+ 38 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTextChart.java

@@ -0,0 +1,38 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+/**
+ * 文本
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenTextChart extends Chart {
+    
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.TEXT;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize;
+
+        @ApiModelProperty(notes = "字体粗细")
+        private Integer fontWeight;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+
+        @ApiModelProperty(notes = "标题")
+        private String title;
+
+    }
+}

+ 52 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenTimeCountDownChart.java

@@ -0,0 +1,52 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenTimeCountDownChart extends Chart {
+    /**
+     * 描述
+     */
+    @ApiModelProperty(notes = "描述")
+    private String title;
+    /**
+     * 以结束时间进行倒计时
+     */
+    @ApiModelProperty(notes = "结束时间")
+    private Date endTime;
+
+    @ApiModelProperty(notes = "类型")
+    private String type = PageDesignConstant.DataRoom.Type.TIME_COUNT_DOWN;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @ApiModelProperty(notes = "日期格式")
+    private String dateFormat;
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "字体大小")
+        private Integer fontSize = 14;
+
+        @ApiModelProperty(notes = "字体权重")
+        private Integer fontWeight = 700;
+
+        @ApiModelProperty(notes = "字体颜色")
+        private String color;
+
+    }
+
+
+}

+ 36 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/ScreenVideoChart.java

@@ -0,0 +1,36 @@
+package com.gccloud.dataroom.core.module.chart.components;
+
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 视频组件
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/3/13 16:44
+ */
+@Data
+public class ScreenVideoChart extends Chart {
+    
+    @ApiModelProperty(notes = "组件类型")
+    private String type = PageDesignConstant.DataRoom.Type.VIDEO;
+
+    @ApiModelProperty(notes = "个性化")
+    private Customize customize = new Customize();
+
+    @Data
+    public static class Customize {
+
+        @ApiModelProperty(notes = "视频类型")
+        private String videoType;
+
+        @ApiModelProperty(notes = "视频地址")
+        private String videoUrl;
+
+        @ApiModelProperty(notes = "封面地址")
+        private String posterUrl;
+
+    }
+}

+ 17 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/datasource/BaseChartDataSource.java

@@ -0,0 +1,17 @@
+package com.gccloud.dataroom.core.module.chart.components.datasource;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import lombok.Data;
+
+/**
+ * 图表数据源
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")
+public abstract class BaseChartDataSource {
+
+
+}

+ 95 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/datasource/DataSetDataSource.java

@@ -0,0 +1,95 @@
+package com.gccloud.dataroom.core.module.chart.components.datasource;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2022/11/19 10:45
+ */
+@Data
+public class DataSetDataSource extends BaseChartDataSource {
+
+    @ApiModelProperty(notes = "数据集标识")
+    private String businessKey;
+
+    @ApiModelProperty(notes = "数据源标识,仅用于出码时使用")
+    private String dataSourceKey;
+
+    @ApiModelProperty(notes = "数据集类型")
+    private String dataSetType;
+
+    @ApiModelProperty(notes = "数据集参数")
+    private HashMap<String, Object> params;
+
+    @ApiModelProperty(notes = "x轴维度字段")
+    private String dimensionField;
+
+    @ApiModelProperty(notes = "y轴指标字段")
+    private String metricField;
+
+    @ApiModelProperty(notes = "拆分字段")
+    private String seriesField;
+
+    @ApiModelProperty(notes = "维度字段列表")
+    private List<String> dimensionFieldList;
+
+    @ApiModelProperty(notes = "指标字段列表")
+    private List<String> metricFieldList;
+
+    @ApiModelProperty(notes = "拆分字段列表")
+    private List<String> seriesFieldList;
+
+    @ApiModelProperty(notes = "服务端分页")
+    private Boolean serverPagination;
+
+    @ApiModelProperty(notes = "服务端分页页长")
+    private Integer pageSize;
+
+    /**
+     * 树组件的配置
+     * 懒加载时,需要配置treeNodeField、
+     */
+
+    @ApiModelProperty(notes = "是否懒加载树")
+    private boolean lazy = false;
+
+    @ApiModelProperty(notes = "子级列表字段,非懒加载时使用")
+    private String childrenField;
+
+    @ApiModelProperty(notes = "树节点显示字段, 用于树组件,树表组件可不填")
+    private String treeNodeField;
+
+    @ApiModelProperty(notes = "父节点字段所存储的字段")
+    private String parentIdValueField;
+
+    @ApiModelProperty(notes = "父节点字段参数")
+    private String parentIdParam;
+
+    @ApiModelProperty(notes = "父节点字段")
+    private String parentIdField;
+
+    @ApiModelProperty(notes = "是否有子节点字段")
+    private String hasChildrenField;
+
+    @ApiModelProperty(notes = "默认根节点的父节点ID的值,如果不设置则默认为0")
+    private String rootNodeParentIdValue;
+
+    /**
+     * 散点图特殊配置
+     */
+
+    @ApiModelProperty(notes = "颜色字段")
+    private String colorField;
+
+    @ApiModelProperty(notes = "形状字段")
+    private String shapeField;
+
+    @ApiModelProperty(notes = "散点大小字段")
+    private String sizeField;
+
+}

+ 110 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/controller/ChartDataController.java

@@ -0,0 +1,110 @@
+package com.gccloud.dataroom.core.module.chart.controller;
+
+import com.gccloud.dataroom.core.module.chart.dto.ChartDataSearchDTO;
+import com.gccloud.dataroom.core.module.chart.service.BaseChartDataService;
+import com.gccloud.dataroom.core.module.chart.service.ChartMockData;
+import com.gccloud.dataroom.core.module.chart.vo.ChartDataVO;
+import com.gccloud.dataroom.core.utils.AssertUtils;
+import com.gccloud.dataroom.core.module.basic.entity.PageEntity;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.module.manage.dto.DataRoomPageDTO;
+import com.gccloud.dataroom.core.module.manage.service.IDataRoomPageService;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.module.basic.dto.BasePageDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 图表组件数据获取
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Slf4j
+@RestController
+@RequestMapping("/bigScreen/chart/data")
+@Api(tags = "图表组件数据获取")
+public class ChartDataController {
+
+    @Resource
+    private IDataRoomPageService pageService;
+    @Resource
+    private BaseChartDataService baseChartDataService;
+
+    @PostMapping("/list")
+    @ApiOperation(value = "图表数据", position = 10, notes = "获取指定图表的数据(通过唯一编码)", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<ChartDataVO> basicTableList(@RequestBody ChartDataSearchDTO chartDataSearchDTO) {
+        PageEntity pageEntity = pageService.getByCode(chartDataSearchDTO.getPageCode());
+        AssertUtils.isTrue(pageEntity != null, "页面不存在");
+        BasePageDTO config = pageEntity.getConfig();
+        List<Chart> chartList = null;
+        if (config.getClass().equals(DataRoomPageDTO.class)) {
+            chartList = ((DataRoomPageDTO) config).getChartList();
+        }
+        if (chartList == null) {
+            ChartDataVO mockData = ChartMockData.getMockData(chartDataSearchDTO.getType());
+            return R.success(mockData);
+        }
+        Chart chart = getByCode(chartList, chartDataSearchDTO.getChartCode());
+        return getChartData(chartDataSearchDTO, config, chart);
+    }
+
+    @PostMapping("/chart")
+    @ApiOperation(value = "图表数据", position = 10, notes = "获取指定图表的数据(通过配置)", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<ChartDataVO> getChartData(@RequestBody ChartDataSearchDTO chartDataSearchDTO) {
+        PageEntity pageEntity = pageService.getByCode(chartDataSearchDTO.getPageCode());
+        AssertUtils.isTrue(pageEntity != null, "页面不存在");
+        BasePageDTO config = pageEntity.getConfig();
+        Chart chart = chartDataSearchDTO.getChart();
+        return getChartData(chartDataSearchDTO, config, chart);
+    }
+
+    /**
+     * 获取图表数据
+     * @param chartDataSearchDTO
+     * @param config
+     * @param chart
+     * @return
+     */
+    private R<ChartDataVO> getChartData(ChartDataSearchDTO chartDataSearchDTO, BasePageDTO config, Chart chart) {
+        if (chart == null) {
+            ChartDataVO mockData = ChartMockData.getMockData(chartDataSearchDTO.getType());
+            return R.success(mockData);
+        }
+        try {
+            ChartDataVO chartDataVO = baseChartDataService.dataQuery(chart, chartDataSearchDTO);
+            if (chartDataVO == null) {
+                chartDataVO = ChartMockData.getMockData(chartDataSearchDTO.getType());
+            }
+            return R.success(chartDataVO);
+        } catch (Exception e) {
+            log.error("图表数据获取失败", e);
+            ChartDataVO mockData = ChartMockData.getMockData(chartDataSearchDTO.getType());
+            return R.success(mockData);
+        }
+    }
+
+    /**
+     * 从组件列表中获取指定code的图表组件
+     * @param chartList
+     * @param code
+     * @return
+     */
+    public Chart getByCode(List<Chart> chartList, String code) {
+        for (Chart chart : chartList) {
+            if (chart.getCode().equals(code)) {
+                return chart;
+            }
+        }
+        return null;
+    }
+}

+ 56 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/dto/ChartDataSearchDTO.java

@@ -0,0 +1,56 @@
+package com.gccloud.dataroom.core.module.chart.dto;
+
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.module.chart.bean.Filter;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 数据查询
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+public class ChartDataSearchDTO {
+
+    @ApiModelProperty(notes = "页面编码")
+    private String pageCode;
+
+    @ApiModelProperty(notes = "图表编码")
+    private String chartCode;
+
+    @ApiModelProperty(notes = "内部图表编码")
+    private String innerChartCode;
+
+    @ApiModelProperty(notes = "类型")
+    private String type;
+
+    @ApiModelProperty(notes = "当前页")
+    private Integer current;
+
+    @ApiModelProperty(notes = "每页记录数")
+    private Integer size;
+
+    @ApiModelProperty(notes = "树父节点id")
+    private String treeParentId;
+
+    @ApiModelProperty(notes = "图表配置,仅在根据配置临时获取数据时使用")
+    private Chart chart;
+
+    @ApiModelProperty("使用数据模型已有的关联关系进行联动查询")
+    private boolean linkByRelation = false;
+
+    @ApiModelProperty(notes = "联动模型编码")
+    private String relationModelCode;
+
+    @ApiModelProperty(notes = "联动关联值")
+    private String relationValue;
+
+    @ApiModelProperty(notes = "过滤条件")
+    private List<Filter> filterList;
+
+}
+

+ 267 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/service/BaseChartDataService.java

@@ -0,0 +1,267 @@
+package com.gccloud.dataroom.core.module.chart.service;
+
+import com.gccloud.dataroom.core.module.chart.dto.ChartDataSearchDTO;
+import com.gccloud.dataroom.core.module.chart.vo.ChartDataVO;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.module.chart.components.datasource.BaseChartDataSource;
+import com.gccloud.dataroom.core.module.chart.components.datasource.DataSetDataSource;
+import com.gccloud.dataroom.core.module.dataset.constant.ReportConstant;
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+import com.gccloud.dataroom.core.module.dataset.params.ParamsClient;
+import com.gccloud.dataroom.core.module.dataset.service.DsService;
+import com.gccloud.dataroom.core.module.dataset.vo.DataSetInfoVo;
+import com.gccloud.dataroom.core.exception.GlobalException;
+import com.gccloud.dataroom.core.utils.JSON;
+import com.gccloud.dataroom.core.vo.PageVO;
+import com.gccloud.dataroom.core.utils.GroovyUtils;
+import com.gccloud.dataroom.core.module.chart.bean.Chart;
+import com.gccloud.dataroom.core.module.chart.bean.Filter;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+@Slf4j
+@Service
+public class BaseChartDataService {
+
+    @Resource
+    private DsService dsService;
+
+    @Resource
+    private ParamsClient paramsClient;
+
+    public ChartDataVO dataQuery(Chart chart, ChartDataSearchDTO searchDTO) {
+        BaseChartDataSource dataSource = chart.getDataSource();
+        if (dataSource == null) {
+            return null;
+        }
+        if (!dataSource.getClass().equals(DataSetDataSource.class)) {
+            return null;
+        }
+        DataSetDataSource dataSetDataSource = (DataSetDataSource) dataSource;
+        DataSetInfoVo dataSetInfo = dsService.getDataSetDetails(dataSetDataSource.getBusinessKey());
+        if (dataSetInfo == null) {
+            return null;
+        }
+        if (ReportConstant.DataSetType.JSON.equals(dataSetInfo.getType())) {
+            return jsonDataQuery(dataSetInfo, dataSetDataSource);
+        }
+        return dataSetDataQuery(dataSetDataSource, chart,  searchDTO);
+    }
+
+
+
+    /**
+     * json类型的数据集数据处理
+     * @param dataSetInfo
+     * @param dataSetDataSource
+     * @return
+     */
+    private ChartDataVO jsonDataQuery(DataSetInfoVo dataSetInfo, DataSetDataSource dataSetDataSource) {
+        ChartDataVO dataDTO = new ChartDataVO();
+        Object jsonContent = dsService.executeJsonDataSet(dataSetDataSource.getBusinessKey());
+        List<Map<String, Object>> data = Lists.newArrayList();
+        if (jsonContent instanceof JSONArray) {
+            jsonContent = ((JSONArray) jsonContent).toList();
+        }
+        if (jsonContent instanceof ArrayList) {
+            ArrayList list = (ArrayList) jsonContent;
+            for (Object o : list) {
+                if (o instanceof HashMap) {
+                    data.add((HashMap<String, Object>) o);
+                }
+            }
+        }
+        if (jsonContent instanceof HashMap) {
+            HashMap map = (HashMap) jsonContent;
+            data.add(map);
+        }
+        if (jsonContent instanceof JSONObject) {
+            JSONObject jsonObject = (JSONObject) jsonContent;
+            data.add(jsonObject.toMap());
+        }
+        HashMap<String, ChartDataVO.ColumnData> columnData = Maps.newHashMap();
+        JSONArray fields = dataSetInfo.getFields();
+        fields.forEach(field -> {
+            JSONObject fieldMap = (JSONObject) field;
+            ChartDataVO.ColumnData column = new ChartDataVO.ColumnData();
+            column.setOriginalColumn(fieldMap.get("name").toString());
+            column.setAlias(fieldMap.get("name").toString());
+            column.setRemark(fieldMap.get("comment").toString());
+            column.setTableName(fieldMap.get("sourceTable").toString());
+            column.setType(fieldMap.get("type").toString());
+            columnData.put(fieldMap.get("name").toString(), column);
+        });
+        dataDTO.setData(data);
+        dataDTO.setSuccess(true);
+        dataDTO.setColumnData(columnData);
+        return dataDTO;
+    }
+
+
+    /**
+     * 根据数据集数据源查询数据
+     * @param dataSource
+     * @return
+     */
+    private ChartDataVO dataSetDataQuery(DataSetDataSource dataSource, Chart chart, ChartDataSearchDTO searchDTO) {
+        ChartDataVO dataDTO = new ChartDataVO();
+        List<DatasetParamDto> params = Lists.newArrayList();
+        if (StringUtils.isBlank(dataSource.getBusinessKey())) {
+            throw new GlobalException("图表未配置数据集");
+        }
+        DataSetInfoVo dataSetInfoVo = dsService.getDataSetDetails(dataSource.getBusinessKey());
+        HashMap<String, ChartDataVO.ColumnData> columnData = Maps.newHashMap();
+        dataDTO.setSql(dataSetInfoVo.getData());
+        JSONArray fields = dataSetInfoVo.getFields();
+        fields.forEach(field -> {
+            JSONObject fieldMap = (JSONObject) field;
+            ChartDataVO.ColumnData column = new ChartDataVO.ColumnData();
+            column.setOriginalColumn(fieldMap.get("name").toString());
+            column.setAlias(fieldMap.get("name").toString());
+            column.setRemark(fieldMap.get("comment").toString());
+            column.setTableName(fieldMap.get("sourceTable").toString());
+            column.setType(fieldMap.get("type").toString());
+            columnData.put(fieldMap.get("name").toString(), column);
+        });
+        if (chart.getType().equals(PageDesignConstant.DataRoom.Type.TABLES)) {
+            // 表格的话,要按照dimensionFieldList对columnData进行排序
+            List<String> dimensionFieldList = dataSource.getDimensionFieldList();
+            LinkedHashMap<String, ChartDataVO.ColumnData> newColumnData = Maps.newLinkedHashMap();
+            dimensionFieldList.forEach(dimensionField -> newColumnData.put(dimensionField, columnData.get(dimensionField)));
+            // 剩下的字段按照原来的顺序放到后面
+            columnData.forEach((key, value) -> {
+                if (!newColumnData.containsKey(key)) {
+                    newColumnData.put(key, value);
+                }
+            });
+        }
+        if (dataSource.getParams() != null && dataSource.getParams().size() > 0) {
+            JSONArray setParams = dataSetInfoVo.getParams();
+            setParams.forEach(setParam -> {
+                JSONObject setParamMap = (JSONObject) setParam;
+                if (!dataSource.getParams().containsKey(setParamMap.get("name").toString())) {
+                    return;
+                }
+                DatasetParamDto param = new DatasetParamDto();
+                param.setType(setParamMap.get("type").toString());
+                param.setName(setParamMap.get("name").toString());
+                String value = dataSource.getParams().get(setParamMap.get("name").toString()).toString();
+                // 如果传入了过滤条件,优先使用过滤条件
+                if (searchDTO.getFilterList() != null && searchDTO.getFilterList().size() > 0) {
+                    for (Filter filter : searchDTO.getFilterList()) {
+                        if (filter.getColumn() == null) {
+                            continue;
+                        }
+                        if (filter.getColumn().equals(setParamMap.get("name").toString())) {
+                            if (filter.getValue() == null || filter.getValue().size() == 0) {
+                                continue;
+                            }
+                            value = filter.getValue().get(0);
+                            break;
+                        }
+                    }
+                }
+                param.setValue(value);
+                param.setStatus(1);
+                params.add(param);
+            });
+        } else {
+            // 组件配置的数据集参数为空,则使用数据集默认的参数
+            JSONArray setParams = dataSetInfoVo.getParams();
+            if (setParams == null) {
+                setParams = new JSONArray();
+            }
+            setParams.forEach(setParam -> {
+                JSONObject setParamMap = (JSONObject) setParam;
+                DatasetParamDto param = new DatasetParamDto();
+                param.setType(setParamMap.get("type").toString());
+                param.setName(setParamMap.get("name").toString());
+                param.setValue(setParamMap.get("value").toString());
+                param.setStatus(1);
+                params.add(param);
+            });
+        }
+        dataDTO.setColumnData(columnData);
+        Object data;
+        DataSetInfoVo dataSetInfo = dsService.getDataSetDetails(dataSource.getBusinessKey());
+        if (ReportConstant.DataSetType.SCRIPT.equals(dataSetInfo.getType())) {
+            String script = dataSetInfo.getData();
+            data = this.runScriptDataSet(script, params);
+            dataDTO.setData(data);
+            dataDTO.setSuccess(true);
+            return dataDTO;
+        }
+        log.info("查询数据集数据,SQL:{}", dataDTO.getSql().replace("\n", " "));
+        log.info("查询数据集数据,参数:{}", JSON.toJSONString(params));
+        if (dataSource.getServerPagination() != null && dataSource.getServerPagination() && searchDTO.getSize() != null && searchDTO.getCurrent() != null) {
+            PageVO pageResult = dsService.execute(dataSource.getBusinessKey(), params, searchDTO.getCurrent(), searchDTO.getSize());
+            data = pageResult.getList();
+            dataDTO.setTotalCount((int)pageResult.getTotalCount());
+            dataDTO.setTotalPage((int)pageResult.getTotalPage());
+        } else {
+            data = dsService.execute(dataSource.getBusinessKey(), params);
+        }
+        dataDTO.setData(data);
+        dataDTO.setSuccess(true);
+        return dataDTO;
+    }
+
+    /**
+     * 执行groovy脚本
+     * @param script
+     * @param params
+     * @return
+     */
+    public Object runScriptDataSet(String script, List<DatasetParamDto> params) {
+        params = paramsClient.handleParams(params);
+        Map<String, Object> paramMap = new HashMap<>(16);
+        if (!CollectionUtils.isEmpty(params)) {
+            params.forEach(r -> paramMap.put(r.getName(), r.getValue()));
+        }
+        Class clazz = GroovyUtils.buildClass(script);
+        if (clazz == null) {
+            throw new GlobalException("脚本编译异常");
+        }
+        return GroovyUtils.run(script, paramMap);
+    }
+
+    /**
+     * 获取聚合函数汉化
+     * @param aggregate
+     * @return
+     */
+    public String getAggregateName(String aggregate) {
+        switch (aggregate) {
+            case PageDesignConstant.DataRoom.Aggregate.COUNT:
+                return "[统计]";
+            case PageDesignConstant.DataRoom.Aggregate.SUM:
+                return "[求和]";
+            case PageDesignConstant.DataRoom.Aggregate.AVG:
+                return "[平均值]";
+            case PageDesignConstant.DataRoom.Aggregate.MAX:
+                return "[最大值]";
+            case PageDesignConstant.DataRoom.Aggregate.MIN:
+                return "[最小值]";
+            case PageDesignConstant.DataRoom.Aggregate.COUNT_DISTINCT:
+                return "[去重统计]";
+            default:
+                return "[" + aggregate + "]";
+        }
+    }
+}

+ 58 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/service/ChartMockData.java

@@ -0,0 +1,58 @@
+package com.gccloud.dataroom.core.module.chart.service;
+
+import com.gccloud.dataroom.core.module.chart.vo.ChartDataVO;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import com.gccloud.dataroom.core.utils.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2022/8/25 17:09
+ */
+@Slf4j
+@Service("chartMockDataService")
+public class ChartMockData {
+
+    public static ChartDataVO getMockData(String type) {
+        ChartDataVO chartDataDTO;
+        String fileName = "chart/mock/" + type + ".json";
+        if (PageDesignConstant.DataRoom.Type.SCREEN_SCROLL_BOARD.equals(type)) {
+            fileName = "chart/mock/tables.json";
+        }
+        if (PageDesignConstant.DataRoom.Type.SCREEN_SCROLL_RANKING.equals(type)) {
+            fileName = "chart/mock/ranking.json";
+        }
+        String json = "";
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        try {
+            Resource[] resources = resolver.getResources(fileName);
+            Resource resource = resources[0];
+            if (!resource.exists()) {
+                return new ChartDataVO();
+            }
+            //获得文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流
+            InputStream stream = resource.getInputStream();
+            StringBuilder buffer = new StringBuilder();
+            byte[] bytes = new byte[1024];
+            for (int n; (n = stream.read(bytes)) != -1; ) {
+                buffer.append(new String(bytes, 0, n));
+            }
+            json = buffer.toString();
+        } catch (IOException e) {
+            log.error(ExceptionUtils.getStackTrace(e));
+            return new ChartDataVO();
+        }
+        chartDataDTO = JSON.parseObject(json, ChartDataVO.class);
+        return chartDataDTO;
+    }
+
+}

+ 69 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/vo/ChartDataVO.java

@@ -0,0 +1,69 @@
+package com.gccloud.dataroom.core.module.chart.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 图表响应数据
+ * @author liuchengbiao
+ * @version 1.0
+ * @date 2022/8/8 15:11
+ */
+@Data
+public class ChartDataVO {
+
+    /**
+     * 是否成功
+     */
+    private Boolean success = Boolean.FALSE;
+
+    /**
+     * 返回的数据
+     */
+    @ApiModelProperty(notes = "返回的数据")
+    private Object data;
+
+    /**
+     * 总记录数,在table类型的图表开启分页时使用
+     */
+    @ApiModelProperty(notes = "总记录数")
+    private Integer totalCount = 0;
+
+    /**
+     * 总页数,在table类型的图表开启分页时使用
+     */
+    @ApiModelProperty(notes = "总页数")
+    private Integer totalPage = 0;
+
+    @ApiModelProperty(notes = "执行的SQL")
+    private String sql;
+
+    @ApiModelProperty(notes = "列属性")
+    private Map<String, ColumnData> columnData;
+
+    @Data
+    public static class ColumnData {
+
+        @ApiModelProperty(notes = "字段类型")
+        private String type;
+
+        @ApiModelProperty(notes = "表名")
+        private String tableName;
+
+        @ApiModelProperty(notes = "字段名")
+        private String originalColumn;
+
+        @ApiModelProperty(notes = "聚合函数")
+        private String aggregate;
+
+        @ApiModelProperty(notes = "别名")
+        private String alias;
+
+        @ApiModelProperty(notes = "备注")
+        private String remark;
+
+    }
+
+}

+ 498 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/common/DbCommon.java

@@ -0,0 +1,498 @@
+package com.gccloud.dataroom.core.module.dataset.common;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+import com.gccloud.dataroom.core.module.dataset.constant.ReportConstant;
+import com.gccloud.dataroom.core.module.dataset.constant.ReportDbType;
+import com.gccloud.dataroom.core.module.dataset.entity.DatasourceConfig;
+import com.gccloud.dataroom.core.module.dataset.utils.DBUtils;
+import com.gccloud.dataroom.core.module.dataset.utils.DESUtils;
+import com.gccloud.dataroom.core.module.dataset.utils.ReportUtils;
+import com.gccloud.dataroom.core.module.dataset.utils.TelePGDBUtils;
+import com.gccloud.dataroom.core.exception.GlobalException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.sql.*;
+import java.util.*;
+
+/**
+ * 数据源工具类公共类
+ *
+ * @author pan.shun
+ * @since 2022/9/6 09:13
+ */
+@Slf4j
+public class DbCommon {
+
+    private static final String SQL = "SELECT * FROM  ";
+
+    /**
+     * 获取数据库连接
+     *
+     * @param datasourceConfig 数据源
+     */
+    public static Connection getConnection(DatasourceConfig datasourceConfig) {
+        Connection connection;
+        try {
+            Class.forName(datasourceConfig.getDriverClassName());
+            if (datasourceConfig.getUsername() != null && datasourceConfig.getPassword() != null) {
+                connection = DriverManager.getConnection(
+                        datasourceConfig.getUrl(), datasourceConfig.getUsername(), DESUtils.getDecryptString(datasourceConfig.getPassword()));
+            } else {
+                connection = DriverManager.getConnection(datasourceConfig.getUrl());
+            }
+
+        } catch (SQLSyntaxErrorException e) {
+            log.error(e.getMessage());
+            throw new GlobalException("数据库不存在");
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw new GlobalException(getExceptionMessage(e.getMessage()));
+        }
+        return connection;
+    }
+
+
+    /**
+     * 关闭连接
+     */
+    protected static void finalUtils(Connection conn) {
+        try {
+            if (conn != null) {
+                conn.close();
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 异常提示信息汉化处理
+     *
+     * @param message 异常message
+     */
+    private static String getExceptionMessage(String message) {
+        if (message.contains("Connection refused")) {
+            return "数据源连接超时";
+        } else if (message.contains("password")) {
+            return "数据源用户名或密码有误";
+        } else if (message.contains("Database")) {
+            return "数据库不存在";
+        } else if (message.contains("driver")) {
+            return "数据源连接url格式有误";
+        } else if (message.contains("TCP/IP connection")) {
+            return "数据源连接超时";
+        } else if (message.contains("does not exist")) {
+            return "数据库不存在";
+        } else {
+            return message;
+        }
+    }
+
+    /**
+     * 将sql语句中中进行非空标签的处理,同时参数变量替换成实际值
+     *
+     * @param sql    sql语句
+     * @param params 参数配置
+     */
+    public static String updateParamsConfig(String sql, List<DatasetParamDto> params) {
+        if (CollectionUtils.isEmpty(params)) {
+            return sql;
+        }
+        for (DatasetParamDto param : params) {
+            if (null == param.getStatus()) {
+                continue;
+            }
+            if (!ReportConstant.SqlParamsStatus.VARIABLE.equals(param.getStatus())) {
+                continue;
+            }
+//            checkParamsCode(sql, param.getName());
+            if (sql.contains("<" + param.getName() + ">") && sql.contains("</" + param.getName() + ">")) {
+                if (StringUtils.isEmpty(param.getValue())) {
+                    // 具备非空判断标签中的内容给去掉
+                    sql = ReportUtils.subRangeString(sql, "<" + param.getName() + ">", "</" + param.getName() + ">");
+                } else {
+                    sql = sql
+                            .replaceAll("<" + param.getName() + ">", "")
+                            .replaceAll("</" + param.getName() + ">", "");
+                    sql = parameterReplace(param, sql);
+                }
+            } else {
+                // 不具备非空判断标签
+                sql = parameterReplace(param, sql);
+            }
+        }
+        params.removeIf(next -> next.getStatus() != null && next.getStatus().equals(ReportConstant.SqlParamsStatus.VARIABLE));
+        return sql;
+    }
+
+    /**
+     * 将sql语句中?参数值插入进去
+     */
+    protected static void insertParamsConfig(List<DatasetParamDto> params, PreparedStatement pStemt) throws SQLException {
+        if (params.size() > 0) {
+            int size = params.size();
+            for (int i = 0; i < size; i++) {
+                if (StringUtils.isEmpty(params.get(i).getValue())) {
+                    throw new GlobalException("参数值不能为空");
+                }
+                pStemt.setObject(i + 1, params.get(i).getValue());
+            }
+        }
+    }
+
+    /**
+     * 参数名合法性校验
+     */
+    private static void checkParamsCode(String sql, String paramName) {
+        if (!sql.contains("${" + paramName + "}")) {
+            throw new GlobalException("全局变量 ${" + paramName + "}暂未配置");
+        }
+    }
+
+    /**
+     * sq语句中参数变量赋值
+     */
+    private static String parameterReplace(DatasetParamDto param, String sql) {
+        if ("String".equalsIgnoreCase(param.getType()) || "Date".equalsIgnoreCase(param.getType())) {
+            if (param.getValue().contains(",")) {
+                sql = sql.replaceAll("\\$\\{" + param.getName() + "\\}", param.getValue());
+            } else {
+                sql = sql.replaceAll("\\$\\{" + param.getName() + "\\}", "'" + param.getValue() + "'");
+            }
+        } else {
+            sql = sql.replaceAll("\\$\\{" + param.getName() + "\\}", param.getValue());
+        }
+        return sql;
+    }
+
+
+    /**
+     * 获取数据库表字段、属性 暂提供 mysql clickHouse
+     *
+     * @param tableName        表名
+     * @param datasourceConfig 数据源
+     */
+    public static List<Map<String, Object>> getFieldNameAndType(String tableName, DatasourceConfig datasourceConfig) {
+        List<Map<String, Object>> fieldAndTypeList = new ArrayList<>();
+        Connection conn = getConnection(datasourceConfig);
+
+        String sourceType = datasourceConfig.getSourceType();
+        /*列名注释集合*/
+        List<String> columnComments = new ArrayList<>();
+        switch (sourceType) {
+            case "Mysql":
+                PreparedStatement pStemt;
+                ResultSet rs;
+                String tableSql = SQL + tableName + " limit 0";
+                try {
+                    pStemt = conn.prepareStatement(tableSql);
+                    ResultSetMetaData rsmd = pStemt.getMetaData();
+                    rs = pStemt.executeQuery("show full columns from " + tableName);
+                    while (rs.next()) {
+                        columnComments.add(rs.getString("Comment"));
+                    }
+                    int size = rsmd.getColumnCount();
+                    insertIntoFieldTypeList(size, rsmd, columnComments, fieldAndTypeList);
+
+                } catch (SQLException e) {
+                    log.error("获取" + tableName + "表字段失败:" + e.getMessage());
+                    throw new GlobalException("获取" + tableName + "表字段失败");
+                } catch (Exception e) {
+                    log.error("获取表字段失败:{}", ExceptionUtils.getStackTrace(e));
+                    throw new GlobalException("获取表字段失败" + e.getMessage());
+                } finally {//关闭连接
+                    finalUtils(conn);
+                }
+                break;
+            case "ClickHouse":
+                PreparedStatement statement;
+                String cTableSql = SQL + "\"" + tableName + "\"" + " limit 0";
+                try {
+                    statement = conn.prepareStatement(cTableSql);
+                    ResultSet clickRs = statement.executeQuery();
+                    ResultSetMetaData rsmd = clickRs.getMetaData();
+                    //获取字段注释
+                    ResultSet resultSet = statement.executeQuery("SELECT name as COLUMN_NAME,comment as COLUMN_COMMENT FROM system.columns c WHERE `table` = '" + tableName + "'");
+                    while (resultSet.next()) {
+                        columnComments.add(resultSet.getString("COLUMN_COMMENT"));
+                    }
+                    int size = rsmd.getColumnCount();
+                    insertIntoFieldTypeList(size, rsmd, columnComments, fieldAndTypeList);
+
+                } catch (SQLException e) {
+                    log.error("获取" + tableName + "表字段失败:" + e.getMessage());
+                    throw new GlobalException("获取" + tableName + "表字段失败");
+                } catch (Exception e) {
+                    log.error("获取表字段失败:{}", ExceptionUtils.getStackTrace(e));
+                    throw new GlobalException("获取表字段失败" + e.getMessage());
+                } finally {//关闭连接
+                    finalUtils(conn);
+                }
+                break;
+            case "TelePG":
+                PreparedStatement tstatement;
+                String tTableSql = SQL + tableName + " limit 0";
+                try {
+                    tstatement = conn.prepareStatement(tTableSql);
+                    ResultSet clickRs = tstatement.executeQuery();
+                    ResultSetMetaData rsmd = clickRs.getMetaData();
+                    //获取注释
+                    tstatement = conn.prepareStatement("SELECT A.attname as COLUMN_NAME,col_description ( A.attrelid,A.attnum ) as COLUMN_COMMENT FROM pg_class as C,pg_attribute as A WHERE C.relname = '" + tableName + "' and A.attrelid = C.oid and A.attnum > 0");
+                    ResultSet resultSet = tstatement.executeQuery();
+                    while (resultSet.next()) {
+                        columnComments.add(resultSet.getString("column_comment"));
+                    }
+                    int size = rsmd.getColumnCount();
+                    insertIntoFieldTypeList(size, rsmd, columnComments, fieldAndTypeList);
+
+                } catch (SQLException e) {
+                    log.error("获取" + tableName + "表字段失败:" + e.getMessage());
+                    throw new GlobalException("获取" + tableName + "表字段失败");
+                } catch (Exception e) {
+                    log.error("获取表字段失败:{}", ExceptionUtils.getStackTrace(e));
+                    throw new GlobalException("获取表字段失败" + e.getMessage());
+                } finally {//关闭连接
+                    finalUtils(conn);
+                }
+                break;
+            case "Hive":
+                PreparedStatement hstatement;
+                String hTableSql = SQL + tableName;
+                try {
+                    hstatement = conn.prepareStatement(hTableSql);
+                    ResultSet clickRs = hstatement.executeQuery();
+                    ResultSetMetaData rsmd = clickRs.getMetaData();
+                    int size = rsmd.getColumnCount();
+                    for (int i = 0; i < size; i++) {
+                        Map<String, Object> map = new HashMap<>(16);
+                        map.put("columnName", rsmd.getColumnName(i + 1));
+                        map.put("columnType", rsmd.getColumnTypeName(i + 1));
+                        fieldAndTypeList.add(map);
+                    }
+                } catch (SQLException e) {
+                    log.error("获取" + tableName + "表字段失败:" + e.getMessage());
+                    throw new GlobalException("获取" + tableName + "表字段失败");
+                } catch (Exception e) {
+                    log.error("获取表字段失败:{}", ExceptionUtils.getStackTrace(e));
+                    throw new GlobalException("获取表字段失败" + e.getMessage());
+                } finally {//关闭连接
+                    finalUtils(conn);
+                }
+                break;
+
+            case "Oracle":
+                PreparedStatement ostatement;
+                PreparedStatement ostatement1;
+                String oTableSql = SQL + "\"" + tableName + "\"" + " where ROWNUM=0 ";
+                try {
+                    ostatement = conn.prepareStatement(oTableSql);
+                    ResultSet clickRs = ostatement.executeQuery();
+                    ResultSetMetaData rsmd = clickRs.getMetaData();
+
+                    //获取字段注释
+                    String fieldAndCommentSql =
+                            "SELECT a.column_name,b.comments FROM user_tab_columns a, user_col_comments b WHERE a.table_name = '" + tableName + "' and b.table_name = '" + tableName + "' and a.column_name = b.column_name";
+                    ostatement1 = conn.prepareStatement(fieldAndCommentSql);
+                    ResultSet resultSet = ostatement1.executeQuery();
+                    Map<String, String> fieldCommentMap = new HashMap<>();
+                    while (resultSet.next()) {
+                        fieldCommentMap.put(resultSet.getString("COLUMN_NAME"), resultSet.getString("COMMENTS"));
+                    }
+                    int size = rsmd.getColumnCount();
+                    for (int i = 0; i < size; i++) {
+                        Map<String, Object> map = new HashMap<>();
+                        map.put("columnName", rsmd.getColumnName(i + 1));
+                        map.put("columnType", rsmd.getColumnTypeName(i + 1));
+                        Set<String> filedNames = fieldCommentMap.keySet();
+                        for (String filedName : filedNames) {
+                            if (filedName.equals(rsmd.getColumnName(i + 1))) {
+                                map.put("columnComment", fieldCommentMap.get(filedName));
+                                break;
+                            }
+                        }
+                        fieldAndTypeList.add(map);
+                    }
+                } catch (SQLException e) {
+                    log.error("获取" + tableName + "表字段失败:" + e.getMessage());
+                    throw new GlobalException("获取" + tableName + "表字段失败");
+                } catch (Exception e) {
+                    log.error("获取表字段失败:{}", ExceptionUtils.getStackTrace(e));
+                    throw new GlobalException("获取表字段失败" + e.getMessage());
+                } finally {//关闭连接
+                    finalUtils(conn);
+                }
+                break;
+            default:
+                log.error("获取" + tableName + "表字段失败");
+                throw new GlobalException("获取" + tableName + "表字段失败");
+        }
+        return fieldAndTypeList;
+    }
+
+    private static void insertIntoFieldTypeList(
+            int size,
+            ResultSetMetaData resultSetMetaData,
+            List<String> columnComments,
+            List<Map<String, Object>> fieldAndTypeList) throws SQLException {
+        for (int i = 0; i < size; i++) {
+            Map<String, Object> map = new HashMap<>(16);
+            map.put("columnName", resultSetMetaData.getColumnName(i + 1));
+            map.put("columnType", resultSetMetaData.getColumnTypeName(i + 1));
+            map.put("columnComment", columnComments.get(i));
+            fieldAndTypeList.add(map);
+        }
+    }
+
+    /**
+     * 创建视图
+     */
+    public static void createView(String sql, String code, List<DatasetParamDto> params, DatasourceConfig datasourceConfig) {
+        Connection conn = getConnection(datasourceConfig);
+        PreparedStatement pStemt;
+        sql = updateParamsConfig(sql, params);
+        try {
+            //执行创建表的 sql脚本
+            String createSql = "CREATE VIEW " + code + "  AS " + sql;
+            pStemt = conn.prepareStatement(createSql);
+            insertParamsConfig(params, pStemt);
+            pStemt.executeUpdate();
+        } catch (SQLException e) {
+            log.error("创建视图失败:{}", e.getMessage());
+            throw new GlobalException("创建视图失败");
+        } catch (ArrayIndexOutOfBoundsException e) {
+            log.error(e.getMessage());
+            throw new GlobalException("请检查参数配置与SQL加工脚本是否对应");
+        } catch (Exception e) {
+            log.error("创建视图失败:{}", ExceptionUtils.getStackTrace(e));
+            throw new GlobalException("创建视图失败" + e.getMessage());
+        } finally {//关闭连接
+            finalUtils(conn);
+        }
+    }
+
+    /**
+     * 删除视图
+     *
+     * @param viewName         视图名
+     * @param datasourceConfig 数据源
+     */
+    protected static void dropView(String viewName, DatasourceConfig datasourceConfig, String dbType) {
+        Connection conn = getConnection(datasourceConfig);
+        PreparedStatement pStemt;
+        try {
+            String sql;
+            if (ReportDbType.POSTGRESQL.getUpInfo().equals(dbType)) {
+                sql = "DROP VIEW IF EXISTS " + "\"" + viewName + "\"";
+            } else {
+                sql = "DROP VIEW IF EXISTS " + viewName;
+            }
+            pStemt = conn.prepareStatement(sql);
+            pStemt.executeUpdate();
+        } catch (SQLException e) {
+            log.error("删除视图失败:{}", e.getMessage());
+            throw new GlobalException("删除视图失败");
+        } catch (Exception e) {
+            log.error("删除视图失败:{}", ExceptionUtils.getStackTrace(e));
+            throw new GlobalException("删除视图失败" + e.getMessage());
+        } finally {//关闭连接
+            finalUtils(conn);
+        }
+    }
+
+
+    /**
+     * 获取表字段描述信息
+     */
+    public static Map<String, String> getTableFieldComment(String tableName, String sourceType, DatasourceConfig datasourceConfig) {
+        String sql;
+        Map<String, List<Map<String, Object>>> valueMap;
+        Map<String, String> fieldCommentMap = new HashMap<>(16);
+        switch (sourceType) {
+            case "Mysql":
+                sql = "select column_name,column_comment from information_schema.columns where table_name='" + tableName + "'";
+                valueMap = DBUtils.getClickHouseValue(sql, new ArrayList<>(), datasourceConfig);
+                valueMap.get("dataPreview").forEach((r) -> fieldCommentMap.put(String.valueOf(r.get("column_name")), String.valueOf(r.get("column_comment"))));
+                return fieldCommentMap;
+            case "ClickHouse":
+                sql = "SELECT name as COLUMN_NAME,comment as COLUMN_COMMENT FROM system.columns c WHERE `table` = '" + tableName + "'";
+                valueMap = DBUtils.getClickHouseValue(sql, new ArrayList<>(), datasourceConfig);
+                valueMap.get("dataPreview").forEach((r) -> fieldCommentMap.put(String.valueOf(r.get("COLUMN_NAME")), String.valueOf(r.get("COLUMN_COMMENT"))));
+                return fieldCommentMap;
+            case "TelePG":
+                sql = "SELECT A.attname AS COLUMN_NAME,col_description ( A.attrelid, A.attnum ) AS COLUMN_COMMENT FROM pg_class AS C,pg_attribute AS A WHERE C.relname = '" + tableName + "'  AND A.attrelid = C.oid  AND A.attnum > 0";
+                valueMap = TelePGDBUtils.getClickHouseValue(sql, new ArrayList<>(), datasourceConfig);
+                valueMap.get("dataPreview").forEach((r) -> fieldCommentMap.put(String.valueOf(r.get("column_name")), String.valueOf(r.get("column_comment"))));
+                return fieldCommentMap;
+            case "Hive":
+                sql = "describe extended " + tableName;
+                valueMap = TelePGDBUtils.getHiveFieldComment(sql, new ArrayList<>(), datasourceConfig);
+                valueMap.get("dataPreview").forEach((r) -> fieldCommentMap.put(String.valueOf(r.get("col_name")), String.valueOf(r.get("comment"))));
+                return fieldCommentMap;
+            case "Oracle":
+                sql = "SELECT a.column_name,b.comments FROM user_tab_columns a, user_col_comments b WHERE a.table_name = '" + tableName + "' and b.table_name = '" + tableName + "' and a.column_name = b.column_name";
+                valueMap = DBUtils.getClickHouseValue(sql, new ArrayList<>(), datasourceConfig);
+                valueMap.get("dataPreview").forEach((r) -> fieldCommentMap.put(String.valueOf(r.get("COLUMN_NAME")), String.valueOf(r.get("COMMENTS"))));
+                return fieldCommentMap;
+            default:
+                return new HashMap<>();
+        }
+    }
+
+    /**
+     * 获取表描述信息
+     */
+    public static Map<String, String> getTableComment(List<String> tableName, DatasourceConfig datasourceConfig) {
+        if (CollectionUtils.isEmpty(tableName)) {
+            return null;
+        }
+        StringBuilder sqlConditionBuilder = new StringBuilder();
+        for (String tName : tableName) {
+            sqlConditionBuilder.append("'").append(tName).append("'").append(",");
+        }
+        String sqlCondition = sqlConditionBuilder.toString();
+        if (sqlCondition.endsWith(",")) {
+            sqlCondition = sqlCondition.substring(0, sqlCondition.length() - 1);
+        }
+        sqlCondition = " in (" + sqlCondition + ") ";
+
+        Map<String, String> tableCommentMap = new HashMap<>(16);
+
+        String sql;
+
+        switch (datasourceConfig.getSourceType()) {
+            case "Mysql":
+                sql = "SELECT table_name,table_comment FROM `information_schema`.tables where table_comment is not null  and TABLE_NAME " + sqlCondition;
+                return buildMap(tableCommentMap, sql, datasourceConfig);
+            case "ClickHouse":
+                return null;
+            case "TelePG":
+                sql = "select relname as TABLE_NAME,cast ( obj_description ( relfilenode,'pg_class' ) as VARCHAR ) as TABLE_COMMENT from pg_class C where cast ( obj_description ( relfilenode, 'pg_class' ) as VARCHAR ) is not null and relname " + sqlCondition;
+                return buildMap(tableCommentMap, sql, datasourceConfig);
+            case "Oracle":
+                sql = "select TABLE_NAME,COMMENTS AS table_comment from user_tab_comments WHERE TABLE_NAME " + sqlCondition;
+                return buildMap(tableCommentMap, sql, datasourceConfig);
+            default:
+                throw new GlobalException("当前数据源【" + datasourceConfig.getSourceType() + "】暂未作适配,请联系管理员");
+        }
+    }
+
+    private static Map<String, String> buildMap(Map<String, String> tableCommentMap, String sql, DatasourceConfig datasourceConfig) {
+        String tableNameKey;
+        String tableCommentKey;
+        if (datasourceConfig.getSourceType().equalsIgnoreCase(ReportDbType.ORACLE.getUpInfo())) {
+            tableNameKey = "TABLE_NAME";
+            tableCommentKey = "TABLE_COMMENT";
+        } else {
+            tableNameKey = "table_name";
+            tableCommentKey = "table_comment";
+        }
+        Map<String, List<Map<String, Object>>> valueMap = DBUtils.getClickHouseValue(sql, new ArrayList<>(), datasourceConfig);
+        List<Map<String, Object>> mapList = valueMap.get("dataPreview");
+        mapList.forEach(map -> tableCommentMap.put(String.valueOf(map.get(tableNameKey)), !StringUtils.isEmpty(map.get(tableCommentKey)) ? String.valueOf(map.get(tableCommentKey)) : null));
+        return tableCommentMap;
+    }
+
+}

+ 65 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/OracleTypes.java

@@ -0,0 +1,65 @@
+package com.gccloud.dataroom.core.module.dataset.constant;
+
+/**
+ * @author pan.shun
+ * @since 2022/9/2 13:32
+ */
+public abstract class OracleTypes {
+    public static final int BIT = -7;
+    public static final int TINYINT = -6;
+    public static final int SMALLINT = 5;
+    public static final int INTEGER = 4;
+    public static final int BIGINT = -5;
+    public static final int FLOAT = 6;
+    public static final int REAL = 7;
+    public static final int DOUBLE = 8;
+    public static final int NUMERIC = 2;
+    public static final int DECIMAL = 3;
+    public static final int CHAR = 1;
+    public static final int VARCHAR = 12;
+    public static final int LONGVARCHAR = -1;
+    public static final int DATE = 91;
+    public static final int TIME = 92;
+    public static final int TIMESTAMP = 93;
+    public static final int PLSQL_BOOLEAN = 252;
+    /**
+     * @deprecated
+     */
+    public static final int TIMESTAMPNS = -100;
+    public static final int TIMESTAMPTZ = -101;
+    public static final int TIMESTAMPLTZ = -102;
+    public static final int INTERVALYM = -103;
+    public static final int INTERVALDS = -104;
+    public static final int BINARY = -2;
+    public static final int VARBINARY = -3;
+    public static final int LONGVARBINARY = -4;
+    public static final int ROWID = -8;
+    public static final int CURSOR = -10;
+    public static final int BLOB = 2004;
+    public static final int CLOB = 2005;
+    public static final int BFILE = -13;
+    public static final int STRUCT = 2002;
+    public static final int ARRAY = 2003;
+    public static final int REF = 2006;
+    public static final int NCHAR = -15;
+    public static final int NCLOB = 2011;
+    public static final int NVARCHAR = -9;
+    public static final int LONGNVARCHAR = -16;
+    public static final int SQLXML = 2009;
+    public static final int OPAQUE = 2007;
+    public static final int JAVA_STRUCT = 2008;
+    public static final int JAVA_OBJECT = 2000;
+    public static final int PLSQL_INDEX_TABLE = -14;
+    public static final int BINARY_FLOAT = 100;
+    public static final int BINARY_DOUBLE = 101;
+    public static final int NULL = 0;
+    public static final int NUMBER = 2;
+    public static final int RAW = -2;
+    public static final int OTHER = 1111;
+    public static final int FIXED_CHAR = 999;
+    public static final int DATALINK = 70;
+    public static final int BOOLEAN = 16;
+
+    public OracleTypes() {
+    }
+}

+ 144 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportConstant.java

@@ -0,0 +1,144 @@
+package com.gccloud.dataroom.core.module.dataset.constant;
+
+/**
+ * 报表常量
+ *
+ * @author pan.shun
+ * @since 2022/3/4 15:41
+ */
+public interface ReportConstant {
+    /**
+     * 结果固化形式
+     */
+    interface CuringType {
+        /**
+         * 存储过程
+         */
+        String STORED_PROCEDURE = "3";
+        /**
+         * 视图
+         */
+        String VIEW = "2";
+        /**
+         * 表
+         */
+        String TABLE = "1";
+    }
+
+    /**
+     * 是否去重
+     */
+    interface DataRepeat {
+        /**
+         * 不去重
+         */
+        Integer NOT_REPEAT = 1;
+        /**
+         * 默认 去重
+         */
+        Integer DEFAULT = 0;
+    }
+
+    /**
+     * 报表最大先限制条数
+     */
+    interface MaxDataSize {
+        interface QueryDetailMax {
+            /**
+             * 预览时查询数据量限制
+             */
+            Integer MAX_SIZE = 20;
+        }
+    }
+
+    /**
+     * SQL中的参数状态
+     */
+    interface SqlParamsStatus {
+        /**
+         * 默认
+         */
+        Integer DEFAULT = 0;
+        /**
+         * 变量
+         */
+        Integer VARIABLE = 1;
+    }
+
+    /**
+     * SQL中的参数类型
+     */
+    interface SqlParamsType {
+
+        /**
+         * 字符串参数,在替换sql中参数值时,会固定在值两侧加上单引号
+         */
+        String STRING = "String";
+
+        /**
+         * 日期参数
+         */
+        String DATE = "Date";
+
+        /**
+         * 整型
+         */
+        String INTEGER = "Integer";
+
+        /**
+         * 长整型
+         */
+        String LONG = "Long";
+
+        /**
+         * 浮点型
+         */
+        String DOUBLE = "Double";
+
+    }
+
+    /**
+     * 数据集加工类型
+     */
+    interface ProcessType {
+        /**
+         * 可视化数据加工
+         */
+        String VIEW_PROCESS = "1";
+        /**
+         * sql 数据加工
+         */
+        String SQL_PROCESS = "2";
+        /**
+         * 代码编辑器
+         */
+        String CODE_PROCESS = "3";
+    }
+
+    interface DataSetType {
+        /**
+         * 自助数据集 /SQL
+         */
+        String CUSTOM = "custom";
+        /**
+         * 数据模型数据集
+         */
+        String MODEL = "dataModel";
+        /**
+         * 原始数据集
+         */
+        String ORIGINAL = "original";
+        /**
+         * 脚本数据集
+         */
+        String SCRIPT = "script";
+        /**
+         * JSON数据集
+         */
+        String JSON = "json";
+        /**
+         * 存储过程数据集
+         */
+        String STORED_PROCEDURE = "storedProcedure";
+    }
+}

+ 34 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportDbType.java

@@ -0,0 +1,34 @@
+package com.gccloud.dataroom.core.module.dataset.constant;
+
+/**
+ * @author LiYong
+ * @date 2021.12.16
+ */
+public enum ReportDbType {
+    /**
+     * 数据源类型
+     */
+    MYSQL("Mysql", "mysql"),
+    ORACLE("Oracle", "oracle"),
+    POSTGRESQL("PostgreSQL", "postgresql"),
+    HIVE("Hive", "hive"),
+    CLICKHOUSE("ClickHouse", "clickhouse");
+
+    private final String upInfo;
+
+    private final String lowInfo;
+
+    ReportDbType(String upInfo, String lowInfo) {
+        this.upInfo = upInfo;
+        this.lowInfo = lowInfo;
+    }
+
+    public String getLowInfo() {
+        return lowInfo;
+    }
+
+    public String getUpInfo() {
+        return upInfo;
+    }
+
+}

+ 64 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/constant/ReportLimit.java

@@ -0,0 +1,64 @@
+package com.gccloud.dataroom.core.module.dataset.constant;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+
+/**
+ * @author pan.shun
+ * @since 2022/5/12 17:24
+ */
+@Slf4j
+@Component
+public class ReportLimit {
+    /**
+     * 存储过程导出最大数据量
+     */
+    public static Integer STORE_EXPORT_MAX_SIZE;
+
+    /**
+     * 存储过程单次查询最大数据量
+     */
+    public static Integer STORE_QUERY_MAX_SIZE;
+
+    /**
+     * 汇总统计单次导出最大上限
+     */
+    public static Integer EXPORT_MAX_SIZE;
+
+    /**
+     * 不开启分页清单单次查询上限
+     */
+    public static Integer CHECK_LIST_MAX_QUERY_SIZE;
+    /**
+     * 不开启分页汇总统计单次查询上限
+     */
+    public static Integer SUMMARY_MAX_QUERY_SIZE;
+
+    @Value("${store-procedure-export-max-size:500000}")
+    private Integer storeProcedureExportMaxSize;
+
+    @Value("${store-procedure-query-max-size:20000}")
+    private Integer maxStoreProcedureQuerySize;
+
+    @Value("${summary-export-max-size:8000}")
+    private Integer summaryExportMaxSize;
+
+    @Value("${check-list-query-max-size:10000}")
+    private Integer checkListQueryMaxSize;
+
+    @Value("${summary-query-max-size:100000}")
+    private Integer summaryQueryMaxSize;
+
+    @PostConstruct
+    public void initSize() {
+        STORE_EXPORT_MAX_SIZE = storeProcedureExportMaxSize;
+        STORE_QUERY_MAX_SIZE = maxStoreProcedureQuerySize;
+        EXPORT_MAX_SIZE = summaryExportMaxSize;
+        CHECK_LIST_MAX_QUERY_SIZE = checkListQueryMaxSize;
+        SUMMARY_MAX_QUERY_SIZE = summaryQueryMaxSize;
+    }
+}

+ 49 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/CategoryTreeController.java

@@ -0,0 +1,49 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.entity.CategoryTree;
+import com.gccloud.dataroom.core.module.dataset.service.CategoryTreeService;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.controller.SuperController;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 11:05
+ */
+@ScreenPermission(permissions = {Permission.DataSet.CATEGORY})
+@Api(tags = "种类树")
+@RestController
+@RequestMapping("/bigScreen/category")
+public class CategoryTreeController extends SuperController {
+
+    @Resource
+    private CategoryTreeService categoryTreeService;
+
+    @ApiOperation("依据类型查询对应的种类树")
+    @GetMapping("/queryTreeList")
+    public R<List<CategoryTree>> queryTreeList(String tableName, String moduleCode, Integer ifFilter) {
+        return R.success(categoryTreeService.queryCategoryTree(tableName, moduleCode, ifFilter));
+    }
+
+    @ApiOperation("种类树新增或修改")
+    @PostMapping("/addOrUpdateTree")
+    public void addOrUpdateTree(@RequestBody CategoryTree categoryTree) {
+        categoryTreeService.addOrUpdateTree(categoryTree);
+    }
+
+    @ApiOperation("根据ID删除种类树")
+    @GetMapping("/remove/{id}")
+    public void removeNode(@PathVariable String id) {
+        categoryTreeService.removeNodeById(id);
+    }
+
+
+}

+ 89 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DataSourceController.java

@@ -0,0 +1,89 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DataSourceDto;
+import com.gccloud.dataroom.core.module.dataset.entity.DatasourceConfig;
+import com.gccloud.dataroom.core.module.dataset.vo.DatasourceConfigVo;
+import com.gccloud.dataroom.core.module.dataset.service.DatasourceConfigService;
+import com.gccloud.dataroom.core.vo.PageVO;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.controller.SuperController;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/6 11:10
+ */
+@RestController
+@RequestMapping("/bigScreen/datasource")
+@Api(tags = "数据源管理")
+public class DataSourceController extends SuperController {
+
+    @Resource
+    private DatasourceConfigService datasourceConfigService;
+
+    @ScreenPermission(permissions = {Permission.DataSource.VIEW})
+    @ApiOperation("数据源分页查询")
+    @GetMapping("/page")
+    public R<PageVO<DatasourceConfig>> getPage(@ApiParam(name = "查询", value = "传入查询条件", required = true) DataSourceDto dataSourceDto) {
+        return R.success(datasourceConfigService.getPage(dataSourceDto));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.VIEW})
+    @ApiOperation("数据源列表查询")
+    @GetMapping("/list")
+    public R<List<DatasourceConfigVo>> getDatasourceConfigList(String moduleCode) {
+        return R.success(datasourceConfigService.getDatasourceList(moduleCode));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.EDIT})
+    @ApiOperation("新增或修改数据源配置")
+    @PostMapping("/addOrUpdateDataSource")
+    public void addOrUpdateDataSource(@RequestBody DatasourceConfig datasourceConfig) {
+        datasourceConfigService.addOrUpdateDataSource(datasourceConfig);
+    }
+
+    @ScreenPermission
+    @ApiOperation("数据源名称重复判断")
+    @PostMapping("/checkRepeat")
+    public R<String> checkRepeat(@RequestBody DatasourceConfig datasourceConfig) {
+        return R.success(datasourceConfigService.checkRepeat(datasourceConfig));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.DELETE})
+    @ApiOperation("删除数据源配置")
+    @GetMapping("/sourceRemove/{id}")
+    public void removeSource(@PathVariable String id) {
+        datasourceConfigService.removeSource(id);
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.TEST})
+    @ApiOperation("数据源连接测试")
+    @PostMapping("/sourceLinkTest")
+    public R<String> sourceLinkTest(@RequestBody DatasourceConfig datasourceConfig) {
+        return R.success(datasourceConfigService.sourceLinkTest(datasourceConfig));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.VIEW})
+    @ApiOperation("查询数据源下的表")
+    @GetMapping("/getSourceTable/{sourceId}")
+    public R<Object> getSourceTableList(@PathVariable String sourceId) {
+        return R.success(datasourceConfigService.getSourceTableList(sourceId));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSource.VIEW})
+    @ApiOperation("查询数据源下的视图")
+    @GetMapping("/getSourceView/{sourceId}")
+    public R<Object> getSourceViewList(@PathVariable String sourceId) {
+        return R.success(datasourceConfigService.getSourceViewList(sourceId));
+    }
+
+
+}

+ 73 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DatasetController.java

@@ -0,0 +1,73 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DataSetQueryDto;
+import com.gccloud.dataroom.core.module.dataset.dto.ExecuteDto;
+import com.gccloud.dataroom.core.module.dataset.dto.NameCheckRepeatDto;
+import com.gccloud.dataroom.core.module.dataset.entity.DatasetEntity;
+import com.gccloud.dataroom.core.module.dataset.service.DatasetService;
+import com.gccloud.dataroom.core.vo.PageVO;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-15-10:21
+ */
+@Api(tags = "主数据集")
+@RestController
+@RequestMapping("/bigScreen/dataset")
+public class DatasetController {
+
+    @Resource
+    private DatasetService datasetService;
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("主数据集分页查询")
+    @GetMapping("/page")
+    public R<PageVO<DatasetEntity>> getPage(@ApiParam(name = "查询", value = "传入查询条件", required = true) DataSetQueryDto dataSetQueryDto) {
+        return R.success(datasetService.getPage(dataSetQueryDto));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.DELETE})
+    @ApiOperation("数据集删除")
+    @GetMapping("/remove/{ids}")
+    public void remove(@PathVariable String ids) {
+        datasetService.removeByIds(ids);
+    }
+
+    @ScreenPermission
+    @ApiOperation("数据集名称查重校验")
+    @PostMapping("/nameCheckRepeat")
+    public R<Boolean> tableNameCheckRepeat(@RequestBody NameCheckRepeatDto nameCheckRepeatDto) {
+        return R.success(datasetService.nameCheckRepeat(nameCheckRepeatDto));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.EXECUTE})
+    @ApiOperation("数据集执行")
+    @PostMapping("/execute")
+    public R<Object> execute(@RequestBody ExecuteDto executeDto) {
+        return R.success(datasetService.executeDataSet(executeDto));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.EDIT})
+    @ApiOperation("数据集新增或修改接口")
+    @PostMapping("/addOrUpdate")
+    public void addOrUpdate(@RequestBody DatasetEntity datasetEntity) {
+        datasetService.addOrUpdate(datasetEntity);
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("获取数据集详情")
+    @GetMapping("/getDataSetDetailById")
+    public R<Object> getDataSetDetailById(String id) {
+        return R.success(datasetService.getDataSetDetailById(id));
+    }
+
+}

+ 57 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DatasetProcessController.java

@@ -0,0 +1,57 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetProcessTestSearchDto;
+import com.gccloud.dataroom.core.module.dataset.entity.DatasetProcessEntity;
+import com.gccloud.dataroom.core.module.dataset.service.DatasetProcessService;
+import com.gccloud.dataroom.core.module.dataset.vo.DatasetProcessTestVo;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+/**
+ * @Description:
+ * @Author yang.hw
+ * @Date 2021/9/8 15:12
+ */
+@Api(tags = "自助数据集")
+@RestController
+@RequestMapping("/bigScreen/datasetProcess")
+public class DatasetProcessController {
+
+    @Resource
+    private DatasetProcessService datasetProcessService;
+
+    @ScreenPermission(permissions = {Permission.DataSet.EDIT})
+    @ApiOperation("新增自助数据集")
+    @PostMapping("/add")
+    public R<String> add(@RequestBody DatasetProcessEntity processEntity) {
+        return R.success(datasetProcessService.addDatasetProcess(processEntity));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.EDIT})
+    @ApiOperation("修改自助数据集")
+    @PostMapping("/update")
+    public void update(@RequestBody DatasetProcessEntity processEntity) {
+        datasetProcessService.updateDatasetProcess(processEntity);
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("获取自助数据集详情")
+    @GetMapping("/getDatasetInfo/{id}")
+    public R<DatasetProcessEntity> getDatasetInfo(@PathVariable String id) {
+        return R.success(datasetProcessService.getDatasetProcessInfo(id));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.EXECUTE})
+    @ApiOperation("sql脚本测试")
+    @PostMapping("/sqlTest")
+    public R<DatasetProcessTestVo> sqlTest(@RequestBody DatasetProcessTestSearchDto searchDto) {
+        return R.success(datasetProcessService.getDatasetSqlTest(searchDto));
+    }
+}

+ 59 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/DsController.java

@@ -0,0 +1,59 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+import com.gccloud.dataroom.core.module.dataset.dto.ExecuteDto;
+import com.gccloud.dataroom.core.module.dataset.service.DsService;
+import com.gccloud.dataroom.core.module.dataset.vo.DataSetInfoVo;
+import com.gccloud.dataroom.core.utils.JSON;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.controller.SuperController;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.json.JSONArray;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * 数据管理公共API
+ *
+ * @author pan.shun
+ * @since 2022/9/7 09:57
+ */
+@RestController
+@Api(tags = "数据管理公共接口")
+@RequestMapping("/bigScreen/ds")
+public class DsController extends SuperController {
+
+    @Resource
+    private DsService dsService;
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("数据集详情")
+    @GetMapping("/getDataSetDetails")
+    public R<DataSetInfoVo> getDataSetDetails(String id) {
+        DataSetInfoVo dataSetDetails = dsService.getDataSetDetails(id);
+        return R.success(dataSetDetails);
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.EXECUTE})
+    @ApiOperation("数据集执行")
+    @PostMapping("/getDataByDataSetId")
+    public R<Object> getDataByDataSetId(@RequestBody ExecuteDto executeDto) {
+        if (executeDto.getParams() == null || executeDto.getParams().size() == 0) {
+            // 当未传入参数时,从数据集中获取默认参数配置
+            DataSetInfoVo dataSetDetails = dsService.getDataSetDetails(executeDto.getDataSetId());
+            JSONArray params = dataSetDetails.getParams();
+            if (params != null && params.length() > 0) {
+                List<DatasetParamDto> datasetParams = JSON.parseArray(JSON.toJSONString(params), DatasetParamDto.class);
+                executeDto.setParams(datasetParams);
+            }
+        }
+        return R.success(dsService.getData(executeDto.getDataSetId(), executeDto.getParams()));
+    }
+
+}

+ 62 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/controller/OriginalTableController.java

@@ -0,0 +1,62 @@
+package com.gccloud.dataroom.core.module.dataset.controller;
+
+import com.gccloud.dataroom.core.module.dataset.dto.OriginalTableDto;
+import com.gccloud.dataroom.core.module.dataset.entity.OriginalTable;
+import com.gccloud.dataroom.core.module.dataset.service.OriginalTableService;
+import com.gccloud.dataroom.core.vo.R;
+import com.gccloud.dataroom.core.controller.SuperController;
+import com.gccloud.dataroom.core.permission.Permission;
+import com.gccloud.dataroom.core.permission.ScreenPermission;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 15:05
+ */
+@Api(tags = "原始表")
+@RestController
+@RequestMapping("/bigScreen/original")
+public class OriginalTableController extends SuperController {
+    @Resource
+    private OriginalTableService originalTableService;
+
+    @ScreenPermission(permissions = {Permission.DataSet.EDIT})
+    @ApiOperation("原始表新增或修改")
+    @PostMapping("/addOrUpdate")
+    public void addOrUpdate(@RequestBody OriginalTable originalTable) {
+        originalTableService.addOrUpdate(originalTable);
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("获取原始表详情")
+    @GetMapping("/getOriginalTableDetailsById/{id}")
+    public R<OriginalTable> getOriginalTableDetails(@PathVariable String id) {
+        return R.success(originalTableService.getOriginalTableDetails(id));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("查询原始表详情")
+    @PostMapping("/getOriginalTableDetail")
+    public R<Map<String, Object>> getOriginalTableDetail(@RequestBody OriginalTableDto originalTableDto) {
+        if (StringUtils.isBlank(originalTableDto.getSourceId())) {
+            return R.error("请选择数据源");
+        }
+        return R.success(originalTableService.getOriginalTableDetail(originalTableDto));
+    }
+
+    @ScreenPermission(permissions = {Permission.DataSet.VIEW})
+    @ApiOperation("查询原始表字段(仅查询全部字段)")
+    @PostMapping("/getOriginalTableFieldInfo")
+    public R<List<Map<String, Object>>> getOriginalTableField(@RequestBody OriginalTable originalTable) {
+        return R.success(originalTableService.getOriginalTableFieldInfo(originalTable));
+    }
+
+}

+ 13 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/CategoryTreeDao.java

@@ -0,0 +1,13 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.gccloud.dataroom.core.module.dataset.entity.CategoryTree;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 11:08
+ */
+@Mapper
+public interface CategoryTreeDao extends DataRoomBaseDao<CategoryTree> {
+}

+ 56 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasetDao.java

@@ -0,0 +1,56 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gccloud.dataroom.core.module.dataset.entity.DatasetEntity;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-14-11:41
+ */
+@Mapper
+public interface DatasetDao extends DataRoomBaseDao<DatasetEntity> {
+
+    /**
+     * 获取数据集分页列表
+     *
+     * @param page
+     * @param name
+     * @param datasetType
+     * @param typeId
+     * @param typeIds
+     * @param moduleCode
+     * @return
+     */
+    Page<DatasetEntity> getDataSetPage(
+            Page<DatasetEntity> page,
+            @Param("name") String name,
+            @Param("datasetType") String datasetType,
+            @Param("typeId") String typeId,
+            @Param("typeIds") Set<String> typeIds,
+            @Param(("moduleCode")) String moduleCode);
+
+
+    /**
+     * 获取数据集列表
+     *
+     * @param name
+     * @param datasetType
+     * @param typeId
+     * @param typeIds
+     * @param moduleCode
+     * @return
+     */
+    List<DatasetEntity> getList(
+            @Param("name") String name,
+            @Param("datasetType") String datasetType,
+            @Param("typeId") String typeId,
+            @Param("typeIds") Set<String> typeIds,
+            @Param("moduleCode") String moduleCode);
+
+}

+ 16 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasetProcessDao.java

@@ -0,0 +1,16 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.gccloud.dataroom.core.module.dataset.entity.DatasetProcessEntity;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 自助数据集处理
+ *
+ * @Author yang.hw
+ * @Date 2021/9/8 14:21
+ */
+@Mapper
+public interface DatasetProcessDao extends DataRoomBaseDao<DatasetProcessEntity> {
+
+}

+ 14 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DatasourceConfigDao.java

@@ -0,0 +1,14 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.gccloud.dataroom.core.module.dataset.entity.DatasourceConfig;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/6 14:58
+ */
+@Mapper
+public interface DatasourceConfigDao extends DataRoomBaseDao<DatasourceConfig> {
+
+}

+ 13 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/DsDao.java

@@ -0,0 +1,13 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.gccloud.dataroom.core.module.dataset.vo.DataSetInfoVo;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-17-11:03
+ */
+@Mapper
+public interface DsDao extends DataRoomBaseDao<DataSetInfoVo> {
+}

+ 14 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dao/OriginalTableDao.java

@@ -0,0 +1,14 @@
+package com.gccloud.dataroom.core.module.dataset.dao;
+
+import com.gccloud.dataroom.core.module.dataset.entity.OriginalTable;
+import com.gccloud.dataroom.core.dao.DataRoomBaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 15:03
+ */
+@Mapper
+public interface OriginalTableDao extends DataRoomBaseDao<OriginalTable> {
+
+}

+ 32 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DataSetQueryDto.java

@@ -0,0 +1,32 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-15-10:08
+ */
+@Data
+public class DataSetQueryDto extends SearchDTO {
+
+    @ApiModelProperty(value = "数据集ID")
+    private String id;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "数据集编码")
+    private String code;
+
+    @ApiModelProperty(value = "种类id")
+    private String typeId;
+
+    @ApiModelProperty(value = "数据集类型")
+    private String datasetType;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+
+}

+ 22 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DataSourceDto.java

@@ -0,0 +1,22 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/6 15:34
+ */
+@Data
+public class DataSourceDto extends SearchDTO {
+
+    @ApiModelProperty(value = "数据源名称")
+    private String sourceName;
+
+    @ApiModelProperty(value = "数据源类型")
+    private String sourceType;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+}

+ 31 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DatasetParamDto.java

@@ -0,0 +1,31 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+import com.gccloud.dataroom.core.module.dataset.constant.ReportConstant;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description:数据集参数
+ * @Author yang.hw
+ * @Date 2021/9/15 11:11
+ */
+@Data
+public class DatasetParamDto {
+
+    @ApiModelProperty(value = "参数名称")
+    private String name;
+
+    /**
+     * 参考:{@link ReportConstant.SqlParamsType}
+     */
+    @ApiModelProperty(value = "参数类型")
+    private String type;
+
+    @ApiModelProperty(value = "参数值")
+    private String value;
+
+    /**
+     * 参考:{@link ReportConstant.SqlParamsStatus}
+     */
+    @ApiModelProperty(value = "参数状态")
+    private Integer status;
+}

+ 37 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/DatasetProcessTestSearchDto.java

@@ -0,0 +1,37 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: 数据集加工测试功能分页
+ * @Author yang.hw
+ * @Date 2021/11/1 16:38
+ */
+@Data
+public class DatasetProcessTestSearchDto extends SearchDTO {
+    @ApiModelProperty(value = "sql脚本")
+    private String sqlProcess;
+
+    @ApiModelProperty(value = "参数配置")
+    private String paramConfig;
+
+    @ApiModelProperty(value = "数据源id")
+    private String sourceId;
+
+    @ApiModelProperty(value = "数据集id")
+    private String datasetId;
+
+    @ApiModelProperty(value = "固化方式")
+    private String curingType;
+
+    @ApiModelProperty(value = "数据集编码")
+    private String dataSetCode;
+
+    @ApiModelProperty(value = "数据集加工类型")
+    private String processType;
+
+    @ApiModelProperty(value = "编码参数处理")
+    private String codeProcess;
+}

+ 35 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/ExecuteDto.java

@@ -0,0 +1,35 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-18-16:15
+ */
+@ApiModel
+@Data
+public class ExecuteDto extends SearchDTO {
+
+    @ApiModelProperty(value = "数据源ID")
+    private String dataSourceId;
+
+    @ApiModelProperty(value = "sql语句")
+    private String sql;
+
+    @ApiModelProperty(value = "数据集id")
+    private String dataSetId;
+
+    @ApiModelProperty(value = "参数")
+    private List<DatasetParamDto> params;
+
+    @ApiModelProperty(value = "数据集类型")
+    private String dataSetType;
+
+    @ApiModelProperty(value = "用于存储数据集配置的字段")
+    private String data;
+}

+ 19 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/NameCheckRepeatDto.java

@@ -0,0 +1,19 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-10-20-16:18
+ */
+@Data
+public class NameCheckRepeatDto extends SuperEntity {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+}

+ 42 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/dto/OriginalTableDto.java

@@ -0,0 +1,42 @@
+package com.gccloud.dataroom.core.module.dataset.dto;
+
+import com.gccloud.dataroom.core.dto.SearchDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 15:10
+ */
+@ApiModel
+@Data
+public class OriginalTableDto extends SearchDTO {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "原始表名称")
+    private String tableName;
+
+    @ApiModelProperty(value = "数据源ID")
+    private String sourceId;
+
+    @ApiModelProperty(value = "数据源类型")
+    private String sourceType;
+
+    @ApiModelProperty(value = "种类ID")
+    private String typeId;
+
+    @ApiModelProperty(value = "标签id")
+    private String labelId;
+
+    @ApiModelProperty(value = "字段详情")
+    private String fieldInfo;
+
+    @ApiModelProperty(value = "数据集id")
+    private String id;
+
+    @ApiModelProperty(value = "去重标识。0、去重 1、不去重")
+    private Integer repeatStatus;
+}

+ 48 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/CategoryTree.java

@@ -0,0 +1,48 @@
+package com.gccloud.dataroom.core.module.dataset.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import com.gccloud.dataroom.core.vo.TreeVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 10:58
+ */
+@ToString(callSuper = true)
+@ApiModel("种类树")
+@TableName("big_screen_category_tree")
+@Data
+public class CategoryTree extends SuperEntity implements TreeVo<CategoryTree> {
+
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    @ApiModelProperty(value = "种类树名称")
+    private String name;
+
+    @ApiModelProperty(value = "父级ID")
+    private String parentId;
+
+    @ApiModelProperty(value = "父级名称")
+    private String parentName;
+
+    @ApiModelProperty(value = "等级")
+    private String treeLevel = "0";
+
+    @ApiModelProperty(value = "子集")
+    @TableField(exist = false)
+    private List<CategoryTree> children;
+
+    @ApiModelProperty(value = "表名称")
+    private String tableName;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+}

+ 62 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasetEntity.java

@@ -0,0 +1,62 @@
+package com.gccloud.dataroom.core.module.dataset.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author zhang.zeJun
+ * @date 2022-11-14-9:57
+ */
+@Data
+@TableName("big_screen_dataset")
+@ApiModel("主数据集")
+public class DatasetEntity extends SuperEntity {
+
+    @ApiModelProperty(value = "数据集编码")
+    @TableField(exist = false)
+    private String code;
+
+    @TableField(exist = false)
+    private String tableName;
+
+    @ApiModelProperty(value = "数据集名称")
+    private String name;
+
+    @ApiModelProperty(value = "种类ID")
+    private String typeId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "数据集类型")
+    private String datasetType;
+
+    @ApiModelProperty(value = "数据集关联id")
+    private String datasetRelId;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+
+    @ApiModelProperty(value = "是否可编辑,0 不可编辑 1 可编辑")
+    private Integer editable;
+
+    @TableField(exist = false)
+    private int cacheCoherence;
+
+    @TableField(exist = false)
+    private int dataSetStatus;
+
+    @TableField(exist = false)
+    private String sourceId;
+
+    @ApiModelProperty(value = "用于存储数据集配置的字段")
+    private String data;
+
+    @TableField(exist = false)
+    private Object childrenDataSet;
+}

+ 88 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasetProcessEntity.java

@@ -0,0 +1,88 @@
+package com.gccloud.dataroom.core.module.dataset.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @Description: 数据集加工
+ * @Author yang.hw
+ * @Date 2021/9/8 11:24
+ */
+@Data
+@TableName("big_screen_datasets_custom")
+@ApiModel("自助数据集")
+public class DatasetProcessEntity extends SuperEntity {
+
+    @ApiModelProperty(value = "数据集名称")
+    @TableField(exist = false)
+    private String name;
+
+    @ApiModelProperty(value = "数据集编码")
+    private String code;
+
+    @ApiModelProperty(value = "结果固化形式,1、表 ; 2、视图")
+    private String curingType;
+
+    @ApiModelProperty(value = "种类ID")
+    @TableField(exist = false)
+    private String typeId;
+
+    @ApiModelProperty(value = "数据源id")
+    private String sourceId;
+
+    @ApiModelProperty(value = "数据集字段json")
+    private String fieldJson;
+
+    @ApiModelProperty(value = "数据集加工类型")
+    private String processType;
+
+    @ApiModelProperty(value = "Sql数据处理")
+    private String sqlProcess;
+
+    @ApiModelProperty(value = "代码数据处理")
+    private String codeProcess;
+
+    @ApiModelProperty(value = "参数配置json")
+    private String paramConfig;
+
+    @ApiModelProperty(value = "字段描述")
+    private String fieldDesc;
+
+    @ApiModelProperty(value = "结构缓存")
+    private String cacheField;
+
+    @ApiModelProperty(value = "结果转换脚本")
+    private String script;
+
+    @ApiModelProperty(value = "备注")
+    @TableField(exist = false)
+    private String remark;
+
+    @ApiModelProperty(value = "是否可编辑,0 不可编辑 1 可编辑")
+    @TableField(exist = false)
+    private Integer editable;
+
+    @ApiModelProperty(value = "模块编码")
+    @TableField(exist = false)
+    private String moduleCode;
+
+    @ApiModelProperty(value = "数据集数据预览")
+    @TableField(exist = false)
+    private Map<String, List<Map<String, Object>>> preview;
+
+    @ApiModelProperty(value = "数据集数据总数")
+    @TableField(exist = false)
+    private Integer totalCount;
+
+    @ApiModelProperty(value = "种类名称")
+    @TableField(exist = false)
+    private String typeName;
+}

+ 99 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/DatasourceConfig.java

@@ -0,0 +1,99 @@
+package com.gccloud.dataroom.core.module.dataset.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/6 14:49
+ */
+@Data
+@TableName("big_screen_datasource_config")
+@ApiModel("数据源配置")
+public class DatasourceConfig extends SuperEntity {
+
+    @ApiModelProperty(value = "数据源名称 ")
+    private String sourceName;
+
+    @ApiModelProperty(value = "数据源类型")
+    private String sourceType;
+
+    @ApiModelProperty(value = "连接驱动")
+    private String driverClassName;
+
+    @ApiModelProperty(value = "数据库")
+    @TableField(exist = false)
+    private String database;
+
+    @ApiModelProperty(value = "主机")
+    private String host;
+
+    @ApiModelProperty(value = "端口")
+    private Integer port;
+
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    @ApiModelProperty(value = "密码")
+    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
+    private String password;
+
+    @ApiModelProperty(value = "编码")
+    private String coding;
+
+    @ApiModelProperty(value = "连接url")
+    private String url;
+
+    @ApiModelProperty(value = "是否启用高级设置")
+    private Integer advanceSettingFlag;
+
+    @ApiModelProperty(value = "初始化连接数")
+    private Integer initConnNum;
+
+    @ApiModelProperty(value = "最大活动连接数")
+    private Integer maxActiveConnNum;
+
+    @ApiModelProperty(value = "最大空闲连接数")
+    private Integer maxIdleConnNum;
+
+    @ApiModelProperty(value = "最小空闲连接数")
+    private Integer minIdleConnNum;
+
+    @ApiModelProperty(value = "最大等待时间")
+    private String maxWaitConnNum;
+
+    @ApiModelProperty(value = "SQL验证查询")
+    private String sqlCheck;
+
+    @ApiModelProperty(value = "获取连接是否校验")
+    private Integer getconnCheckFlag;
+
+    @ApiModelProperty(value = "归还连接是否校验")
+    private Integer returnCheckFlag;
+
+    @ApiModelProperty(value = "开启空闲回收期校验")
+    private Integer startIdleCheckFlag;
+
+    @ApiModelProperty(value = "空闲连接回收器休眠时间")
+    private Integer idleConnDormantTime;
+
+    @ApiModelProperty(value = "空闲连接回收检查数")
+    private Integer idleConnCheckNum;
+
+    @ApiModelProperty(value = "保持空闲最小时间值")
+    private Integer keepIdleMinTime;
+
+    @ApiModelProperty(value = "模块编码")
+    private String moduleCode;
+
+    @ApiModelProperty(value = "是否可编辑,0 不可编辑 1 可编辑")
+    private Integer editable;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 59 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/entity/OriginalTable.java

@@ -0,0 +1,59 @@
+package com.gccloud.dataroom.core.module.dataset.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.dataroom.core.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2021/9/7 15:02
+ */
+@TableName("big_screen_datasets_original")
+@Data
+@ApiModel
+public class OriginalTable extends SuperEntity {
+
+    @ApiModelProperty(value = "数据集名称")
+    @TableField(exist = false)
+    private String name;
+
+    @ApiModelProperty(value = "种类id")
+    @TableField(exist = false)
+    private String typeId;
+
+    @ApiModelProperty(value = "表名称")
+    private String tableName;
+
+    @ApiModelProperty(value = "关联数据源id")
+    private String sourceId;
+
+    @ApiModelProperty(value = "描述")
+    @TableField(exist = false)
+    private String remark;
+
+    @ApiModelProperty(value = "字段描述")
+    private String fieldDesc;
+
+    @ApiModelProperty(value = "字段详情")
+    private String fieldInfo;
+
+    @ApiModelProperty(value = "去重标识。0、去重 1、不去重")
+    private Integer repeatStatus;
+
+    @ApiModelProperty(value = "数据缓存字段")
+    private String cacheField;
+
+    @ApiModelProperty(value = "是否可编辑,0 不可编辑 1 可编辑")
+    @TableField(exist = false)
+    private Integer editable;
+
+    @ApiModelProperty(value = "模块编码")
+    @TableField(exist = false)
+    private String moduleCode;
+
+    @ApiModelProperty(value = "数据集字段json")
+    private String fieldJson;
+}

+ 54 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/SqlConditionModel.java

@@ -0,0 +1,54 @@
+package com.gccloud.dataroom.core.module.dataset.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/26 16:23
+ */
+@ApiModel
+@Data
+@Builder
+public class SqlConditionModel {
+
+    @ApiModelProperty(value = "字段名")
+    private String field;
+
+    @ApiModelProperty(value = "表名")
+    private String tableName;
+
+    @ApiModelProperty(value = "操作符")
+    private String op;
+
+    @ApiModelProperty(value = "值")
+    private String value;
+
+    @ApiModelProperty(value = "类型:分为字符串(text)、数值(number)和日期(date)三种")
+    private String type;
+
+    @ApiModelProperty(value = "与或连接")
+    private String joiner;
+
+    @ApiModelProperty(value = "数据源类型")
+    private String sourceType;
+
+    @ApiModelProperty(value = "日期类型")
+    private String dateType;
+
+    @Override
+    public String toString() {
+        return "SqlConditionModel{" +
+                "field='" + field + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", op='" + op + '\'' +
+                ", value='" + value + '\'' +
+                ", type='" + type + '\'' +
+                ", joiner='" + joiner + '\'' +
+                ", sourceType='" + sourceType + '\'' +
+                ", dateType='" + dateType + '\'' +
+                '}';
+    }
+}

+ 44 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/ViewSqlProcessModel.java

@@ -0,0 +1,44 @@
+package com.gccloud.dataroom.core.module.dataset.model;
+
+import com.gccloud.dataroom.core.module.dataset.model.view.CalculateFieldConfigModel;
+import com.gccloud.dataroom.core.module.dataset.model.view.DataSourceInfoModel;
+import com.gccloud.dataroom.core.module.dataset.model.view.FilterConditionModel;
+import com.gccloud.dataroom.core.module.dataset.model.view.TableRelateModel;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 11:24
+ */
+@Data
+public class ViewSqlProcessModel {
+
+    /**
+     * 数据源信息
+     */
+    private DataSourceInfoModel datasourceInfo;
+
+    /**
+     * 表关联
+     */
+    private TableRelateModel tableRelate;
+
+    /**
+     * 计算字段配置
+     */
+    private List<CalculateFieldConfigModel> calculateFieldConfig;
+
+    /**
+     * 过滤条件
+     */
+    private List<FilterConditionModel> filterCondition;
+
+    /**
+     * 表字段信息
+     */
+    private Map<String, List<String>> tableInfo;
+}
+

+ 38 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/CalculateFieldConfigModel.java

@@ -0,0 +1,38 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 11:27
+ */
+@Data
+@ApiModel
+public class CalculateFieldConfigModel {
+
+    @ApiModelProperty(value = "字段描述名称")
+    private String name;
+
+    @ApiModelProperty(value = "字段别名")
+    private String fieldAlias;
+
+    @ApiModelProperty(value = "配置类型  0、普调配置 1、高级配置")
+    private Integer type;
+
+    @ApiModelProperty(value = "表名")
+    private String tableName;
+
+    @ApiModelProperty(value = "字段名称")
+    private String fieldName;
+
+    @ApiModelProperty(value = "聚合方式")
+    private String aggregationMethod;
+
+    @ApiModelProperty(value = "字段表达式")
+    private String fieldExpression;
+
+    @ApiModelProperty(value = "是否加入分组聚合 0、不加入 1、加入")
+    private Integer ifJoinGroup;
+}

+ 23 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/ChildrenFilter.java

@@ -0,0 +1,23 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/23 14:34
+ */
+@ApiModel
+@Data
+public class ChildrenFilter {
+
+    @ApiModelProperty(value = "且、或关系")
+    private String joiner;
+
+    @ApiModelProperty(value = "操作符")
+    private String op;
+
+    @ApiModelProperty(value = "字段值")
+    private String value;
+}

+ 29 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/ChildrenRelateModel.java

@@ -0,0 +1,29 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 13:39
+ */
+@ApiModel
+@Data
+public class ChildrenRelateModel {
+
+    @ApiModelProperty(value = "表名称")
+    private String tableName;
+
+    @ApiModelProperty(value = "字段")
+    private String field;
+
+    @ApiModelProperty(value = "关联类型. 分为inner 、left、right 三种")
+    private String relateType;
+
+    @ApiModelProperty(value = "关联的字段")
+    private String relateField;
+
+    @ApiModelProperty(value = "关联的表名称")
+    private String relateTableName;
+}

+ 25 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/DataSourceInfoModel.java

@@ -0,0 +1,25 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 11:25
+ */
+@ApiModel
+@Data
+public class DataSourceInfoModel {
+
+    @ApiModelProperty(value = "数据源ID")
+    private String sourceId;
+
+    @ApiModelProperty(value = "表名")
+    private List<String> tableName;
+
+    @ApiModelProperty(value = "数据源类型")
+    private String sourceType;
+}

+ 34 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/FilterConditionModel.java

@@ -0,0 +1,34 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 13:35
+ */
+@ApiModel
+@Data
+public class FilterConditionModel {
+
+    @ApiModelProperty(value = "且、或关系")
+    private String joiner;
+
+    @ApiModelProperty(value = "字段名称")
+    private String field;
+
+    @ApiModelProperty(value = "表名称")
+    private String tableName;
+
+    @ApiModelProperty(value = "类型,分为字符串、数值、日期 ")
+    private String type;
+
+    @ApiModelProperty(value = "日期类型,分为date、dateTime 、dateMonth 三种")
+    private String dateType;
+
+    @ApiModelProperty(value = "当前字段的其他条件")
+    private List<ChildrenFilter> children;
+}

+ 22 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/model/view/TableRelateModel.java

@@ -0,0 +1,22 @@
+package com.gccloud.dataroom.core.module.dataset.model.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author pan.shun
+ * @since 2022/7/21 13:37
+ */
+@ApiModel
+@Data
+public class TableRelateModel {
+
+    @ApiModelProperty(value = "主节点表名称")
+    private String mainTableName;
+
+    @ApiModelProperty(value = "关联表信息")
+    private List<ChildrenRelateModel> children;
+}

+ 23 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/params/IParamsService.java

@@ -0,0 +1,23 @@
+package com.gccloud.dataroom.core.module.dataset.params;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+
+import java.util.List;
+
+/**
+ * 数据集参数处理,可通过实现该接口来自定义参数处理逻辑
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/5/22 13:58
+ */
+public interface IParamsService {
+
+
+    /**
+     * 处理数据集参数
+     * @param params 数据集参数
+     * @return 处理后的数据集参数
+     */
+    List<DatasetParamDto> handleParams(List<DatasetParamDto> params);
+
+}

+ 35 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/dataset/params/ParamsClient.java

@@ -0,0 +1,35 @@
+package com.gccloud.dataroom.core.module.dataset.params;
+
+import com.gccloud.dataroom.core.module.dataset.dto.DatasetParamDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 数据集参数处理
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/5/22 14:02
+ */
+@Component
+public class ParamsClient {
+
+    @Autowired(required = false)
+    private IParamsService paramsService;
+
+
+    /**
+     * 处理数据集参数
+     * 当有自定义实现时,使用自定义实现,否则使用默认实现
+     * @param params
+     * @return
+     */
+    public List<DatasetParamDto> handleParams(List<DatasetParamDto> params) {
+        if (paramsService != null) {
+            params = paramsService.handleParams(params);
+        }
+        return params;
+    }
+
+}

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.