Browse Source

后端发布: 8.2.11

前端发布: 8.2.50
main
wangshaoping 3 months ago
parent
commit
2f804f695b
  1. 4
      erm.frontend/package.json
  2. 3
      erm.frontend/public/engine.svg
  3. 4
      gradle.properties
  4. 4
      io.sc.engine.mv.frontend/package.json
  5. 3
      io.sc.engine.mv.frontend/public/engine.svg
  6. 4
      io.sc.engine.mv.frontend/src/views/result/Executor.vue
  7. 14
      io.sc.engine.mv.frontend/src/views/result/ResultDetailDialog.vue
  8. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionAttachmentMode.java
  9. 11
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionComponentType.java
  10. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/QualitativeAdditionMode.java
  11. 46
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java
  12. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  13. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  14. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  15. 4
      io.sc.engine.rule.frontend/package.json
  16. 3
      io.sc.engine.rule.frontend/public/engine.svg
  17. 6
      io.sc.engine.rule.frontend/src/i18n/messages.json
  18. 6
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  19. 6
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  20. 4
      io.sc.engine.rule.frontend/src/views/authorization/Authorization.vue
  21. 4
      io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue
  22. 2
      io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue
  23. 2
      io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue
  24. 2
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  25. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
  26. 55
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  27. 9
      io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts
  28. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java
  29. 85
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InOptionParameterEntity.java
  30. 22
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java
  31. 54
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java
  32. 7
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml
  33. 4
      io.sc.engine.st.frontend/package.json
  34. 3
      io.sc.engine.st.frontend/public/engine.svg
  35. 4
      io.sc.platform.ai.frontend/package.json
  36. 3
      io.sc.platform.ai.frontend/public/engine.svg
  37. 2
      io.sc.platform.ai.frontend/src/i18n/messages.json
  38. 24
      io.sc.platform.ai.frontend/src/views/chat/Chat.vue
  39. 29
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/AiApi.java
  40. 8
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/MessageWrapper.java
  41. 6
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java
  42. 6
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java
  43. 12
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java
  44. 3
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java
  45. 62
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java
  46. 20
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatCallback.java
  47. 10
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java
  48. 120
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java
  49. 29
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java
  50. 46
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatApi.java
  51. 16
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsApi.java
  52. 10
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/CallUtil.java
  53. 38
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/HeadersUtil.java
  54. 18
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/OkHttpClientUtil.java
  55. 23
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/RequestBodyUtil.java
  56. 23
      io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/RequestUtil.java
  57. 16
      io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json
  58. 3
      io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties
  59. 3
      io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties
  60. 3
      io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties
  61. 2
      io.sc.platform.core.frontend/package.json
  62. 3
      io.sc.platform.core.frontend/public/engine.svg
  63. 4
      io.sc.platform.core.frontend/template-project/package.json
  64. 3
      io.sc.platform.core.frontend/template-project/public/engine.svg
  65. 154
      io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue
  66. 230
      io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue
  67. 125
      io.sc.platform.core.frontend/template-project/src/views/likm/SelectMenuTreeGrid.vue
  68. 66
      io.sc.platform.core.frontend/template-project/src/views/likm/SelectUserDialog.vue
  69. 165
      io.sc.platform.core.frontend/template-project/src/views/likm/SelectUserGrid.vue
  70. 1
      io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue
  71. 2
      io.sc.platform.core.frontend/template-project/src/views/testcase/ai/Ai.vue
  72. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  73. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  74. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties
  75. 4
      io.sc.platform.developer.doc/package.json
  76. 4
      io.sc.platform.developer.frontend/package.json
  77. 3
      io.sc.platform.developer.frontend/public/engine.svg
  78. 4
      io.sc.platform.lcdp.frontend/package.json
  79. 3
      io.sc.platform.lcdp.frontend/public/engine.svg
  80. 4
      io.sc.platform.license.keygen.frontend/package.json
  81. 3
      io.sc.platform.license.keygen.frontend/public/engine.svg
  82. 4
      io.sc.platform.mvc.frontend/package.json
  83. 3
      io.sc.platform.mvc.frontend/public/engine.svg
  84. 4
      io.sc.platform.scheduler.manager.frontend/package.json
  85. 3
      io.sc.platform.scheduler.manager.frontend/public/engine.svg
  86. 4
      io.sc.platform.system.frontend/package.json
  87. 3
      io.sc.platform.system.frontend/public/engine.svg
  88. 10
      io.sc.platform.util/src/main/java/io/sc/platform/util/TernaryUtil.java
  89. 4
      io.sc.standard.frontend/package.json
  90. 3
      io.sc.standard.frontend/public/engine.svg
  91. 4
      io.sc.website/package.json

4
erm.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "erm.frontend", "name": "erm.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
erm.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
gradle.properties

@ -37,9 +37,9 @@ application_version=1.0.0
# platform # platform
########################################################### ###########################################################
platform_group=io.sc platform_group=io.sc
platform_version=8.2.10 platform_version=8.2.11
platform_plugin_version=8.2.10 platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.48 platform_core_frontend_version=8.2.50
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.mv.frontend", "name": "io.sc.engine.mv.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.engine.mv.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.engine.mv.frontend/src/views/result/Executor.vue

@ -1,6 +1,6 @@
<template> <template>
<w-dialog ref="dialogRef" width="600px" height="400px" :title="$t('io.sc.engine.mv.executorDialog.title')" :can-maximize="false" :maximized="false"> <w-dialog ref="dialogRef" width="600px" :title="$t('io.sc.engine.mv.executorDialog.title')" :can-maximize="false" :maximized="false">
<div class="px-10"> <div class="px-10 pt-2">
<w-form <w-form
ref="formRef" ref="formRef"
:cols-num="1" :cols-num="1"

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

@ -87,7 +87,7 @@
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="scaleValidate" class="px-0 pb-0" style="height: 100%"> <q-tab-panel name="scaleValidate" class="px-0 pb-0" style="height: 100%">
<div class="row" style="height: 100%"> <div class="row" style="height: 100%">
<div class="col-6 pr-4" style="height: 100%"> <div class="col-5 pr-4" style="height: 100%">
<w-grid <w-grid
:title="$t('io.sc.engine.mv.result.chiSquare.grid.title') + ' (' + chiSquareValueRef + ')'" :title="$t('io.sc.engine.mv.result.chiSquare.grid.title') + ' (' + chiSquareValueRef + ')'"
hide-bottom hide-bottom
@ -102,15 +102,15 @@
}" }"
:toolbar-actions="['refresh', 'separator', 'export']" :toolbar-actions="['refresh', 'separator', 'export']"
:columns="[ :columns="[
{ width: 50, 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' },
{ width: 50, name: 'pd', label: $t('io.sc.engine.mv.result.chiSquare.pd'), align: 'right' }, { width: 80, name: 'pd', label: $t('io.sc.engine.mv.result.chiSquare.pd'), align: 'right' },
{ width: 50, name: 'count', label: $t('io.sc.engine.mv.result.chiSquare.count'), align: 'right' }, { width: 100, name: 'count', label: $t('io.sc.engine.mv.result.chiSquare.count'), align: 'right' },
{ width: 50, name: 'defaultCount', label: $t('io.sc.engine.mv.result.chiSquare.defaultCount'), align: 'right' }, { width: 100, name: 'defaultCount', label: $t('io.sc.engine.mv.result.chiSquare.defaultCount'), align: 'right' },
{ width: 50, name: 'chiSquare', label: $t('io.sc.engine.mv.result.chiSquare.chiSquare'), align: 'right' }, { width: 80, name: 'chiSquare', label: $t('io.sc.engine.mv.result.chiSquare.chiSquare'), align: 'right' },
]" ]"
></w-grid> ></w-grid>
</div> </div>
<div class="col-6 pl-4" style="height: 100%"> <div class="col-7 pl-4" style="height: 100%">
<w-grid <w-grid
:title="$t('io.sc.engine.mv.result.binomial.grid.title')" :title="$t('io.sc.engine.mv.result.binomial.grid.title')"
:checkbox-selection="false" :checkbox-selection="false"

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

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

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

@ -0,0 +1,11 @@
package io.sc.engine.rule.core.enums;
/**
* 定性指标补录组件类型
*/
public enum QualitativeAdditionComponentType {
SINGLE_LINE_TEXT, // 当行文本
MULTI_LINE_TEXT, // 多行文本
NUMBER, // 数值
INTEGER; // 整数
}

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

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

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

@ -4,6 +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.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.ParameterInOptionItem; import io.sc.engine.rule.core.po.model.ParameterInOptionItem;
@ -16,13 +19,54 @@ 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 List<ParameterInOptionItem> options =new ArrayList<ParameterInOptionItem>();//选项列表 //补录模式
protected QualitativeAdditionMode additionMode;
//补录标题
protected String additionTitle;
//补录描述
protected String additionDescription;
//补录组件类型
protected QualitativeAdditionComponentType additionComponentType;
//补录附件模式
protected QualitativeAdditionAttachmentMode additionAttachmentMode;
//选项列表
protected List<ParameterInOptionItem> options =new ArrayList<ParameterInOptionItem>();
@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;
} }

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

@ -41,6 +41,28 @@ 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
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=Single Row Text Input
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=Multi Row Text Input
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=Number Input
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=Integer Input
#================================================
# \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
#================================================ #================================================

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

