Browse Source

基础框架发布: 8.2.32

1) 支持回退时返回给原处理人, 提交时选择任务候选处理人
  2) 支持定性选项补录控件的配置
  3)支持参数属性 MODIFY_IF 补录控件配置
  4)修改流程创建时,更新流程实例扩展表的机制,采用 start 监听

前端核心发布: 8.2.123
 1) 首页任务列表增加按日期倒序
 2)修改了用户选择机构的操作模式
main
wangshaoping 1 month ago
parent
commit
6d414ba51e
  1. 12
      README.adoc
  2. 2
      build.gradle
  3. 2
      cips.frontend/package.json
  4. 2
      erm.frontend/package.json
  5. 4
      gradle.properties
  6. 2
      io.sc.engine.mv.frontend/package.json
  7. 65
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java
  8. 8
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java
  9. 2
      io.sc.engine.rule.frontend/package.json
  10. 19
      io.sc.engine.rule.frontend/src/i18n/messages.json
  11. 19
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  12. 19
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  13. 181
      io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue
  14. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue
  15. 307
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  16. 10
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/initializer/RuleEngineWorkFlowInitializer.java
  17. 3
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java
  18. 18
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java
  19. 158
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java
  20. 117
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java
  21. 13
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InOptionParameterEntity.java
  22. 25
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterInOptionAdditionServiceImpl.java
  23. 65
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java
  24. 12
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java
  25. 14
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml
  26. 36
      io.sc.engine.rule.server/src/main/resources/workflow/io/sc/engine/rule/Sample.bpmn
  27. 2
      io.sc.engine.st.frontend/package.json
  28. 2
      io.sc.platform.ai.frontend/package.json
  29. 2
      io.sc.platform.core.frontend/package.json
  30. 2
      io.sc.platform.core.frontend/src/platform/views/home/MyDoneTask.vue
  31. 4
      io.sc.platform.core.frontend/template-project/package.json
  32. 2
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  33. 2
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  34. 2
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties
  35. 2
      io.sc.platform.developer.doc/package.json
  36. 2
      io.sc.platform.developer.frontend/package.json
  37. 69
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/extension/listener/start/ProcessStartListener.java
  38. 45
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java
  39. 3
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/components.json
  40. 2
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/parameters.json
  41. 120
      io.sc.platform.flowable/src/main/resources/io/sc/platform/flowable/sample/Sample.bpmn
  42. 28
      io.sc.platform.flowable/src/main/resources/io/sc/platform/flowable/sample/Sample.bpmn20.xml
  43. 2
      io.sc.platform.lcdp.frontend/package.json
  44. 1
      io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue
  45. 2
      io.sc.platform.license.keygen.frontend/package.json
  46. 2
      io.sc.platform.mvc.frontend/package.json
  47. 2
      io.sc.platform.scheduler.manager.frontend/package.json
  48. 2
      io.sc.platform.system.frontend/package.json
  49. 8
      io.sc.platform.system.frontend/src/i18n/messages.json
  50. 8
      io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json
  51. 8
      io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json
  52. 87
      io.sc.platform.system.frontend/src/views/shared/SelectOrgTreeDialog.vue
  53. 48
      io.sc.platform.system.frontend/src/views/shared/SelectOrgTreeGrid.vue
  54. 26
      io.sc.platform.system.frontend/src/views/user/User.vue
  55. 3
      io.sc.platform.system/src/main/java/io/sc/platform/system/org/controller/OrgWebController.java
  56. 22
      io.sc.platform.system/src/main/java/io/sc/platform/system/org/service/impl/OrgServiceImpl.java
  57. 2
      io.sc.standard.frontend/package.json
  58. 2
      io.sc.website/package.json
  59. 2
      wra.report.frontend/package.json

12
README.adoc

@ -1,3 +1,15 @@
. 用户管理功能中,设置用户机构时,机构树直接展示已经选择的机构,新增“选入”、“选出”功能,用于修改机构 . 用户管理功能中,设置用户机构时,机构树直接展示已经选择的机构,新增“选入”、“选出”功能,用于修改机构
. 用户管理功能中,可修改设置用户所属默认机构,默认角色等 . 用户管理功能中,可修改设置用户所属默认机构,默认角色等
. .
DDL:
1. 给 RE_MODEL_PARAMETER_ADDITION 表增加字段
ALTER TABLE RE_MODEL_PARAMETER_ADDITION ADD LABEL_ varchar(255) NULL COMMENT '组件标题';
ALTER TABLE RE_MODEL_PARAMETER_ADDITION ADD VALUE_SCALE_ SMALLINT NULL COMMENT '精度(小数位数)';
ALTER TABLE RE_MODEL_PARAMETER_ADDITION ADD MIN_VALUE_ varchar(255) NULL COMMENT '最小值(包含)';
ALTER TABLE RE_MODEL_PARAMETER_ADDITION ADD MAX_VALUE_ varchar(255) NULL COMMENT '最大值(包含)';
2. 给 RE_MODEL_PARAMETER 表增加字段
ALTER TABLE RE_MODEL_PARAMETER ADD DISABLE_ON_AUTO_SELECTED_ SMALLINT NULL COMMENT '当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项';

2
build.gradle

