Browse Source

后端发布: 8.2.11

前端发布: 8.2.65
main
wangshaoping 4 weeks ago
parent
commit
0d12a73bd8
  1. 16
      erm.frontend/package.json
  2. 5
      erm.frontend/src/views/appetite/cross-validate/CrossValidate.vue
  3. 5
      erm.frontend/src/views/appetite/spread/Spread.vue
  4. 5
      erm.frontend/src/views/kpi/Indicator.vue
  5. 2
      gradle.properties
  6. 27
      io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
  7. 16
      io.sc.engine.mv.frontend/package.json
  8. 5
      io.sc.engine.mv.frontend/src/views/result/Result.vue
  9. 5
      io.sc.engine.mv.frontend/src/views/result/ResultDetailDialog.vue
  10. 14
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  11. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionAttachmentMode.java
  12. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionComponentType.java
  13. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionMode.java
  14. 115
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java
  15. 54
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java
  16. 23
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  17. 23
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  18. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  19. 16
      io.sc.engine.rule.frontend/package.json
  20. 11
      io.sc.engine.rule.frontend/src/i18n/messages.json
  21. 11
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  22. 12
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  23. 5
      io.sc.engine.rule.frontend/src/views/authorization/Authorization.vue
  24. 1
      io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue
  25. 251
      io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue
  26. 280
      io.sc.engine.rule.frontend/src/views/resources/designer/Constant.vue
  27. 68
      io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
  28. 11
      io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue
  29. 62
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  30. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue
  31. 179
      io.sc.engine.rule.frontend/src/views/shared/DefaultValue copy 1.vue
  32. 65
      io.sc.engine.rule.frontend/src/views/shared/DefaultValue copy.vue
  33. 75
      io.sc.engine.rule.frontend/src/views/shared/DefaultValue.vue
  34. 4
      io.sc.engine.rule.frontend/src/views/shared/Validator.vue
  35. 83
      io.sc.engine.rule.frontend/src/views/shared/ValueTypeManager.ts
  36. 6
      io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts
  37. 28
      io.sc.engine.rule.sample/src/main/resources/META-INF/platform/plugins/rule-engine-sample-resource.json
  38. 3834
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/application/irs/ESG评级模型.json
  39. 8042
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/application/rirs/测试模型.json
  40. 9
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages.properties
  41. 9
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages_tw_CN.properties
  42. 9
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages_zh_CN.properties
  43. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java
  44. 3
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/ParameterAndValueTypeService.java
  45. 23
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java
  46. 1
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/UserDefinedJavaClassDictionaryEntity.java
  47. 3
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/repository/DictionaryRepository.java
  48. 39
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterInOptionAdditionWebController.java
  49. 10
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterInOptionItemWebController.java
  50. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterWebController.java
  51. 46
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java
  52. 94
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java
  53. 220
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java
  54. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java
  55. 94
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InOptionParameterEntity.java
  56. 18
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/repository/ParameterInOptionAdditionRepository.java
  57. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterInOptionAdditionService.java
  58. 6
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterInOptionItemService.java
  59. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterService.java
  60. 45
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionAdditionServiceImpl.java
  61. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionItemServiceImpl.java
  62. 36
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java
  63. 131
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java
  64. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java
  65. 54
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java
  66. 6095
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(元数据).json
  67. 2146
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(特征库).json
  68. 2147
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json
  69. 9220
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评(指标库).json
  70. 3031
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评(财报元数据).json
  71. 172692
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评.json
  72. 70
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml
  73. 16
      io.sc.engine.st.frontend/package.json
  74. 16
      io.sc.platform.ai.frontend/package.json
  75. 16
      io.sc.platform.core.frontend/package.json
  76. 6
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangePasswordDialog.vue
  77. 172
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue
  78. 62
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewAnnouncementDialog.vue
  79. 130
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewNotificationDialog.vue
  80. 2
      io.sc.platform.core.frontend/src/platform/plugin/manager/I18nMessageManager.ts
  81. 5
      io.sc.platform.core.frontend/src/views/likm/Grid.vue
  82. 5
      io.sc.platform.core.frontend/src/views/standard/AdminDivision.vue
  83. 5
      io.sc.platform.core.frontend/src/views/standard/Counterparty.vue
  84. 5
      io.sc.platform.core.frontend/src/views/standard/Currency.vue
  85. 5
      io.sc.platform.core.frontend/src/views/standard/Industry.vue
  86. 5
      io.sc.platform.core.frontend/src/views/standard/PerformanceStatus.vue
  87. 5
      io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue
  88. 5
      io.sc.platform.core.frontend/src/views/testcase/form/form.vue
  89. 18
      io.sc.platform.core.frontend/template-project/package.json
  90. 5
      io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue
  91. 5
      io.sc.platform.core.frontend/template-project/src/views/standard/AdminDivision.vue
  92. 5
      io.sc.platform.core.frontend/template-project/src/views/standard/Counterparty.vue
  93. 5
      io.sc.platform.core.frontend/template-project/src/views/standard/Currency.vue
  94. 5
      io.sc.platform.core.frontend/template-project/src/views/standard/Industry.vue
  95. 5
      io.sc.platform.core.frontend/template-project/src/views/standard/PerformanceStatus.vue
  96. 5
      io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue
  97. 5
      io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue
  98. 6
      io.sc.platform.core/src/main/java/io/sc/platform/core/service/impl/LicenseManagerServiceImpl.java
  99. 17
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties
  100. 17
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties

16
erm.frontend/package.json

@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

5
erm.frontend/src/views/appetite/cross-validate/CrossValidate.vue

@ -13,10 +13,7 @@
{ name: 'name', label: $t('name'), type: 'w-text' }, { name: 'name', label: $t('name'), type: 'w-text' },
{ name: 'year', label: $t('year'), type: 'w-text' }, { name: 'year', label: $t('year'), type: 'w-text' },
]" ]"
:pagination="{ :sort-by="['-lastModifyDate']"
sortBy: 'lastModifyDate',
descending: true,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'query', 'query',

5
erm.frontend/src/views/appetite/spread/Spread.vue

@ -13,10 +13,7 @@
{ name: 'name', label: $t('name'), type: 'w-text' }, { name: 'name', label: $t('name'), type: 'w-text' },
{ name: 'year', label: $t('year'), type: 'w-text' }, { name: 'year', label: $t('year'), type: 'w-text' },
]" ]"
:pagination="{ :sort-by="['-lastModifyDate']"
sortBy: 'lastModifyDate',
descending: true,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'query', 'query',

5
erm.frontend/src/views/kpi/Indicator.vue

@ -76,10 +76,7 @@
queryOperator: 'equals', queryOperator: 'equals',
}, },
]" ]"
:pagination="{ :sort-by="['-lastModifyDate']"
sortBy: 'lastModifyDate',
descending: true,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[['query', 'moreQuery'], 'reset', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="[['query', 'moreQuery'], 'reset', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[

2
gradle.properties

@ -39,7 +39,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.2.11 platform_version=8.2.11
platform_plugin_version=8.2.10 platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.50 platform_core_frontend_version=8.2.65
########################################################### ###########################################################
# dependencies version # dependencies version

27
io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json

@ -14,5 +14,32 @@
"enable" : true, "enable" : true,
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.parsePersonCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>", "mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.parsePersonCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def static parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}" "body" : "def static parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
},
{
"id": "d9ebb918-7774-47dc-a65b-fa7563082259",
"name": "DateOverMonth",
"signature": "UDF.DateOverMonth(start,end)",
"description": "两个格式为YYYY-MM日期月份差,start 开始日期,end 结束日期",
"enable": true,
"mathXml": "<mrow>\n <mo>UDF.DateOverMonth</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>start</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>end</mi>\n <mspace></mspace>\n <mi>)</mi>\n </mrow>",
"body": "def static DateOverMonth(String start,String end){\n if(start == null || end == null){\n return null;\n }\n java.text.SimpleDateFormat s = new java.text.SimpleDateFormat(\"yyyy/MM/dd\");\n java.text.SimpleDateFormat s1 = new java.text.SimpleDateFormat(\"yyyy/MM/dd\");\n java.util.Date startDate=s.parse(start);\n java.util.Date endDate=s1.parse(end);\n \n java.util.Calendar c_start = java.util.Calendar.getInstance();\n c_start.setTime(startDate);\n java.util.Calendar c_end = java.util.Calendar.getInstance();\n c_end.setTime(endDate);\n \n int result = (c_end.get(1) - c_start.get(1)) * 12 + (c_end.get(2) - c_start.get(2));\n return result;\n}"
},
{
"id": "3d157fea-cb5a-4a21-beee-eee2f246e746",
"name": "GetRepayStatus",
"signature": "UDF.GetRepayStatus(status)",
"description": "将征信还款明细中每个月还款状态转换成对应的逾期情况",
"enable": true,
"mathXml": "<mrow>\n <mo>UDF.GetRepayStatus</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>status</mi>\n <mspace></mspace>\n <mi>)</mi>\n </mrow>",
"body": "def static GetRepayStatus(String status){\n if(status==null||\"\".equals(status)\n ||\"*\".equals(status)\n ||\"N\".equals(status)\n ||\"C\".equals(status)\n ||\"M\".equals(status)\n ||\"A\".equals(status)\n ||\"#\".equals(status)\n ||\"/\".equals(status)){\n return 0;\n }else if(\"G\".equals(status)\n ||\"D\".equals(status)\n ||\"Z\".equals(status)\n ||\"B\".equals(status)){\n return 8;\n }else{\n return Integer.valueOf(status);\n }\n}"
},
{
"id": "683a4a77-329d-4f28-bda4-f9cc139b7dc5",
"name": "AfterMonDate",
"signature": "UDF.AfterMonDate(currDate, m)",
"description": "查询指定日期的后“m”个月的日期(格式为yyyyMM)",
"enable": true,
"mathXml": "<mrow>\n <mo>UDF.AfterMonDate</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>currDate</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>m</mi>\n <mspace></mspace>\n <mi>)</mi>\n </mrow>",
"body": "def static AfterMonDate(String currDateStr, int m){\n\tjava.text.SimpleDateFormat s1 = new java.text.SimpleDateFormat(\"yyyy/MM\");\n String currDateStr1 = currDateStr.replaceAll(\"\\\\.\", \"/\");\n Date currDate=s1.parse(currDateStr1);\n Calendar c = Calendar.getInstance();\n c.setTime(currDate);\n c.set(2, c.get(2) + m);\n java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(\"yyyy-MM-dd\");\n String result = sdf.format(c.getTime());\n return result.replace(\"-\", \"\").substring(0,6);\n}"
} }
] ]

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

@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

5
io.sc.engine.mv.frontend/src/views/result/Result.vue

@ -18,10 +18,7 @@
:checkbox-selection="false" :checkbox-selection="false"
:data-url="Environment.apiContextPath('/api/mv/viewer/result')" :data-url="Environment.apiContextPath('/api/mv/viewer/result')"
:pageable="true" :pageable="true"
:pagination="{ :sort-by="['-validateDate']"
sortBy: 'validateDate',
descending: true,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',

5
io.sc.engine.mv.frontend/src/views/result/ResultDetailDialog.vue