@ -41,6 +41,28 @@ 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
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=\u55AE\u884C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=\u591A\u884C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=\u6578\u503C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6578\u6587\u672C\u6846
#================================================
# \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,6 +41,28 @@ 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
#================================================
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.SINGLE_LINE_TEXT=\u5355\u884C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.MULTI_LINE_TEXT=\u591A\u884C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.NUMBER=\u6570\u503C\u6587\u672C\u6846
io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.INTEGER=\u6574\u6570\u6587\u672C\u6846
#================================================
# \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
#================================================ #================================================

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.rule.frontend", "name": "io.sc.engine.rule.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.engine.rule.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

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

@ -80,6 +80,12 @@
"re.parameter.dialog.moveParameter.title": "Select Target Location of Parameter", "re.parameter.dialog.moveParameter.title": "Select Target Location of Parameter",
"re.parameter.options.entity.additionMode": "Addition Mode",
"re.parameter.options.entity.additionTitle": "Addition Title",
"re.parameter.options.entity.additionDescription": "Addition Description",
"re.parameter.options.entity.additionComponentType": "Addition Component Type",
"re.parameter.options.entity.additionAttachmentMode": "Addition Attachment Mode",
"re.validator.grid.title": "Validator", "re.validator.grid.title": "Validator",
"re.validator.grid.entity.content": "Content", "re.validator.grid.entity.content": "Content",
"re.validator.grid.entity.tip": "Error Tip", "re.validator.grid.entity.tip": "Error Tip",

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

@ -80,6 +80,12 @@
"re.parameter.dialog.moveParameter.title": "選擇參數移動的目標位置", "re.parameter.dialog.moveParameter.title": "選擇參數移動的目標位置",
"re.parameter.options.entity.additionMode": "補錄模式",
"re.parameter.options.entity.additionTitle": "補錄標題",
"re.parameter.options.entity.additionDescription": "補錄描述",
"re.parameter.options.entity.additionComponentType": "補錄組件類型",
"re.parameter.options.entity.additionAttachmentMode": "補錄附件模式",
"re.validator.grid.title": "驗證器", "re.validator.grid.title": "驗證器",
"re.validator.grid.entity.content": "內容", "re.validator.grid.entity.content": "內容",
"re.validator.grid.entity.tip": "錯誤提示", "re.validator.grid.entity.tip": "錯誤提示",

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

@ -80,6 +80,12 @@
"re.parameter.dialog.moveParameter.title": "选择参数移动的目标位置", "re.parameter.dialog.moveParameter.title": "选择参数移动的目标位置",
"re.parameter.options.entity.additionMode": "补录模式",
"re.parameter.options.entity.additionTitle": "补录标题",
"re.parameter.options.entity.additionDescription": "补录描述",
"re.parameter.options.entity.additionComponentType": "补录组件类型",
"re.parameter.options.entity.additionAttachmentMode": "补录附件模式",
"re.validator.grid.title": "验证器", "re.validator.grid.title": "验证器",
"re.validator.grid.entity.content": "内容", "re.validator.grid.entity.content": "内容",
"re.validator.grid.entity.tip": "错误提示", "re.validator.grid.entity.tip": "错误提示",

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