@ -337,7 +337,7 @@ subprojects {
publications{ publications{
publication(MavenPublication){ publication(MavenPublication){
from components.java from components.java
//artifact sourcesJar artifact sourcesJar
//artifact javadocJar //artifact javadocJar
versionMapping { versionMapping {
usage('java-api') { usage('java-api') {

2
cips.frontend/package.json

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

2
erm.frontend/package.json

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

4
gradle.properties

@ -6,7 +6,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
org.gradle.configureondemand=true org.gradle.configureondemand=true
systemProp.org.gradle.internal.publish.checksums.insecure=true systemProp.org.gradle.internal.publish.checksums.insecure=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.workers.max=2 org.gradle.workers.max=1
########################################################### ###########################################################
# Maven private repository configuration # Maven private repository configuration
@ -39,7 +39,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.2.32 platform_version=8.2.32
platform_plugin_version=8.2.10 platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.122 platform_core_frontend_version=8.2.123
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"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",

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

@ -7,12 +7,15 @@ public class ParameterInOptionAddtion {
protected String code; protected String code;
protected String name; protected String name;
protected String description; protected String description;
protected QualitativeAdditionComponentType componentType;
protected String condition; protected String condition;
protected Boolean enable =true; protected Boolean enable =true;
protected Boolean required =true;
protected Integer order; protected Integer order;
protected QualitativeAdditionComponentType componentType;
protected Boolean required =true;
protected String label;
protected Integer valueScale;
protected String minValue;
protected String maxValue;
protected Integer textareaHeight; protected Integer textareaHeight;
protected Integer textMinLength; protected Integer textMinLength;
protected Integer textMaxLength; protected Integer textMaxLength;
@ -52,14 +55,6 @@ public class ParameterInOptionAddtion {
this.description = description; this.description = description;
} }
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() { public String getCondition() {
return condition; return condition;
} }
@ -76,6 +71,22 @@ public class ParameterInOptionAddtion {
this.enable = enable; this.enable = enable;
} }
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public Boolean getRequired() { public Boolean getRequired() {
return required; return required;
} }
@ -84,12 +95,36 @@ public class ParameterInOptionAddtion {
this.required = required; this.required = required;
} }
public Integer getOrder() { public String getLabel() {
return order; return label;
} }
public void setOrder(Integer order) { public void setLabel(String label) {
this.order = order; this.label = label;
}
public Integer getValueScale() {
return valueScale;
}
public void setValueScale(Integer valueScale) {
this.valueScale = valueScale;
}
public String getMinValue() {
return minValue;
}
public void setMinValue(String minValue) {
this.minValue = minValue;
}
public String getMaxValue() {
return maxValue;
}
public void setMaxValue(String maxValue) {
this.maxValue = maxValue;
} }
public Integer getTextareaHeight() { public Integer getTextareaHeight() {

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

@ -18,6 +18,8 @@ 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 Boolean disableOnAutoSelected;
//选项列表 //选项列表
protected List<ParameterInOptionItem> options =new ArrayList<>(); protected List<ParameterInOptionItem> options =new ArrayList<>();
//不录项列表 //不录项列表
@ -28,6 +30,12 @@ public class InOptionParameter extends Parameter {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public Boolean getDisableOnAutoSelected() {
return disableOnAutoSelected;
}
public void setDisableOnAutoSelected(Boolean disableOnAutoSelected) {
this.disableOnAutoSelected = disableOnAutoSelected;
}
public List<ParameterInOptionItem> getOptions() { public List<ParameterInOptionItem> getOptions() {
return options; return options;
} }

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"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",

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

@ -80,6 +80,7 @@
"re.parameter.grid.entity.libVersion": "Library Version", "re.parameter.grid.entity.libVersion": "Library Version",
"re.parameter.grid.entity.indicatorCode": "Indicator", "re.parameter.grid.entity.indicatorCode": "Indicator",
"re.parameter.grid.entity.persistentAsIndicator": "Persistent As Indicator", "re.parameter.grid.entity.persistentAsIndicator": "Persistent As Indicator",
"re.parameter.grid.entity.disableOnAutoSelected": "Disabled On System Auto Selected a Option",
"re.parameter.grid.entity.properties": "Extension Properties", "re.parameter.grid.entity.properties": "Extension Properties",
"re.parameter.grid.entity.property.name": "Property Name", "re.parameter.grid.entity.property.name": "Property Name",
"re.parameter.grid.entity.property.value": "Property Value", "re.parameter.grid.entity.property.value": "Property Value",
@ -102,20 +103,24 @@
"re.option.grid.entity.inputValue": "Input Value", "re.option.grid.entity.inputValue": "Input Value",
"re.option.grid.entity.value": "Value", "re.option.grid.entity.value": "Value",
"re.option.grid.entity.title": "Title", "re.option.grid.entity.title": "Title",
"re.option.grid.entity.config": "Configure", "re.option.grid.entity.config": "Condition of Auto Selected(Auto Select Item When Condition is true)",
"re.addition.grid.title": "Addition Items", "re.addition.grid.title": "Addition Items",
"re.addition.grid.entity.code": "Code", "re.addition.grid.entity.code": "Code",
"re.addition.grid.entity.name": "Name", "re.addition.grid.entity.name": "Name",
"re.addition.grid.entity.description": "Description", "re.addition.grid.entity.description": "Description",
"re.addition.grid.entity.condition": "Show Condition(Show the Addition Item When Condition is true)",
"re.addition.grid.entity.componentType": "Component Type", "re.addition.grid.entity.componentType": "Component Type",
"re.addition.grid.entity.condition": "Condition", "re.addition.grid.entity.valueScale": "Value Scale",
"re.addition.grid.entity.textareaHeight": "Height of Textarea(Unit:pixel)", "re.addition.grid.entity.minValue": "Minimum(Include)",
"re.addition.grid.entity.textMinLength": "Minimal Length of Text", "re.addition.grid.entity.maxValue": "Maximum(Include)",
"re.addition.grid.entity.textMaxLength": "Maximum Length of Text", "re.addition.grid.entity.textareaHeight": "Height(Unit:pixel)",
"re.addition.grid.entity.textMinLength": "Minimal Length(Include)",
"re.addition.grid.entity.textMaxLength": "Maximum Length(Include)",
"re.addition.grid.entity.prompt": "Prompts", "re.addition.grid.entity.prompt": "Prompts",
"re.addition.grid.entity.attachmentExtendNames": "Extend Names of Attachment to upload(split by comma when multiple)", "re.addition.grid.entity.attachmentExtendNames": "Extend Names of Attachment(split by comma when multiple)",
"re.addition.grid.entity.attachmentMaxCount": "Max Count of Attachment to upload", "re.addition.grid.entity.attachmentExtendNames2": "Extend Names of Attachment(split by comma when multiple, e.g., xlsx, pdf, docx)",
"re.addition.grid.entity.attachmentMaxCount": "Max Count of Attachment",
"re.processor.dialog.decisionTree.title": "Decision Tree Designer", "re.processor.dialog.decisionTree.title": "Decision Tree Designer",
"re.processor.dialog.executionFlow.title": "Execution Flow Designer", "re.processor.dialog.executionFlow.title": "Execution Flow Designer",

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

@ -80,6 +80,7 @@
"re.parameter.grid.entity.libVersion": "指標庫版本", "re.parameter.grid.entity.libVersion": "指標庫版本",
"re.parameter.grid.entity.indicatorCode": "指標", "re.parameter.grid.entity.indicatorCode": "指標",
"re.parameter.grid.entity.persistentAsIndicator": "是否作為指標存儲", "re.parameter.grid.entity.persistentAsIndicator": "是否作為指標存儲",
"re.parameter.grid.entity.disableOnAutoSelected": "當系統自動選擇了輸入選項中的某一項時, 是否禁止用戶選擇其他項",
"re.parameter.grid.entity.properties": "擴展屬性", "re.parameter.grid.entity.properties": "擴展屬性",
"re.parameter.grid.entity.property.name": "屬性名", "re.parameter.grid.entity.property.name": "屬性名",
"re.parameter.grid.entity.property.value": "屬性值", "re.parameter.grid.entity.property.value": "屬性值",
@ -102,20 +103,24 @@
"re.option.grid.entity.inputValue": "輸入值", "re.option.grid.entity.inputValue": "輸入值",
"re.option.grid.entity.value": "計算值", "re.option.grid.entity.value": "計算值",
"re.option.grid.entity.title": "顯示文本", "re.option.grid.entity.title": "顯示文本",
"re.option.grid.entity.config": "配置", "re.option.grid.entity.config": "自動選擇條件(當條件滿足時,自動選中該項)",
"re.addition.grid.title": "補錄項", "re.addition.grid.title": "補錄項",
"re.addition.grid.entity.code": "代碼", "re.addition.grid.entity.code": "代碼",
"re.addition.grid.entity.name": "名稱", "re.addition.grid.entity.name": "名稱",
"re.addition.grid.entity.description": "描述", "re.addition.grid.entity.description": "描述",
"re.addition.grid.entity.condition": "顯示條件(當條件成立時,顯示該補錄項)",
"re.addition.grid.entity.componentType": "組件類型", "re.addition.grid.entity.componentType": "組件類型",
"re.addition.grid.entity.condition": "觸發條件", "re.addition.grid.entity.valueScale": "精度(小數位數)",
"re.addition.grid.entity.textareaHeight": "文本框高度(單位:像素)", "re.addition.grid.entity.minValue": "最小值(包含)",
"re.addition.grid.entity.textMinLength": "文本框允許輸入的字符個數(最小值)", "re.addition.grid.entity.maxValue": "最大值(包含)",
"re.addition.grid.entity.textMaxLength": "文本框允許輸入的字符個數(最大值)", "re.addition.grid.entity.textareaHeight": "高度(單位:像素)",
"re.addition.grid.entity.textMinLength": "最小長度(包含)",
"re.addition.grid.entity.textMaxLength": "最大長度(包含)",
"re.addition.grid.entity.prompt": "提示詞", "re.addition.grid.entity.prompt": "提示詞",
"re.addition.grid.entity.attachmentExtendNames": "允許上傳附件的文件擴展名(多個採用逗號分隔)", "re.addition.grid.entity.attachmentExtendNames": "附件文件擴展名(多個採用逗號分隔)",
"re.addition.grid.entity.attachmentMaxCount": "允許上傳附件的最大個數", "re.addition.grid.entity.attachmentExtendNames2": "附件文件擴展名(多個採用逗號分隔, 示例: xlsx, pdf, docx)",
"re.addition.grid.entity.attachmentMaxCount": "附件最大個數",
"re.processor.dialog.decisionTree.title": "決策樹設計器", "re.processor.dialog.decisionTree.title": "決策樹設計器",
"re.processor.dialog.executionFlow.title": "執行流設計器", "re.processor.dialog.executionFlow.title": "執行流設計器",

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

@ -80,6 +80,7 @@
"re.parameter.grid.entity.libVersion": "指标库版本", "re.parameter.grid.entity.libVersion": "指标库版本",
"re.parameter.grid.entity.indicatorCode": "指标", "re.parameter.grid.entity.indicatorCode": "指标",
"re.parameter.grid.entity.persistentAsIndicator": "是否作为指标存储", "re.parameter.grid.entity.persistentAsIndicator": "是否作为指标存储",
"re.parameter.grid.entity.disableOnAutoSelected": "当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项",
"re.parameter.grid.entity.properties": "扩展属性", "re.parameter.grid.entity.properties": "扩展属性",
"re.parameter.grid.entity.property.name": "属性名", "re.parameter.grid.entity.property.name": "属性名",
"re.parameter.grid.entity.property.value": "属性值", "re.parameter.grid.entity.property.value": "属性值",
@ -103,20 +104,24 @@
"re.option.grid.entity.inputValue": "输入值", "re.option.grid.entity.inputValue": "输入值",
"re.option.grid.entity.value": "计算值", "re.option.grid.entity.value": "计算值",
"re.option.grid.entity.title": "显示文本", "re.option.grid.entity.title": "显示文本",
"re.option.grid.entity.config": "配置", "re.option.grid.entity.config": "自动选择条件(当条件满足时,自动选中该项)",
"re.addition.grid.title": "补录项", "re.addition.grid.title": "补录项",
"re.addition.grid.entity.code": "代码", "re.addition.grid.entity.code": "代码",
"re.addition.grid.entity.name": "名称", "re.addition.grid.entity.name": "名称",
"re.addition.grid.entity.description": "描述", "re.addition.grid.entity.description": "描述",
"re.addition.grid.entity.condition": "显示条件(当条件成立时,显示该补录项)",
"re.addition.grid.entity.componentType": "组件类型", "re.addition.grid.entity.componentType": "组件类型",
"re.addition.grid.entity.condition": "触发条件", "re.addition.grid.entity.valueScale": "精度(小数位数)",
"re.addition.grid.entity.textareaHeight": "文本框高度(单位:像素)", "re.addition.grid.entity.minValue": "最小值(包含)",
"re.addition.grid.entity.textMinLength": "文本框允许输入的字符个数(最小值)", "re.addition.grid.entity.maxValue": "最大值(包含)",
"re.addition.grid.entity.textMaxLength": "文本框允许输入的字符个数(最大值)", "re.addition.grid.entity.textareaHeight": "高度(单位:像素)",
"re.addition.grid.entity.textMinLength": "最小长度(包含)",
"re.addition.grid.entity.textMaxLength": "最大长度(包含)",
"re.addition.grid.entity.prompt": "提示词", "re.addition.grid.entity.prompt": "提示词",
"re.addition.grid.entity.attachmentExtendNames": "允许上传附件的文件扩展名(多个采用逗号分隔)", "re.addition.grid.entity.attachmentExtendNames": "附件文件扩展名(多个采用逗号分隔)",
"re.addition.grid.entity.attachmentMaxCount": "允许上传附件的最大个数", "re.addition.grid.entity.attachmentExtendNames2": "附件文件扩展名(多个采用逗号分隔, 示例: xlsx, pdf, docx)",
"re.addition.grid.entity.attachmentMaxCount": "附件最大个数",
"re.processor.dialog.decisionTree.title": "决策树设计器", "re.processor.dialog.decisionTree.title": "决策树设计器",
"re.processor.dialog.executionFlow.title": "执行流设计器", "re.processor.dialog.executionFlow.title": "执行流设计器",

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

@ -53,25 +53,23 @@
align: 'center', align: 'center',
format: Formater.enableTag(), format: Formater.enableTag(),
}, },
{
width: 70,
name: 'required',
label: $t('required'),
align: 'center',
format: Formater.yesNo(),
},
{ {
width: 120, width: 120,
name: 'code', name: 'code',
label: $t('re.addition.grid.entity.code'), label: $t('re.addition.grid.entity.code'),
}, },
{ {
width: 200, width: 300,
name: 'name', name: 'name',
label: $t('re.addition.grid.entity.name'), label: $t('re.addition.grid.entity.name'),
}, },
{ {
width: 200, width: 300,
name: 'condition',
label: $t('re.addition.grid.entity.condition'),
},
{
width: 100,
name: 'description', name: 'description',
label: $t('re.addition.grid.entity.description'), label: $t('re.addition.grid.entity.description'),
}, },
@ -80,53 +78,105 @@
name: 'componentType', name: 'componentType',
label: $t('re.addition.grid.entity.componentType'), label: $t('re.addition.grid.entity.componentType'),
format: (value: any, row: any) => { format: (value: any, row: any) => {
let text = $t('io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.' + value); return $t('io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.' + value);
if ('TEXTS' === value) {
text += '(' + row.rows + ')';
} else if ('ATTACHMENT' === value) {
text += '(' + row.attachmentMaxCount + ')';
}
return text;
}, },
}, },
{ {
width: 200, width: 200,
name: 'condition', name: 'label',
label: $t('re.addition.grid.entity.condition'), label: $t('title'),
}, },
{ {
width: 300, width: 70,
name: 'required',
label: $t('required'),
format: Formater.yesNo(),
},
{
width: 120,
name: 'valueScale',
label: $t('re.addition.grid.entity.valueScale'),
align: 'right',
},
{
width: 120,
name: 'minValue',
label: $t('re.addition.grid.entity.minValue'),
align: 'right',
},
{
width: 120,
name: 'maxValue',
label: $t('re.addition.grid.entity.maxValue'),
align: 'right',
},
{
width: 120,
name: 'textareaHeight',
label: $t('re.addition.grid.entity.textareaHeight'),
align: 'right',
},
{
width: 120,
name: 'textMinLength',
label: $t('re.addition.grid.entity.textMinLength'),
align: 'right',
},
{
width: 120,
name: 'textMaxLength',
label: $t('re.addition.grid.entity.textMaxLength'),
align: 'right',
},
{
width: 200,
name: 'prompt', name: 'prompt',
label: $t('re.addition.grid.entity.prompt'), label: $t('re.addition.grid.entity.prompt'),
}, },
{
width: 300,
name: 'attachmentExtendNames',
label: $t('re.addition.grid.entity.attachmentExtendNames'),
},
{
width: 120,
name: 'attachmentMaxCount',
label: $t('re.addition.grid.entity.attachmentMaxCount'),
align: 'right',
},
]" ]"
:editor="{ :editor="{
dialog: { dialog: {
width: '600px', width: '700px',
}, },
form: { form: {
colsNum: 1, colsNum: 2,
fields: [ fields: [
{ name: 'parameter', label: 'parameter', type: 'w-text', defaultValue: parameter.id, showIf: false }, { colSpan: 2, name: 'parameter', label: 'parameter', type: 'w-text', defaultValue: parameter.id, showIf: false },
{ {
colSpan: 2,
name: 'code', name: 'code',
label: $t('re.addition.grid.entity.code'), label: $t('re.addition.grid.entity.code'),
type: 'w-text', type: 'w-text',
requiredIf: true, requiredIf: true,
}, },
{ {
colSpan: 2,
name: 'name', name: 'name',
label: $t('re.addition.grid.entity.name'), label: $t('re.addition.grid.entity.name'),
type: 'w-text', type: 'w-text',
requiredIf: true, requiredIf: true,
}, },
{ {
colSpan: 2,
name: 'description', name: 'description',
label: $t('re.addition.grid.entity.description'), label: $t('re.addition.grid.entity.description'),
type: 'w-textarea', type: 'w-textarea',
rows: 3, rows: 3,
}, },
{ colSpan: 2, name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true },
{ {
colSpan: 2,
name: 'condition', name: 'condition',
label: $t('re.addition.grid.entity.condition'), label: $t('re.addition.grid.entity.condition'),
type: 'w-code-mirror', type: 'w-code-mirror',
@ -146,7 +196,38 @@
options: EngineEnums.QualitativeAdditionComponentType.options, options: EngineEnums.QualitativeAdditionComponentType.options,
requiredIf: true, requiredIf: true,
}, },
{ name: 'required', label: $t('required'), type: 'w-checkbox', defaultValue: false },
{ colSpan: 2, name: 'label', label: $t('title'), type: 'w-text' },
{ {
colSpan: 2,
name: 'valueScale',
label: $t('re.addition.grid.entity.valueScale'),
type: 'w-integer',
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'DECIMAL';
},
},
{
name: 'minValue',
label: $t('re.addition.grid.entity.minValue'),
type: 'w-text',
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'INTEGER' || type === 'DECIMAL';
},
},
{
name: 'maxValue',
label: $t('re.addition.grid.entity.maxValue'),
type: 'w-text',
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'INTEGER' || type === 'DECIMAL';
},
},
{
colSpan: 2,
name: 'textareaHeight', name: 'textareaHeight',
label: $t('re.addition.grid.entity.textareaHeight'), label: $t('re.addition.grid.entity.textareaHeight'),
type: 'w-integer', type: 'w-integer',
@ -174,20 +255,9 @@
}, },
}, },
{ {
name: 'prompt', colSpan: 2,
label: $t('re.addition.grid.entity.prompt'),
type: 'w-textarea',
rows: 3,
defaultValue: 3,
showIf: (args: any) => {
const type = args.form.getFieldValue('componentType');
return type === 'TEXT' || type === 'TEXTS';
},
},
{
name: 'attachmentExtendNames', name: 'attachmentExtendNames',
label: $t('re.addition.grid.entity.attachmentExtendNames'), label: $t('re.addition.grid.entity.attachmentExtendNames2'),
type: 'w-text', type: 'w-text',
defaultValue: '.pdf, .docx', defaultValue: '.pdf, .docx',
showIf: (args: any) => { showIf: (args: any) => {
@ -196,6 +266,7 @@
}, },
}, },
{ {
colSpan: 2,
name: 'attachmentMaxCount', name: 'attachmentMaxCount',
label: $t('re.addition.grid.entity.attachmentMaxCount'), label: $t('re.addition.grid.entity.attachmentMaxCount'),
type: 'w-integer', type: 'w-integer',
@ -205,34 +276,20 @@
return type === 'ATTACHMENT'; return type === 'ATTACHMENT';
}, },
}, },
{
{ name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true }, colSpan: 2,
{ name: 'required', label: $t('required'), type: 'w-checkbox', defaultValue: true }, name: 'prompt',
], label: $t('re.addition.grid.entity.prompt'),
type: 'w-code-mirror',
toolbar: false,
lang: 'java',
rows: 3,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'parameter', label: $t('parameter') },
{ name: 'code', label: $t('re.addition.grid.entity.code') },
{ name: 'name', label: $t('re.addition.grid.entity.name') },
{ name: 'description', label: $t('re.addition.grid.entity.description') },
{ name: 'componentType', label: $t('re.addition.grid.entity.component') },
{ name: 'condition', label: $t('re.addition.grid.entity.condition') },
{ name: 'enable', label: $t('isEnable') },
{ name: 'required', label: $t('isRequired') },
{ name: 'order', label: $t('order') },
{ name: 'textareaHeight', label: $t('re.addition.grid.entity.textareaHeight') },
{ name: 'textMinLength', label: $t('re.addition.grid.entity.textMinLength') },
{ name: 'textMaxLength', label: $t('re.addition.grid.entity.textMaxLength') },
{ name: 'prompt', label: $t('re.addition.grid.entity.prompt') },
{ name: 'attachmentExtendNames', label: $t('re.addition.grid.entity.attachmentExtendNames') },
{ name: 'attachmentMaxCount', label: $t('re.addition.grid.entity.attachmentMaxCount') },
...CorporationAuditorEntityManager.getViewerFields(),
], ],
}, },
}" }"

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

