Browse Source

发布 8.2.3

1. 修复默认安装时缺失 protocol 属性的 bug。
2. 前端更新到 8.2.17。
3. 规则引擎支持参数类型为特征的输入参数。
main
wangshaoping 2 months ago
parent
commit
50f0b242b7
  1. 2
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 2
      io.sc.engine.mv.frontend/package.json
  4. 6
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/import_render.tpl
  5. 2
      io.sc.engine.rule.frontend/package.json
  6. 5
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml
  7. 2
      io.sc.engine.st.frontend/package.json
  8. 2
      io.sc.platform.core.frontend/package.json
  9. 4
      io.sc.platform.core.frontend/template-project/package.json
  10. 2
      io.sc.platform.developer.doc/package.json
  11. 2
      io.sc.platform.developer.frontend/package.json
  12. 2
      io.sc.platform.lcdp.frontend/package.json
  13. 8
      io.sc.platform.lcdp.frontend/src/components/index.ts
  14. 2
      io.sc.platform.license.keygen.frontend/package.json
  15. 2
      io.sc.platform.mvc.frontend/package.json
  16. 2
      io.sc.platform.scheduler.manager.frontend/package.json
  17. 2
      io.sc.platform.system.frontend/package.json
  18. 18
      io.sc.platform.util/src/main/java/io/sc/platform/util/CollectionUtil.java
  19. 286
      io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java
  20. 9
      io.sc.platform.util/src/main/java/io/sc/platform/util/PlaceHolderExpressionUtil.java
  21. 2
      io.sc.standard.frontend/package.json
  22. 2
      io.sc.website/package.json

2
erm.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_version=8.2.3
platform_plugin_version=8.2.3
platform_core_frontend_version=8.2.18
platform_core_frontend_version=8.2.19
###########################################################
# dependencies version

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

6
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/import_render.tpl