@ -24,7 +24,7 @@
:toolbar-actions="['query', 'separator', 'separator', 'view', 'separator', 'export']" :toolbar-actions="['query', 'separator', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[
{ width: 100, name: 'code', label: $t('code') }, { width: 100, name: 'code', label: $t('code') },
{ width: '100%', name: 'name', label: $t('name') }, { width: 200, name: 'name', label: $t('name') },
{ width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() }, { width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() },
]" ]"
:viewer="{ :viewer="{
@ -107,7 +107,7 @@
'view', 'view',
]" ]"
:columns="[ :columns="[
{ width: '100%', name: 'name', label: $t('name'), sortable: false }, { width: 400, name: 'name', label: $t('name'), sortable: false },
{ width: 150, name: 'code', label: $t('code'), sortable: false }, { width: 150, name: 'code', label: $t('code'), sortable: false },
{ width: 60, name: 'version', label: $t('version'), sortable: false, align: 'right' }, { width: 60, name: 'version', label: $t('version'), sortable: false, align: 'right' },
{ {

4
io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue

@ -204,7 +204,7 @@
]" ]"
:columns="[ :columns="[
{ {
width: '100%', width: 250,
name: 'name', name: 'name',
label: $t('name'), label: $t('name'),
format: (value, row) => { format: (value, row) => {
@ -481,7 +481,7 @@
label: $t('valueType'), label: $t('valueType'),
format: Formater.enum(ValueTypeEnums), format: Formater.enum(ValueTypeEnums),
}, },
{ width: '100%', name: 'description', label: $t('description') }, { width: 200, name: 'description', label: $t('description') },
]" ]"
:editor="{ :editor="{
dialog: { dialog: {

2
io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue

@ -109,7 +109,7 @@
]" ]"
:columns="[ :columns="[
{ {
width: '100%', width: 300,
name: 'name', name: 'name',
label: $t('name'), label: $t('name'),
format: (value: any, row: any) => { format: (value: any, row: any) => {

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

@ -181,7 +181,7 @@
]" ]"
:columns="[ :columns="[
{ {
width: '100%', width: 250,
name: 'namec', name: 'namec',
label: $t('name'), label: $t('name'),
format: (value: any, row: any) => { format: (value: any, row: any) => {

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

@ -249,7 +249,7 @@
]" ]"
:columns="[ :columns="[
{ {
width: '100%', width: 400,
name: 'namec', name: 'namec',
label: $t('name'), label: $t('name'),
format: (value: any, row: any) => { format: (value: any, row: any) => {

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

@ -85,7 +85,7 @@
'export', 'export',
]" ]"
:columns="[ :columns="[
{ width: '100%', name: 'name', label: $t('name'), sortable: false }, { width: 220, name: 'name', label: $t('name'), sortable: false },
{ {
width: 80, width: 80,
name: 'category', name: 'category',

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

@ -166,7 +166,7 @@
'export', 'export',
]" ]"
:columns="[ :columns="[
{ width: '100%', name: 'name', label: $t('name') }, { width: 300, name: 'name', label: $t('name') },
{ width: 130, name: 'code', label: $t('code') }, { width: 130, name: 'code', label: $t('code') },
{ width: 100, name: 'type', label: $t('type'), format: EngineEnums.ParameterType.formater }, { width: 100, name: 'type', label: $t('type'), format: EngineEnums.ParameterType.formater },
{ {
@ -198,6 +198,59 @@
{ 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' },
{
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';
},
},
], ],
}, },
}" }"

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

@ -16,6 +16,9 @@ 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.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',
@ -34,6 +37,9 @@ 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 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;
@ -61,6 +67,9 @@ 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.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);

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

@ -49,6 +49,11 @@ 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 =_po; po =_po;
}else if(entity instanceof InSubOutParameterEntity) { }else if(entity instanceof InSubOutParameterEntity) {
@ -118,6 +123,12 @@ public class ParameterEntityConverter {
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) {

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

@ -2,11 +2,15 @@ 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.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.ParameterEntity;
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.entity.ParameterProcessorEntity; 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.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.*;
@ -20,6 +24,26 @@ 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")
@ -29,7 +53,12 @@ public class InOptionParameterEntity extends ParameterEntity {
public InOptionParameterVo toVo() { public InOptionParameterVo toVo() {
InOptionParameterVo vo =new InOptionParameterVo(); InOptionParameterVo vo =new InOptionParameterVo();
super.toVo(vo); super.toVo(vo);
this.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;
} }
@ -43,6 +72,36 @@ 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;
} }
@ -97,28 +156,4 @@ public class InOptionParameterEntity extends ParameterEntity {
} }
} }
} }
@Override
public String toString() {
return "InOptionParameterEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", valueType" + valueType
+ ", valueScale" + valueScale
+ ", valueRoundingMode" + valueRoundingMode
+ ", valueTypeIsList" + valueTypeIsList
+ ", defaultValue=" + defaultValue
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
} }

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

@ -2,6 +2,7 @@ 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;
@ -170,6 +171,16 @@ 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);
//通知其他实体进行相应的更新 //通知其他实体进行相应的更新
@ -247,6 +258,17 @@ 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);
} }

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

@ -1,14 +1,68 @@
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.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 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() {
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;
}
} }

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

@ -166,6 +166,13 @@
<column name="DEFAULT_VALUE_" type="NVARCHAR(255)" remarks="默认值"/> <column name="DEFAULT_VALUE_" type="NVARCHAR(255)" 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:系统自动导入)"/>

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.st.frontend", "name": "io.sc.engine.st.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.engine.st.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.ai.frontend", "name": "io.sc.platform.ai.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.ai.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

2
io.sc.platform.ai.frontend/src/i18n/messages.json

@ -6,7 +6,7 @@
"ai.chat.hello": "Hello! How can I assist you today?", "ai.chat.hello": "Hello! How can I assist you today?",
"ai.chat.action.newSession": "New Session", "ai.chat.action.newSession": "New Session",
"ai.chat.action.showThink": "Think", "ai.chat.action.showThink": "Show Think",
"ai.chat.action.notShowThink": "No Think", "ai.chat.action.notShowThink": "No Think",
"ai.chat.action.reSend": "Send the question again", "ai.chat.action.reSend": "Send the question again",
"ai.chat.action.form.model": "Model" "ai.chat.action.form.model": "Model"

24
io.sc.platform.ai.frontend/src/views/chat/Chat.vue

@ -42,7 +42,7 @@
<template #after> <template #after>
<div> <div>
<q-toolbar style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px"> <q-toolbar style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px">
<q-btn :label="$t('ai.chat.action.newSession')" flat dense icon="bi-chat-text" class="q-mr-sm" @click="newSession" /> <q-btn :label="$t('ai.chat.action.newSession')" no-caps flat dense icon="bi-chat-text" class="q-mr-sm" @click="newSession" />
<q-toggle v-model="showThinkRef" color="green" :label="showThinkRef ? $t('ai.chat.action.showThink') : $t('ai.chat.action.notShowThink')" /> <q-toggle v-model="showThinkRef" color="green" :label="showThinkRef ? $t('ai.chat.action.showThink') : $t('ai.chat.action.notShowThink')" />
</q-toolbar> </q-toolbar>
<q-input <q-input
@ -72,7 +72,7 @@ const questionRef = ref();
const questionHistoryRef = ref([]); const questionHistoryRef = ref([]);
const showThinkRef = ref(true); const showThinkRef = ref(true);
const messagesRef = reactive(new Map<string, object>()); const messagesRef = reactive(new Map<string, object>());
const imeRef = ref(false); const imeRef = ref(false); //
/** /**
* 当可垂直扩展的布局的高度发生变化时, 修改右边部分的总高度 * 当可垂直扩展的布局的高度发生变化时, 修改右边部分的总高度
@ -83,10 +83,21 @@ const sizeChanged = (args: any) => {
const sendMessage = (event: any) => { const sendMessage = (event: any) => {
if (imeRef.value) { if (imeRef.value) {
// ,
return; return;
} }
if (($q.platform.is.mac && event.metaKey) || ($q.platform.is.win && event.ctrlKey)) { if (($q.platform.is.mac && event.metaKey) || ($q.platform.is.win && event.ctrlKey)) {
questionRef.value = questionRef.value + '\n'; // 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; return;
} else { } else {
doSendMessage(questionRef.value); doSendMessage(questionRef.value);
@ -94,7 +105,10 @@ const sendMessage = (event: any) => {
}; };
const doSendMessage = async (message: string) => { const doSendMessage = async (message: string) => {
message = message && message.trim() ? message.trim() : null; if (!message) {
return;
}
message = message.trim();
if (!message) { if (!message) {
return; return;
} }
@ -149,7 +163,7 @@ const doSendMessage = async (message: string) => {
let content = decoder.decode(value); let content = decoder.decode(value);
if (showThinkRef.value) { if (showThinkRef.value) {
if (isThinking && content.indexOf('<think>') > -1) { if (isThinking && content.indexOf('<think>') > -1) {
content = content.replace('<think>', '思考中:'); content = content.replace('<think>', $t('thinking'));
} else if (isThinking && content.indexOf('</think>') > -1) { } else if (isThinking && content.indexOf('</think>') > -1) {
content = content.replace('</think>', '\n\n<div style="margin-top:8px;margin-bottom:8px;background-color:green;height:2px;"></div>\n\n'); content = content.replace('</think>', '\n\n<div style="margin-top:8px;margin-bottom:8px;background-color:green;height:2px;"></div>\n\n');
isThinking = false; isThinking = false;

29
io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/AiApi.java

@ -1,13 +1,8 @@
package io.sc.platform.ai.api; package io.sc.platform.ai.api;
import java.time.Duration;
public class AiApi { public class AiApi {
protected String url; protected String url;
protected String method; protected String method;
protected Duration connectTimeout =Duration.ofMinutes(2);
protected Duration readTimeout =Duration.ofMinutes(2);
protected Duration writeTimeout =Duration.ofMinutes(2);
public AiApi(){} public AiApi(){}
public AiApi(String url, String method){ public AiApi(String url, String method){
@ -30,28 +25,4 @@ public class AiApi {
public void setMethod(String method) { public void setMethod(String method) {
this.method = method; this.method = method;
} }
public Duration getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(Duration connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Duration getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
}
public Duration getWriteTimeout() {
return writeTimeout;
}
public void setWriteTimeout(Duration writeTimeout) {
this.writeTimeout = writeTimeout;
}
} }

8
io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/MessageWrapper.java

@ -1,11 +1,13 @@
package io.sc.platform.ai.api; package io.sc.platform.ai.api;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set;
public class MessageWrapper { public class MessageWrapper {
private String model; private String model;
private List<String> questions =new ArrayList<>(); private Set<String> questions =new LinkedHashSet<>();
public void addQuestion(String question){ public void addQuestion(String question){
this.questions.add(question); this.questions.add(question);
@ -19,11 +21,11 @@ public class MessageWrapper {
this.model = model; this.model = model;
} }
public List<String> getQuestions() { public Set<String> getQuestions() {
return questions; return questions;
} }
public void setQuestions(List<String> questions) { public void setQuestions(Set<String> questions) {
this.questions = questions; this.questions = questions;
} }
} }

6
io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java

@ -39,4 +39,10 @@ public interface ApiConfigurationService {
* @return AnythingLLM 默认工作空间 * @return AnythingLLM 默认工作空间
*/ */
public String getAnythingllmDefaultWorkspace(); public String getAnythingllmDefaultWorkspace();
/**
* 获取 AnythingLLM 对话模式
* @return AnythingLLM 对话模式
*/
public String getAnythingllmChatMode();
} }

6
io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java

@ -18,6 +18,7 @@ public class ApiConfigurationServiceImpl implements ApiConfigurationService {
private static final String KEY_ANYTHINGLLM_API_BASE_URL ="parameter.ai.provider.anythingllm.apiUrl"; private static final String KEY_ANYTHINGLLM_API_BASE_URL ="parameter.ai.provider.anythingllm.apiUrl";
private static final String KEY_ANYTHINGLLM_API_KEY ="parameter.ai.provider.anythingllm.apiKey"; private static final String KEY_ANYTHINGLLM_API_KEY ="parameter.ai.provider.anythingllm.apiKey";
private static final String KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY ="parameter.ai.provider.anythingllm.defaultWorkspace"; private static final String KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY ="parameter.ai.provider.anythingllm.defaultWorkspace";
private static final String KEY_ANYTHINGLLM_CHAT_MODE_KEY ="parameter.ai.provider.anythingllm.chatMode";
@Autowired private SystemParameterService systemParameterService; @Autowired private SystemParameterService systemParameterService;
@ -50,4 +51,9 @@ public class ApiConfigurationServiceImpl implements ApiConfigurationService {
public String getAnythingllmDefaultWorkspace() { public String getAnythingllmDefaultWorkspace() {
return systemParameterService.getParameter(KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY); return systemParameterService.getParameter(KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY);
} }
@Override
public String getAnythingllmChatMode() {
return systemParameterService.getParameter(KEY_ANYTHINGLLM_CHAT_MODE_KEY);
}
} }

12
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java

@ -4,10 +4,12 @@ import io.sc.platform.ai.api.AiApi;
public class AnythingllmApi extends AiApi { public class AnythingllmApi extends AiApi {
protected String apiKey; protected String apiKey;
protected String chatMode;
public AnythingllmApi(String url,String method,String apiKey) { public AnythingllmApi(String url,String method,String apiKey,String chatMode) {
super(url,method); super(url,method);
this.apiKey =apiKey; this.apiKey =apiKey;
this.chatMode =chatMode;
} }
public String getApiKey() { public String getApiKey() {
@ -17,4 +19,12 @@ public class AnythingllmApi extends AiApi {
public void setApiKey(String apiKey) { public void setApiKey(String apiKey) {
this.apiKey = apiKey; this.apiKey = apiKey;
} }
public String getChatMode() {
return chatMode;
}
public void setChatMode(String chatMode) {
this.chatMode = chatMode;
}
} }

3
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java

@ -20,7 +20,8 @@ public class AnythingllmServiceImpl implements AnythingllmService {
String baseUrl =apiConfigurationService.getAnythingllmApiBaseUrl(); String baseUrl =apiConfigurationService.getAnythingllmApiBaseUrl();
String apiKey =apiConfigurationService.getAnythingllmApiKey(); String apiKey =apiConfigurationService.getAnythingllmApiKey();
String defaultWorkspace=apiConfigurationService.getAnythingllmDefaultWorkspace(); String defaultWorkspace=apiConfigurationService.getAnythingllmDefaultWorkspace();
ChatApi api =new ChatApi(baseUrl,apiKey,defaultWorkspace); String chatMode=apiConfigurationService.getAnythingllmChatMode();
ChatApi api =new ChatApi(baseUrl,apiKey,defaultWorkspace,chatMode);
return api.execute(wrapper); return api.execute(wrapper);
} }

62
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java

@ -1,26 +1,26 @@
package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat; package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.platform.ai.api.MessageWrapper; import io.sc.platform.ai.api.MessageWrapper;
import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi; import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi;
import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.request.ChatRequest; import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.request.ChatRequest;
import io.sc.platform.security.util.SecurityUtil; import io.sc.platform.ai.util.*;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.UrlUtil; import io.sc.platform.util.UrlUtil;
import okhttp3.*; import okhttp3.Call;
import org.slf4j.Logger; import okhttp3.Headers;
import org.slf4j.LoggerFactory; import okhttp3.Request;
import okhttp3.RequestBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.util.List; import java.util.Set;
import java.util.UUID;
public class ChatApi extends AnythingllmApi { public class ChatApi extends AnythingllmApi {
private static final Logger log = LoggerFactory.getLogger(ChatApi.class);
public ChatApi(String baseUrl, String apiKey,String workspace){ public ChatApi(String baseUrl, String apiKey,String workspace, String chatMode){
super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspace/" + workspace + "/stream-chat"),"POST",apiKey); super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspace/" + workspace + "/stream-chat"),"POST",apiKey,chatMode);
this.apiKey =apiKey; this.apiKey =apiKey;
this.chatMode =chatMode;
} }
public ResponseBodyEmitter execute(MessageWrapper wrapper) { public ResponseBodyEmitter execute(MessageWrapper wrapper) {
@ -37,51 +37,25 @@ public class ChatApi extends AnythingllmApi {
private ChatRequest createChatRequest(MessageWrapper wrapper) { private ChatRequest createChatRequest(MessageWrapper wrapper) {
if(wrapper==null) { return null; } if(wrapper==null) { return null; }
List<String> questions =wrapper.getQuestions(); Set<String> questions =wrapper.getQuestions();
if(!CollectionUtil.hasElements(questions)){ return null; } if(!CollectionUtil.hasElements(questions)){ return null; }
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder("请部分适当引用原文回答,\n");
for(String question : questions){ for(String question : questions){
sb.append(question).append("\n"); sb.append(question).append("\n");
} }
ChatRequest request =new ChatRequest(); ChatRequest request =new ChatRequest();
request.setMode("chat"); request.setMode(this.chatMode);
request.setMessage(sb.toString()); request.setMessage(sb.toString());
request.setSessionId(SecurityUtil.getUserId()); request.setSessionId(UUID.randomUUID().toString());
return request; return request;
} }
private Call createRequestCall(ChatRequest chatRequest) { private Call createRequestCall(ChatRequest chatRequest) {
if(chatRequest==null) { return null; } if(chatRequest==null) { return null; }
Headers headers = HeadersUtil.streamWithAuthorization(apiKey);
OkHttpClient client = new OkHttpClient.Builder() RequestBody body = RequestBodyUtil.json(chatRequest);
.connectTimeout(this.connectTimeout) Request request = RequestUtil.post(this.url,headers,body);
.readTimeout(this.readTimeout) return CallUtil.newCall(request);
.writeTimeout(this.writeTimeout)
.build();
Headers headers = new Headers.Builder()
.add("Content-Type: application/json")
.add("Accept: text/event-stream")
.add("Authorization: Bearer " + apiKey)
.build();
String json ="";
try {
json = ObjectMapperUtil.json().writeValueAsString(chatRequest);
} catch (JsonProcessingException e){
log.error("",e);
return null;
}
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
log.info("[" + this.getMethod() + "]: " + this.url);
log.info(json);
okhttp3.Request request = new okhttp3.Request.Builder()
.url(this.url)
.headers(headers)
.post(body)
.build();
Call call = client.newCall(request);
return call;
} }
} }

20
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatCallback.java

@ -2,6 +2,7 @@ package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response.Message; import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response.Message;
import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response.Source;
import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatResponse; import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatResponse;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
@ -16,10 +17,13 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class ChatCallback implements Callback { public class ChatCallback implements Callback {
private ResponseBodyEmitter emitter; private ResponseBodyEmitter emitter;
private Map<String,String> sourceCache =new HashMap<>();
public ChatCallback(ResponseBodyEmitter emitter){ public ChatCallback(ResponseBodyEmitter emitter){
this.emitter =emitter; this.emitter =emitter;
@ -32,6 +36,7 @@ public class ChatCallback implements Callback {
@Override @Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
System.out.println("response");
if(response.isSuccessful()) { if(response.isSuccessful()) {
try (ResponseBody body = response.body()) { try (ResponseBody body = response.body()) {
BufferedSource bufferedSource = body.source(); BufferedSource bufferedSource = body.source();
@ -42,8 +47,23 @@ public class ChatCallback implements Callback {
} }
line =line.substring(5); line =line.substring(5);
Message message =ObjectMapperUtil.json().readValue(line, Message.class); Message message =ObjectMapperUtil.json().readValue(line, Message.class);
if(message.isClose()){
break;
}
List<Source> sources =message.getSources();
if(CollectionUtil.hasElements(sources)){
for(Source source : sources) {
sourceCache.put(source.getUrl(),source.getTitle());
}
}
emitter.send(message.getTextResponse()); emitter.send(message.getTextResponse());
} }
emitter.send("\n\n参考文献:\n\n");
for(Map.Entry<String,String> entry : sourceCache.entrySet()){
String url =entry.getKey();
url =url.replace("file:///","http://");
emitter.send("* [" + entry.getValue() + "](" + url + ")\n");
}
emitter.complete(); emitter.complete();
} catch (Exception e) { } catch (Exception e) {
emitter.completeWithError(e); emitter.completeWithError(e);

10
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java

@ -7,19 +7,19 @@ import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true) @JsonIgnoreProperties(ignoreUnknown=true)
public class Message { public class Message {
private String id; private String uuid;
private String type; private String type;
private String textResponse; private String textResponse;
private List<Source> sources =new ArrayList<>(); private List<Source> sources =new ArrayList<>();
private boolean close; private boolean close;
private String error; private String error;
public String getId() { public String getUuid() {
return id; return uuid;
} }
public void setId(String id) { public void setUuid(String uuid) {
this.id = id; this.uuid = uuid;
} }
public String getType() { public String getType() {

120
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java

@ -1,7 +1,127 @@
package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response; package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown=true) @JsonIgnoreProperties(ignoreUnknown=true)
public class Source { public class Source {
private String id;
private String url;
private String title;
private String docAuthor;
private String description;
private String docSource;
private String chunkSource;
private String published;
private int wordCount;
@JsonProperty("token_count_estimate")
private int tokenCountEstimate;
private String text;
@JsonProperty("_distance")
private double distance;
private double score;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDocAuthor() {
return docAuthor;
}
public void setDocAuthor(String docAuthor) {
this.docAuthor = docAuthor;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDocSource() {
return docSource;
}
public void setDocSource(String docSource) {
this.docSource = docSource;
}
public String getChunkSource() {
return chunkSource;
}
public void setChunkSource(String chunkSource) {
this.chunkSource = chunkSource;
}
public String getPublished() {
return published;
}
public void setPublished(String published) {
this.published = published;
}
public int getWordCount() {
return wordCount;
}
public void setWordCount(int wordCount) {
this.wordCount = wordCount;
}
public int getTokenCountEstimate() {
return tokenCountEstimate;
}
public void setTokenCountEstimate(int tokenCountEstimate) {
this.tokenCountEstimate = tokenCountEstimate;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
} }

29
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java

@ -3,6 +3,9 @@ package io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces;
import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi; import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi;
import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.Workspace; import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.Workspace;
import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.WorkspacesResponse; import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.WorkspacesResponse;
import io.sc.platform.ai.util.CallUtil;
import io.sc.platform.ai.util.HeadersUtil;
import io.sc.platform.ai.util.RequestUtil;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.UrlUtil; import io.sc.platform.util.UrlUtil;
@ -16,7 +19,7 @@ import java.util.List;
public class WorkspacesApi extends AnythingllmApi { public class WorkspacesApi extends AnythingllmApi {
public WorkspacesApi(String baseUrl, String apiKey){ public WorkspacesApi(String baseUrl, String apiKey){
super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspaces"),"GET",apiKey); super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspaces"),"GET",apiKey,null);
this.apiKey =apiKey; this.apiKey =apiKey;
} }
@ -46,26 +49,8 @@ public class WorkspacesApi extends AnythingllmApi {
} }
private Call createRequestCall() { private Call createRequestCall() {
OkHttpClient client = new OkHttpClient.Builder() Headers headers = HeadersUtil.authorization(apiKey);
.connectTimeout(this.connectTimeout) Request request = RequestUtil.get(this.url,headers);
.readTimeout(this.readTimeout) return CallUtil.newCall(request);
.writeTimeout(this.writeTimeout)
.build();
Request request = new Request.Builder()
.url(this.url)
.header("Authorization","Bearer " + apiKey)
.get()
.build();
Call call = client.newCall(request);
return call;
}
public static void main(String[] args) {
WorkspacesApi api =new WorkspacesApi("http://localhost:3001","8X0N9TN-HQ3MTVK-M4NM8BQ-W6EYE8A");
WorkspacesResponse workspacesResponse =api.execute();
for(Workspace workspace : workspacesResponse.getWorkspaces()){
System.out.println(workspace.getName());
}
} }
} }

46
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatApi.java

@ -1,20 +1,25 @@
package io.sc.platform.ai.provider.ollama.service.support.chat; package io.sc.platform.ai.provider.ollama.service.support.chat;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.platform.ai.api.AiApi; import io.sc.platform.ai.api.AiApi;
import io.sc.platform.ai.api.MessageWrapper; import io.sc.platform.ai.api.MessageWrapper;
import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatRequest; import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatRequest;
import io.sc.platform.ai.provider.ollama.service.support.chat.vo.Message; import io.sc.platform.ai.provider.ollama.service.support.chat.vo.Message;
import io.sc.platform.ai.util.CallUtil;
import io.sc.platform.ai.util.HeadersUtil;
import io.sc.platform.ai.util.RequestBodyUtil;
import io.sc.platform.ai.util.RequestUtil;
import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.UrlUtil; import io.sc.platform.util.UrlUtil;
import okhttp3.*; import okhttp3.Call;
import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.util.List; import java.util.Set;
public class ChatApi extends AiApi { public class ChatApi extends AiApi {
private static final Logger log = LoggerFactory.getLogger(ChatApi.class); private static final Logger log = LoggerFactory.getLogger(ChatApi.class);
@ -40,7 +45,7 @@ public class ChatApi extends AiApi {
String model =wrapper.getModel(); String model =wrapper.getModel();
if(!StringUtils.hasText(model)) { return null; } if(!StringUtils.hasText(model)) { return null; }
List<String> questions =wrapper.getQuestions(); Set<String> questions =wrapper.getQuestions();
if(!CollectionUtil.hasElements(questions)){ return null; } if(!CollectionUtil.hasElements(questions)){ return null; }
ChatRequest request =new ChatRequest(); ChatRequest request =new ChatRequest();
@ -55,32 +60,9 @@ public class ChatApi extends AiApi {
private Call createRequestCall(ChatRequest chatRequest) { private Call createRequestCall(ChatRequest chatRequest) {
if(chatRequest==null) { return null; } if(chatRequest==null) { return null; }
Headers headers = HeadersUtil.stream();
OkHttpClient client = new OkHttpClient.Builder() RequestBody body = RequestBodyUtil.json(chatRequest);
.connectTimeout(this.connectTimeout) Request request = RequestUtil.post(this.url,headers,body);
.readTimeout(this.readTimeout) return CallUtil.newCall(request);
.writeTimeout(this.writeTimeout)
.build();
Headers headers = new Headers.Builder()
.set("Content-Type", "application/json")
.set("Accept", "text/event-stream")
.build();
String json ="";
try {
json = ObjectMapperUtil.json().writeValueAsString(chatRequest);
} catch (JsonProcessingException e){
log.error("",e);
return null;
}
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
okhttp3.Request request = new okhttp3.Request.Builder()
.url(this.url)
.headers(headers)
.post(body)
.build();
Call call = client.newCall(request);
return call;
} }
} }

16
io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsApi.java

@ -1,6 +1,7 @@
package io.sc.platform.ai.provider.ollama.service.support.tags; package io.sc.platform.ai.provider.ollama.service.support.tags;
import io.sc.platform.ai.api.AiApi; import io.sc.platform.ai.api.AiApi;
import io.sc.platform.ai.util.*;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.UrlUtil; import io.sc.platform.util.UrlUtil;
import okhttp3.*; import okhttp3.*;
@ -26,17 +27,8 @@ public class TagsApi extends AiApi {
} }
private Call createRequestCall() { private Call createRequestCall() {
OkHttpClient client = new OkHttpClient.Builder() Headers headers = HeadersUtil.json();
.connectTimeout(this.connectTimeout) Request request = RequestUtil.get(this.url,headers);
.readTimeout(this.readTimeout) return CallUtil.newCall(request);
.writeTimeout(this.writeTimeout)
.build();
Request request = new Request.Builder()
.url(this.url)
.get()
.build();
Call call = client.newCall(request);
return call;
} }
} }

10
io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/CallUtil.java

@ -0,0 +1,10 @@
package io.sc.platform.ai.util;
import okhttp3.Call;
import okhttp3.Request;
public class CallUtil {
public static Call newCall(Request request){
return OkHttpClientUtil.build().newCall(request);
}
}

38
io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/HeadersUtil.java

@ -0,0 +1,38 @@
package io.sc.platform.ai.util;
import okhttp3.Headers;
public class HeadersUtil {
public static Headers stream(){
Headers headers = new Headers.Builder()
.add("Content-Type: application/json")
.add("Accept: text/event-stream")
.build();
return headers;
}
public static Headers authorization(String authorization){
Headers headers = new Headers.Builder()
.add("Content-Type: application/json")
.add("Authorization: Bearer " + authorization)
.build();
return headers;
}
public static Headers streamWithAuthorization(String authorization){
Headers headers = new Headers.Builder()
.add("Content-Type: application/json")
.add("Accept: text/event-stream")
.add("Authorization: Bearer " + authorization)
.build();
return headers;
}
public static Headers json(){
Headers headers = new Headers.Builder()
.add("Content-Type: application/json")
.build();
return headers;
}
}

18
io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/OkHttpClientUtil.java

@ -0,0 +1,18 @@
package io.sc.platform.ai.util;
import okhttp3.OkHttpClient;
import java.time.Duration;
public class OkHttpClientUtil {
public static OkHttpClient build(){
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(Duration.ofSeconds(60))
.readTimeout(Duration.ofSeconds(60))
.writeTimeout(Duration.ofSeconds(60))
.build();
client.dispatcher().setMaxRequests(64);
client.dispatcher().setMaxRequestsPerHost(6);
return client;
}
}

23
io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/RequestBodyUtil.java

@ -0,0 +1,23 @@
package io.sc.platform.ai.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.platform.util.ObjectMapperUtil;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RequestBodyUtil {
private static final Logger log = LoggerFactory.getLogger(RequestBodyUtil.class);
public static RequestBody json(Object data){
try {
String json = ObjectMapperUtil.json().writeValueAsString(data);
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
return body;
} catch (JsonProcessingException e){
log.error("",e);
return null;
}
}
}

23
io.sc.platform.ai/src/main/java/io/sc/platform/ai/util/RequestUtil.java

@ -0,0 +1,23 @@
package io.sc.platform.ai.util;
import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.RequestBody;
public class RequestUtil {
public static Request get(String url, Headers headers){
return new okhttp3.Request.Builder()
.url(url)
.headers(headers)
.get()
.build();
}
public static Request post(String url, Headers headers, RequestBody body){
return new okhttp3.Request.Builder()
.url(url)
.headers(headers)
.post(body)
.build();
}
}

16
io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json

@ -29,7 +29,7 @@
"id" :"parameter.ai.provider.default", "id" :"parameter.ai.provider.default",
"parentId" :"parameter.ai", "parentId" :"parameter.ai",
"code" :"parameter.ai.provider.default", "code" :"parameter.ai.provider.default",
"defaultValue" :"Ollama", "defaultValue" :"AnythingLLM",
"order" : 200, "order" : 200,
"options" : { "options" : {
"Ollama" : "parameter.ai.provider.default.options.ollama", "Ollama" : "parameter.ai.provider.default.options.ollama",
@ -88,7 +88,19 @@
"id" :"parameter.ai.provider.anythingllm.defaultWorkspace", "id" :"parameter.ai.provider.anythingllm.defaultWorkspace",
"parentId" :"parameter.ai.provider.anythingllm", "parentId" :"parameter.ai.provider.anythingllm",
"code" :"parameter.ai.provider.anythingllm.defaultWorkspace", "code" :"parameter.ai.provider.anythingllm.defaultWorkspace",
"defaultValue" :"", "defaultValue" :"workspace",
"order" : 300 "order" : 300
},
//AI //AnythingLLM/
{
"id" :"parameter.ai.provider.anythingllm.chatMode",
"parentId" :"parameter.ai.provider.anythingllm",
"code" :"parameter.ai.provider.anythingllm.chatMode",
"defaultValue" :"query",
"order" : 400,
"options" : {
"query" : "parameter.ai.provider.anythingllm.chatMode.options.query",
"chat" : "parameter.ai.provider.anythingllm.chatMode.options.chat"
}
} }
] ]

3
io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties

@ -16,3 +16,6 @@ parameter.ai.provider.anythingllm=AnythingLLM
parameter.ai.provider.anythingllm.apiUrl=Api URL parameter.ai.provider.anythingllm.apiUrl=Api URL
parameter.ai.provider.anythingllm.apiKey=Api Key parameter.ai.provider.anythingllm.apiKey=Api Key
parameter.ai.provider.anythingllm.defaultWorkspace=Default Workspace parameter.ai.provider.anythingllm.defaultWorkspace=Default Workspace
parameter.ai.provider.anythingllm.chatMode=Chat Mode
parameter.ai.provider.anythingllm.chatMode.options.query=Query
parameter.ai.provider.anythingllm.chatMode.options.chat=Chat

3
io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties

@ -16,3 +16,6 @@ parameter.ai.provider.anythingllm=AnythingLLM
parameter.ai.provider.anythingllm.apiUrl=Api URL parameter.ai.provider.anythingllm.apiUrl=Api URL
parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u9470 parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u9470
parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8A8D\u5DE5\u4F5C\u7A7A\u9593 parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8A8D\u5DE5\u4F5C\u7A7A\u9593
parameter.ai.provider.anythingllm.chatMode=\u5C0D\u8A71\u6A21\u5F0F
parameter.ai.provider.anythingllm.chatMode.options.query=Query
parameter.ai.provider.anythingllm.chatMode.options.chat=Chat

3
io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties

@ -17,3 +17,6 @@ parameter.ai.provider.anythingllm=AnythingLLM
parameter.ai.provider.anythingllm.apiUrl=Api URL parameter.ai.provider.anythingllm.apiUrl=Api URL
parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u94A5 parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u94A5
parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8BA4\u5DE5\u4F5C\u7A7A\u95F4 parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8BA4\u5DE5\u4F5C\u7A7A\u95F4
parameter.ai.provider.anythingllm.chatMode=\u5BF9\u8BDD\u6A21\u5F0F
parameter.ai.provider.anythingllm.chatMode.options.query=Query
parameter.ai.provider.anythingllm.chatMode.options.chat=Chat

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

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

3
io.sc.platform.core.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.48", "version": "8.2.50",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.core.frontend/template-project/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

154
io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<br /> <!-- <br />
<br /> <br />
<br /> <br />
<br /> <br />
@ -155,10 +155,22 @@
<br /> <br />
<br /> <br />
<br /> <br />
<br /> <br /> -->
<w-form <w-form
ref="formRef" ref="formRef"
v-model="formModel"
:fields="[ :fields="[
{
label: '分组1',
icon: 'home',
iconAttrs: {
color: 'red',
},
color: 'auto',
type: 'w-form-group',
colSpan: 'full',
colsNum: 2,
fields: [
{ {
name: 'test1', name: 'test1',
label: '文本框', label: '文本框',
@ -166,7 +178,6 @@
requiredIf: true, requiredIf: true,
rules: [ rules: [
(value) => { (value) => {
console.info('value====', value);
return true; return true;
}, },
], ],
@ -183,6 +194,18 @@
], ],
onUpdateValue: (args) => {}, onUpdateValue: (args) => {},
}, },
],
},
{
label: '分组2',
icon: 'home',
color: 'auto',
iconAttrs: {
color: 'green',
},
type: 'w-form-group',
colSpan: 'full',
fields: [
{ {
name: 'test2.5', name: 'test2.5',
label: '可输入可选择下拉框', label: '可输入可选择下拉框',
@ -202,6 +225,18 @@
console.info('value========', args); console.info('value========', args);
}, },
}, },
],
},
{
label: '分组3',
icon: 'home',
iconAttrs: {
color: 'orange',
},
color: 'auto',
type: 'w-form-group',
colSpan: 'full',
fields: [
{ {
name: 'test4', name: 'test4',
label: '日期', label: '日期',
@ -216,6 +251,14 @@
clearable: true, clearable: true,
requiredIf: true, requiredIf: true,
}, },
],
},
{
label: '分组4',
icon: 'home',
type: 'w-form-group',
colSpan: 'full',
fields: [
{ {
name: 'test5', name: 'test5',
label: '文件', label: '文件',
@ -227,7 +270,6 @@
label: '数字', label: '数字',
type: 'w-number', type: 'w-number',
precision: 2, precision: 2,
prefix: '¥',
colsFirst: true, colsFirst: true,
colSpan: 'full', colSpan: 'full',
requiredIf: (args) => { requiredIf: (args) => {
@ -239,7 +281,7 @@
}, },
{ {
name: 'test7', name: 'test7',
label: '密码', label: $t('password'),
type: 'w-password', type: 'w-password',
requiredIf: true, requiredIf: true,
}, },
@ -249,6 +291,19 @@
type: 'w-icon', type: 'w-icon',
requiredIf: true, requiredIf: true,
}, },
],
},
{
label: '分组5',
icon: 'home',
color: 'auto',
iconAttrs: {
color: 'yellow',
},
type: 'w-form-group',
colSpan: 2,
colsNum: 2,
fields: [
{ {
name: 'test9', name: 'test9',
label: '页面位置', label: '页面位置',
@ -261,6 +316,19 @@
type: 'w-color-input', type: 'w-color-input',
requiredIf: true, requiredIf: true,
}, },
],
},
{
label: '分组6',
icon: 'home',
color: 'auto',
iconAttrs: {
color: 'blue',
},
type: 'w-form-group',
colSpan: '2',
colsNum: 2,
fields: [
{ {
name: 'test11', name: 'test11',
label: '颜色2', label: '颜色2',
@ -280,6 +348,8 @@
{ label: '看书', value: '4' }, { label: '看书', value: '4' },
], ],
}, },
],
},
{ {
name: 'test12.5', name: 'test12.5',
label: '单选按钮', label: '单选按钮',
@ -332,6 +402,26 @@
type: 'w-user-select', type: 'w-user-select',
multiple: true, multiple: true,
requiredIf: true, requiredIf: true,
// orgQueryCriteria: {
// operator: 'or',
// criteria: [
// {
// fieldName: 'id',
// operator: 'equals',
// value: 'bd49307c-32c1-47a0-9454-14f460f875ef',
// },
// {
// fieldName: 'parent',
// operator: 'equals',
// value: 'bd49307c-32c1-47a0-9454-14f460f875ef',
// },
// ],
// },
// roleQueryCriteria: {
// fieldName: 'code',
// operator: 'equals',
// value: 'KHJL',
// },
}, },
{ {
name: 'test15', name: 'test15',
@ -339,6 +429,12 @@
type: 'w-org-select', type: 'w-org-select',
requiredIf: true, requiredIf: true,
}, },
{
name: 'test155',
label: '角色选择',
type: 'w-role-select',
requiredIf: true,
},
{ {
name: 'test16', name: 'test16',
label: 'cron表达式', label: 'cron表达式',
@ -383,12 +479,15 @@
> >
</w-form> </w-form>
<q-btn label="提交" @click="submit"></q-btn>&nbsp; <q-btn label="重置" @click="reset"></q-btn>&nbsp; <q-btn label="提交" @click="submit"></q-btn>&nbsp; <q-btn label="重置" @click="reset"></q-btn>&nbsp;
<q-btn label="初始化值" @click="setValue"></q-btn>&nbsp; <q-btn label="初始化值" @click="setValue"></q-btn>&nbsp;<q-btn label="api测试" @click="apiTest"></q-btn> &nbsp;<q-btn
label="清除错误"
@click="resetValidate"
></q-btn>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, computed } from 'vue'; import { ref, reactive, computed } from 'vue';
import { Environment, Formater } from '@/platform'; import { Environment, Formater, $t } from '@/platform';
const mode = ref('criteria'); const mode = ref('criteria');
const booleanModelValue = ref(false); const booleanModelValue = ref(false);
@ -416,9 +515,11 @@ const objectModelValue = ref({
const queryBuilderRef = ref(); const queryBuilderRef = ref();
const formRef = ref(); const formRef = ref();
const formModel = reactive({});
const submit = async () => { const submit = async () => {
console.info('表单数据:', formRef.value.getData()); formModel['test6'] = 888;
console.info('表单数据====', formRef.value.getData());
const validateResult = await formRef.value.validate(); const validateResult = await formRef.value.validate();
console.info('表单验证结果:', validateResult); console.info('表单验证结果:', validateResult);
}; };
@ -434,7 +535,44 @@ const setValue = () => {
ky: true, ky: true,
sex: 1, sex: 1,
addr: '上海市', addr: '上海市',
test6: 455,
}; };
formRef.value.setData(data); formRef.value.setData(data);
}; };
const apiTest = () => {
// formRef.value.setStatus('dddd');
// const status = formRef.value.getStatus();
// console.info('status=====', status);
// formRef.value.setFieldValue('test6', 88888);
// const fieldValue = formRef.value.getFieldValue('test6');
// console.info('fieldValue====', fieldValue);
// const colsNum = formRef.value.getColsNum();
// console.info('colsNum====', colsNum);
// const fieldRef = formRef.value.getFieldComponent('test6');
// console.info('fieldRef======', fieldRef);
const fields = formRef.value.getFields();
fields['test2'].options = [{ label: 'ddd', value: 3 }];
console.info('fields=========', fields);
// const errors = [
// {
// fieldName: 'test6',
// errorMessageI18nKey: 'password',
// },
// {
// fieldName: 'test1',
// errorMessage: '',
// },
// ];
// formRef.value.setValidationErrors(errors);
// formRef.value.resetValidation();
};
const resetValidate = () => {
formRef.value.resetValidation();
};
</script> </script>

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

@ -1,21 +1,227 @@
<template> <template>
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1" style="height: 100%">
<w-grid <w-grid
title="用户列表" ref="roleGridRef"
:checkbox-selection="false" :title="$t('system.role.grid.title')"
:fetch-data-url="Environment.apiContextPath('/api/system/user')" :config-button="true"
:pageable="false" selection="multiple"
:toolbar-actions="['query', 'reset']" db-click-operation="edit"
:query-form-fields="[{ name: 'lastModifyDate', label: $t('lastModifyDate'), type: 'w-date-range' }]" :checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/role')"
:pagination="{
sortBy: 'name',
descending: false,
}"
:query-form-cols-num="3"
:query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'name', label: $t('name'), type: 'w-text' },
{ name: 'enable', label: $t('isEnable'), type: 'w-select', options: Options.yesNo() },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[ :columns="[
{ name: 'loginName', label: $t('loginName') }, { width: 200, name: 'code', label: $t('code') },
{ name: 'userName', label: $t('userName') }, { width: '100%', name: 'name', label: $t('name') },
{ width: 70, name: 'enable', label: $t('status'), align: 'center', format: Formater.enableTag() },
{ {
name: 'lastModifyDate', width: 200,
label: $t('lastModifyDate'), name: 'corporationCode',
label: $t('corporation'),
showIf: SessionManager.isPrimaryCorporation(),
format: (value) => {
return corporationMapRef[value];
},
}, },
]" ]"
></w-grid> :editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'code', label: $t('code'), type: 'w-text', requiredIf: true },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-textarea', rows: 1 },
{
name: 'corporationCode',
label: $t('corporation'),
type: 'w-select',
options: corporationOptionRef,
showIf: () => {
return SessionManager.isPrimaryCorporation();
},
},
{ name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable'), format: Formater.none() },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="
(args) => {
refreshRelationshipComponents(args.row.id);
}
"
@before-request-data="
() => {
menuTreeGridRef?.clear();
userGridRef?.clear();
}
"
>
</w-grid>
</div>
</template>
<template #after>
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="menu" icon="bi-menu-app" :label="$t('menu')" />
<q-tab name="user" icon="bi-person" :label="$t('user')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="menu" class="px-0 pb-0" style="height: 100%; padding-left: 0px; padding-right: 0px; padding-bottom: 0px">
<SelectMenuTreeGrid
ref="menuTreeGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/menu/listAllMenusWithSelectedStatusByRole')"
foreign-key="roleId"
:foreign-value="currentSelectedRoleId"
@update="update"
></SelectMenuTreeGrid>
</q-tab-panel>
<q-tab-panel name="user" class="px-0 pb-0" style="height: 100%; padding-left: 0px; padding-right: 0px; padding-bottom: 0px">
<SelectUserGrid
ref="userGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByRole')"
:fetch-other-data-url="Environment.apiContextPath('/api/system/user/queryOtherUsersByRole')"
foreign-key="roleId"
:foreign-value="currentSelectedRoleId"
@select-in="selectIn"
@select-out="selectOut"
@select-all-in="selectAllIn"
@select-all-out="selectAllOut"
>
</SelectUserGrid>
</q-tab-panel>
</q-tab-panels>
</div>
</template>
</q-splitter>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Environment, Formater, $t } from '@/platform'; import { ref, onActivated } from 'vue';
import { Environment, axios, Options, Formater, SessionManager } from '@/platform';
import SelectUserGrid from './SelectUserGrid.vue';
import SelectMenuTreeGrid from './SelectMenuTreeGrid.vue';
const corporationMapRef = ref({});
const corporationOptionRef = ref([]);
const roleGridRef = ref();
const userGridRef = ref();
const menuTreeGridRef = ref();
const selectedTabRef = ref('menu');
const currentSelectedRoleId = ref('');
const refreshRelationshipComponents = (id) => {
currentSelectedRoleId.value = id;
menuTreeGridRef.value?.refresh();
userGridRef.value?.refresh();
};
const selectIn = (ids: string[], gridComponent, dialogComponent) => {
axios
.post(Environment.apiContextPath('/api/system/role/addUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: ids,
})
.then(() => {
gridComponent?.refresh();
dialogComponent?.close();
});
};
const selectOut = (ids, gridComponent) => {
axios
.post(Environment.apiContextPath('/api/system/role/removeUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: ids,
})
.then(() => {
gridComponent?.refresh();
});
};
const selectAllIn = (gridComponent) => {
axios
.post(Environment.apiContextPath('/api/system/role/addAllUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: [],
})
.then(() => {
gridComponent?.refresh();
});
};
const selectAllOut = (gridComponent) => {
axios
.post(Environment.apiContextPath('/api/system/role/removeAllUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: [],
})
.then(() => {
gridComponent?.refresh();
});
};
const update = (ids, gridComponent) => {
axios
.post(Environment.apiContextPath('/api/system/role/updateMenus'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: ids,
})
.then(() => {
gridComponent.refresh();
});
};
onActivated(() => {
menuTreeGridRef.value?.refresh();
userGridRef.value?.refresh();
if (SessionManager.isPrimaryCorporation()) {
axios.get(Environment.apiContextPath('/api/system/corporation?pageable=false')).then((response) => {
const options = [];
const corporationMap = {};
if (response.data?.content && response.data?.content.length > 0) {
for (const item of response.data.content) {
options.push({ label: item.name, value: item.code });
corporationMap[item.code] = item.name;
}
}
corporationOptionRef.value = options;
corporationMapRef.value = corporationMap;
});
}
});
</script> </script>

125
io.sc.platform.core.frontend/template-project/src/views/likm/SelectMenuTreeGrid.vue

@ -0,0 +1,125 @@
<template>
<w-grid
ref="treeGridRef"
:title="$t('system.shared.selectMenu.grid.title')"
hide-bottom
:config-button="false"
:tree="true"
selection="multiple"
:checkbox-selection="true"
tree-tick-strategy="strict"
:tree-icon="
(row) => {
if (row.type === 'SEPARATOR') {
return { name: 'bi-dash-lg' };
} else if (row.type === 'ROUTE_ACTION') {
return { name: 'sym_o_crop_16_9' };
} else {
return { name: row.icon };
}
}
"
:fetch-data-url="fetchDataUrl + '?' + foreignKey + '=' + foreignValue"
:auto-fetch-data="true"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
{
extend: 'expand',
enableIf: () => {
return foreignValue && treeGridRef?.getRows()?.length > 0;
},
},
{
name: 'save',
label: $t('save'),
icon: 'bi-floppy',
enableIf: () => {
return foreignValue && treeGridRef?.getRows()?.length > 0;
},
click: (arg) => {
DialogManager.confirm($t('system.shared.selectMenu.grid.toolbar.save.tip'), () => {
const ids = Tools.extractProperties(treeGridRef.getTickedRows(true), 'id');
emit('update', ids, treeGridRef);
});
},
},
'separator',
'view',
]"
:columns="[
{
width: '100%',
name: 'titleI18nKey',
label: $t('name'),
sortable: false,
format: (value, row) => {
if (row.type === 'SEPARATOR') {
return `<hr style='width:100px'/>`;
} else if (row.type === 'ROUTE_ACTION') {
return $t(row.i18nKey);
} else {
return $t(value);
}
},
},
{ width: 70, name: 'enable', label: $t('status'), format: Formater.enableTag(), sortable: false },
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'type', label: $t('type') },
{ name: 'name', label: $t('name') },
{ name: 'titleI18nKey', label: $t('titleI18nKey') },
{ name: 'icon', label: $t('icon') },
{ name: 'enable', label: $t('enable') },
{ name: 'order', label: $t('order') },
{ name: 'javaScript', label: $t('javaScript') },
{ name: 'url', label: $t('url') },
{ name: 'urlOpenType', label: $t('urlOpenType') },
{ name: 'routeName', label: $t('routeName') },
{ name: 'routeQuery', label: $t('routeQuery') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate') },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
></w-grid>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DialogManager, Formater, Tools } from '@/platform';
defineProps({
fetchDataUrl: { type: String, default: '' },
foreignKey: { type: String, default: '' },
foreignValue: { type: String, default: '' },
});
const emit = defineEmits<{
(e: 'update', ids: string[], gridComponent: any): void;
}>();
const treeGridRef = ref();
const refresh = () => {
treeGridRef.value?.refresh();
};
const clear = () => {
treeGridRef.value?.setLocalData([]);
};
defineExpose({
refresh,
clear,
});
</script>