@ -50,7 +50,6 @@
{ width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue') }, { width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue') },
{ width: 100, name: 'value', label: $t('re.option.grid.entity.value') }, { width: 100, name: 'value', label: $t('re.option.grid.entity.value') },
{ width: 400, name: 'title', label: $t('re.option.grid.entity.title') }, { width: 400, name: 'title', label: $t('re.option.grid.entity.title') },
{ width: 200, name: 'description', label: $t('description') },
{ {
width: 400, width: 400,
name: 'config', name: 'config',
@ -59,6 +58,7 @@
return PlaceHolder.replace(value); return PlaceHolder.replace(value);
}, },
}, },
{ width: 200, name: 'description', label: $t('description') },
]" ]"
:editor="{ :editor="{
dialog: { dialog: {

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

@ -178,7 +178,7 @@
]" ]"
:editor="{ :editor="{
dialog: { dialog: {
width: '600px', width: '800px',
}, },
form: { form: {
colsNum: 1, colsNum: 1,
@ -218,6 +218,15 @@
...valueTypeManager.getEditorFields(), ...valueTypeManager.getEditorFields(),
{ name: 'order', label: $t('order'), type: 'w-number', showIf: false }, { name: 'order', label: $t('order'), type: 'w-number', showIf: false },
{ name: 'persistentAsIndicator', label: $t('re.parameter.grid.entity.persistentAsIndicator'), type: 'w-checkbox', defaultValue: true }, { name: 'persistentAsIndicator', label: $t('re.parameter.grid.entity.persistentAsIndicator'), type: 'w-checkbox', defaultValue: true },
{
name: 'disableOnAutoSelected',
label: $t('re.parameter.grid.entity.disableOnAutoSelected'),
type: 'w-checkbox',
defaultValue: false,
showIf: (args: any) => {
return 'IN_OPTION' === args.form.getFieldValue('type');
},
},
{ {
name: 'properties', name: 'properties',
label: $t('re.parameter.grid.entity.properties'), label: $t('re.parameter.grid.entity.properties'),
@ -253,13 +262,13 @@
], ],
columns: [ columns: [
{ {
width: '30%', width: 100,
name: 'name', name: 'name',
label: $t('re.parameter.grid.entity.property.name'), label: $t('re.parameter.grid.entity.property.name'),
format: EngineEnums.ParameterPropertiesName.formater, format: EngineEnums.ParameterPropertiesName.formater,
}, },
{ {
width: '70%', width: 450,
name: 'value', name: 'value',
label: $t('re.parameter.grid.entity.property.value'), label: $t('re.parameter.grid.entity.property.value'),
sortable: false, sortable: false,
@ -267,21 +276,94 @@
return PlaceHolder.replace(value); return PlaceHolder.replace(value);
}, },
}, },
{
width: 100,
name: 'componentType',
label: $t('re.addition.grid.entity.componentType'),
format: (value: any, row: any) => {
return $t('io.sc.engine.rule.core.enums.QualitativeAdditionComponentType.' + value);
},
},
{
width: 200,
name: 'label',
label: $t('title'),
},
{
width: 70,
name: 'required',
label: $t('required'),
format: Formater.yesNo(),
},
{
width: 120,
name: 'valueScale',
label: $t('re.addition.grid.entity.valueScale'),
align: 'right',
},
{
width: 120,
name: 'minValue',
label: $t('re.addition.grid.entity.minValue'),
align: 'right',
},
{
width: 120,
name: 'maxValue',
label: $t('re.addition.grid.entity.maxValue'),
align: 'right',
},
{
width: 120,
name: 'textareaHeight',
label: $t('re.addition.grid.entity.textareaHeight'),
align: 'right',
},
{
width: 120,
name: 'textMinLength',
label: $t('re.addition.grid.entity.textMinLength'),
align: 'right',
},
{
width: 120,
name: 'textMaxLength',
label: $t('re.addition.grid.entity.textMaxLength'),
align: 'right',
},
{
width: 200,
name: 'prompt',
label: $t('re.addition.grid.entity.prompt'),
},
{
width: 300,
name: 'attachmentExtendNames',
label: $t('re.addition.grid.entity.attachmentExtendNames'),
},
{
width: 120,
name: 'attachmentMaxCount',
label: $t('re.addition.grid.entity.attachmentMaxCount'),
align: 'right',
},
], ],
editor: { editor: {
dialog: { dialog: {
width: '600px', width: '600px',
}, },
form: { form: {
colsNum: 1, colsNum: 2,
fields: [ fields: [
{ {
colSpan: 2,
name: 'name', name: 'name',
label: $t('re.parameter.grid.entity.property.name'), label: $t('re.parameter.grid.entity.property.name'),
type: 'w-select', type: 'w-select',
options: EngineEnums.ParameterPropertiesName.options, options: EngineEnums.ParameterPropertiesName.options,
}, },
{ {
colSpan: 2,
name: 'value', name: 'value',
label: $t('re.parameter.grid.entity.property.value'), label: $t('re.parameter.grid.entity.property.value'),
type: 'w-code-mirror', type: 'w-code-mirror',
@ -293,9 +375,152 @@
placeholder: true, placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
}, },
{
name: 'componentType',
label: $t('re.addition.grid.entity.componentType'),
type: 'w-select',
options: EngineEnums.QualitativeAdditionComponentType.options,
requiredIf: true,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
return 'MODIFY_IF' === name;
},
},
{
name: 'required',
label: $t('required'),
type: 'w-checkbox',
defaultValue: false,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
return 'MODIFY_IF' === name;
},
},
{
colSpan: 2,
name: 'label',
label: $t('title'),
type: 'w-text',
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
return 'MODIFY_IF' === name;
},
},
{
colSpan: 2,
name: 'valueScale',
label: $t('re.addition.grid.entity.valueScale'),
type: 'w-integer',
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && 'DECIMAL' === type;
},
},
{
name: 'minValue',
label: $t('re.addition.grid.entity.minValue'),
type: 'w-text',
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && ('INTEGER' === type || 'DECIMAL' === type);
},
},
{
name: 'maxValue',
label: $t('re.addition.grid.entity.maxValue'),
type: 'w-text',
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && ('INTEGER' === type || 'DECIMAL' === type);
},
},
{
colSpan: 2,
name: 'textareaHeight',
label: $t('re.addition.grid.entity.textareaHeight'),
type: 'w-integer',
defaultValue: 100,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && 'TEXTS' === type;
},
},
{
name: 'textMinLength',
label: $t('re.addition.grid.entity.textMinLength'),
type: 'w-integer',
defaultValue: 0,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && ('TEXT' === type || 'TEXTS' === type);
},
},
{
name: 'textMaxLength',
label: $t('re.addition.grid.entity.textMaxLength'),
type: 'w-integer',
defaultValue: 1024,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && ('TEXT' === type || 'TEXTS' === type);
},
},
{
colSpan: 2,
name: 'attachmentExtendNames',
label: $t('re.addition.grid.entity.attachmentExtendNames2'),
type: 'w-text',
defaultValue: '.pdf, .docx',
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && 'ATTACHMENT' === type;
},
},
{
colSpan: 2,
name: 'attachmentMaxCount',
label: $t('re.addition.grid.entity.attachmentMaxCount'),
type: 'w-integer',
defaultValue: 1,
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
const type = args.form.getFieldValue('componentType');
return 'MODIFY_IF' === name && 'ATTACHMENT' === type;
},
},
{
colSpan: 2,
name: 'prompt',
label: $t('re.addition.grid.entity.prompt'),
type: 'w-code-mirror',
toolbar: false,
lang: 'java',
rows: 3,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
const name = args.form.getFieldValue('name');
return 'MODIFY_IF' === name;
},
},
], ],
}, },
}, },
onBeforeEditorDataSubmit: (args) => {
args.callback(normalize(args.data));
// console.log(args);
// Tools.mergeObject(args.data, normalize(args.data));
},
}, },
], ],
}, },
@ -336,7 +561,7 @@
const localData: any[] = grid.getRows(); const localData: any[] = grid.getRows();
const properties: any = []; const properties: any = [];
localData.forEach((item) => { localData.forEach((item) => {
properties.push({ name: item.name, value: item.value }); properties.push(normalize(item));
}); });
args.data.properties = Tools.object2Json(properties); args.data.properties = Tools.object2Json(properties);
} }
@ -403,6 +628,7 @@ import { LibManager } from '@/views/shared/LibManager';
import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager'; import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums'; import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { PlaceHolder } from '@/utils/PlaceHolder'; import { PlaceHolder } from '@/utils/PlaceHolder';
import { toRaw } from 'vue'; import { toRaw } from 'vue';
import { nextTick } from 'vue'; import { nextTick } from 'vue';
@ -425,6 +651,7 @@ const templateImportAndExportDialogRef = ref();
const importDialogRef = ref(); const importDialogRef = ref();
const valueTypeManager = new ValueTypeManager(); const valueTypeManager = new ValueTypeManager();
const autoCompletionManager = new AutoCompletionManager(); const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
const templateImportAndExportManager = new TemplateImportAndExportManager(templateImportAndExportDialogRef); const templateImportAndExportManager = new TemplateImportAndExportManager(templateImportAndExportDialogRef);
onMounted(() => { onMounted(() => {
@ -439,6 +666,76 @@ const setDefaultValue = (defaultValue: string) => {
gridRef.value.getSelectedRow().defaultValue = defaultValue; gridRef.value.getSelectedRow().defaultValue = defaultValue;
}; };
const normalize = (item: any) => {
if (Tools.isUndefinedOrNull(item)) {
return;
}
if (item.name === 'SHOW_IF') {
return {
name: item.name,
value: item.value,
};
} else {
const property = {
name: item.name,
value: item.value,
componentType: item.componentType,
required: item.required,
label: item.label,
valueScale: item.valueScale,
minValue: item.minValue,
maxValue: item.maxValue,
textareaHeight: item.textareaHeight,
textMinLength: item.textMinLength,
textMaxLength: item.textMaxLength,
attachmentExtendNames: item.attachmentExtendNames,
attachmentMaxCount: item.attachmentMaxCount,
prompt: item.prompt,
};
switch (property.componentType) {
case 'INTEGER':
property.valueScale = null;
property.textareaHeight = null;
property.textMinLength = null;
property.textMaxLength = null;
property.attachmentExtendNames = null;
property.attachmentMaxCount = null;
break;
case 'DECIMAL':
property.textareaHeight = null;
property.textMinLength = null;
property.textMaxLength = null;
property.attachmentExtendNames = null;
property.attachmentMaxCount = null;
break;
case 'TEXT':
property.valueScale = null;
property.minValue = null;
property.maxValue = null;
property.textareaHeight = null;
property.attachmentExtendNames = null;
property.attachmentMaxCount = null;
break;
case 'TEXTS':
property.valueScale = null;
property.minValue = null;
property.maxValue = null;
property.attachmentExtendNames = null;
property.attachmentMaxCount = null;
break;
case 'ATTACHMENT':
property.valueScale = null;
property.minValue = null;
property.maxValue = null;
property.textareaHeight = null;
property.textMinLength = null;
property.textMaxLength = null;
break;
}
return property;
}
};
defineExpose({ defineExpose({
refresh, refresh,
setDefaultValue, setDefaultValue,

10
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/initializer/RuleEngineWorkFlowInitializer.java

@ -58,12 +58,14 @@ public class RuleEngineWorkFlowInitializer implements ApplicationInitializer{
entity.setVersion(1); entity.setVersion(1);
entity.setCanClaimTask(false); entity.setCanClaimTask(false);
entity.setXml(getRuleEngineWorkflowXmlContent()); entity.setXml(getRuleEngineWorkflowXmlContent());
entity.setBusinessDescriptionSql("" + entity.setBusinessDescriptionSql(
"select\n" + "select\n" +
" CONCAT(CODE_,':',VERSION_) BUSSINESS_KEY,\n" + " CONCAT(CODE_,':',VERSION_) BUSINESS_KEY,\n" +
" CONCAT(NAME_,'_V',VERSION_) BUSSINESS_DESCRIPTION\n" + " NAME_ CUST_NO,\n" +
" CONCAT('V',VERSION_) CUST_NAME,\n" +
" NULL PROCESS_STATUS\n" +
"from RE_RESOURCE\n" + "from RE_RESOURCE\n" +
"where CONCAT(CODE_,':',VERSION_) in (${bussinessKeys})" "where CONCAT(CODE_,':',VERSION_) = '${businessKey}'"
); );
entity.setTaskHandFrontendModelName("io.sc.engine.rule.frontend"); entity.setTaskHandFrontendModelName("io.sc.engine.rule.frontend");
entity.setTaskHandFrontendComponentName("io.sc.engine.rule.frontend.workflow.ApprovalComponent"); entity.setTaskHandFrontendComponentName("io.sc.engine.rule.frontend.workflow.ApprovalComponent");

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

@ -34,6 +34,7 @@ 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.setDisableOnAutoSelected(_entity.getDisableOnAutoSelected());
_po.setOptions(ParameterInOptionItemEntityConverter.toPo(_entity.getOptions())); _po.setOptions(ParameterInOptionItemEntityConverter.toPo(_entity.getOptions()));
_po.setAdditons(ParameterInOptionAdditionEntityConverter.toPo(_entity.getAdditions())); _po.setAdditons(ParameterInOptionAdditionEntityConverter.toPo(_entity.getAdditions()));
po =_po; po =_po;
@ -106,6 +107,8 @@ public class ParameterEntityConverter {
}else if(po instanceof InOptionParameter) { }else if(po instanceof InOptionParameter) {
InOptionParameter _po =(InOptionParameter)po; InOptionParameter _po =(InOptionParameter)po;
InOptionParameterEntity _entity =new InOptionParameterEntity(); InOptionParameterEntity _entity =new InOptionParameterEntity();
_entity.setDisableOnAutoSelected(_po.getDisableOnAutoSelected());
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) {

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

@ -22,11 +22,16 @@ public class ParameterInOptionAdditionEntityConverter {
po.setCode(entity.getCode()); po.setCode(entity.getCode());
po.setName(entity.getName()); po.setName(entity.getName());
po.setDescription(entity.getDescription()); po.setDescription(entity.getDescription());
po.setComponentType(entity.getComponentType());
po.setCondition(entity.getCondition()); po.setCondition(entity.getCondition());
po.setEnable(entity.getEnable()); po.setEnable(entity.getEnable());
po.setRequired(entity.getRequired());
po.setOrder(entity.getOrder()); po.setOrder(entity.getOrder());
po.setComponentType(entity.getComponentType());
po.setRequired(entity.getRequired());
po.setLabel(entity.getLabel());
po.setValueScale(entity.getValueScale());
po.setMinValue(entity.getMinValue());
po.setMaxValue(entity.getMaxValue());
po.setTextareaHeight(entity.getTextareaHeight()); po.setTextareaHeight(entity.getTextareaHeight());
po.setTextMinLength(entity.getTextMinLength()); po.setTextMinLength(entity.getTextMinLength());
po.setTextMaxLength(entity.getTextMaxLength()); po.setTextMaxLength(entity.getTextMaxLength());
@ -66,11 +71,16 @@ public class ParameterInOptionAdditionEntityConverter {
entity.setCode(po.getCode()); entity.setCode(po.getCode());
entity.setName(po.getName()); entity.setName(po.getName());
entity.setDescription(po.getDescription()); entity.setDescription(po.getDescription());
entity.setComponentType(po.getComponentType());
entity.setCondition(po.getCondition()); entity.setCondition(po.getCondition());
entity.setEnable(po.getEnable()); entity.setEnable(po.getEnable());
entity.setRequired(po.getRequired());
entity.setOrder(po.getOrder()); entity.setOrder(po.getOrder());
entity.setComponentType(po.getComponentType());
entity.setRequired(po.getRequired());
entity.setLabel(po.getLabel());
entity.setValueScale(po.getValueScale());
entity.setMinValue(po.getMinValue());
entity.setMaxValue(po.getMaxValue());
entity.setTextareaHeight(po.getTextareaHeight()); entity.setTextareaHeight(po.getTextareaHeight());
entity.setTextMinLength(po.getTextMinLength()); entity.setTextMinLength(po.getTextMinLength());
entity.setTextMaxLength(po.getTextMaxLength()); entity.setTextMaxLength(po.getTextMaxLength());

158
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java

@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.code.generator.impl.processor.ConditionRange; import io.sc.engine.rule.core.code.generator.impl.processor.ConditionRange;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.QualitativeAdditionComponentType;
import io.sc.engine.rule.core.enums.ReplaceMode; import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.CodeAndNameReplacer; import io.sc.engine.rule.server.common.CodeAndNameReplacer;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType; import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
@ -26,6 +27,7 @@ import org.springframework.util.StringUtils;
import javax.persistence.*; import javax.persistence.*;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -412,6 +414,8 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
}); });
for (Property property : properties) { for (Property property : properties) {
property.setValue(parameterAndValueType.replace(property.getValue(), mode)); property.setValue(parameterAndValueType.replace(property.getValue(), mode));
property.setPrompt(parameterAndValueType.replace(property.getPrompt(), mode));
property.normalize();
} }
return ObjectMapperUtil.json().writeValueAsString(properties); return ObjectMapperUtil.json().writeValueAsString(properties);
} catch (Exception e) { } catch (Exception e) {
@ -422,6 +426,64 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
static class Property { static class Property {
String name; String name;
String value; String value;
QualitativeAdditionComponentType componentType;
Boolean required;
String label;
Integer valueScale;
String minValue;
String maxValue;
Integer textareaHeight;
Integer textMinLength;
Integer textMaxLength;
String attachmentExtendNames;
Integer attachmentMaxCount;
String prompt;
public void normalize(){
if(componentType==null) {
return;
}
switch (componentType){
case INTEGER:
valueScale = null;
textareaHeight = null;
textMinLength = null;
textMaxLength = null;
attachmentExtendNames = null;
attachmentMaxCount = null;
break;
case DECIMAL:
textareaHeight = null;
textMinLength = null;
textMaxLength = null;
attachmentExtendNames = null;
attachmentMaxCount = null;
break;
case TEXT:
valueScale = null;
minValue = null;
maxValue = null;
textareaHeight = null;
attachmentExtendNames = null;
attachmentMaxCount = null;
break;
case TEXTS:
valueScale = null;
minValue = null;
maxValue = null;
attachmentExtendNames = null;
attachmentMaxCount = null;
break;
case ATTACHMENT:
valueScale = null;
minValue = null;
maxValue = null;
textareaHeight = null;
textMinLength = null;
textMaxLength = null;
break;
}
}
public String getName() { public String getName() {
return name; return name;
@ -438,6 +500,102 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
public void setValue(String value) { public void setValue(String value) {
this.value = value; this.value = value;
} }
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public Boolean getRequired() {
return required;
}
public void setRequired(Boolean required) {
this.required = required;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public Integer getValueScale() {
return valueScale;
}
public void setValueScale(Integer valueScale) {
this.valueScale = valueScale;
}
public String getMinValue() {
return minValue;
}
public void setMinValue(String minValue) {
this.minValue = minValue;
}
public String getMaxValue() {
return maxValue;
}
public void setMaxValue(String maxValue) {
this.maxValue = maxValue;
}
public Integer getTextareaHeight() {
return textareaHeight;
}
public void setTextareaHeight(Integer textareaHeight) {
this.textareaHeight = textareaHeight;
}
public Integer getTextMinLength() {
return textMinLength;
}
public void setTextMinLength(Integer textMinLength) {
this.textMinLength = textMinLength;
}
public Integer getTextMaxLength() {
return textMaxLength;
}
public void setTextMaxLength(Integer textMaxLength) {
this.textMaxLength = textMaxLength;
}
public String getAttachmentExtendNames() {
return attachmentExtendNames;
}
public void setAttachmentExtendNames(String attachmentExtendNames) {
this.attachmentExtendNames = attachmentExtendNames;
}
public Integer getAttachmentMaxCount() {
return attachmentMaxCount;
}
public void setAttachmentMaxCount(Integer attachmentMaxCount) {
this.attachmentMaxCount = attachmentMaxCount;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
} }
} }

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

@ -51,11 +51,6 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
@Size(max=255) @Size(max=255)
protected String description; protected String description;
//组件类型
@Column(name="COMPONENT_TYPE_")
@Enumerated(EnumType.STRING)
protected QualitativeAdditionComponentType componentType;
//触发条件 //触发条件
@Column(name="CONDITION_", length=1024) @Column(name="CONDITION_", length=1024)
@Size(max=1024) @Size(max=1024)
@ -66,14 +61,38 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
@Convert(converter= NumericBooleanConverter.class) @Convert(converter= NumericBooleanConverter.class)
protected Boolean enable =true; protected Boolean enable =true;
//排序
@Column(name="ORDER_")
protected Integer order;
//组件类型
@Column(name="COMPONENT_TYPE_")
@Enumerated(EnumType.STRING)
protected QualitativeAdditionComponentType componentType;
//是否必填项 //是否必填项
@Column(name="REQUIRED_") @Column(name="REQUIRED_")
@Convert(converter= NumericBooleanConverter.class) @Convert(converter= NumericBooleanConverter.class)
protected Boolean required =true; protected Boolean required =true;
//排序 //组件标签标题
@Column(name="ORDER_") @Column(name="LABEL_", length=255)
protected Integer order; @Size(max=255)
protected String label;
//值精度位数
@Column(name="VALUE_SCALE_")
protected Integer valueScale;
//最小值
@Column(name="MIN_VALUE_", length=255)
@Size(max=255)
protected String minValue;
//最大值
@Column(name="MAX_VALUE_", length=255)
@Size(max=255)
protected String maxValue;
//当组件类型是 TEXTS(多行文本框) 时, 指定多行文本框组件的高度 //当组件类型是 TEXTS(多行文本框) 时, 指定多行文本框组件的高度
@Column(name="TEXTAREA_HEIGHT_") @Column(name="TEXTAREA_HEIGHT_")
@ -105,16 +124,22 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
public ParameterInOptionAdditionVo toVo() { public ParameterInOptionAdditionVo toVo() {
ParameterInOptionAdditionVo vo =new ParameterInOptionAdditionVo(); ParameterInOptionAdditionVo vo =new ParameterInOptionAdditionVo();
super.toVo(vo); super.toVo(vo);
vo.setId(this.getId());
vo.setParameter(this.getParameter()==null?null:this.getParameter().getId()); vo.setParameter(this.getParameter()==null?null:this.getParameter().getId());
vo.setId(this.getId());
vo.setCode(this.getCode()); vo.setCode(this.getCode());
vo.setName(this.getName()); vo.setName(this.getName());
vo.setDescription(this.getDescription()); vo.setDescription(this.getDescription());
vo.setComponentType(this.getComponentType());
vo.setCondition(this.getCondition()); vo.setCondition(this.getCondition());
vo.setEnable(this.getEnable()); vo.setEnable(this.getEnable());
vo.setRequired(this.getRequired());
vo.setOrder(this.getOrder()); vo.setOrder(this.getOrder());
vo.setComponentType(this.getComponentType());
vo.setRequired(this.getRequired());
vo.setLabel(this.getLabel());
vo.setValueScale(this.getValueScale());
vo.setMinValue(this.getMinValue());
vo.setMaxValue(this.getMaxValue());
vo.setTextareaHeight(this.getTextareaHeight()); vo.setTextareaHeight(this.getTextareaHeight());
vo.setTextMinLength(this.getTextMinLength()); vo.setTextMinLength(this.getTextMinLength());
vo.setTextMaxLength(this.getTextMaxLength()); vo.setTextMaxLength(this.getTextMaxLength());
@ -164,14 +189,6 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
this.description = description; this.description = description;
} }
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() { public String getCondition() {
return condition; return condition;
} }
@ -188,6 +205,22 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
this.enable = enable; this.enable = enable;
} }
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public Boolean getRequired() { public Boolean getRequired() {
return required; return required;
} }
@ -196,12 +229,36 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
this.required = required; this.required = required;
} }
public Integer getOrder() { public String getLabel() {
return order; return label;
} }
public void setOrder(Integer order) { public void setLabel(String label) {
this.order = order; this.label = label;
}
public Integer getValueScale() {
return valueScale;
}
public void setValueScale(Integer valueScale) {
this.valueScale = valueScale;
}
public String getMinValue() {
return minValue;
}
public void setMinValue(String minValue) {
this.minValue = minValue;
}
public String getMaxValue() {
return maxValue;
}
public void setMaxValue(String maxValue) {
this.maxValue = maxValue;
} }
public Integer getTextareaHeight() { public Integer getTextareaHeight() {
@ -272,6 +329,13 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
result =true; result =true;
} }
this.condition =replaced; this.condition =replaced;
replaced =parameterAndValueType.replace(this.prompt, mode);
replaced =(replaced==null?"":replaced);
if(!replaced.equals(this.prompt)) {
result =true;
}
this.prompt =replaced;
return result; return result;
} }
@ -284,6 +348,13 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity<Pa
result =true; result =true;
} }
this.condition =replaced; this.condition =replaced;
replaced = ParameterCodeReplacer.replace(this.prompt, code2codeMapping);
replaced =(replaced==null?"":replaced);
if(!replaced.equals(this.prompt)) {
result =true;
}
this.prompt =replaced;
return result; return result;
} }
} }

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

