Browse Source

基础框架发布: 8.2.35

1) 修复工作流业务类型bug
  2) 修复规则引擎选项表达式配置code和name替换的bug
  3)修复日期工具类的 bug
  4)增加工作流退回后原路提交给退回节点及其原处理人功能

前端核心发布: 8.2.128
 1)
main
wangshaoping 3 weeks ago
parent
commit
eb8d2f34e1
  1. 118
      app.platform/src/main/java/app/platform/Application.java
  2. 4
      cips.frontend/package.json
  3. 4
      erm.frontend/package.json
  4. 4
      gradle.properties
  5. 4
      io.sc.engine.mv.frontend/package.json
  6. 32
      io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/exportable-resources.json
  7. 4
      io.sc.engine.rule.frontend/package.json
  8. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterWebController.java
  9. 6
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionItemServiceImpl.java
  10. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java
  11. 2
      io.sc.platform.core.frontend/package.json
  12. 1
      io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue
  13. 271
      io.sc.platform.core.frontend/src/views/testcase/form/form.vue
  14. 4
      io.sc.platform.core.frontend/template-project/package.json
  15. 271
      io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue
  16. 1
      io.sc.platform.developer.frontend/src/i18n/messages.json
  17. 1
      io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json
  18. 1
      io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json
  19. 4
      io.sc.platform.developer.frontend/src/remote-components/remote-components.json
  20. 4
      io.sc.platform.developer.frontend/src/views/XXX.vue
  21. 245
      io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase copy.vue
  22. 214
      io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase.vue
  23. 32
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java
  24. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescriptionWrapperMapper.java
  25. 2
      io.sc.platform.jdbc.driver.mysql/src/main/resources/META-INF/platform/plugins/jdbc-connection-template.json
  26. 2
      io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java
  27. 4
      io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java
  28. 322
      io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java
  29. 15
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcMetaDataLoaderWebController.java
  30. 9
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/support/DataExportConfigure.java
  31. 9
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/support/SchemaExportConfigure.java
  32. 36
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/meta/MetaDataLoader.java
  33. 13
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/meta/support/Catalog.java
  34. 6
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcMetaDataLoaderService.java
  35. 24
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcMetaDataLoaderServiceImpl.java
  36. 1
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/util/SqlTypeUtil.java
  37. 2
      io.sc.platform.lcdp.frontend/public/flowable/modeler/index.html
  38. 2
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/form/service/FormService.java
  39. 9
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/form/service/impl/FormServiceImpl.java
  40. 8
      io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/application-properties.json
  41. 4
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java
  42. 2
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java
  43. 8
      io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java

118
app.platform/src/main/java/app/platform/Application.java

@ -2,14 +2,9 @@ package app.platform;
import io.sc.platform.core.ApplicationLauncher; import io.sc.platform.core.ApplicationLauncher;
import io.sc.platform.core.PlatformSpringBootServletInitializer; import io.sc.platform.core.PlatformSpringBootServletInitializer;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.criteria.Criteria;
import io.sc.platform.orm.service.support.criteria.impl.GreaterOrEquals;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.WebApplicationInitializer; import org.springframework.web.WebApplicationInitializer;
import java.util.List;
/** /**
* 应用程序入口 * 应用程序入口
*/ */
@ -17,118 +12,5 @@ import java.util.List;
public class Application extends PlatformSpringBootServletInitializer implements WebApplicationInitializer { public class Application extends PlatformSpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
ApplicationLauncher.run(Application.class,args); ApplicationLauncher.run(Application.class,args);
String xml ="<?xml version='1.0' encoding='UTF-8'?>\n" +
" <definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:flowable=\"http://flowable.org/bpmn\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" expressionLanguage=\"http://www.w3.org/1999/XPath\" targetNamespace=\"http://www.flowable.org/processdef\" exporter=\"Flowable Open Source Modeler\" exporterVersion=\"6.8.0\">\n" +
" <process id=\"SAMPLE\" name=\"示例流程\" isExecutable=\"true\">\n" +
" <dataObject id=\"assignment-strategy\" name=\"分配策略\" itemSubjectRef=\"xsd:string\">\n" +
" <extensionElements>\n" +
" <flowable:value>{\"A2\":\"platformAssigneeQueryService\"}</flowable:value>\n" +
" </extensionElements>\n" +
" </dataObject>\n" +
" <startEvent id=\"start\" name=\"开始\" flowable:formFieldValidation=\"true\"/>\n" +
" <userTask id=\"A1\" name=\"提交申请\" flowable:assignee=\"${assignee}\" flowable:candidateGroups=\"admin\" flowable:formFieldValidation=\"true\" flowable:skipExpression=\"${execution.getVariable('skipFirst') == true}\">\n" +
" <extensionElements>\n" +
" <modeler:group-info-name-admin xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[系统管理员]]></modeler:group-info-name-admin>\n" +
" <modeler:activiti-idm-candidate-group xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[true]]></modeler:activiti-idm-candidate-group>\n" +
" <modeler:initiator-can-complete xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[false]]></modeler:initiator-can-complete>\n" +
" </extensionElements>\n" +
" </userTask>\n" +
" <userTask id=\"A2\" name=\"复核\" flowable:assignee=\"${assignee}\" flowable:candidateGroups=\"admin\" flowable:formFieldValidation=\"true\">\n" +
" <extensionElements>\n" +
" <flowable:taskListener event=\"assignment\" delegateExpression=\"${flowableSendMailListener}\">\n" +
" <flowable:field name=\"title\">\n" +
" <flowable:string><![CDATA[您有一个 [示例] 流程的 [复核] 任务等待处理]]></flowable:string>\n" +
" </flowable:field>\n" +
" <flowable:field name=\"content\">\n" +
" <flowable:string><![CDATA[${assignee},您好! 您有一个 [示例] 流程的 [复核] 任务等待处理,详情参见: http://localhost:8080]]></flowable:string>\n" +
" </flowable:field>\n" +
" </flowable:taskListener>\n" +
" <modeler:group-info-name-admin xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[系统管理员]]></modeler:group-info-name-admin>\n" +
" <modeler:activiti-idm-candidate-group xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[true]]></modeler:activiti-idm-candidate-group>\n" +
" <modeler:initiator-can-complete xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[false]]></modeler:initiator-can-complete>\n" +
" </extensionElements>\n" +
" </userTask>\n" +
" <endEvent id=\"end\" name=\"结束\"/>\n" +
" <sequenceFlow id=\"sid-452257DA-C9ED-41BB-A95A-899D5F7FD363\" sourceRef=\"start\" targetRef=\"A1\"/>\n" +
" <sequenceFlow id=\"sid-EC4C37D8-A419-4DD1-9569-DD93AE964688\" sourceRef=\"A1\" targetRef=\"A2\"/>\n" +
" <userTask id=\"A3\" name=\"认定\" default=\"sid-95DCA487-E110-49BB-86F9-C623692DD8BA\" flowable:assignee=\"${assignee}\" flowable:candidateGroups=\"admin\" flowable:formFieldValidation=\"true\">\n" +
" <extensionElements>\n" +
" <modeler:group-info-name-admin xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[系统管理员]]></modeler:group-info-name-admin>\n" +
" <modeler:activiti-idm-candidate-group xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[true]]></modeler:activiti-idm-candidate-group>\n" +
" <modeler:initiator-can-complete xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[false]]></modeler:initiator-can-complete>\n" +
" </extensionElements>\n" +
" </userTask>\n" +
" <sequenceFlow id=\"sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A\" sourceRef=\"A2\" targetRef=\"A3\"/>\n" +
" <userTask id=\"A4\" name=\"最终认定\" flowable:assignee=\"${assignee}\" flowable:candidateGroups=\"admin\" flowable:formFieldValidation=\"true\">\n" +
" <extensionElements>\n" +
" <modeler:group-info-name-admin xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[系统管理员]]></modeler:group-info-name-admin>\n" +
" <modeler:activiti-idm-candidate-group xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[true]]></modeler:activiti-idm-candidate-group>\n" +
" <modeler:initiator-can-complete xmlns:modeler=\"http://flowable.org/modeler\"><![CDATA[false]]></modeler:initiator-can-complete>\n" +
" </extensionElements>\n" +
" </userTask>\n" +
" <sequenceFlow id=\"sid-87E440E2-0998-4C95-B4A4-444397ADB79C\" sourceRef=\"A4\" targetRef=\"end\"/>\n" +
" <sequenceFlow id=\"sid-95DCA487-E110-49BB-86F9-C623692DD8BA\" sourceRef=\"A3\" targetRef=\"A4\"/>\n" +
" <sequenceFlow id=\"sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E\" name=\"退回给复核岗\" sourceRef=\"A3\" targetRef=\"A2\">\n" +
" <conditionExpression xsi:type=\"tFormalExpression\"><![CDATA[${goback == -1}]]></conditionExpression>\n" +
" </sequenceFlow>\n" +
" <sequenceFlow id=\"sid-8C796912-0699-4ADA-9F3F-91154970C7E2\" name=\"退回给申请人\" sourceRef=\"A3\" targetRef=\"A1\">\n" +
" <conditionExpression xsi:type=\"tFormalExpression\"><![CDATA[${goback == -2}]]></conditionExpression>\n" +
" </sequenceFlow>\n" +
" </process>\n" +
" <bpmndi:BPMNDiagram id=\"BPMNDiagram_SAMPLE\">\n" +
" <bpmndi:BPMNPlane bpmnElement=\"SAMPLE\" id=\"BPMNPlane_SAMPLE\">\n" +
" <bpmndi:BPMNShape bpmnElement=\"start\" id=\"BPMNShape_start\">\n" +
" <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"60.0\" y=\"168.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNShape bpmnElement=\"A1\" id=\"BPMNShape_A1\">\n" +
" <omgdc:Bounds height=\"40.0\" width=\"96.0\" x=\"120.0\" y=\"160.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNShape bpmnElement=\"A2\" id=\"BPMNShape_A2\">\n" +
" <omgdc:Bounds height=\"40.0\" width=\"81.0\" x=\"255.0\" y=\"160.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNShape bpmnElement=\"end\" id=\"BPMNShape_end\">\n" +
" <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"615.0\" y=\"166.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNShape bpmnElement=\"A3\" id=\"BPMNShape_A3\">\n" +
" <omgdc:Bounds height=\"42.0\" width=\"82.0\" x=\"375.0\" y=\"159.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNShape bpmnElement=\"A4\" id=\"BPMNShape_A4\">\n" +
" <omgdc:Bounds height=\"40.0\" width=\"92.0\" x=\"495.0\" y=\"160.5\"/>\n" +
" </bpmndi:BPMNShape>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E\" id=\"BPMNEdge_sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E\" flowable:sourceDockerX=\"41.0\" flowable:sourceDockerY=\"21.0\" flowable:targetDockerX=\"40.0\" flowable:targetDockerY=\"20.0\">\n" +
" <omgdi:waypoint x=\"416.0\" y=\"159.0\"/>\n" +
" <omgdi:waypoint x=\"416.0\" y=\"77.0\"/>\n" +
" <omgdi:waypoint x=\"295.0\" y=\"77.0\"/>\n" +
" <omgdi:waypoint x=\"295.0\" y=\"160.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-95DCA487-E110-49BB-86F9-C623692DD8BA\" id=\"BPMNEdge_sid-95DCA487-E110-49BB-86F9-C623692DD8BA\" flowable:sourceDockerX=\"41.0\" flowable:sourceDockerY=\"21.0\" flowable:targetDockerX=\"46.0\" flowable:targetDockerY=\"20.0\">\n" +
" <omgdi:waypoint x=\"456.0\" y=\"180.0\"/>\n" +
" <omgdi:waypoint x=\"494.0\" y=\"180.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A\" id=\"BPMNEdge_sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A\" flowable:sourceDockerX=\"40.0\" flowable:sourceDockerY=\"20.0\" flowable:targetDockerX=\"41.0\" flowable:targetDockerY=\"21.0\">\n" +
" <omgdi:waypoint x=\"335.0\" y=\"180.0\"/>\n" +
" <omgdi:waypoint x=\"375.0\" y=\"180.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-8C796912-0699-4ADA-9F3F-91154970C7E2\" id=\"BPMNEdge_sid-8C796912-0699-4ADA-9F3F-91154970C7E2\" flowable:sourceDockerX=\"41.0\" flowable:sourceDockerY=\"21.0\" flowable:targetDockerX=\"48.0\" flowable:targetDockerY=\"20.0\">\n" +
" <omgdi:waypoint x=\"416.0\" y=\"201.0\"/>\n" +
" <omgdi:waypoint x=\"416.0\" y=\"284.0\"/>\n" +
" <omgdi:waypoint x=\"168.0\" y=\"284.0\"/>\n" +
" <omgdi:waypoint x=\"168.0\" y=\"200.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-87E440E2-0998-4C95-B4A4-444397ADB79C\" id=\"BPMNEdge_sid-87E440E2-0998-4C95-B4A4-444397ADB79C\" flowable:sourceDockerX=\"46.0\" flowable:sourceDockerY=\"20.0\" flowable:targetDockerX=\"14.0\" flowable:targetDockerY=\"14.0\">\n" +
" <omgdi:waypoint x=\"586.0\" y=\"180.0\"/>\n" +
" <omgdi:waypoint x=\"615.0\" y=\"180.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-EC4C37D8-A419-4DD1-9569-DD93AE964688\" id=\"BPMNEdge_sid-EC4C37D8-A419-4DD1-9569-DD93AE964688\" flowable:sourceDockerX=\"48.0\" flowable:sourceDockerY=\"20.0\" flowable:targetDockerX=\"40.0\" flowable:targetDockerY=\"20.0\">\n" +
" <omgdi:waypoint x=\"215.0\" y=\"180.0\"/>\n" +
" <omgdi:waypoint x=\"254.0\" y=\"180.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" <bpmndi:BPMNEdge bpmnElement=\"sid-452257DA-C9ED-41BB-A95A-899D5F7FD363\" id=\"BPMNEdge_sid-452257DA-C9ED-41BB-A95A-899D5F7FD363\" flowable:sourceDockerX=\"15.0\" flowable:sourceDockerY=\"15.0\" flowable:targetDockerX=\"48.0\" flowable:targetDockerY=\"20.0\">\n" +
" <omgdi:waypoint x=\"89.0\" y=\"183.0\"/>\n" +
" <omgdi:waypoint x=\"120.0\" y=\"182.0\"/>\n" +
" </bpmndi:BPMNEdge>\n" +
" </bpmndi:BPMNPlane>\n" +
" </bpmndi:BPMNDiagram>\n" +
" </definitions>";
} }
} }