66
io.sc.platform.core.frontend/template-project/src/views/likm/SelectUserDialog.vue

@ -1,7 +1,7 @@
<template> <template>
<w-dialog <w-dialog
ref="dialogRef" ref="dialogRef"
:title="$t('system.role.selectUser.dialog.title')" :title="$t('system.shared.selectUser.dialog.title')"
width="800px" width="800px"
height="500px" height="500px"
:can-maximize="false" :can-maximize="false"
@ -9,58 +9,53 @@
{ {
label: $t('confirm'), label: $t('confirm'),
click: () => { click: () => {
const userIds = Tools.extractProperties(gridRef.getSelectedRows(), 'id'); const ids = Tools.extractProperties(gridRef.getSelectedRows(), 'id');
axios emit('afterSelected', ids, dialogRef);
.post(Environment.apiContextPath('/api/system/role/addUsers'), {
one: roleId,
many: userIds,
})
.then((response) => {
userGridRef?.refresh();
close();
});
}, },
}, },
]" ]"
> >
<div class="px-2"> <div class="px-2" style="height: 100%">
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('system.user.grid.title')" :title="$t('system.shared.selectUser.dialog.grid.title')"
selection="multiple" selection="multiple"
:full-screen-button="false" :full-screen-button="false"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh']" :toolbar-actions="['query', 'refresh']"
:query-form-fields="[ :query-form-fields="[
{ name: 'loginName', label: $t('loginName'), type: 'text' }, { name: 'loginName', label: $t('loginName'), type: 'w-text' },
{ name: 'userName', label: $t('userName'), type: 'text' }, { name: 'userName', label: $t('userName'), type: 'w-text' },
{ {
name: 'enable', name: 'enable',
label: $t('enable'), label: $t('enable'),
type: 'select', type: 'w-select',
options: Options.yesNo(), options: Options.yesNo(),
queryOperator: 'equals', queryOperator: 'equals',
}, },
{ {
name: 'dataComeFrom', name: 'dataComeFrom',
label: $t('dataComeFrom'), label: $t('dataComeFrom'),
type: 'select', type: 'w-select',
options: Options.enum(DataComeFromEnum), options: Options.enum(DataComeFromEnum),
queryOperator: 'equals', queryOperator: 'equals',
}, },
]" ]"
:auto-fetch-data="false" :auto-fetch-data="false"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryOtherUsersByRole?roleId=' + roleId)" :fetch-data-url="fetchDataUrl + '?' + foreignKey + '=' + foreignValue"
:columns="[ :columns="[
{ name: 'loginName', label: $t('loginName') }, { width: 100, name: 'loginName', label: $t('loginName') },
{ name: 'userName', label: $t('userName') }, { width: 100, name: 'userName', label: $t('userName') },
{ {
name: 'status', name: 'status',
label: t('status'), label: $t('status'),
format: Formater.enableTag(), format: (value, row) => {
return {
componentType: UserStatusTag,
attrs: row,
};
},
}, },
{ name: 'lastModifier', label: t('lastModifier') },
{ name: 'lastModifyDate', label: t('lastModifyDate'), format: Formater.dateOnly() },
]" ]"
></w-grid> ></w-grid>
</div> </div>
@ -69,17 +64,28 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, nextTick } from 'vue'; import { ref, nextTick } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { axios, Environment, Tools, EnumTools, Options, Formater } from '@/platform'; import { Environment, Tools, EnumTools, Options, Formater } from '@/platform';
import UserStatusTag from './UserStatusTag.vue';
const props = defineProps({
opener: { type: Object, default: undefined },
fetchDataUrl: { type: String, default: '' },
foreignKey: { type: String, default: '' },
foreignValue: { type: String, default: '' },
});
const emit = defineEmits<{
(e: 'afterSelected', ids: string[], dialogComponent: any): void;
}>();
const { t } = useI18n(); const { t } = useI18n();
const dialogRef = ref(); const dialogRef = ref();
const gridRef = ref(); const gridRef = ref();
let roleId, userGridRef; const foreignKeyRef = ref();
const open = (param: object) => {
roleId = param.roleId;
userGridRef = param.userGrid;
const open = (foreignKey: string) => {
foreignKeyRef.value = foreignKey;
dialogRef.value.show(); dialogRef.value.show();
nextTick(() => { nextTick(() => {

165
io.sc.platform.core.frontend/template-project/src/views/likm/SelectUserGrid.vue

@ -0,0 +1,165 @@
<template>
<w-grid
ref="gridRef"
:title="$t('system.shared.selectUser.grid.title')"
:config-button="false"
selection="multiple"
:checkbox-selection="true"
:fetch-data-url="fetchDataUrl + '?' + foreignKey + '=' + foreignValue"
:auto-fetch-data="true"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
{
name: 'selectIn',
label: $t('system.shared.selectUser.grid.toolbar.selectIn'),
icon: 'bi-download',
enableIf: () => {
return foreignValue ? true : false;
},
click: () => {
dialogRef.open(foreignValue);
},
},
{
name: 'selectOut',
label: $t('system.shared.selectUser.grid.toolbar.selectOut'),
icon: 'bi-upload',
enableIf: () => {
return foreignValue && gridRef?.getSelectedRows()?.length > 0;
},
click: (arg) => {
const ids = Tools.extractProperties(arg.selecteds, 'id');
DialogManager.confirm($t('system.shared.selectUser.grid.toolbar.selectOut.tip'), () => {
emit('selectOut', ids, gridRef);
});
},
},
'separator',
{
name: 'selectAllIn',
label: $t('system.shared.selectUser.grid.toolbar.selectAllIn'),
icon: 'bi-box-arrow-in-down',
enableIf: () => {
return foreignValue ? true : false;
},
click: () => {
DialogManager.confirm($t('system.shared.selectUser.grid.toolbar.selectAllIn.tip'), () => {
emit('selectAllIn', gridRef);
});
},
},
{
name: 'selectAllOut',
label: $t('system.shared.selectUser.grid.toolbar.selectAllOut'),
icon: 'bi-box-arrow-up',
enableIf: () => {
return foreignValue && gridRef?.getRows()?.length > 0;
},
click: () => {
DialogManager.confirm($t('system.shared.selectUser.grid.toolbar.selectAllOut.tip'), () => {
emit('selectAllOut', gridRef);
});
},
},
'separator',
'view',
]"
:columns="[
{ width: 150, name: 'loginName', label: $t('loginName') },
{ width: '100%', name: 'userName', label: $t('userName') },
{
width: 150,
name: 'enable',
label: $t('status'),
format: (value, row) => {
return {
componentType: UserStatusTag,
attrs: row,
};
},
},
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'loginName', label: $t('loginName') },
{ name: 'userName', label: $t('userName') },
{ name: 'description', label: $t('description') },
{
name: 'enable',
label: $t('enable'),
format: (value) => {
return value;
},
},
{ name: 'accountExpired', label: $t('accountExpired') },
{ name: 'accountLocked', label: $t('accountLocked') },
{ name: 'credentialsExpired', label: $t('credentialsExpired') },
{ name: 'email', label: $t('email') },
{ name: 'phone', label: $t('phone') },
{ name: 'mobile', label: $t('mobile') },
{ name: 'weixin', label: $t('weixin') },
{ name: 'qq', label: $t('qq') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate') },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
></w-grid>
<SelectUserDialog
ref="dialogRef"
:opener="gridRef"
:fetch-data-url="fetchOtherDataUrl"
:foreign-key="foreignKey"
:foreign-value="foreignValue"
@after-selected="
(ids: string[]) => {
emit('selectIn', ids, gridRef, dialogRef);
}
"
></SelectUserDialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { DialogManager, Tools } from '@/platform';
import SelectUserDialog from './SelectUserDialog.vue';
import UserStatusTag from './UserStatusTag.vue';
defineProps({
fetchDataUrl: { type: String, default: '' },
fetchOtherDataUrl: { type: String, default: '' },
foreignKey: { type: String, default: '' },
foreignValue: { type: String, default: '' },
});
const emit = defineEmits<{
(e: 'selectIn', ids: string[], gridComponent: any, dialogComponent: any): void;
(e: 'selectOut', ids: string[], gridComponent: any): void;
(e: 'selectAllIn', gridComponent: any): void;
(e: 'selectAllOut', gridComponent: any): void;
}>();
const gridRef = ref();
const dialogRef = ref();
const refresh = () => {
gridRef.value?.refresh();
};
const clear = () => {
gridRef.value?.setLocalData([]);
};
defineExpose({
refresh,
clear,
});
</script>

1
io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue

@ -7,7 +7,6 @@
:fetch-data-url="Environment.apiContextPath('api/system/menu/allMenus')" :fetch-data-url="Environment.apiContextPath('api/system/menu/allMenus')"
:tree="true" :tree="true"
db-click-operation="expand" db-click-operation="expand"
dnd-mode="server"
:columns="[ :columns="[
{ {
name: 'name', name: 'name',

2
io.sc.platform.core.frontend/template-project/src/views/testcase/ai/Ai.vue

@ -99,7 +99,7 @@ const doSendMessage = async (message: string) => {
}); });
// //
const url = Environment.apiContextPath('/api/ai/ollama/chat'); const url = Environment.apiContextPath('/api/ai/chat');
// //
const headers = Fetch.buildHeaders(); const headers = Fetch.buildHeaders();
if (!Fetch.isAuthorization(url)) { if (!Fetch.isAuthorization(url)) {

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties

@ -255,4 +255,5 @@ rowNumber=Row Number
tab=Tab tab=Tab
ai=Artificial Intelligence ai=Artificial Intelligence
aiChat=AI Chat aiChat=AI Chat
thinking=Thinking:
errorOccurred=An Error Occurred errorOccurred=An Error Occurred

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties

@ -255,4 +255,5 @@ rowNumber=\u884C\u865F
tab=\u7E2E\u9032 tab=\u7E2E\u9032
ai=\u4EBA\u5DE5\u667A\u80FD ai=\u4EBA\u5DE5\u667A\u80FD
aiChat=AI \u5C0D\u8A71 aiChat=AI \u5C0D\u8A71
thinking=\u601D\u8003\u4E2D:
errorOccurred=\u767C\u751F\u932F\u8AA4 errorOccurred=\u767C\u751F\u932F\u8AA4

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties

@ -255,4 +255,5 @@ rowNumber=\u884C\u53F7
tab=\u7F29\u8FDB tab=\u7F29\u8FDB
ai=\u4EBA\u5DE5\u667A\u80FD ai=\u4EBA\u5DE5\u667A\u80FD
aiChat=AI \u5BF9\u8BDD aiChat=AI \u5BF9\u8BDD
thinking=\u601D\u8003\u4E2D:
errorOccurred=\u53D1\u751F\u9519\u8BEF errorOccurred=\u53D1\u751F\u9519\u8BEF

4
io.sc.platform.developer.doc/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.developer.doc", "name": "io.sc.platform.developer.doc",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15" "vuepress": "2.0.0-rc.15"
}, },
"dependencies": { "dependencies": {
"platform-core": "8.2.48", "platform-core": "8.2.50",
"quasar": "2.17.6", "quasar": "2.17.6",
"vue": "3.5.13", "vue": "3.5.13",
"vue-i18n": "11.0.1" "vue-i18n": "11.0.1"

4
io.sc.platform.developer.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.developer.frontend", "name": "io.sc.platform.developer.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.developer.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.platform.lcdp.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.lcdp.frontend", "name": "io.sc.platform.lcdp.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.lcdp.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.platform.license.keygen.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.license.keygen.frontend", "name": "io.sc.platform.license.keygen.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.license.keygen.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.platform.mvc.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.mvc.frontend", "name": "io.sc.platform.mvc.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.mvc.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.platform.scheduler.manager.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.scheduler.manager.frontend", "name": "io.sc.platform.scheduler.manager.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.scheduler.manager.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.platform.system.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.system.frontend", "name": "io.sc.platform.system.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.platform.system.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

10
io.sc.platform.util/src/main/java/io/sc/platform/util/TernaryUtil.java

@ -0,0 +1,10 @@
package io.sc.platform.util;
/**
* 三元操作辅助类
*/
public class TernaryUtil {
public static <T> T nullValue(T value, T nullValue){
return value==null?nullValue:value;
}
}

4
io.sc.standard.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.standard.frontend", "name": "io.sc.standard.frontend",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -112,7 +112,7 @@
"node-sql-parser": "5.3.6", "node-sql-parser": "5.3.6",
"pinia": "2.3.0", "pinia": "2.3.0",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.48", "platform-core": "8.2.50",
"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",

3
io.sc.standard.frontend/public/engine.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-browser-edge" viewBox="0 0 16 16">
<path d="M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

4
io.sc.website/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.website", "name": "io.sc.website",
"version": "8.2.10", "version": "8.2.11",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@ -28,6 +28,6 @@
}, },
"dependencies": { "dependencies": {
"vue": "3.5.13", "vue": "3.5.13",
"platform-core": "8.2.48" "platform-core": "8.2.50"
} }
} }
Loading…
Cancel
Save