@ -5,6 +5,7 @@ import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.server.model.entity.*; import io.sc.engine.rule.server.model.entity.*;
import io.sc.engine.rule.server.model.vo.parameter.InOptionParameterVo; import io.sc.engine.rule.server.model.vo.parameter.InOptionParameterVo;
import io.sc.engine.rule.server.resource.entity.ResourceEntity; import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.platform.orm.converter.NumericBooleanConverter;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import javax.persistence.*; import javax.persistence.*;
@ -18,6 +19,11 @@ 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="DISABLE_ON_AUTO_SELECTED_")
@Convert(converter= NumericBooleanConverter.class)
protected Boolean disableOnAutoSelected;
//选项列表 //选项列表
@OneToMany(mappedBy="parameter",cascade= {CascadeType.PERSIST}) @OneToMany(mappedBy="parameter",cascade= {CascadeType.PERSIST})
@OrderBy("order") @OrderBy("order")
@ -33,6 +39,7 @@ public class InOptionParameterEntity extends ParameterEntity {
InOptionParameterVo vo =new InOptionParameterVo(); InOptionParameterVo vo =new InOptionParameterVo();
super.toVo(vo); super.toVo(vo);
vo.setType(this.getType()); vo.setType(this.getType());
vo.setDisableOnAutoSelected(this.getDisableOnAutoSelected());
return vo; return vo;
} }
@ -46,6 +53,12 @@ public class InOptionParameterEntity extends ParameterEntity {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public Boolean getDisableOnAutoSelected() {
return disableOnAutoSelected;
}
public void setDisableOnAutoSelected(Boolean disableOnAutoSelected) {
this.disableOnAutoSelected = disableOnAutoSelected;
}
public List<ParameterInOptionItemEntity> getOptions() { public List<ParameterInOptionItemEntity> getOptions() {
return options; return options;
} }

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

@ -71,13 +71,13 @@ public class ParameterInOptionAdditionServiceImpl extends DaoServiceImpl<Paramet
} }
@Override @Override
public ParameterInOptionAdditionEntity update(String s, ParameterInOptionAdditionEntity entity) throws Exception { public ParameterInOptionAdditionEntity update(String id, ParameterInOptionAdditionEntity entity) throws Exception {
normalize(entity); normalize(entity);
//获取代码和名称的映射表 //获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault()); ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault());
//将名称替换为代码 //将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE); VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
ParameterInOptionAdditionEntity newEntity =super.update(s, entity); ParameterInOptionAdditionEntity newEntity =super.update(id, entity);
//由于数据库中存储的是参数的代码,而界面显示的是参数的名称,为了能上新增的实体能够在界面正确显示名称,需要进行代码到名称的替换 //由于数据库中存储的是参数的代码,而界面显示的是参数的名称,为了能上新增的实体能够在界面正确显示名称,需要进行代码到名称的替换
if (newEntity != null) { if (newEntity != null) {
ParameterInOptionAdditionEntity clone = (ParameterInOptionAdditionEntity) newEntity.deepClone(); ParameterInOptionAdditionEntity clone = (ParameterInOptionAdditionEntity) newEntity.deepClone();
@ -90,26 +90,35 @@ public class ParameterInOptionAdditionServiceImpl extends DaoServiceImpl<Paramet
private void normalize(ParameterInOptionAdditionEntity entity){ private void normalize(ParameterInOptionAdditionEntity entity){
if(entity!=null) { if(entity!=null) {
switch (entity.getComponentType()) { switch (entity.getComponentType()) {
case ATTACHMENT: case INTEGER:
entity.setValueScale(null);
entity.setTextareaHeight(null); entity.setTextareaHeight(null);
entity.setTextMinLength(null); entity.setTextMinLength(null);
entity.setTextMaxLength(null); entity.setTextMaxLength(null);
entity.setPrompt(null);
break;
case INTEGER:
case DECIMAL:
entity.setAttachmentExtendNames(null); entity.setAttachmentExtendNames(null);
entity.setAttachmentMaxCount(null); entity.setAttachmentMaxCount(null);
break;
case DECIMAL:
entity.setTextareaHeight(null); entity.setTextareaHeight(null);
entity.setTextMinLength(null); entity.setTextMinLength(null);
entity.setTextMaxLength(null); entity.setTextMaxLength(null);
entity.setPrompt(null); entity.setAttachmentExtendNames(null);
entity.setAttachmentMaxCount(null);
break; break;
case TEXT: case TEXT:
case TEXTS: case TEXTS:
entity.setValueScale(null);
entity.setMinValue(null);
entity.setMaxValue(null);
entity.setAttachmentExtendNames(null); entity.setAttachmentExtendNames(null);
entity.setAttachmentMaxCount(null); entity.setAttachmentMaxCount(null);
break; break;
case ATTACHMENT:
entity.setValueScale(null);
entity.setTextareaHeight(null);
entity.setTextMinLength(null);
entity.setTextMaxLength(null);
break;
} }
} }
} }

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

@ -15,12 +15,15 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo {
protected String code; protected String code;
protected String name; protected String name;
protected String description; protected String description;
protected QualitativeAdditionComponentType componentType;
protected String condition; protected String condition;
protected Boolean enable =true; protected Boolean enable =true;
protected Boolean required =true;
protected Integer order; protected Integer order;
protected QualitativeAdditionComponentType componentType;
protected Boolean required =true;
protected String label;
protected Integer valueScale;
protected String minValue;
protected String maxValue;
protected Integer textareaHeight; protected Integer textareaHeight;
protected Integer textMinLength; protected Integer textMinLength;
protected Integer textMaxLength; protected Integer textMaxLength;
@ -68,14 +71,6 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo {
this.description = description; this.description = description;
} }
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public String getCondition() { public String getCondition() {
return condition; return condition;
} }
@ -92,6 +87,22 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo {
this.enable = enable; this.enable = enable;
} }
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public QualitativeAdditionComponentType getComponentType() {
return componentType;
}
public void setComponentType(QualitativeAdditionComponentType componentType) {
this.componentType = componentType;
}
public Boolean getRequired() { public Boolean getRequired() {
return required; return required;
} }
@ -100,12 +111,36 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo {
this.required = required; this.required = required;
} }
public Integer getOrder() { public String getLabel() {
return order; return label;
} }
public void setOrder(Integer order) { public void setLabel(String label) {
this.order = order; this.label = label;
}
public Integer getValueScale() {
return valueScale;
}
public void setValueScale(Integer valueScale) {
this.valueScale = valueScale;
}
public String getMinValue() {
return minValue;
}
public void setMinValue(String minValue) {
this.minValue = minValue;
}
public String getMaxValue() {
return maxValue;
}
public void setMaxValue(String maxValue) {
this.maxValue = maxValue;
} }
public Integer getTextareaHeight() { public Integer getTextareaHeight() {

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

@ -7,19 +7,19 @@ import io.sc.engine.rule.server.model.vo.ParameterVo;
* 模型参数(输入选项) Vo * 模型参数(输入选项) Vo
*/ */
public class InOptionParameterVo extends ParameterVo { public class InOptionParameterVo extends ParameterVo {
//补录项配置 //当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项
protected String additionConfigure; protected Boolean disableOnAutoSelected;
@Override @Override
public ParameterType getType() { public ParameterType getType() {
return ParameterType.IN_OPTION; return ParameterType.IN_OPTION;
} }
public String getAdditionConfigure() { public Boolean getDisableOnAutoSelected() {
return additionConfigure; return disableOnAutoSelected;
} }
public void setAdditionConfigure(String additionConfigure) { public void setDisableOnAutoSelected(Boolean disableOnAutoSelected) {
this.additionConfigure = additionConfigure; this.disableOnAutoSelected = disableOnAutoSelected;
} }
} }

14
io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml

@ -168,6 +168,7 @@
<column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/> <column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/> <column name="ORDER_" type="INTEGER" remarks="排序"/>
<column name="IS_PERSISTENT_AS_INDICATOR" type="SMALLINT" remarks="是否作为指标存储"/> <column name="IS_PERSISTENT_AS_INDICATOR" type="SMALLINT" remarks="是否作为指标存储"/>
<column name="DISABLE_ON_AUTO_SELECTED_" type="SMALLINT" remarks="当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项"/>
<column name="PROPERTIES_" type="CLOB" remarks="属性"/> <column name="PROPERTIES_" type="CLOB" remarks="属性"/>
<!-- 审计字段 --> <!-- 审计字段 -->
@ -264,12 +265,21 @@
<column name="CODE_" type="NVARCHAR(255)" remarks="代码"/> <column name="CODE_" type="NVARCHAR(255)" remarks="代码"/>
<column name="NAME_" type="NVARCHAR(255)" remarks="名称"/> <column name="NAME_" type="NVARCHAR(255)" remarks="名称"/>
<column name="DESCRIPTION_" type="NVARCHAR(255)" remarks="描述"/> <column name="DESCRIPTION_" type="NVARCHAR(255)" remarks="描述"/>
<column name="COMPONENT_TYPE_" type="NVARCHAR(20)" remarks="组件类型(INTEGER:整数;DECIMAL:小数,TEXT:文本;TEXTS:多行文本;ATTACHMENT:附件)"/>
<column name="CONDITION_" type="NVARCHAR(1024)" remarks="条件"/> <column name="CONDITION_" type="NVARCHAR(1024)" remarks="条件"/>
<column name="ENABLE_" type="SMALLINT" remarks="是否可用"/> <column name="ENABLE_" type="SMALLINT" remarks="是否可用"/>
<column name="REQUIRED_" type="SMALLINT" remarks="是否必填项"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/> <column name="ORDER_" type="INTEGER" remarks="排序"/>
<column name="COMPONENT_TYPE_" type="NVARCHAR(20)" remarks="组件类型(INTEGER:整数;DECIMAL:小数,TEXT:文本;TEXTS:多行文本;ATTACHMENT:附件)"/>
<column name="REQUIRED_" type="SMALLINT" remarks="是否必填项"/>
<column name="LABEL_" type="NVARCHAR(255)" remarks="组件标题"/>
<!-- 当 COMPONENT_TYPE_ ="DECIMAL" (小数) -->
<column name="VALUE_SCALE_" type="SMALLINT" remarks="精度(小数位数)"/>
<!-- 当 COMPONENT_TYPE_ ="INTEGER" (整数) 或者 COMPONENT_TYPE_ ="DECIMAL" (小数) -->
<column name="MIN_VALUE_" type="NVARCHAR(255)" remarks="最小值(包含)"/>
<column name="MAX_VALUE_" type="NVARCHAR(255)" remarks="最大值(包含)"/>
<!-- 当 COMPONENT_TYPE_ ="TEXTS" (多行文本) --> <!-- 当 COMPONENT_TYPE_ ="TEXTS" (多行文本) -->
<column name="TEXTAREA_HEIGHT_" type="INTEGER" remarks="多行文本框高度"/> <column name="TEXTAREA_HEIGHT_" type="INTEGER" remarks="多行文本框高度"/>

36
io.sc.engine.rule.server/src/main/resources/workflow/io/sc/engine/rule/Sample.bpmn

@ -1,12 +1,16 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test" exporter="Flowable Open Source Modeler" exporterVersion="6.8.0">
<process id="RULE_ENGINE_APPROVING" name="决策引擎模型发布流程" isExecutable="true"> <process id="RULE_ENGINE_APPROVING" name="决策引擎审批流程" isExecutable="true">
<extensionElements> <extensionElements>
<flowable:executionListener event="end" delegateExpression="${ruleEngineResourceDeployComplementListener}"/> <flowable:executionListener event="end" delegateExpression="${ruleEngineResourceDeployComplementListener}"/>
</extensionElements> </extensionElements>
<startEvent id="startevent1" name="Start"/> <startEvent id="startevent1" name="Start" flowable:formFieldValidation="true">
<extensionElements>
<flowable:executionListener event="end" delegateExpression="${processStartListener}"/>
</extensionElements>
</startEvent>
<endEvent id="endevent1" name="End"/> <endEvent id="endevent1" name="End"/>
<userTask id="A2" name="审批" flowable:assignee="${assignee}" flowable:candidateGroups="admin"> <userTask id="A2" name="审批" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
<modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group> <modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
@ -15,7 +19,7 @@
</userTask> </userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="A1"/> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="A1"/>
<sequenceFlow id="flow2" sourceRef="A1" targetRef="A2"/> <sequenceFlow id="flow2" sourceRef="A1" targetRef="A2"/>
<userTask id="A1" name="提交" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:skipExpression="${execution.getVariable('skipFirst')==true}"> <userTask id="A1" name="提交" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true" flowable:skipExpression="${execution.getVariable('skipFirst')==true}">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
<modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group> <modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
@ -41,22 +45,22 @@
<bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1"> <bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1">
<omgdc:Bounds height="80.0" width="105.0" x="172.4890621485892" y="75.0"/> <omgdc:Bounds height="80.0" width="105.0" x="172.4890621485892" y="75.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-E0E2165C-BE27-4B8F-9B06-7834E561A053" id="BPMNEdge_sid-E0E2165C-BE27-4B8F-9B06-7834E561A053"> <bpmndi:BPMNEdge bpmnElement="sid-E0E2165C-BE27-4B8F-9B06-7834E561A053" id="BPMNEdge_sid-E0E2165C-BE27-4B8F-9B06-7834E561A053" flowable:sourceDockerX="52.5" flowable:sourceDockerY="40.0" flowable:targetDockerX="52.5" flowable:targetDockerY="40.0">
<omgdi:waypoint x="397.0" y="75.0"/> <omgdi:waypoint x="397.2260273972603" y="75.0"/>
<omgdi:waypoint x="397.0" y="42.0"/> <omgdi:waypoint x="397.0" y="42.0"/>
<omgdi:waypoint x="224.0" y="42.0"/> <omgdi:waypoint x="224.0" y="42.0"/>
<omgdi:waypoint x="224.0" y="75.0"/> <omgdi:waypoint x="224.44711028634853" y="75.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="52.5" flowable:targetDockerY="40.0">
<omgdi:waypoint x="129.0" y="115.0"/> <omgdi:waypoint x="129.46093635440428" y="115.0"/>
<omgdi:waypoint x="172.0" y="115.0"/> <omgdi:waypoint x="172.48906214857433" y="115.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2" flowable:sourceDockerX="52.5" flowable:sourceDockerY="40.0" flowable:targetDockerX="52.5" flowable:targetDockerY="40.0">
<omgdi:waypoint x="277.0" y="115.0"/> <omgdi:waypoint x="277.4390621485892" y="115.0"/>
<omgdi:waypoint x="344.0" y="115.0"/> <omgdi:waypoint x="344.99999999998187" y="115.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-7727ADC3-E654-4ADD-894A-6D6AF2130C3E" id="BPMNEdge_sid-7727ADC3-E654-4ADD-894A-6D6AF2130C3E"> <bpmndi:BPMNEdge bpmnElement="sid-7727ADC3-E654-4ADD-894A-6D6AF2130C3E" id="BPMNEdge_sid-7727ADC3-E654-4ADD-894A-6D6AF2130C3E" flowable:sourceDockerX="52.5" flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="449.0" y="115.0"/> <omgdi:waypoint x="449.95000000000005" y="115.0"/>
<omgdi:waypoint x="495.0" y="115.0"/> <omgdi:waypoint x="495.0" y="115.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

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

2
io.sc.platform.core.frontend/src/platform/views/home/MyDoneTask.vue

@ -45,7 +45,7 @@
</td> </td>
<td width="78px" style="font-size: 0.8em; padding: 0px 4px" align="right"> <td width="78px" style="font-size: 0.8em; padding: 0px 4px" align="right">
<div class="truncate" style="width: 70px; max-width: 70px"> <div class="truncate" style="width: 70px; max-width: 70px">
{{ 999 + $t(item.startTimeAndNowDiffUnit) + $t('before') }} {{ $t(item.startTimeAndNowDiffUnit) + $t('before') }}
</div> </div>
<q-tooltip :delay="1000">{{ item.startTime }}</q-tooltip> <q-tooltip :delay="1000">{{ item.startTime }}</q-tooltip>
</td> </td>

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.122", "version": "8.2.123",
"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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

@ -268,3 +268,5 @@ settings=Settings
reply=Reply reply=Reply
defaultRoleName=Default Role Name defaultRoleName=Default Role Name
async=Asynchronous async=Asynchronous
valueScale=Value Scale
scale=Scale

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

@ -268,3 +268,5 @@ settings=\u8A2D\u7F6E
reply=\u56DE\u5FA9 reply=\u56DE\u5FA9
defaultRoleName=\u9ED8\u8A8D\u89D2\u8272\u540D\u7A31 defaultRoleName=\u9ED8\u8A8D\u89D2\u8272\u540D\u7A31
async=\u7570\u6B65 async=\u7570\u6B65
valueScale=\u503C\u7CBE\u5EA6
scale=\u7CBE\u5EA6

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

@ -268,3 +268,5 @@ settings=\u8BBE\u7F6E
reply=\u56DE\u590D reply=\u56DE\u590D
defaultRoleName=\u9ED8\u8BA4\u89D2\u8272\u540D\u79F0 defaultRoleName=\u9ED8\u8BA4\u89D2\u8272\u540D\u79F0
async=\u5F02\u6B65 async=\u5F02\u6B65
valueScale=\u503C\u7CBE\u5EA6
scale=\u7CBE\u5EA6

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

@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15" "vuepress": "2.0.0-rc.15"
}, },
"dependencies": { "dependencies": {
"platform-core": "8.2.122", "platform-core": "8.2.123",
"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"

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"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",

69
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/extension/listener/start/ProcessStartListener.java

@ -0,0 +1,69 @@
package io.sc.platform.flowable.extension.listener.start;
import io.sc.platform.flowable.enums.ProcessStatus;
import io.sc.platform.flowable.jpa.entity.ProcessEntity;
import io.sc.platform.flowable.service.ProcessEntityService;
import io.sc.platform.flowable.support.BusinessKeyAndDescriptionWrapper;
import io.sc.platform.flowable.support.BusinessKeyAndDescriptionWrapperMapper;
import io.sc.platform.util.StringUtil;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
@Service("processStartListener")
public class ProcessStartListener implements ExecutionListener {
@Autowired private ProcessEntityService processEntityService;
@Autowired private JdbcTemplate jdbcTemplate;
@Override
public void notify(DelegateExecution execution) {
insertProcInsExtByDefinitionId(execution.getProcessDefinitionId(),execution.getProcessInstanceId(),execution.getProcessInstanceBusinessKey());
}
private void insertProcInsExtByDefinitionId(String processDefinitionId, String processInstanceId, String businessKey){
if(!StringUtils.hasText(processDefinitionId) || !StringUtils.hasText(processInstanceId) || !StringUtils.hasText(businessKey)){
return;
}
ProcessEntity entity =processEntityService.getRepository().findByDeployedId(processDefinitionId);
if(entity==null || !StringUtils.hasText(entity.getBusinessDescriptionSql())){
return;
}
Map<String,Object> variables =new HashMap<>();
variables.put("businessKey", StringUtil.escapeSqlSpecialChar(businessKey));
String sql =StringUtil.format(entity.getBusinessDescriptionSql(),variables);
BusinessKeyAndDescriptionWrapper wrapper =jdbcTemplate.queryForObject(sql,new BusinessKeyAndDescriptionWrapperMapper());
if(wrapper==null){
return;
}
jdbcTemplate.update("insert into SYS_PROCESS_INST_EXT(PROC_INST_ID_,CUST_NO_,CUST_NAME_) values(?,?,?)",processInstanceId,wrapper.getCustNo(),wrapper.getCustName());
}
private void insertProcInsExtByDefinitionKey(String processDefinitionKey,String processInstanceId,String businessKey){
if(!StringUtils.hasText(processDefinitionKey) || !StringUtils.hasText(processInstanceId) || !StringUtils.hasText(businessKey)){
return;
}
ProcessEntity entity =processEntityService.getRepository().findByKeyAndStatus(processDefinitionKey, ProcessStatus.RELEASE);
if(entity==null || !StringUtils.hasText(entity.getBusinessDescriptionSql())){
return;
}
Map<String,Object> variables =new HashMap<>();
variables.put("businessKey",StringUtil.escapeSqlSpecialChar(businessKey));
String sql =StringUtil.format(entity.getBusinessDescriptionSql(),variables);
BusinessKeyAndDescriptionWrapper wrapper =jdbcTemplate.queryForObject(sql,new BusinessKeyAndDescriptionWrapperMapper());
if(wrapper==null){
return;
}
jdbcTemplate.update("insert into SYS_PROCESS_INST_EXT(PROC_INST_ID_,CUST_NO_,CUST_NAME_) values(?,?,?)",processInstanceId,wrapper.getCustNo(),wrapper.getCustName());
}
}

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

@ -87,7 +87,6 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
builder.transientVariables(convertTransientVariables(variables,transientVariables)); builder.transientVariables(convertTransientVariables(variables,transientVariables));
ProcessInstance processInstance =builder.start(); ProcessInstance processInstance =builder.start();
insertProcInsExtByDefinitionKey(processDefinitionKey,processInstance.getId(),bussinessKey);
return startProcess(processInstance,variables,transientVariables,autoCompleteFirstTask); return startProcess(processInstance,variables,transientVariables,autoCompleteFirstTask);
} }
@ -111,7 +110,6 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
builder.transientVariables(convertTransientVariables(variables,transientVariables)); builder.transientVariables(convertTransientVariables(variables,transientVariables));
ProcessInstance processInstance =builder.start(); ProcessInstance processInstance =builder.start();
insertProcInsExtByDefinitionId(processDefinitionId,processInstance.getId(),bussinessKey);
return startProcess(processInstance,variables,transientVariables,autoCompleteFirstTask); return startProcess(processInstance,variables,transientVariables,autoCompleteFirstTask);
} }
@ -509,49 +507,6 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
managementService.executeCommand(new JumpTaskCommand(taskId,targetActivityId,targetAssignee)); managementService.executeCommand(new JumpTaskCommand(taskId,targetActivityId,targetAssignee));
} }
@Transactional
private void insertProcInsExtByDefinitionKey(String processDefinitionKey,String processInstanceId,String businessKey){
if(!StringUtils.hasText(processDefinitionKey) || !StringUtils.hasText(processInstanceId) || !StringUtils.hasText(businessKey)){
return;
}
ProcessEntity entity =processEntityService.getRepository().findByKeyAndStatus(processDefinitionKey, ProcessStatus.RELEASE);
if(entity==null || !StringUtils.hasText(entity.getBusinessDescriptionSql())){
return;
}
Map<String,Object> variables =new HashMap<>();
variables.put("businessKey",StringUtil.escapeSqlSpecialChar(businessKey));
String sql =StringUtil.format(entity.getBusinessDescriptionSql(),variables);
BusinessKeyAndDescriptionWrapper wrapper =jdbcTemplate.queryForObject(sql,new BusinessKeyAndDescriptionWrapperMapper());
if(wrapper==null){
return;
}
jdbcTemplate.update("insert into SYS_PROCESS_INST_EXT(PROC_INST_ID_,CUST_NO_,CUST_NAME_) values(?,?,?)",processInstanceId,wrapper.getCustNo(),wrapper.getCustName());
}
@Transactional
private void insertProcInsExtByDefinitionId(String processDefinitionId, String processInstanceId, String businessKey){
if(!StringUtils.hasText(processDefinitionId) || !StringUtils.hasText(processInstanceId) || !StringUtils.hasText(businessKey)){
return;
}
ProcessEntity entity =processEntityService.getRepository().findByDeployedId(processDefinitionId);
if(entity==null || !StringUtils.hasText(entity.getBusinessDescriptionSql())){
return;
}
Map<String,Object> variables =new HashMap<>();
variables.put("businessKey",StringUtil.escapeSqlSpecialChar(businessKey));
String sql =StringUtil.format(entity.getBusinessDescriptionSql(),variables);
BusinessKeyAndDescriptionWrapper wrapper =jdbcTemplate.queryForObject(sql,new BusinessKeyAndDescriptionWrapperMapper());
if(wrapper==null){
return;
}
jdbcTemplate.update("insert into SYS_PROCESS_INST_EXT(PROC_INST_ID_,CUST_NO_,CUST_NAME_) values(?,?,?)",processInstanceId,wrapper.getCustNo(),wrapper.getCustName());
}
private AssigneeQueryService getAssignmentStrategySpringBean(BpmnModel model,ProcessInstance processInstance,UserTask taskDefine) { private AssigneeQueryService getAssignmentStrategySpringBean(BpmnModel model,ProcessInstance processInstance,UserTask taskDefine) {
String beanName =DEFAULT_ASSIGNMENT_STRATEGY_SPRING_BEAN_NAME; String beanName =DEFAULT_ASSIGNMENT_STRATEGY_SPRING_BEAN_NAME;
String processDefinitionKey =processInstance.getProcessDefinitionKey(); String processDefinitionKey =processInstance.getProcessDefinitionKey();

3
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/components.json

@ -2,6 +2,7 @@
"includes":[ "includes":[
"io.sc.platform.flowable.controller", "io.sc.platform.flowable.controller",
"io.sc.platform.flowable.service.impl", "io.sc.platform.flowable.service.impl",
"io.sc.platform.flowable.extension.listener.task" "io.sc.platform.flowable.extension.listener.task",
"io.sc.platform.flowable.extension.listener.start"
] ]
} }