4
cips.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "cips.frontend", "name": "cips.frontend",
"version": "8.2.34", "version": "8.2.35",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.127", "platform-core": "8.2.128",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

4
erm.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "erm.frontend", "name": "erm.frontend",
"version": "8.2.34", "version": "8.2.35",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.127", "platform-core": "8.2.128",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

4
gradle.properties

@ -37,9 +37,9 @@ application_version=1.0.0
# platform # platform
########################################################### ###########################################################
platform_group=io.sc platform_group=io.sc
platform_version=8.2.34 platform_version=8.2.35
platform_plugin_version=8.2.10 platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.127 platform_core_frontend_version=8.2.128
########################################################### ###########################################################
# dependencies version # dependencies version

4
io.sc.engine.mv.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.mv.frontend", "name": "io.sc.engine.mv.frontend",
"version": "8.2.34", "version": "8.2.35",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.127", "platform-core": "8.2.128",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

32
io.sc.engine.rule.client/src/main/resources/META-INF/platform/plugins/exportable-resources.json

@ -29,31 +29,31 @@
}, },
{ {
"type" :"file", "type" :"file",
"name" :"io.sc.engine.rule.core-8.2.27.jar", "name" :"io.sc.engine.rule.core-8.2.34.jar",
"description" :"io.sc.engine.rule.core-8.2.27.jar", "description" :"io.sc.engine.rule.core-8.2.34.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.core-8.2.27.jar"], "sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.core-8.2.34.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.core-8.2.27.jar" "target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.core-8.2.34.jar"
}, },
{ {
"type" :"file", "type" :"file",
"name" :"io.sc.platform.util-8.2.27.jar", "name" :"io.sc.platform.util-8.2.34.jar",
"description" :"io.sc.platform.util-8.2.27.jar", "description" :"io.sc.platform.util-8.2.34.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.platform.util-8.2.27.jar"], "sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.platform.util-8.2.34.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.platform.util-8.2.27.jar" "target" :"${dir.engine.rule.classpath}/io.sc.platform.util-8.2.34.jar"
}, },
{ {
"type" :"file", "type" :"file",
"name" :"io.sc.creditreport.core-8.2.27.jar", "name" :"io.sc.creditreport.core-8.2.34.jar",
"description" :"io.sc.creditreport.core-8.2.27.jar", "description" :"io.sc.creditreport.core-8.2.34.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.creditreport.core-8.2.27.jar"], "sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.creditreport.core-8.2.34.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.creditreport.core-8.2.27.jar" "target" :"${dir.engine.rule.classpath}/io.sc.creditreport.core-8.2.34.jar"
}, },
{ {
"type" :"file", "type" :"file",
"name" :"io.sc.engine.rule.client.spring-8.2.27.jar", "name" :"io.sc.engine.rule.client.spring-8.2.34.jar",
"description" :"io.sc.engine.rule.client.spring-8.2.27.jar", "description" :"io.sc.engine.rule.client.spring-8.2.34.jar",
"sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.client.spring-8.2.27.jar"], "sources" :["classpath:/io/sc/engine/rule/client/jars/io.sc.engine.rule.client.spring-8.2.34.jar"],
"target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.client.spring-8.2.27.jar" "target" :"${dir.engine.rule.classpath}/io.sc.engine.rule.client.spring-8.2.34.jar"
}, },
{ {

4
io.sc.engine.rule.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.rule.frontend", "name": "io.sc.engine.rule.frontend",
"version": "8.2.34", "version": "8.2.35",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.127", "platform-core": "8.2.128",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterWebController.java

@ -47,7 +47,7 @@ public class ParameterWebController extends RestCrudController<ParameterVo,Param
} }
ModelEntity rootModelEntity =modelService.findRootModelByModelId(modelId); ModelEntity rootModelEntity =modelService.findRootModelByModelId(modelId);
List<ParameterEntity> entities =service.findParametersByModelId(modelId); List<ParameterEntity> entities =service.findParametersByModelId(modelId);
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(),locale); ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByModelId(modelId,Locale.getDefault());
VariableCodeAndNameReplacer.replace(entities,parameterAndValueType, ReplaceMode.CODE_TO_NAME); VariableCodeAndNameReplacer.replace(entities,parameterAndValueType, ReplaceMode.CODE_TO_NAME);
return EntityVoUtil.toVo(entities); return EntityVoUtil.toVo(entities);
} }

6
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionItemServiceImpl.java

@ -72,7 +72,8 @@ public class ParameterInOptionItemServiceImpl extends DaoServiceImpl<ParameterIn
} }
//获取代码和名称的映射表 //获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(), Locale.getDefault()); //ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(), Locale.getDefault());
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault());
//将名称替换为代码 //将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE); VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
@ -101,7 +102,8 @@ public class ParameterInOptionItemServiceImpl extends DaoServiceImpl<ParameterIn
} }
//获取代码和名称的映射表 //获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(), Locale.getDefault()); //ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(), Locale.getDefault());
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault());
//将名称替换为代码 //将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE); VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java

@ -172,7 +172,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
} }
//获取代码和名称的映射表 //获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(),Locale.getDefault()); ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByModelId(modelId,Locale.getDefault());
//将名称替换为代码 //将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType,ReplaceMode.NAME_TO_CODE); VariableCodeAndNameReplacer.replace(entity, parameterAndValueType,ReplaceMode.NAME_TO_CODE);
@ -265,7 +265,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
applicationContext.publishEvent(new ParameterEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity)); applicationContext.publishEvent(new ParameterEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity));
//获取代码和名称的映射表 //获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findInParameterByResourceId(rootModelEntity.getResource().getId(),Locale.getDefault()); ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByModelId(modelId,Locale.getDefault());
//将名称替换为代码 //将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE); VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);

2
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.127", "version": "8.2.128",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",

1
io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue

@ -259,6 +259,7 @@ const updateTicked = (args) => {
} }
needFetchData.value = false; needFetchData.value = false;
customDisplayValue.value = ''; customDisplayValue.value = '';
console.info('modelValue.value', modelValue.value);
if (Array.isArray(modelValue.value)) { if (Array.isArray(modelValue.value)) {
if (props.grid['tree']) { if (props.grid['tree']) {
fieldMethodsClass.clearValue(); fieldMethodsClass.clearValue();

271
io.sc.platform.core.frontend/src/views/testcase/form/form.vue

@ -1,82 +1,199 @@
<template> <template>
<w-grid <div>
ref="userGridRef" <w-form
:title="$t('system.user.grid.title')" v-model="valueReactive"
:config-button="true" :cols-num="12"
selection="multiple" :fields="[
db-click-operation="edit" {
:checkbox-selection="true" colSpan: 2,
:data-url="Environment.apiContextPath('/api/system/user')" name: 'datasource',
:sort-by="['loginName']" label: $t('developer.backend.export.liquibase.datasource'),
:query-form-cols-num="3" type: 'w-select',
:query-form-fields="[ options: datasourceOptionsRef,
{ name: 'loginName', label: $t('loginName'), type: 'w-text' }, onUpdateValue: (args) => {
{ name: 'userName', label: $t('userName'), type: 'w-text' }, datasourceChanged(args.value);
{ name: 'enable', label: $t('isEnable'), type: 'w-select', options: Options.yesNo(), queryOperator: 'equals' }, },
]" },
:toolbar-configure="{ noIcon: false }" {
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" colSpan: 2,
:columns="[ name: 'catalog',
{ width: 200, name: 'loginName', label: $t('loginName') }, label: $t('developer.backend.export.liquibase.catalog'),
{ width: '100%', name: 'userName', label: $t('userName') }, type: 'w-select',
]" options: catalogOptionsRef,
:editor="{ onUpdateValue: (args) => {
dialog: { catalogChanged(valueReactive.datasource, args.value);
width: '800px', },
}, },
form: { {
colsNum: 4, colSpan: 2,
fields: [ name: 'schema',
{ name: 'loginName', label: $t('loginName'), type: 'w-text', requiredIf: true, colSpan: 2 }, label: $t('developer.backend.export.liquibase.schema'),
{ name: 'userName', label: $t('userName'), type: 'w-text', requiredIf: true, colSpan: 2 }, type: 'w-select',
{ name: 'description', label: $t('description'), type: 'w-textarea', rows: 1, colSpan: 2 }, options: schemaOptionsRef,
{ name: 'password', label: $t('password'), type: 'w-password', colSpan: 2 }, onUpdateValue: (args) => {
{ name: 'mobile', label: $t('mobile'), type: 'w-text', colSpan: 2 }, schemaChanged(valueReactive.datasource, valueReactive.catalog, args.value);
{ name: 'phone', label: $t('phone'), type: 'w-text', colSpan: 2 }, },
{ name: 'email', label: $t('email'), type: 'w-text', colSpan: 2 }, },
{ name: 'weixin', label: $t('weixin'), type: 'w-text', colSpan: 2 }, {
{ name: 'qq', label: $t('qq'), type: 'w-text', colSpan: 2 }, colSpan: 6,
name: 'tables',
{ name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true, colsFirst: true }, label: $t('developer.backend.export.liquibase.tables'),
{ name: 'accountExpired', label: $t('accountExpired'), type: 'w-checkbox', defaultValue: false }, type: 'w-grid-select',
{ name: 'accountLocked', label: $t('accountLocked'), type: 'w-checkbox', defaultValue: false }, multiple: true,
{ name: 'credentialsExpired', label: $t('credentialsExpired'), type: 'w-checkbox', defaultValue: false }, displayValue: 'name',
], grid: {
}, denseBody: true,
}" hideBottom: true,
:viewer="{ configButton: true,
panel: { checkboxSelection: true,
columnNum: 1, primaryKey: 'name',
fields: [ dataUrl: Environment.apiContextPath(
{ name: 'id', label: $t('id') }, '/api/jdbc/metadata/getTables?datasource=' +
{ name: 'loginName', label: $t('loginName') }, (valueReactive.datasource || '') +
{ name: 'userName', label: $t('userName') }, '&catalog=' +
{ name: 'description', label: $t('description') }, (valueReactive.catalog || '') +
{ name: 'enable', label: $t('enable'), format: Formater.none() }, '&schema=' +
{ name: 'accountExpired', label: $t('accountExpired') }, (valueReactive.schema || ''),
{ name: 'accountLocked', label: $t('accountLocked') }, ),
{ name: 'credentialsExpired', label: $t('credentialsExpired') }, pageable: false,
{ name: 'email', label: $t('email') }, sortBy: ['type', 'namec', '-lastModifyDate'],
{ name: 'phone', label: $t('phone') }, sortNo: true,
{ name: 'mobile', label: $t('mobile') }, toolbarConfigure: { noIcon: false },
{ name: 'weixin', label: $t('weixin') }, toolbarActions: ['refresh'],
{ name: 'qq', label: $t('qq') }, columns: [
{ name: 'dataComeFrom', label: $t('dataComeFrom') }, { name: 'name', label: $t('name') },
{ name: 'creator', label: $t('creator') }, { name: 'remarks', label: $t('remarks') },
{ name: 'createDate', label: $t('createDate') }, ],
{ name: 'lastModifier', label: $t('lastModifier') }, },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() }, },
{ name: 'corporationCode', label: $t('corporationCode') }, { colSpan: 12, name: 'sql', label: $t('SQL'), type: 'w-code-mirror', toolbar: false, lang: 'sql' },
], ]"
}, >
}" </w-form>
></w-grid> <div class="row justify-center q-gutter-md py-2">
<w-progress-btn
ref="progressBtnRef"
icon="bi-database-down"
:label="$t('export')"
data-url="/api/jdbc/data/traceExporterExecuteProgress"
@click="exportData"
@success="
(progressInfo) => {
Downloader.get(Environment.apiContextPath('/api/mvc/download?filePath=' + encodeURIComponent(progressInfo.result)));
}
"
></w-progress-btn>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import 'tailwindcss/utilities.css';
import { Environment, SessionManager, axios, Options, Formater, EnumTools } from '@/platform'; import { ref, reactive, onMounted, onUpdated } from 'vue';
import SelectUserGrid from './shared/SelectUserGrid.vue';
import SelectMenuTreeGrid from './shared/SelectMenuTreeGrid.vue'; import { t, axios, Environment, DialogManager, Downloader } from '@/platform';
const progressBtnRef = ref();
const datasourceOptionsRef = ref([]);
const catalogOptionsRef = ref([]);
const schemaOptionsRef = ref([]);
const tablesOptionsRef = ref([]);
const valueReactive = reactive({
datasource: undefined,
catalog: undefined,
schema: undefined,
tables: [],
sql: undefined,
});
const loadDatasource = () => {
axios.get(Environment.apiContextPath('/api/system/datasource?pageable=false&sortBy=name')).then((response) => {
const data = response?.data.content;
const datasourceOptions = [{ label: t('default'), value: '' }];
if (data && data.length > 0) {
for (let item of data) {
datasourceOptions.push({ label: item.name, value: item.name });
}
}
datasourceOptionsRef.value = datasourceOptions;
});
};
const datasourceChanged = (datasource: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getCatalogs?datasource=' + datasource)).then((response) => {
const data = response?.data;
const catalogOptions = [];
if (data && data.length > 0) {
for (let item of data) {
catalogOptions.push({ label: item.name, value: item.name });
}
}
catalogOptionsRef.value = catalogOptions;
schemaOptionsRef.value = [];
tablesOptionsRef.value = [];
});
};
const catalogChanged = (datasource: string, catalog: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource + '&catalog=' + catalog)).then((response) => {
const data = response?.data;
const schemaOptions = [];
if (data && data.length > 0) {
for (let item of data) {
schemaOptions.push({ label: item.name, value: item.name });
}
}
schemaOptionsRef.value = schemaOptions;
tablesOptionsRef.value = [];
if (schemaOptions.length === 0) {
schemaChanged(datasource, catalog, '');
} else if (schemaOptions.length === 1) {
schemaChanged(datasource, catalog, schemaOptions[0]);
}
});
};
const schemaChanged = (datasource: string, catalog: string, schema: string) => {
datasource = datasource || '';
catalog = catalog || '';
schema = schema || '';
axios
.get(Environment.apiContextPath('/api/jdbc/metadata/getTables?datasource=' + datasource + '&catalog=' + catalog + '&schema=' + schema))
.then((response) => {
const data = response?.data;
const tablesOptions = [];
if (data && data.length > 0) {
for (let item of data) {
tablesOptions.push({ label: item.name + ' - ' + item.remarks, value: item.name });
}
}
tablesOptionsRef.value = tablesOptions;
});
};
const exportData = (e) => {
DialogManager.confirm(t('developer.backend.export.liquibase.export.tip'), () => {
const data = valueReactive;
const config = {
datasource: data.datasource,
schema: data.schema,
tables: [],
};
const length = data.tables.length;
const sql = length === 1 ? data.sql : '';
for (let i = 0; i < length; i++) {
config.tables[i] = { name: data.tables[i], sql: sql ? sql : 'select * from ' + data.tables[i] };
}
axios.post(Environment.apiContextPath('/api/jdbc/data/exportData'), config).then((response) => {
progressBtnRef.value.start();
});
});
};
const userGridRef = ref(); onMounted(() => {
loadDatasource();
datasourceChanged('');
});
</script> </script>

4
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.127", "version": "8.2.128",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"platform-core": "8.2.127", "platform-core": "8.2.128",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

271
io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue

@ -1,82 +1,199 @@
<template> <template>
<w-grid <div>
ref="userGridRef" <w-form
:title="$t('system.user.grid.title')" v-model="valueReactive"
:config-button="true" :cols-num="12"
selection="multiple" :fields="[
db-click-operation="edit" {
:checkbox-selection="true" colSpan: 2,
:data-url="Environment.apiContextPath('/api/system/user')" name: 'datasource',
:sort-by="['loginName']" label: $t('developer.backend.export.liquibase.datasource'),
:query-form-cols-num="3" type: 'w-select',
:query-form-fields="[ options: datasourceOptionsRef,
{ name: 'loginName', label: $t('loginName'), type: 'w-text' }, onUpdateValue: (args) => {
{ name: 'userName', label: $t('userName'), type: 'w-text' }, datasourceChanged(args.value);
{ name: 'enable', label: $t('isEnable'), type: 'w-select', options: Options.yesNo(), queryOperator: 'equals' }, },
]" },
:toolbar-configure="{ noIcon: false }" {
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" colSpan: 2,
:columns="[ name: 'catalog',
{ width: 200, name: 'loginName', label: $t('loginName') }, label: $t('developer.backend.export.liquibase.catalog'),
{ width: '100%', name: 'userName', label: $t('userName') }, type: 'w-select',
]" options: catalogOptionsRef,
:editor="{ onUpdateValue: (args) => {
dialog: { catalogChanged(valueReactive.datasource, args.value);
width: '800px', },
}, },
form: { {
colsNum: 4, colSpan: 2,
fields: [ name: 'schema',
{ name: 'loginName', label: $t('loginName'), type: 'w-text', requiredIf: true, colSpan: 2 }, label: $t('developer.backend.export.liquibase.schema'),
{ name: 'userName', label: $t('userName'), type: 'w-text', requiredIf: true, colSpan: 2 }, type: 'w-select',
{ name: 'description', label: $t('description'), type: 'w-textarea', rows: 1, colSpan: 2 }, options: schemaOptionsRef,
{ name: 'password', label: $t('password'), type: 'w-password', colSpan: 2 }, onUpdateValue: (args) => {
{ name: 'mobile', label: $t('mobile'), type: 'w-text', colSpan: 2 }, schemaChanged(valueReactive.datasource, valueReactive.catalog, args.value);
{ name: 'phone', label: $t('phone'), type: 'w-text', colSpan: 2 }, },
{ name: 'email', label: $t('email'), type: 'w-text', colSpan: 2 }, },
{ name: 'weixin', label: $t('weixin'), type: 'w-text', colSpan: 2 }, {
{ name: 'qq', label: $t('qq'), type: 'w-text', colSpan: 2 }, colSpan: 6,
name: 'tables',
{ name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true, colsFirst: true }, label: $t('developer.backend.export.liquibase.tables'),
{ name: 'accountExpired', label: $t('accountExpired'), type: 'w-checkbox', defaultValue: false }, type: 'w-grid-select',
{ name: 'accountLocked', label: $t('accountLocked'), type: 'w-checkbox', defaultValue: false }, multiple: true,
{ name: 'credentialsExpired', label: $t('credentialsExpired'), type: 'w-checkbox', defaultValue: false }, displayValue: 'name',
], grid: {
}, denseBody: true,
}" hideBottom: true,
:viewer="{ configButton: true,
panel: { checkboxSelection: true,
columnNum: 1, primaryKey: 'name',
fields: [ dataUrl: Environment.apiContextPath(
{ name: 'id', label: $t('id') }, '/api/jdbc/metadata/getTables?datasource=' +
{ name: 'loginName', label: $t('loginName') }, (valueReactive.datasource || '') +
{ name: 'userName', label: $t('userName') }, '&catalog=' +
{ name: 'description', label: $t('description') }, (valueReactive.catalog || '') +
{ name: 'enable', label: $t('enable'), format: Formater.none() }, '&schema=' +
{ name: 'accountExpired', label: $t('accountExpired') }, (valueReactive.schema || ''),
{ name: 'accountLocked', label: $t('accountLocked') }, ),
{ name: 'credentialsExpired', label: $t('credentialsExpired') }, pageable: false,
{ name: 'email', label: $t('email') }, sortBy: ['type', 'namec', '-lastModifyDate'],
{ name: 'phone', label: $t('phone') }, sortNo: true,
{ name: 'mobile', label: $t('mobile') }, toolbarConfigure: { noIcon: false },
{ name: 'weixin', label: $t('weixin') }, toolbarActions: ['refresh'],
{ name: 'qq', label: $t('qq') }, columns: [
{ name: 'dataComeFrom', label: $t('dataComeFrom') }, { name: 'name', label: $t('name') },
{ name: 'creator', label: $t('creator') }, { name: 'remarks', label: $t('remarks') },
{ name: 'createDate', label: $t('createDate') }, ],
{ name: 'lastModifier', label: $t('lastModifier') }, },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() }, },
{ name: 'corporationCode', label: $t('corporationCode') }, { colSpan: 12, name: 'sql', label: $t('SQL'), type: 'w-code-mirror', toolbar: false, lang: 'sql' },
], ]"
}, >
}" </w-form>
></w-grid> <div class="row justify-center q-gutter-md py-2">
<w-progress-btn
ref="progressBtnRef"
icon="bi-database-down"
:label="$t('export')"
data-url="/api/jdbc/data/traceExporterExecuteProgress"
@click="exportData"
@success="
(progressInfo) => {
Downloader.get(Environment.apiContextPath('/api/mvc/download?filePath=' + encodeURIComponent(progressInfo.result)));
}
"
></w-progress-btn>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import 'tailwindcss/utilities.css';
import { Environment, SessionManager, axios, Options, Formater, EnumTools } from '@/platform'; import { ref, reactive, onMounted, onUpdated } from 'vue';
import SelectUserGrid from './shared/SelectUserGrid.vue';
import SelectMenuTreeGrid from './shared/SelectMenuTreeGrid.vue'; import { t, axios, Environment, DialogManager, Downloader } from '@/platform';
const progressBtnRef = ref();
const datasourceOptionsRef = ref([]);
const catalogOptionsRef = ref([]);
const schemaOptionsRef = ref([]);
const tablesOptionsRef = ref([]);
const valueReactive = reactive({
datasource: undefined,
catalog: undefined,
schema: undefined,
tables: [],
sql: undefined,
});
const loadDatasource = () => {
axios.get(Environment.apiContextPath('/api/system/datasource?pageable=false&sortBy=name')).then((response) => {
const data = response?.data.content;
const datasourceOptions = [{ label: t('default'), value: '' }];
if (data && data.length > 0) {
for (let item of data) {
datasourceOptions.push({ label: item.name, value: item.name });
}
}
datasourceOptionsRef.value = datasourceOptions;
});
};
const datasourceChanged = (datasource: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getCatalogs?datasource=' + datasource)).then((response) => {
const data = response?.data;
const catalogOptions = [];
if (data && data.length > 0) {
for (let item of data) {
catalogOptions.push({ label: item.name, value: item.name });
}
}
catalogOptionsRef.value = catalogOptions;
schemaOptionsRef.value = [];
tablesOptionsRef.value = [];
});
};
const catalogChanged = (datasource: string, catalog: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource + '&catalog=' + catalog)).then((response) => {
const data = response?.data;
const schemaOptions = [];
if (data && data.length > 0) {
for (let item of data) {
schemaOptions.push({ label: item.name, value: item.name });
}
}
schemaOptionsRef.value = schemaOptions;
tablesOptionsRef.value = [];
if (schemaOptions.length === 0) {
schemaChanged(datasource, catalog, '');
} else if (schemaOptions.length === 1) {
schemaChanged(datasource, catalog, schemaOptions[0]);
}
});
};
const schemaChanged = (datasource: string, catalog: string, schema: string) => {
datasource = datasource || '';
catalog = catalog || '';
schema = schema || '';
axios
.get(Environment.apiContextPath('/api/jdbc/metadata/getTables?datasource=' + datasource + '&catalog=' + catalog + '&schema=' + schema))
.then((response) => {
const data = response?.data;
const tablesOptions = [];
if (data && data.length > 0) {
for (let item of data) {
tablesOptions.push({ label: item.name + ' - ' + item.remarks, value: item.name });
}
}
tablesOptionsRef.value = tablesOptions;
});
};
const exportData = (e) => {
DialogManager.confirm(t('developer.backend.export.liquibase.export.tip'), () => {
const data = valueReactive;
const config = {
datasource: data.datasource,
schema: data.schema,
tables: [],
};
const length = data.tables.length;
const sql = length === 1 ? data.sql : '';
for (let i = 0; i < length; i++) {
config.tables[i] = { name: data.tables[i], sql: sql ? sql : 'select * from ' + data.tables[i] };
}
axios.post(Environment.apiContextPath('/api/jdbc/data/exportData'), config).then((response) => {
progressBtnRef.value.start();
});
});
};
const userGridRef = ref(); onMounted(() => {
loadDatasource();
datasourceChanged('');
});
</script> </script>