@ -96,10 +96,7 @@
Environment.apiContextPath('/api/mv/viewer/chiSquare/data?modelId=' + detailRef.modelId + '&validateDate=' + detailRef.validateDate) Environment.apiContextPath('/api/mv/viewer/chiSquare/data?modelId=' + detailRef.modelId + '&validateDate=' + detailRef.validateDate)
" "
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['level']"
sortBy: 'level',
descending: false,
}"
:toolbar-actions="['refresh', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'export']"
:columns="[ :columns="[
{ width: 70, name: 'level', label: $t('io.sc.engine.mv.result.chiSquare.level'), align: 'right' }, { width: 70, name: 'level', label: $t('io.sc.engine.mv.result.chiSquare.level'), align: 'right' },

14
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java

@ -1,6 +1,5 @@
package io.sc.engine.rule.core.code.generator.impl; package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.model.Parameter; import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterValidator; import io.sc.engine.rule.core.po.model.ParameterValidator;
@ -27,6 +26,7 @@ public class ParameterGenerator {
String name =parameter.getName(); String name =parameter.getName();
String valueType =parameter.getValueType(); String valueType =parameter.getValueType();
Integer valueTypeVersion =parameter.getValueTypeVersion(); Integer valueTypeVersion =parameter.getValueTypeVersion();
Boolean valueTypeIsList =parameter.getValueTypeIsList();
String defaultValue =parameter.getDefaultValue(); String defaultValue =parameter.getDefaultValue();
Map<String,Object> variables =new HashMap<>(); Map<String,Object> variables =new HashMap<>();
@ -43,9 +43,15 @@ public class ParameterGenerator {
} }
}else{ }else{
if(StringUtils.hasText(defaultValue)){ if(StringUtils.hasText(defaultValue)){
variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); if(valueTypeIsList!=null && valueTypeIsList){
String tpl ="${className} ${fieldName} =${defaultValue}; //${name}"; variables.put("className", IdReplacer.className(valueType, valueTypeVersion));
sb.append(StringUtil.format(tpl,variables)).append("\n"); String tpl = "List<${className}> ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",new TypeReference<List<${className}>>(){}); //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}else {
variables.put("className", IdReplacer.className(valueType, valueTypeVersion));
String tpl = "${className} ${fieldName} =${defaultValue}; //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}
}else{ }else{
variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); variables.put("className",IdReplacer.className(valueType,valueTypeVersion));
String tpl ="${className} ${fieldName}; //${name}"; String tpl ="${className} ${fieldName}; //${name}";

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionAttachmentMode.java

@ -1,10 +0,0 @@
package io.sc.engine.rule.core.enums;
/**
* 定性指标补录附件类型
*/
public enum QualitativeAdditionAttachmentMode {
NONE, // 无
OPTION, // 可选
FORCE; // 必须
}

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionComponentType.java

@ -4,8 +4,9 @@ package io.sc.engine.rule.core.enums;
* 定性指标补录组件类型 * 定性指标补录组件类型
*/ */
public enum QualitativeAdditionComponentType { public enum QualitativeAdditionComponentType {
SINGLE_LINE_TEXT, // 当行文本 INTEGER, //整数
MULTI_LINE_TEXT, // 多行文本 DECIMAL, //小数
NUMBER, // 数值 TEXT, //文本
INTEGER; // 整数 TEXTS, //多行文本
ATTACHMENT; //附件
} }

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionMode.java

@ -1,10 +0,0 @@
package io.sc.engine.rule.core.enums;
/**
* 定性指标补录模式
*/
public enum QualitativeAdditionMode {
NONE, // 无
OPTION, // 可选
FORCE; // 必须
}

115
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java

@ -0,0 +1,115 @@
package io.sc.engine.rule.core.po.model;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
public class ParameterInOptionAddtion {
protected String id;
protected String code;
protected String name;
protected String description;
protected QualitativeAdditionComponentType componentType;
protected String condition;
protected Boolean enable =true;
protected Integer order;
protected Integer rows;
protected String prompt;
protected String attachmentExtendNames;
protected Integer attachmentMaxCount;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getAttachmentExtendNames() {
return attachmentExtendNames;
}
public void setAttachmentExtendNames(String attachmentExtendNames) {
this.attachmentExtendNames = attachmentExtendNames;
}
public Integer getAttachmentMaxCount() {
return attachmentMaxCount;
}
public void setAttachmentMaxCount(Integer attachmentMaxCount) {
this.attachmentMaxCount = attachmentMaxCount;
}
}

54
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java

@ -4,10 +4,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType; import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.engine.rule.core.enums.QualitativeAdditionMode;
import io.sc.engine.rule.core.po.model.Parameter; import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterInOptionAddtion;
import io.sc.engine.rule.core.po.model.ParameterInOptionItem; import io.sc.engine.rule.core.po.model.ParameterInOptionItem;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@ -19,58 +18,27 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("IN_OPTION") @JsonTypeName("IN_OPTION")
@JsonIgnoreProperties(ignoreUnknown=true) @JsonIgnoreProperties(ignoreUnknown=true)
public class InOptionParameter extends Parameter { public class InOptionParameter extends Parameter {
//补录模式
protected QualitativeAdditionMode additionMode;
//补录标题
protected String additionTitle;
//补录描述
protected String additionDescription;
//补录组件类型
protected QualitativeAdditionComponentType additionComponentType;
//补录附件模式
protected QualitativeAdditionAttachmentMode additionAttachmentMode;
//选项列表 //选项列表
protected List<ParameterInOptionItem> options =new ArrayList<ParameterInOptionItem>(); protected List<ParameterInOptionItem> options =new ArrayList<>();
//不录项列表
protected List<ParameterInOptionAddtion> additons =new ArrayList<>();
@Override @Override
public ParameterType getType() { public ParameterType getType() {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public QualitativeAdditionMode getAdditionMode() {
return additionMode;
}
public void setAdditionMode(QualitativeAdditionMode additionMode) {
this.additionMode = additionMode;
}
public String getAdditionTitle() {
return additionTitle;
}
public void setAdditionTitle(String additionTitle) {
this.additionTitle = additionTitle;
}
public String getAdditionDescription() {
return additionDescription;
}
public void setAdditionDescription(String additionDescription) {
this.additionDescription = additionDescription;
}
public QualitativeAdditionComponentType getAdditionComponentType() {
return additionComponentType;
}
public void setAdditionComponentType(QualitativeAdditionComponentType additionComponentType) {
this.additionComponentType = additionComponentType;
}
public QualitativeAdditionAttachmentMode getAdditionAttachmentMode() {
return additionAttachmentMode;
}
public void setAdditionAttachmentMode(QualitativeAdditionAttachmentMode additionAttachmentMode) {
this.additionAttachmentMode = additionAttachmentMode;
}
public List<ParameterInOptionItem> getOptions() { public List<ParameterInOptionItem> getOptions() {
return options; return options;
} }
public void setOptions(List<ParameterInOptionItem> options) { public void setOptions(List<ParameterInOptionItem> options) {
this.options = options; this.options = options;
} }
public List<ParameterInOptionAddtion> getAdditons() {
return additons;
}
public void setAdditons(List<ParameterInOptionAddtion> additons) {
this.additons = additons;
}
} }

23
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties

@ -41,27 +41,14 @@ io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=Intermediate
io.sc.engine.rule.core.enums.ParameterType.OUT=Out io.sc.engine.rule.core.enums.ParameterType.OUT=Out
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=Constant io.sc.engine.rule.core.enums.ParameterType.CONSTANT=Constant
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionMode.NONE=None
io.sc.engine.rule.core.enums.QualitativeAdditionMode.OPTION=Option
io.sc.engine.rule.core.enums.QualitativeAdditionMode.FORCE=Force
#================================================ #================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E # \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E
#================================================ #================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=Single Row Text Input io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=Integer
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=Multi Row Text Input io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.DECIMAL=Decimal
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=Number Input io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXT=Text
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=Integer Input io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXTS=Multi Line Text
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.ATTACHMENT=Attachment
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u9644\u4EF6\u6A21\u5F0F\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.NONE=None
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.OPTION=Option
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.FORCE=Force
#================================================ #================================================
# \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E # \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E

23
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties

@ -41,27 +41,14 @@ io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u9593\u503C
io.sc.engine.rule.core.enums.ParameterType.OUT=\u7D50\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.OUT=\u7D50\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionMode.NONE=\u7121
io.sc.engine.rule.core.enums.QualitativeAdditionMode.OPTION=\u53EF\u9078
io.sc.engine.rule.core.enums.QualitativeAdditionMode.FORCE=\u5FC5\u9078
#================================================ #================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E # \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E
#================================================ #================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=\u55AE\u884C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6578
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=\u591A\u884C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.DECIMAL=\u5C0F\u6578
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=\u6578\u503C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXT=\u6587\u672C
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6578\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXTS=\u591A\u884C\u6587\u672C
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.ATTACHMENT=\u9644\u4EF6
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u9644\u4EF6\u6A21\u5F0F\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.NONE=\u7121
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.OPTION=\u53EF\u9078
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.FORCE=\u5FC5\u9078
#================================================ #================================================
# \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E # \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E

22
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties

@ -41,27 +41,15 @@ io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u95F4\u503C
io.sc.engine.rule.core.enums.ParameterType.OUT=\u7ED3\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.OUT=\u7ED3\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionMode.NONE=\u65E0
io.sc.engine.rule.core.enums.QualitativeAdditionMode.OPTION=\u53EF\u9009
io.sc.engine.rule.core.enums.QualitativeAdditionMode.FORCE=\u5FC5\u9009
#================================================ #================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E # \u9009\u9879\u53C2\u6570\u8865\u5F55\u7EC4\u4EF6\u7C7B\u578B\u679A\u4E3E
#================================================ #================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=\u5355\u884C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6570
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=\u591A\u884C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.DECIMAL=\u5C0F\u6570
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=\u6570\u503C\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXT=\u6587\u672C
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6570\u6587\u672C\u6846 io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.TEXTS=\u591A\u884C\u6587\u672C
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.ATTACHMENT=\u9644\u4EF6
#================================================
# \u9009\u9879\u53C2\u6570\u8865\u5F55\u9644\u4EF6\u6A21\u5F0F\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.NONE=\u65E0
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.OPTION=\u53EF\u9009
io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode.FORCE=\u5FC5\u9009
#================================================ #================================================
# \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E # \u5904\u7406\u5668\u6240\u6709\u8005\u7C7B\u578B\u679A\u4E3E

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

@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

11
io.sc.engine.rule.frontend/src/i18n/messages.json

@ -95,6 +95,17 @@
"re.option.grid.entity.value": "Value", "re.option.grid.entity.value": "Value",
"re.option.grid.entity.title": "Title", "re.option.grid.entity.title": "Title",
"re.addition.grid.title": "Addition Items",
"re.addition.grid.entity.code": "Code",
"re.addition.grid.entity.name": "Name",
"re.addition.grid.entity.description": "Description",
"re.addition.grid.entity.componentType": "Component Type",
"re.addition.grid.entity.condition": "Condition",
"re.addition.grid.entity.rows": "rows for textarea",
"re.addition.grid.entity.prompt": "Prompts",
"re.addition.grid.entity.attachmentExtendNames": "Extend Names of Attachment to upload",
"re.addition.grid.entity.attachmentMaxCount": "Max Count of Attachment to upload",
"re.processor.dialog.decisionTree.title": "Decision Tree Designer", "re.processor.dialog.decisionTree.title": "Decision Tree Designer",
"re.processor.dialog.executionFlow.title": "Execution Flow Designer", "re.processor.dialog.executionFlow.title": "Execution Flow Designer",

11
io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json

@ -95,6 +95,17 @@
"re.option.grid.entity.value": "計算值", "re.option.grid.entity.value": "計算值",
"re.option.grid.entity.title": "顯示文本", "re.option.grid.entity.title": "顯示文本",
"re.addition.grid.title": "補錄項",
"re.addition.grid.entity.code": "代碼",
"re.addition.grid.entity.name": "名稱",
"re.addition.grid.entity.description": "描述",
"re.addition.grid.entity.componentType": "組件類型",
"re.addition.grid.entity.condition": "觸發條件",
"re.addition.grid.entity.rows": "文本框行數",
"re.addition.grid.entity.prompt": "提示詞",
"re.addition.grid.entity.attachmentExtendNames": "允許上傳附件的文件擴展名",
"re.addition.grid.entity.attachmentMaxCount": "允許上傳附件的最大個數",
"re.processor.dialog.decisionTree.title": "決策樹設計器", "re.processor.dialog.decisionTree.title": "決策樹設計器",
"re.processor.dialog.executionFlow.title": "執行流設計器", "re.processor.dialog.executionFlow.title": "執行流設計器",

12
io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json

@ -80,6 +80,7 @@
"re.parameter.dialog.moveParameter.title": "选择参数移动的目标位置", "re.parameter.dialog.moveParameter.title": "选择参数移动的目标位置",
"re.parameter.options.entity.additon.grid.title": "补录项",
"re.parameter.options.entity.additionMode": "补录模式", "re.parameter.options.entity.additionMode": "补录模式",
"re.parameter.options.entity.additionTitle": "补录标题", "re.parameter.options.entity.additionTitle": "补录标题",
"re.parameter.options.entity.additionDescription": "补录描述", "re.parameter.options.entity.additionDescription": "补录描述",
@ -95,6 +96,17 @@
"re.option.grid.entity.value": "计算值", "re.option.grid.entity.value": "计算值",
"re.option.grid.entity.title": "显示文本", "re.option.grid.entity.title": "显示文本",
"re.addition.grid.title": "补录项",
"re.addition.grid.entity.code": "代码",
"re.addition.grid.entity.name": "名称",
"re.addition.grid.entity.description": "描述",
"re.addition.grid.entity.componentType": "组件类型",
"re.addition.grid.entity.condition": "触发条件",
"re.addition.grid.entity.rows": "文本框行数",
"re.addition.grid.entity.prompt": "提示词",
"re.addition.grid.entity.attachmentExtendNames": "允许上传附件的文件扩展名",
"re.addition.grid.entity.attachmentMaxCount": "允许上传附件的最大个数",
"re.processor.dialog.decisionTree.title": "决策树设计器", "re.processor.dialog.decisionTree.title": "决策树设计器",
"re.processor.dialog.executionFlow.title": "执行流设计器", "re.processor.dialog.executionFlow.title": "执行流设计器",

5
io.sc.engine.rule.frontend/src/views/authorization/Authorization.vue

@ -10,10 +10,7 @@
selection="multiple" selection="multiple"
:checkbox-selection="true" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')" :data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{ :sort-by="['name']"
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3" :query-form-cols-num="3"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' }, { name: 'code', label: $t('code'), type: 'w-text' },

1
io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue

@ -4,6 +4,7 @@
ref="treeGridRef" ref="treeGridRef"
:title="$t('re.lib.grid.title')" :title="$t('re.lib.grid.title')"
dense-body dense-body
dnd-mode="server"
db-click-operation="edit" db-click-operation="edit"
:config-button="true" :config-button="true"
:checkbox-selection="false" :checkbox-selection="false"

251
io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue

@ -0,0 +1,251 @@
<template>
<w-grid
ref="gridRef"
dense-body
class="px-1"
hide-bottom
:config-button="false"
dnd-mode="server"
selection="multiple"
:checkbox-selection="true"
db-click-operation="edit"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/model/parameter/addition/findByParameterId?parameterId=' + parameter.id)"
:data-url="Environment.apiContextPath('/api/re/model/parameter/addition')"
:pageable="false"
:sort-by="['order']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
{
extend: 'add',
enableIf: (arg) => {
return !readOnly;
},
},
{
extend: 'clone',
enableIf: (arg) => {
return !readOnly && arg.selected;
},
},
{
extend: 'edit',
enableIf: (arg) => {
return !readOnly && arg.selected;
},
},
{
extend: 'remove',
enableIf: (arg) => {
return !readOnly && arg.selected;
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{
width: 70,
name: 'enable',
label: $t('status'),
align: 'center',
format: Formater.enableTag(),
},
{
width: 120,
name: 'code',
label: $t('re.addition.grid.entity.code'),
},
{
width: 200,
name: 'name',
label: $t('re.addition.grid.entity.name'),
},
{
width: 200,
name: 'description',
label: $t('re.addition.grid.entity.description'),
},
{
width: 100,
name: 'componentType',
label: $t('re.addition.grid.entity.componentType'),
format: (value: any, row: any) => {
let text = $t('io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.' + value);
if ('TEXTS' === value) {
text += '(' + row.rows + ')';
} else if ('ATTACHMENT' === value) {
text += '(' + row.attachmentMaxCount + ')';
}
return text;
},
},
{
width: 200,
name: 'condition',
label: $t('re.addition.grid.entity.condition'),
},
{
width: 300,
name: 'prompt',
label: $t('re.addition.grid.entity.prompt'),
},
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'parameter', label: 'parameter', type: 'w-text', defaultValue: parameter.id, showIf: false },
{
name: 'code',
label: $t('re.addition.grid.entity.code'),
type: 'w-text',
requiredIf: true,
},
{
name: 'name',
label: $t('re.addition.grid.entity.name'),
type: 'w-text',
requiredIf: true,
},
{
name: 'description',
label: $t('re.addition.grid.entity.description'),
type: 'w-textarea',
rows: 3,
},
{
name: 'condition',
label: $t('re.addition.grid.entity.condition'),
type: 'w-code-mirror',
lang: 'java',
rows: 4,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
},
{
name: 'componentType',
label: $t('re.addition.grid.entity.componentType'),
type: 'w-select',
options: EngineEnums.QualitativeAdditionComponentType.options,
requiredIf: true,
},
{
name: 'rows',
label: $t('re.addition.grid.entity.rows'),
type: 'w-integer',
defaultValue: 3,
showIf: (args: any) => {
return args.form.getFieldValue('componentType') === 'TEXTS';
},
},
{
name: 'prompt',
label: $t('re.addition.grid.entity.prompt'),
type: 'w-textarea',
defaultValue: 3,
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'TEXT' || type === 'TEXTS';
},
},
{
name: 'attachmentExtendNames',
label: $t('re.addition.grid.entity.attachmentExtendNames'),
type: 'w-text',
defaultValue: '*.pdf',
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'ATTACHMENT';
},
},
{
name: 'attachmentMaxCount',
label: $t('re.addition.grid.entity.attachmentMaxCount'),
type: 'w-integer',
defaultValue: 1,
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'ATTACHMENT';
},
},
{ name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'parameter', label: $t('parameter') },
{ name: 'code', label: $t('re.addition.grid.entity.code') },
{ name: 'name', label: $t('re.addition.grid.entity.name') },
{ name: 'description', label: $t('re.addition.grid.entity.description') },
{ name: 'componentType', label: $t('re.addition.grid.entity.component') },
{ name: 'condition', label: $t('re.addition.grid.entity.condition') },
{ name: 'enable', label: $t('isEnable') },
{ name: 'order', label: $t('order') },
{ name: 'rows', label: $t('re.addition.grid.entity.rows') },
{ name: 'prompt', label: $t('re.addition.grid.entity.prompt') },
{ name: 'attachmentExtendNames', label: $t('re.addition.grid.entity.attachmentExtendNames') },
{ name: 'attachmentMaxCount', label: $t('re.addition.grid.entity.attachmentMaxCount') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
></w-grid>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { Environment, Formater, CorporationAuditorEntityManager } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },
dataUrl: { type: String, default: '' },
parameter: { type: Object, default: undefined },
readOnly: { type: Boolean, default: false },
});
const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const gridRef = ref();
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
const refresh = () => {
gridRef.value.refresh();
};
onMounted(() => {
gridRef.value.refresh();
});
defineExpose({
refresh,
});
await EngineEnums.init();
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findByParameterId/' + props.parameter.id));
userDefinedFunctionsManager.load();
</script>

280
io.sc.engine.rule.frontend/src/views/resources/designer/Constant.vue

@ -0,0 +1,280 @@
<template>
<div class="px-2" style="height: 100%">
<w-grid
v-if="isListOrUserDefinedJavaClass"
ref="gridRef"
:title="$t('defaultValue')"
:local-mode="true"
db-click-operation="edit"
:auto-fetch-data="false"
:dense-body="true"
dnd-mode="local"
:pageable="false"
:config-button="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="gridToolbarActionsRef"
:columns="gridColumnsRef"
:rows="gridRowsRef"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: gridEditorFieldsRef,
},
}"
@after-editor-data-submit="afterEditorDataSubmit"
@after-drag-and-drop="afterEditorDataSubmit"
>
</w-grid>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, watch, computed, onMounted } from 'vue';
import { axios, $t, Tools, Environment, Formater, CorporationAuditorEntityManager, Options } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { ParameterAndValueTypeManager } from '@/views/shared/ParameterAndValueTypeManager';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },
dataUrl: { type: String, default: '' },
parameter: { type: Object, default: undefined },
readOnly: { type: Boolean, default: false },
});
const emit = defineEmits<{
(e: 'updated', defaultValue: any): void;
}>();
const gridRef = ref();
const gridToolbarActionsRef = ref<any[]>([]);
const gridColumnsRef = ref<any[]>([]);
const gridRowsRef = ref<any[]>([]);
const gridEditorFieldsRef = ref<any[]>([]);
let parameters = {};
const isListOrUserDefinedJavaClass = computed(() => {
return (
(!ValueTypeManager.isBaseValueType(props.parameter.valueType) && !Tools.isUndefinedOrNull(props.parameter.valueTypeVersion)) ||
props.parameter.valueTypeIsList
);
});
const refresh = async () => {
const valueType = props.parameter.valueType;
const valueTypeVersion = props.parameter.valueTypeVersion;
const valueTypeIsList = props.parameter.valueTypeIsList;
const defaultValue = props.parameter.defaultValue;
if (ValueTypeManager.isBaseValueType(valueType) && valueTypeIsList) {
await refreshBaseValueTypeList(valueType, defaultValue);
} else if (!ValueTypeManager.isBaseValueType(valueType) && !valueTypeIsList) {
await refreshUserDefinedJavaClass(valueType, valueTypeVersion, defaultValue);
} else if (!ValueTypeManager.isBaseValueType(valueType) && valueTypeIsList) {
await refreshUserDefinedJavaClassList(valueType, valueTypeVersion, defaultValue);
}
};
const refreshBaseValueTypeList = async (valueType: string, defaultValue: string) => {
//
const columns: any[] = [];
if (ValueTypeManager.isBoolean(valueType)) {
columns.push({ name: 'value', label: $t('value'), sortable: false, format: Formater.trueFalse() });
} else {
columns.push({ name: 'value', label: $t('value'), sortable: false });
}
//
const rows: any[] = [];
const values = Tools.json2Object(defaultValue);
if (!Tools.isUndefinedOrNull(values)) {
for (const value of values) {
rows.push({ value: value });
}
}
//
const fields: any[] = [];
const field: any = createField(valueType);
field.name = 'value';
field.label = $t('value');
fields.push(field);
gridToolbarActionsRef.value = ['add', 'clone', 'edit', 'remove'];
gridColumnsRef.value = columns;
gridEditorFieldsRef.value = fields;
gridRef.value?.setLocalData(rows);
};
const refreshUserDefinedJavaClass = async (valueType: string, valueTypeVersion: number, defaultValue: string) => {
const manager: ParameterAndValueTypeManager = new ParameterAndValueTypeManager();
await manager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findByDictionaryCodeAndVersion/' + valueType + '/' + valueTypeVersion));
parameters = manager.getParameters();
//
const columns: any[] = [
{ name: 'code', label: $t('code'), sortable: false, showIf: false },
{ name: 'name', label: $t('name'), sortable: false, width: '30%' },
{
name: 'valueType',
label: $t('valueType'),
width: 200,
sortable: false,
format: (value: any, row: any) => {
return $t(value);
},
},
{ name: 'value', label: $t('value'), sortable: false },
];
//
const rows: any[] = [];
const values = Tools.json2Object(defaultValue);
for (const key in parameters) {
rows.push({
code: key,
name: parameters[key].name,
value: Tools.isUndefinedOrNull(values) ? undefined : values[key],
valueType: parameters[key].valueType,
});
}
//
const fields: any[] = [];
fields.push({ name: 'code', label: $t('code'), type: 'w-text', showIf: false });
fields.push({ name: 'name', label: $t('name'), type: 'w-text', showIf: false });
fields.push({ name: 'valueType', label: $t('valueType'), type: 'w-text', showIf: false });
//
const valueTypeMap = {};
for (const key in parameters) {
const type = parameters[key].valueType;
valueTypeMap[type] = type;
}
for (const key in valueTypeMap) {
const field: any = createField(key);
field.name = 'value';
field.label = $t('value');
field.showIf = (args: any) => {
return args.form.getFieldValue('valueType') === key;
};
fields.push(field);
}
gridToolbarActionsRef.value = ['edit'];
gridColumnsRef.value = columns;
gridEditorFieldsRef.value = fields;
gridRef.value?.setLocalData(rows);
};
const refreshUserDefinedJavaClassList = async (valueType: string, valueTypeVersion: number, defaultValue: string) => {
const manager: ParameterAndValueTypeManager = new ParameterAndValueTypeManager();
await manager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findByDictionaryCodeAndVersion/' + valueType + '/' + valueTypeVersion));
parameters = manager.getParameters();
//
const columns: any[] = [];
for (const key in parameters) {
columns.push({
name: key,
label: parameters[key].name,
sortable: false,
});
}
//
const rows: any[] = [];
const values = Tools.json2Object(defaultValue);
if (!Tools.isUndefinedOrNull(values)) {
for (const value of values) {
rows.push(value);
}
}
//
const fields: any[] = [];
for (const key in parameters) {
const field: any = createField(parameters[key].valueType);
field.name = parameters[key].code;
field.label = parameters[key].name;
fields.push(field);
}
gridToolbarActionsRef.value = ['add', 'clone', 'edit', 'remove'];
gridColumnsRef.value = columns;
gridEditorFieldsRef.value = fields;
gridRef.value?.setLocalData(rows);
};
const createField = (valueType: string) => {
if (ValueTypeManager.isBoolean(valueType)) {
return {
type: 'w-select',
options: [
{ label: $t('true'), value: true },
{ label: $t('false'), value: false },
],
};
} else if (ValueTypeManager.isInteger(valueType)) {
return {
type: 'w-integer',
};
} else if (ValueTypeManager.isDecimal(valueType)) {
return {
type: 'w-number',
};
} else if (ValueTypeManager.isDate(valueType)) {
return {
type: 'w-date',
};
} else if (ValueTypeManager.isString(valueType)) {
return {
type: 'w-textarea',
rows: 5,
};
}
};
const afterEditorDataSubmit = (args: any) => {
const rows = args.grid.getRows();
let requestJson: string | null = '';
if (ValueTypeManager.isBaseValueType(props.parameter.valueType) && props.parameter.valueTypeIsList) {
const values: any[] = [];
for (const row of rows) {
values.push(row.value);
}
requestJson = Tools.object2Json(values);
} else if (!ValueTypeManager.isBaseValueType(props.parameter.valueType) && !props.parameter.valueTypeIsList) {
const values = {};
for (const row of rows) {
values[row.code] = row['value'];
}
requestJson = Tools.object2Json(values);
} else if (!ValueTypeManager.isBaseValueType(props.parameter.valueType) && props.parameter.valueTypeIsList) {
const values: any[] = [];
for (const row of rows) {
const value = {};
for (const key in parameters) {
value[key] = row[key];
}
values.push(value);
}
requestJson = Tools.object2Json(values);
}
axios.post(Environment.apiContextPath('/api/re/model/parameter/updateParameterDefaultValue/' + props.parameter.id), { value: requestJson }).then(() => {
emit('updated', requestJson);
});
};
watch(
() => props.parameter,
async () => {
refresh();
},
);
onMounted(() => {
refresh();
});
defineExpose({
refresh,
});
</script>

68
io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue

@ -25,6 +25,7 @@
statusReactive.isShowParameter = true; statusReactive.isShowParameter = true;
statusReactive.isShowTestCase = false; statusReactive.isShowTestCase = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowConstant = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
@ -33,6 +34,7 @@
statusReactive.isShowParameter = true; statusReactive.isShowParameter = true;
statusReactive.isShowTestCase = true; statusReactive.isShowTestCase = true;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowConstant = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
@ -47,6 +49,7 @@
statusReactive.isShowParameter = false; statusReactive.isShowParameter = false;
statusReactive.isShowTestCase = false; statusReactive.isShowTestCase = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowConstant = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
@ -63,6 +66,7 @@
no-caps no-caps
inline-label inline-label
align="left" align="left"
class="px-2"
@update:model-value=" @update:model-value="
(value) => { (value) => {
if (value === 'testcase') { if (value === 'testcase') {
@ -91,30 +95,49 @@
@row-click=" @row-click="
(args) => { (args) => {
currentSelectedParameterRef = args.row; currentSelectedParameterRef = args.row;
if (args.row.type === 'IN') { if (args.row.type === 'CONSTANT') {
statusReactive.isShowConstant = true;
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false;
nextTick(() => {
constantRef?.refresh();
});
} else if (args.row.type === 'IN') {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = true; statusReactive.isShowValidator = true;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
validatorGridRef?.refresh(); nextTick(() => {
validatorGridRef?.refresh();
});
} else if (args.row.type === 'IN_OPTION') { } else if (args.row.type === 'IN_OPTION') {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = true; statusReactive.isShowOption = true;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
optionGridRef?.refresh(); nextTick(() => {
optionGridRef?.refresh();
});
} else if ( } else if (
args.row.type == 'OUT' || args.row.type == 'OUT' ||
args.row.type == 'INTERMEDIATE' || args.row.type == 'INTERMEDIATE' ||
args.row.type == 'RULE_RESULT' || args.row.type == 'RULE_RESULT' ||
args.row.type == 'SINGLE_RULE_RESULT' args.row.type == 'SINGLE_RULE_RESULT'
) { ) {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = true; statusReactive.isShowProcessor = true;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false; statusReactive.isShowTestCaseParameter = false;
processorGridRef?.refresh(); nextTick(() => {
processorGridRef?.refresh();
});
} else { } else {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
@ -124,6 +147,7 @@
" "
@before-request-data=" @before-request-data="
() => { () => {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
@ -140,6 +164,7 @@
@row-click=" @row-click="
(args: any) => { (args: any) => {
currentSelectedTestCaseRef = args.row; currentSelectedTestCaseRef = args.row;
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
@ -149,6 +174,7 @@
" "
@before-request-data=" @before-request-data="
(args: any) => { (args: any) => {
statusReactive.isShowConstant = false;
statusReactive.isShowValidator = false; statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false; statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false; statusReactive.isShowOption = false;
@ -169,13 +195,33 @@
:owner="currentSelectedParameterRef" :owner="currentSelectedParameterRef"
:read-only="readOnlyRef" :read-only="readOnlyRef"
></Validator> ></Validator>
<Constant
v-if="statusReactive.isShowConstant"
ref="constantRef"
:read-only="readOnlyRef"
:parameter="currentSelectedParameterRef"
@updated="constantDefaultValueChanged"
></Constant>
<Processor <Processor
v-if="statusReactive.isShowProcessor" v-if="statusReactive.isShowProcessor"
ref="processorGridRef" ref="processorGridRef"
:read-only="readOnlyRef" :read-only="readOnlyRef"
:parameter="currentSelectedParameterRef" :parameter="currentSelectedParameterRef"
></Processor> ></Processor>
<Option v-if="statusReactive.isShowOption" ref="optionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Option> <div v-if="statusReactive.isShowOption" style="height: 100%; padding-top: 2px">
<q-tabs v-model="statusReactive.optionAndAdditionTab" no-caps inline-label align="left" class="px-2">
<q-tab name="option" icon="bi-card-checklist" :label="$t('re.option.grid.title')" />
<q-tab name="addition" icon="bi-person-vcard" :label="$t('re.addition.grid.title')" />
</q-tabs>
<q-tab-panels v-model="statusReactive.optionAndAdditionTab" animated style="height: calc(100% - 48px)">
<q-tab-panel name="option" style="padding: 0px; height: 100%">
<Option ref="optionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Option>
</q-tab-panel>
<q-tab-panel name="addition" class="px-0 pb-0" style="padding: 0px; height: 100%">
<Addition ref="additionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Addition>
</q-tab-panel>
</q-tab-panels>
</div>
<TestcaseParameterGrid <TestcaseParameterGrid
v-if="statusReactive.isShowTestCaseParameter" v-if="statusReactive.isShowTestCaseParameter"
ref="testCaseParameterGridRef" ref="testCaseParameterGridRef"
@ -189,13 +235,15 @@
</w-dialog> </w-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue'; import { ref, reactive, nextTick } from 'vue';
import { Environment } from 'platform-core'; import { Environment } from 'platform-core';
import Model from './Model.vue'; import Model from './Model.vue';
import Parameter from './Parameter.vue'; import Parameter from './Parameter.vue';
import Constant from './Constant.vue';
import Validator from '@/views/shared/Validator.vue'; import Validator from '@/views/shared/Validator.vue';
import Processor from './Processor.vue'; import Processor from './Processor.vue';
import Option from './Option.vue'; import Option from './Option.vue';
import Addition from './Addition.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue'; import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';
import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue'; import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums'; import { EngineEnums } from '@/views/shared/enums/EngineEnums';
@ -217,22 +265,30 @@ const currentSelectedModelRef = ref({});
const currentSelectedParameterRef = ref({}); const currentSelectedParameterRef = ref({});
const currentSelectedTestCaseRef = ref({}); const currentSelectedTestCaseRef = ref({});
const parameterGridRef = ref(); const parameterGridRef = ref();
const constantRef = ref();
const validatorGridRef = ref(); const validatorGridRef = ref();
const processorGridRef = ref(); const processorGridRef = ref();
const optionGridRef = ref(); const optionGridRef = ref();
const additionGridRef = ref();
const testCaseGridRef = ref(); const testCaseGridRef = ref();
const testCaseParameterGridRef = ref(); const testCaseParameterGridRef = ref();
const statusReactive = reactive({ const statusReactive = reactive({
parameterAndTestcaseTab: 'parameter', parameterAndTestcaseTab: 'parameter',
optionAndAdditionTab: 'option',
isShowParameter: false, isShowParameter: false,
isShowTestCase: false, isShowTestCase: false,
isShowConstant: false,
isShowValidator: false, isShowValidator: false,
isShowProcessor: false, isShowProcessor: false,
isShowOption: false, isShowOption: false,
isShowTestCaseParameter: false, isShowTestCaseParameter: false,
}); });
const constantDefaultValueChanged = (defaultValue: string) => {
parameterGridRef.value.setDefaultValue(defaultValue);
};
const open = (resource: any) => { const open = (resource: any) => {
currentSelectedResourceRef.value = resource; currentSelectedResourceRef.value = resource;
readOnlyRef.value = currentSelectedResourceRef.value.status !== 'SKETCH'; readOnlyRef.value = currentSelectedResourceRef.value.status !== 'SKETCH';

11
io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue

@ -1,7 +1,6 @@
<template> <template>
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.option.grid.title')"
dense-body dense-body
class="px-1" class="px-1"
hide-bottom hide-bottom
@ -49,11 +48,11 @@
'export', 'export',
]" ]"
:columns="[ :columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right', showIf: false }, { width: 60, name: 'order', label: $t('order'), align: 'right', showIf: false },
{ width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue'), sortable: false }, { width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue') },
{ width: 100, name: 'value', label: $t('re.option.grid.entity.value'), sortable: false }, { width: 100, name: 'value', label: $t('re.option.grid.entity.value') },
{ width: 400, name: 'title', label: $t('re.option.grid.entity.title'), sortable: false }, { width: 400, name: 'title', label: $t('re.option.grid.entity.title') },
{ width: '100%', name: 'description', label: $t('description'), sortable: false }, { width: '100%', name: 'description', label: $t('description') },
]" ]"
:editor="{ :editor="{
dialog: { dialog: {

62
io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue

@ -197,60 +197,7 @@
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true }, { name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' }, { name: 'description', label: $t('description'), type: 'w-text' },
...valueTypeManager.getEditorFields(), ...valueTypeManager.getEditorFields(),
{ name: 'order', label: $t('order'), type: 'w-number' }, { name: 'order', label: $t('order'), type: 'w-number', showIf: false },
{
name: 'additionMode',
label: $t('re.parameter.options.entity.additionMode'),
type: 'w-select',
options: EngineEnums.QualitativeAdditionMode.options,
defaultValue: 'NONE',
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type');
},
},
{
name: 'additionTitle',
label: $t('re.parameter.options.entity.additionTitle'),
type: 'w-text',
requiredIf: true,
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type') && args.form.getFieldValue('additionMode') !== 'NONE';
},
},
{
name: 'additionDescription',
label: $t('re.parameter.options.entity.additionDescription'),
type: 'w-textarea',
rows: 3,
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type') && args.form.getFieldValue('additionMode') !== 'NONE';
},
},
{
name: 'additionComponentType',
label: $t('re.parameter.options.entity.additionComponentType'),
type: 'w-select',
requiredIf: true,
options: EngineEnums.QualitativeAdditionComponentType.options,
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type') && args.form.getFieldValue('additionMode') !== 'NONE';
},
},
{
name: 'additionAttachmentMode',
label: $t('re.parameter.options.entity.additionAttachmentMode'),
type: 'w-select',
requiredIf: true,
options: EngineEnums.QualitativeAdditionAttachmentMode.options,
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type') && args.form.getFieldValue('additionMode') !== 'NONE';
},
},
], ],
}, },
}" }"
@ -319,7 +266,7 @@
<script setup lang="ts"> <script setup lang="ts">
import 'tailwindcss/utilities.css'; import 'tailwindcss/utilities.css';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { axios, Environment, DialogManager, NotifyManager, Formater, CorporationAuditorEntityManager } from 'platform-core'; import { axios, Environment, Tools, DialogManager, NotifyManager, Formater, CorporationAuditorEntityManager } from 'platform-core';
import SelectIndicatorDialog from '@/views/shared/SelectIndicatorDialog.vue'; import SelectIndicatorDialog from '@/views/shared/SelectIndicatorDialog.vue';
import MoveParameterDialog from '@/views/shared/MoveParameterDialog.vue'; import MoveParameterDialog from '@/views/shared/MoveParameterDialog.vue';
import TemplateImportAndExportDialog from '@/views/shared/TemplateImportAndExportDialog.vue'; import TemplateImportAndExportDialog from '@/views/shared/TemplateImportAndExportDialog.vue';
@ -356,8 +303,13 @@ const refresh = () => {
gridRef.value.refresh(); gridRef.value.refresh();
}; };
const setDefaultValue = (defaultValue: string) => {
gridRef.value.getSelectedRow().defaultValue = defaultValue;
};
defineExpose({ defineExpose({
refresh, refresh,
setDefaultValue,
}); });
await EngineEnums.init(); await EngineEnums.init();

2
io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue

@ -193,7 +193,7 @@ const processorManagerContext = {
const processorManager = new ProcessorManager(Processor.PARAMETER, processorManagerContext); const processorManager = new ProcessorManager(Processor.PARAMETER, processorManagerContext);
const refresh = () => { const refresh = () => {
gridRef.value.refresh(); gridRef.value?.refresh();
}; };
onMounted(() => { onMounted(() => {

179
io.sc.engine.rule.frontend/src/views/shared/DefaultValue copy 1.vue

@ -0,0 +1,179 @@
<template>
<div>
<template v-if="valueTypeIsList">
<w-grid
v-if="isUserDefinedJavaClass"
ref="gridRef"
:title="attrs.label"
:height="200"
:local-mode="true"
db-click-operation="edit"
:auto-fetch-data="false"
:dense-body="true"
dnd-mode="local"
:pageable="false"
:config-button="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="gridToolbarActions"
:columns="gridColumns"
:rows="gridRows"
>
</w-grid>
</template>
<template v-else>
<w-select v-if="isBoolean" v-model="modelValue" :label="attrs.label + '(' + $t(valueType) + ')'" :options="Options.truefalse()"></w-select>
<w-integer v-if="isInteger" v-model="modelValue" :label="attrs.label + '(' + $t(valueType) + ')'"></w-integer>
<w-number v-if="isDecimal" v-model="modelValue" :label="attrs.label + '(' + $t(valueType) + ')'"></w-number>
<w-text v-if="isString" v-model="modelValue" :label="attrs.label + '(' + $t(valueType) + ')'"></w-text>
<w-date v-if="isDate" v-model="modelValue" :label="attrs.label + '(' + $t(valueType) + ')'"></w-date>
<w-grid
v-if="isUserDefinedJavaClass"
ref="gridRef"
:title="attrs.label"
:height="200"
:local-mode="true"
db-click-operation="edit"
:auto-fetch-data="false"
:dense-body="true"
dnd-mode="local"
:pageable="false"
:config-button="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['edit']"
:columns="gridColumns"
:rows="gridRows"
>
</w-grid>
</template>
</div>
</template>
<script setup lang="ts">
import { ref, useAttrs, computed } from 'vue';
import { $t, Environment, Formater, Options, Tools } from 'platform-core';
import { ParameterAndValueTypeManager } from './ParameterAndValueTypeManager';
const attrs = useAttrs();
const modelValue = defineModel<string | number | boolean>();
const emit = defineEmits(['update:modelValue']);
const VALUE_TYPES = {
'java.lang.Integer': 'java.lang.Integer',
'java.lang.Long': 'java.lang.Long',
'java.math.BigInteger': 'java.math.BigInteger',
'java.lang.Float': 'java.lang.Float',
'java.lang.Double': 'java.lang.Double',
'java.math.BigDecimal': 'java.math.BigDecimal',
'java.lang.String': 'java.lang.String',
'java.util.Date': 'java.util.Date',
'java.util.Calendar': 'java.util.Calendar',
};
const gridRef = ref();
const valueType = ref();
const valueTypeVersion = ref();
const valueTypeIsList = ref();
const valueTypeDefine = ref();
const gridToolbarActions = ref<any[]>([]);
const gridColumns = ref<any[]>([]);
const gridRows = ref<any[]>([]);
const isBoolean = computed(() => {
return valueType.value === 'java.lang.Boolean';
});
const isInteger = computed(() => {
return valueType.value === 'java.lang.Integer' || valueType.value === 'java.lang.Long' || valueType.value === 'java.math.BigInteger';
});
const isDecimal = computed(() => {
return valueType.value === 'java.lang.Float' || valueType.value === 'java.lang.Double' || valueType.value === 'java.math.BigDecimal';
});
const isString = computed(() => {
return valueType.value === 'java.lang.String';
});
const isDate = computed(() => {
return valueType.value === 'java.util.Date' || valueType.value === 'java.util.Calendar';
});
const isUserDefinedJavaClass = computed(() => {
return Tools.isUndefinedOrNull(VALUE_TYPES[valueType.value]);
});
const setValueType = (_valueType: string) => {
valueType.value = _valueType;
refreshGrid(valueType.value, valueTypeVersion.value);
emit('update:modelValue', undefined);
};
const setValueTypeVersion = (_valueTypeVersion: number) => {
valueTypeVersion.value = _valueTypeVersion;
refreshGrid(valueType.value, valueTypeVersion.value);
emit('update:modelValue', undefined);
};
const setValueTypeIsList = (_valueTypeIsList: boolean) => {
valueTypeIsList.value = _valueTypeIsList;
refreshGrid(valueType.value, valueTypeVersion.value);
emit('update:modelValue', undefined);
};
const refreshGrid = async (valueType: string, version: number) => {
if (!Tools.isUndefinedOrNull(VALUE_TYPES[valueType]) || Tools.isUndefinedOrNull(version)) {
return null;
}
const manager: ParameterAndValueTypeManager = new ParameterAndValueTypeManager();
await manager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findByDictionaryCodeAndVersion/' + valueType + '/' + version));
const parameters: any[] = [];
const parameterMap = manager.getParameters();
for (const key in parameterMap) {
const parameter = parameterMap[key];
let founded = false;
for (let i = 0; i < parameters.length; i++) {
if (parameters[i].code === parameter.code) {
founded = true;
break;
}
}
if (!founded) {
parameters.push(parameter);
}
}
if (valueTypeIsList.value) {
const columns: any[] = [];
for (const parameter of parameters) {
columns.push({
name: parameter.code,
label: parameter.name,
});
}
gridToolbarActions.value = ['add', 'clone', 'edit', 'remove'];
gridColumns.value = columns;
gridRef.value?.setLocalData([]);
} else {
const columns: any[] = [
{ name: 'code', label: $t('code'), showIf: false },
{ name: 'name', label: $t('name') },
{ name: 'value', label: $t('value') },
];
const rows: any[] = [];
for (const parameter of parameters) {
rows.push({
code: parameter.code,
name: parameter.name,
});
}
gridToolbarActions.value = ['edit'];
gridColumns.value = columns;
gridRef.value?.setLocalData(rows);
}
};
defineExpose({
setValueType,
setValueTypeVersion,
setValueTypeIsList,
});
</script>

65
io.sc.engine.rule.frontend/src/views/shared/DefaultValue copy.vue

@ -0,0 +1,65 @@
<template>
<q-field
ref="fieldRef"
v-model="modelValue"
:hide-bottom-space="true"
:hide-hint="true"
:outlined="true"
:dense="true"
v-bind="attrs"
style="position: relative"
>
<template #label><w-label :label="attrs.label"></w-label></template>
<template #control>
<template v-if="!valueTypeIsList">
<w-checkbox v-if="valueType === 'java.lang.Boolean'" v-model="modelValue"></w-checkbox>
<w-integer v-if="valueType === 'java.lang.Integer' || valueType === 'java.math.BigInteger'" v-model="modelValue"></w-integer>
<w-number
v-if="valueType === 'java.lang.Float' || valueType === 'java.lang.Double' || valueType === 'java.math.BigDecimal'"
v-model="modelValue"
></w-number>
<w-text v-if="valueType === 'java.lang.String'" v-model="modelValue"></w-text>
<w-date v-if="valueType === 'java.util.Date' || valueType === 'java.util.Calendar'" v-model="modelValue"></w-date>
</template>
<template v-else>
<w-checkbox v-if="valueType === 'java.lang.Boolean'"></w-checkbox>
</template>
</template>
<template #append> </template>
</q-field>
</template>
<script setup lang="ts">
import { ref, useAttrs, onMounted, onUnmounted, watch } from 'vue';
import { Tools } from 'platform-core';
const fieldRef = ref();
const attrs = useAttrs();
const modelValue = defineModel<string>();
const valueType = ref();
const valueTypeIsList = ref();
const valueTypeDefine = ref();
onMounted(() => {});
onUnmounted(() => {});
const setValueType = (_valueType: string) => {
console.log('setValueType:', setValueType);
valueType.value = _valueType;
};
const setValueTypeIsList = (_valueTypeIsList: boolean) => {
console.log('setValueTypeIsList:', valueTypeIsList);
valueTypeIsList.value = _valueTypeIsList;
};
const setValueTypeDefine = (_valueTypeDefine: string) => {
valueTypeDefine.value = _valueTypeDefine;
};
defineExpose({
setValueType,
setValueTypeIsList,
setValueTypeDefine,
});
</script>

75
io.sc.engine.rule.frontend/src/views/shared/DefaultValue.vue

@ -0,0 +1,75 @@
<template>
<div>
<w-select
v-if="isBoolean"
v-model="modelValue"
:label="attrs.label"
:options="[
{ label: $t('true'), value: 'true' },
{ label: $t('false'), value: 'false' },
]"
></w-select>
<w-integer v-else-if="isInteger" v-model="modelValue" :label="attrs.label"></w-integer>
<w-number v-else-if="isDecimal" v-model="modelValue" :label="attrs.label"></w-number>
<w-date v-else-if="isDate" v-model="modelValue" :label="attrs.label"></w-date>
<w-textarea v-else-if="isString" v-model="modelValue" :label="attrs.label" :rows="5"></w-textarea>
<w-code-mirror
v-else
v-model="modelValue"
:label="attrs.label"
lang="json"
:toolbar="false"
:button="{
label: 'xxx',
click: () => {
console.log('>>>>');
},
}"
>
</w-code-mirror>
</div>
</template>
<script setup lang="ts">
import { ref, useAttrs, computed } from 'vue';
import { $t, Tools } from 'platform-core';
import { ValueTypeManager } from './ValueTypeManager';
const attrs = useAttrs();
const modelValue = defineModel<string | number | boolean>();
const emit = defineEmits(['update:modelValue']);
const valueType = ref();
const valueTypeIsList = ref();
const isBoolean = computed(() => {
return ValueTypeManager.isBoolean(valueType.value) && !valueTypeIsList.value;
});
const isInteger = computed(() => {
return ValueTypeManager.isInteger(valueType.value) && !valueTypeIsList.value;
});
const isDecimal = computed(() => {
return ValueTypeManager.isDecimal(valueType.value) && !valueTypeIsList.value;
});
const isDate = computed(() => {
return ValueTypeManager.isDate(valueType.value) && !valueTypeIsList.value;
});
const isString = computed(() => {
return ValueTypeManager.isString(valueType.value) && !valueTypeIsList.value;
});
const changeValueType = (_valueType: string, _valueTypeIsList: boolean) => {
valueType.value = _valueType;
valueTypeIsList.value = _valueTypeIsList;
console.log(_valueType, _valueTypeIsList);
//emit('update:modelValue', undefined);
};
defineExpose({
//setValueType,
changeValueType,
});
</script>

4
io.sc.engine.rule.frontend/src/views/shared/Validator.vue

@ -266,11 +266,11 @@ const ValueTypeAndValidatorTypeMapping = {
}; };
const refresh = () => { const refresh = () => {
gridRef.value.refresh(); gridRef.value?.refresh();
}; };
onMounted(() => { onMounted(() => {
gridRef.value.refresh(); gridRef.value?.refresh();
}); });
defineExpose({ defineExpose({

83
io.sc.engine.rule.frontend/src/views/shared/ValueTypeManager.ts

@ -1,10 +1,54 @@
import { shallowRef } from 'vue';
import { eventBus, $t, axios, Environment, Tools, Formater } from 'platform-core'; import { eventBus, $t, axios, Environment, Tools, Formater } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums'; import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import DefaultValue from '@/views/shared/DefaultValue.vue';
const DefaultValueShallowRef = shallowRef(DefaultValue);
class ValueTypeManager { class ValueTypeManager {
private static FETCH_URL = '/api/re/dictionary/searchDictionaries'; private static FETCH_URL = '/api/re/dictionary/searchDictionaries';
private static BASE_VALUE_TYPES = {
'java.lang.Boolean': 'java.lang.Boolean',
'java.lang.Integer': 'java.lang.Integer',
'java.lang.Long': 'java.lang.Long',
'java.math.BigInteger': 'java.math.BigInteger',
'java.lang.Float': 'java.lang.Float',
'java.lang.Double': 'java.lang.Double',
'java.math.BigDecimal': 'java.math.BigDecimal',
'java.lang.String': 'java.lang.String',
'java.util.Date': 'java.util.Date',
'java.util.Calendar': 'java.util.Calendar',
};
private valueTypeMap = new Map(); private valueTypeMap = new Map();
public static isBaseValueType(type: string) {
return !Tools.isUndefinedOrNull(ValueTypeManager.BASE_VALUE_TYPES[type]);
}
public static isBoolean(type: string) {
return type === 'java.lang.Boolean';
}
public static isInteger(type: string) {
return type === 'java.lang.Integer' || type === 'java.lang.Long' || type === 'java.math.BigInteger';
}
public static isDecimal(type: string) {
return type === 'java.lang.Float' || type === 'java.lang.Double' || type === 'java.math.BigDecimal';
}
public static isDate(type: string) {
return type === 'java.util.Date' || type === 'java.util.Calendar';
}
public static isString(type: string) {
return type === 'java.lang.String';
}
public static isUserDefinedJavaClass(type: string) {
return Tools.isUndefinedOrNull(ValueTypeManager.BASE_VALUE_TYPES[type]);
}
constructor() { constructor() {
eventBus.on('dictionaryChanged', this.dictionaryChanged); eventBus.on('dictionaryChanged', this.dictionaryChanged);
} }
@ -76,7 +120,18 @@ class ValueTypeManager {
sortable: sortable, sortable: sortable,
format: Formater.checkTag(), format: Formater.checkTag(),
}, },
defaultValue: { width: 100, name: 'defaultValue', label: $t('defaultValue'), sortable: sortable }, defaultValue: {
width: 100,
name: 'defaultValue',
label: $t('defaultValue'),
sortable: sortable,
format: (value: any, row: any) => {
if (row.valueType === 'java.lang.Boolean') {
return $t(value);
}
return value;
},
},
}; };
const result: any = []; const result: any = [];
@ -112,8 +167,13 @@ class ValueTypeManager {
}, },
onUpdateValue: (args: any) => { onUpdateValue: (args: any) => {
if (args.data) { if (args.data) {
args.form.setFieldValue('valueType', args.data.code); const valueType = args.data.code;
args.form.setFieldValue('valueTypeVersion', Tools.isNill(args.data.version) ? null : args.data.version); const version = Tools.isNill(args.data.version) ? null : args.data.version;
const valueTypeIsList = args.form.getFieldValue('valueTypeIsList');
args.form.setFieldValue('valueType', valueType);
args.form.setFieldValue('valueTypeVersion', version);
const defaultValueComponent = args.form.getFieldComponent('defaultValue');
defaultValueComponent.changeValueType(valueType, valueTypeIsList);
} }
}, },
selectableIf: (args: any) => { selectableIf: (args: any) => {
@ -219,14 +279,18 @@ class ValueTypeManager {
showIf: (args: any) => { showIf: (args: any) => {
return args.form.getFieldValue('type') !== 'IN_OPTION'; return args.form.getFieldValue('type') !== 'IN_OPTION';
}, },
onUpdateValue: (args: any) => {
const form = args.form;
const valueType = form.getFieldValue('valueType');
const valueTypeIsList = form.getFieldValue('valueTypeIsList');
const defaultValueComponent = args.form.getFieldComponent('defaultValue');
defaultValueComponent.changeValueType(valueType, valueTypeIsList);
},
}, },
{ {
name: 'defaultValue', name: 'defaultValue',
label: $t('defaultValue'), label: $t('defaultValue'),
type: 'w-code-mirror', type: DefaultValueShallowRef,
lang: 'json',
rows: 4,
toolbar: false,
}, },
]; ];
} }
@ -246,6 +310,11 @@ class ValueTypeManager {
public afterEditorOpen(args: any): void { public afterEditorOpen(args: any): void {
const form = args.grid?.getEditorForm(); const form = args.grid?.getEditorForm();
const valueType = form.getFieldValue('valueType');
const valueTypeIsList = form.getFieldValue('valueTypeIsList');
const defaultValueComponent = form.getFieldComponent('defaultValue');
defaultValueComponent.changeValueType(valueType, valueTypeIsList);
if (form && form.getStatus() !== 'add') { if (form && form.getStatus() !== 'add') {
let url = ValueTypeManager.FETCH_URL; let url = ValueTypeManager.FETCH_URL;
url += '?code=' + args.data.valueType; url += '?code=' + args.data.valueType;

6
io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts

@ -16,9 +16,7 @@ class EngineEnums {
'io.sc.engine.rule.core.enums.LibType', 'io.sc.engine.rule.core.enums.LibType',
'io.sc.engine.rule.core.enums.ModelCategory', 'io.sc.engine.rule.core.enums.ModelCategory',
'io.sc.engine.rule.core.enums.ParameterType', 'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.QualitativeAdditionMode',
'io.sc.engine.rule.core.enums.QualitativeAdditionComponentType', 'io.sc.engine.rule.core.enums.QualitativeAdditionComponentType',
'io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode',
'io.sc.engine.rule.core.enums.ProcessorType', 'io.sc.engine.rule.core.enums.ProcessorType',
'io.sc.engine.rule.core.enums.ResourceType', 'io.sc.engine.rule.core.enums.ResourceType',
'io.sc.engine.rule.core.enums.RuntimeInputParameterType', 'io.sc.engine.rule.core.enums.RuntimeInputParameterType',
@ -37,9 +35,7 @@ class EngineEnums {
public static LibType: any; public static LibType: any;
public static ModelCategory: any; public static ModelCategory: any;
public static ParameterType: any; public static ParameterType: any;
public static QualitativeAdditionMode: any;
public static QualitativeAdditionComponentType: any; public static QualitativeAdditionComponentType: any;
public static QualitativeAdditionAttachmentMode: any;
public static ProcessorType: any; public static ProcessorType: any;
public static ResourceType: any; public static ResourceType: any;
public static RuntimeInputParameterType: any; public static RuntimeInputParameterType: any;
@ -67,9 +63,7 @@ class EngineEnums {
EngineEnums.LibType = EngineEnums.createEnum(Enums.LibType); EngineEnums.LibType = EngineEnums.createEnum(Enums.LibType);
EngineEnums.ModelCategory = EngineEnums.createEnum(Enums.ModelCategory); EngineEnums.ModelCategory = EngineEnums.createEnum(Enums.ModelCategory);
EngineEnums.ParameterType = EngineEnums.createEnum(Enums.ParameterType); EngineEnums.ParameterType = EngineEnums.createEnum(Enums.ParameterType);
EngineEnums.QualitativeAdditionMode = EngineEnums.createEnum(Enums.QualitativeAdditionMode);
EngineEnums.QualitativeAdditionComponentType = EngineEnums.createEnum(Enums.QualitativeAdditionComponentType); EngineEnums.QualitativeAdditionComponentType = EngineEnums.createEnum(Enums.QualitativeAdditionComponentType);
EngineEnums.QualitativeAdditionAttachmentMode = EngineEnums.createEnum(Enums.QualitativeAdditionAttachmentMode);
EngineEnums.ProcessorType = EngineEnums.createEnum(Enums.ProcessorType); EngineEnums.ProcessorType = EngineEnums.createEnum(Enums.ProcessorType);
EngineEnums.ResourceType = EngineEnums.createEnum(Enums.ResourceType); EngineEnums.ResourceType = EngineEnums.createEnum(Enums.ResourceType);
EngineEnums.RuntimeInputParameterType = EngineEnums.createEnum(Enums.RuntimeInputParameterType); EngineEnums.RuntimeInputParameterType = EngineEnums.createEnum(Enums.RuntimeInputParameterType);

28
io.sc.engine.rule.sample/src/main/resources/META-INF/platform/plugins/rule-engine-sample-resource.json

@ -28,16 +28,16 @@
"lib" :"classpath:/io/sc/engine/rule/sample/application/irs/上海农商银行-内部评级(非零售)-特征库.json", "lib" :"classpath:/io/sc/engine/rule/sample/application/irs/上海农商银行-内部评级(非零售)-特征库.json",
"file" :"classpath:/io/sc/engine/rule/sample/application/irs/上海农商银行-内部评级(非零售)-模型.json" "file" :"classpath:/io/sc/engine/rule/sample/application/irs/上海农商银行-内部评级(非零售)-模型.json"
}, },
////ESG
{
"order" :400,
"parentId" :"io.sc.engine.rule.sample.application.irs",
"id" :"io.sc.engine.rule.sample.application.irs.esg",
"file" :"classpath:/io/sc/engine/rule/sample/application/irs/ESG评级模型.json"
},
/// ///
{"id":"io.sc.engine.rule.sample.application.rirs","parentId":"io.sc.engine.rule.sample.application","order":200}, {"id":"io.sc.engine.rule.sample.application.rirs","parentId":"io.sc.engine.rule.sample.application","order":200},
////
{
"order" :200,
"parentId" :"io.sc.engine.rule.sample.application.rirs",
"id" :"io.sc.engine.rule.sample.application.rirs.whns",
"file" :"classpath:/io/sc/engine/rule/sample/application/rirs/武汉农商银行-内部评级(零售)-模型.json"
},
//// ////
{ {
"order" :100, "order" :100,
@ -45,6 +45,20 @@
"id" :"io.sc.engine.rule.sample.application.rirs.tianfu", "id" :"io.sc.engine.rule.sample.application.rirs.tianfu",
"file" :"classpath:/io/sc/engine/rule/sample/application/rirs/天府银行-内部评级(零售)-模型.json" "file" :"classpath:/io/sc/engine/rule/sample/application/rirs/天府银行-内部评级(零售)-模型.json"
}, },
////
{
"order": 200,
"parentId": "io.sc.engine.rule.sample.application.rirs",
"id": "io.sc.engine.rule.sample.application.rirs.whns",
"file": "classpath:/io/sc/engine/rule/sample/application/rirs/武汉农商银行-内部评级(零售)-模型.json"
},
////
{
"order" :300,
"parentId" :"io.sc.engine.rule.sample.application.rirs",
"id" :"io.sc.engine.rule.sample.application.rirs.test",
"file" :"classpath:/io/sc/engine/rule/sample/application/rirs/测试模型.json"
},
/// ///
{"id":"io.sc.engine.rule.sample.application.warning","parentId":"io.sc.engine.rule.sample.application","order":300}, {"id":"io.sc.engine.rule.sample.application.warning","parentId":"io.sc.engine.rule.sample.application","order":300},

3834
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/application/irs/ESG评级模型.json

File diff suppressed because it is too large

8042
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/application/rirs/测试模型.json

File diff suppressed because one or more lines are too long

9
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages.properties

@ -19,6 +19,10 @@ io.sc.engine.rule.sample.application.irs.whns.description=\u5305\u62EC: \u91D1\u
io.sc.engine.rule.sample.application.irs.shns=SHNS\u94F6\u884C\u5185\u8BC4(\u975E\u96F6\u552E) io.sc.engine.rule.sample.application.irs.shns=SHNS\u94F6\u884C\u5185\u8BC4(\u975E\u96F6\u552E)
io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8BC4\u5206\u5361,\u7070\u5EA6\u8BC4\u5206\u5361 io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8BC4\u5206\u5361,\u7070\u5EA6\u8BC4\u5206\u5361
# \u975E\u96F6\u552E\u5185\u8BC4 - ESG
io.sc.engine.rule.sample.application.irs.esg=ESG \u8BC4\u7EA7
io.sc.engine.rule.sample.application.irs.esg.description=ESG \u8BC4\u7EA7
#============================================================================= #=============================================================================
# \u96F6\u552E\u5185\u8BC4 # \u96F6\u552E\u5185\u8BC4
#============================================================================= #=============================================================================
@ -29,9 +33,14 @@ io.sc.engine.rule.sample.application.rirs.description=
io.sc.engine.rule.sample.application.rirs.whns=WHNS\u94F6\u884C\u5185\u8BC4(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.whns=WHNS\u94F6\u884C\u5185\u8BC4(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8BC4\u5206\u5361,\u5206\u6C60 io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8BC4\u5206\u5361,\u5206\u6C60
# \u96F6\u552E\u5185\u8BC4 - \u5929\u5E9C\u94F6\u884C
io.sc.engine.rule.sample.application.rirs.tianfu=TIANFU\u94F6\u884C\u5185\u8BC4(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.tianfu=TIANFU\u94F6\u884C\u5185\u8BC4(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98CE\u9669\u5B9A\u4EF7\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u4EF7\u6A21\u578B;\u9650\u989D\u6A21\u578B;\u8D44\u4EA7\u7EC4\u5408) io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98CE\u9669\u5B9A\u4EF7\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u4EF7\u6A21\u578B;\u9650\u989D\u6A21\u578B;\u8D44\u4EA7\u7EC4\u5408)
# \u96F6\u552E\u5185\u8BC4 - \u6D4B\u8BD5
io.sc.engine.rule.sample.application.rirs.test=\u6D4B\u8BD5(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.test.description=\u6D4B\u8BD5(\u96F6\u552E)
#============================================================================= #=============================================================================
# \u9884\u8B66 # \u9884\u8B66
#============================================================================= #=============================================================================

9
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages_tw_CN.properties

@ -19,6 +19,10 @@ io.sc.engine.rule.sample.application.irs.whns.description=\u5305\u62EC: \u884C\u
io.sc.engine.rule.sample.application.irs.shns=SHNS\u9280\u884C\u5167\u8A55(\u975E\u96F6\u552E) io.sc.engine.rule.sample.application.irs.shns=SHNS\u9280\u884C\u5167\u8A55(\u975E\u96F6\u552E)
io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8A55\u5206\u5361,\u7070\u5EA6\u8A55\u5206\u5361 io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8A55\u5206\u5361,\u7070\u5EA6\u8A55\u5206\u5361
# \u975E\u96F6\u552E\u5185\u8BC4 - ESG
io.sc.engine.rule.sample.application.irs.esg=ESG \u8A55\u7D1A
io.sc.engine.rule.sample.application.irs.esg.description=ESG \u8A55\u7D1A
#============================================================================= #=============================================================================
# \u96F6\u552E\u5185\u8BC4 # \u96F6\u552E\u5185\u8BC4
#============================================================================= #=============================================================================
@ -29,9 +33,14 @@ io.sc.engine.rule.sample.application.rirs.description=
io.sc.engine.rule.sample.application.rirs.whns=WHNS\u9280\u884C\u5167\u8A55(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.whns=WHNS\u9280\u884C\u5167\u8A55(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8A55\u5206\u5361,\u5206\u6C60 io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8A55\u5206\u5361,\u5206\u6C60
# \u96F6\u552E\u5185\u8BC4 - \u5929\u5E9C\u94F6\u884C
io.sc.engine.rule.sample.application.rirs.tianfu=TIANFU\u9280\u884C\u5167\u8A55(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.tianfu=TIANFU\u9280\u884C\u5167\u8A55(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98A8\u96AA\u5B9A\u50F9\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u50F9\u6A21\u578B;\u9650\u984D\u6A21\u578B;\u8CC7\u7522\u7D44\u5408) io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98A8\u96AA\u5B9A\u50F9\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u50F9\u6A21\u578B;\u9650\u984D\u6A21\u578B;\u8CC7\u7522\u7D44\u5408)
# \u96F6\u552E\u5185\u8BC4 - \u6D4B\u8BD5
io.sc.engine.rule.sample.application.rirs.test=\u6D4B\u8BD5(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.test.description=\u6D4B\u8BD5(\u96F6\u552E)
#============================================================================= #=============================================================================
# \u9884\u8B66 # \u9884\u8B66
#============================================================================= #=============================================================================

9
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/i18n/messages_zh_CN.properties

@ -19,6 +19,10 @@ io.sc.engine.rule.sample.application.irs.whns.description=\u5305\u62EC: \u91D1\u
io.sc.engine.rule.sample.application.irs.shns=SHNS\u94F6\u884C\u5185\u8BC4(\u975E\u96F6\u552E) io.sc.engine.rule.sample.application.irs.shns=SHNS\u94F6\u884C\u5185\u8BC4(\u975E\u96F6\u552E)
io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8BC4\u5206\u5361,\u7070\u5EA6\u8BC4\u5206\u5361 io.sc.engine.rule.sample.application.irs.shns.description=\u5305\u62EC: A,B,K\u8BC4\u5206\u5361,\u7070\u5EA6\u8BC4\u5206\u5361
# \u975E\u96F6\u552E\u5185\u8BC4 - ESG
io.sc.engine.rule.sample.application.irs.esg=ESG \u8BC4\u7EA7
io.sc.engine.rule.sample.application.irs.esg.description=ESG \u8BC4\u7EA7
#============================================================================= #=============================================================================
# \u96F6\u552E\u5185\u8BC4 # \u96F6\u552E\u5185\u8BC4
#============================================================================= #=============================================================================
@ -29,9 +33,14 @@ io.sc.engine.rule.sample.application.rirs.description=
io.sc.engine.rule.sample.application.rirs.whns=WHNS\u94F6\u884C\u5185\u8BC4(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.whns=WHNS\u94F6\u884C\u5185\u8BC4(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8BC4\u5206\u5361,\u5206\u6C60 io.sc.engine.rule.sample.application.rirs.whns.description=\u5305\u62EC: A,B,C\u8BC4\u5206\u5361,\u5206\u6C60
# \u96F6\u552E\u5185\u8BC4 - \u5929\u5E9C\u94F6\u884C
io.sc.engine.rule.sample.application.rirs.tianfu=TAFU\u94F6\u884C\u5185\u8BC4(\u96F6\u552E) io.sc.engine.rule.sample.application.rirs.tianfu=TAFU\u94F6\u884C\u5185\u8BC4(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98CE\u9669\u5B9A\u4EF7\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u4EF7\u6A21\u578B;\u9650\u989D\u6A21\u578B;\u8D44\u4EA7\u7EC4\u5408) io.sc.engine.rule.sample.application.rirs.tianfu.description=\u98CE\u9669\u5B9A\u4EF7\u6A21\u578B(A\u3001B\u3001C\u5361;\u5B9A\u4EF7\u6A21\u578B;\u9650\u989D\u6A21\u578B;\u8D44\u4EA7\u7EC4\u5408)
# \u96F6\u552E\u5185\u8BC4 - \u6D4B\u8BD5
io.sc.engine.rule.sample.application.rirs.test=\u6D4B\u8BD5(\u96F6\u552E)
io.sc.engine.rule.sample.application.rirs.test.description=\u6D4B\u8BD5(\u96F6\u552E)
#============================================================================= #=============================================================================
# \u9884\u8B66 # \u9884\u8B66
#============================================================================= #=============================================================================

11
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java

@ -36,8 +36,13 @@ public class ParameterAndValueTypeWebController {
return service.findByIndicatorId(indicatorId,locale); return service.findByIndicatorId(indicatorId,locale);
} }
@GetMapping("findByDictionaryId/{dictionaryId}") @GetMapping("findByDictionaryId/{id}")
public ParameterAndValueType findByDictionaryId(@PathVariable(name="dictionaryId",required=true)String dictionaryId, Locale locale) throws Exception{ public ParameterAndValueType findByDictionaryId(@PathVariable(name="id",required=true)String id, Locale locale) throws Exception{
return service.findByDictionaryId(dictionaryId,locale); return service.findByDictionaryId(id,locale);
}
@GetMapping("findByDictionaryCodeAndVersion/{code}/{version}")
public ParameterAndValueType findByDictionaryCodeAndVersion(@PathVariable(name="code",required=true)String code, @PathVariable(name="version",required=true)Integer version,Locale locale) throws Exception{
return service.findByDictionaryCodeAndVersion(code,version,locale);
} }
} }

3
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/ParameterAndValueTypeService.java

@ -11,5 +11,6 @@ public interface ParameterAndValueTypeService {
public ParameterAndValueType findByLibId(String libId, Locale locale) throws Exception; public ParameterAndValueType findByLibId(String libId, Locale locale) throws Exception;
public ParameterAndValueType findByIndicatorId(String indicatorId, Locale locale) throws Exception; public ParameterAndValueType findByIndicatorId(String indicatorId, Locale locale) throws Exception;
public ParameterAndValueType findByDictionaryId(String dictionaryId, Locale locale) throws Exception; public ParameterAndValueType findByDictionaryId(String id, Locale locale) throws Exception;
public ParameterAndValueType findByDictionaryCodeAndVersion(String code, Integer version, Locale locale) throws Exception;
} }

23
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java

@ -31,8 +31,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
@Service("io.sc.engine.rule.server.common.service.impl.ParameterAndValueTypeServiceImpl") @Service("io.sc.engine.rule.server.common.service.impl.ParameterAndValueTypeServiceImpl")
public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeService { public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeService {
@ -89,15 +91,30 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
} }
@Override @Override
public ParameterAndValueType findByDictionaryId(String dictionaryId, Locale locale) throws Exception { public ParameterAndValueType findByDictionaryId(String id, Locale locale) throws Exception {
if(!StringUtils.hasText(dictionaryId)){ return null; } if(!StringUtils.hasText(id)){ return null; }
UserDefinedJavaClassDictionaryEntity dictionaryEntity =dictionaryService.getRepository().findUserDefinedJavaClassDictionaryEntityById(dictionaryId); UserDefinedJavaClassDictionaryEntity dictionaryEntity =dictionaryService.getRepository().findUserDefinedJavaClassDictionaryEntityById(id);
if(dictionaryEntity==null){ return null; } if(dictionaryEntity==null){ return null; }
ParameterAndValueType parameterAndValueType =new ParameterAndValueType(); ParameterAndValueType parameterAndValueType =new ParameterAndValueType();
buildByUserDefinedJavaClassDictionary(parameterAndValueType,dictionaryEntity,locale); buildByUserDefinedJavaClassDictionary(parameterAndValueType,dictionaryEntity,locale);
return parameterAndValueType; return parameterAndValueType;
} }
@Override
public ParameterAndValueType findByDictionaryCodeAndVersion(String code, Integer version, Locale locale) throws Exception {
if(!StringUtils.hasText(code)){ return null; }
UserDefinedJavaClassDictionaryEntity dictionaryEntity =dictionaryService.getRepository().findUserDefinedJavaClassDictionaryEntityByCodeAndVersion(code,version);
if(dictionaryEntity==null){ return null; }
ParameterAndValueType parameterAndValueType =new ParameterAndValueType();
buildByUserDefinedJavaClassDictionary(parameterAndValueType,dictionaryEntity,locale);
Map<String,Parameter> map =new LinkedHashMap<>();
for(Map.Entry<String,Parameter> entry : parameterAndValueType.getParameters().entrySet()){
map.put(entry.getValue().getCode(),entry.getValue());
}
parameterAndValueType.setParameters(map);
return parameterAndValueType;
}
private void buildByModel(ParameterAndValueType parameterAndValueType,ModelEntity modelEntity, Locale locale) throws Exception{ private void buildByModel(ParameterAndValueType parameterAndValueType,ModelEntity modelEntity, Locale locale) throws Exception{
if(modelEntity==null || !StringUtils.hasText(modelEntity.getId())){ return; } if(modelEntity==null || !StringUtils.hasText(modelEntity.getId())){ return; }

1
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/UserDefinedJavaClassDictionaryEntity.java

@ -27,6 +27,7 @@ public class UserDefinedJavaClassDictionaryEntity extends DictionaryEntity {
//包含的属性 //包含的属性
@OneToMany(mappedBy="dictionary",cascade= {CascadeType.PERSIST},fetch= FetchType.LAZY) @OneToMany(mappedBy="dictionary",cascade= {CascadeType.PERSIST},fetch= FetchType.LAZY)
@OrderBy("order")
protected List<UserDefinedJavaClassFieldEntity> fields =new ArrayList<UserDefinedJavaClassFieldEntity>(); protected List<UserDefinedJavaClassFieldEntity> fields =new ArrayList<UserDefinedJavaClassFieldEntity>();
@Override @Override

3
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/repository/DictionaryRepository.java

@ -39,6 +39,9 @@ public interface DictionaryRepository extends DaoRepository<DictionaryEntity,Str
@Query("select e from io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity e where e.id=:id") @Query("select e from io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity e where e.id=:id")
public UserDefinedJavaClassDictionaryEntity findUserDefinedJavaClassDictionaryEntityById(@Param("id") String id); public UserDefinedJavaClassDictionaryEntity findUserDefinedJavaClassDictionaryEntityById(@Param("id") String id);
@Query("select e from io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity e where e.code=:code and e.version=:version")
public UserDefinedJavaClassDictionaryEntity findUserDefinedJavaClassDictionaryEntityByCodeAndVersion(@Param("code") String code,@Param("version") Integer version);
@Query("select e from io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity e") @Query("select e from io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity e")
public List<UserDefinedJavaClassDictionaryEntity> findAllUserDefinedJavaClassDictionaries(); public List<UserDefinedJavaClassDictionaryEntity> findAllUserDefinedJavaClassDictionaries();

39
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterInOptionAdditionWebController.java

@ -0,0 +1,39 @@
package io.sc.engine.rule.server.model.controller;
import io.sc.engine.rule.server.model.entity.ParameterInOptionAdditionEntity;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.repository.ParameterInOptionAdditionRepository;
import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository;
import io.sc.engine.rule.server.model.service.ParameterInOptionAdditionService;
import io.sc.engine.rule.server.model.service.ParameterInOptionItemService;
import io.sc.engine.rule.server.model.vo.ParameterInOptionAdditionVo;
import io.sc.engine.rule.server.model.vo.ParameterInOptionItemVo;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.orm.util.EntityVoUtil;
import org.springframework.data.domain.Page;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
/**
* 模型参数选项 Controller
*/
@RestController("io.sc.engine.rule.server.model.controller.ParameterInOptionAdditionWebController")
@RequestMapping("/api/re/model/parameter/addition")
public class ParameterInOptionAdditionWebController extends RestCrudController<ParameterInOptionAdditionVo, ParameterInOptionAdditionEntity,String, ParameterInOptionAdditionRepository, ParameterInOptionAdditionService> {
@GetMapping("findByParameterId")
public Page<ParameterInOptionAdditionVo> findByParameterId(@RequestParam(name="parameterId",required = false)String parameterId, QueryParameter queryParameter) throws Exception {
if(!StringUtils.hasText(parameterId)){
return QueryResult.emptyPage();
}
return service.findByParameterId(parameterId,queryParameter);
}
}

10
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterInOptionItemWebController.java

@ -6,11 +6,15 @@ import io.sc.engine.rule.server.model.service.ParameterInOptionItemService;
import io.sc.engine.rule.server.model.vo.ParameterInOptionItemVo; import io.sc.engine.rule.server.model.vo.ParameterInOptionItemVo;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo; import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
import io.sc.platform.mvc.controller.support.RestCrudController; import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.orm.util.EntityVoUtil; import io.sc.platform.orm.util.EntityVoUtil;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.management.Query;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -21,10 +25,10 @@ import java.util.List;
@RequestMapping("/api/re/model/parameter/option") @RequestMapping("/api/re/model/parameter/option")
public class ParameterInOptionItemWebController extends RestCrudController<ParameterInOptionItemVo,ParameterInOptionItemEntity,String,ParameterInOptionItemRepository,ParameterInOptionItemService> { public class ParameterInOptionItemWebController extends RestCrudController<ParameterInOptionItemVo,ParameterInOptionItemEntity,String,ParameterInOptionItemRepository,ParameterInOptionItemService> {
@GetMapping("findByParameterId") @GetMapping("findByParameterId")
public List<ParameterValidatorVo> findByParameterId(@RequestParam(name="parameterId",required = false)String parameterId) throws Exception { public Page<ParameterInOptionItemVo> findByParameterId(@RequestParam(name="parameterId",required = false)String parameterId, QueryParameter queryParameter) throws Exception {
if(!StringUtils.hasText(parameterId)){ if(!StringUtils.hasText(parameterId)){
return Collections.emptyList(); return QueryResult.emptyPage();
} }
return EntityVoUtil.toVo(service.findByParameterId(parameterId)); return service.findByParameterId(parameterId, queryParameter);
} }
} }

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

@ -18,6 +18,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
/** /**
* 模型参数 Controller * 模型参数 Controller
@ -113,4 +114,11 @@ public class ParameterWebController extends RestCrudController<ParameterVo,Param
} }
} }
} }
@PostMapping("updateParameterDefaultValue/{parameterId}")
public void updateParameterDefaultValue(@PathVariable("parameterId")String parameterId,@RequestBody Map<String,String> body) throws Exception{
if(StringUtils.hasText(parameterId)) {
service.updateParameterDefaultValue(parameterId,body.get("value"));
}
}
} }

46
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java

@ -1,28 +1,13 @@
package io.sc.engine.rule.server.model.converter; package io.sc.engine.rule.server.model.converter;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.parameter.*;
import io.sc.engine.rule.server.model.entity.*;
import io.sc.engine.rule.server.model.entity.parameter.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.parameter.ConstantParameter;
import io.sc.engine.rule.core.po.model.parameter.InOptionParameter;
import io.sc.engine.rule.core.po.model.parameter.InParameter;
import io.sc.engine.rule.core.po.model.parameter.InSubOutParameter;
import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter;
import io.sc.engine.rule.core.po.model.parameter.IntermediateParameter;
import io.sc.engine.rule.core.po.model.parameter.OutParameter;
import io.sc.engine.rule.server.model.entity.ParameterEntity;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.parameter.ConstantParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.InOptionParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.InParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.InSubOutParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.IndicatorParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.IntermediateParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.OutParameterEntity;
/** /**
* 模型参数实体转换器 * 模型参数实体转换器
*/ */
@ -49,12 +34,8 @@ public class ParameterEntityConverter {
}else if(entity instanceof InOptionParameterEntity) { }else if(entity instanceof InOptionParameterEntity) {
InOptionParameterEntity _entity =(InOptionParameterEntity)entity; InOptionParameterEntity _entity =(InOptionParameterEntity)entity;
InOptionParameter _po =new InOptionParameter(); InOptionParameter _po =new InOptionParameter();
_po.setAdditionMode(_entity.getAdditionMode());
_po.setAdditionTitle(_entity.getAdditionTitle());
_po.setAdditionDescription(_entity.getAdditionDescription());
_po.setAdditionComponentType(_entity.getAdditionComponentType());
_po.setAdditionAttachmentMode(_entity.getAdditionAttachmentMode());
_po.setOptions(ParameterInOptionItemEntityConverter.toPo(_entity.getOptions())); _po.setOptions(ParameterInOptionItemEntityConverter.toPo(_entity.getOptions()));
_po.setAdditons(ParameterInOptionAdditionEntityConverter.toPo(_entity.getAddtions()));
po =_po; po =_po;
}else if(entity instanceof InSubOutParameterEntity) { }else if(entity instanceof InSubOutParameterEntity) {
po =new InSubOutParameter(); po =new InSubOutParameter();
@ -122,13 +103,6 @@ public class ParameterEntityConverter {
}else if(po instanceof InOptionParameter) { }else if(po instanceof InOptionParameter) {
InOptionParameter _po =(InOptionParameter)po; InOptionParameter _po =(InOptionParameter)po;
InOptionParameterEntity _entity =new InOptionParameterEntity(); InOptionParameterEntity _entity =new InOptionParameterEntity();
_entity.setAdditionMode(_po.getAdditionMode());
_entity.setAdditionTitle(_po.getAdditionTitle());
_entity.setAdditionDescription(_po.getAdditionDescription());
_entity.setAdditionComponentType(_po.getAdditionComponentType());
_entity.setAdditionAttachmentMode(_po.getAdditionAttachmentMode());
List<ParameterInOptionItemEntity> options =ParameterInOptionItemEntityConverter.fromPo(_po.getOptions()); List<ParameterInOptionItemEntity> options =ParameterInOptionItemEntityConverter.fromPo(_po.getOptions());
if(options!=null && options.size()>0) { if(options!=null && options.size()>0) {
for(ParameterInOptionItemEntity option : options) { for(ParameterInOptionItemEntity option : options) {
@ -136,6 +110,14 @@ public class ParameterEntityConverter {
} }
} }
_entity.setOptions(options); _entity.setOptions(options);
List<ParameterInOptionAdditionEntity> additions =ParameterInOptionAdditionEntityConverter.fromPo(_po.getAdditons());
if(additions!=null && additions.size()>0) {
for(ParameterInOptionAdditionEntity addition : additions) {
addition.setParameter(_entity);
}
}
_entity.setAddtions(additions);
entity =_entity; entity =_entity;
}else if(po instanceof InSubOutParameter) { }else if(po instanceof InSubOutParameter) {
entity =new InSubOutParameterEntity(); entity =new InSubOutParameterEntity();

94
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java

@ -0,0 +1,94 @@
package io.sc.engine.rule.server.model.converter;
import io.sc.engine.rule.core.po.model.ParameterInOptionAddtion;
import io.sc.engine.rule.server.model.entity.ParameterInOptionAdditionEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 不录项实体转换器
*/
public class ParameterInOptionAdditionEntityConverter {
/**
* 将实体转换成 PO 对象
* @param entity 实体对象
* @return PO 对象
*/
public static ParameterInOptionAddtion toPo(ParameterInOptionAdditionEntity entity) {
if(entity!=null) {
ParameterInOptionAddtion po =new ParameterInOptionAddtion();
po.setId(entity.getId());
po.setCode(entity.getCode());
po.setName(entity.getName());
po.setDescription(entity.getDescription());
po.setComponentType(entity.getComponentType());
po.setCondition(entity.getCondition());
po.setEnable(entity.getEnable());
po.setOrder(entity.getOrder());
po.setRows(entity.getRows());
po.setPrompt(entity.getPrompt());
po.setAttachmentExtendNames(entity.getAttachmentExtendNames());
po.setAttachmentMaxCount(entity.getAttachmentMaxCount());
return po;
}
return null;
}
/**
* 将实体集合转换成 PO 对象集合
* @param entities 实体集合
* @return PO 对象集合
*/
public static List<ParameterInOptionAddtion> toPo(List<ParameterInOptionAdditionEntity> entities){
if(entities!=null && entities.size()>0) {
List<ParameterInOptionAddtion> pos =new ArrayList<>(entities.size());
for(ParameterInOptionAdditionEntity entity : entities) {
pos.add(toPo(entity));
}
return pos;
}
return null;
}
/**
* PO 对象转换成实体对象
* @param po PO 对象
* @return 实体对象
*/
public static ParameterInOptionAdditionEntity fromPo(ParameterInOptionAddtion po) {
if(po!=null) {
ParameterInOptionAdditionEntity entity =new ParameterInOptionAdditionEntity();
entity.setId(po.getId());
entity.setCode(po.getCode());
entity.setName(po.getName());
entity.setDescription(po.getDescription());
entity.setComponentType(po.getComponentType());
entity.setCondition(po.getCondition());
entity.setEnable(po.getEnable());
entity.setOrder(po.getOrder());
entity.setRows(po.getRows());
entity.setPrompt(po.getPrompt());
entity.setAttachmentExtendNames(po.getAttachmentExtendNames());
entity.setAttachmentMaxCount(po.getAttachmentMaxCount());
return entity;
}
return null;
}
/**
* PO 对象集合转换成实体对象集合
* @param pos PO 对象集合
* @return 实体对象集合
*/
public static List<ParameterInOptionAdditionEntity> fromPo(List<ParameterInOptionAddtion> pos){
if(pos!=null && pos.size()>0) {
List<ParameterInOptionAdditionEntity> entities =new ArrayList<>(pos.size());
for(ParameterInOptionAddtion po : pos) {
entities.add(fromPo(po));
}
return entities;
}
return null;
}
}

220
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java

@ -0,0 +1,220 @@
package io.sc.engine.rule.server.model.entity;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.engine.rule.server.model.vo.ParameterInOptionAdditionVo;
import io.sc.platform.orm.DeepClone;
import io.sc.platform.orm.IdClearable;
import io.sc.platform.orm.converter.NumericBooleanConverter;
import io.sc.platform.orm.entity.CorporationAuditorEntity;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.beans.BeanUtils;
import javax.persistence.*;
import javax.validation.constraints.Size;
/**
* 输入值(选项)参数的补录项实体类
*/
@Entity
@Table(name="RE_MODEL_PARAMETER_ADDITION")
public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<ParameterInOptionAdditionVo> implements DeepClone, IdClearable {
//ID,主键
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Column(name="ID_", length=36)
@Size(max=36)
protected String id;
//所属参数
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="PARAMETER_ID_")
protected ParameterEntity parameter;
//代码
@Column(name="CODE_", length=255)
@Size(max=255)
protected String code;
//名称
@Column(name="NAME_", length=255)
@Size(max=255)
protected String name;
//描述
@Column(name="DESCRIPTION_", length=255)
@Size(max=255)
protected String description;
//组件类型
@Column(name="COMPONENT_TYPE_")
@Enumerated(EnumType.STRING)
protected QualitativeAdditionComponentType componentType;
//触发条件
@Column(name="CONDITION_", length=1024)
@Size(max=1024)
protected String condition;
//是否可用
@Column(name="ENABLE_")
@Convert(converter= NumericBooleanConverter.class)
protected Boolean enable =true;
//排序
@Column(name="ORDER_")
protected Integer order;
//当组件类型是 TEXTS(多行文本框) 时, 指定多行文本框组件的行数
@Column(name="ROWS_")
protected Integer rows;
//当组件类型是 TEXT(单行文本框) 或 TEXTS(多行文本框) 时, 指定文本框组件的提示词
@Column(name="PROMPT_", length=1024)
@Size(max=1024)
protected String prompt;
//当组件类型是 ATTACHMENT(附件) 时, 指定允许上传附件的文件扩展名
@Column(name="ATTACHMENT_EXT_NAMES_")
protected String attachmentExtendNames;
//当组件类型是 ATTACHMENT(附件) 时, 指定最大允许上传附件的个数
@Column(name="ATTACHMENT_MAX_COUNT_")
protected Integer attachmentMaxCount;
@Override
public ParameterInOptionAdditionVo toVo() {
ParameterInOptionAdditionVo vo =new ParameterInOptionAdditionVo();
super.toVo(vo);
vo.setId(this.getId());
vo.setParameter(this.getParameter()==null?null:this.getParameter().getId());
vo.setCode(this.getCode());
vo.setName(this.getName());
vo.setDescription(this.getDescription());
vo.setComponentType(this.getComponentType());
vo.setCondition(this.getCondition());
vo.setEnable(this.getEnable());
vo.setOrder(this.getOrder());
vo.setRows(this.getRows());
vo.setPrompt(this.getPrompt());
vo.setAttachmentExtendNames(this.getAttachmentExtendNames());
vo.setAttachmentMaxCount(this.getAttachmentMaxCount());
return vo;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public ParameterEntity getParameter() {
return parameter;
}
public void setParameter(ParameterEntity parameter) {
this.parameter = parameter;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getAttachmentExtendNames() {
return attachmentExtendNames;
}
public void setAttachmentExtendNames(String attachmentExtendNames) {
this.attachmentExtendNames = attachmentExtendNames;
}
public Integer getAttachmentMaxCount() {
return attachmentMaxCount;
}
public void setAttachmentMaxCount(Integer attachmentMaxCount) {
this.attachmentMaxCount = attachmentMaxCount;
}
public Object deepClone() {
ParameterInOptionAdditionEntity entity =new ParameterInOptionAdditionEntity();
BeanUtils.copyProperties(this, entity);
return entity;
}
@Override
public void clearId() {
this.setId(null);
}
}

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java

@ -11,7 +11,7 @@ import javax.persistence.*;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
/** /**
* 参数选项实体类 * 输入值(选项)参数选项实体类
*/ */
@Entity @Entity
@Table(name="RE_MODEL_PARAMETER_OPTION") @Table(name="RE_MODEL_PARAMETER_OPTION")

94
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InOptionParameterEntity.java

@ -2,15 +2,8 @@ package io.sc.engine.rule.server.model.entity.parameter;
import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode; import io.sc.engine.rule.server.model.entity.*;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.engine.rule.core.enums.QualitativeAdditionMode;
import io.sc.engine.rule.server.model.entity.ParameterEntity;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.vo.parameter.InOptionParameterVo; import io.sc.engine.rule.server.model.vo.parameter.InOptionParameterVo;
import io.sc.platform.util.TernaryUtil;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import javax.persistence.*; import javax.persistence.*;
@ -24,41 +17,21 @@ import java.util.List;
@DiscriminatorValue("IN_OPTION") @DiscriminatorValue("IN_OPTION")
@JsonTypeName("IN_OPTION") @JsonTypeName("IN_OPTION")
public class InOptionParameterEntity extends ParameterEntity { public class InOptionParameterEntity extends ParameterEntity {
//补录模式
@Column(name="IN_OPT_ADD_MODE_", length=20)
@Enumerated(EnumType.STRING)
protected QualitativeAdditionMode additionMode =QualitativeAdditionMode.NONE;
//补录标题
@Column(name="IN_OPT_ADD_TITLE_", length=255)
protected String additionTitle;
//补录描述
@Column(name="IN_OPT_ADD_DESCRIPTION_", length=1024)
protected String additionDescription;
//补录组件类型
@Column(name="IN_OPT_ADD_COMPONENT_TYPE_", length=20)
@Enumerated(EnumType.STRING)
protected QualitativeAdditionComponentType additionComponentType =QualitativeAdditionComponentType.SINGLE_LINE_TEXT;
//补录附件模式
@Column(name="IN_OPT_ADD_ATTACHMENT_TYPE_", length=20)
@Enumerated(EnumType.STRING)
protected QualitativeAdditionAttachmentMode additionAttachmentMode =QualitativeAdditionAttachmentMode.NONE;
//选项列表 //选项列表
@OneToMany(mappedBy="parameter",cascade= {CascadeType.PERSIST}) @OneToMany(mappedBy="parameter",cascade= {CascadeType.PERSIST})
@OrderBy("order") @OrderBy("order")
protected List<ParameterInOptionItemEntity> options =new ArrayList<ParameterInOptionItemEntity>(); protected List<ParameterInOptionItemEntity> options =new ArrayList<ParameterInOptionItemEntity>();
//补录项列表
@OneToMany(mappedBy="parameter",cascade= {CascadeType.PERSIST})
@OrderBy("order")
protected List<ParameterInOptionAdditionEntity> addtions =new ArrayList<>();
@Override @Override
public InOptionParameterVo toVo() { public InOptionParameterVo toVo() {
InOptionParameterVo vo =new InOptionParameterVo(); InOptionParameterVo vo =new InOptionParameterVo();
super.toVo(vo); super.toVo(vo);
vo.setType(this.getType()); vo.setType(this.getType());
vo.setAdditionMode(TernaryUtil.nullValue(this.getAdditionMode(),QualitativeAdditionMode.NONE));
vo.setAdditionTitle(this.getAdditionTitle());
vo.setAdditionDescription(this.getAdditionDescription());
vo.setAdditionComponentType(TernaryUtil.nullValue(this.getAdditionComponentType(),QualitativeAdditionComponentType.SINGLE_LINE_TEXT));
vo.setAdditionAttachmentMode(TernaryUtil.nullValue(this.getAdditionAttachmentMode(),QualitativeAdditionAttachmentMode.NONE));
return vo; return vo;
} }
@ -72,47 +45,23 @@ public class InOptionParameterEntity extends ParameterEntity {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public QualitativeAdditionMode getAdditionMode() {
return additionMode;
}
public void setAdditionMode(QualitativeAdditionMode additionMode) {
this.additionMode = additionMode;
}
public String getAdditionTitle() {
return additionTitle;
}
public void setAdditionTitle(String additionTitle) {
this.additionTitle = additionTitle;
}
public String getAdditionDescription() {
return additionDescription;
}
public void setAdditionDescription(String additionDescription) {
this.additionDescription = additionDescription;
}
public QualitativeAdditionComponentType getAdditionComponentType() {
return additionComponentType;
}
public void setAdditionComponentType(QualitativeAdditionComponentType additionComponentType) {
this.additionComponentType = additionComponentType;
}
public QualitativeAdditionAttachmentMode getAdditionAttachmentMode() {
return additionAttachmentMode;
}
public void setAdditionAttachmentMode(QualitativeAdditionAttachmentMode additionAttachmentMode) {
this.additionAttachmentMode = additionAttachmentMode;
}
public List<ParameterInOptionItemEntity> getOptions() { public List<ParameterInOptionItemEntity> getOptions() {
return options; return options;
} }
public void setOptions(List<ParameterInOptionItemEntity> options) { public void setOptions(List<ParameterInOptionItemEntity> options) {
this.options = options; this.options = options;
} }
public List<ParameterInOptionAdditionEntity> getAddtions() {
return addtions;
}
public void setAddtions(List<ParameterInOptionAdditionEntity> addtions) {
this.addtions = addtions;
}
@Override @Override
public Object deepClone() throws Exception { public Object deepClone() throws Exception {
InOptionParameterEntity entity =new InOptionParameterEntity(); InOptionParameterEntity entity =new InOptionParameterEntity();
BeanUtils.copyProperties(this, entity,"validators","processors","options"); BeanUtils.copyProperties(this, entity,"validators","processors","options","additions");
//validators //validators
List<ParameterValidatorEntity> validators =this.getValidators(); List<ParameterValidatorEntity> validators =this.getValidators();
@ -142,6 +91,16 @@ public class InOptionParameterEntity extends ParameterEntity {
entity.getOptions().add(clone); entity.getOptions().add(clone);
} }
} }
//additions
List<ParameterInOptionAdditionEntity> additions =this.getAddtions();
if(additions!=null && additions.size()>0) {
for(ParameterInOptionAdditionEntity addition : additions) {
ParameterInOptionAdditionEntity clone =(ParameterInOptionAdditionEntity)addition.deepClone();
clone.setParameter(entity);
entity.getAddtions().add(clone);
}
}
return entity; return entity;
} }
@ -155,5 +114,12 @@ public class InOptionParameterEntity extends ParameterEntity {
option.clearId(); option.clearId();
} }
} }
//additions
List<ParameterInOptionAdditionEntity> additions =this.getAddtions();
if(additions!=null && additions.size()>0) {
for(ParameterInOptionAdditionEntity addition : additions) {
addition.clearId();
}
}
} }
} }

18
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/repository/ParameterInOptionAdditionRepository.java

@ -0,0 +1,18 @@
package io.sc.engine.rule.server.model.repository;
import io.sc.engine.rule.server.model.entity.ParameterInOptionAdditionEntity;
import io.sc.platform.orm.repository.DaoRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("io.sc.engine.rule.server.model.repository.ParameterInOptionAdditionRepository")
public interface ParameterInOptionAdditionRepository extends DaoRepository<ParameterInOptionAdditionEntity,String>{
@Query("select max(e.order)+1 from ParameterInOptionAdditionEntity e where e.parameter.id=:parameterId")
public Integer getNextOrder(@Param("parameterId") String parameterId);
@Query("select e from ParameterInOptionAdditionEntity e where e.parameter.id=:parameterId order by e.order")
public List<ParameterInOptionAdditionEntity> findByParameterId(@Param("parameterId") String parameterId);
}

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterInOptionAdditionService.java

@ -0,0 +1,24 @@
package io.sc.engine.rule.server.model.service;
import io.sc.engine.rule.server.model.entity.ParameterInOptionAdditionEntity;
import io.sc.engine.rule.server.model.repository.ParameterInOptionAdditionRepository;
import io.sc.engine.rule.server.model.vo.ParameterInOptionAdditionVo;
import io.sc.platform.orm.service.DaoService;
import io.sc.platform.orm.service.support.QueryParameter;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* 输入参数补录项服务接口
*/
public interface ParameterInOptionAdditionService extends DaoService<ParameterInOptionAdditionEntity, String, ParameterInOptionAdditionRepository>{
/**
* 通过参数ID查找补录项
* @param parameterId 参数ID
* @param queryParameter 查询参数
* @return 补录项列表
* @throws Exception 违例
*/
public Page<ParameterInOptionAdditionVo> findByParameterId(String parameterId, QueryParameter queryParameter) throws Exception;
}

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

@ -2,7 +2,10 @@ package io.sc.engine.rule.server.model.service;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity; import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository; import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository;
import io.sc.engine.rule.server.model.vo.ParameterInOptionItemVo;
import io.sc.platform.orm.service.DaoService; import io.sc.platform.orm.service.DaoService;
import io.sc.platform.orm.service.support.QueryParameter;
import org.springframework.data.domain.Page;
import java.util.List; import java.util.List;
@ -13,8 +16,9 @@ public interface ParameterInOptionItemService extends DaoService<ParameterInOpti
/** /**
* 通过参数ID查找选项 * 通过参数ID查找选项
* @param parameterId 参数ID * @param parameterId 参数ID
* @param queryParameter 查询参数
* @return 选项列表 * @return 选项列表
* @throws Exception 违例 * @throws Exception 违例
*/ */
public List<ParameterInOptionItemEntity> findByParameterId(String parameterId) throws Exception; public Page<ParameterInOptionItemVo> findByParameterId(String parameterId, QueryParameter queryParameter) throws Exception;
} }

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterService.java

@ -105,6 +105,14 @@ public interface ParameterService extends DaoService<ParameterEntity, String, Pa
*/ */
public void moveParameters(String targetModelId,Set<String> parameterIds) throws Exception; public void moveParameters(String targetModelId,Set<String> parameterIds) throws Exception;
/**
* 更新参数默认值
* @param parameterId 参数ID
* @param defaultValue 默认值 JSON 字符串
* @throws Exception 违例
*/
public void updateParameterDefaultValue(String parameterId,String defaultValue) throws Exception;
/** /**
* 导入 PMML * 导入 PMML
* @param modelId 模型ID * @param modelId 模型ID

45
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionAdditionServiceImpl.java

@ -0,0 +1,45 @@
package io.sc.engine.rule.server.model.service.impl;
import io.sc.engine.rule.server.model.entity.ParameterInOptionAdditionEntity;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.repository.ParameterInOptionAdditionRepository;
import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository;
import io.sc.engine.rule.server.model.service.ParameterInOptionAdditionService;
import io.sc.engine.rule.server.model.service.ParameterInOptionItemService;
import io.sc.engine.rule.server.model.vo.ParameterInOptionAdditionVo;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.orm.service.support.criteria.impl.Equals;
import io.sc.platform.orm.util.EntityVoUtil;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service("io.sc.engine.rule.server.model.service.impl.ParameterInOptionAdditionServiceImpl")
public class ParameterInOptionAdditionServiceImpl extends DaoServiceImpl<ParameterInOptionAdditionEntity, String, ParameterInOptionAdditionRepository> implements ParameterInOptionAdditionService {
@Override
public Page<ParameterInOptionAdditionVo> findByParameterId(String parameterId, QueryParameter queryParameter) throws Exception {
Equals equalsCriteria =new Equals();
equalsCriteria.setFieldName("parameter");
equalsCriteria.setValue(parameterId);
queryParameter.addCriteria(equalsCriteria);
return EntityVoUtil.toVo(super.query(queryParameter));
}
@Override
@Transactional
public ParameterInOptionAdditionEntity add(ParameterInOptionAdditionEntity entity) throws Exception {
Integer nextOrder =repository.getNextOrder(entity.getParameter().getId());
if(nextOrder!=null) {
entity.setOrder(nextOrder);
}else {
entity.setOrder(1);
}
return super.add(entity);
}
}

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

@ -3,7 +3,12 @@ package io.sc.engine.rule.server.model.service.impl;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity; import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository; import io.sc.engine.rule.server.model.repository.ParameterInOptionItemRepository;
import io.sc.engine.rule.server.model.service.ParameterInOptionItemService; import io.sc.engine.rule.server.model.service.ParameterInOptionItemService;
import io.sc.engine.rule.server.model.vo.ParameterInOptionItemVo;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.criteria.impl.Equals;
import io.sc.platform.orm.util.EntityVoUtil;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -13,8 +18,13 @@ import java.util.List;
public class ParameterInOptionItemServiceImpl extends DaoServiceImpl<ParameterInOptionItemEntity, String, ParameterInOptionItemRepository> implements ParameterInOptionItemService{ public class ParameterInOptionItemServiceImpl extends DaoServiceImpl<ParameterInOptionItemEntity, String, ParameterInOptionItemRepository> implements ParameterInOptionItemService{
@Override @Override
public List<ParameterInOptionItemEntity> findByParameterId(String parameterId) throws Exception { public Page<ParameterInOptionItemVo> findByParameterId(String parameterId, QueryParameter queryParameter) throws Exception {
return repository.findByParameterId(parameterId); Equals equalsCriteria =new Equals();
equalsCriteria.setFieldName("parameter");
equalsCriteria.setValue(parameterId);
queryParameter.addCriteria(equalsCriteria);
return EntityVoUtil.toVo(super.query(queryParameter));
} }
@Override @Override

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

@ -2,12 +2,10 @@ package io.sc.engine.rule.server.model.service.impl;
import io.sc.engine.rule.core.enums.DictionaryType; import io.sc.engine.rule.core.enums.DictionaryType;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.QualitativeAdditionMode;
import io.sc.engine.rule.core.po.lib.Indicator; import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.util.CodeConvertor; import io.sc.engine.rule.core.util.CodeConvertor;
import io.sc.engine.rule.core.util.ExpressionReplacer; import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil; import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.engine.rule.server.common.service.support.Parameter;
import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity;
import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity;
import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity;
@ -171,16 +169,6 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
Integer nextOrder =repository.getNextOrder(entity.getModel().getId()); Integer nextOrder =repository.getNextOrder(entity.getModel().getId());
entity.setOrder(nextOrder==null?1:nextOrder); entity.setOrder(nextOrder==null?1:nextOrder);
// 对输入选项参数进行处理
if(ParameterType.IN_OPTION.equals(entity.getType())){
InOptionParameterEntity inOptionParameterEntity =(InOptionParameterEntity)entity;
if(QualitativeAdditionMode.NONE.equals(inOptionParameterEntity.getAdditionMode())){
inOptionParameterEntity.setAdditionTitle(null);
inOptionParameterEntity.setAdditionDescription(null);
inOptionParameterEntity.setAdditionComponentType(null);
}
}
ParameterEntity newEntity =super.add(entity); ParameterEntity newEntity =super.add(entity);
//通知其他实体进行相应的更新 //通知其他实体进行相应的更新
@ -259,16 +247,6 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
ParameterEntity oldEntity =findById(primaryKey); ParameterEntity oldEntity =findById(primaryKey);
applicationContext.publishEvent(new ParameterEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity)); applicationContext.publishEvent(new ParameterEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity));
// 对输入选项参数进行处理
if(ParameterType.IN_OPTION.equals(entity.getType())){
InOptionParameterEntity inOptionParameterEntity =(InOptionParameterEntity)entity;
if(QualitativeAdditionMode.NONE.equals(inOptionParameterEntity.getAdditionMode())){
inOptionParameterEntity.setAdditionTitle(null);
inOptionParameterEntity.setAdditionDescription(null);
inOptionParameterEntity.setAdditionComponentType(null);
}
}
//更新参数实体 //更新参数实体
return super.update(primaryKey, entity); return super.update(primaryKey, entity);
} }
@ -579,8 +557,20 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
} }
} }
@Override
@Transactional
public void updateParameterDefaultValue(String parameterId, String defaultValue) throws Exception {
if(!StringUtils.hasText(parameterId)) {
return;
}
ParameterEntity entity = findById(parameterId);
if(entity==null){
return;
}
entity.setDefaultValue(defaultValue);
}
private void recursionListParameterNames(ModelEntity parentModelEntity,ParemterHints hints) throws Exception { private void recursionListParameterNames(ModelEntity parentModelEntity, ParemterHints hints) throws Exception {
if(parentModelEntity!=null) { if(parentModelEntity!=null) {
List<ParameterEntity> parameters =parentModelEntity.getParameters(); List<ParameterEntity> parameters =parentModelEntity.getParameters();
if(parameters!=null && parameters.size()>0) { if(parameters!=null && parameters.size()>0) {

131
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java

@ -0,0 +1,131 @@
package io.sc.engine.rule.server.model.vo;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.platform.orm.api.vo.CorporationAuditorVo;
import javax.persistence.Column;
import javax.validation.constraints.Size;
/**
* 输入值(选项)参数的补录项 Vo
*/
public class ParameterInOptionAdditionVo extends CorporationAuditorVo {
protected String id;
protected String parameter;
protected String code;
protected String name;
protected String description;
protected QualitativeAdditionComponentType componentType;
protected String condition;
protected Boolean enable =true;
protected Integer order;
protected Integer rows;
protected String prompt;
protected String attachmentExtendNames;
protected Integer attachmentMaxCount;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getAttachmentExtendNames() {
return attachmentExtendNames;
}
public void setAttachmentExtendNames(String attachmentExtendNames) {
this.attachmentExtendNames = attachmentExtendNames;
}
public Integer getAttachmentMaxCount() {
return attachmentMaxCount;
}
public void setAttachmentMaxCount(Integer attachmentMaxCount) {
this.attachmentMaxCount = attachmentMaxCount;
}
}

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java

@ -3,7 +3,7 @@ package io.sc.engine.rule.server.model.vo;
import io.sc.platform.orm.api.vo.CorporationAuditorVo; import io.sc.platform.orm.api.vo.CorporationAuditorVo;
/** /**
* 参数选项 Vo * 输入值(选项)参数选项 Vo
*/ */
public class ParameterInOptionItemVo extends CorporationAuditorVo { public class ParameterInOptionItemVo extends CorporationAuditorVo {

54
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java

@ -1,68 +1,26 @@
package io.sc.engine.rule.server.model.vo.parameter; package io.sc.engine.rule.server.model.vo.parameter;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.QualitativeAdditionAttachmentMode;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType; import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.engine.rule.core.enums.QualitativeAdditionMode;
import io.sc.engine.rule.server.model.vo.ParameterVo; import io.sc.engine.rule.server.model.vo.ParameterVo;
/** /**
* 模型参数(输入选项) Vo * 模型参数(输入选项) Vo
*/ */
public class InOptionParameterVo extends ParameterVo { public class InOptionParameterVo extends ParameterVo {
//补录模式 //补录项配置
protected QualitativeAdditionMode additionMode; protected String additionConfigure;
//补录标题
protected String additionTitle;
//补录描述
protected String additionDescription;
//补录组件类型
protected QualitativeAdditionComponentType additionComponentType;
//补录附件模式
protected QualitativeAdditionAttachmentMode additionAttachmentMode;
@Override @Override
public ParameterType getType() { public ParameterType getType() {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public QualitativeAdditionMode getAdditionMode() { public String getAdditionConfigure() {
return additionMode; return additionConfigure;
} }
public void setAdditionMode(QualitativeAdditionMode additionMode) { public void setAdditionConfigure(String additionConfigure) {
this.additionMode = additionMode; this.additionConfigure = additionConfigure;
}
public String getAdditionTitle() {
return additionTitle;
}
public void setAdditionTitle(String additionTitle) {
this.additionTitle = additionTitle;
}
public String getAdditionDescription() {
return additionDescription;
}
public void setAdditionDescription(String additionDescription) {
this.additionDescription = additionDescription;
}
public QualitativeAdditionComponentType getAdditionComponentType() {
return additionComponentType;
}
public void setAdditionComponentType(QualitativeAdditionComponentType additionComponentType) {
this.additionComponentType = additionComponentType;
}
public QualitativeAdditionAttachmentMode getAdditionAttachmentMode() {
return additionAttachmentMode;
}
public void setAdditionAttachmentMode(QualitativeAdditionAttachmentMode additionAttachmentMode) {
this.additionAttachmentMode = additionAttachmentMode;
} }
} }

6095
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(元数据).json

File diff suppressed because it is too large

2146
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(特征库).json

File diff suppressed because one or more lines are too long

2147
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json

File diff suppressed because one or more lines are too long

9220
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评(指标库).json

File diff suppressed because one or more lines are too long

3031
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评(财报元数据).json

File diff suppressed because it is too large

172692
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/武农商非零售内评.json

File diff suppressed because one or more lines are too long

70
io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml

@ -163,16 +163,9 @@
<column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/> <column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/>
<column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/> <column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/>
<column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/> <column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/>
<column name="DEFAULT_VALUE_" type="NVARCHAR(255)" remarks="默认值"/> <column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/> <column name="ORDER_" type="INTEGER" remarks="排序"/>
<!-- 选项参数的其他字段 -->
<column name="IN_OPT_ADD_MODE_" type="NVARCHAR(20)" remarks="输入值(选项)-补录模式"/>
<column name="IN_OPT_ADD_TITLE_" type="NVARCHAR(255)" remarks="输入值(选项)-补录标题"/>
<column name="IN_OPT_ADD_DESCRIPTION_" type="NVARCHAR(1024)" remarks="输入值(选项)-补录描述"/>
<column name="IN_OPT_ADD_COMPONENT_TYPE_" type="NVARCHAR(20)" remarks="输入值(选项)-补录组件类型"/>
<column name="IN_OPT_ADD_ATTACHMENT_TYPE_" type="NVARCHAR(20)" remarks="输入值(选项)-补录附件模式"/>
<!-- 审计字段 --> <!-- 审计字段 -->
<column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/> <column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/>
<column name="DATA_COME_FROM_" type="NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)"/> <column name="DATA_COME_FROM_" type="NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)"/>
@ -256,6 +249,63 @@
referencedTableName="RE_MODEL_PARAMETER" referencedTableName="RE_MODEL_PARAMETER"
referencedColumnNames="ID_" onDelete="CASCADE"/> referencedColumnNames="ID_" onDelete="CASCADE"/>
<!-- 参数补录项 -->
<createTable tableName="RE_MODEL_PARAMETER_ADDITION" remarks="参数补录项表">
<column name="ID_" type="NVARCHAR(36)" remarks="ID_">
<constraints primaryKey="true"/>
</column>
<column name="PARAMETER_ID_" type="NVARCHAR(36)" remarks="参数ID">
<constraints nullable="false"/>
</column>
<column name="CODE_" type="NVARCHAR(255)" remarks="代码"/>
<column name="NAME_" type="NVARCHAR(255)" remarks="名称"/>
<column name="DESCRIPTION_" type="NVARCHAR(255)" remarks="描述"/>
<column name="COMPONENT_TYPE_" type="NVARCHAR(20)" remarks="组件类型(INTEGER:整数;DECIMAL:小数,TEXT:文本;TEXTS:多行文本;ATTACHMENT:附件)"/>
<column name="CONDITION_" type="NVARCHAR(1024)" remarks="条件"/>
<column name="ENABLE_" type="SMALLINT" remarks="是否可用"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/>
<!-- 当 COMPONENT_TYPE_ ="TEXTS" (多行文本) -->
<column name="ROWS_" type="INTEGER" remarks="多行文本框行数"/>
<!-- 当 COMPONENT_TYPE_ ="TEXT" or COMPONENT_TYPE_ ="TEXTS" (文本或者多行文本) -->
<column name="PROMPT_" type="NVARCHAR(1024)" remarks="提示词"/>
<!-- 当 COMPONENT_TYPE_ ="ATTACHMENT" (附件) -->
<column name="ATTACHMENT_EXT_NAMES_" type="NVARCHAR(255)" remarks="允许上传附件的文件扩展名"/>
<column name="ATTACHMENT_MAX_COUNT_" type="INTEGER" remarks="允许上传附件的最大个数"/>
<!-- 审计字段 -->
<column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/>
<column name="DATA_COME_FROM_" type="NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)"/>
<column name="CREATOR_" type="NVARCHAR(255)" remarks="创建人"/>
<column name="CREATE_DATE_" type="DATETIME" remarks="创建日期"/>
<column name="LAST_MODIFIER_" type="NVARCHAR(255)" remarks="最后修改人"/>
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"/>
<column name="CORP_CODE_" type="NVARCHAR(255)" remarks="所属法人代码"/>
</createTable>
<addNotNullConstraint columnName="CORP_CODE_" columnDataType="NVARCHAR(255)" tableName="RE_MODEL_PARAMETER_ADDITION" constraintName="CONST_RE_MPA_CORP"/>
<addDefaultValue columnName="CORP_CODE_" columnDataType="NVARCHAR(255)" tableName="RE_MODEL_PARAMETER_ADDITION" defaultValue="_PRIMARY_"/>
<!-- 索引 -->
<createIndex tableName="RE_MODEL_PARAMETER_ADDITION" indexName="IDX_RE_MPA_ORDER">
<column name="ORDER_"></column>
</createIndex>
<createIndex tableName="RE_MODEL_PARAMETER_ADDITION" indexName="IDX_RE_MPA_PARAMETER_ID">
<column name="PARAMETER_ID_"></column>
</createIndex>
<createIndex tableName="RE_MODEL_PARAMETER_ADDITION" indexName="IDX_RE_MPA_LMD">
<column name="LAST_MODIFYDATE_"></column>
</createIndex>
<!-- 当参数选项所属的参数被删除,该参数选项也被删除 -->
<addForeignKeyConstraint
constraintName="FK_RE_MODEL_PARAMETER_ADD"
baseTableName="RE_MODEL_PARAMETER_ADDITION"
baseColumnNames="PARAMETER_ID_"
referencedTableName="RE_MODEL_PARAMETER"
referencedColumnNames="ID_" onDelete="CASCADE"/>
<!-- 模型参数验证器表 --> <!-- 模型参数验证器表 -->
<createTable tableName="RE_MODEL_PARAMETER_VALIDATOR" remarks="模型参数验证器表"> <createTable tableName="RE_MODEL_PARAMETER_VALIDATOR" remarks="模型参数验证器表">
<column name="ID_" type="NVARCHAR(36)" remarks="ID_"> <column name="ID_" type="NVARCHAR(36)" remarks="ID_">
@ -463,7 +513,7 @@
<column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/> <column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/>
<column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/> <column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/>
<column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/> <column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/>
<column name="DEFAULT_VALUE_" type="NVARCHAR(255)" remarks="默认值"/> <column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/>
<column name="VALUE_CALCULATION_" type="CLOB" remarks="值计算逻辑"/> <column name="VALUE_CALCULATION_" type="CLOB" remarks="值计算逻辑"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/> <column name="ORDER_" type="INTEGER" remarks="排序"/>
<column name="TAB_" type="INTEGER" remarks="缩进(用于显示时界面缩进)"></column> <column name="TAB_" type="INTEGER" remarks="缩进(用于显示时界面缩进)"></column>
@ -630,7 +680,7 @@
<column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/> <column name="VALUE_SCALE_" type="SMALLINT" remarks="值精度"/>
<column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/> <column name="VALUE_ROUNDING_MODE_" type="NVARCHAR(20)" remarks="值四舍五入模式"/>
<column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/> <column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/>
<column name="DEFAULT_VALUE_" type="NVARCHAR(255)" remarks="默认值"/> <column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/> <column name="ORDER_" type="INTEGER" remarks="排序"/>
<column name="LIB_ID_" type="NVARCHAR(36)" remarks="所属数据字典ID"/> <column name="LIB_ID_" type="NVARCHAR(36)" remarks="所属数据字典ID"/>

16
io.sc.engine.st.frontend/package.json

@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

16
io.sc.platform.ai.frontend/package.json

@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.64", "version": "8.2.65",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",
@ -101,18 +101,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",

6
io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangePasswordDialog.vue

@ -49,19 +49,19 @@
{ {
name: 'rawPassword', name: 'rawPassword',
label: $t('rawPassword'), label: $t('rawPassword'),
type: 'password', type: 'w-password',
required: true, required: true,
}, },
{ {
name: 'newPassword', name: 'newPassword',
label: $t('newPassword'), label: $t('newPassword'),
type: 'password', type: 'w-password',
required: true, required: true,
}, },
{ {
name: 'confirmNewPassword', name: 'confirmNewPassword',
label: $t('confirmNewPassword'), label: $t('confirmNewPassword'),
type: 'password', type: 'w-password',
required: true, required: true,
rules: [ rules: [
(value) => { (value) => {

172
io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue

@ -45,40 +45,78 @@
<!-- messages dropdown action--> <!-- messages dropdown action-->
<q-btn v-if="gc.theme.topper.actions['notifier'].enable" stretch flat icon="bi-bell" size="md" :title="t('alter')"> <q-btn v-if="gc.theme.topper.actions['notifier'].enable" stretch flat icon="bi-bell" size="md" :title="t('alter')">
<q-badge color="red" rounded floating class="mt-2 mr-1">120</q-badge> <q-badge v-if="messagesCount > 0" color="red" rounded floating class="mt-2 mr-1">{{ messagesCount }}</q-badge>
<q-menu> <q-popup-proxy style="width: 500px">
<q-list style="min-width: 100px"> <q-tabs v-model="notifierTabRef">
<q-item v-close-popup clickable> <q-tab name="myTasks" icon="bi-list-ol" :label="$t('myTasks')">
<q-item-section> <q-badge v-if="unCompletedTasksTotalCountRef > 0" color="red" rounded floating>{{ unCompletedTasksTotalCountRef }}</q-badge>
<q-item-label> </q-tab>
<q-icon name="bi-megaphone" left size="20px"></q-icon> <q-tab name="myMessages" icon="bi-chat-dots" :label="$t('myMessages')">
<span class="mr-2">{{ $t('systemAnnouncements') }}</span> <q-badge v-if="unReadedNotificationsTotalCountRef > 0" color="red" rounded floating>{{ unReadedNotificationsTotalCountRef }}</q-badge>
<q-badge color="negative" rounded>7</q-badge> </q-tab>
</q-item-label> <q-tab name="systemAnnouncements" icon="bi-megaphone" :label="$t('systemAnnouncements')">
</q-item-section> <q-badge v-if="unReadedAnnouncementsTotalCountRef > 0" color="red" rounded floating>{{ unReadedAnnouncementsTotalCountRef }}</q-badge>
</q-item> </q-tab>
</q-tabs>
<q-tab-panels v-model="notifierTabRef" animated>
<q-tab-panel name="myTasks">
<q-list>
<q-item v-if="unCompletedTasksRef.length <= 0"></q-item>
<q-item v-for="item in unCompletedTasksRef" :key="item.id" v-ripple clickable class="px-0 pb-2" @click="viewTask(item)">
<q-item-section avatar style="min-width: 0px; padding-right: 5px">
<q-icon color="blue" name="bi-dot" size="xl" />
</q-item-section>
<q-item-section>
<q-item-label>{{ item.name }}</q-item-label>
<q-item-label caption lines="2"><div v-html="item.description"></div></q-item-label>
</q-item-section>
<q-item v-close-popup clickable> <q-item-section side top>
<q-item-section> <q-item-label caption>{{ item.createTimeAndNowDiff }}{{ $t(item.createTimeAndNowDiffUnit) }}{{ $t('before') }}</q-item-label>
<q-item-label> <q-item-label caption>{{ item.processDefinitionName }}</q-item-label>
<q-icon name="bi-chat-dots" left size="20px"></q-icon> </q-item-section>
<span class="mr-2">{{ $t('myMessages') }}</span> </q-item>
<q-badge color="positive" rounded>2</q-badge> </q-list>
</q-item-label> </q-tab-panel>
</q-item-section> <q-tab-panel name="myMessages">
</q-item> <q-list>
<q-item v-if="unReadedNotificationsRef.length <= 0"></q-item>
<q-item v-for="item in unReadedNotificationsRef" :key="item.id" v-ripple clickable class="px-0 pb-2" @click="viewNotification(item)">
<q-item-section avatar style="min-width: 0px; padding-right: 5px">
<q-icon color="blue" name="bi-dot" size="xl" />
</q-item-section>
<q-item-section>
<q-item-label>{{ item.title }}</q-item-label>
<q-item-label caption lines="2"><div v-html="item.content"></div></q-item-label>
</q-item-section>
<q-item v-close-popup clickable> <q-item-section side top>
<q-item-section> <q-item-label caption>{{ item.sendDateAndNowDiff }}{{ $t(item.sendDateAndNowDiffUnit) }}{{ $t('before') }}</q-item-label>
<q-item-label> <q-item-label caption>{{ item.sender }}</q-item-label>
<q-icon name="bi-list-ol" left size="20px"></q-icon> </q-item-section>
<span class="mr-2">{{ $t('myTasks') }}</span> </q-item>
<q-badge color="warning" rounded>8</q-badge> </q-list>
</q-item-label> </q-tab-panel>
</q-item-section> <q-tab-panel name="systemAnnouncements">
</q-item> <q-list>
</q-list> <q-item v-if="unReadedAnnouncementsRef.length <= 0"></q-item>
</q-menu> <q-item v-for="item in unReadedAnnouncementsRef" :key="item.id" v-ripple clickable class="px-0 pb-2" @click="viewAnnouncement(item)">
<q-item-section avatar style="min-width: 0px; padding-right: 5px">
<q-icon color="blue" name="bi-dot" size="xl" />
</q-item-section>
<q-item-section>
<q-item-label>{{ item.title }}</q-item-label>
<q-item-label caption lines="2"><div v-html="item.content"></div></q-item-label>
</q-item-section>
<q-item-section side top>
<q-item-label caption>{{ item.lastModifyDateAndNowDiff }}{{ $t(item.lastModifyDateAndNowDiffUnit) }}{{ $t('before') }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-tab-panel>
</q-tab-panels>
</q-popup-proxy>
</q-btn> </q-btn>
<!-- profile dropdown action--> <!-- profile dropdown action-->
@ -157,27 +195,41 @@
<AboutDialog ref="aboutDialog"></AboutDialog> <AboutDialog ref="aboutDialog"></AboutDialog>
<ChangePasswordDialog ref="changePasswordDialog"></ChangePasswordDialog> <ChangePasswordDialog ref="changePasswordDialog"></ChangePasswordDialog>
<ChangeRoleDialog ref="changeRoleDialog"></ChangeRoleDialog> <ChangeRoleDialog ref="changeRoleDialog"></ChangeRoleDialog>
<ViewNotificationDialog ref="viewNotificationDialog"></ViewNotificationDialog>
<ViewAnnouncementDialog ref="viewAnnouncementDialog"></ViewAnnouncementDialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref, computed } from 'vue';
import { useQuasar } from 'quasar'; import { useQuasar, useInterval } from 'quasar';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { Environment, SessionManager, I18nMessageManager, AuthenticationManager } from '@/platform'; import { axios, Environment, SessionManager, I18nMessageManager, AuthenticationManager, Tools } from '@/platform';
import LoginDialog from '@/platform/views/LoginDialog'; import LoginDialog from '@/platform/views/LoginDialog';
import AboutDialog from './AboutDialog.vue'; import AboutDialog from './AboutDialog.vue';
import ChangePasswordDialog from './ChangePasswordDialog.vue'; import ChangePasswordDialog from './ChangePasswordDialog.vue';
import ChangeRoleDialog from './ChangeRoleDialog.vue'; import ChangeRoleDialog from './ChangeRoleDialog.vue';
import ViewNotificationDialog from './ViewNotificationDialog.vue';
import ViewAnnouncementDialog from './ViewAnnouncementDialog.vue';
const { registerInterval } = useInterval();
const gc = Environment.getConfigure(); const gc = Environment.getConfigure();
const quasar = useQuasar(); const quasar = useQuasar();
const searchContent = ref(''); const searchContent = ref('');
const notifierTabRef = ref('myTasks');
const loginDialog = ref(); const loginDialog = ref();
const aboutDialog = ref(); const aboutDialog = ref();
const changePasswordDialog = ref(); const changePasswordDialog = ref();
const changeRoleDialog = ref(); const changeRoleDialog = ref();
const viewNotificationDialog = ref();
const viewAnnouncementDialog = ref();
const { t } = useI18n(); const { t } = useI18n();
const unCompletedTasksRef = ref([]);
const unCompletedTasksTotalCountRef = ref();
const unReadedNotificationsRef = ref([]);
const unReadedNotificationsTotalCountRef = ref();
const unReadedAnnouncementsRef = ref([]);
const unReadedAnnouncementsTotalCountRef = ref();
const search = () => { const search = () => {
console.log(searchContent); console.log(searchContent);
@ -191,6 +243,14 @@ const fullScreen = () => {
} }
}; };
const messagesCount = computed(() => {
return (
(Tools.isUndefinedOrNull(unCompletedTasksTotalCountRef.value) ? 0 : unCompletedTasksTotalCountRef.value) +
(Tools.isUndefinedOrNull(unReadedNotificationsTotalCountRef.value) ? 0 : unReadedNotificationsTotalCountRef.value) +
(Tools.isUndefinedOrNull(unReadedAnnouncementsTotalCountRef.value) ? 0 : unReadedAnnouncementsTotalCountRef.value)
);
});
const about = () => { const about = () => {
aboutDialog.value.open(); aboutDialog.value.open();
}; };
@ -241,9 +301,51 @@ const doLogout = () => {
window.location.href = Environment.getWebContextPath(); window.location.href = Environment.getWebContextPath();
}; };
const findUnCompletedTasks = () => {
axios.get(Environment.apiContextPath('/api/flowable/process/query/task')).then((response) => {
unCompletedTasksRef.value = response.data.content || [];
unCompletedTasksTotalCountRef.value = response.data.totalElements;
});
};
const findUnReadedNotifications = () => {
axios.get(Environment.apiContextPath('/api/system/notification/findUnReadedNotifications')).then((response) => {
unReadedNotificationsRef.value = response.data.content || [];
unReadedNotificationsTotalCountRef.value = response.data.totalElements;
});
};
const findUnReadedAnnouncements = () => {
axios.get(Environment.apiContextPath('/api/system/announcement/findUnReadedAnnouncements')).then((response) => {
unReadedAnnouncementsRef.value = response.data.content || [];
unReadedAnnouncementsTotalCountRef.value = response.data.totalElements;
});
};
const viewNotification = (item) => {
viewNotificationDialog.value.open(item);
};
const viewAnnouncement = (item) => {
viewAnnouncementDialog.value.open(item);
};
Environment.registAction('about', about); Environment.registAction('about', about);
Environment.registAction('changePassword', changePassword); Environment.registAction('changePassword', changePassword);
Environment.registAction('changeRole', changeRole); Environment.registAction('changeRole', changeRole);
Environment.registAction('openLoginDialog', openLoginDialog); Environment.registAction('openLoginDialog', openLoginDialog);
Environment.registAction('logout', logout); Environment.registAction('logout', logout);
Environment.registAction('findUnCompletedTasks', findUnCompletedTasks);
Environment.registAction('findUnReadedNotifications', findUnReadedNotifications);
Environment.registAction('findUnReadedAnnouncements', findUnReadedAnnouncements);
findUnCompletedTasks();
findUnReadedNotifications();
findUnReadedAnnouncements();
registerInterval(() => {
findUnCompletedTasks();
findUnReadedNotifications();
findUnReadedAnnouncements();
}, 60 * 1000);
</script> </script>

62
io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewAnnouncementDialog.vue

@ -0,0 +1,62 @@
<template>
<w-dialog ref="dialogRef" width="800px" :title="$t('systemAnnouncements')" :can-maximize="false" @hide="Environment.executeAction('loadSystemAnnouncements')">
<q-carousel
v-model="slideRef"
transition-prev="scale"
transition-next="scale"
swipeable
animated
control-type="outline"
control-color="primary"
navigation
padding
arrows
height="500px"
@update:model-value="updateLastReadAnnouncementDate"
>
<q-carousel-slide v-for="item in systemAnnouncementsRef" :key="item.id" :name="item.id" class="column no-wrap">
<div class="text-lg font-bold">{{ item.title }} ({{ item.lastModifyDate }})</div>
<div class="q-mt-md overflow-auto" style="height: 350px" v-html="item.content"></div>
</q-carousel-slide>
</q-carousel>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, PConst, Environment, noErrorAxios, NotifyManager } from '@/platform';
const dialogRef = ref();
const itemRef = ref();
const systemAnnouncementsRef = ref();
const slideRef = ref();
const open = async (item) => {
itemRef.value = item;
slideRef.value = item.id;
dialogRef.value.show();
await loadSystemAnnouncements();
updateLastReadAnnouncementDate();
};
const close = () => {
dialogRef.value.hide();
};
const loadSystemAnnouncements = async () => {
const response = await axios.get(Environment.apiContextPath('/api/system/announcement/findUnReadedAnnouncements'));
systemAnnouncementsRef.value = response.data.content || [];
};
const updateLastReadAnnouncementDate = () => {
for (const item of systemAnnouncementsRef.value) {
if (item.id === slideRef.value) {
axios.post(Environment.apiContextPath('/api/system/user/updateLastReadAnnouncementDate'), { lastReadAnnouncementDate: item.lastModifyDate });
}
}
};
defineExpose({
open,
close,
});
</script>

130
io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewNotificationDialog.vue

@ -0,0 +1,130 @@
<template>
<w-dialog ref="dialogRef" width="800px" :title="$t('myMessages')" :can-maximize="false" @hide="Environment.executeAction('loadSystemAnnouncements')">
<q-splitter :model-value="125" unit="px" reverse horizontal style="height: 500px" separator-style="height:2px">
<template #before>
<div class="py-2" style="height: 100%">
<div class="px-4 py-2 overflow-auto" style="height: 100%">
<template v-for="item in messagesRef" :key="item.id">
<q-chat-message
v-if="item.sender === SessionManager.getSession().user.loginName"
:id="item.id"
:name="item.sendDateAndNowDiff + $t(item.sendDateAndNowDiffUnit) + $t('before')"
:text="[item.title]"
sent
text-color="white"
bg-color="primary"
>
<template #avatar>
<q-icon name="bi-person-circle" size="48px" color="blue" right />
</template>
</q-chat-message>
<q-chat-message
v-else
:id="item.id"
:name="item.sendDateAndNowDiff + $t(item.sendDateAndNowDiffUnit) + $t('before')"
bg-color="green"
style="width: 85%"
>
<template #avatar>
<q-icon name="bi-flower2" size="36px" color="green" left />
</template>
<q-markdown :src="':::\n' + item.title + '\n:::'"> </q-markdown>
</q-chat-message>
</template>
</div>
</div>
</template>
<template #after>
<div class="pt-1" style="height: 100%">
<q-input
ref="textareaRef"
v-model="questionRef"
type="textarea"
rows="5"
outlined
clearable
style="height: 100%"
@keydown.enter.prevent="sendMessage"
/>
</div>
</template>
</q-splitter>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue';
import { useQuasar, uid } from 'quasar';
import { axios, PConst, Environment, SessionManager, noErrorAxios, NotifyManager } from '@/platform';
const $q = useQuasar();
const dialogRef = ref();
const itemRef = ref();
const textareaRef = ref();
const questionRef = ref();
const questionHistoryRef = ref([]);
const showThinkRef = ref(true);
const messagesRef = ref([]);
const imeRef = ref(false);
const open = async (item) => {
itemRef.value = item;
dialogRef.value.show();
loadNotifications();
};
const close = () => {
dialogRef.value.hide();
};
const loadNotifications = async () => {
axios.get(Environment.apiContextPath('/api/system/notification/findNotificationsBySender/' + itemRef.value.sender)).then((response) => {
messagesRef.value = response.data || [];
//
nextTick(() => {
if (messagesRef.value && messagesRef.value.length > 0) {
document.getElementById(messagesRef.value[messagesRef.value.length - 1].id).scrollIntoView();
}
});
});
};
const updateLastReadAnnouncementDate = () => {};
const sendMessage = (event: any) => {
if (imeRef.value) {
// ,
return;
}
if (($q.platform.is.mac && event.metaKey) || ($q.platform.is.win && event.ctrlKey)) {
// command/ctrl+
const element = textareaRef.value.getNativeElement();
const start = element.selectionStart;
const end = element.selectionEnd;
const text = questionRef.value;
const leftText = text.substring(0, element.selectionStart);
const rightText = text.substring(element.selectionEnd);
questionRef.value = leftText + '\n' + rightText;
nextTick(() => {
element.selectionEnd = start + 1;
});
return;
} else {
axios
.post(Environment.apiContextPath('/api/system/notification'), {
receiver: itemRef.value.sender,
title: questionRef.value,
content: questionRef.value,
})
.then((response) => {
loadNotifications();
});
questionRef.value = '';
}
};
defineExpose({
open,
close,
});
</script>

2
io.sc.platform.core.frontend/src/platform/plugin/manager/I18nMessageManager.ts

@ -63,7 +63,7 @@ class I18nMessageManager {
} else { } else {
i18n.global.setLocaleMessage(locale, I18nMessageManager.getOfflineI18nMessages()[locale]); i18n.global.setLocaleMessage(locale, I18nMessageManager.getOfflineI18nMessages()[locale]);
} }
nextTick(); return nextTick();
} }
/** /**

5
io.sc.platform.core.frontend/src/views/likm/Grid.vue

@ -10,10 +10,7 @@
db-click-operation="edit" db-click-operation="edit"
:checkbox-selection="true" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')" :data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{ :sort-by="['name']"
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3" :query-form-cols-num="3"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' }, { name: 'code', label: $t('code'), type: 'w-text' },

5
io.sc.platform.core.frontend/src/views/standard/AdminDivision.vue

@ -16,10 +16,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/adminDivision')" :data-url="Environment.apiContextPath('/api/standard/adminDivision')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',

5
io.sc.platform.core.frontend/src/views/standard/Counterparty.vue

@ -9,10 +9,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/counterparty')" :data-url="Environment.apiContextPath('/api/standard/counterparty')"
:pageable="true" :pageable="true"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[

5
io.sc.platform.core.frontend/src/views/standard/Currency.vue

@ -10,10 +10,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/currency')" :data-url="Environment.apiContextPath('/api/standard/currency')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['codeLatin']"
sortBy: 'codeLatin',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['query', 'refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:query-form-cols-num="4" :query-form-cols-num="4"

5
io.sc.platform.core.frontend/src/views/standard/Industry.vue

@ -16,10 +16,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/industry')" :data-url="Environment.apiContextPath('/api/standard/industry')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',

5
io.sc.platform.core.frontend/src/views/standard/PerformanceStatus.vue

@ -9,10 +9,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/performanceStatus')" :data-url="Environment.apiContextPath('/api/standard/performanceStatus')"
:pageable="true" :pageable="true"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[

5
io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue

@ -54,5 +54,8 @@ userDefinedFunctionsManager.load();
console.log(Tools.escapeHtml('<xml>&</xml>')); console.log(Tools.escapeHtml('<xml>&</xml>'));
const matcheds = '${kdsf} #{aaa}'.match(/\$\{(.+?)\}|#\{(.+?)\}/g); const matcheds = '${kdsf} #{aaa}'.match(/\$\{(.+?)\}|#\{(.+?)\}/g);
//console.log(matcheds);
axios.get(Environment.apiContextPath('/api/flowable/process/query/candidateTasks')).then((response) => {
console.log(response);
});
</script> </script>

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

@ -9,10 +9,7 @@
selection="multiple" selection="multiple"
:checkbox-selection="true" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')" :data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{ :sort-by="['name']"
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3" :query-form-cols-num="3"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' }, { name: 'code', label: $t('code'), type: 'w-text' },

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.50", "version": "8.2.63",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -73,18 +73,18 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.4", "@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.0", "@codemirror/commands": "6.8.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-javascript": "6.2.3",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.8", "@codemirror/language": "6.11.0",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.10",
"@codemirror/state": "6.5.1", "@codemirror/state": "6.5.2",
"@codemirror/view": "6.36.2", "@codemirror/view": "6.36.5",
"@maxgraph/core": "0.14.0", "@maxgraph/core": "0.14.0",
"@quasar/extras": "1.16.15", "@quasar/extras": "1.16.15",
"@quasar/quasar-ui-qmarkdown": "2.0.5", "@quasar/quasar-ui-qmarkdown": "2.0.5",
@ -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.50", "platform-core": "8.2.63",
"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",

5
io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue

@ -10,10 +10,7 @@
db-click-operation="edit" db-click-operation="edit"
:checkbox-selection="true" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')" :data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{ :sort-by="['name']"
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3" :query-form-cols-num="3"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' }, { name: 'code', label: $t('code'), type: 'w-text' },

5
io.sc.platform.core.frontend/template-project/src/views/standard/AdminDivision.vue

@ -16,10 +16,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/adminDivision')" :data-url="Environment.apiContextPath('/api/standard/adminDivision')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',

5
io.sc.platform.core.frontend/template-project/src/views/standard/Counterparty.vue

@ -9,10 +9,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/counterparty')" :data-url="Environment.apiContextPath('/api/standard/counterparty')"
:pageable="true" :pageable="true"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[

5
io.sc.platform.core.frontend/template-project/src/views/standard/Currency.vue

@ -10,10 +10,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/currency')" :data-url="Environment.apiContextPath('/api/standard/currency')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['codeLatin']"
sortBy: 'codeLatin',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['query', 'refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:query-form-cols-num="4" :query-form-cols-num="4"

5
io.sc.platform.core.frontend/template-project/src/views/standard/Industry.vue

@ -16,10 +16,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/industry')" :data-url="Environment.apiContextPath('/api/standard/industry')"
:pageable="false" :pageable="false"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',

5
io.sc.platform.core.frontend/template-project/src/views/standard/PerformanceStatus.vue

@ -9,10 +9,7 @@
primary-key="code" primary-key="code"
:data-url="Environment.apiContextPath('/api/standard/performanceStatus')" :data-url="Environment.apiContextPath('/api/standard/performanceStatus')"
:pageable="true" :pageable="true"
:pagination="{ :sort-by="['code']"
sortBy: 'code',
descending: false,
}"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[

5
io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue

@ -54,5 +54,8 @@ userDefinedFunctionsManager.load();
console.log(Tools.escapeHtml('<xml>&</xml>')); console.log(Tools.escapeHtml('<xml>&</xml>'));
const matcheds = '${kdsf} #{aaa}'.match(/\$\{(.+?)\}|#\{(.+?)\}/g); const matcheds = '${kdsf} #{aaa}'.match(/\$\{(.+?)\}|#\{(.+?)\}/g);
//console.log(matcheds);
axios.get(Environment.apiContextPath('/api/flowable/process/query/candidateTasks')).then((response) => {
console.log(response);
});
</script> </script>

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

@ -9,10 +9,7 @@
selection="multiple" selection="multiple"
:checkbox-selection="true" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')" :data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{ :sort-by="['name']"
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3" :query-form-cols-num="3"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' }, { name: 'code', label: $t('code'), type: 'w-text' },

6
io.sc.platform.core/src/main/java/io/sc/platform/core/service/impl/LicenseManagerServiceImpl.java

@ -78,15 +78,15 @@ public class LicenseManagerServiceImpl implements LicenseManagerService {
switch (license.getType()) { switch (license.getType()) {
case TRIAL: case TRIAL:
verifyExpired(license); verifyExpired(license);
verifyMacAddress(license); //verifyMacAddress(license);
break; break;
case TERM: case TERM:
verifyExpired(license); verifyExpired(license);
verifyMacAddress(license); //verifyMacAddress(license);
break; break;
case EXPIRED: case EXPIRED:
verifyExpired(license); verifyExpired(license);
verifyMacAddress(license); //verifyMacAddress(license);
break; break;
case PERMANENCE: case PERMANENCE:
verifyMacAddress(license); verifyMacAddress(license);

17
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties

@ -39,3 +39,20 @@ io.sc.platform.core.enums.RoundingMode.FLOOR=Floor
io.sc.platform.core.enums.RoundingMode.HALF_UP=Half Up io.sc.platform.core.enums.RoundingMode.HALF_UP=Half Up
io.sc.platform.core.enums.RoundingMode.HALF_DOWN=Half Down io.sc.platform.core.enums.RoundingMode.HALF_DOWN=Half Down
io.sc.platform.core.enums.RoundingMode.HALF_EVEN=Half Even io.sc.platform.core.enums.RoundingMode.HALF_EVEN=Half Even
NANOS=Nanos
MICROS=Micros
MILLIS=Millis
SECONDS=Seconds
MINUTES=Minutes
HOURS=Hours
HALF_DAYS=Half_Days
DAYS=Days
WEEKS=Weeks
MONTHS=Months
YEARS=Years
DECADES=Decades
CENTURIES=Centuries
MILLENNIA=Millennia
ERAS=Eras
FOREVER=Forever

17
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties

@ -39,3 +39,20 @@ io.sc.platform.core.enums.RoundingMode.FLOOR=\u5411\u8CA0\u7121\u7AAE\u65B9\u541
io.sc.platform.core.enums.RoundingMode.HALF_UP=\u7D93\u5178\u7684\u56DB\u820D\u4E94\u5165 io.sc.platform.core.enums.RoundingMode.HALF_UP=\u7D93\u5178\u7684\u56DB\u820D\u4E94\u5165
io.sc.platform.core.enums.RoundingMode.HALF_DOWN=\u6700\u8FD1\u6578\u5B57\u820D\u5165 io.sc.platform.core.enums.RoundingMode.HALF_DOWN=\u6700\u8FD1\u6578\u5B57\u820D\u5165
io.sc.platform.core.enums.RoundingMode.HALF_EVEN=\u9280\u884C\u5BB6\u820D\u5165\u6CD5 io.sc.platform.core.enums.RoundingMode.HALF_EVEN=\u9280\u884C\u5BB6\u820D\u5165\u6CD5
NANOS=\u7D0D\u79D2
MICROS=\u5FAE\u79D2
MILLIS=\u6BEB\u79D2
SECONDS=\u79D2
MINUTES=\u5206\u9418
HOURS=\u5C0F\u6642
HALF_DAYS=\u534A\u5929
DAYS=\u5929
WEEKS=\u5468
MONTHS=\u6708
YEARS=\u5E74
DECADES=\u5341\u5E74
CENTURIES=\u767E\u5E74
MILLENNIA=\u5343\u5E74
ERAS=\u5341\u4EBF\u5E74
FOREVER=\u6C38\u9060

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save