2
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/parameters.json

@ -7,7 +7,7 @@
"parentId": "parameter.system.workbench", "parentId": "parameter.system.workbench",
"code": "parameter.system.workbench.processDefines", "code": "parameter.system.workbench.processDefines",
"multiLineText": true, "multiLineText": true,
"defaultValue": "{}", "defaultValue": "{\"RULE_ENGINE_APPROVING\":\"模型发布\"}",
"order": 100 "order": 100
}, },
/*//*/ /*//*/

120
io.sc.platform.flowable/src/main/resources/io/sc/platform/flowable/sample/Sample.bpmn

@ -1,32 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.8.0">
<process id="IRS" name="评级审批流程" isExecutable="true"> <process id="SAMPLE" name="示例流程" isExecutable="true">
<dataObject id="assignment-strategy" name="任务分配策略" itemSubjectRef="xsd:string"> <dataObject id="assignment-strategy" name="分配策略" itemSubjectRef="xsd:string">
<extensionElements> <extensionElements>
<flowable:value>{"A2":"platformAssigneeQueryService"}</flowable:value> <flowable:value>{"A2":"platformAssigneeQueryService"}</flowable:value>
</extensionElements> </extensionElements>
</dataObject> </dataObject>
<startEvent id="startevent1" name="Start"></startEvent> <startEvent id="start" name="开始" flowable:formFieldValidation="true">
<userTask id="A1" name="提交申请" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:skipExpression="${execution.getVariable('skipFirst')==true}"> <extensionElements>
<flowable:executionListener event="end" delegateExpression="${processStartListener}"/>
</extensionElements>
</startEvent>
<userTask id="A1" name="提交申请" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true" flowable:skipExpression="${execution.getVariable('skipFirst')==true}">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
<modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group> <modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete> <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements> </extensionElements>
</userTask> </userTask>
<endEvent id="endevent1" name="End"></endEvent> <userTask id="A2" name="复核" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true">
<userTask id="A2" name="复核" flowable:assignee="${assignee}" flowable:candidateGroups="admin">
<extensionElements> <extensionElements>
<flowable:taskListener event="assignment" delegateExpression="${flowableSendMailListener}"> <flowable:taskListener event="assignment" delegateExpression="${flowableSendMailListener}">
<flowable:field name="title"> <flowable:field name="title">
<flowable:string><![CDATA[您有一个 [示例] 流程的 [复核] 任务等待处理]]></flowable:string> <flowable:string><![CDATA[您有一个 [示例] 流程的 [复核] 任务等待处理]]></flowable:string>
</flowable:field> </flowable:field>
<flowable:field name="content"> <flowable:field name="content">
<flowable:string><![CDATA[ <flowable:string><![CDATA[${assignee},您好! 您有一个 [示例] 流程的 [复核] 任务等待处理,详情参见: http://localhost:8080]]></flowable:string>
${assignee},您好!
您有一个 [示例] 流程的 [复核] 任务等待处理,详情参见: http://localhost:8080
]]></flowable:string>
</flowable:field> </flowable:field>
</flowable:taskListener> </flowable:taskListener>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
@ -34,83 +33,84 @@ ${assignee},您好!
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete> <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements> </extensionElements>
</userTask> </userTask>
<userTask id="A3" name="认定" default="flow4" flowable:assignee="${assignee}" flowable:candidateGroups="admin"> <endEvent id="end" name="结束"/>
<sequenceFlow id="sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" sourceRef="start" targetRef="A1"/>
<sequenceFlow id="sid-EC4C37D8-A419-4DD1-9569-DD93AE964688" sourceRef="A1" targetRef="A2"/>
<userTask id="A3" name="认定" default="sid-95DCA487-E110-49BB-86F9-C623692DD8BA" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
<modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group> <modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete> <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements> </extensionElements>
</userTask> </userTask>
<userTask id="A4" name="最终认定" flowable:assignee="${assignee}" flowable:candidateGroups="admin"> <sequenceFlow id="sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A" sourceRef="A2" targetRef="A3"/>
<userTask id="A4" name="最终认定" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
<modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group> <modeler:activiti-idm-candidate-group xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete> <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements> </extensionElements>
</userTask> </userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="A1"></sequenceFlow> <sequenceFlow id="sid-87E440E2-0998-4C95-B4A4-444397ADB79C" sourceRef="A4" targetRef="end"/>
<sequenceFlow id="flow2" sourceRef="A1" targetRef="A2"></sequenceFlow> <sequenceFlow id="sid-95DCA487-E110-49BB-86F9-C623692DD8BA" sourceRef="A3" targetRef="A4"/>
<sequenceFlow id="flow3" sourceRef="A2" targetRef="A3"></sequenceFlow> <sequenceFlow id="sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" name="退回给复核岗" sourceRef="A3" targetRef="A2">
<sequenceFlow id="flow5" sourceRef="A4" targetRef="endevent1"></sequenceFlow>
<sequenceFlow id="flow4" sourceRef="A3" targetRef="A4"></sequenceFlow>
<sequenceFlow id="sid-71C0BD38-526F-4553-817A-74FEEA681839" name="回退给申请者" sourceRef="A3" targetRef="A1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-2}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-68F8FEAE-F90F-4FE8-A63C-C83940F926B7" name="回退给复核岗" sourceRef="A3" targetRef="A2">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-1}]]></conditionExpression> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-1}]]></conditionExpression>
</sequenceFlow> </sequenceFlow>
<sequenceFlow id="sid-8C796912-0699-4ADA-9F3F-91154970C7E2" name="退回给申请人" sourceRef="A3" targetRef="A1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-2}]]></conditionExpression>
</sequenceFlow>
</process> </process>
<bpmndi:BPMNDiagram id="BPMNDiagram_IRS"> <bpmndi:BPMNDiagram id="BPMNDiagram_SAMPLE">
<bpmndi:BPMNPlane bpmnElement="IRS" id="BPMNPlane_IRS"> <bpmndi:BPMNPlane bpmnElement="SAMPLE" id="BPMNPlane_SAMPLE">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="30.0" width="30.0" x="32.02187570282153" y="169.09844066269687"></omgdc:Bounds> <omgdc:Bounds height="30.0" width="30.0" x="60.0" y="165.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1"> <bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1">
<omgdc:Bounds height="80.0" width="105.0" x="105.0" y="144.09844066269687"></omgdc:Bounds> <omgdc:Bounds height="40.0" width="96.0" x="120.0" y="160.5"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="28.0" width="28.0" x="737.0218757028215" y="170.09844066269687"></omgdc:Bounds>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="A2" id="BPMNShape_A2"> <bpmndi:BPMNShape bpmnElement="A2" id="BPMNShape_A2">
<omgdc:Bounds height="80.0" width="105.0" x="240.0" y="144.09844066269687"></omgdc:Bounds> <omgdc:Bounds height="40.0" width="81.0" x="255.0" y="160.5"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
<omgdc:Bounds height="28.0" width="28.0" x="615.0" y="166.5"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="A3" id="BPMNShape_A3"> <bpmndi:BPMNShape bpmnElement="A3" id="BPMNShape_A3">
<omgdc:Bounds height="80.0" width="104.99999999999994" x="407.02187570282155" y="144.09844066269687"></omgdc:Bounds> <omgdc:Bounds height="42.0" width="82.0" x="375.0" y="159.5"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="A4" id="BPMNShape_A4"> <bpmndi:BPMNShape bpmnElement="A4" id="BPMNShape_A4">
<omgdc:Bounds height="80.0" width="105.0" x="584.5218757028215" y="144.09844066269687"></omgdc:Bounds> <omgdc:Bounds height="40.0" width="92.0" x="495.0" y="160.5"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-71C0BD38-526F-4553-817A-74FEEA681839" id="BPMNEdge_sid-71C0BD38-526F-4553-817A-74FEEA681839"> <bpmndi:BPMNEdge bpmnElement="sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" id="BPMNEdge_sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="40.5" flowable:targetDockerY="20.0">
<omgdi:waypoint x="459.2539089472079" y="224.0484406626969"></omgdi:waypoint> <omgdi:waypoint x="416.0" y="159.5"/>
<omgdi:waypoint x="459.0" y="262.0"></omgdi:waypoint> <omgdi:waypoint x="416.0" y="77.0"/>
<omgdi:waypoint x="157.0" y="262.0"></omgdi:waypoint> <omgdi:waypoint x="295.0" y="77.0"/>
<omgdi:waypoint x="157.2432657295934" y="224.0484406626969"></omgdi:waypoint> <omgdi:waypoint x="295.4033816425121" y="160.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <bpmndi:BPMNEdge bpmnElement="sid-95DCA487-E110-49BB-86F9-C623692DD8BA" id="BPMNEdge_sid-95DCA487-E110-49BB-86F9-C623692DD8BA" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="46.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="61.97187420581508" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="456.94999999995696" y="180.5"/>
<omgdi:waypoint x="105.0" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="494.9999999999859" y="180.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <bpmndi:BPMNEdge bpmnElement="sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A" id="BPMNEdge_sid-60D2D382-C039-4E2F-BC47-348DB6E9A02A" flowable:sourceDockerX="40.5" flowable:sourceDockerY="20.0" flowable:targetDockerX="41.0" flowable:targetDockerY="21.0">
<omgdi:waypoint x="209.94999999999249" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="335.949999999913" y="180.5"/>
<omgdi:waypoint x="240.0" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="375.0" y="180.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <bpmndi:BPMNEdge bpmnElement="sid-8C796912-0699-4ADA-9F3F-91154970C7E2" id="BPMNEdge_sid-8C796912-0699-4ADA-9F3F-91154970C7E2" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="344.95000000000005" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="416.0" y="201.45000000000002"/>
<omgdi:waypoint x="407.02187570282155" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="416.0" y="284.0"/>
<omgdi:waypoint x="168.0" y="284.0"/>
<omgdi:waypoint x="168.0" y="200.45000000000002"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> <bpmndi:BPMNEdge bpmnElement="sid-87E440E2-0998-4C95-B4A4-444397ADB79C" id="BPMNEdge_sid-87E440E2-0998-4C95-B4A4-444397ADB79C" flowable:sourceDockerX="46.0" flowable:sourceDockerY="20.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="511.97187570282154" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="586.9499999999739" y="180.5"/>
<omgdi:waypoint x="584.5218757028215" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="615.0" y="180.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> <bpmndi:BPMNEdge bpmnElement="sid-EC4C37D8-A419-4DD1-9569-DD93AE964688" id="BPMNEdge_sid-EC4C37D8-A419-4DD1-9569-DD93AE964688" flowable:sourceDockerX="48.0" flowable:sourceDockerY="20.0" flowable:targetDockerX="40.5" flowable:targetDockerY="20.0">
<omgdi:waypoint x="689.4718757028214" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="215.94999999998186" y="180.5"/>
<omgdi:waypoint x="737.0218757028215" y="184.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="254.99999999998545" y="180.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-68F8FEAE-F90F-4FE8-A63C-C83940F926B7" id="BPMNEdge_sid-68F8FEAE-F90F-4FE8-A63C-C83940F926B7"> <bpmndi:BPMNEdge bpmnElement="sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" id="BPMNEdge_sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="459.28220403988433" y="144.09844066269687"></omgdi:waypoint> <omgdi:waypoint x="89.94974433675017" y="180.08037530758003"/>
<omgdi:waypoint x="459.0" y="97.0"></omgdi:waypoint> <omgdi:waypoint x="119.99999999999932" y="180.24193548387098"/>
<omgdi:waypoint x="292.0" y="97.0"></omgdi:waypoint>
<omgdi:waypoint x="292.2703747639128" y="144.09844066269687"></omgdi:waypoint>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram> </bpmndi:BPMNDiagram>