1
io.sc.platform.developer.frontend/src/i18n/messages.json

@ -46,6 +46,7 @@
"developer.backend.import.liquibase.import.tip": "Are you sure to import?", "developer.backend.import.liquibase.import.tip": "Are you sure to import?",
"developer.backend.export.liquibase.datasource": "Datasource", "developer.backend.export.liquibase.datasource": "Datasource",
"developer.backend.export.liquibase.catalog": "Catalog",
"developer.backend.export.liquibase.schema": "Schema", "developer.backend.export.liquibase.schema": "Schema",
"developer.backend.export.liquibase.tables": "Tables", "developer.backend.export.liquibase.tables": "Tables",
"developer.backend.export.liquibase.export.tip": "Are you sure to export?", "developer.backend.export.liquibase.export.tip": "Are you sure to export?",

1
io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json

@ -46,6 +46,7 @@
"developer.backend.import.liquibase.import.tip": "您確定要導入嗎?", "developer.backend.import.liquibase.import.tip": "您確定要導入嗎?",
"developer.backend.export.liquibase.datasource": "數據源", "developer.backend.export.liquibase.datasource": "數據源",
"developer.backend.export.liquibase.catalog": "目錄",
"developer.backend.export.liquibase.schema": "方案", "developer.backend.export.liquibase.schema": "方案",
"developer.backend.export.liquibase.tables": "表", "developer.backend.export.liquibase.tables": "表",
"developer.backend.export.liquibase.export.tip": "您確定要導出嗎?", "developer.backend.export.liquibase.export.tip": "您確定要導出嗎?",

1
io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json

@ -46,6 +46,7 @@
"developer.backend.import.liquibase.import.tip": "您确定要导入吗?", "developer.backend.import.liquibase.import.tip": "您确定要导入吗?",
"developer.backend.export.liquibase.datasource": "数据源", "developer.backend.export.liquibase.datasource": "数据源",
"developer.backend.export.liquibase.catalog": "目录",
"developer.backend.export.liquibase.schema": "方案", "developer.backend.export.liquibase.schema": "方案",
"developer.backend.export.liquibase.tables": "表", "developer.backend.export.liquibase.tables": "表",
"developer.backend.export.liquibase.export.tip": "您确定要导出吗?", "developer.backend.export.liquibase.export.tip": "您确定要导出吗?",

4
io.sc.platform.developer.frontend/src/remote-components/remote-components.json

@ -5,8 +5,4 @@
"componentPath": "组件 .vue 文件路径" "componentPath": "组件 .vue 文件路径"
} }
*/ */
{
"component": "component.remote.developer.XXX",
"componentPath": "@/views/XXX.vue"
}
] ]

4
io.sc.platform.developer.frontend/src/views/XXX.vue

@ -1,4 +0,0 @@
<template>
<div>XXX</div>
</template>
<script setup lang="ts"></script>

245
io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase copy.vue

@ -0,0 +1,245 @@
<template>
<div>
<div class="row py-1 q-col-gutter-sm">
<div class="col-2">
<q-select
v-model="valueReactive.datasource"
:label="$t('developer.backend.export.liquibase.datasource')"
outlined
dense
emit-value
map-options
:options="datasourceOptionsRef"
default-value=""
@update:model-value="
(value) => {
datasourceChanged(value);
}
"
></q-select>
</div>
<div class="col-2">
<q-select
v-model="valueReactive.catalog"
:label="$t('developer.backend.export.liquibase.catalog')"
outlined
dense
emit-value
map-options
:options="catalogOptionsRef"
@update:model-value="
(value) => {
catalogChanged(valueReactive.datasource, value);
}
"
></q-select>
</div>
<div class="col-2">
<q-select
v-model="valueReactive.schema"
:label="$t('developer.backend.export.liquibase.schema')"
outlined
dense
emit-value
map-options
:options="schemaOptionsRef"
@update:model-value="
(value) => {
schemaChanged(valueReactive.datasource, valueReactive.catalog, value);
}
"
></q-select>
</div>
<div class="col-6">
<q-select
v-model="valueReactive.tables"
:label="$t('developer.backend.export.liquibase.tables')"
outlined
dense
emit-value
map-options
multiple
use-chips
:options="tablesOptionsRef"
@update:model-value="
(value) => {
if (value) {
if (value.length > 1) {
valueReactive.sql = 'select * from ${table}';
} else {
valueReactive.sql = 'select * from ' + value;
}
}
}
"
>
<template #append>
<q-btn
:title="$t('selectAll')"
icon="bi-check-square"
flat
dense
:disable="!(tablesOptionsRef?.length > 0)"
@click.stop.prevent="
() => {
const selecteds = [];
if (tablesOptionsRef) {
for (const table of tablesOptionsRef) {
selecteds.push(table.value);
}
}
valueReactive.tables = selecteds;
}
"
/>
<q-btn
:title="$t('unSelectAll')"
icon="bi-square"
flat
dense
:disable="!(tablesOptionsRef?.length > 0)"
@click.stop.prevent="
() => {
valueReactive.tables = [];
}
"
/>
</template>
</q-select>
</div>
</div>
<div class="row py-1 q-col-gutter-sm">
<div class="col-12">
<w-code-mirror v-model="valueReactive.sql" label="SQL" :rows="5" lang="sql" :toolbar="false"></w-code-mirror>
</div>
</div>
<!--
<div class="row justify-center q-gutter-md py-2">
<w-progress-btn
ref="progressBtnRef"
icon="bi-database-down"
:label="$t('export')"
data-url="/api/jdbc/data/traceExporterExecuteProgress"
@click="exportData"
@success="
(progressInfo) => {
Downloader.get(Environment.apiContextPath('/api/mvc/download?filePath=' + encodeURIComponent(progressInfo.result)));
}
"
></w-progress-btn>
</div>
-->
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, reactive, onMounted, onUpdated } from 'vue';
import { t, axios, Environment, DialogManager, Downloader } from 'platform-core';
const progressBtnRef = ref();
const datasourceOptionsRef = ref([]);
const catalogOptionsRef = ref([]);
const schemaOptionsRef = ref([]);
const tablesOptionsRef = ref([]);
const valueReactive = reactive({
datasource: undefined,
catalog: undefined,
schema: undefined,
tables: undefined,
sql: undefined,
});
const loadDatasource = () => {
axios.get(Environment.apiContextPath('/api/system/datasource?pageable=false&sortBy=name')).then((response) => {
const data = response?.data.content;
const datasourceOptions = [{ label: t('default'), value: '' }];
if (data && data.length > 0) {
for (let item of data) {
datasourceOptions.push({ label: item.name, value: item.name });
}
}
datasourceOptionsRef.value = datasourceOptions;
});
};
const datasourceChanged = (datasource: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getCatalogs?datasource=' + datasource)).then((response) => {
const data = response?.data;
const catalogOptions = [];
if (data && data.length > 0) {
for (let item of data) {
catalogOptions.push({ label: item.name, value: item.name });
}
}
catalogOptionsRef.value = catalogOptions;
schemaOptionsRef.value = [];
tablesOptionsRef.value = [];
});
};
const catalogChanged = (datasource: string, catalog: string) => {
datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource + '&catalog=' + catalog)).then((response) => {
const data = response?.data;
const schemaOptions = [];
if (data && data.length > 0) {
for (let item of data) {
schemaOptions.push({ label: item.name, value: item.name });
}
}
schemaOptionsRef.value = schemaOptions;
tablesOptionsRef.value = [];
if (schemaOptions.length === 0) {
schemaChanged(datasource, catalog, '');
} else if (schemaOptions.length === 1) {
schemaChanged(datasource, catalog, schemaOptions[0]);
}
});
};
const schemaChanged = (datasource: string, catalog: string, schema: string) => {
datasource = datasource || '';
catalog = catalog || '';
schema = schema || '';
axios
.get(Environment.apiContextPath('/api/jdbc/metadata/getTables?datasource=' + datasource + '&catalog=' + catalog + '&schema=' + schema))
.then((response) => {
const data = response?.data;
const tablesOptions = [];
if (data && data.length > 0) {
for (let item of data) {
tablesOptions.push({ label: item.name + ' - ' + item.remarks, value: item.name });
}
}
tablesOptionsRef.value = tablesOptions;
});
};
const exportData = (e) => {
DialogManager.confirm(t('developer.backend.export.liquibase.export.tip'), () => {
const data = valueReactive;
const config = {
datasource: data.datasource,
schema: data.schema,
tables: [],
};
const length = data.tables.length;
const sql = length === 1 ? data.sql : '';
for (let i = 0; i < length; i++) {
config.tables[i] = { name: data.tables[i], sql: sql ? sql : 'select * from ' + data.tables[i] };
}
axios.post(Environment.apiContextPath('/api/jdbc/data/exportData'), config).then((response) => {
progressBtnRef.value.start();
});
});
};
onMounted(() => {
loadDatasource();
datasourceChanged('');
});
</script>

214
io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase.vue