@ -57,10 +57,10 @@ import static io.sc.engine.rule.core.function.StringFunction.startsWith;
import static io.sc.engine.rule.core.function.StringFunction.trim;
import static io.sc.engine.rule.core.function.StringFunction.upperCase;
import static io.sc.platform.util.CollectionUtil.hasElements;
import static io.sc.platform.util.DateUtil.yearBetween;
import static io.sc.platform.util.DateUtil.monthBetween;
import static io.sc.platform.util.DateUtil.yearsBetween;
import static io.sc.platform.util.DateUtil.monthsBetween;
import static io.sc.platform.util.DateUtil.weeksBetween;
import static io.sc.platform.util.DateUtil.dayBetween;
import static io.sc.platform.util.DateUtil.daysBetween;
import static io.sc.platform.util.DateUtil.hoursBetween;
import static io.sc.platform.util.DateUtil.minutesBetween;
import static io.sc.platform.util.DateUtil.secondsBetween;

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -843,8 +843,9 @@
<column name="CODE_" type="NVARCHAR(255)" remarks="引用的参数代码"/>
<column name="IS_SKIP_CHECK_" type="SMALLINT" remarks="是否跳过检查"/>
<column name="INPUT_VALUE_" type="CLOB" remarks="输入值"/>
<column name="EXPECT_VALUE_" type="CLOB" remarks="期望值"/>
<column name="RESULT_VALUE_" type="CLOB" remarks="结果值"/>
<column name="INPUT_VALUE_VALIDATE_MESSAGE_" type="CLOB" remarks="输入值验证结果消息"/>
<column name="EXPECT_VALUE_" type="CLOB" remarks="期望值"/>
<column name="RESULT_VALUE_" type="CLOB" remarks="结果值"/>
<column name="TEST_RESULT_" type="CLOB" remarks="测试结果"/>
<!-- 审计字段 -->

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

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

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.2.17",
"version": "8.2.19",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -110,7 +110,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"platform-core": "8.2.17",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15"
},
"dependencies": {
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"vue": "3.5.13",
"vue-i18n": "10.0.4"

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

8
io.sc.platform.lcdp.frontend/src/components/index.ts

@ -5,11 +5,19 @@
import component_lcdp_Frontend from '@/views/Frontend.vue';
import component_lcdp_Theme from '@/views/Theme.vue';
import component_lcdp_bpm from '@/views/bpm/Bpm.vue';
import component_lcdp_form_page from '@/views/form/Page.vue';
import component_lcdp_excel_report from '@/views/excel_template/ExcelReport.vue';
import component_lcdp_formConfig from '@/views/form/FormConfig.vue';
import component_lcdp_excel_template from '@/views/excel_template/TemplateGrid.vue';
const localComponents = {
'component.lcdp.Frontend': component_lcdp_Frontend,
'component.lcdp.Theme': component_lcdp_Theme,
'component.lcdp.bpm': component_lcdp_bpm,
'component.lcdp.form.page': component_lcdp_form_page,
'component.lcdp.excel.report': component_lcdp_excel_report,
'component.lcdp.formConfig': component_lcdp_formConfig,
'component.lcdp.excel.template': component_lcdp_excel_template,
};
export default localComponents;

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

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

@ -110,7 +110,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

18
io.sc.platform.util/src/main/java/io/sc/platform/util/CollectionUtil.java

@ -145,6 +145,24 @@ public class CollectionUtil {
return result;
}
/**
* Set 转为 List
* @param set 对象集合
* @return 对象列表
*
* @param <T> 数据类型
*/
public static <T> List<T> set2List(Set<T> set){
if(set==null || set.isEmpty()){
return Collections.emptyList();
}
List<T> result =new ArrayList<>();
for(T item : set){
result.add(item);
}
return result;
}
/**
* 冒泡排序
* @param list 列表

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

@ -332,211 +332,211 @@ public class DateUtil {
/**
* 计算两个日期相差的年数
* @param d1 日期1
* @param d2 日期2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的年数
*/
public static long yearBetween(Date d1,Date d2){
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.YEARS.between(ld2,ld1);
}
/**
* 计算两个日期相差的年数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @return 两个日期相差的年数
*/
public static long yearBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.YEARS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long yearsBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的月数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的月数
*/
public static long monthBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld2,ld1);
return ChronoUnit.YEARS.between(ld1,ld2);
}
/**
* 计算两个日期相差的月数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的月数
*/
public static long monthBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long monthsBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的周数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的周数
*/
public static long weeksBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.WEEKS.between(ld2,ld1);
return ChronoUnit.MONTHS.between(ld1,ld2);
}
/**
* 计算两个日期相差的周数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的周数
*/
public static long weeksBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.SECONDS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long weeksBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的天数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的天数
*/
public static long dayBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.DAYS.between(ld2,ld1);
return ChronoUnit.WEEKS.between(ld1,ld2);
}
/**
* 计算两个日期相差的天数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的天数
*/
public static long dayBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.DAYS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long daysBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的小时数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的小时数
*/
public static long hoursBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.HOURS.between(ld2,ld1);
return ChronoUnit.MONTHS.between(ld1,ld2);
}
/**
* 计算两个日期相差的小时数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的小时数
*/
public static long hoursBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.HOURS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long hoursBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的分钟数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的分钟数
*/
public static long minutesBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MINUTES.between(ld2,ld1);
return ChronoUnit.MONTHS.between(ld1,ld2);
}
/**
* 计算两个日期相差的分钟数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的分钟数
*/
public static long minutesBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.HOURS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long minutesBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
}
/**
* 计算两个日期相差的秒数
* @param d1 日期1
* @param d2 日期2
* @return 两个日期相差的秒数
*/
public static long secondsBetween(Date d1,Date d2){
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.SECONDS.between(ld2,ld1);
return ChronoUnit.MONTHS.between(ld1,ld2);
}
/**
* 计算两个日期相差的秒数
* @param d1Str 日期字符串1
* @param d2Str 日期字符串2
* @param o1 日期对象1
* @param o2 日期对象2
* @return 两个日期相差的秒数
*/
public static long secondsBetween(String d1Str,String d2Str){
try {
Date d1 = tryParseDate(d1Str);
Date d2 = tryParseDate(d2Str);
LocalDateTime ld1 = toLocalDateTime(d1);
LocalDateTime ld2 = toLocalDateTime(d2);
return ChronoUnit.SECONDS.between(ld2, ld1);
}catch (Exception e){
throw new RuntimeException(e);
public static long secondsBetween(Object o1,Object o2){
if(o1==null || o2==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
Date d2 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld1 =toLocalDateTime(d1);
LocalDateTime ld2 =toLocalDateTime(d2);
return ChronoUnit.MONTHS.between(ld1,ld2);
}
}

9
io.sc.platform.util/src/main/java/io/sc/platform/util/PlaceHolderExpressionUtil.java

@ -119,7 +119,12 @@ public class PlaceHolderExpressionUtil {
* @return 解析后的占位符表达式列表
*/
public static List<PlaceholderExpression> parse(String content) {
List<PlaceholderExpression> expressions =new ArrayList<>();
Set<PlaceholderExpression> expressions =new TreeSet<>(new Comparator<PlaceholderExpression>() {
@Override
public int compare(PlaceholderExpression o1, PlaceholderExpression o2) {
return o2.getExpression().compareTo(o1.getExpression());
}
});
Matcher matcher =PH_EXPRESSION_REG_PATTERN.matcher(content);
while(matcher.find()){
String group =matcher.group();
@ -128,7 +133,7 @@ public class PlaceHolderExpressionUtil {
expressions.add(expression);
}
}
return expressions;
return CollectionUtil.set2List(expressions);
}
/**

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.18",
"platform-core": "8.2.19",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

2
io.sc.website/package.json

@ -28,6 +28,6 @@
},
"dependencies": {
"vue": "3.5.13",
"platform-core": "8.2.18"
"platform-core": "8.2.19"
}
}
Loading…
Cancel
Save