diff --git a/erm.frontend/package.json b/erm.frontend/package.json index 67d48b15..6b8d9c09 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/gradle.properties b/gradle.properties index 1cbb364a..0ac45dd8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ application_version=1.0.0 platform_group=io.sc platform_version=8.2.5 platform_plugin_version=8.2.5 -platform_core_frontend_version=8.2.22 +platform_core_frontend_version=8.2.24 ########################################################### # dependencies version diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index de2e7256..6f86727c 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/CollectionFunction.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/CollectionFunction.java new file mode 100644 index 00000000..6add8e3b --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/CollectionFunction.java @@ -0,0 +1,21 @@ +package io.sc.engine.rule.core.function; + +import io.sc.platform.util.CollectionUtil; + +public class CollectionFunction { + public static boolean hasElements(Object object){ + return CollectionUtil.hasElements(object); + } + + public static int collectionSize(Object object){ + return CollectionUtil.size(object); + } + + public static Object collectionMax(Object object){ + return CollectionUtil.max(object); + } + + public static Object collectionMin(Object object){ + return CollectionUtil.min(object); + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java index 52a32046..b5bfe748 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java @@ -17,22 +17,50 @@ public class DateFunction { public static Date now() { return new Date(); } - + /** - * 格式化日期 - * @param date 日期 - * @return 格式化后的日期字符串 + * 日期格式化函数 + * @param date 日期对象 + * @param format 格式化字符串 + * @return 格式化字符串 */ - public static String yyyyMMdd(Date date) { - return DateUtil.formatDate(date, DateUtil.yyyyMMdd); + public static String formatDate(Date date,String format){ + return DateUtil.formatDate(date,format); } - - /** - * 格式化日期 - * @param date 日期 - * @return 格式化后的日期字符串 - */ + + public static String yyyy_MM_dd_HH_mm_ss_SSS(Date date) { + return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm_ss_SSS); + } + + public static String yyyy_MM_dd_HH_mm_ss(Date date) { + return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm_ss); + } + + public static String yyyy_MM_dd_HH_mm(Date date) { + return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm); + } + + public static String yyyy_MM_dd_HH(Date date) { + return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH); + } + public static String yyyy_MM_dd(Date date) { - return DateUtil.formatDate(date, DateUtil.yyyy_MM_dd); + return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd); + } + + public static String yyyyMMdd(Date date) { + return DateUtil.formatDate(date,DateUtil.yyyyMMdd); + } + + public static String yyyy_MM(Date date) { + return DateUtil.formatDate(date, DateUtil.yyyy_MM); + } + + public static String yyyyMM(Date date) { + return DateUtil.formatDate(date, DateUtil.yyyyMM); + } + + public static String yyyy(Date date) { + return DateUtil.formatDate(date, DateUtil.yyyy); } } diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl index 03a5d341..484886a6 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl @@ -35,9 +35,21 @@ import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; import static io.sc.engine.rule.core.function.ArithmeticFunction.root; import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; +import static io.sc.engine.rule.core.function.CollectionFunction.hasElements; +import static io.sc.engine.rule.core.function.CollectionFunction.collectionSize; +import static io.sc.engine.rule.core.function.CollectionFunction.collectionMax; +import static io.sc.engine.rule.core.function.CollectionFunction.collectionMin; import static io.sc.engine.rule.core.function.DateFunction.now; -import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; +import static io.sc.engine.rule.core.function.DateFunction.formatDate; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss_SSS; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH; import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; +import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM; +import static io.sc.engine.rule.core.function.DateFunction.yyyyMM; +import static io.sc.engine.rule.core.function.DateFunction.yyyy; import static io.sc.engine.rule.core.function.NormalDistributionFunction.G; import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG; import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite; @@ -56,7 +68,6 @@ import static io.sc.engine.rule.core.function.StringFunction.lowerCase; 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.yearsBetween; import static io.sc.platform.util.DateUtil.monthsBetween; import static io.sc.platform.util.DateUtil.weeksBetween; @@ -64,6 +75,13 @@ 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; +import static io.sc.platform.util.DateUtil.plusYears; +import static io.sc.platform.util.DateUtil.plusMonths; +import static io.sc.platform.util.DateUtil.plusWeeks; +import static io.sc.platform.util.DateUtil.plusDays; +import static io.sc.platform.util.DateUtil.plusHours; +import static io.sc.platform.util.DateUtil.plusMinutes; +import static io.sc.platform.util.DateUtil.plusSeconds; import static io.sc.platform.util.NumberUtil.comma; import static io.sc.platform.util.NumberUtil.decimal; import static io.sc.platform.util.NumberUtil.money; diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index 3e31b9be..267c59ae 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue index 23dca002..37a17b55 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue @@ -68,6 +68,7 @@ const edgeDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -152,6 +153,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: false, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -203,6 +205,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue index 2284cec2..2ecbb074 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue @@ -69,6 +69,7 @@ const edgeDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -153,6 +154,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: false, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -199,6 +201,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -433,6 +436,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, @@ -445,6 +449,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletionManager.autoCompletion(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index c0eb3c33..2a59ba92 100644 --- a/io.sc.engine.st.frontend/package.json +++ b/io.sc.engine.st.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index 3d3546b6..5880901c 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/io.sc.platform.core.frontend/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.22", + "version": "8.2.24", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", @@ -101,7 +101,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -109,10 +109,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", diff --git a/io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue b/io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue index 04a3f0d2..0ac65469 100644 --- a/io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue +++ b/io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue @@ -86,6 +86,8 @@ interface FieldProps extends FormFieldProps { toolbar?: boolean; // 是否可编辑 editable?: boolean; + // 是否强制更新 + forceUpdate?: boolean; // 是否允许自动换行 lineWrap?: boolean; // tab size @@ -113,6 +115,7 @@ const props = withDefaults(defineProps(), { rows: 4, toolbar: true, editable: true, + forceUpdate: false, lineWrap: false, tabSize: 2, lineNumber: false, @@ -277,8 +280,8 @@ onMounted(() => { () => modelValue.value, () => { // 如果当前没有处于编辑状态时, 需要更新编辑器的内容, 以便外部更新内容后能够在编辑器中保持一致 - // 如果当前正处于编辑状态时, 不需要更新编辑器的内容,忘记为什么呢?先注释掉。 - if (!editorView.hasFocus) { + // 如果当前正处于编辑状态时, 不需要更新编辑器的内容, 因为每当编辑器编辑时,都会修改 modelValue, + if (props.forceUpdate || !editorView.hasFocus) { let content = modelValue.value; if (!props.lineBreak && !Tools.isEmpty(content)) { content = content.replace(/[\r\n]/g, ''); diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue index 768af2b7..86956350 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue @@ -20,6 +20,45 @@ + + + + + + + + + + + + + + + + + + @@ -27,6 +66,9 @@ diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue index 05c3b2ec..87ec235e 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue @@ -12,6 +12,8 @@ + + @@ -20,6 +22,8 @@ import { ref } from 'vue'; import Now from './date/Now.vue'; import Between from './date/between/Between.vue'; +import Format from './date/format/Format.vue'; +import Plus from './date/plus/Plus.vue'; const modelValueRef = defineModel({ type: String, default: '' }); const props = defineProps({ diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMax.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMax.vue new file mode 100644 index 00000000..10a911b5 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMax.vue @@ -0,0 +1,44 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMin.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMin.vue new file mode 100644 index 00000000..94fb97dc --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMin.vue @@ -0,0 +1,44 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionSize.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionSize.vue new file mode 100644 index 00000000..fac37b14 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionSize.vue @@ -0,0 +1,44 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue index 8ed8b14e..60274d9c 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue @@ -4,7 +4,7 @@ hasElements ( - x + c ) @@ -16,7 +16,7 @@ const xmlData = ` hasElements ( - x + c ) @@ -33,7 +33,7 @@ const dragstart = (event) => { }; const append = () => { - props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('hasElements(x)')); + props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('hasElements(c)')); modelValueRef.value = modelValueRef.value + xmlData.replace('', ''); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue index 2879e1e1..8ed0d3b7 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue @@ -25,7 +25,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue index 49ce0960..63cf4b16 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue @@ -4,9 +4,9 @@ daysBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` daysBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue index 1597bb05..ea976f50 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue @@ -4,9 +4,9 @@ hoursBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` hoursBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue index 5d9e5d00..ff3e18ae 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue @@ -4,9 +4,9 @@ minutesBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` minutesBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue index 8986766a..6cf9a52f 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue @@ -4,9 +4,9 @@ monthsBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` monthsBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue index bd47d483..dfa94b7a 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue @@ -4,9 +4,9 @@ secondsBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` secondsBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue index b2560883..e6dea0e4 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue @@ -4,9 +4,9 @@ weeksBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` weeksBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue index 2393d90c..58b104980 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue @@ -4,9 +4,9 @@ yearBetween ( - x + d1 , - y + d2 ) @@ -19,11 +19,11 @@ const xmlData = ` yearBetween ( - x + d1 , - y + d2 ) @@ -35,7 +35,7 @@ const props = defineProps({ sourceCodeEditor: { type: Object, default: undefined }, }); -const dragstart = (event) => { +const dragstart = (event: any) => { event.dataTransfer.setData('math', xmlData); event.dataTransfer.setDragImage(event.srcElement, 0, 0); }; diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/Format.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/Format.vue new file mode 100644 index 00000000..69e41a98 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/Format.vue @@ -0,0 +1,173 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/formatDate.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/formatDate.vue new file mode 100644 index 00000000..e7af0ca5 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/formatDate.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy.vue new file mode 100644 index 00000000..ba38e78d --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMM.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMM.vue new file mode 100644 index 00000000..ac7e6445 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMM.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMMdd.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMMdd.vue new file mode 100644 index 00000000..6bcabed8 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMMdd.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM.vue new file mode 100644 index 00000000..1d893f0b --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd.vue new file mode 100644 index 00000000..551b05f5 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH.vue new file mode 100644 index 00000000..851c2607 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm.vue new file mode 100644 index 00000000..69305806 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss.vue new file mode 100644 index 00000000..5c3dfa15 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss_SSS.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss_SSS.vue new file mode 100644 index 00000000..03100185 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss_SSS.vue @@ -0,0 +1,46 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/Plus.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/Plus.vue new file mode 100644 index 00000000..7ab83c15 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/Plus.vue @@ -0,0 +1,122 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusDays.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusDays.vue new file mode 100644 index 00000000..5ee423c6 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusDays.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusHours.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusHours.vue new file mode 100644 index 00000000..4000cd0f --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusHours.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMinutes.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMinutes.vue new file mode 100644 index 00000000..cef62346 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMinutes.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMonths.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMonths.vue new file mode 100644 index 00000000..ddb0a6cd --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMonths.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusSeconds.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusSeconds.vue new file mode 100644 index 00000000..319d7e1b --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusSeconds.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusWeeks.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusWeeks.vue new file mode 100644 index 00000000..903acfef --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusWeeks.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusYears.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusYears.vue new file mode 100644 index 00000000..cd1c8734 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusYears.vue @@ -0,0 +1,52 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages.json b/io.sc.platform.core.frontend/src/platform/i18n/messages.json index 87ac11dc..69e5bb1e 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages.json @@ -231,6 +231,25 @@ "math.toolbar.functions.date.between.hours": "Hours", "math.toolbar.functions.date.between.minutes": "Minutes", "math.toolbar.functions.date.between.seconds": "Seconds", + "math.toolbar.functions.date.format": "Format", + "math.toolbar.functions.date.format.formatDate": "formatDate", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00", + "math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10", + "math.toolbar.functions.date.format.yyyyMMdd": "20251010", + "math.toolbar.functions.date.format.yyyy_MM": "2025-10", + "math.toolbar.functions.date.format.yyyyMM": "202510", + "math.toolbar.functions.date.format.yyyy": "2025", + "math.toolbar.functions.date.plus": "Date Calculate", + "math.toolbar.functions.date.plus.plusYears": "Add years", + "math.toolbar.functions.date.plus.plusMonths": "Add months", + "math.toolbar.functions.date.plus.plusWeeks": "Add weeks", + "math.toolbar.functions.date.plus.plusDays": "Add days", + "math.toolbar.functions.date.plus.plusHours": "Add hours", + "math.toolbar.functions.date.plus.plusMinutes": "Add minutes", + "math.toolbar.functions.date.plus.plusSeconds": "Add seconds", "math.toolbar.functions.date.log": "Logarithm", "math.toolbar.functions.date.log.lg": "base 10 logarithm of x", "math.toolbar.functions.date.log.ln": "base e logarithm of x", @@ -275,6 +294,9 @@ "math.toolbar.functions.formater.percent": "Percentage, leave the y digits after the x decimal point", "math.toolbar.functions.collection": "Collection", "math.toolbar.functions.collection.hasElements": "Has Elements", + "math.toolbar.functions.collection.collectionSize": "Elements Count", + "math.toolbar.functions.collection.collectionMax": "Maximum Element", + "math.toolbar.functions.collection.collectionMin": "Minimum Element", "math.toolbar.userDefinedFunction": "User Defined Function", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json index d5e92802..68792361 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json @@ -231,6 +231,25 @@ "math.toolbar.functions.date.between.hours": "間隔小時數", "math.toolbar.functions.date.between.minutes": "間隔分鐘數", "math.toolbar.functions.date.between.seconds": "間隔秒數", + "math.toolbar.functions.date.format": "日期格式化", + "math.toolbar.functions.date.format.formatDate": "formatDate", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00", + "math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10", + "math.toolbar.functions.date.format.yyyyMMdd": "20251010", + "math.toolbar.functions.date.format.yyyy_MM": "2025-10", + "math.toolbar.functions.date.format.yyyyMM": "202510", + "math.toolbar.functions.date.format.yyyy": "2025", + "math.toolbar.functions.date.plus": "日期計算", + "math.toolbar.functions.date.plus.plusYears": "添加年數", + "math.toolbar.functions.date.plus.plusMonths": "添加月數", + "math.toolbar.functions.date.plus.plusWeeks": "添加周數", + "math.toolbar.functions.date.plus.plusDays": "添加天數", + "math.toolbar.functions.date.plus.plusHours": "添加小時數", + "math.toolbar.functions.date.plus.plusMinutes": "添加分鐘數", + "math.toolbar.functions.date.plus.plusSeconds": "添加秒數", "math.toolbar.functions.log": "對數", "math.toolbar.functions.log.lg": "以 10 為底的對數", "math.toolbar.functions.log.ln": "以自然對數 e 為底的對數", @@ -275,6 +294,9 @@ "math.toolbar.functions.formater.percent": "百分數, 保留 x 小數點後 y 位", "math.toolbar.functions.collection": "集合函數", "math.toolbar.functions.collection.hasElements": "是否有元素", + "math.toolbar.functions.collection.collectionSize": "元素個數", + "math.toolbar.functions.collection.collectionMax": "最大元素", + "math.toolbar.functions.collection.collectionMin": "最小元素", "math.toolbar.userDefinedFunction": "自定義函數", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json index e9675448..f0ad67d0 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json @@ -231,6 +231,26 @@ "math.toolbar.functions.date.between.hours": "间隔小时数", "math.toolbar.functions.date.between.minutes": "间隔分钟数", "math.toolbar.functions.date.between.seconds": "间隔秒数", + "math.toolbar.functions.date.format": "日期格式化", + "math.toolbar.functions.date.format.formatDate": "formatDate", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00", + "math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00", + "math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10", + "math.toolbar.functions.date.format.yyyyMMdd": "20251010", + "math.toolbar.functions.date.format.yyyy_MM": "2025-10", + "math.toolbar.functions.date.format.yyyyMM": "202510", + "math.toolbar.functions.date.format.yyyy": "2025", + "math.toolbar.functions.date.plus": "日期计算", + "math.toolbar.functions.date.plus.plusYears": "添加年数", + "math.toolbar.functions.date.plus.plusMonths": "添加月数", + "math.toolbar.functions.date.plus.plusWeeks": "添加周数", + "math.toolbar.functions.date.plus.plusDays": "添加天数", + "math.toolbar.functions.date.plus.plusHours": "添加小时数", + "math.toolbar.functions.date.plus.plusMinutes": "添加分钟数", + "math.toolbar.functions.date.plus.plusSeconds": "添加秒数", + "math.toolbar.functions.log": "对数函数", "math.toolbar.functions.log.lg": "以 10 为底的对数", "math.toolbar.functions.log.ln": "以自然对数 e 为底的对数", @@ -275,6 +295,9 @@ "math.toolbar.functions.formater.percent": "百分数, 保留 x 小数点后 y 位", "math.toolbar.functions.collection": "集合函数", "math.toolbar.functions.collection.hasElements": "是否有元素", + "math.toolbar.functions.collection.collectionSize": "元素个数", + "math.toolbar.functions.collection.collectionMax": "最大元素", + "math.toolbar.functions.collection.collectionMin": "最小元素", "math.toolbar.userDefinedFunction": "自定义函数", diff --git a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts b/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts index ee19d2ff..429e939f 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts +++ b/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts @@ -1,20 +1,27 @@ -import { Tools } from '@/platform'; +import { axios, Tools } from '@/platform'; class AutoCompletionManager { - parameters: object[]; - valueTypes: object[]; + parameters: any; + valueTypes: any; - public setParameters(parameters) { + constructor() { + this.parameters = {}; + this.valueTypes = {}; + } + + public setParameters(parameters: any) { this.parameters = parameters; } - public setValueTypes(valueTypes) { + public setValueTypes(valueTypes: any) { this.valueTypes = valueTypes; } public getOptions(path: string): any { + // 如果没有路径, 返回参数列表 if (!path) { return this.getParameterOptions(); } + // 以 . 结束表示对象属性 if (path.endsWith('.')) { path = path.substring(0, path.length - 1); } @@ -22,55 +29,54 @@ class AutoCompletionManager { if (!names) { return this.getParameterOptions(); } - //参数 - const parameter = this.findParmeter(names[0]); + //查找参数 + const parameter = this.findParmeterByName(names[0]); if (!parameter) { return null; } - const valueTypeString = parameter.valueType; - const valueTypeVersion = parameter.valueTypeVersion; - let valueType = this.findValueType(valueTypeString, valueTypeVersion); + let valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } let index = 1; while (index < names.length) { - valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index++]); + valueType = this.findValueTypeByPropertyName(valueType.code, valueType.version, names[index++]); } - - const options = []; + const options: any[] = []; for (const property of valueType.properties) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; + const option = this.getOptionItem(property); + if (option) { + options.push(option); } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); } return options; } - public findParmeter(parameterName) { - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - return parameter; + public findParmeterByCode(parameterCode: string) { + return this.parameters[parameterCode]; + } + + public findParmeterByName(parameterName: string) { + const values = Object.values(this.parameters); + for (const value of values) { + if (value.name === parameterName) { + return value; } } return null; } - public findValueType(valueTypeString, valueTypeVersion) { - for (const valueType of this.valueTypes) { - if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) { - return valueType; - } + public findValueType(valueType: string, valueTypeVersion: number): any { + if (Tools.isNill(valueType)) { + return null; } - return null; + const key = valueType + (Tools.isNill(valueTypeVersion) ? '' : ':' + valueTypeVersion); + return this.valueTypes[key]; } - public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { + public findValueTypeByPropertyName(valueTypeString: string, valueTypeVersion: number, propertyName: string) { const valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType) { + if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } for (const property of valueType.properties) { @@ -78,71 +84,68 @@ class AutoCompletionManager { return this.findValueType(property.valueType, property.valueTypeVersion); } } + return null; } - public getParameterOptions(): any { - const options = []; - for (const parameter of this.parameters) { - const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); - const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; - options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }); - } - return options; - } - - public getPropertyOptions(parameterName: string): any { - let parameterType = undefined; - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - parameterType = parameter.valueType; - } - } - if (!parameterType) { + public findValueTypeByPropertyCode(valueTypeString: string, valueTypeVersion: number, propertyCode: string) { + const valueType = this.findValueType(valueTypeString, valueTypeVersion); + if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } - for (const type of this.valueTypes) { - if (type.code === parameterType) { - parameterType = type; + for (const property of valueType.properties) { + if (property.code === propertyCode) { + return this.findValueType(property.valueType, property.valueTypeVersion); } } - if (!parameterType) { - return null; - } + return null; + } + + public getParameterOptions(): any { + const options: any[] = []; + Object.values(this.parameters).forEach((parameter: any) => { + const option = this.getOptionItem(parameter); + if (option) { + options.push(option); + } + }); + return options; + } - if (parameterType.properties && parameterType.properties.length > 0) { - const options = []; - for (const property of parameterType.properties) { - options.push({ - label: property.name, - type: 'property', - apply: '${' + property.name + '}', - detail: this.findValueTypeInfo(property.valueType), - }); + public getOptionItem(parameter: any) { + const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); + if (!Tools.isNill(valueType)) { + const version = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; + const info = parameter.valueTypeIsList ? 'List<' + version + '>' : version; + if (parameter.valueTypeIsList) { + return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}[0]', info: info }; + } else { + return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }; } - return options; } + return null; } - public autoCompletionParameters(to, matchedText): any { + public autoCompletionParameters(to: any, matchedText?: any): any { return { from: to, options: this.getParameterOptions(), - //validFor: /(.*)?/, - validFor: (text, from, to, state) => { - console.log(text); - }, + validFor: /(.*)?/, }; } - public autoCompletionProperties(to, matchedText): any { + public autoCompletionProperties(to: any, matchedText?: any): any { const matchedTextReverse = Tools.reverseString(matchedText); - const regReverse = /(\.\}(.+?)\{\$)+/g; //匹配 '.}xxx{$' 模式 - const matcheds = matchedTextReverse.match(regReverse); + const regReverse = /(\.(\](.+?)\[)?\}(.+?)\{\$)+/g; //匹配 '.]n[}xxx{$' 模式 + // -- -- --- -- -- --- ---- + // . ] n [ } xxx { $ + const matcheds: any = matchedTextReverse.match(regReverse); if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { return null; } const matched = Tools.reverseString(matcheds[0]); - const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); + const parameterName = matched.replace(/\$\{(.+?)\}(\[(.+?)\])?/g, '$1'); + // ---- --- -- -- --- -- + // $ { xxx } [ n ] if (Tools.isUndefinedOrNull(parameterName)) { return null; } @@ -153,14 +156,11 @@ class AutoCompletionManager { return { from: to, options: options, - //validFor: /(.*)?/, - validFor: (text, from, to, state) => { - console.log(text, from, to, state); - }, + validFor: /^(.*)?$/, }; } - public autoCompletion(context): any { + public doAutoCompletion(context: any): any { const beforeMatched = context.matchBefore(/(.+?)/g); if (Tools.isUndefinedOrNull(beforeMatched)) { return null; @@ -176,6 +176,19 @@ class AutoCompletionManager { return null; } } + + public load(url: string) { + axios.get(url).then((response) => { + this.setParameters(response.data?.parameters); + this.setValueTypes(response.data?.valueTypes); + }); + } + + public autoCompletion(): any { + return (context: any) => { + return this.doAutoCompletion(context); + }; + } } export { AutoCompletionManager }; diff --git a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager2.ts b/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager2.ts deleted file mode 100644 index 26881876..00000000 --- a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager2.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { Tools } from '@/platform'; - -class AutoCompletionManager2 { - parameters: object[]; - valueTypes: object[]; - - public setParameters(parameters) { - this.parameters = parameters; - } - public setValueTypes(valueTypes) { - this.valueTypes = valueTypes; - } - - public getOptions(path: string): any { - if (!path) { - return this.getParameterOptions(); - } - if (path.endsWith('.')) { - path = path.substring(0, path.length - 1); - } - const names = path.split('.'); - if (!names) { - return this.getParameterOptions(); - } - //参数 - const parameter = this.findParmeter(names[0]); - if (!parameter) { - return null; - } - const valueTypeString = parameter.valueType; - const valueTypeVersion = parameter.valueTypeVersion; - let valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType || !valueType.properties || valueType.properties.length <= 0) { - return null; - } - let index = 1; - let lastNameIsNotCompleted = false; - while (index < names.length) { - const _valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index]); - if (_valueType) { - valueType = _valueType; - } else { - lastNameIsNotCompleted = true; - } - index++; - } - - const options = []; - if (lastNameIsNotCompleted) { - for (const property of valueType.properties) { - if (property.name.indexOf(names[names.length - 1]) != -1) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; - } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); - } - } - return options; - } else { - for (const property of valueType.properties) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; - } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); - } - return options; - } - } - - public findParmeter(parameterName) { - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - return parameter; - } - } - return null; - } - - public findValueType(valueTypeString, valueTypeVersion) { - for (const valueType of this.valueTypes) { - if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) { - return valueType; - } - } - return null; - } - - public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { - const valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType) { - return null; - } - for (const property of valueType.properties) { - if (property.name === propertyName) { - return this.findValueType(property.valueType, property.valueTypeVersion); - } - } - } - - public getParameterOptions(): any { - const options = []; - for (const parameter of this.parameters) { - const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); - const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; - options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }); - } - return options; - } - - public getPropertyOptions(parameterName: string): any { - let parameterType = undefined; - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - parameterType = parameter.valueType; - } - } - if (!parameterType) { - return null; - } - for (const type of this.valueTypes) { - if (type.code === parameterType) { - parameterType = type; - } - } - if (!parameterType) { - return null; - } - - if (parameterType.properties && parameterType.properties.length > 0) { - const options = []; - for (const property of parameterType.properties) { - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: this.findValueTypeInfo(property.valueType) }); - } - return options; - } - } - - public autoCompletionParameters(to, matchedText): any { - return { - from: to, - options: this.getParameterOptions(), - validFor: /(.*)?/, - }; - } - - public autoCompletionProperties(to, matchedText): any { - const matchedTextReverse = Tools.reverseString(matchedText); - const regReverse = /((.*)?\}(.+?)\{\$)+/g; //匹配 'xxx.}xxx{$' 模式 - const matcheds = matchedTextReverse.match(regReverse); - if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { - return null; - } - const matched = Tools.reverseString(matcheds[0]); - const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); - console.log(parameterName); - if (Tools.isUndefinedOrNull(parameterName)) { - return null; - } - const options = this.getOptions(parameterName); - if (Tools.isUndefinedOrNull(options)) { - return null; - } - return { - from: to, - options: options, - //validFor: /^(.*)?$/, - }; - } - - public autoCompletion(context): any { - const beforeMatched = context.matchBefore(/(.+?)/g); - if (Tools.isUndefinedOrNull(beforeMatched)) { - return null; - } - const beforeText = beforeMatched.text || ''; - if (beforeText.endsWith(' ')) { - //匹配参数 - return this.autoCompletionParameters(beforeMatched.to); - } else { - //匹配属性 - return this.autoCompletionProperties(beforeMatched.to, beforeText); - } - } -} - -export { AutoCompletionManager2 }; diff --git a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue b/io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue index 87f87310..1883961b 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue +++ b/io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue @@ -3,10 +3,13 @@ @@ -15,6 +18,7 @@ import { ref } from 'vue'; import { axios, Environment, EnumTools, Tools, Formater } from '@/platform'; import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager'; +import { AutoCompletionManager } from './AutoCompletionManager'; const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}'); @@ -23,7 +27,10 @@ const click = () => { modelValue.value = modelValue.value + ' ok'; }; +const autoCompletionManager = new AutoCompletionManager(); const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/34e7391f-ba76-4e14-b152-ae0da917fd20')); userDefinedFunctionsManager.load(); console.log(Tools.escapeHtml('&')); diff --git a/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue b/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue index 6a529a96..a6139573 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue +++ b/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue @@ -196,6 +196,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletion, userDefinedFunctions: userDefinedFunctionsRef, }, diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 9f61621e..e4db55e6 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/io.sc.platform.core.frontend/template-project/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.22", + "version": "8.2.24", "description": "前端核心包,用于快速构建前端的脚手架", "private": false, "keywords": [], @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -110,7 +110,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.4", "pinia": "2.2.6", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts index ee19d2ff..429e939f 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts @@ -1,20 +1,27 @@ -import { Tools } from '@/platform'; +import { axios, Tools } from '@/platform'; class AutoCompletionManager { - parameters: object[]; - valueTypes: object[]; + parameters: any; + valueTypes: any; - public setParameters(parameters) { + constructor() { + this.parameters = {}; + this.valueTypes = {}; + } + + public setParameters(parameters: any) { this.parameters = parameters; } - public setValueTypes(valueTypes) { + public setValueTypes(valueTypes: any) { this.valueTypes = valueTypes; } public getOptions(path: string): any { + // 如果没有路径, 返回参数列表 if (!path) { return this.getParameterOptions(); } + // 以 . 结束表示对象属性 if (path.endsWith('.')) { path = path.substring(0, path.length - 1); } @@ -22,55 +29,54 @@ class AutoCompletionManager { if (!names) { return this.getParameterOptions(); } - //参数 - const parameter = this.findParmeter(names[0]); + //查找参数 + const parameter = this.findParmeterByName(names[0]); if (!parameter) { return null; } - const valueTypeString = parameter.valueType; - const valueTypeVersion = parameter.valueTypeVersion; - let valueType = this.findValueType(valueTypeString, valueTypeVersion); + let valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } let index = 1; while (index < names.length) { - valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index++]); + valueType = this.findValueTypeByPropertyName(valueType.code, valueType.version, names[index++]); } - - const options = []; + const options: any[] = []; for (const property of valueType.properties) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; + const option = this.getOptionItem(property); + if (option) { + options.push(option); } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); } return options; } - public findParmeter(parameterName) { - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - return parameter; + public findParmeterByCode(parameterCode: string) { + return this.parameters[parameterCode]; + } + + public findParmeterByName(parameterName: string) { + const values = Object.values(this.parameters); + for (const value of values) { + if (value.name === parameterName) { + return value; } } return null; } - public findValueType(valueTypeString, valueTypeVersion) { - for (const valueType of this.valueTypes) { - if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) { - return valueType; - } + public findValueType(valueType: string, valueTypeVersion: number): any { + if (Tools.isNill(valueType)) { + return null; } - return null; + const key = valueType + (Tools.isNill(valueTypeVersion) ? '' : ':' + valueTypeVersion); + return this.valueTypes[key]; } - public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { + public findValueTypeByPropertyName(valueTypeString: string, valueTypeVersion: number, propertyName: string) { const valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType) { + if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } for (const property of valueType.properties) { @@ -78,71 +84,68 @@ class AutoCompletionManager { return this.findValueType(property.valueType, property.valueTypeVersion); } } + return null; } - public getParameterOptions(): any { - const options = []; - for (const parameter of this.parameters) { - const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); - const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; - options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }); - } - return options; - } - - public getPropertyOptions(parameterName: string): any { - let parameterType = undefined; - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - parameterType = parameter.valueType; - } - } - if (!parameterType) { + public findValueTypeByPropertyCode(valueTypeString: string, valueTypeVersion: number, propertyCode: string) { + const valueType = this.findValueType(valueTypeString, valueTypeVersion); + if (!valueType || !valueType.properties || valueType.properties.length <= 0) { return null; } - for (const type of this.valueTypes) { - if (type.code === parameterType) { - parameterType = type; + for (const property of valueType.properties) { + if (property.code === propertyCode) { + return this.findValueType(property.valueType, property.valueTypeVersion); } } - if (!parameterType) { - return null; - } + return null; + } + + public getParameterOptions(): any { + const options: any[] = []; + Object.values(this.parameters).forEach((parameter: any) => { + const option = this.getOptionItem(parameter); + if (option) { + options.push(option); + } + }); + return options; + } - if (parameterType.properties && parameterType.properties.length > 0) { - const options = []; - for (const property of parameterType.properties) { - options.push({ - label: property.name, - type: 'property', - apply: '${' + property.name + '}', - detail: this.findValueTypeInfo(property.valueType), - }); + public getOptionItem(parameter: any) { + const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); + if (!Tools.isNill(valueType)) { + const version = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; + const info = parameter.valueTypeIsList ? 'List<' + version + '>' : version; + if (parameter.valueTypeIsList) { + return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}[0]', info: info }; + } else { + return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }; } - return options; } + return null; } - public autoCompletionParameters(to, matchedText): any { + public autoCompletionParameters(to: any, matchedText?: any): any { return { from: to, options: this.getParameterOptions(), - //validFor: /(.*)?/, - validFor: (text, from, to, state) => { - console.log(text); - }, + validFor: /(.*)?/, }; } - public autoCompletionProperties(to, matchedText): any { + public autoCompletionProperties(to: any, matchedText?: any): any { const matchedTextReverse = Tools.reverseString(matchedText); - const regReverse = /(\.\}(.+?)\{\$)+/g; //匹配 '.}xxx{$' 模式 - const matcheds = matchedTextReverse.match(regReverse); + const regReverse = /(\.(\](.+?)\[)?\}(.+?)\{\$)+/g; //匹配 '.]n[}xxx{$' 模式 + // -- -- --- -- -- --- ---- + // . ] n [ } xxx { $ + const matcheds: any = matchedTextReverse.match(regReverse); if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { return null; } const matched = Tools.reverseString(matcheds[0]); - const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); + const parameterName = matched.replace(/\$\{(.+?)\}(\[(.+?)\])?/g, '$1'); + // ---- --- -- -- --- -- + // $ { xxx } [ n ] if (Tools.isUndefinedOrNull(parameterName)) { return null; } @@ -153,14 +156,11 @@ class AutoCompletionManager { return { from: to, options: options, - //validFor: /(.*)?/, - validFor: (text, from, to, state) => { - console.log(text, from, to, state); - }, + validFor: /^(.*)?$/, }; } - public autoCompletion(context): any { + public doAutoCompletion(context: any): any { const beforeMatched = context.matchBefore(/(.+?)/g); if (Tools.isUndefinedOrNull(beforeMatched)) { return null; @@ -176,6 +176,19 @@ class AutoCompletionManager { return null; } } + + public load(url: string) { + axios.get(url).then((response) => { + this.setParameters(response.data?.parameters); + this.setValueTypes(response.data?.valueTypes); + }); + } + + public autoCompletion(): any { + return (context: any) => { + return this.doAutoCompletion(context); + }; + } } export { AutoCompletionManager }; diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager2.ts b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager2.ts deleted file mode 100644 index 26881876..00000000 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager2.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { Tools } from '@/platform'; - -class AutoCompletionManager2 { - parameters: object[]; - valueTypes: object[]; - - public setParameters(parameters) { - this.parameters = parameters; - } - public setValueTypes(valueTypes) { - this.valueTypes = valueTypes; - } - - public getOptions(path: string): any { - if (!path) { - return this.getParameterOptions(); - } - if (path.endsWith('.')) { - path = path.substring(0, path.length - 1); - } - const names = path.split('.'); - if (!names) { - return this.getParameterOptions(); - } - //参数 - const parameter = this.findParmeter(names[0]); - if (!parameter) { - return null; - } - const valueTypeString = parameter.valueType; - const valueTypeVersion = parameter.valueTypeVersion; - let valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType || !valueType.properties || valueType.properties.length <= 0) { - return null; - } - let index = 1; - let lastNameIsNotCompleted = false; - while (index < names.length) { - const _valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index]); - if (_valueType) { - valueType = _valueType; - } else { - lastNameIsNotCompleted = true; - } - index++; - } - - const options = []; - if (lastNameIsNotCompleted) { - for (const property of valueType.properties) { - if (property.name.indexOf(names[names.length - 1]) != -1) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; - } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); - } - } - return options; - } else { - for (const property of valueType.properties) { - const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); - if (!propertyValueType) { - continue; - } - const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name; - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info }); - } - return options; - } - } - - public findParmeter(parameterName) { - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - return parameter; - } - } - return null; - } - - public findValueType(valueTypeString, valueTypeVersion) { - for (const valueType of this.valueTypes) { - if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) { - return valueType; - } - } - return null; - } - - public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { - const valueType = this.findValueType(valueTypeString, valueTypeVersion); - if (!valueType) { - return null; - } - for (const property of valueType.properties) { - if (property.name === propertyName) { - return this.findValueType(property.valueType, property.valueTypeVersion); - } - } - } - - public getParameterOptions(): any { - const options = []; - for (const parameter of this.parameters) { - const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion); - const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name; - options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info }); - } - return options; - } - - public getPropertyOptions(parameterName: string): any { - let parameterType = undefined; - for (const parameter of this.parameters) { - if (parameter.name === parameterName) { - parameterType = parameter.valueType; - } - } - if (!parameterType) { - return null; - } - for (const type of this.valueTypes) { - if (type.code === parameterType) { - parameterType = type; - } - } - if (!parameterType) { - return null; - } - - if (parameterType.properties && parameterType.properties.length > 0) { - const options = []; - for (const property of parameterType.properties) { - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: this.findValueTypeInfo(property.valueType) }); - } - return options; - } - } - - public autoCompletionParameters(to, matchedText): any { - return { - from: to, - options: this.getParameterOptions(), - validFor: /(.*)?/, - }; - } - - public autoCompletionProperties(to, matchedText): any { - const matchedTextReverse = Tools.reverseString(matchedText); - const regReverse = /((.*)?\}(.+?)\{\$)+/g; //匹配 'xxx.}xxx{$' 模式 - const matcheds = matchedTextReverse.match(regReverse); - if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { - return null; - } - const matched = Tools.reverseString(matcheds[0]); - const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); - console.log(parameterName); - if (Tools.isUndefinedOrNull(parameterName)) { - return null; - } - const options = this.getOptions(parameterName); - if (Tools.isUndefinedOrNull(options)) { - return null; - } - return { - from: to, - options: options, - //validFor: /^(.*)?$/, - }; - } - - public autoCompletion(context): any { - const beforeMatched = context.matchBefore(/(.+?)/g); - if (Tools.isUndefinedOrNull(beforeMatched)) { - return null; - } - const beforeText = beforeMatched.text || ''; - if (beforeText.endsWith(' ')) { - //匹配参数 - return this.autoCompletionParameters(beforeMatched.to); - } else { - //匹配属性 - return this.autoCompletionProperties(beforeMatched.to, beforeText); - } - } -} - -export { AutoCompletionManager2 }; diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue index 87f87310..1883961b 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue @@ -3,10 +3,13 @@ @@ -15,6 +18,7 @@ import { ref } from 'vue'; import { axios, Environment, EnumTools, Tools, Formater } from '@/platform'; import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager'; +import { AutoCompletionManager } from './AutoCompletionManager'; const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}'); @@ -23,7 +27,10 @@ const click = () => { modelValue.value = modelValue.value + ' ok'; }; +const autoCompletionManager = new AutoCompletionManager(); const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/34e7391f-ba76-4e14-b152-ae0da917fd20')); userDefinedFunctionsManager.load(); console.log(Tools.escapeHtml('&')); diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue index 6a529a96..a6139573 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue @@ -196,6 +196,7 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, + forceUpdate: true, autoCompletion: autoCompletion, userDefinedFunctions: userDefinedFunctionsRef, }, diff --git a/io.sc.platform.developer.doc/package.json b/io.sc.platform.developer.doc/package.json index 27c57c53..b7efa8bc 100644 --- a/io.sc.platform.developer.doc/package.json +++ b/io.sc.platform.developer.doc/package.json @@ -28,7 +28,7 @@ "vuepress": "2.0.0-rc.15" }, "dependencies": { - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "vue": "3.5.13", "vue-i18n": "10.0.4" diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index 77cbf4ba..5ef393b8 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index 580d8128..09a9f5b4 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.license.keygen.frontend/package.json b/io.sc.platform.license.keygen.frontend/package.json index 975272e6..b921f84f 100644 --- a/io.sc.platform.license.keygen.frontend/package.json +++ b/io.sc.platform.license.keygen.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.mvc.frontend/package.json b/io.sc.platform.mvc.frontend/package.json index abaf52ba..a2f9d230 100644 --- a/io.sc.platform.mvc.frontend/package.json +++ b/io.sc.platform.mvc.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.scheduler.manager.frontend/package.json b/io.sc.platform.scheduler.manager.frontend/package.json index 456f93f0..c6feddfb 100644 --- a/io.sc.platform.scheduler.manager.frontend/package.json +++ b/io.sc.platform.scheduler.manager.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index 059fc1d8..4e752e77 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/io.sc.platform.system.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -110,7 +110,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.4", "pinia": "2.2.6", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/ArrayUtil.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/ArrayUtil.java new file mode 100644 index 00000000..a4465a71 --- /dev/null +++ b/io.sc.platform.util/src/main/java/io/sc/platform/util/ArrayUtil.java @@ -0,0 +1,339 @@ +package io.sc.platform.util; + +public class ArrayUtil { + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(boolean[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(byte[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(char[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(short[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(int[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(long[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(float[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(double[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组是否含有元素 + * @param arrays 数组对象 + * @return 数组是否含有元素 + */ + public static boolean hasElements(Object[] arrays){ + if(arrays==null){ return false; } + return arrays.length>0; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static boolean max(boolean[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + for(boolean v : arrays){ + if(v){ + return true; + } + } + return false; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static byte max(byte[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + byte r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static char max(char[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + char r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static short max(short[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + short r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static int max(int[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + int r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static long max(long[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + long r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static float max(float[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + float r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static double max(double[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + double r =arrays[0]; + for(int i=1;ir){ + r =arrays[i]; + } + } + return r; + } + + /** + * 获取数组中最大的元素 + * @param arrays 数组对象 + * @return 数组中最大的元素 + */ + public static Comparable max(Comparable[] arrays){ + if(arrays==null){ return null; } + Comparable r =arrays[0]; + for(int i=1;i0){ + r =arrays[i]; + } + } + return r; + } + + + + + + + public static boolean min(boolean[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + for(boolean v : arrays){ + if(!v){ + return false; + } + } + return true; + } + + public static byte min(byte[] arrays){ + if(arrays==null){ throw new RuntimeException("parameter must NOT null"); } + byte r =arrays[0]; + for(int i=1;i0; - } - /** * 获取 List 集合元素的类型 * @param type @@ -228,10 +210,10 @@ public class CollectionUtil { } /** - * 在字符串数组中查找字符串 - * @param array - * @param obj - * @return + * 在数组中查找对象 + * @param array 数组 + * @param obj 对象 + * @return 查找到的对象 */ public static int search(Object[] array, Object obj){ if(array==null || array.length==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){ @@ -245,6 +227,12 @@ public class CollectionUtil { return -1; } + /** + * 在列表中查找对象 + * @param list 列表 + * @param obj 对象 + * @return 查找到的对象 + */ public static int search(List list, Object obj){ if(list==null || list.size()==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){ return -1; @@ -257,4 +245,190 @@ public class CollectionUtil { } return -1; } + + /** + * 判断一个集合或数组中是否包含元素 + * @param object 集合或数组对象 + * @return 一个集合或数组中是否包含元素 + */ + public static boolean hasElements(Object object){ + if(object==null){ return false; } + // 集合 + if(Collection.class.isAssignableFrom(object.getClass())){ + return !((Collection)object).isEmpty(); + } + // 数组 + if(object.getClass().isArray()){ + Class elementClass =object.getClass().getComponentType(); + if(boolean.class.equals(elementClass)){ + return ArrayUtil.hasElements((boolean[])object); + }else if(byte.class.equals(elementClass)){ + return ArrayUtil.hasElements((byte[])object); + }else if(char.class.equals(elementClass)){ + return ArrayUtil.hasElements((char[])object); + }else if(short.class.equals(elementClass)){ + return ArrayUtil.hasElements((short[])object); + }else if(int.class.equals(elementClass)){ + return ArrayUtil.hasElements((int[])object); + }else if(long.class.equals(elementClass)){ + return ArrayUtil.hasElements((long[])object); + }else if(float.class.equals(elementClass)){ + return ArrayUtil.hasElements((float[])object); + }else if(double.class.equals(elementClass)){ + return ArrayUtil.hasElements((double[])object); + }else{ + return ArrayUtil.hasElements((Object[])object); + } + } + // 其他 + throw new RuntimeException("parameter must be Collection or Array type."); + } + + /** + * 判断一个集合或数组中包含元素的个数 + * @param object 集合或数组对象 + * @return 一个集合或数组中包含元素的个数 + */ + public static int size(Object object){ + if(object==null){ return 0; } + // 集合 + if(Collection.class.isAssignableFrom(object.getClass())){ + return ((Collection)object).size(); + } + // 数组 + if(object.getClass().isArray()){ + Class elementClass =object.getClass().getComponentType(); + if(boolean.class.equals(elementClass)){ + return ((boolean[])object).length; + }else if(byte.class.equals(elementClass)){ + return ((byte[])object).length; + }else if(char.class.equals(elementClass)){ + return ((char[])object).length; + }else if(short.class.equals(elementClass)){ + return ((short[])object).length; + }else if(int.class.equals(elementClass)){ + return ((int[])object).length; + }else if(long.class.equals(elementClass)){ + return ((long[])object).length; + }else if(float.class.equals(elementClass)){ + return ((float[])object).length; + }else if(double.class.equals(elementClass)){ + return ((double[])object).length; + }else{ + return ((Object[])object).length; + } + } + // 其他 + throw new RuntimeException("parameter must be Collection or Array type."); + } + + /** + * 获取一个集合或数组中最大的元素 + * @param object 集合或数组对象 + * @return 一个集合或数组中最大的元素 + */ + public static Object max(Object object){ + if(object==null){ return 0; } + // 集合 + if(Collection.class.isAssignableFrom(object.getClass())){ + Comparable maxValue =null; + Collection collection =(Collection)object; + for(Object o : collection){ + if(Comparable.class.isAssignableFrom(o.getClass())){ + Comparable c =(Comparable)o; + if(maxValue==null){ + maxValue =c; + continue; + } + if(c.compareTo(maxValue)>0){ + maxValue =c; + } + } + } + } + // 数组 + if(object.getClass().isArray()){ + Class elementClass =object.getClass().getComponentType(); + if(boolean.class.equals(elementClass)){ + return ArrayUtil.max((boolean[])object); + }else if(byte.class.equals(elementClass)){ + return ArrayUtil.max((byte[])object); + }else if(char.class.equals(elementClass)){ + return ArrayUtil.max((char[])object); + }else if(short.class.equals(elementClass)){ + return ArrayUtil.max((short[])object); + }else if(int.class.equals(elementClass)){ + return ArrayUtil.max((int[])object); + }else if(long.class.equals(elementClass)){ + return ArrayUtil.max((long[])object); + }else if(float.class.equals(elementClass)){ + return ArrayUtil.max((float[])object); + }else if(double.class.equals(elementClass)){ + return ArrayUtil.max((double[])object); + }else{ + if(Comparable.class.isAssignableFrom(elementClass)){ + return ArrayUtil.max((Comparable[])object); + }else { + throw new RuntimeException("parameter must be Comparable or Array type."); + } + } + } + // 其他 + throw new RuntimeException("parameter must be Collection or Array type."); + } + + /** + * 获取一个集合或数组中最小的元素 + * @param object 集合或数组对象 + * @return 一个集合或数组中最小的元素 + */ + public static Object min(Object object){ + if(object==null){ return 0; } + // 集合 + if(Collection.class.isAssignableFrom(object.getClass())){ + Comparable maxValue =null; + Collection collection =(Collection)object; + for(Object o : collection){ + if(Comparable.class.isAssignableFrom(o.getClass())){ + Comparable c =(Comparable)o; + if(maxValue==null){ + maxValue =c; + continue; + } + if(c.compareTo(maxValue)<0){ + maxValue =c; + } + } + } + } + // 数组 + if(object.getClass().isArray()){ + Class elementClass =object.getClass().getComponentType(); + if(boolean.class.equals(elementClass)){ + return ArrayUtil.min((boolean[])object); + }else if(byte.class.equals(elementClass)){ + return ArrayUtil.min((byte[])object); + }else if(char.class.equals(elementClass)){ + return ArrayUtil.min((char[])object); + }else if(short.class.equals(elementClass)){ + return ArrayUtil.min((short[])object); + }else if(int.class.equals(elementClass)){ + return ArrayUtil.min((int[])object); + }else if(long.class.equals(elementClass)){ + return ArrayUtil.min((long[])object); + }else if(float.class.equals(elementClass)){ + return ArrayUtil.min((float[])object); + }else if(double.class.equals(elementClass)){ + return ArrayUtil.min((double[])object); + }else{ + if(Comparable.class.isAssignableFrom(elementClass)){ + return ArrayUtil.min((Comparable[])object); + }else { + throw new RuntimeException("parameter must be Comparable or Array type."); + } + } + } + // 其他 + throw new RuntimeException("parameter must be Collection or Array type."); + } } diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java index acaa8af6..f22e21b0 100644 --- a/io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java +++ b/io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java @@ -34,8 +34,11 @@ public class DateUtil { public static final String yyyy_MM_dd_HH_mm ="yyyy-MM-dd HH:mm"; public static final String yyyy_MM_dd_HH ="yyyy-MM-dd HH"; public static final String yyyy_MM_dd ="yyyy-MM-dd"; - public static final String yyyyMMdd ="yyyy-MM-dd"; - public static final String yyyyMM ="yyyy-MM"; + public static final String yyyy_MM ="yyyy-MM"; + public static final String yyyy ="yyyy"; + + public static final String yyyyMMdd ="yyyyMMdd"; + public static final String yyyyMM ="yyyyMM"; public static final String HH_mm_ss ="HH:mm:ss"; public static final String HH_mm_ss_SSS ="HH:mm:ss.SSS"; @@ -60,7 +63,10 @@ public class DateUtil { yyyy_MM_dd_HH_mm, yyyy_MM_dd_HH, yyyy_MM_dd, - yyyyMM + yyyyMMdd, + yyyy_MM, + yyyyMM, + yyyy }; private static final String SUPPORTED_DATE_FORMAT_EXCEPTION_MESSAGE ="unsupported date format, the valiate format include : \n" + GMT_CHINESE_COMMA + "\n" @@ -69,11 +75,15 @@ public class DateUtil { + GMT + "\n" + yyyy_MM_dd_T_HH_mm_ss_SSS + "\n" + ISO_8601 + "\n" + + yyyy_MM_dd_HH_mm_ss_SSS + "\n" + yyyy_MM_dd_HH_mm_ss + "\n" + yyyy_MM_dd_HH_mm + "\n" + yyyy_MM_dd_HH + "\n" + yyyy_MM_dd + "\n" - + yyyyMM + "\n"; + + yyyyMMdd + "\n" + + yyyy_MM + "\n" + + yyyyMM + "\n" + + yyyy + "\n"; /** * 获取日期 @@ -543,8 +553,150 @@ public class DateUtil { return ChronoUnit.MONTHS.between(ld1,ld2); } - public static void main(String[] args) { - long a =monthsBetween("2023-01","2025-02"); - System.out.println(a); + /** + * 日期加年数 + * @param o1 日期对象 + * @param years 年数 + * @return 日期相加后的结果 + */ + public static Date plusYears(Object o1, long years){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusYears(years); + return fromLocalDateTime(result); + } + + /** + * 日期加月数 + * @param o1 日期对象 + * @param months 月数 + * @return 日期相加后的结果 + */ + public static Date plusMonths(Object o1, long months){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusMonths(months); + return fromLocalDateTime(result); + } + + /** + * 日期加周数 + * @param o1 日期对象 + * @param weeks 周数 + * @return 日期相加后的结果 + */ + public static Date plusWeeks(Object o1, long weeks){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusWeeks(weeks); + return fromLocalDateTime(result); + } + + /** + * 日期加天数 + * @param o1 日期对象 + * @param days 天数 + * @return 日期相加后的结果 + */ + public static Date plusDays(Object o1, long days){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusDays(days); + return fromLocalDateTime(result); + } + + /** + * 日期加小时数 + * @param o1 日期对象 + * @param hours 小时数 + * @return 日期相加后的结果 + */ + public static Date plusHours(Object o1, long hours){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusHours(hours); + return fromLocalDateTime(result); + } + + /** + * 日期加分钟数 + * @param o1 日期对象 + * @param minutes 分钟数 + * @return 日期相加后的结果 + */ + public static Date plusMinutes(Object o1, long minutes){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusMinutes(minutes); + return fromLocalDateTime(result); + } + + /** + * 日期加秒数 + * @param o1 日期对象 + * @param seconds 秒数 + * @return 日期相加后的结果 + */ + public static Date plusSeconds(Object o1, long seconds){ + if(o1==null) throw new RuntimeException("parameter can NOT be null"); + Date d1 =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."); + } + LocalDateTime ld =toLocalDateTime(d1); + LocalDateTime result =ld.plusSeconds(seconds); + return fromLocalDateTime(result); } } diff --git a/io.sc.standard.frontend/package.json b/io.sc.standard.frontend/package.json index aec935b2..3c02126c 100644 --- a/io.sc.standard.frontend/package.json +++ b/io.sc.standard.frontend/package.json @@ -73,7 +73,7 @@ "webpack-merge": "6.0.1" }, "dependencies": { - "@codemirror/autocomplete": "6.18.3", + "@codemirror/autocomplete": "6.18.4", "@codemirror/commands": "6.7.1", "@codemirror/lang-html": "6.4.9", "@codemirror/lang-java": "6.0.1", @@ -81,10 +81,10 @@ "@codemirror/lang-json": "6.0.1", "@codemirror/lang-sql": "6.8.0", "@codemirror/lang-xml": "6.1.0", - "@codemirror/language": "6.10.4", + "@codemirror/language": "6.10.8", "@codemirror/search": "6.5.8", - "@codemirror/state": "6.4.1", - "@codemirror/view": "6.35.0", + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.36.1", "@maxgraph/core": "0.13.1", "@quasar/extras": "1.16.13", "@univerjs/core": "0.5.0", @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.22", + "platform-core": "8.2.24", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.website/package.json b/io.sc.website/package.json index 680ebb44..61a835ff 100644 --- a/io.sc.website/package.json +++ b/io.sc.website/package.json @@ -28,6 +28,6 @@ }, "dependencies": { "vue": "3.5.13", - "platform-core": "8.2.22" + "platform-core": "8.2.24" } } \ No newline at end of file