@ -1,103 +1,73 @@
<template> <template>
<div> <div>
<div class="row py-1 q-col-gutter-sm"> <w-form
<div class="col-2"> v-model="valueReactive"
<q-select :cols-num="12"
v-model="valueReactive.datasource" :fields="[
:label="$t('developer.backend.export.liquibase.datasource')" {
outlined colSpan: 2,
dense name: 'datasource',
emit-value label: $t('developer.backend.export.liquibase.datasource'),
map-options type: 'w-select',
:options="datasourceOptionsRef" options: datasourceOptionsRef,
default-value="" onUpdateValue: (args) => {
@update:model-value=" datasourceChanged(args.value);
(value) => { },
datasourceChanged(value); },
} {
" colSpan: 2,
></q-select> name: 'catalog',
</div> label: $t('developer.backend.export.liquibase.catalog'),
<div class="col-2"> type: 'w-select',
<q-select options: catalogOptionsRef,
v-model="valueReactive.schema" onUpdateValue: (args) => {
:label="$t('developer.backend.export.liquibase.schema')" catalogChanged(valueReactive.datasource, args.value);
outlined },
dense },
emit-value {
map-options colSpan: 2,
:options="schemaOptionsRef" name: 'schema',
@update:model-value=" label: $t('developer.backend.export.liquibase.schema'),
(value) => { type: 'w-select',
schemaChanged(valueReactive.datasource, value); options: schemaOptionsRef,
} onUpdateValue: (args) => {
" schemaChanged(valueReactive.datasource, valueReactive.catalog, args.value);
></q-select> },
</div> },
<div class="col-8"> {
<q-select colSpan: 6,
v-model="valueReactive.tables" name: 'tables',
:label="$t('developer.backend.export.liquibase.tables')" label: $t('developer.backend.export.liquibase.tables'),
outlined type: 'w-grid-select',
dense multiple: true,
emit-value grid: {
map-options denseBody: true,
multiple hideBottom: true,
use-chips configButton: true,
:options="tablesOptionsRef" checkboxSelection: true,
@update:model-value=" dataUrl: Environment.apiContextPath(
(value) => { '/api/jdbc/metadata/getTables?datasource=' +
if (value) { (valueReactive.datasource || '') +
if (value.length > 1) { '&catalog=' +
valueReactive.sql = 'select * from ${table}'; (valueReactive.catalog || '') +
} else { '&schema=' +
valueReactive.sql = 'select * from ' + value; (valueReactive.schema || ''),
} ),
} pageable: false,
} sortBy: ['type', 'namec', '-lastModifyDate'],
" sortNo: true,
> toolbarConfigure: { noIcon: false },
<template #append> toolbarActions: ['refresh'],
<q-btn columns: [
:title="$t('selectAll')" { name: 'name', label: $t('name') },
icon="bi-check-square" { name: 'remarks', label: $t('remarks') },
flat ],
dense },
:disable="!(tablesOptionsRef?.length > 0)" },
@click.stop.prevent=" { colSpan: 12, name: 'sql', label: $t('SQL'), type: 'w-code-mirror', toolbar: false, lang: 'sql' },
() => { ]"
const selecteds = []; >
if (tablesOptionsRef) { </w-form>
for (const table of tablesOptionsRef) {
selecteds.push(table.value);
}
}
valueReactive.tables = selecteds;
}
"
/>
<q-btn
:title="$t('unSelectAll')"
icon="bi-square"
flat
dense
:disable="!(tablesOptionsRef?.length > 0)"
@click.stop.prevent="
() => {
valueReactive.tables = [];
}
"
/>
</template>
</q-select>
</div>
</div>
<div class="row py-1 q-col-gutter-sm">
<div class="col-12">
<w-code-mirror v-model="valueReactive.sql" label="SQL" :rows="5" lang="sql" :toolbar="false"></w-code-mirror>
</div>
</div>
<div class="row justify-center q-gutter-md py-2"> <div class="row justify-center q-gutter-md py-2">
<w-progress-btn <w-progress-btn
ref="progressBtnRef" ref="progressBtnRef"
@ -122,13 +92,15 @@ import { t, axios, Environment, DialogManager, Downloader } from 'platform-core'
const progressBtnRef = ref(); const progressBtnRef = ref();
const datasourceOptionsRef = ref([]); const datasourceOptionsRef = ref([]);
const catalogOptionsRef = ref([]);
const schemaOptionsRef = ref([]); const schemaOptionsRef = ref([]);
const tablesOptionsRef = ref([]); const tablesOptionsRef = ref([]);
const valueReactive = reactive({ const valueReactive = reactive({
datasource: undefined, datasource: undefined,
catalog: undefined,
schema: undefined, schema: undefined,
tables: undefined, tables: [],
sql: undefined, sql: undefined,
}); });
@ -147,34 +119,58 @@ const loadDatasource = () => {
const datasourceChanged = (datasource: string) => { const datasourceChanged = (datasource: string) => {
datasource = datasource || ''; datasource = datasource || '';
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource)).then((response) => { axios.get(Environment.apiContextPath('/api/jdbc/metadata/getCatalogs?datasource=' + datasource)).then((response) => {
const data = response?.data; const data = response?.data;
const schemaOptions = []; const catalogOptions = [];
if (data && data.length > 0) { if (data && data.length > 0) {
for (let item of data) { for (let item of data) {
schemaOptions.push({ label: item.name, value: item.name }); catalogOptions.push({ label: item.name, value: item.name });
} }
} }
schemaOptionsRef.value = schemaOptions; catalogOptionsRef.value = catalogOptions;
schemaOptionsRef.value = [];
tablesOptionsRef.value = []; tablesOptionsRef.value = [];
}); });
}; };
const schemaChanged = (datasource: string, schema: string) => { const catalogChanged = (datasource: string, catalog: string) => {
datasource = datasource || ''; datasource = datasource || '';
schema = schema || ''; axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemas?datasource=' + datasource + '&catalog=' + catalog)).then((response) => {
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getTables?datasource=' + datasource + '&schema=' + schema)).then((response) => {
const data = response?.data; const data = response?.data;
const tablesOptions = []; const schemaOptions = [];
if (data && data.length > 0) { if (data && data.length > 0) {
for (let item of data) { for (let item of data) {
tablesOptions.push({ label: item.name, value: item.name }); schemaOptions.push({ label: item.name, value: item.name });
} }
} }
tablesOptionsRef.value = tablesOptions; schemaOptionsRef.value = schemaOptions;
tablesOptionsRef.value = [];
if (schemaOptions.length === 0) {
schemaChanged(datasource, catalog, '');
} else if (schemaOptions.length === 1) {
schemaChanged(datasource, catalog, schemaOptions[0]);
}
}); });
}; };
const schemaChanged = (datasource: string, catalog: string, schema: string) => {
datasource = datasource || '';
catalog = catalog || '';
schema = schema || '';
axios
.get(Environment.apiContextPath('/api/jdbc/metadata/getTables?datasource=' + datasource + '&catalog=' + catalog + '&schema=' + schema))
.then((response) => {
const data = response?.data;
const tablesOptions = [];
if (data && data.length > 0) {
for (let item of data) {
tablesOptions.push({ label: item.name + ' - ' + item.remarks, value: item.name });
}
}
tablesOptionsRef.value = tablesOptions;
});
};
const exportData = (e) => { const exportData = (e) => {
DialogManager.confirm(t('developer.backend.export.liquibase.export.tip'), () => { DialogManager.confirm(t('developer.backend.export.liquibase.export.tip'), () => {
const data = valueReactive; const data = valueReactive;

32
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java

@ -264,6 +264,8 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
//是否是退回操作 //是否是退回操作
boolean isReturn =isReturn(task,newTask); boolean isReturn =isReturn(task,newTask);
//是否退回后原路提交
boolean isSubmit2Return =isSubmit2Return(transientVariables);
//如果未分配到单一的一个处理人,需要根据流程定义查找可用的处理人 //如果未分配到单一的一个处理人,需要根据流程定义查找可用的处理人
String taskDefinitionKey =newTask.getTaskDefinitionKey(); String taskDefinitionKey =newTask.getTaskDefinitionKey();
@ -298,7 +300,8 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
} }
} }
String historyAssignee =historyTask.getAssignee(); String historyAssignee =historyTask.getAssignee();
if(StringUtils.hasText(historyAssignee) && isReturn) { //如果是退回或者退回后再原路提交, 则直接分配给原处理人
if(StringUtils.hasText(historyAssignee) && (isReturn || isSubmit2Return)) {
AgentEntity agent =getAgent(historyAssignee); AgentEntity agent =getAgent(historyAssignee);
if(agent!=null){ if(agent!=null){
taskService.setAssignee(newTask.getId(), agent.getAgentLoginName()); taskService.setAssignee(newTask.getId(), agent.getAgentLoginName());
@ -430,6 +433,33 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
return value<0; return value<0;
} }
/**
* 是否退回后原路提交(: 退回后, 提交给上一个退回的节点及处理人)
* 判断条件: submit (-900,-800] 区间内
* @param transientVariables 临时变量
* @return 是否退回后原路提交
*/
private boolean isSubmit2Return(Map<String,Object> transientVariables){
if(transientVariables==null || transientVariables.isEmpty()){
return false;
}
Object submit =transientVariables.get("submit");
if(submit==null){
return false;
}
if(submit instanceof Integer){
Integer value =(Integer)submit;
return value>-900 && value <=-800;
}else{
try {
Integer value = Integer.parseInt(submit.toString());
return value>-900 && value <=-800;
} catch (NumberFormatException e) {
return false;
}
}
}
@Override @Override
@Transactional @Transactional
public List<Goback> getGobacks(String taskId) throws Exception { public List<Goback> getGobacks(String taskId) throws Exception {

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescriptionWrapperMapper.java

@ -9,7 +9,7 @@ public class BusinessKeyAndDescriptionWrapperMapper implements RowMapper<Busines
@Override @Override
public BusinessKeyAndDescriptionWrapper mapRow(ResultSet rs, int rowNum) throws SQLException { public BusinessKeyAndDescriptionWrapper mapRow(ResultSet rs, int rowNum) throws SQLException {
BusinessKeyAndDescriptionWrapper wrapper =new BusinessKeyAndDescriptionWrapper(); BusinessKeyAndDescriptionWrapper wrapper =new BusinessKeyAndDescriptionWrapper();
wrapper.setBusinessKey(rs.getString("BUSINESS_TYPE")); wrapper.setBusinessType(rs.getString("BUSINESS_TYPE"));
wrapper.setBusinessKey(rs.getString("BUSINESS_KEY")); wrapper.setBusinessKey(rs.getString("BUSINESS_KEY"));
wrapper.setCustNo(rs.getString("CUST_NO")); wrapper.setCustNo(rs.getString("CUST_NO"));
wrapper.setCustName(rs.getString("CUST_NAME")); wrapper.setCustName(rs.getString("CUST_NAME"));

2
io.sc.platform.jdbc.driver.mysql/src/main/resources/META-INF/platform/plugins/jdbc-connection-template.json

@ -4,7 +4,7 @@
"version" : "5.0", "version" : "5.0",
"driver" : "com.mysql.jdbc.Driver", "driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://${host}:${port}/${database}", "url" : "jdbc:mysql://${host}:${port}/${database}",
"urlSample" : "jdbc:mysql://localhost:3306/platform?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "urlSample" : "jdbc:mysql://localhost:3306/platform?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useInformationSchema=true&serverTimezone=Asia/Shanghai",
"hibernateDialect" : "org.hibernate.dialect.MySQLDialect", "hibernateDialect" : "org.hibernate.dialect.MySQLDialect",
"sqlDialect" : "io.sc.platform.jdbc.sql.dialect.impl.MysqlDialect", "sqlDialect" : "io.sc.platform.jdbc.sql.dialect.impl.MysqlDialect",
"validationQuery" : "select 1" "validationQuery" : "select 1"

2
io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java

@ -43,7 +43,7 @@ public class LiquibaseDataCsvExporter implements DataExporter {
String[] tableNames =ExportTable.getTableNames(configure.getTables()); String[] tableNames =ExportTable.getTableNames(configure.getTables());
progressInfo.setTotalWeight(tableNames.length); progressInfo.setTotalWeight(tableNames.length);
List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getSchema(),tableNames); List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getCatalog(),configure.getSchema());
String outPutDir =OUTPUT_PATH + "/" + configure.getSchema(); String outPutDir =OUTPUT_PATH + "/" + configure.getSchema();
FileUtil.deldirs(outPutDir); FileUtil.deldirs(outPutDir);
String dataDir =outPutDir + "/data"; String dataDir =outPutDir + "/data";

4
io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseSchemaExporter.java

@ -35,7 +35,7 @@ public class LiquibaseSchemaExporter implements SchemaExporter {
private void exportSingleFile(DataSource dataSource, SchemaExportConfigure configure) throws XMLStreamException, FileNotFoundException, UnsupportedEncodingException, MetaDataAccessException { private void exportSingleFile(DataSource dataSource, SchemaExportConfigure configure) throws XMLStreamException, FileNotFoundException, UnsupportedEncodingException, MetaDataAccessException {
XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + ".xml"); XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + ".xml");
writeHeader(writer,configure.getSchema()); writeHeader(writer,configure.getSchema());
List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getSchema(),configure.getTables()); List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getCatalog(), configure.getSchema());
for(Table table : tables){ for(Table table : tables){
writeTable(table,writer); writeTable(table,writer);
} }
@ -45,7 +45,7 @@ public class LiquibaseSchemaExporter implements SchemaExporter {
} }
private void exportMultiFile(DataSource dataSource, SchemaExportConfigure configure) throws MetaDataAccessException, XMLStreamException, FileNotFoundException, UnsupportedEncodingException { private void exportMultiFile(DataSource dataSource, SchemaExportConfigure configure) throws MetaDataAccessException, XMLStreamException, FileNotFoundException, UnsupportedEncodingException {
List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource,configure.getSchema(),configure.getTables()); List<Table> tables =MetaDataLoader.newInstance().getTables(dataSource, configure.getCatalog(), configure.getSchema());
for(Table table : tables){ for(Table table : tables){
XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + "." + table.getName() + ".xml"); XMLStreamWriter writer = WriterUtil.xmlStreamWriter(OUTPUT_PATH + File.separator + "schema." + configure.getSchema() + "." + table.getName() + ".xml");
writeHeader(writer,configure.getSchema() + "." + table.getName()); writeHeader(writer,configure.getSchema() + "." + table.getName());

322
io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java

@ -3,22 +3,23 @@ package io.sc.platform.jdbc.schemacrawler;
import io.sc.platform.jdbc.DatabaseType; import io.sc.platform.jdbc.DatabaseType;
import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.MetaDataLoader;
import io.sc.platform.jdbc.meta.support.*; import io.sc.platform.jdbc.meta.support.*;
import io.sc.platform.jdbc.util.SqlTypeUtil;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import schemacrawler.inclusionrule.RegularExpressionExclusionRule; import schemacrawler.inclusionrule.RegularExpressionExclusionRule;
import schemacrawler.schema.ColumnReference; import schemacrawler.schema.ColumnReference;
import schemacrawler.schema.TableRelationshipType; import schemacrawler.schema.TableRelationshipType;
import schemacrawler.schema.TableType;
import schemacrawler.schemacrawler.*; import schemacrawler.schemacrawler.*;
import schemacrawler.tools.utility.SchemaCrawlerUtility; import schemacrawler.tools.utility.SchemaCrawlerUtility;
import us.fatehi.utility.datasource.DatabaseConnectionSource; import us.fatehi.utility.datasource.DatabaseConnectionSource;
import us.fatehi.utility.datasource.DatabaseConnectionSources; import us.fatehi.utility.datasource.DatabaseConnectionSources;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -26,186 +27,201 @@ import java.util.List;
@Service("io.sc.platform.jdbc.schemacrawler.MetaDataLoaderImpl") @Service("io.sc.platform.jdbc.schemacrawler.MetaDataLoaderImpl")
public class MetaDataLoaderImpl implements MetaDataLoader { public class MetaDataLoaderImpl implements MetaDataLoader {
@Override private static final Logger log = LoggerFactory.getLogger(MetaDataLoaderImpl.class);
public List<Schema> getSchemas(DataSource dataSource) throws MetaDataAccessException {
DatabaseConnectionSource innerDataSource = DatabaseConnectionSources.fromDataSource(dataSource);
LimitOptions limitOptions = getDefaultLimitOptionsBuilder(dataSource).toOptions();
LoadOptions loadOptions = getLoadOptions(SchemaInfoLevelBuilder.minimum());
SchemaCrawlerOptions options =SchemaCrawlerOptionsBuilder.newSchemaCrawlerOptions()
.withLimitOptions(limitOptions)
.withLoadOptions(loadOptions);
schemacrawler.schema.Catalog catalog = SchemaCrawlerUtility.getCatalog(innerDataSource, options);
Collection<schemacrawler.schema.Schema> schemas =catalog.getSchemas();
List<Schema> result =new ArrayList<>();
for(schemacrawler.schema.Schema schema: schemas) {
result.add(from(schema));
}
return result;
}
public List<TableSummary> getTableSummary(DataSource dataSource, String schemaName,boolean isCount) throws MetaDataAccessException { public List<Catalog> getCatalogs(DataSource dataSource) throws MetaDataAccessException {
DatabaseConnectionSource innerDataSource = DatabaseConnectionSources.fromDataSource(dataSource); List<Catalog> result =new ArrayList<>();
LimitOptions limitOptions =getLimitOptions(dataSource,schemaName); Connection connection =null;
LoadOptions loadOptions = getLoadOptions(SchemaInfoLevelBuilder.minimum()); ResultSet rs =null;
SchemaCrawlerOptions options =SchemaCrawlerOptionsBuilder.newSchemaCrawlerOptions() try {
.withLimitOptions(limitOptions) connection =dataSource.getConnection();
.withLoadOptions(loadOptions); DatabaseMetaData databaseMetaData =connection.getMetaData();
schemacrawler.schema.Catalog catalog = SchemaCrawlerUtility.getCatalog(innerDataSource, options); rs =databaseMetaData.getCatalogs();
if(!catalog.getSchemas().isEmpty()) { while (rs.next()){
List<schemacrawler.schema.Table> tables =new ArrayList<>(catalog.getTables(catalog.getSchemas().iterator().next())); Catalog catalog =new Catalog();
List<TableSummary> result = new ArrayList<>(); catalog.setName(rs.getString("TABLE_CAT"));
for (schemacrawler.schema.Table table : tables) { result.add(catalog);
TableSummary tableSummary =new TableSummary();
tableSummary.setName(table.getName());
tableSummary.setRemarks(table.getRemarks());
if(isCount){
try(
Connection connection =dataSource.getConnection();
PreparedStatement ps =connection.prepareStatement("select count(1) from " + table.getName());
ResultSet rs =ps.executeQuery();
){
rs.next();
tableSummary.setCount(rs.getLong(1));
}catch (SQLException e){
throw new MetaDataAccessException(e);
}
}
result.add(tableSummary);
} }
return result; return result;
}catch (SQLException e){
throw new MetaDataAccessException(e);
}finally {
try{rs.close();} catch (SQLException e) {}
try{connection.close();} catch (SQLException e) {}
} }
return Collections.emptyList();
} }
@Override @Override
public List<Table> getTables(DataSource dataSource, String schemaName, String... tableNames) throws MetaDataAccessException { public List<Schema> getSchemas(DataSource dataSource, String catalogName) throws MetaDataAccessException {
DatabaseConnectionSource innerDataSource = DatabaseConnectionSources.fromDataSource(dataSource); List<Schema> result =new ArrayList<>();
LimitOptions limitOptions =getLimitOptions(dataSource,schemaName,tableNames); Connection connection =null;
LoadOptions loadOptions = getLoadOptions(SchemaInfoLevelBuilder.standard()); ResultSet rs =null;
SchemaCrawlerOptions options =SchemaCrawlerOptionsBuilder.newSchemaCrawlerOptions() try {
.withLimitOptions(limitOptions) connection =dataSource.getConnection();
.withLoadOptions(loadOptions); DatabaseMetaData databaseMetaData =connection.getMetaData();
schemacrawler.schema.Catalog catalog = SchemaCrawlerUtility.getCatalog(innerDataSource, options); rs =databaseMetaData.getSchemas(catalogName,null);
if(!catalog.getSchemas().isEmpty()) { while (rs.next()){
List<schemacrawler.schema.Table> tables =new ArrayList<>(catalog.getTables(catalog.getSchemas().iterator().next())); Schema schema =new Schema();
CollectionUtil.bubbleSort(tables,new ParentAndChildrenTableComparator()); schema.setName(rs.getString("TABLE_SCHEM"));
List<Table> result = new ArrayList<>(); result.add(schema);
for (schemacrawler.schema.Table table : tables) {
Table innerTable =from(table);
innerTable.setSelfReference(isSelfReference(table));
result.add(innerTable);
} }
return result; return result;
}catch (SQLException e){
throw new MetaDataAccessException(e);
}finally {
try{rs.close();} catch (SQLException e) {}
try{connection.close();} catch (SQLException e) {}
} }
return Collections.emptyList();
}
public boolean isSelfReference(schemacrawler.schema.Table table) {
Collection<schemacrawler.schema.Table> parentTables =table.getRelatedTables(TableRelationshipType.parent);
if(parentTables!=null && !parentTables.isEmpty()) {
for(schemacrawler.schema.Table parentTable : parentTables) {
if(parentTable.equals(table)) {
return true;
}
}
}
return false;
} }
private LimitOptions getLimitOptions(DataSource dataSource, String schemaName, String... tableNames) throws MetaDataAccessException { @Override
LimitOptions limitOptions =null; public List<Table> getTables(DataSource dataSource, String catalogName, String schemaName) throws MetaDataAccessException {
List<Table> result =new ArrayList<>();
if(StringUtils.hasText(schemaName)){ Connection connection =null;
if(tableNames!=null && tableNames.length>0) { ResultSet rs =null;
limitOptions = LimitOptionsBuilder.builder() try {
.includeSchemas(new SchemaNameInclusionRule(schemaName)) connection =dataSource.getConnection();
.includeTables(new TableNameInclusionRule(tableNames)) DatabaseMetaData databaseMetaData =connection.getMetaData();
.toOptions(); rs =databaseMetaData.getTables(catalogName,schemaName,null,new String[]{"TABLE"});
}else{ while (rs.next()){
limitOptions = LimitOptionsBuilder.builder() Table table =new Table();
.includeSchemas(new SchemaNameInclusionRule(schemaName)) table.setName(rs.getString("TABLE_NAME"));
.toOptions(); table.setRemarks(rs.getString("REMARKS"));
} table.setColumns(getColumns(dataSource,catalogName,schemaName,table.getName()));
}else{ result.add(table);
if(tableNames!=null && tableNames.length>0) {
limitOptions = getDefaultLimitOptionsBuilder(dataSource)
.includeTables(new TableNameInclusionRule(tableNames))
.toOptions();
}else{
limitOptions = getDefaultLimitOptionsBuilder(dataSource)
.toOptions();
} }
} catch (SQLException e) {
throw new MetaDataAccessException(e);
}finally {
try{rs.close();} catch (SQLException e) {}
try{connection.close();} catch (SQLException e) {}
} }
return limitOptions; return result;
} }
private LimitOptionsBuilder getDefaultLimitOptionsBuilder(DataSource dataSource) throws MetaDataAccessException { @Override
LimitOptionsBuilder builder =LimitOptionsBuilder.builder(); public List<Column> getColumns(DataSource dataSource, String catalogName, String schemaName, String tableName) throws MetaDataAccessException {
List<Column> result =new ArrayList<>();
Connection connection =null;
ResultSet rs =null;
try { try {
DatabaseType type = DatabaseType.fromMetaData(dataSource); connection =dataSource.getConnection();
switch (type) { DatabaseMetaData databaseMetaData =connection.getMetaData();
case DB2: rs =databaseMetaData.getColumns(catalogName,schemaName,tableName,null);
builder.includeSchemas(new RegularExpressionExclusionRule("NULLID|SQLJ|SYSCAT|SYSFUN|SYSIBM|SYSIBMADM|SYSIBMINTERNAL|SYSIBMTS|SYSPROC|SYSPUBLIC|SYSSTAT|SYSTOOLS")); while (rs.next()){
break; result.add(getColumn(rs));
case H2:
break;
case MYSQL:
builder.includeSchemas(new RegularExpressionExclusionRule("sys|mysql|performance_schema|information_schema"));
break;
case ORACLE:
builder.includeSchemas(new RegularExpressionExclusionRule("ANONYMOUS|AUDSYS|APPQOSSYS|DBSFWUSER|DGPDB_INT|DIP|DVF|DVSYS|GGSYS|GSMADMIN_INTERNAL|GSMCATUSER|GSMUSER|LBACSYS|OPS\\$ORACLE|PDBADMIN|REMOTE_SCHEDULER_AGENT|SYS\\$UMF|SYSBACKUP|SYSDG|SYSKM|SYSRAC|XS\\$NULL|CTXSYS|DBSNMP|MDDATA|MDSYS|\\\"OPS\\$ORACLE\\\"|ORACLE_OCM|OUTLN|SYS|\\\"SYSTEM\\\"|\\\"SYS\\$UMF\\\"|XDB|\\\"XS\\$NULL\\\""));
break;
case POSTGRESQL:
builder.includeSchemas(new RegularExpressionExclusionRule("pg_catalog|information_schema"));
break;
} }
}catch (org.springframework.jdbc.support.MetaDataAccessException e){ } catch (SQLException e) {
throw new MetaDataAccessException(e); throw new MetaDataAccessException(e);
}finally {
try{rs.close();} catch (SQLException e) {}
try{connection.close();} catch (SQLException e) {}
} }
return builder; return result;
} }
private LoadOptions getLoadOptions(SchemaInfoLevel schemaInfoLevel){ private Column getColumn(ResultSet rs) throws SQLException {
return LoadOptionsBuilder.builder() String TABLE_CAT =rs.getString("TABLE_CAT"); //table catalog (may be null)
.withSchemaInfoLevel(schemaInfoLevel) String TABLE_SCHEM =rs.getString("TABLE_SCHEM"); //table schema (may be null)
.toOptions(); String TABLE_NAME =rs.getString("TABLE_NAME"); //table name (表名称)
} String COLUMN_NAME =rs.getString("COLUMN_NAME"); //column name(列名)
int DATA_TYPE =rs.getInt ("DATA_TYPE"); //SQL type from java.sql.Types(列的数据类型)
String TYPE_NAME =rs.getString("TYPE_NAME"); //Data source dependent type name, for a UDT the type name is fully qualified
int COLUMN_SIZE =rs.getInt ("COLUMN_SIZE"); //column size
int BUFFER_LENGTH =rs.getInt ("BUFFER_LENGTH"); //is not used
int DECIMAL_DIGITS =rs.getInt ("DECIMAL_DIGITS"); //the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.
int NUM_PREC_RADIX =rs.getInt ("NUM_PREC_RADIX"); //Radix (typically either 10 or 2)
int NULLABLE =rs.getInt ("NULLABLE"); //is NULL allowed.
String REMARKS =rs.getString("REMARKS"); //comment describing column (may be null)
String COLUMN_DEF =rs.getString("COLUMN_DEF"); //default value for the column, (may be null)
int SQL_DATA_TYPE =rs.getInt ("SQL_DATA_TYPE"); //unused
int SQL_DATETIME_SUB =rs.getInt ("SQL_DATETIME_SUB"); //unused
int CHAR_OCTET_LENGTH=rs.getInt ("CHAR_OCTET_LENGTH"); //for char types the maximum number of bytes in the column
int ORDINAL_POSITION =rs.getInt ("ORDINAL_POSITION"); //index of column in table (starting at 1)
String IS_NULLABLE =rs.getString("IS_NULLABLE"); //ISO rules are used to determine the nullability for a column.
//String SCOPE_CATLOG =rs.getString("SCOPE_CATLOG"); //catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)
//String SCOPE_SCHEMA =rs.getString("SCOPE_SCHEMA"); //schema of table that is the scope of a reference attribute (null if the DATA_TYPE isn't REF)
//String SCOPE_TABLE =rs.getString("SCOPE_TABLE"); //table name that this the scope of a reference attribure (null if the DATA_TYPE isn't REF)
String SOURCE_DATA_TYPE =rs.getString("SOURCE_DATA_TYPE"); //source type of a distinct type or user-generated Ref type, SQL type from java.sql.Types
String IS_AUTOINCREMENT =rs.getString("IS_AUTOINCREMENT"); //Indicates whether this column is auto incremented
private Schema from(schemacrawler.schema.Schema schema){ Column column =new Column();
Schema result =new Schema(); column.setName(COLUMN_NAME);
result.setName(schema.getName()==null?schema.getCatalogName():schema.getName()); column.setRemarks(REMARKS);
return result; column.setSqlType(SqlTypeUtil.getSqlTypeName(DATA_TYPE));
column.setJavaType(SqlTypeUtil.getJavaType(DATA_TYPE));
return column;
} }
private Table from(schemacrawler.schema.Table table){ public List<TableSummary> getTableSummary(DataSource dataSource, String catalogName, String schemaName, boolean isCount) throws MetaDataAccessException {
Table result =new Table(); List<Table> tables =this.getTables(dataSource,catalogName,schemaName);
result.setName(table.getName()); if(tables==null || tables.isEmpty()){
result.setRemarks(table.getRemarks()); return Collections.emptyList();
// 处理列
for(schemacrawler.schema.Column column : table.getColumns()) {
result.getColumns().add(from(column));
}
// 处理外键
Collection<schemacrawler.schema.ForeignKey> foreignKeys =table.getForeignKeys();
for(schemacrawler.schema.ForeignKey foreignKey : foreignKeys){
result.getForeignKeys().add(from(foreignKey));
} }
// 处理自引用 List<TableSummary> result = new ArrayList<>();
for(ForeignKey foreignKey : result.getForeignKeys()){ for (Table table : tables) {
if(foreignKey.getForeignKeyTableName().equalsIgnoreCase(foreignKey.getPrimaryKeyTableName())){ TableSummary tableSummary =new TableSummary();
result.setSelfReferenceForeignKeyColumnName(foreignKey.getForeignKeyColumnName()); tableSummary.setName(table.getName());
result.setSelfReferencePrimaryKeyColumnName(foreignKey.getPrimaryKeyColumnName()); tableSummary.setRemarks(table.getRemarks());
if(isCount){
try(
Connection connection =dataSource.getConnection();
PreparedStatement ps =connection.prepareStatement("select count(1) from " + table.getName());
ResultSet rs =ps.executeQuery();
){
rs.next();
tableSummary.setCount(rs.getLong(1));
}catch (SQLException e){
throw new MetaDataAccessException(e);
}
} }
} result.add(tableSummary);
// 处理索引
Collection<schemacrawler.schema.Index> indexes =table.getIndexes();
for(schemacrawler.schema.Index index : indexes){
result.getIndexes().add(from(index));
} }
return result; return result;
} }
public boolean isSelfReference(schemacrawler.schema.Table table) {
Collection<schemacrawler.schema.Table> parentTables =table.getRelatedTables(TableRelationshipType.parent);
if(parentTables!=null && !parentTables.isEmpty()) {
for(schemacrawler.schema.Table parentTable : parentTables) {
if(parentTable.equals(table)) {
return true;
}
}
}
return false;
}
private Table from(DatabaseMetaData databaseMetaData,String tableName,String tableRemarks){
// Table result =new Table();
// result.setName(tableName);
// result.setRemarks(tableRemarks);
// // 处理列
// for(schemacrawler.schema.Column column : table.getColumns()) {
// result.getColumns().add(from(column));
// }
// // 处理外键
// Collection<schemacrawler.schema.ForeignKey> foreignKeys =table.getForeignKeys();
// for(schemacrawler.schema.ForeignKey foreignKey : foreignKeys){
// result.getForeignKeys().add(from(foreignKey));
// }
// // 处理自引用
// for(ForeignKey foreignKey : result.getForeignKeys()){
// if(foreignKey.getForeignKeyTableName().equalsIgnoreCase(foreignKey.getPrimaryKeyTableName())){
// result.setSelfReferenceForeignKeyColumnName(foreignKey.getForeignKeyColumnName());
// result.setSelfReferencePrimaryKeyColumnName(foreignKey.getPrimaryKeyColumnName());
// }
// }
// // 处理索引
// Collection<schemacrawler.schema.Index> indexes =table.getIndexes();
// for(schemacrawler.schema.Index index : indexes){
// result.getIndexes().add(from(index));
// }
// return result;
return null;
}
private ForeignKey from(schemacrawler.schema.ForeignKey foreignKey){ private ForeignKey from(schemacrawler.schema.ForeignKey foreignKey){
ForeignKey result =new ForeignKey(); ForeignKey result =new ForeignKey();
result.setForeignKeyTableName(foreignKey.getForeignKeyTable().getName()); result.setForeignKeyTableName(foreignKey.getForeignKeyTable().getName());

15
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcMetaDataLoaderWebController.java

@ -1,5 +1,6 @@
package io.sc.platform.jdbc.controller; package io.sc.platform.jdbc.controller;
import io.sc.platform.jdbc.meta.support.Catalog;
import io.sc.platform.jdbc.meta.support.Schema; import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table; import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.service.JdbcMetaDataLoaderService; import io.sc.platform.jdbc.service.JdbcMetaDataLoaderService;
@ -16,13 +17,19 @@ import java.util.List;
public class JdbcMetaDataLoaderWebController { public class JdbcMetaDataLoaderWebController {
@Autowired private JdbcMetaDataLoaderService jdbcMetaDataLoaderService; @Autowired private JdbcMetaDataLoaderService jdbcMetaDataLoaderService;
@GetMapping("getCatalogs")
public List<Catalog> getCatalogs(@RequestParam(name="datasource",required = false)String datasource) throws Exception {
return jdbcMetaDataLoaderService.getCatalogs(datasource);
}
@GetMapping("getSchemas") @GetMapping("getSchemas")
public List<Schema> getSchemaNames(@RequestParam(name="datasource",required = false)String datasource) throws Exception { public List<Schema> getSchemaNames(@RequestParam(name="datasource",required = false)String datasource,@RequestParam(name="catalog",required = false)String catalog) throws Exception {
return jdbcMetaDataLoaderService.getSchemas(datasource); return jdbcMetaDataLoaderService.getSchemas(datasource,catalog);
} }
@GetMapping("getTables") @GetMapping("getTables")
public List<Table> getTables(@RequestParam(name="datasource",required = false)String datasource, @RequestParam(name="schema")String schema) throws Exception { public List<Table> getTables(@RequestParam(name="datasource",required = false)String datasource, @RequestParam(name="catalog",required = false)String catalog,@RequestParam(name="schema")String schema) throws Exception {
return jdbcMetaDataLoaderService.getTables(datasource,schema); //return jdbcMetaDataLoaderService.getTables(datasource,catalog,schema);
return jdbcMetaDataLoaderService.getTables(datasource,"platform",schema);
} }
} }

9
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/support/DataExportConfigure.java

@ -4,6 +4,7 @@ import org.springframework.util.StringUtils;
public class DataExportConfigure { public class DataExportConfigure {
private String datasource; private String datasource;
private String catalog;
private String schema; private String schema;
private ExportTable[] tables; private ExportTable[] tables;
private int fetchSize =1000; private int fetchSize =1000;
@ -28,6 +29,14 @@ public class DataExportConfigure {
this.datasource = datasource; this.datasource = datasource;
} }
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
public String getSchema() { public String getSchema() {
return schema; return schema;
} }

9
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/exporter/support/SchemaExportConfigure.java

@ -2,6 +2,7 @@ package io.sc.platform.jdbc.exporter.support;
public class SchemaExportConfigure { public class SchemaExportConfigure {
private String datasource; private String datasource;
private String catalog;
private String schema; private String schema;
private String[] tables; private String[] tables;
@ -13,6 +14,14 @@ public class SchemaExportConfigure {
this.datasource = datasource; this.datasource = datasource;
} }
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
public String getSchema() { public String getSchema() {
return schema; return schema;
} }

36
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/meta/MetaDataLoader.java

@ -1,9 +1,6 @@
package io.sc.platform.jdbc.meta; package io.sc.platform.jdbc.meta;
import io.sc.platform.jdbc.meta.support.MetaDataAccessException; import io.sc.platform.jdbc.meta.support.*;
import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.meta.support.TableSummary;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.Iterator; import java.util.Iterator;
@ -14,41 +11,60 @@ import java.util.ServiceLoader;
* 数据库 META DATA 加载器接口 * 数据库 META DATA 加载器接口
*/ */
public interface MetaDataLoader { public interface MetaDataLoader {
/**
* 获取数据库 Catalog 对象列表
* @param dataSource 数据源
* @return 数据库 Catalog 对象列表
*/
public List<Catalog> getCatalogs(DataSource dataSource) throws MetaDataAccessException;
/** /**
* 获取数据库 Schema 对象列表 * 获取数据库 Schema 对象列表
* @param dataSource 数据源 * @param dataSource 数据源
* @param catalogName 目录名
* @return 数据库 Schema 对象列表 * @return 数据库 Schema 对象列表
*/ */
public List<Schema> getSchemas(DataSource dataSource) throws MetaDataAccessException; public List<Schema> getSchemas(DataSource dataSource,String catalogName) throws MetaDataAccessException;
/** /**
* 获取某个 Schema 下的表对象摘要列表 * 获取某个 Schema 下的表对象摘要列表
* @param dataSource 数据源 * @param dataSource 数据源
* @param catalogName 目录名
* @param schemaName Schema 名称 * @param schemaName Schema 名称
* @return 某个 Schema 下的表对象摘要列表 * @return 某个 Schema 下的表对象摘要列表
*/ */
public default List<TableSummary> getTableSummary(DataSource dataSource, String schemaName) throws MetaDataAccessException{ public default List<TableSummary> getTableSummary(DataSource dataSource, String catalogName, String schemaName) throws MetaDataAccessException{
return getTableSummary(dataSource,schemaName,false); return getTableSummary(dataSource,catalogName,schemaName,false);
} }
/** /**
* 获取某个 Schema 下的表对象摘要列表 * 获取某个 Schema 下的表对象摘要列表
* @param dataSource 数据源 * @param dataSource 数据源
* @param catalogName 目录名
* @param schemaName Schema 名称 * @param schemaName Schema 名称
* @param isCount 是否进行记录数统计 * @param isCount 是否进行记录数统计
* @return 某个 Schema 下的表对象摘要列表 * @return 某个 Schema 下的表对象摘要列表
*/ */
public List<TableSummary> getTableSummary(DataSource dataSource, String schemaName, boolean isCount) throws MetaDataAccessException; public List<TableSummary> getTableSummary(DataSource dataSource, String catalogName, String schemaName, boolean isCount) throws MetaDataAccessException;
/** /**
* 获取某个 Schema 下的表对象列表 * 获取某个 Schema 下的表对象列表
* @param dataSource 数据源 * @param dataSource 数据源
* @param catalogName 目录名
* @param schemaName Schema 名称 * @param schemaName Schema 名称
* @param tableNames 表名称列表
* @return 某个 Schema 下的表对象列表 * @return 某个 Schema 下的表对象列表
*/ */
public List<Table> getTables(DataSource dataSource, String catalogName, String schemaName) throws MetaDataAccessException;
public List<Table> getTables(DataSource dataSource, String schemaName, String... tableNames) throws MetaDataAccessException; /**
* 获取列对象列表
* @param dataSource 数据源
* @param catalogName 目录名
* @param schemaName Schema 名称
* @param tableName 表名称
* @return 列对象列表
*/
public List<Column> getColumns(DataSource dataSource, String catalogName, String schemaName,String tableName) throws MetaDataAccessException;
public static MetaDataLoader newInstance(){ public static MetaDataLoader newInstance(){
ServiceLoader<MetaDataLoader> serviceLoader =ServiceLoader.load(MetaDataLoader.class); ServiceLoader<MetaDataLoader> serviceLoader =ServiceLoader.load(MetaDataLoader.class);

13
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/meta/support/Catalog.java

@ -0,0 +1,13 @@
package io.sc.platform.jdbc.meta.support;
public class Catalog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

6
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcMetaDataLoaderService.java

@ -1,5 +1,6 @@
package io.sc.platform.jdbc.service; package io.sc.platform.jdbc.service;
import io.sc.platform.jdbc.meta.support.Catalog;
import io.sc.platform.jdbc.meta.support.Schema; import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table; import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.meta.support.TableSummary; import io.sc.platform.jdbc.meta.support.TableSummary;
@ -7,6 +8,7 @@ import io.sc.platform.jdbc.meta.support.TableSummary;
import java.util.List; import java.util.List;
public interface JdbcMetaDataLoaderService { public interface JdbcMetaDataLoaderService {
public List<Schema> getSchemas(String datasourceName) throws Exception; public List<Catalog> getCatalogs(String datasourceName) throws Exception;
public List<Table> getTables(String datasourceName, String schemaName) throws Exception; public List<Schema> getSchemas(String datasourceName,String catalogName) throws Exception;
public List<Table> getTables(String datasourceName,String catalogName, String schemaName) throws Exception;
} }

24
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcMetaDataLoaderServiceImpl.java

@ -1,6 +1,7 @@
package io.sc.platform.jdbc.service.impl; package io.sc.platform.jdbc.service.impl;
import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.MetaDataLoader;
import io.sc.platform.jdbc.meta.support.Catalog;
import io.sc.platform.jdbc.meta.support.Schema; import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table; import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.service.DatasourceService; import io.sc.platform.jdbc.service.DatasourceService;
@ -19,7 +20,7 @@ public class JdbcMetaDataLoaderServiceImpl implements JdbcMetaDataLoaderService
@Autowired MetaDataLoader metaDataLoader; @Autowired MetaDataLoader metaDataLoader;
@Override @Override
public List<Schema> getSchemas(String datasourceName) throws Exception { public List<Catalog> getCatalogs(String datasourceName) throws Exception {
DataSource dataSource =null; DataSource dataSource =null;
if(StringUtils.hasText(datasourceName)) { if(StringUtils.hasText(datasourceName)) {
dataSource =datasourceService.getDatasource(datasourceName); dataSource =datasourceService.getDatasource(datasourceName);
@ -27,16 +28,27 @@ public class JdbcMetaDataLoaderServiceImpl implements JdbcMetaDataLoaderService
dataSource =datasourceService.getDefaultDatasource(); dataSource =datasourceService.getDefaultDatasource();
} }
if(dataSource!=null){ if(dataSource!=null){
return metaDataLoader.getSchemas(dataSource); return metaDataLoader.getCatalogs(dataSource);
} }
return Collections.emptyList(); return Collections.emptyList();
} }
@Override @Override
public List<Table> getTables(String datasourceName, String schemaName) throws Exception { public List<Schema> getSchemas(String datasourceName,String catalogName) throws Exception {
if(!StringUtils.hasText(schemaName)) { DataSource dataSource =null;
return Collections.emptyList(); if(StringUtils.hasText(datasourceName)) {
dataSource =datasourceService.getDatasource(datasourceName);
}else{
dataSource =datasourceService.getDefaultDatasource();
} }
if(dataSource!=null){
return metaDataLoader.getSchemas(dataSource,catalogName);
}
return Collections.emptyList();
}
@Override
public List<Table> getTables(String datasourceName, String catalogName, String schemaName) throws Exception {
DataSource dataSource =null; DataSource dataSource =null;
if(StringUtils.hasText(datasourceName)) { if(StringUtils.hasText(datasourceName)) {
dataSource =datasourceService.getDatasource(datasourceName); dataSource =datasourceService.getDatasource(datasourceName);
@ -44,7 +56,7 @@ public class JdbcMetaDataLoaderServiceImpl implements JdbcMetaDataLoaderService
dataSource =datasourceService.getDefaultDatasource(); dataSource =datasourceService.getDefaultDatasource();
} }
if(dataSource!=null){ if(dataSource!=null){
return metaDataLoader.getTables(dataSource,schemaName); return metaDataLoader.getTables(dataSource,catalogName,schemaName);
} }
return Collections.emptyList(); return Collections.emptyList();
} }

1
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/util/SqlTypeUtil.java

@ -21,7 +21,6 @@ public class SqlTypeUtil {
* @throws SQLException 违例 * @throws SQLException 违例
*/ */
public static String getString(ResultSet rs,String fieldName,int fieldType) throws SQLException { public static String getString(ResultSet rs,String fieldName,int fieldType) throws SQLException {
System.out.println(">>>>>>>>fieldType:" + fieldType);
switch(fieldType) { switch(fieldType) {
case Types.CHAR: case Types.CHAR:
case Types.VARCHAR: case Types.VARCHAR:

2
io.sc.platform.lcdp.frontend/public/flowable/modeler/index.html

@ -120,7 +120,7 @@
<div id="main" class="wrapper full clearfix" ng-view="" ng-cloak ng-style="{height: window.height + 'px'}"></div> <div id="main" class="wrapper full clearfix" ng-view="" ng-cloak ng-style="{height: window.height + 'px'}"></div>
<!-- begin modify by wsp --> <!-- begin modify by wsp -->
<script src="/configure.js"></script> <script src="../../../configure.js"></script>
<!-- begin modify by wsp --> <!-- begin modify by wsp -->
<!--[if lt IE 9]> <!--[if lt IE 9]>

2
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/form/service/FormService.java

@ -1,5 +1,6 @@
package io.sc.platform.lcdp.form.service; package io.sc.platform.lcdp.form.service;
import io.sc.platform.jdbc.meta.support.Catalog;
import io.sc.platform.jdbc.meta.support.Column; import io.sc.platform.jdbc.meta.support.Column;
import io.sc.platform.jdbc.meta.support.Schema; import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.TableSummary; import io.sc.platform.jdbc.meta.support.TableSummary;
@ -13,6 +14,7 @@ import io.sc.platform.system.api.dictionary.DictionaryVo;
import java.util.List; import java.util.List;
public interface FormService extends DaoService<FormEntity, String, FormRepository> { public interface FormService extends DaoService<FormEntity, String, FormRepository> {
public List<Catalog> catalogs() throws Exception;
public List<Schema> schemas() throws Exception; public List<Schema> schemas() throws Exception;
public List<TableSummary> tables(String schema, String[] excludeTableTypes) throws Exception; public List<TableSummary> tables(String schema, String[] excludeTableTypes) throws Exception;
public List<Column> columns(String schema, String table) throws Exception; public List<Column> columns(String schema, String table) throws Exception;

9
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/form/service/impl/FormServiceImpl.java

@ -2,6 +2,7 @@ package io.sc.platform.lcdp.form.service.impl;
import io.sc.platform.jdbc.DatabaseType; import io.sc.platform.jdbc.DatabaseType;
import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.MetaDataLoader;
import io.sc.platform.jdbc.meta.support.Catalog;
import io.sc.platform.jdbc.meta.support.Column; import io.sc.platform.jdbc.meta.support.Column;
import io.sc.platform.jdbc.meta.support.Schema; import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.TableSummary; import io.sc.platform.jdbc.meta.support.TableSummary;
@ -52,9 +53,15 @@ public class FormServiceImpl extends DaoServiceImpl<FormEntity, String, FormRepo
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
@Override
public List<Catalog> catalogs() throws Exception {
return null;
}
@Override @Override
public List<Schema> schemas() throws Exception { public List<Schema> schemas() throws Exception {
return MetaDataLoader.newInstance().getSchemas(dataSource); return null;
// return MetaDataLoader.newInstance().getSchemas(dataSource);
} }
@Override @Override

8
io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/application-properties.json

@ -1,4 +1,12 @@
[ [
{
"module" : "io.sc.platform.mvc",
"order": 2000,
"description": "spring.mvc configuration",
"properties": [
"spring.mvc.async.request-timeout = 600000"
]
},
{ {
"module" : "io.sc.platform.mvc", "module" : "io.sc.platform.mvc",
"order": 2100, "order": 2100,

4
io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java

@ -28,7 +28,7 @@ public class ExportTaskThread extends TaskThread {
} }
@Override @Override
boolean isAsyncExeucte() { protected boolean isAsyncExeucte() {
DaoService daoService =(DaoService)getContextObject("daoService"); DaoService daoService =(DaoService)getContextObject("daoService");
QueryParameter queryParameter =(QueryParameter)getContextObject("queryParameter"); QueryParameter queryParameter =(QueryParameter)getContextObject("queryParameter");
try { try {
@ -80,8 +80,6 @@ public class ExportTaskThread extends TaskThread {
StorageService storageService =getSpringBean(StorageService.class); StorageService storageService =getSpringBean(StorageService.class);
storageService.add(outputFilePath, outputFilePath); storageService.add(outputFilePath, outputFilePath);
sleep(10000);
//完成 //完成
complete(); complete();
} catch (Exception e) { } catch (Exception e) {

2
io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java

@ -32,7 +32,7 @@ public abstract class TaskThread extends Thread {
context.put(name,value); context.put(name,value);
} }
abstract boolean isAsyncExeucte(); protected abstract boolean isAsyncExeucte();
public Task execute(){ public Task execute(){

8
io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java

@ -460,7 +460,7 @@ public class DateUtil {
} }
LocalDateTime ld1 =toLocalDateTime(d1); LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2); LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld1,ld2); return ChronoUnit.DAYS.between(ld1,ld2);
} }
/** /**
@ -490,7 +490,7 @@ public class DateUtil {
} }
LocalDateTime ld1 =toLocalDateTime(d1); LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2); LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld1,ld2); return ChronoUnit.HOURS.between(ld1,ld2);
} }
/** /**
@ -520,7 +520,7 @@ public class DateUtil {
} }
LocalDateTime ld1 =toLocalDateTime(d1); LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2); LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld1,ld2); return ChronoUnit.MINUTES.between(ld1,ld2);
} }
/** /**
@ -550,7 +550,7 @@ public class DateUtil {
} }
LocalDateTime ld1 =toLocalDateTime(d1); LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2); LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld1,ld2); return ChronoUnit.SECONDS.between(ld1,ld2);
} }
/** /**

Loading…
Cancel
Save