28
io.sc.platform.flowable/src/main/resources/io/sc/platform/flowable/sample/Sample.bpmn20.xml

@ -1,12 +1,16 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.8.0"> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.8.0">
<process id="cc" name="cc" isExecutable="true"> <process id="SAMPLE" name="示例流程" isExecutable="true">
<dataObject id="assignment-strategy" name="分配策略" itemSubjectRef="xsd:string"> <dataObject id="assignment-strategy" name="分配策略" itemSubjectRef="xsd:string">
<extensionElements> <extensionElements>
<flowable:value>{"A2":"platformAssigneeQueryService"}</flowable:value> <flowable:value>{"A2":"platformAssigneeQueryService"}</flowable:value>
</extensionElements> </extensionElements>
</dataObject> </dataObject>
<startEvent id="start" name="开始" flowable:formFieldValidation="true"/> <startEvent id="start" name="开始" flowable:formFieldValidation="true">
<extensionElements>
<flowable:executionListener event="end" delegateExpression="${processStartListener}"/>
</extensionElements>
</startEvent>
<userTask id="A1" name="提交申请" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true" flowable:skipExpression="${execution.getVariable('skipFirst')==true}"> <userTask id="A1" name="提交申请" flowable:assignee="${assignee}" flowable:candidateGroups="admin" flowable:formFieldValidation="true" flowable:skipExpression="${execution.getVariable('skipFirst')==true}">
<extensionElements> <extensionElements>
<modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin> <modeler:group-info-name-admin xmlns:modeler="http://flowable.org/modeler"><![CDATA[系统管理员]]></modeler:group-info-name-admin>
@ -56,10 +60,10 @@
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-2}]]></conditionExpression> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${goback==-2}]]></conditionExpression>
</sequenceFlow> </sequenceFlow>
</process> </process>
<bpmndi:BPMNDiagram id="BPMNDiagram_cc"> <bpmndi:BPMNDiagram id="BPMNDiagram_SAMPLE">
<bpmndi:BPMNPlane bpmnElement="cc" id="BPMNPlane_cc"> <bpmndi:BPMNPlane bpmnElement="SAMPLE" id="BPMNPlane_SAMPLE">
<bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start"> <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="30.0" width="30.0" x="60.0" y="168.5"/> <omgdc:Bounds height="30.0" width="30.0" x="60.0" y="165.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1"> <bpmndi:BPMNShape bpmnElement="A1" id="BPMNShape_A1">
<omgdc:Bounds height="40.0" width="96.0" x="120.0" y="160.5"/> <omgdc:Bounds height="40.0" width="96.0" x="120.0" y="160.5"/>
@ -78,9 +82,9 @@
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" id="BPMNEdge_sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="40.5" flowable:targetDockerY="20.0"> <bpmndi:BPMNEdge bpmnElement="sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" id="BPMNEdge_sid-74A758E1-9AB1-4E1C-9D03-EF323869EB4E" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="40.5" flowable:targetDockerY="20.0">
<omgdi:waypoint x="416.0" y="159.5"/> <omgdi:waypoint x="416.0" y="159.5"/>
<omgdi:waypoint x="416.0" y="77.5"/> <omgdi:waypoint x="416.0" y="77.0"/>
<omgdi:waypoint x="295.0" y="77.5"/> <omgdi:waypoint x="295.0" y="77.0"/>
<omgdi:waypoint x="295.40291262135923" y="160.5"/> <omgdi:waypoint x="295.4033816425121" y="160.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-95DCA487-E110-49BB-86F9-C623692DD8BA" id="BPMNEdge_sid-95DCA487-E110-49BB-86F9-C623692DD8BA" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="46.0" flowable:targetDockerY="20.0"> <bpmndi:BPMNEdge bpmnElement="sid-95DCA487-E110-49BB-86F9-C623692DD8BA" id="BPMNEdge_sid-95DCA487-E110-49BB-86F9-C623692DD8BA" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="46.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="456.94999999995696" y="180.5"/> <omgdi:waypoint x="456.94999999995696" y="180.5"/>
@ -92,8 +96,8 @@
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-8C796912-0699-4ADA-9F3F-91154970C7E2" id="BPMNEdge_sid-8C796912-0699-4ADA-9F3F-91154970C7E2" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0"> <bpmndi:BPMNEdge bpmnElement="sid-8C796912-0699-4ADA-9F3F-91154970C7E2" id="BPMNEdge_sid-8C796912-0699-4ADA-9F3F-91154970C7E2" flowable:sourceDockerX="41.0" flowable:sourceDockerY="21.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="416.0" y="201.45000000000002"/> <omgdi:waypoint x="416.0" y="201.45000000000002"/>
<omgdi:waypoint x="416.0" y="284.5"/> <omgdi:waypoint x="416.0" y="284.0"/>
<omgdi:waypoint x="168.0" y="284.5"/> <omgdi:waypoint x="168.0" y="284.0"/>
<omgdi:waypoint x="168.0" y="200.45000000000002"/> <omgdi:waypoint x="168.0" y="200.45000000000002"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-87E440E2-0998-4C95-B4A4-444397ADB79C" id="BPMNEdge_sid-87E440E2-0998-4C95-B4A4-444397ADB79C" flowable:sourceDockerX="46.0" flowable:sourceDockerY="20.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"> <bpmndi:BPMNEdge bpmnElement="sid-87E440E2-0998-4C95-B4A4-444397ADB79C" id="BPMNEdge_sid-87E440E2-0998-4C95-B4A4-444397ADB79C" flowable:sourceDockerX="46.0" flowable:sourceDockerY="20.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
@ -105,8 +109,8 @@
<omgdi:waypoint x="254.99999999998545" y="180.5"/> <omgdi:waypoint x="254.99999999998545" y="180.5"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" id="BPMNEdge_sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0"> <bpmndi:BPMNEdge bpmnElement="sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" id="BPMNEdge_sid-452257DA-C9ED-41BB-A95A-899D5F7FD363" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="48.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="89.94237667591156" y="183.0163757683913"/> <omgdi:waypoint x="89.94974433675017" y="180.08037530758003"/>
<omgdi:waypoint x="120.0" y="182.04677419354837"/> <omgdi:waypoint x="119.99999999999932" y="180.24193548387098"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram> </bpmndi:BPMNDiagram>

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"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",

1
io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue

@ -258,6 +258,7 @@
sql += ' CONCAT(CODE_,\':\',VERSION_) BUSINESS_KEY,\n'; sql += ' CONCAT(CODE_,\':\',VERSION_) BUSINESS_KEY,\n';
sql += ' NAME_ CUST_NO,\n'; sql += ' NAME_ CUST_NO,\n';
sql += ' CONCAT(\'V\',VERSION_) CUST_NAME,\n'; sql += ' CONCAT(\'V\',VERSION_) CUST_NAME,\n';
sql += ' NULL PROCESS_STATUS\n';
sql += 'from RE_RESOURCE\n'; sql += 'from RE_RESOURCE\n';
sql += 'where CONCAT(CODE_,\':\',VERSION_) = \'${businessKey}\'\n'; sql += 'where CONCAT(CODE_,\':\',VERSION_) = \'${businessKey}\'\n';
sql += '\n'; sql += '\n';

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

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

@ -112,7 +112,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.122", "platform-core": "8.2.123",
"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",

8
io.sc.platform.system.frontend/src/i18n/messages.json

@ -49,8 +49,12 @@
"system.shared.selectRole.dialog.title": "Select Roles", "system.shared.selectRole.dialog.title": "Select Roles",
"system.shared.selectRole.dialog.grid.title": "Available Role List", "system.shared.selectRole.dialog.grid.title": "Available Role List",
"system.shared.selectOrg.grid.title": "Organization Tree", "system.shared.selectOrg.grid.title": "Included Organization Tree",
"system.shared.selectOrg.grid.toolbar.save.tip": "Are you sure to update organizations?", "system.shared.selectOrg.grid.toolbar.selectIn": "Select In",
"system.shared.selectOrg.grid.toolbar.selectOut": "Select Out",
"system.shared.selectOrg.grid.toolbar.selectOut.tip": "Are you sure to select out the organizations?",
"system.shared.selectOrg.dialog.title": "Select Organization",
"system.shared.selectOrg.dialog.grid.title": "All Organization",
"system.shared.selectApplication.grid.title": "Included Application List", "system.shared.selectApplication.grid.title": "Included Application List",
"system.shared.selectApplication.grid.toolbar.selectIn": "Select In", "system.shared.selectApplication.grid.toolbar.selectIn": "Select In",

8
io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json

@ -49,8 +49,12 @@
"system.shared.selectRole.dialog.title": "選擇角色", "system.shared.selectRole.dialog.title": "選擇角色",
"system.shared.selectRole.dialog.grid.title": "可選角色列表", "system.shared.selectRole.dialog.grid.title": "可選角色列表",
"system.shared.selectOrg.grid.title": "機構樹", "system.shared.selectOrg.grid.title": "已包含機構樹",
"system.shared.selectOrg.grid.toolbar.save.tip": "您确定要更新機構吗?", "system.shared.selectOrg.grid.toolbar.selectIn": "選入",
"system.shared.selectOrg.grid.toolbar.selectOut": "選出",
"system.shared.selectOrg.grid.toolbar.selectOut.tip": "您確定要選出機構嗎?",
"system.shared.selectOrg.dialog.title": "選擇機構",
"system.shared.selectOrg.dialog.grid.title": "所有機構",
"system.shared.selectApplication.grid.title": "已包含應用列表", "system.shared.selectApplication.grid.title": "已包含應用列表",
"system.shared.selectApplication.grid.toolbar.selectIn": "選入", "system.shared.selectApplication.grid.toolbar.selectIn": "選入",

8
io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json

@ -49,8 +49,12 @@
"system.shared.selectRole.dialog.title": "选择角色", "system.shared.selectRole.dialog.title": "选择角色",
"system.shared.selectRole.dialog.grid.title": "可选角色列表", "system.shared.selectRole.dialog.grid.title": "可选角色列表",
"system.shared.selectOrg.grid.title": "机构树", "system.shared.selectOrg.grid.title": "已包含机构树",
"system.shared.selectOrg.grid.toolbar.save.tip": "您确定要更新机构吗?", "system.shared.selectOrg.grid.toolbar.selectIn": "选入",
"system.shared.selectOrg.grid.toolbar.selectOut": "选出",
"system.shared.selectOrg.grid.toolbar.selectOut.tip": "您确定要选出机构吗?",
"system.shared.selectOrg.dialog.title": "选择机构",
"system.shared.selectOrg.dialog.grid.title": "所有机构",
"system.shared.selectApplication.grid.title": "已包含应用列表", "system.shared.selectApplication.grid.title": "已包含应用列表",
"system.shared.selectApplication.grid.toolbar.selectIn": "选入", "system.shared.selectApplication.grid.toolbar.selectIn": "选入",

87
io.sc.platform.system.frontend/src/views/shared/SelectOrgTreeDialog.vue

@ -0,0 +1,87 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('system.shared.selectOrg.dialog.title')"
width="800px"
height="600px"
:can-maximize="false"
:buttons="[
{
label: $t('confirm'),
click: () => {
const ids = Tools.extractProperties(treeGridRef.getSelectedRows(), 'id');
emit('afterSelected', ids, dialogRef);
},
},
]"
>
<w-grid
ref="treeGridRef"
:title="$t('system.shared.selectOrg.dialog.grid.title')"
hide-bottom
:config-button="false"
:tree="true"
selection="multiple"
:checkbox-selection="true"
tree-tick-strategy="strict"
ticked-field="selected"
:tree-icon="
(row) => {
return { name: 'folder', color: 'amber' };
}
"
:fetch-data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser')"
:auto-fetch-data="true"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'expand', 'separator', 'view']"
:columns="[
{ width: '100%', name: 'name', label: $t('name') },
{ width: 100, name: 'code', label: $t('code') },
{ width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag(), sortable: false },
]"
: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') },
{ 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>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { Environment, Formater, Tools } from 'platform-core';
const emit = defineEmits<{
(e: 'afterSelected', ids: string[], dialogComponent: any): void;
}>();
const dialogRef = ref();
const treeGridRef = ref();
const open = (foreignKey: string) => {
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
</script>

48
io.sc.platform.system.frontend/src/views/shared/SelectOrgTreeGrid.vue

@ -1,4 +1,5 @@
<template> <template>
<div style="height: 100%">
<w-grid <w-grid
ref="treeGridRef" ref="treeGridRef"
:title="$t('system.shared.selectOrg.grid.title')" :title="$t('system.shared.selectOrg.grid.title')"
@ -21,26 +22,39 @@
:toolbar-actions="[ :toolbar-actions="[
'refresh', 'refresh',
'separator', 'separator',
{ {
extend: 'expand', name: 'selectIn',
label: $t('system.shared.selectOrg.grid.toolbar.selectIn'),
icon: 'bi-download',
enableIf: () => { enableIf: () => {
return foreignValue && treeGridRef?.getRows()?.length > 0; return foreignValue ? true : false;
},
click: () => {
selectOrgTreeDialog.open();
}, },
}, },
{ {
name: 'save', name: 'selectOut',
label: $t('save'), label: $t('system.shared.selectOrg.grid.toolbar.selectOut'),
icon: 'bi-floppy', icon: 'bi-upload',
enableIf: () => { enableIf: () => {
return foreignValue && treeGridRef?.getRows()?.length > 0; return foreignValue && treeGridRef?.getSelectedRows()?.length > 0;
}, },
click: () => { click: (arg) => {
DialogManager.confirm($t('system.shared.selectOrg.grid.toolbar.save.tip'), () => { const ids = Tools.extractProperties(arg.selecteds, 'id');
const ids = Tools.extractProperties(treeGridRef?.getTickedRows(), 'id'); DialogManager.confirm($t('system.shared.selectOrg.grid.toolbar.selectOut.tip'), () => {
emit('update', ids, treeGridRef); emit('selectOut', ids, treeGridRef);
}); });
}, },
}, },
{
extend: 'expand',
label: $t('expand'),
enableIf: () => {
return foreignValue && treeGridRef?.getRows()?.length > 0;
},
},
'separator', 'separator',
'view', 'view',
]" ]"
@ -68,10 +82,20 @@
}, },
}" }"
></w-grid> ></w-grid>
<SelectOrgTreeDialog
ref="selectOrgTreeDialog"
@after-selected="
(ids: string[]) => {
emit('selectIn', ids, treeGridRef, selectOrgTreeDialog);
}
"
></SelectOrgTreeDialog>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import { DialogManager, Formater, Tools } from 'platform-core'; import { DialogManager, Formater, Tools } from 'platform-core';
import SelectOrgTreeDialog from './SelectOrgTreeDialog.vue';
defineProps({ defineProps({
fetchDataUrl: { type: String, default: '' }, fetchDataUrl: { type: String, default: '' },
@ -80,10 +104,12 @@ defineProps({
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update', ids: string[], gridComponent: any): void; (e: 'selectIn', ids: string[], gridComponent: any, dialogComponent: any): void;
(e: 'selectOut', ids: string[], gridComponent: any): void;
}>(); }>();
const treeGridRef = ref(); const treeGridRef = ref();
const selectOrgTreeDialog = ref();
const refresh = () => { const refresh = () => {
treeGridRef.value?.refresh(); treeGridRef.value?.refresh();

26
io.sc.platform.system.frontend/src/views/user/User.vue

@ -218,7 +218,8 @@
:fetch-data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser')" :fetch-data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser')"
foreign-key="userId" foreign-key="userId"
:foreign-value="currentSelectedUserId" :foreign-value="currentSelectedUserId"
@update="update" @select-in="selectOrgIn"
@select-out="selectOrgOut"
></SelectOrgTreeGrid> ></SelectOrgTreeGrid>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
@ -309,6 +310,29 @@ const update = (ids, gridComponent) => {
}); });
}; };
const selectOrgIn = (ids: string[], gridComponent, dialogComponent) => {
axios
.post(Environment.apiContextPath('/api/system/user/addOrgs'), {
one: userGridRef.value.getSelectedRows()[0].id,
many: ids,
})
.then(() => {
gridComponent?.refresh();
dialogComponent?.close();
});
};
const selectOrgOut = (ids, gridComponent) => {
axios
.post(Environment.apiContextPath('/api/system/user/removeOrgs'), {
one: userGridRef.value.getSelectedRows()[0].id,
many: ids,
})
.then(() => {
gridComponent?.refresh();
});
};
onActivated(() => { onActivated(() => {
roleGridRef.value?.refresh(); roleGridRef.value?.refresh();
orgTreeGridRef.value?.refresh(); orgTreeGridRef.value?.refresh();

3
io.sc.platform.system/src/main/java/io/sc/platform/system/org/controller/OrgWebController.java

@ -58,11 +58,8 @@ public class OrgWebController extends RestCrudController<OrgVo,OrgEntity,String,
*/ */
@GetMapping("listAllOrgsWithSelectedStatusByUser") @GetMapping("listAllOrgsWithSelectedStatusByUser")
public List<OrgVo> listAllOrgsWithSelectedStatusByUser(@RequestParam(name="userId",required=false) String userId, QueryParameter queryParameter) throws Exception{ public List<OrgVo> listAllOrgsWithSelectedStatusByUser(@RequestParam(name="userId",required=false) String userId, QueryParameter queryParameter) throws Exception{
if(StringUtils.hasText(userId)){
return service.listAllOrgsWithSelectedStatusByUser(userId,queryParameter); return service.listAllOrgsWithSelectedStatusByUser(userId,queryParameter);
} }
return QueryResult.emptyList();
}
/** /**
* 查询用户所属机构 * 查询用户所属机构

22
io.sc.platform.system/src/main/java/io/sc/platform/system/org/service/impl/OrgServiceImpl.java

@ -35,24 +35,20 @@ public class OrgServiceImpl extends DaoServiceImpl<OrgEntity, String, OrgReposit
@Override @Override
public List<OrgVo> listAllOrgsWithSelectedStatusByUser(String userId, QueryParameter queryParameter) throws Exception { public List<OrgVo> listAllOrgsWithSelectedStatusByUser(String userId, QueryParameter queryParameter) throws Exception {
List<OrgVo> allOrgVos = EntityVoUtil.toVo(this.list(queryParameter)); List<OrgVo> allOrgVos = EntityVoUtil.toVo(this.list(queryParameter));
if(allOrgVos!=null && !allOrgVos.isEmpty()){ if(allOrgVos==null || allOrgVos.isEmpty()){
List<OrgVo> selectedOrgs = EntityVoUtil.toVo(listOrgsByUser(userId,queryParameter)); return Collections.emptyList();
if(selectedOrgs!=null && !selectedOrgs.isEmpty()){
Map<String,String> selectedOrgIdMap =new HashMap<>(selectedOrgs.size());
for(OrgVo selectedOrg : selectedOrgs){
selectedOrgIdMap.put(selectedOrg.getId(),null);
}
for(OrgVo allOrgVo : allOrgVos){
if(selectedOrgIdMap.containsKey(allOrgVo.getId())){
allOrgVo.setSelected(true);
}
}
} }
allOrgVos.sort(OrgComparator.voName);
if(!StringUtils.hasText(userId)){
return allOrgVos; return allOrgVos;
} }
List<OrgVo> selectedOrgs = EntityVoUtil.toVo(listOrgsByUser(userId,queryParameter));
if(selectedOrgs==null || selectedOrgs.isEmpty()){
return Collections.emptyList(); return Collections.emptyList();
} }
return selectedOrgs;
}
@Override @Override
public List<OrgEntity> listOrgsByUser(String userId, QueryParameter queryParameter) throws Exception { public List<OrgEntity> listOrgsByUser(String userId, QueryParameter queryParameter) throws Exception {

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

@ -113,7 +113,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.122", "platform-core": "8.2.123",
"quasar": "2.17.6", "quasar": "2.17.6",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.7", "svg-path-commander": "2.1.7",

2
io.sc.website/package.json

@ -28,6 +28,6 @@
}, },
"dependencies": { "dependencies": {
"vue": "3.5.13", "vue": "3.5.13",
"platform-core": "8.2.122" "platform-core": "8.2.123"
} }
} }

2
wra.report.frontend/package.json

@ -112,7 +112,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.122", "platform-core": "8.2.123",
"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",

Loading…
Cancel
Save