diff --git a/erm.frontend/.eslintrc.cjs b/erm.frontend/.eslintrc.cjs index 181a97a6..b8726ddf 100644 --- a/erm.frontend/.eslintrc.cjs +++ b/erm.frontend/.eslintrc.cjs @@ -1,36 +1,69 @@ module.exports = { - root: true, + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, - env: { - browser: true, - es2022: true, - "vue/setup-compiler-macros": true, - }, + env: { + browser: true, + es2022: true, + node: true, + 'vue/setup-compiler-macros': true, + }, - parserOptions:{ - ecmaVersion: 2022, - sourceType:"module", - }, + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + 'eslint:recommended', - extends:[ - "eslint:recommended", - "plugin:vue/vue3-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - ], - - parser: "vue-eslint-parser", - parserOptions: { - ecmaVersion: 2022, - parser: "@typescript-eslint/parser", - sourceType: "module", - }, + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Vue ESLint recommended rules + // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + 'plugin:vue/vue3-recommended', + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'plugin:prettier/recommended', // Recommended + ], - rules:{ - 'semi':[1], - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/no-unused-vars": 'off', - 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */ + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: false, }, + }, + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + rules: { + semi: [1], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-this-alias': 'off', + 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, + 'no-prototype-builtins': 'off', + 'prefer-rest-params': 'off', + 'no-control-regex': 'off', + }, }; diff --git a/erm.frontend/package.json b/erm.frontend/package.json index a8578069..ad62c274 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -1,6 +1,6 @@ { "name": "erm.frontend", - "version": "8.1.49", + "version": "8.1.50", "description": "", "private": false, "keywords": [], @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.2", "pinia": "2.2.2", "pinia-undo": "0.2.4", - "platform-core": "8.1.410", + "platform-core": "8.1.414", "quasar": "2.17.0", "svg-path-commander": "2.0.10", "tailwindcss": "3.4.10", diff --git a/gradle.properties b/gradle.properties index 9d04acb2..de581262 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ application_version=1.0.0 platform_group=io.sc platform_version=8.1.50 platform_plugin_version=8.1.50 -platform_core_frontend_version=8.1.410 +platform_core_frontend_version=8.1.414 ########################################################### # dependencies version diff --git a/io.sc.engine.mv.frontend/.eslintrc.cjs b/io.sc.engine.mv.frontend/.eslintrc.cjs index 181a97a6..b8726ddf 100644 --- a/io.sc.engine.mv.frontend/.eslintrc.cjs +++ b/io.sc.engine.mv.frontend/.eslintrc.cjs @@ -1,36 +1,69 @@ module.exports = { - root: true, + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, - env: { - browser: true, - es2022: true, - "vue/setup-compiler-macros": true, - }, + env: { + browser: true, + es2022: true, + node: true, + 'vue/setup-compiler-macros': true, + }, - parserOptions:{ - ecmaVersion: 2022, - sourceType:"module", - }, + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + 'eslint:recommended', - extends:[ - "eslint:recommended", - "plugin:vue/vue3-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - ], - - parser: "vue-eslint-parser", - parserOptions: { - ecmaVersion: 2022, - parser: "@typescript-eslint/parser", - sourceType: "module", - }, + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Vue ESLint recommended rules + // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + 'plugin:vue/vue3-recommended', + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'plugin:prettier/recommended', // Recommended + ], - rules:{ - 'semi':[1], - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/no-unused-vars": 'off', - 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */ + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: false, }, + }, + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + rules: { + semi: [1], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-this-alias': 'off', + 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, + 'no-prototype-builtins': 'off', + 'prefer-rest-params': 'off', + 'no-control-regex': 'off', + }, }; diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index bf402d99..c3277e83 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.mv.frontend", - "version": "8.1.49", + "version": "8.1.50", "description": "", "private": false, "keywords": [], @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.2", "pinia": "2.2.2", "pinia-undo": "0.2.4", - "platform-core": "8.1.410", + "platform-core": "8.1.414", "quasar": "2.17.0", "svg-path-commander": "2.0.10", "tailwindcss": "3.4.10", diff --git a/io.sc.engine.rule.frontend/.eslintrc.cjs b/io.sc.engine.rule.frontend/.eslintrc.cjs index 181a97a6..b8726ddf 100644 --- a/io.sc.engine.rule.frontend/.eslintrc.cjs +++ b/io.sc.engine.rule.frontend/.eslintrc.cjs @@ -1,36 +1,69 @@ module.exports = { - root: true, + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, - env: { - browser: true, - es2022: true, - "vue/setup-compiler-macros": true, - }, + env: { + browser: true, + es2022: true, + node: true, + 'vue/setup-compiler-macros': true, + }, - parserOptions:{ - ecmaVersion: 2022, - sourceType:"module", - }, + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + 'eslint:recommended', - extends:[ - "eslint:recommended", - "plugin:vue/vue3-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - ], - - parser: "vue-eslint-parser", - parserOptions: { - ecmaVersion: 2022, - parser: "@typescript-eslint/parser", - sourceType: "module", - }, + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Vue ESLint recommended rules + // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + 'plugin:vue/vue3-recommended', + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'plugin:prettier/recommended', // Recommended + ], - rules:{ - 'semi':[1], - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/no-unused-vars": 'off', - 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */ + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: false, }, + }, + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + rules: { + semi: [1], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-this-alias': 'off', + 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, + 'no-prototype-builtins': 'off', + 'prefer-rest-params': 'off', + 'no-control-regex': 'off', + }, }; diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index aed10e4d..1e220990 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.rule.frontend", - "version": "8.1.49", + "version": "8.1.50", "description": "", "private": false, "keywords": [], @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.2", "pinia": "2.2.2", "pinia-undo": "0.2.4", - "platform-core": "8.1.410", + "platform-core": "8.1.416", "quasar": "2.17.0", "svg-path-commander": "2.0.10", "tailwindcss": "3.4.10", @@ -121,4 +121,4 @@ "vue-router": "4.4.5", "xml-formatter": "3.6.3" } -} \ No newline at end of file +} diff --git a/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts b/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts index 68ae667c..db6f29f2 100644 --- a/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts +++ b/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts @@ -3,7 +3,7 @@ import { Tools } from 'platform-core'; class PlaceHolder { static #prefix: string = ''; static #suffix: string = ''; - public static replace(str, prefix, suffix) { + public static replace(str: string, prefix?: string, suffix?: string) { if (str) { if (Tools.isUndefinedOrNull(prefix)) { prefix = PlaceHolder.#prefix; diff --git a/io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue b/io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue index 75649855..83a46a13 100644 --- a/io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue +++ b/io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue @@ -5,7 +5,7 @@ { - const valueType = indicator.valueType; - return ( - valueType !== 'java.lang.Boolean' && - valueType !== 'java.lang.Long' && - valueType !== 'java.lang.Float' && - valueType !== 'Float' && - valueType !== 'java.math.BigDecimal' && - valueType !== 'java.lang.String' && - valueType !== 'java.util.Date' && - valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' && - valueType !== 'io.sc.engine.rule.core.classes.RuleResult' && - valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' && - !valueType.startsWith('List') && - !valueType.startsWith('Map') - ); - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'OBJECT_PROPERTIES'); - }, - }, - { - extend: 'add', - name: 'mathFormula', - label: Formater.enum(Enums.ProcessorType)('MATH_FORMULA'), - icon: 'bi-calculator', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'MATH_FORMULA'); - }, - }, - { - extend: 'add', - name: 'arithmetic', - label: Formater.enum(Enums.ProcessorType)('ARITHMETIC'), - icon: 'bi-calculator', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'ARITHMETIC'); - }, - }, - { - extend: 'add', - name: 'ternary', - label: Formater.enum(Enums.ProcessorType)('TERNARY'), - icon: 'bi-question', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'TERNARY'); - }, - }, - { - extend: 'add', - name: 'whenThen', - label: Formater.enum(Enums.ProcessorType)('WHEN_THEN'), - icon: 'bi-sliders', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'WHEN_THEN'); - }, - }, - { - extend: 'add', - name: 'numberRange', - label: Formater.enum(Enums.ProcessorType)('NUMBER_RANGE'), - icon: 'bi-justify', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'NUMBER_RANGE'); - }, - }, - { - extend: 'add', - name: 'conditionRange', - label: Formater.enum(Enums.ProcessorType)('CONDITION_RANGE'), - icon: 'bi-rainbow', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'CONDITION_RANGE'); - }, - }, - - { - extend: 'add', - name: 'groovyScript', - label: Formater.enum(Enums.ProcessorType)('GROOVY_SCRIPT'), - icon: 'bi-code', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'GROOVY_SCRIPT'); - }, - }, - { - extend: 'add', - name: 'sql', - label: Formater.enum(Enums.ProcessorType)('SQL'), - icon: 'bi-filetype-sql', - enableIf: (arg) => { - return indicator.type !== 'RULE_RESULT' && indicator.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'SQL'); - }, - }, + ObjectProperties.getToolbarAction(indicator), + MathFormula.getToolbarAction(indicator), + Arithmetic.getToolbarAction(indicator), + Ternary.getToolbarAction(indicator), + WhenThen.getToolbarAction(indicator), + NumberRange.getToolbarAction(indicator), + ConditionRange.getToolbarAction(indicator), + GroovyScript.getToolbarAction(indicator), + Sql.getToolbarAction(indicator), ], { extend: 'clone', @@ -175,121 +61,42 @@ ]" :columns="[ { width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' }, - { width: 120, name: 'type', label: $t('type'), sortable: false, format: Formater.enum(Enums.ProcessorType) }, + { + width: 120, + name: 'type', + label: $t('type'), + sortable: false, + format: (value, row) => { + return $t('io.sc.engine.rule.core.enums.ProcessorType.' + value); + }, + }, { width: '100%', name: 'content', label: $t('re.resources.designer.processor.grid.entity.content'), sortable: false, format: (value, row) => { - const type = row.type; - if ('OBJECT_PROPERTIES' === type) { - let str = ''; - if (row.objectCondition) { - str += `
When ` + PlaceHolder.replace(row.objectCondition) + ' Then
'; - } - const objs = Tools.json2Object(row.objectProperties); - if (objs) { - str += `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - str += ` `; - str += ` '; - str += ''; - }); - str += '
` + obj.name + `` + ('' + PlaceHolder.replace(obj.expression)) + '
'; - str += `
`; - } - return str; - } else if ('ARITHMETIC' === type) { - return { - componentType: 'w-code-mirror', - attrs: { - lang: 'java', - rows: 2, - modelValue: row.arithmetic, - editable: false, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - }; - //return PlaceHolder.replace(row.arithmetic); - } else if ('MATH_FORMULA' === type) { - return { - componentType: 'w-expression', - attrs: { - modelValue: row.mathFormula, - readOnly: true, - zoom: 2, - }, - }; - } else if ('TERNARY' === type) { - return row.ternaryCondition + ' ? ' + row.ternaryTrue + ' : ' + row.ternaryFalse; - } else if ('WHEN_THEN' === type) { - let str = ''; - if (row.isWhenThenShorted) { - str += '' + $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') + ', '; - } - if (row.when) { - str += 'When ' + PlaceHolder.replace(row.when) + ' '; - } - if (row.then) { - str += 'Then ' + PlaceHolder.replace(row.then); - } - return str; - } else if ('NUMBER_RANGE' === type) { - const objs = Tools.json2Object(row.numberRange); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - if (i == 0) { - str += ' '; - } - str += ' '; - str += ' '; - str += ''; - }); - str += '
' + PlaceHolder.replace(row.numberRangeVar) + '' + Tools.generateIntervalRange(obj.minIncluded, obj.min, obj.max, obj.maxIncluded) + '' + ('' + PlaceHolder.replace('' + obj.value)) + '
'; - str += '
'; - return str; - } - return ''; - } else if ('CONDITION_RANGE' === type) { - const objs = Tools.json2Object(row.conditionRange); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - str += ' '; - str += ' '; - str += ''; - }); - str += '
' + PlaceHolder.replace(obj.condition) + '' + ('' + PlaceHolder.replace(obj.value)) + '
'; - str += `
`; - return str; - } - return ''; - } else if ('GROOVY_SCRIPT' === type) { - return transfromContent(row.groovyScript); - } else if ('SQL' === type) { - return { - componentType: 'w-code-mirror', - attrs: { - lang: 'sql', - rows: 4, - editable: false, - modelValue: row.sql, - placeholder: true, - }, - }; + switch (row.type) { + case 'ARITHMETIC': + return Arithmetic.format(row); + case 'CONDITION_RANGE': + return ConditionRange.format(row); + case 'GROOVY_SCRIPT': + return GroovyScript.format(row); + case 'MATH_FORMULA': + return MathFormula.format(row); + case 'NUMBER_RANGE': + return NumberRange.format(row); + case 'OBJECT_PROPERTIES': + return ObjectProperties.format(row); + case 'SQL': + return Sql.format(row); + case 'TERNARY': + return Ternary.format(row); + case 'WHEN_THEN': + return WhenThen.format(row); } + return ''; }, }, ]" @@ -304,805 +111,16 @@ { colSpan: 5, name: 'id', label: $t('id'), type: 'w-text', showIf: false }, { colSpan: 5, name: 'order', label: $t('order'), type: 'w-number', showIf: false }, { colSpan: 5, name: 'type', label: $t('type'), type: 'w-text', showIf: false }, - { - colSpan: 5, - name: 'objectCondition', - label: $t('re.resources.designer.processor.grid.entity.objectCondition'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'OBJECT_PROPERTIES' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'objectProperties', - label: $t('re.resources.designer.processor.grid.entity.objectProperties'), - showIf: (arg) => { - return 'OBJECT_PROPERTIES' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - title: $t('re.resources.designer.processor.grid.entity.objectProperties'), - height: 400, - autoFetchData: false, - dbClickOperation: 'edit', - dense: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'separator', - { - name: 'autoMatch', - label: $t('autoMatch'), - icon: 'bi-link-45deg', - click: () => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const localData = grid.getLocalData(); - const objectProperties = []; - localData.forEach((item) => { - objectProperties.push({ - code: item.code, - name: item.name, - expression: item.expression, - }); - }); - objectPropertiesMatcherDialogRef.open(objectProperties); - }, - }, - 'separator', - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const selecteds = arg.selecteds; - selecteds.forEach((selected) => { - selected.expression = ''; - grid.replaceRow(selected); - }); - }, - }, - 'separator', - { - extend: 'remove', - name: 'removeAll', - label: $t('removeAll'), - icon: 'bi-trash3', - enableIf: () => { - return true; - }, - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const rows = grid.getLocalData(); - rows.forEach((row) => { - row.expression = ''; - }); - grid.setLocalData(rows); - }, - }, - ], - primaryKey: 'code', - columns: [ - { name: 'code', label: 'code', hidden: true }, - { - width: 300, - name: 'name', - label: $t('propertyName'), - align: 'left', - sortable: false, - format: (value, row) => { - if (row.expression) { - const expression = row.expression.replace(/\$\{(.+?)\.(.+?)\}/g, '$2'); - if (expression.trim() !== value.trim()) { - return `` + value + ''; - } - } - return value; - }, - }, - { - width: '100%', - name: 'expression', - label: $t('expression'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '800px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'code', label: 'code', showIf: false }, - { - name: 'expression', - label: $t('expression'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const form = grid.getEditorForm(); - if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'mathFormula', - label: $t('re.resources.designer.processor.grid.entity.mathFormula'), - type: 'w-math', - autoCompletion: autoCompletion, - showIf: (arg) => { - return 'MATH_FORMULA' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'arithmetic', - label: $t('re.resources.designer.processor.grid.entity.arithmetic'), - type: 'w-code-mirror', - lang: 'java', - rows: 5, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'ARITHMETIC' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryCondition', - label: $t('re.resources.designer.processor.grid.entity.ternaryCondition'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryTrue', - label: $t('re.resources.designer.processor.grid.entity.ternaryTrue'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryFalse', - label: $t('re.resources.designer.processor.grid.entity.ternaryFalse'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'when', - label: $t('re.resources.designer.processor.grid.entity.when'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'then', - label: $t('re.resources.designer.processor.grid.entity.then'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'isWhenThenShorted', - label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted'), - type: 'w-checkbox', - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'numberRangeVar', - label: $t('re.resources.designer.processor.grid.entity.numberRangeVar'), - showIf: (arg) => { - return 'NUMBER_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-code-mirror', - lang: 'java', - rows: 2, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - { - colSpan: 5, - name: 'numberRange', - label: $t('re.resources.designer.processor.grid.entity.numberRange'), - showIf: (arg) => { - return 'NUMBER_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - dbClickOperation: 'edit', - height: 300, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'clone', - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - grid.removeRows(arg.selecteds); - }, - }, - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const sampleData = [ - { uuid: Tools.uuid(), minIncluded: false, min: null, max: 0, maxIncluded: false, value: 1 }, - { uuid: Tools.uuid(), minIncluded: true, min: 0, max: 1, maxIncluded: false, value: 2 }, - { uuid: Tools.uuid(), minIncluded: true, min: 1, max: 2, maxIncluded: false, value: 3 }, - { uuid: Tools.uuid(), minIncluded: true, min: 2, max: 3, maxIncluded: false, value: 4 }, - { uuid: Tools.uuid(), minIncluded: true, min: 3, max: null, maxIncluded: false, value: 5 }, - { uuid: Tools.uuid(), minIncluded: false, min: null, max: null, maxIncluded: false, value: 0 }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { width: 200, name: 'uuid', label: 'uuid', hidden: true }, - { - width: 60, - name: 'minIncluded', - label: $t('include'), - align: 'center', - sortable: false, - format: (value) => { - if (value) { - return '['; - } else { - return '('; - } - }, - }, - { width: 100, name: 'min', label: $t('minValue'), align: 'right', sortable: false }, - { width: 100, name: 'max', label: $t('maxValue'), align: 'right', sortable: false }, - { - width: 60, - name: 'maxIncluded', - label: $t('include'), - align: 'center', - sortable: false, - format: (value) => { - if (value) { - return '['; - } else { - return ')'; - } - }, - }, - { width: '100%', name: 'value', label: $t('value'), sortable: false }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 4, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 }, - { name: 'min', label: $t('minValue'), type: 'w-text', colSpan: 3 }, - { name: 'minIncluded', label: $t('include'), type: 'w-checkbox' }, - { name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 }, - { name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' }, - { name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'conditionRange', - label: $t('re.resources.designer.processor.grid.entity.conditionRange'), - showIf: (arg) => { - return 'CONDITION_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 300, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'clone', - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - grid.removeRows(arg.selecteds); - }, - }, - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const sampleData = [ - { uuid: Tools.uuid(), condition: '${变量名}<=0', value: '0' }, - { uuid: Tools.uuid(), condition: '${变量名}>0 && ${变量名}<=50', value: '50' }, - { uuid: Tools.uuid(), condition: '${变量名}>50 && ${变量名}<=80', value: '80' }, - { uuid: Tools.uuid(), condition: '${变量名}>80 && ${变量名}<=100', value: '100' }, - { uuid: Tools.uuid(), condition: '${变量名}>100', value: '60' }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - name: 'condition', - label: $t('condition'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'value', - label: $t('value'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '800px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'condition', - label: $t('condition'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - { - name: 'value', - label: $t('value'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'groovyScript', - label: $t('re.resources.designer.processor.grid.entity.groovyScript'), - type: 'w-code-mirror', - rows: 20, - lang: 'java', - lineWrap: false, - lineBreak: true, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'GROOVY_SCRIPT' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'sqlDatasourceName', - label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName'), - type: 'w-select', - clearable: true, - options: dsOptionsRef, - rows: 1, - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 3, - name: 'sql', - label: $t('re.resources.designer.processor.grid.entity.sql'), - type: 'w-code-mirror', - height: 180, - lang: 'sql', - toolbar: false, - placeholder: true, - autoCompletion: autoCompletion, - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 2, - name: 'sqlParameterValues', - label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 150, - title: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), - autoFetchData: false, - dense: true, - dbClickOperation: 'edit', - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - { - name: 'analyze', - label: $t('analyze'), - icon: 'bi-tag', - click: (arg) => { - const sql = gridRef.getEditorForm().getFieldValue('sql'); - const regex = /\$\{[\u0000-\uFFFF]+?\}/g; - const array = sql.match(regex); - const rows = []; - array.forEach((item) => { - rows.push({ uuid: Tools.uuid(), name: item, value: '' }); - }); - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.setLocalData(rows); - }, - }, - 'separator', - 'add', - 'edit', - [ - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.removeRows(arg.selecteds); - }, - }, - { - extend: 'remove', - name: 'removeAll', - label: $t('deleteAll'), - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.setLocalData([]); - }, - }, - ], - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - width: '50%', - name: 'name', - label: $t('name'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - width: '100%', - name: 'value', - label: $t('value'), - sortable: false, - }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'name', - label: $t('name'), - type: 'w-code-mirror', - lang: 'java', - rows: 1, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - { - name: 'value', - label: $t('value'), - type: 'w-text', - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 3, - name: 'sqlQueryResult', - label: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 250, - autoFetchData: false, - title: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), - dense: true, - draggable: true, - pageable: false, - checkboxSelection: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - { - name: 'execute', - label: $t('execute'), - icon: 'bi-caret-right', - click: (arg) => { - const sql = gridRef.getEditorForm().getFieldValue('sql'); - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const sqlParameterValues = grid?.getLocalData(); - axios - .post(Environment.apiContextPath('/api/re/indicator/processor/executeSql'), { - sql: sql, - sqlParameterValues: sqlParameterValues, - }) - .then((response) => { - const fieldMetaDatas = response.data.fieldMetaDatas; - fieldMetaDatas.forEach((field) => { - field.value = field.name; - }); - const data = response.data.data; - const grid = gridRef.getEditorForm().getFieldComponent('sqlQueryResult'); - sqlQueryResultFieldsRef = fieldMetaDatas; - grid.setLocalData(data); - }); - }, - }, - ], - columns: computed(() => { - return sqlQueryResultFieldsRef; - }), - }, - { - colSpan: 2, - name: 'sqlFieldMapping', - label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 250, - width: '100%', - autoFetchData: false, - title: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), - dense: true, - dbClickOperation: 'edit', - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'edit', - [ - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - grid.removeRows(arg.selecteds); - }, - }, - { - extend: 'remove', - name: 'removeAll', - label: $t('deleteAll'), - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - grid.setLocalData([]); - }, - }, - ], - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - width: '50%', - name: 'field', - label: $t('fieldName'), - align: 'left', - sortable: false, - }, - { - width: '50%', - name: 'parameter', - label: $t('parameterName'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'field', - label: $t('fieldName'), - type: 'w-select', - options: sqlQueryResultFieldsRef, - }, - { - name: 'parameter', - label: $t('parameterName'), - type: 'w-select', - options: indicatorOptionsRef, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, + + ...Arithmetic.getEditorFields(), + ...ConditionRange.getEditorFields({ gridRef }), + ...GroovyScript.getEditorFields(), + ...MathFormula.getEditorFields(), + ...NumberRange.getEditorFields({ gridRef }), + ...ObjectProperties.getEditorFields({ gridRef, objectPropertiesMatcherDialogRef }), + ...Sql.getEditorFields({ gridRef }), + ...Ternary.getEditorFields(), + ...WhenThen.getEditorFields(), ], }, }" @@ -1116,26 +134,16 @@ { name: 'description', label: $t('description') }, { name: 'enable', label: $t('enable') }, { name: 'type', label: $t('type') }, - { name: 'optionCode', label: $t('re.resources.designer.processor.grid.entity.optionCode') }, - { name: 'arithmetic', label: $t('re.resources.designer.processor.grid.entity.arithmetic') }, - { name: 'ternaryCondition', label: $t('re.resources.designer.processor.grid.entity.ternaryCondition') }, - { name: 'ternaryTrue', label: $t('re.resources.designer.processor.grid.entity.ternaryTrue') }, - { name: 'ternaryFalse', label: $t('re.resources.designer.processor.grid.entity.ternaryFalse') }, - { name: 'when', label: $t('re.resources.designer.processor.grid.entity.when') }, - { name: 'then', label: $t('re.resources.designer.processor.grid.entity.then') }, - { name: 'isWhenThenShorted', label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') }, - { name: 'rule', label: $t('re.resources.designer.processor.grid.entity.rule') }, - { name: 'singleRule', label: $t('re.resources.designer.processor.grid.entity.singleRule') }, - { name: 'numberRange', label: $t('re.resources.designer.processor.grid.entity.numberRange') }, - { name: 'conditionRange', label: $t('re.resources.designer.processor.grid.entity.conditionRange') }, - { name: 'decisionTable2C', label: $t('re.resources.designer.processor.grid.entity.decisionTable2C') }, - { name: 'decisionTable', label: $t('re.resources.designer.processor.grid.entity.decisionTable') }, - { name: 'groovyScript', label: $t('re.resources.designer.processor.grid.entity.groovyScript') }, - { name: 'sqlDatasourceName', label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName') }, - { name: 'sql', label: $t('re.resources.designer.processor.grid.entity.sql') }, - { name: 'sqlParameterValues', label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues') }, - { name: 'sqlFieldMapping', label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping') }, + ...Arithmetic.getViewerFields(), + ...ConditionRange.getViewerFields(), + ...GroovyScript.getViewerFields(), + ...MathFormula.getViewerFields(), + ...NumberRange.getViewerFields(), + ...ObjectProperties.getViewerFields(), + ...Sql.getViewerFields(), + ...Ternary.getViewerFields(), + ...WhenThen.getViewerFields(), { name: 'dataComeFrom', label: $t('dataComeFrom') }, { name: 'creator', label: $t('creator') }, @@ -1146,130 +154,60 @@ }, }" @before-editor-data-submit=" - (data, callback) => { - const form = gridRef.getEditorForm(); - if ('OBJECT_PROPERTIES' === data.type) { - const grid = form.getFieldComponent('objectProperties'); - const localData = grid.getLocalData(); - const objectProperties = []; - localData.forEach((item) => { - objectProperties.push({ - code: item.code, - name: item.name, - expression: item.expression, - }); - }); - data.objectProperties = Tools.object2Json(objectProperties); - } else if ('NUMBER_RANGE' === data.type) { - const grid = form.getFieldComponent('numberRange'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - minIncluded: item.minIncluded, - min: item.min, - max: item.max, - maxIncluded: item.maxIncluded, - value: item.value, - }); - }); - data.numberRange = Tools.object2Json(ranges); - } else if ('CONDITION_RANGE' === data.type) { - const grid = form.getFieldComponent('conditionRange'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - condition: item.condition, - value: item.value, - }); - }); - data.conditionRange = Tools.object2Json(ranges); - } else if ('SQL' === data.type) { - const sqlParameterValuesGrid = form.getFieldComponent('sqlParameterValues'); - const sqlParameterValuesLocalData = sqlParameterValuesGrid.getLocalData(); - const sqlParameterValues = []; - sqlParameterValuesLocalData.forEach((item) => { - sqlParameterValues.push({ - uuid: item.uuid, - name: item.name, - value: item.value, - }); - }); - data.sqlParameterValues = Tools.object2Json(sqlParameterValues); - - const sqlFieldMappingGrid = form.getFieldComponent('sqlFieldMapping'); - const sqlFieldMappingLocalData = sqlFieldMappingGrid.getLocalData(); - const sqlFieldMapping = []; - sqlFieldMappingLocalData.forEach((item) => { - sqlFieldMapping.push({ - uuid: item.uuid, - field: item.field, - parameter: item.parameter, - }); - }); - data.sqlFieldMapping = Tools.object2Json(sqlFieldMapping); + (args) => { + switch (args.data.type) { + case 'ARITHMETIC': + return Arithmetic.beforeEditorDataSubmit(args); + case 'CONDITION_RANGE': + return ConditionRange.beforeEditorDataSubmit(args); + case 'GROOVY_SCRIPT': + return GroovyScript.beforeEditorDataSubmit(args); + case 'MATH_FORMULA': + return MathFormula.beforeEditorDataSubmit(args); + case 'NUMBER_RANGE': + return NumberRange.beforeEditorDataSubmit(args); + case 'OBJECT_PROPERTIES': + return ObjectProperties.beforeEditorDataSubmit(args); + case 'SQL': + return Sql.beforeEditorDataSubmit(args); + case 'TERNARY': + return Ternary.beforeEditorDataSubmit(args); + case 'WHEN_THEN': + return WhenThen.beforeEditorDataSubmit(args); } } " @after-editor-open=" (args) => { - const row = args.data; - // 获取代码提示列表 - axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + indicator.id)).then((response) => { - autoCompletionManager.setParameters(response.data.parameters); - autoCompletionManager.setValueTypes(response.data.valueTypes); - }); - if ('add' == gridRef.getEditorForm().getStatus()) { - // 获取对象属性列表 - axios.get(Environment.apiContextPath('/api/re/indicator/listObejctPropertiesByIndicatorId/' + indicator.id)).then((response) => { - const properties = response.data; - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - grid?.setLocalData(properties); - }); - } else if ('edit' == gridRef.getEditorForm().getStatus()) { - // 获取对象属性列表 - axios.get(Environment.apiContextPath('/api/re/indicator/processor/listObejctPropertiesByProcessorId/' + row.id)).then((response) => { - const properties = response.data; - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - grid?.setLocalData(properties); - }); - } - //获取所有指标列表 - axios.get(Environment.apiContextPath('api/re/indicator/findIndicatorsByIndicatorId?indicatorId=' + indicator.id)).then((response) => { - const options = []; - response.data.forEach((indicator) => { - options.push({ label: indicator.name, value: '${' + indicator.name + '}' }); - }); - indicatorOptionsRef = options; - }); - - const type = gridRef.getEditorForm().getFieldValue('type'); - if ('NUMBER_RANGE' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const rows = Tools.json2Object(row.numberRange); - grid.setLocalData(rows); - } else if ('CONDITION_RANGE' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const rows = Tools.json2Object(row.conditionRange); - grid.setLocalData(rows); - } else if ('SQL' === type) { - const sqlParameterValuesGrid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const sqlParameterValuesRows = Tools.json2Object(row.sqlParameterValues); - sqlParameterValuesGrid.setLocalData(sqlParameterValuesRows); - - const sqlFieldMappingGrid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - const sqlFieldMappingRows = Tools.json2Object(row.sqlFieldMapping); - sqlFieldMappingGrid.setLocalData(sqlFieldMappingRows); + args.type = 'indicator'; + args.indicator = indicator; + switch (args.grid.getEditorForm().getFieldValue('type')) { + case 'ARITHMETIC': + return Arithmetic.afterEditorOpen(args); + case 'CONDITION_RANGE': + return ConditionRange.afterEditorOpen(args); + case 'GROOVY_SCRIPT': + return GroovyScript.afterEditorOpen(args); + case 'MATH_FORMULA': + return MathFormula.afterEditorOpen(args); + case 'NUMBER_RANGE': + return NumberRange.afterEditorOpen(args); + case 'OBJECT_PROPERTIES': + return ObjectProperties.afterEditorOpen(args); + case 'SQL': + return Sql.afterEditorOpen(args); + case 'TERNARY': + return Ternary.afterEditorOpen(args); + case 'WHEN_THEN': + return WhenThen.afterEditorOpen(args); } } " >
import 'tailwindcss/utilities.css'; -import { ref, computed, onMounted } from 'vue'; -import { axios, Environment, Formater, EnumTools, Tools } from 'platform-core'; +import { ref, onMounted } from 'vue'; +import { axios, Environment, Formater } from 'platform-core'; import { PlaceHolder } from '@/utils/PlaceHolder'; -import ObjectPropertiesMatcherDialog from './ObjectPropertiesMatcherDialog.vue'; -import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import ObjectPropertiesMatcherDialog from '@/views/shared/ObjectPropertiesMatcherDialog.vue'; +import { Arithmetic, ConditionRange, GroovyScript, MathFormula, NumberRange, ObjectProperties, Sql, Ternary, WhenThen } from '@/views/shared/processors'; const props = defineProps({ indicator: { type: Object, default: undefined }, @@ -1294,23 +232,6 @@ const props = defineProps({ const gridRef = ref(); const objectPropertiesMatcherDialogRef = ref(); -const dsOptionsRef = ref([]); -const userDefinedFunctionsRef = ref(); -const sqlQueryResultFieldsRef = ref([]); -const indicatorOptionsRef = ref(); -const autoCompletionManager = new AutoCompletionManager(); - -const autoCompletion = (context) => { - return autoCompletionManager.autoCompletion(context); -}; - -const transfromContent = (xml) => { - const div = document.createElement('div'); - div.textContent = xml; - const result = div.outerHTML; - div.parentNode?.removeChild(div); - return result; -}; const refresh = () => { gridRef?.value?.refresh(); @@ -1323,19 +244,4 @@ onMounted(() => { defineExpose({ refresh, }); - -const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ProcessorType']); - -axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => { - const options = []; - const items = response.data?.content; - if (items && items.length > 0) { - items.forEach((item) => { - if (item.enable) { - options.push(item); - } - }); - } - userDefinedFunctionsRef.value = options; -}); diff --git a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue index 6c06ee67..ca9140a7 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue @@ -176,7 +176,7 @@ DialogManager.confirm($t('re.resources.grid.toolbar.deploy.online.tip'), () => { axios.post(Environment.apiContextPath('/api/re/resource/online/' + arg.selected.id)).then(() => { axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceIdRef)).then((response) => { - treeGridRef.replaceRow(response.data); + treeGridRef.updateLocalData(response.data); }); }); }); @@ -200,7 +200,7 @@ DialogManager.confirm($t('re.resources.grid.toolbar.deploy.offline.tip'), () => { axios.post(Environment.apiContextPath('/api/re/resource/offline/' + arg.selected.id)).then(() => { axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceIdRef)).then((response) => { - treeGridRef.replaceRow(response.data); + treeGridRef.updateLocalData(response.data); }); }); }); @@ -367,7 +367,7 @@ @after-started=" () => { axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceIdRef)).then((response) => { - treeGridRef.replaceRow(response.data); + treeGridRef.updateLocalData(response.data); }); } " 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 c7b97130..a1dc5b31 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 @@ -13,6 +13,7 @@ import { ref } from 'vue'; import { axios, Environment, NotifyManager, Formater, EnumTools, $t } from 'platform-core'; import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; import { PlaceHolder } from '@/utils/PlaceHolder'; import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue'; @@ -21,13 +22,9 @@ const processorIdRef = ref(); const modelValueRef = ref(); const autoCompletionManager = new AutoCompletionManager(); -const userDefinedFunctionsRef = ref(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); const resourceAbstractsRef = ref(); -const autoCompletion = (context) => { - return autoCompletionManager.autoCompletion(context); -}; - const edgeDefines = [ { type: 'EdgeConditionBranch', @@ -77,8 +74,8 @@ const edgeDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -161,8 +158,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -212,8 +209,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -354,26 +351,14 @@ const findResourceAbstractByCodeAndVersion = (code, version) => { }; const open = async (parameterId, processorId) => { + autoCompletionManager.load(parameterId); + userDefinedFunctionsManager.load(); + processorIdRef.value = processorId; // 获取资源摘要 const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); resourceAbstractsRef.value = resourceAbstractResponse?.data; - //获取自定义函数 - const functionResponse = await axios.get(Environment.apiContextPath('/api/re/function?pageable=false')); - const functionOptions = []; - for (const item of functionResponse?.data?.content || []) { - if (item.enable) { - functionOptions.push(item); - } - } - userDefinedFunctionsRef.value = functionOptions; - - // 获取代码提示列表 - const tipResponse = await axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId)); - autoCompletionManager.setParameters(tipResponse?.data?.parameters); - autoCompletionManager.setValueTypes(tipResponse?.data?.valueTypes); - // 获取决策树 graph xml const graphResponse = await axios.get(Environment.apiContextPath('api/re/model/parameter/processor/getDecisionTreeById/' + processorIdRef.value)); modelValueRef.value = graphResponse?.data; 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 b93d93e0..34212236 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 @@ -13,6 +13,7 @@ import { ref } from 'vue'; import { axios, Environment, NotifyManager, Formater, EnumTools, $t } from 'platform-core'; import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; import { PlaceHolder } from '@/utils/PlaceHolder'; import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue'; @@ -21,14 +22,10 @@ const processorIdRef = ref(); const modelValueRef = ref(''); const autoCompletionManager = new AutoCompletionManager(); -const userDefinedFunctionsRef = ref(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); const resourceAbstractsRef = ref(); const modeAbstractsRef = ref(); -const autoCompletion = (context) => { - return autoCompletionManager.autoCompletion(context); -}; - const edgeDefines = [ { type: 'EdgeConditionBranch', @@ -78,8 +75,8 @@ const edgeDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -162,8 +159,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -208,8 +205,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -452,8 +449,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, { name: 'outputCommands', @@ -464,8 +461,8 @@ const vertexDefines = [ placeholder: true, lineWrap: true, lineBreak: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), }, ]; }, @@ -536,6 +533,9 @@ const findResourceAbstractByCodeAndVersion = (code, version) => { }; const open = async (parameterId, processorId) => { + autoCompletionManager.load(parameterId); + userDefinedFunctionsManager.load(); + processorIdRef.value = processorId; // 获取资源摘要 const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); @@ -549,21 +549,6 @@ const open = async (parameterId, processorId) => { } modeAbstractsRef.value = modelOptions; - //获取自定义函数 - const functionResponse = await axios.get(Environment.apiContextPath('/api/re/function?pageable=false')); - const functionOptions = []; - for (const item of functionResponse?.data?.content || []) { - if (item.enable) { - functionOptions.push(item); - } - } - userDefinedFunctionsRef.value = functionOptions; - - // 获取代码提示列表 - const tipResponse = await axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId)); - autoCompletionManager.setParameters(tipResponse?.data?.parameters); - autoCompletionManager.setValueTypes(tipResponse?.data?.valueTypes); - // 获取决策树 graph xml const graphResponse = await axios.get(Environment.apiContextPath('api/re/model/parameter/processor/getExecutionFlowById/' + processorIdRef.value)); modelValueRef.value = graphResponse?.data; diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue index 573fee09..fbb41b1a 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue @@ -3,7 +3,7 @@ - -
- -
-
- - diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue index 3973c328..1153aa43 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue @@ -3,7 +3,7 @@ { - const valueType = parameter.valueType; - return ( - valueType !== 'java.lang.Boolean' && - valueType !== 'java.lang.Long' && - valueType !== 'java.lang.Float' && - valueType !== 'Float' && - valueType !== 'java.math.BigDecimal' && - valueType !== 'java.lang.String' && - valueType !== 'java.util.Date' && - valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' && - valueType !== 'io.sc.engine.rule.core.classes.RuleResult' && - valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' && - !valueType.startsWith('List') && - !valueType.startsWith('Map') - ); - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'OBJECT_PROPERTIES'); - }, - }, - { - extend: 'add', - name: 'optionValue', - label: Formater.enum(Enums.ProcessorType)('OPTION_VALUE'), - icon: 'bi-card-list', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'OPTION_VALUE'); - }, - }, - { - extend: 'add', - name: 'mathFormula', - label: Formater.enum(Enums.ProcessorType)('MATH_FORMULA'), - icon: 'bi-calculator', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'MATH_FORMULA'); - }, - }, - { - extend: 'add', - name: 'arithmetic', - label: Formater.enum(Enums.ProcessorType)('ARITHMETIC'), - icon: 'bi-calculator', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'ARITHMETIC'); - }, - }, - { - extend: 'add', - name: 'ternary', - label: Formater.enum(Enums.ProcessorType)('TERNARY'), - icon: 'bi-question', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'TERNARY'); - }, - }, - { - extend: 'add', - name: 'whenThen', - label: Formater.enum(Enums.ProcessorType)('WHEN_THEN'), - icon: 'bi-sliders', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'WHEN_THEN'); - }, - }, - { - extend: 'add', - name: 'numberRange', - label: Formater.enum(Enums.ProcessorType)('NUMBER_RANGE'), - icon: 'bi-justify', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'NUMBER_RANGE'); - }, - }, - { - extend: 'add', - name: 'conditionRange', - label: Formater.enum(Enums.ProcessorType)('CONDITION_RANGE'), - icon: 'bi-rainbow', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'CONDITION_RANGE'); - }, - }, - { - extend: 'add', - name: 'decisionTable2c', - label: Formater.enum(Enums.ProcessorType)('DECISION_TABLE_2C'), - icon: 'bi-grid-3x2', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE_2C'); - }, - }, - { - extend: 'add', - name: 'decisionTable', - label: Formater.enum(Enums.ProcessorType)('DECISION_TABLE'), - icon: 'bi-grid-3x3', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE'); - }, - }, - { - extend: 'add', - name: 'decisionTree', - label: Formater.enum(Enums.ProcessorType)('DECISION_TREE'), - icon: 'bi-tree', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'DECISION_TREE'); - }, - }, - { - extend: 'add', - name: 'executionFlow', - label: Formater.enum(Enums.ProcessorType)('EXECUTION_FLOW'), - icon: 'bi-bounding-box-circles', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'EXECUTION_FLOW'); - }, - }, - { - extend: 'add', - name: 'pmml', - label: Formater.enum(Enums.ProcessorType)('PMML'), - icon: 'bi-filetype-xml', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'PMML'); - }, - }, - { - extend: 'add', - name: 'groovyScript', - label: Formater.enum(Enums.ProcessorType)('GROOVY_SCRIPT'), - icon: 'bi-code', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'GROOVY_SCRIPT'); - }, - }, - { - extend: 'add', - name: 'sql', - label: Formater.enum(Enums.ProcessorType)('SQL'), - icon: 'bi-filetype-sql', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'SQL'); - }, - }, - { - extend: 'add', - name: 'rule', - label: Formater.enum(Enums.ProcessorType)('RULE'), - icon: 'bi-shadows', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'RULE'); - }, - }, - { - extend: 'add', - name: 'singleRule', - label: Formater.enum(Enums.ProcessorType)('SINGLE_RULE'), - icon: 'bi-noise-reduction', - enableIf: (arg) => { - return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; - }, - afterClick: (arg) => { - arg.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE'); - }, - }, + ObjectProperties.getToolbarAction(parameter), + OptionValue.getToolbarAction(parameter), + MathFormula.getToolbarAction(parameter), + Arithmetic.getToolbarAction(parameter), + Ternary.getToolbarAction(parameter), + WhenThen.getToolbarAction(parameter), + NumberRange.getToolbarAction(parameter), + ConditionRange.getToolbarAction(parameter), + DecisionTable2c.getToolbarAction(parameter), + DecisionTable.getToolbarAction(parameter), + DecisionTree.getToolbarAction(parameter), + ExecutionFlow.getToolbarAction(parameter), + Pmml.getToolbarAction(parameter), + GroovyScript.getToolbarAction(parameter), + Sql.getToolbarAction(parameter), + Rule.getToolbarAction(parameter), + SingleRule.getToolbarAction(parameter), ], { extend: 'edit', @@ -291,7 +90,7 @@ const data = arg.selected; data.enable = !data.enable; axios.put(Environment.apiContextPath('/api/re/model/parameter/processor/' + data.id), data).then((response) => { - gridRef.replaceRow(response.data); + gridRef.updateLocalData(response.data); }); }, }, @@ -303,163 +102,58 @@ :columns="[ { width: 80, name: 'enable', label: $t('isEnable'), align: 'center', sortable: false, format: Formater.enableTag() }, { width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' }, - { width: 150, name: 'type', label: $t('type'), sortable: false, format: Formater.enum(Enums.ProcessorType) }, + { + width: 150, + name: 'type', + label: $t('type'), + sortable: false, + format: (value, row) => { + return $t('io.sc.engine.rule.core.enums.ProcessorType.' + value); + }, + }, { width: '100%', name: 'content', label: $t('re.resources.designer.processor.grid.entity.content'), sortable: false, format: (value, row) => { - const type = row.type; - if ('OBJECT_PROPERTIES' === type) { - let str = ''; - if (row.objectCondition) { - str += `
When ` + PlaceHolder.replace(row.objectCondition) + ' Then
'; - } - const objs = Tools.json2Object(row.objectProperties); - if (objs) { - str += `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - str += ` `; - str += ` '; - str += ''; - }); - str += '
` + obj.name + `` + ('' + PlaceHolder.replace(obj.expression)) + '
'; - str += `
`; - } - return str; - } else if ('OPTION_VALUE' === type) { - return row.optionCode; - } else if ('MATH_FORMULA' === type) { - return { - componentType: 'w-math', - attrs: { - modelValue: row.mathFormula, - readOnly: true, - zoom: 2, - }, - }; - } else if ('ARITHMETIC' === type) { - return { - componentType: 'w-code-mirror', - attrs: { - lang: 'java', - rows: 4, - modelValue: row.arithmetic, - editable: false, - placeholder: true, - lineWrap: true, - }, - }; - } else if ('TERNARY' === type) { - return row.ternaryCondition + ' ? ' + row.ternaryTrue + ' : ' + row.ternaryFalse; - } else if ('WHEN_THEN' === type) { - let str = ''; - if (row.isWhenThenShorted) { - str += '' + $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') + ', '; - } - if (row.when) { - str += 'When ' + PlaceHolder.replace(row.when) + ' '; - } - if (row.then) { - str += 'Then ' + PlaceHolder.replace(row.then); - } - return str; - } else if ('NUMBER_RANGE' === type) { - const objs = Tools.json2Object(row.numberRange); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj, index) => { - str += ''; - if (index == 0) { - str += ' '; - } - str += ' '; - str += ' '; - str += ''; - }); - str += '
' + PlaceHolder.replace(row.numberRangeVar) + '' + Tools.generateIntervalRange(obj.minIncluded, obj.min, obj.max, obj.maxIncluded) + '' + ('' + PlaceHolder.replace('' + obj.value)) + '
'; - str += '
'; - return str; - } - return ''; - } else if ('CONDITION_RANGE' === type) { - const objs = Tools.json2Object(row.conditionRange); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - str += ' '; - str += ' '; - str += ''; - }); - str += '
' + PlaceHolder.replace(obj.condition) + '' + ('' + PlaceHolder.replace(obj.value)) + '
'; - str += `
`; - return str; - } - return ''; - } else if ('DECISION_TABLE_2C' === type) { - const objs = Tools.json2Object(row.decisionTable2C); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - Object.keys(obj).forEach((key) => { - if (key !== 'uuid' && typeof obj[key] === 'string') { - str += ' '; - } - }); - str += ''; - }); - str += '
' + PlaceHolder.replace(obj[key]) + '
'; - str += `
`; - return str; - } - return ''; - } else if ('DECISION_TABLE' === type) { - const objs = Tools.json2Object(row.decisionTable); - if (objs) { - let str = `
`; - str += ``; - objs.forEach((obj) => { - str += ''; - Object.keys(obj).forEach((key) => { - if (key !== 'uuid' && typeof obj[key] === 'string') { - str += ' '; - } - }); - str += ''; - }); - str += '
' + PlaceHolder.replace(obj[key]) + '
'; - str += `
`; - return str; - } - return ''; - } else if ('PMML' === type) { - return transfromContent(row.pmml); - } else if ('GROOVY_SCRIPT' === type) { - return transfromContent(row.groovyScript); - } else if ('DECISION_TREE' === type) { - return transfromContent(row.decisionTree); - } else if ('EXECUTION_FLOW' === type) { - return transfromContent(row.executionFlow); - } else if ('SQL' === type) { - return { - componentType: 'w-code-mirror', - attrs: { - lang: 'sql', - rows: 4, - editable: false, - modelValue: row.sql, - placeholder: true, - }, - }; + switch (row.type) { + case 'ARITHMETIC': + return Arithmetic.format(row); + case 'CONDITION_RANGE': + return ConditionRange.format(row); + case 'DECISION_TABLE': + return DecisionTable.format(row); + case 'DECISION_TABLE_2C': + return DecisionTable2c.format(row); + case 'DECISION_TREE': + return DecisionTree.format(row); + case 'EXECUTION_FLOW': + return ExecutionFlow.format(row); + case 'GROOVY_SCRIPT': + return GroovyScript.format(row); + case 'MATH_FORMULA': + return MathFormula.format(row); + case 'NUMBER_RANGE': + return NumberRange.format(row); + case 'OBJECT_PROPERTIES': + return ObjectProperties.format(row); + case 'OPTION_VALUE': + return OptionValue.format(row); + case 'PMML': + return Pmml.format(row); + case 'RULE': + return Rule.format(row); + case 'SINGLE_RULE': + return SingleRule.format(row); + case 'SQL': + return Sql.format(row); + case 'TERNARY': + return Ternary.format(row); + case 'WHEN_THEN': + return WhenThen.format(row); } + return ''; }, }, ]" @@ -476,1086 +170,24 @@ { colSpan: 5, name: 'type', label: $t('type'), type: 'w-text', showIf: false }, { colSpan: 5, name: 'description', label: $t('description'), type: 'w-text', showIf: false }, { colSpan: 5, name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true, showIf: false }, - { - colSpan: 5, - name: 'objectCondition', - label: $t('re.resources.designer.processor.grid.entity.objectCondition'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'OBJECT_PROPERTIES' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'objectProperties', - label: $t('re.resources.designer.processor.grid.entity.objectProperties'), - showIf: (arg) => { - return 'OBJECT_PROPERTIES' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - title: $t('re.resources.designer.processor.grid.entity.objectProperties'), - height: 400, - autoFetchData: false, - dbClickOperation: 'edit', - dense: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'separator', - { - name: 'autoMatch', - label: $t('autoMatch'), - icon: 'bi-link-45deg', - click: () => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const localData = grid.getLocalData(); - const objectProperties = []; - localData.forEach((item) => { - objectProperties.push({ - code: item.code, - name: item.name, - expression: item.expression, - }); - }); - objectPropertiesMatcherDialogRef.open(objectProperties); - }, - }, - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const selecteds = arg.selecteds; - selecteds.forEach((selected) => { - selected.expression = ''; - grid.replaceRow(selected); - }); - }, - }, - 'separator', - { - extend: 'remove', - name: 'removeAll', - label: $t('removeAll'), - icon: 'bi-trash3', - enableIf: () => { - return true; - }, - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const rows = grid.getLocalData(); - rows.forEach((row) => { - row.expression = ''; - }); - grid.setLocalData(rows); - }, - }, - ], - primaryKey: 'code', - columns: [ - { name: 'code', label: 'code', hidden: true }, - { - width: 300, - name: 'name', - label: $t('propertyName'), - align: 'left', - sortable: false, - format: (value, row) => { - if (row.expression) { - const expression = row.expression.replace(/\$\{(.+?)\.(.+?)\}/g, '$2'); - if (expression.trim() !== value.trim()) { - return `` + value + ''; - } - } - return value; - }, - }, - { - width: '100%', - name: 'expression', - label: $t('expression'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '800px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'code', label: 'code', showIf: false }, - { - name: 'expression', - label: $t('expression'), - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - const form = grid.getEditorForm(); - if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'optionCode', - label: $t('re.resources.designer.processor.grid.entity.optionCode'), - type: 'w-select', - options: optionOptionsRef, - showIf: (arg) => { - return 'OPTION_VALUE' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'mathFormula', - label: $t('re.resources.designer.processor.grid.entity.mathFormula'), - type: 'w-math', - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'MATH_FORMULA' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'arithmetic', - label: $t('re.resources.designer.processor.grid.entity.arithmetic'), - type: 'w-code-mirror', - lang: 'java', - rows: 5, - placeholder: true, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'ARITHMETIC' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryCondition', - label: $t('re.resources.designer.processor.grid.entity.ternaryCondition'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - placeholder: true, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryTrue', - label: $t('re.resources.designer.processor.grid.entity.ternaryTrue'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - placeholder: true, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'ternaryFalse', - label: $t('re.resources.designer.processor.grid.entity.ternaryFalse'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - placeholder: true, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'TERNARY' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'when', - label: $t('re.resources.designer.processor.grid.entity.when'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'then', - label: $t('re.resources.designer.processor.grid.entity.then'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'isWhenThenShorted', - label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted'), - type: 'w-checkbox', - showIf: (arg) => { - return 'WHEN_THEN' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'numberRangeVar', - label: $t('re.resources.designer.processor.grid.entity.numberRangeVar'), - showIf: (arg) => { - return 'NUMBER_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-code-mirror', - lang: 'java', - rows: 3, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - { - colSpan: 5, - name: 'numberRange', - label: $t('re.resources.designer.processor.grid.entity.numberRange'), - showIf: (arg) => { - return 'NUMBER_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 300, - dbClickOperation: 'edit', - autoFetchData: false, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'clone', - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - grid.removeRows(arg.selecteds); - }, - }, - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const sampleData = [ - { uuid: Tools.uuid(), minIncluded: false, min: null, max: 0, maxIncluded: false, value: 1 }, - { uuid: Tools.uuid(), minIncluded: true, min: 0, max: 1, maxIncluded: false, value: 2 }, - { uuid: Tools.uuid(), minIncluded: true, min: 1, max: 2, maxIncluded: false, value: 3 }, - { uuid: Tools.uuid(), minIncluded: true, min: 2, max: 3, maxIncluded: false, value: 4 }, - { uuid: Tools.uuid(), minIncluded: true, min: 3, max: null, maxIncluded: false, value: 5 }, - { uuid: Tools.uuid(), minIncluded: false, min: null, max: null, maxIncluded: false, value: 0 }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { width: 200, name: 'uuid', label: 'uuid', hidden: true }, - { - width: 60, - name: 'minIncluded', - label: $t('include'), - align: 'center', - sortable: false, - format: (value) => { - if (value) { - return '['; - } else { - return '('; - } - }, - }, - { width: 150, name: 'min', label: $t('minValue'), align: 'right', sortable: false }, - { width: 150, name: 'max', label: $t('maxValue'), align: 'right', sortable: false }, - { - width: 60, - name: 'maxIncluded', - label: $t('include'), - align: 'center', - sortable: false, - format: (value) => { - if (value) { - return ']'; - } else { - return ')'; - } - }, - }, - { width: '100%', name: 'value', label: $t('value'), sortable: false }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 4, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 }, - { name: 'min', label: $t('minValue'), type: 'w-text', colSpan: 3 }, - { name: 'minIncluded', label: $t('include'), type: 'w-checkbox' }, - { name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 }, - { name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' }, - { name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'conditionRange', - label: $t('re.resources.designer.processor.grid.entity.conditionRange'), - showIf: (arg) => { - return 'CONDITION_RANGE' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 300, - dbClickOperation: 'edit', - autoFetchData: false, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'clone', - 'edit', - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - grid.removeRows(arg.selecteds); - }, - }, - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const sampleData = [ - { uuid: Tools.uuid(), condition: '${变量名}<=0', value: '0' }, - { uuid: Tools.uuid(), condition: '${变量名}>0 && ${变量名}<=50', value: '50' }, - { uuid: Tools.uuid(), condition: '${变量名}>50 && ${变量名}<=80', value: '80' }, - { uuid: Tools.uuid(), condition: '${变量名}>80 && ${变量名}<=100', value: '100' }, - { uuid: Tools.uuid(), condition: '${变量名}>100', value: '60' }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - name: 'condition', - label: $t('condition'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'value', - label: $t('value'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'condition', - label: $t('condition'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - placeholder: true, - lineWrap: true, - lineBreak: false, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - { - name: 'value', - label: $t('value'), - type: 'w-code-mirror', - lang: 'java', - rows: 4, - lineWrap: true, - lineBreak: false, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 5, - name: 'decisionTable2C', - label: $t('re.resources.designer.processor.grid.entity.decisionTable2C'), - showIf: (arg) => { - return 'DECISION_TABLE_2C' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 300, - cellSelected: true, - dbClickOperation: 'edit', - autoFetchData: false, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - [ - { - extend: 'add', - click: undefined, - }, - { - name: 'addCol2Left', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'), - enableIf: (args) => { - return true; - }, - click: (arg) => { - console.log(arg); - }, - }, - { - name: 'addCol2Right', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'), - enableIf: (args) => { - return true; - }, - click: () => {}, - }, - 'separator', - { - name: 'addRow', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'), - click: () => {}, - }, - ], - [ - { - extend: 'remove', - click: undefined, - }, - { - name: 'removeCol', - label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'), - click: () => {}, - }, - { - name: 'removeRow', - label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'), - click: () => {}, - }, - ], - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('decisionTable2C'); - const sampleData = [ - { uuid: Tools.uuid(), C0: '', C1: '${客户类型}==\'普通客户\'', C2: '${客户类型}==\'VIP客户\'', C3: '${客户类型}==\'临时客户\'' }, - { uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' }, - { uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - name: 'C0', - label: $t('C0'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C1', - label: $t('C1'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C2', - label: $t('C2'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C3', - label: $t('C3'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - }, - { - colSpan: 5, - name: 'decisionTable', - label: $t('re.resources.designer.processor.grid.entity.decisionTable'), - showIf: (arg) => { - return 'DECISION_TABLE' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 300, - dbClickOperation: 'edit', - autoFetchData: false, - denseBody: true, - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - [ - { - extend: 'add', - click: undefined, - }, - { - name: 'addCol2Left', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'), - enableIf: (args) => { - return true; - }, - click: () => {}, - }, - { - name: 'addCol2Right', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'), - enableIf: (args) => { - return true; - }, - click: () => {}, - }, - 'separator', - { - name: 'addRow', - label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'), - click: () => {}, - }, - ], - [ - { - extend: 'remove', - click: undefined, - }, - { - name: 'removeCol', - label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'), - click: () => {}, - }, - { - name: 'removeRow', - label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'), - click: () => {}, - }, - ], - 'separator', - { - name: 'example', - label: $t('example'), - icon: 'bi-balloon', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('decisionTable2C'); - const sampleData = [ - { uuid: Tools.uuid(), C0: '', C1: '${客户类型}==\'普通客户\'', C2: '${客户类型}==\'VIP客户\'', C3: '${客户类型}==\'临时客户\'' }, - { uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' }, - { uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' }, - ]; - grid.setLocalData(sampleData); - }, - }, - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - name: 'C0', - label: $t('C0'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C1', - label: $t('C1'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C2', - label: $t('C2'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - name: 'C3', - label: $t('C3'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - }, - { - colSpan: 5, - name: 'decisionTree', - label: $t('re.resources.designer.processor.grid.entity.decisionTree'), - type: 'w-code-mirror', - rows: 20, - lineNumber: true, - toolbar: false, - showIf: (arg) => { - return 'DECISION_TREE' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'executionFlow', - label: $t('re.resources.designer.processor.grid.entity.executionFlow'), - type: 'w-code-mirror', - rows: 20, - lineNumber: true, - toolbar: false, - showIf: (arg) => { - return 'EXECUTION_FLOW' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'pmml', - label: $t('re.resources.designer.processor.grid.entity.pmml'), - type: 'w-code-mirror', - rows: 20, - lineNumber: true, - toolbar: false, - lang: 'xml', - showIf: (arg) => { - return 'PMML' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'groovyScript', - label: $t('re.resources.designer.processor.grid.entity.groovyScript'), - type: 'w-code-mirror', - rows: 20, - lineNumber: true, - lang: 'java', - lineWrap: false, - lineBreak: true, - placeholder: true, - autoCompletion: autoCompletion, - userDefinedFunctions: userDefinedFunctionsRef, - showIf: (arg) => { - return 'GROOVY_SCRIPT' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 5, - name: 'sqlDatasourceName', - label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName'), - type: 'w-select', - clearable: true, - options: dsOptionsRef, - rows: 1, - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 3, - name: 'sql', - label: $t('re.resources.designer.processor.grid.entity.sql'), - type: 'w-code-mirror', - height: 180, - lang: 'sql', - toolbar: false, - placeholder: true, - autoCompletion: autoCompletion, - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - }, - { - colSpan: 2, - name: 'sqlParameterValues', - label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 150, - title: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), - autoFetchData: false, - dense: true, - dbClickOperation: 'edit', - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - { - name: 'analyze', - label: $t('analyze'), - icon: 'bi-tag', - click: (arg) => { - const sql = gridRef.getEditorForm().getFieldValue('sql'); - const regex = /\$\{[\u0000-\uFFFF]+?\}/g; - const array = sql.match(regex); - const rows = []; - array.forEach((item) => { - rows.push({ uuid: Tools.uuid(), name: item, value: '' }); - }); - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.setLocalData(rows); - }, - }, - 'separator', - 'add', - 'edit', - [ - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.removeRows(arg.selecteds); - }, - }, - { - extend: 'remove', - name: 'removeAll', - label: $t('deleteAll'), - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - grid.setLocalData([]); - }, - }, - ], - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - width: '50%', - name: 'name', - label: $t('name'), - align: 'left', - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - { - width: '100%', - name: 'value', - label: $t('value'), - sortable: false, - }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'name', - label: $t('name'), - type: 'w-code-mirror', - lang: 'java', - rows: 1, - placeholder: true, - autoCompletion: autoCompletion, - }, - { - name: 'value', - label: $t('value'), - type: 'w-text', - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, - { - colSpan: 3, - name: 'sqlQueryResult', - label: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 250, - autoFetchData: false, - title: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), - dense: true, - draggable: true, - pageable: false, - checkboxSelection: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - { - name: 'execute', - label: $t('execute'), - icon: 'bi-caret-right', - click: (arg) => { - const sql = gridRef.getEditorForm().getFieldValue('sql'); - const grid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const sqlParameterValues = grid?.getLocalData(); - axios - .post(Environment.apiContextPath('/api/re/model/parameter/processor/executeSql'), { - sql: sql, - sqlParameterValues: sqlParameterValues, - }) - .then((response) => { - const fieldMetaDatas = response.data.fieldMetaDatas; - fieldMetaDatas.forEach((field) => { - field.value = field.name; - }); - const data = response.data.data; - const grid = gridRef.getEditorForm().getFieldComponent('sqlQueryResult'); - sqlQueryResultFieldsRef = fieldMetaDatas; - grid.setLocalData(data); - }); - }, - }, - ], - columns: computed(() => { - return sqlQueryResultFieldsRef; - }), - }, - { - colSpan: 2, - name: 'sqlFieldMapping', - label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), - showIf: (arg) => { - return 'SQL' === arg.form.getFieldValue('type'); - }, - type: 'w-grid', - height: 250, - width: '100%', - autoFetchData: false, - title: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), - dense: true, - dbClickOperation: 'edit', - draggable: true, - pageable: false, - configButton: false, - toolbarConfigure: { noIcon: false }, - toolbarActions: [ - 'add', - 'edit', - [ - { - extend: 'remove', - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - grid.removeRows(arg.selecteds); - }, - }, - { - extend: 'remove', - name: 'removeAll', - label: $t('deleteAll'), - click: (arg) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - grid.setLocalData([]); - }, - }, - ], - ], - primaryKey: 'uuid', - columns: [ - { name: 'uuid', label: 'uuid', hidden: true }, - { - width: '50%', - name: 'field', - label: $t('fieldName'), - align: 'left', - sortable: false, - }, - { - width: '50%', - name: 'parameter', - label: $t('parameterName'), - sortable: false, - format: (value) => { - return PlaceHolder.replace(value); - }, - }, - ], - editor: { - dialog: { - width: '600px', - }, - form: { - colsNum: 1, - fields: [ - { name: 'uuid', label: 'uuid', showIf: false }, - { - name: 'field', - label: $t('fieldName'), - type: 'w-select', - options: sqlQueryResultFieldsRef, - }, - { - name: 'parameter', - label: $t('parameterName'), - type: 'w-select', - options: parameterOptionsRef, - }, - ], - }, - }, - onBeforeEditorDataSubmit: (data, callback) => { - const grid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - const form = grid.getEditorForm(); - if ('add' == form.getStatus() || 'clone' == form.getStatus()) { - data.uuid = Tools.uuid(); - grid.addRow(data); - callback(false); - } else if ('edit' == form.getStatus()) { - grid.replaceRow(data); - callback(false); - } - }, - }, + + ...Arithmetic.getEditorFields(), + ...ConditionRange.getEditorFields({ gridRef }), + ...DecisionTable.getEditorFields({ gridRef }), + ...DecisionTable2c.getEditorFields({ gridRef }), + ...DecisionTree.getEditorFields(), + ...ExecutionFlow.getEditorFields(), + ...GroovyScript.getEditorFields(), + ...MathFormula.getEditorFields(), + ...NumberRange.getEditorFields({ gridRef }), + ...ObjectProperties.getEditorFields({ gridRef, objectPropertiesMatcherDialogRef }), + ...OptionValue.getEditorFields(), + ...Pmml.getEditorFields({}), + ...Rule.getEditorFields({}), + ...SingleRule.getEditorFields({}), + ...Sql.getEditorFields({ gridRef }), + ...Ternary.getEditorFields(), + ...WhenThen.getEditorFields(), ], }, }" @@ -1569,26 +201,24 @@ { name: 'description', label: $t('description') }, { name: 'enable', label: $t('enable') }, { name: 'type', label: $t('type') }, - { name: 'optionCode', label: $t('re.resources.designer.processor.grid.entity.optionCode') }, - { name: 'arithmetic', label: $t('re.resources.designer.processor.grid.entity.arithmetic') }, - { name: 'ternaryCondition', label: $t('re.resources.designer.processor.grid.entity.ternaryCondition') }, - { name: 'ternaryTrue', label: $t('re.resources.designer.processor.grid.entity.ternaryTrue') }, - { name: 'ternaryFalse', label: $t('re.resources.designer.processor.grid.entity.ternaryFalse') }, - { name: 'when', label: $t('re.resources.designer.processor.grid.entity.when') }, - { name: 'then', label: $t('re.resources.designer.processor.grid.entity.then') }, - { name: 'isWhenThenShorted', label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') }, - { name: 'rule', label: $t('re.resources.designer.processor.grid.entity.rule') }, - { name: 'singleRule', label: $t('re.resources.designer.processor.grid.entity.singleRule') }, - { name: 'numberRange', label: $t('re.resources.designer.processor.grid.entity.numberRange') }, - { name: 'conditionRange', label: $t('re.resources.designer.processor.grid.entity.conditionRange') }, - { name: 'decisionTable2C', label: $t('re.resources.designer.processor.grid.entity.decisionTable2C') }, - { name: 'decisionTable', label: $t('re.resources.designer.processor.grid.entity.decisionTable') }, - { name: 'groovyScript', label: $t('re.resources.designer.processor.grid.entity.groovyScript') }, - { name: 'sqlDatasourceName', label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName') }, - { name: 'sql', label: $t('re.resources.designer.processor.grid.entity.sql') }, - { name: 'sqlParameterValues', label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues') }, - { name: 'sqlFieldMapping', label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping') }, + ...Arithmetic.getViewerFields(), + ...ConditionRange.getViewerFields(), + ...DecisionTable.getViewerFields(), + ...DecisionTable2c.getViewerFields(), + ...DecisionTree.getViewerFields(), + ...ExecutionFlow.getViewerFields(), + ...GroovyScript.getViewerFields(), + ...MathFormula.getViewerFields(), + ...NumberRange.getViewerFields(), + ...ObjectProperties.getViewerFields(), + ...OptionValue.getViewerFields(), + ...Pmml.getViewerFields(), + ...Rule.getViewerFields(), + ...SingleRule.getViewerFields(), + ...Sql.getViewerFields(), + ...Ternary.getViewerFields(), + ...WhenThen.getViewerFields(), { name: 'dataComeFrom', label: $t('dataComeFrom') }, { name: 'creator', label: $t('creator') }, @@ -1599,179 +229,88 @@ }, }" @before-editor-data-submit=" - (data, callback) => { - const form = gridRef.getEditorForm(); - if ('OBJECT_PROPERTIES' === data.type) { - const grid = form.getFieldComponent('objectProperties'); - const localData = grid.getLocalData(); - const objectProperties = []; - localData.forEach((item) => { - objectProperties.push({ - code: item.code, - name: item.name, - expression: item.expression, - }); - }); - data.objectProperties = Tools.object2Json(objectProperties); - } else if ('NUMBER_RANGE' === data.type) { - const grid = form.getFieldComponent('numberRange'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - minIncluded: item.minIncluded, - min: item.min, - max: item.max, - maxIncluded: item.maxIncluded, - value: item.value, - }); - }); - data.numberRange = Tools.object2Json(ranges); - } else if ('CONDITION_RANGE' === data.type) { - const grid = form.getFieldComponent('conditionRange'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - condition: item.condition, - value: item.value, - }); - }); - data.conditionRange = Tools.object2Json(ranges); - } else if ('DECISION_TABLE_2C' === data.type) { - const grid = form.getFieldComponent('decisionTable2C'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - condition: item.condition, - value: item.value, - }); - }); - data.conditionRange = Tools.object2Json(ranges); - } else if ('DECISION_TABLE' === data.type) { - const grid = form.getFieldComponent('decisionTable'); - const localData = grid.getLocalData(); - const ranges = []; - localData.forEach((item) => { - ranges.push({ - uuid: item.uuid, - condition: item.condition, - value: item.value, - }); - }); - data.conditionRange = Tools.object2Json(ranges); - } else if ('SQL' === data.type) { - const sqlParameterValuesGrid = form.getFieldComponent('sqlParameterValues'); - const sqlParameterValuesLocalData = sqlParameterValuesGrid.getLocalData(); - const sqlParameterValues = []; - sqlParameterValuesLocalData.forEach((item) => { - sqlParameterValues.push({ - uuid: item.uuid, - name: item.name, - value: item.value, - }); - }); - data.sqlParameterValues = Tools.object2Json(sqlParameterValues); - - const sqlFieldMappingGrid = form.getFieldComponent('sqlFieldMapping'); - const sqlFieldMappingLocalData = sqlFieldMappingGrid.getLocalData(); - const sqlFieldMapping = []; - sqlFieldMappingLocalData.forEach((item) => { - sqlFieldMapping.push({ - uuid: item.uuid, - field: item.field, - parameter: item.parameter, - }); - }); - data.sqlFieldMapping = Tools.object2Json(sqlFieldMapping); + (args) => { + switch (args.data.type) { + case 'ARITHMETIC': + return Arithmetic.beforeEditorDataSubmit(args); + case 'CONDITION_RANGE': + return ConditionRange.beforeEditorDataSubmit(args); + case 'DECISION_TABLE': + return DecisionTable.beforeEditorDataSubmit(args); + case 'DECISION_TABLE_2C': + return DecisionTable2c.beforeEditorDataSubmit(args); + case 'DECISION_TREE': + return DecisionTree.beforeEditorDataSubmit(args); + case 'EXECUTION_FLOW': + return ExecutionFlow.beforeEditorDataSubmit(args); + case 'GROOVY_SCRIPT': + return GroovyScript.beforeEditorDataSubmit(args); + case 'MATH_FORMULA': + return MathFormula.beforeEditorDataSubmit(args); + case 'NUMBER_RANGE': + return NumberRange.beforeEditorDataSubmit(args); + case 'OBJECT_PROPERTIES': + return ObjectProperties.beforeEditorDataSubmit(args); + case 'OPTION_VALUE': + return OptionValue.beforeEditorDataSubmit(args); + case 'PMML': + return Pmml.beforeEditorDataSubmit(args); + case 'RULE': + return Rule.beforeEditorDataSubmit(args); + case 'SINGLE_RULE': + return SingleRule.beforeEditorDataSubmit(args); + case 'SQL': + return Sql.beforeEditorDataSubmit(args); + case 'TERNARY': + return Ternary.beforeEditorDataSubmit(args); + case 'WHEN_THEN': + return WhenThen.beforeEditorDataSubmit(args); } } " @after-editor-open=" (args) => { - const row = args.data; - // 获取代码提示列表 - axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameter.id)).then((response) => { - autoCompletionManager.setParameters(response.data.parameters); - autoCompletionManager.setValueTypes(response.data.valueTypes); - }); - - // 获取选项输入参数列表 - axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + parameter.id)).then((response) => { - const parameters = response.data; - const options = []; - parameters.forEach((item) => { - if (item.type === 'IN_OPTION') { - options.push({ label: item.name, value: item.code }); - } - }); - optionOptionsRef = options; - }); - - if ('add' == gridRef.getEditorForm().getStatus()) { - // 获取对象属性列表 - axios.get(Environment.apiContextPath('/api/re/model/parameter/listObejctPropertiesByParameterId/' + parameter.id)).then((response) => { - const properties = response.data; - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - grid?.setLocalData(properties); - }); - } else if ('edit' == gridRef.getEditorForm().getStatus()) { - // 获取对象属性列表 - axios.get(Environment.apiContextPath('/api/re/model/parameter/processor/listObejctPropertiesByProcessorId/' + row.id)).then((response) => { - const properties = response.data; - const grid = gridRef.getEditorForm().getFieldComponent('objectProperties'); - grid?.setLocalData(properties); - }); - } - - //获取所有参数列表 - axios.get(Environment.apiContextPath('api/re/model/parameter/findParametersByParameterId?parameterId=' + parameter.id)).then((response) => { - const options = []; - response.data.forEach((indicator) => { - options.push({ label: indicator.name, value: '${' + indicator.name + '}' }); - }); - parameterOptionsRef = options; - }); - - const type = gridRef.getEditorForm().getFieldValue('type'); - if ('OPTION_VALUE' === type) { - editorDialogWidthRef = '40%'; - } else if ('SQL' === type || 'OBJECT_PROPERTIES' === type) { - editorDialogWidthRef = '80%'; - } else { - editorDialogWidthRef = '70%'; - } - - if ('OBJECT_PROPERTIES' === type) { - } else if ('OPTION_VALUE' === type) { - } else if ('NUMBER_RANGE' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('numberRange'); - const rows = Tools.json2Object(row.numberRange); - grid.setLocalData(rows); - } else if ('CONDITION_RANGE' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('conditionRange'); - const rows = Tools.json2Object(row.conditionRange); - grid.setLocalData(rows); - } else if ('DECISION_TABLE_2C' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('decisionTable2C'); - const rows = Tools.json2Object(row.decisionTable2C); - grid.setLocalData(rows); - } else if ('DECISION_TABLE' === type) { - const grid = gridRef.getEditorForm().getFieldComponent('decisionTable'); - const rows = Tools.json2Object(row.decisionTable); - grid.setLocalData(rows); - } else if ('SQL' === type) { - const sqlParameterValuesGrid = gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); - const sqlParameterValuesRows = Tools.json2Object(row.sqlParameterValues); - sqlParameterValuesGrid.setLocalData(sqlParameterValuesRows); + args.type = 'parameter'; + args.parameter = parameter; - const sqlFieldMappingGrid = gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); - const sqlFieldMappingRows = Tools.json2Object(row.sqlFieldMapping); - sqlFieldMappingGrid.setLocalData(sqlFieldMappingRows); + editorDialogWidthRef = '70%'; + switch (args.grid.getEditorForm().getFieldValue('type')) { + case 'ARITHMETIC': + return Arithmetic.afterEditorOpen(args); + case 'CONDITION_RANGE': + return ConditionRange.afterEditorOpen(args); + case 'DECISION_TABLE': + return DecisionTable.afterEditorOpen(args); + case 'DECISION_TABLE_2C': + return DecisionTable2c.afterEditorOpen(args); + case 'DECISION_TREE': + return DecisionTree.afterEditorOpen(args); + case 'EXECUTION_FLOW': + return ExecutionFlow.afterEditorOpen(args); + case 'GROOVY_SCRIPT': + return GroovyScript.afterEditorOpen(args); + case 'MATH_FORMULA': + return MathFormula.afterEditorOpen(args); + case 'NUMBER_RANGE': + return NumberRange.afterEditorOpen(args); + case 'OBJECT_PROPERTIES': + return ObjectProperties.afterEditorOpen(args); + case 'OPTION_VALUE': + editorDialogWidthRef = '40%'; + return OptionValue.afterEditorOpen(args); + case 'PMML': + return Pmml.afterEditorOpen(args); + case 'RULE': + return Rule.afterEditorOpen(args); + case 'SINGLE_RULE': + return SingleRule.afterEditorOpen(args); + case 'SQL': + editorDialogWidthRef = '80%'; + return Sql.afterEditorOpen(args); + case 'TERNARY': + return Ternary.afterEditorOpen(args); + case 'WHEN_THEN': + return WhenThen.afterEditorOpen(args); } } " @@ -1780,7 +319,8 @@ import 'tailwindcss/utilities.css'; -import { ref, onMounted, computed, toValue } from 'vue'; -import { axios, Environment, Formater, Tools, EnumTools, Options } from 'platform-core'; +import { ref, onMounted } from 'vue'; +import { $t, axios, Environment, Formater } from 'platform-core'; import { PlaceHolder } from '@/utils/PlaceHolder'; import DecisionTreeDialog from './DecisionTreeDialog.vue'; import ExecutionFlowDialog from './ExecutionFlowDialog.vue'; -import ObjectPropertiesMatcherDialog from './ObjectPropertiesMatcherDialog.vue'; -import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import ObjectPropertiesMatcherDialog from '@/views/shared/ObjectPropertiesMatcherDialog.vue'; +import { + Arithmetic, + ConditionRange, + DecisionTable, + DecisionTable2c, + DecisionTree, + ExecutionFlow, + GroovyScript, + MathFormula, + NumberRange, + ObjectProperties, + OptionValue, + Pmml, + Rule, + SingleRule, + Sql, + Ternary, + WhenThen, +} from '@/views/shared/processors'; const props = defineProps({ fetchDataUrl: { type: String, default: '' }, @@ -1808,28 +366,10 @@ const props = defineProps({ }); const gridRef = ref(); -const optionOptionsRef = ref([]); -const dsOptionsRef = ref([]); -const sqlQueryResultFieldsRef = ref([]); -const parameterOptionsRef = ref(); -const userDefinedFunctionsRef = ref(); const editorDialogWidthRef = ref('50%'); const decisionTreeDialogRef = ref(); const executionFlowDialogRef = ref(); const objectPropertiesMatcherDialogRef = ref(); -const autoCompletionManager = new AutoCompletionManager(); - -const autoCompletion = (context) => { - return autoCompletionManager.autoCompletion(context); -}; - -const transfromContent = (xml) => { - const div = document.createElement('div'); - div.textContent = xml; - const result = div.outerHTML; - div.parentNode?.removeChild(div); - return result; -}; const refresh = () => { gridRef.value.refresh(); @@ -1842,29 +382,4 @@ onMounted(() => { defineExpose({ refresh, }); - -const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ProcessorType']); -axios.get(Environment.apiContextPath('/api/system/datasource')).then((response) => { - const items = response.data?.content; - if (items) { - const options = []; - items.forEach((item) => { - options.push({ label: item.name, value: item.name }); - }); - dsOptionsRef.value = options; - } -}); - -axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => { - const options = []; - const items = response.data?.content; - if (items && items.length > 0) { - items.forEach((item) => { - if (item.enable) { - options.push(item); - } - }); - } - userDefinedFunctionsRef.value = options; -}); diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue index 5fe9fd51..a862ba96 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue @@ -2,7 +2,7 @@ 0) { - const options = []; + const options: any = []; parameterType.properties.forEach((property) => { - options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: this.findValueTypeInfo(property.valueType) }); + options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: property.valueType }); }); return options; } } - public autoCompletionParameters(to, matchedText): any { + public autoCompletionParameters(to: any, matchedText?: any): any { return { from: to, options: this.getParameterOptions(), @@ -126,10 +131,10 @@ class AutoCompletionManager { }; } - 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 matcheds: any = matchedTextReverse.match(regReverse); if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { return null; } @@ -149,7 +154,7 @@ class AutoCompletionManager { }; } - public autoCompletion(context): any { + public doAutoCompletion(context: any): any { const beforeMatched = context.matchBefore(/(.+?)/g); if (Tools.isUndefinedOrNull(beforeMatched)) { return null; @@ -165,6 +170,20 @@ 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 { + const This = this; + return function (context: any) { + return This.doAutoCompletion(context); + }; + } } export { AutoCompletionManager }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/IndicatorManager.ts b/io.sc.engine.rule.frontend/src/views/shared/IndicatorManager.ts index a07e5de0..1243db6a 100644 --- a/io.sc.engine.rule.frontend/src/views/shared/IndicatorManager.ts +++ b/io.sc.engine.rule.frontend/src/views/shared/IndicatorManager.ts @@ -7,7 +7,7 @@ class IndicatorManager { public static getLibMap() { if (IndicatorManager.#wrapper) { - const result = []; + const result: any[] = []; for (const libCode in IndicatorManager.#wrapper) { const lib = IndicatorManager.#wrapper[libCode]; if (lib) { @@ -26,7 +26,7 @@ class IndicatorManager { if (lib) { const versions = lib.versions; if (versions) { - const result = []; + const result: any[] = []; for (const version in versions) { result.push({ label: version, value: version }); } @@ -47,7 +47,7 @@ class IndicatorManager { if (versions) { const indicators = versions['' + libVersion]; if (indicators) { - const result = []; + const result: any[] = []; for (const code in indicators) { result.push({ label: indicators[code], value: code }); } diff --git a/io.sc.engine.rule.frontend/src/views/lib/ObjectPropertiesMatcherDialog.vue b/io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue similarity index 55% rename from io.sc.engine.rule.frontend/src/views/lib/ObjectPropertiesMatcherDialog.vue rename to io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue index ee0d1ef7..effded93 100644 --- a/io.sc.engine.rule.frontend/src/views/lib/ObjectPropertiesMatcherDialog.vue +++ b/io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue @@ -8,22 +8,12 @@ { label: $t('confirm'), noCaps: true, - click: () => { - axios - .post(Environment.apiContextPath('/api/re/indicator/processor/autoMatch'), { - parameterId: indicatorRef, - objectProperties: currentObjectProperties, - }) - .then((response) => { - emit('afterMatched', response.data); - close(); - }); - }, + click: click, }, ]" >
- +
@@ -32,7 +22,8 @@ import { ref } from 'vue'; import { axios, Environment, Tools } from 'platform-core'; const props = defineProps({ - indicator: { type: Object, default: undefined }, + targetType: { type: String, default: undefined }, + target: { type: Object, default: undefined }, processor: { type: Object, default: undefined }, }); @@ -41,15 +32,41 @@ const emit = defineEmits<{ }>(); const dialogRef = ref(); -const indicatorRef = ref(); -const indicatorOptionsRef = ref(); +const modelValueRef = ref(''); +const modelValueOptionsRef = ref([]); let currentObjectProperties = {}; +const click = () => { + let url = ''; + if (props.targetType === 'parameter') { + url = Environment.apiContextPath('/api/re/model/parameter/processor/autoMatch'); + } else if (props.targetType === 'indicator') { + url = Environment.apiContextPath('/api/re/indicator/processor/autoMatch'); + } + + axios + .post(url, { + id: modelValueRef.value, + objectProperties: currentObjectProperties, + }) + .then((response) => { + emit('afterMatched', response.data); + close(); + }); +}; + const open = (objectProperties) => { currentObjectProperties = objectProperties; - indicatorRef.value = undefined; + modelValueRef.value = undefined; dialogRef.value.show(); - axios.get(Environment.apiContextPath('/api/re/indicator/findIndicatorsByIndicatorId?indicatorId=' + props.indicator.id)).then((response) => { + + let url = ''; + if (props.targetType === 'parameter') { + url = Environment.apiContextPath('/api/re/model/parameter/findParametersByParameterId?parameterId=' + props.target.id); + } else if (props.targetType === 'indicator') { + url = Environment.apiContextPath('/api/re/indicator/findIndicatorsByIndicatorId?indicatorId=' + props.target.id); + } + axios.get(url).then((response) => { const options = []; response.data.forEach((item) => { const valueType = item.valueType; @@ -70,7 +87,7 @@ const open = (objectProperties) => { options.push({ value: item.id, label: item.name }); } }); - indicatorOptionsRef.value = options; + modelValueOptionsRef.value = options; }); }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts b/io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts new file mode 100644 index 00000000..e6609556 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts @@ -0,0 +1,32 @@ +import { ref } from 'vue'; +import { axios, Environment, Tools } from 'platform-core'; + +class UserDefinedFunctionsManager { + #functions: any; + + constructor() { + this.#functions = ref([]); + } + + public userDefinedFunctions(): any { + return this.#functions; + } + + public load() { + // 获取自定义函数库中的函数 + axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => { + const options: any[] = []; + const items: any[] = response.data?.content; + if (items && items.length > 0) { + items.forEach((item) => { + if (item.enable) { + options.push(item); + } + }); + } + this.#functions.value = options; + }); + } +} + +export { UserDefinedFunctionsManager }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts new file mode 100644 index 00000000..3ed9fff0 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts @@ -0,0 +1,75 @@ +import { $t, Environment } from 'platform-core'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class Arithmetic { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'arithmetic', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.ARITHMETIC'), + icon: 'bi-calculator', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'ARITHMETIC'); + }, + }; + } + + public static format(row: any) { + return { + componentType: 'w-code-mirror', + attrs: { + lang: 'java', + rows: 4, + modelValue: row.arithmetic, + editable: false, + placeholder: true, + lineWrap: true, + }, + }; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'arithmetic', + label: $t('re.resources.designer.processor.grid.entity.arithmetic'), + type: 'w-code-mirror', + lang: 'java', + rows: 5, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'ARITHMETIC' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'arithmetic', label: $t('re.resources.designer.processor.grid.entity.arithmetic') }]; + } + + public static beforeEditorDataSubmit(args) {} + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + } +} + +export { Arithmetic }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts new file mode 100644 index 00000000..cd82480d --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts @@ -0,0 +1,197 @@ +import { $t, Environment, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class ConditionRange { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'conditionRange', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE'), + icon: 'bi-rainbow', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'CONDITION_RANGE'); + }, + }; + } + + public static format(row: any) { + const objs = Tools.json2Object(row.conditionRange); + if (objs) { + let str = `
`; + str += ``; + objs.forEach((obj: any) => { + str += ''; + str += ' '; + str += ' '; + str += ''; + }); + str += '
' + PlaceHolder.replace(obj.condition) + '' + ('' + PlaceHolder.replace(obj.value)) + '
'; + str += `
`; + return str; + } + return ''; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'conditionRange', + label: $t('re.resources.designer.processor.grid.entity.conditionRange'), + showIf: (args: any) => { + return 'CONDITION_RANGE' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 300, + dbClickOperation: 'edit', + autoFetchData: false, + denseBody: true, + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + 'add', + 'clone', + 'edit', + { + extend: 'remove', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange'); + grid.removeLocalData(args.selecteds); + }, + }, + 'separator', + { + name: 'example', + label: $t('example'), + icon: 'bi-balloon', + click: (args) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange'); + const sampleData = [ + { uuid: Tools.uuid(), condition: '${变量名}<=0', value: '0' }, + { uuid: Tools.uuid(), condition: '${变量名}>0 && ${变量名}<=50', value: '50' }, + { uuid: Tools.uuid(), condition: '${变量名}>50 && ${变量名}<=80', value: '80' }, + { uuid: Tools.uuid(), condition: '${变量名}>80 && ${变量名}<=100', value: '100' }, + { uuid: Tools.uuid(), condition: '${变量名}>100', value: '60' }, + ]; + grid.setLocalData(sampleData); + }, + }, + ], + primaryKey: 'uuid', + columns: [ + { name: 'uuid', label: 'uuid', hidden: true }, + { + name: 'condition', + label: $t('condition'), + align: 'left', + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + { + name: 'value', + label: $t('value'), + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: [ + { name: 'uuid', label: 'uuid', showIf: false }, + { + name: 'condition', + label: $t('condition'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + }, + { + name: 'value', + label: $t('value'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + }, + ], + }, + }, + onBeforeEditorDataSubmit: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange'); + const form = grid.getEditorForm(); + if ('add' == form.getStatus() || 'clone' == form.getStatus()) { + args.data.uuid = Tools.uuid(); + grid.addLocalData(args.data); + args.callback(false); + } else if ('edit' == form.getStatus()) { + grid.updateLocalData(args.data); + args.callback(false); + } + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'conditionRange', label: $t('re.resources.designer.processor.grid.entity.conditionRange') }]; + } + + public static beforeEditorDataSubmit(args) { + const form = args.grid.getEditorForm(); + const grid = form.getFieldComponent('conditionRange'); + const localData: any[] = grid.getRows(); + const ranges: any[] = []; + localData.forEach((item) => { + ranges.push({ + uuid: item.uuid, + condition: item.condition, + value: item.value, + }); + }); + args.data.conditionRange = Tools.object2Json(ranges); + } + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + + const form = args.grid.getEditorForm(); + const row = args.data; + const grid = form.getFieldComponent('conditionRange'); + const rows = Tools.json2Object(row.conditionRange); + grid.setLocalData(rows); + } +} + +export { ConditionRange }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts new file mode 100644 index 00000000..3dc8778e --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts @@ -0,0 +1,211 @@ +import { ref } from 'vue'; +import { $t, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; + +const tableHeaderColumnsRef = ref([]); + +class DecisionTable { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'decisionTable', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE'), + icon: 'bi-grid-3x3', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args) => { + args.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE'); + }, + }; + } + + public static format(row) { + const objs = Tools.json2Object(row.decisionTable); + if (objs) { + let str = `
`; + str += ``; + objs.forEach((obj) => { + str += ''; + Object.keys(obj).forEach((key) => { + if (key !== 'uuid' && typeof obj[key] === 'string') { + str += ' '; + } + }); + str += ''; + }); + str += '
' + PlaceHolder.replace(obj[key]) + '
'; + str += `
`; + return str; + } + return ''; + } + + public static getEditorFields(properties) { + return [ + { + colSpan: 5, + name: 'decisionTable', + label: $t('re.resources.designer.processor.grid.entity.decisionTable'), + showIf: (arg) => { + return 'DECISION_TABLE' === arg.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 300, + dbClickOperation: 'edit', + autoFetchData: false, + denseBody: true, + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + [ + { + extend: 'add', + click: undefined, + }, + { + name: 'addCol2Left', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'), + enableIf: (args) => { + return true; + }, + click: () => {}, + }, + { + name: 'addCol2Right', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'), + enableIf: (args) => { + return true; + }, + click: () => {}, + }, + 'separator', + { + name: 'addRow', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'), + click: () => {}, + }, + ], + [ + { + extend: 'remove', + click: undefined, + }, + { + name: 'removeCol', + label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'), + click: () => {}, + }, + { + name: 'removeRow', + label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'), + click: (args) => {}, + }, + ], + 'separator', + { + name: 'example', + label: $t('example'), + icon: 'bi-balloon', + click: (args) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('decisionTable2C'); + const sampleData = [ + { uuid: Tools.uuid(), C0: '', C1: "${客户类型}=='普通客户'", C2: "${客户类型}=='VIP客户'", C3: "${客户类型}=='临时客户'" }, + { uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' }, + { uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' }, + ]; + grid.setLocalData(sampleData); + }, + }, + ], + primaryKey: 'uuid', + columns: [ + { name: 'uuid', label: 'uuid', hidden: true }, + { + name: 'C0', + label: $t('C0'), + align: 'left', + sortable: false, + format: (value) => { + return PlaceHolder.replace(value); + }, + }, + { + name: 'C1', + label: $t('C1'), + sortable: false, + format: (value) => { + return PlaceHolder.replace(value); + }, + }, + { + name: 'C2', + label: $t('C2'), + sortable: false, + format: (value) => { + return PlaceHolder.replace(value); + }, + }, + { + name: 'C3', + label: $t('C3'), + sortable: false, + format: (value) => { + return PlaceHolder.replace(value); + }, + }, + ], + }, + ]; + } + + public static getViewerFields(properties) { + return [{ name: 'decisionTable', label: $t('re.resources.designer.processor.grid.entity.decisionTable') }]; + } + + public static beforeEditorDataSubmit(args) { + const form = args.grid.getEditorForm(); + const grid = form.getFieldComponent('decisionTable'); + const localData = grid.getRows(); + args.data.decisionTable2C = Tools.object2Json(localData); + } + + public static afterEditorOpen(args) {} +} + +const addDecisionTable2CCol = (grid, currentSelectedColName, colNamePattern, mode) => { + //更新表数据 + const rows = grid.getRows(); + const propertyNames = Tools.extractAllPropertyNames(rows, colNamePattern); + propertyNames.sort(); + const selectedColIndex = propertyNames.indexOf(currentSelectedColName) + (mode === 'left' ? 0 : 1); + + rows.forEach((row) => { + let i; + for (i = propertyNames.length; i > selectedColIndex; i--) { + row['C' + i] = row['C' + (i - 1)]; + } + row['C' + selectedColIndex] = ''; + }); + + // 更新表头 + const fields = []; + fields.push({ name: 'uuid', label: 'uuid', hidden: true }); + let i = 0; + for (i = 0; i <= propertyNames.length; i++) { + fields.push({ + name: 'C' + i, + label: $t('C' + i), + sortable: false, + format: (value) => { + return PlaceHolder.replace(value); + }, + }); + } + tableHeaderColumnsRef.value = fields; + grid.setLocalData(rows); +}; + +export { DecisionTable }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts new file mode 100644 index 00000000..a5e12bbd --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts @@ -0,0 +1,286 @@ +import { ref } from 'vue'; +import { $t, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; + +const tableHeaderColumnsRef = ref([]); + +class DecisionTable2c { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'decisionTable2c', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE_2C'), + icon: 'bi-grid-3x2', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE_2C'); + }, + }; + } + + public static format(row: any) { + const objs: any[] = Tools.json2Object(row.decisionTable2C); + if (objs) { + let str = `
`; + str += ``; + objs.forEach((obj) => { + str += ''; + Object.keys(obj).forEach((key) => { + if (key !== 'uuid' && typeof obj[key] === 'string') { + str += ' '; + } + }); + str += ''; + }); + str += '
' + PlaceHolder.replace(obj[key]) + '
'; + str += `
`; + return str; + } + return ''; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'decisionTable2C', + label: $t('re.resources.designer.processor.grid.entity.decisionTable2C'), + showIf: (args: any) => { + return 'DECISION_TABLE_2C' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 300, + dbClickOperation: 'edit', + selectedMode: 'cell', + autoFetchData: false, + denseBody: true, + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + [ + { + extend: 'add', + click: undefined, + }, + { + name: 'addCol2Left', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'), + enableIf: (args: any) => { + if (args.selectedColName) { + return true; + } + return false; + }, + click: (args: any) => { + addDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/, 'left'); + }, + }, + { + name: 'addCol2Right', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'), + enableIf: (args: any) => { + if (args.selectedColName) { + return true; + } + return false; + }, + click: (args: any) => { + addDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/, 'right'); + }, + }, + 'separator', + { + name: 'addRow', + label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'), + click: (args: any) => { + const rows = args.grid.getRows(); + const propertyNames = Tools.extractAllPropertyNames(rows, /C[\d]/); + propertyNames.sort(); + const row: any = { + uuid: Tools.uuid(), + }; + propertyNames.forEach((name) => { + row[name] = ''; + }); + args.grid.addLocalData(row); + }, + }, + ], + [ + { + extend: 'remove', + click: undefined, + }, + { + name: 'removeCol', + label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'), + enableIf: (args: any) => { + if (args.selectedColName) { + return true; + } + return false; + }, + click: (args: any) => { + deleteDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/); + }, + }, + { + name: 'removeRow', + label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'), + enableIf: (args: any) => { + if (args.selected) { + return true; + } + return false; + }, + click: (args: any) => { + args.grid.removeLocalData(args.selected); + }, + }, + ], + 'separator', + 'rowEdit', + 'separator', + { + name: 'example', + label: $t('example'), + icon: 'bi-balloon', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('decisionTable2C'); + const sampleData = [ + { uuid: Tools.uuid(), C0: '', C1: "${客户类型}=='普通客户'", C2: "${客户类型}=='VIP客户'", C3: "${客户类型}=='临时客户'" }, + { uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' }, + { uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' }, + ]; + grid.setLocalData(sampleData); + }, + }, + ], + primaryKey: 'uuid', + columns: tableHeaderColumnsRef, + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: tableHeaderColumnsRef, + }, + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'decisionTable2C', label: $t('re.resources.designer.processor.grid.entity.decisionTable2C') }]; + } + + public static beforeEditorDataSubmit(args: any) { + const form = args.grid.getEditorForm(); + const grid = form.getFieldComponent('decisionTable2C'); + const localData = grid.getRows(); + args.data.decisionTable2C = Tools.object2Json(localData); + } + + public static afterEditorOpen(args: any) { + const form = args.grid.getEditorForm(); + const row = args.data; + // 构建表格的头 + const rows = Tools.json2Object(row.decisionTable2C); + const fieldNames = Tools.extractAllPropertyNames(rows, /C[\d]/); + fieldNames.sort(); + const fields: any = []; + fields.push({ name: 'uuid', label: 'uuid', hidden: true }); + fieldNames.forEach((name) => { + fields.push({ + name: name, + label: $t(name), + sortable: false, + type: 'w-code-mirror', + attrs: { + toolbar: false, + rows: 1, + }, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }); + }); + tableHeaderColumnsRef.value = fields; + // 设置表格数据 + const grid = form.getFieldComponent('decisionTable2C'); + grid.setLocalData(rows); + } +} + +const addDecisionTable2CCol = (grid: any, currentSelectedColName: string, colNamePattern: any, mode: string) => { + //更新表数据 + const rows: any[] = grid.getRows(); + const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern); + propertyNames.sort(); + const selectedColIndex = propertyNames.indexOf(currentSelectedColName) + (mode === 'left' ? 0 : 1); + + rows.forEach((row) => { + let i = 0; + for (i = propertyNames.length; i > selectedColIndex; i--) { + row['C' + i] = row['C' + (i - 1)]; + } + row['C' + selectedColIndex] = ''; + }); + + // 更新表头 + const fields: any[] = []; + fields.push({ name: 'uuid', label: 'uuid', hidden: true }); + let i = 0; + for (i = 0; i <= propertyNames.length; i++) { + fields.push({ + name: 'C' + i, + label: $t('C' + i), + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }); + } + tableHeaderColumnsRef.value = fields; + grid.setLocalData(rows); +}; + +const deleteDecisionTable2CCol = (grid: any, currentSelectedColName: string, colNamePattern: any) => { + //更新表数据 + const rows: any[] = grid.getRows(); + const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern); + propertyNames.sort(); + const selectedColIndex = propertyNames.indexOf(currentSelectedColName); + + rows.forEach((row) => { + let i = 0; + for (i = selectedColIndex; i < propertyNames.length; i++) { + row['C' + i] = row['C' + (i + 1)]; + } + delete row['C' + (propertyNames.length - 1)]; + }); + + // 更新表头 + const fields: any[] = []; + fields.push({ name: 'uuid', label: 'uuid', hidden: true }); + let i = 0; + for (i = 0; i < propertyNames.length - 1; i++) { + fields.push({ + name: 'C' + i, + label: $t('C' + i), + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }); + } + tableHeaderColumnsRef.value = fields; + grid.setLocalData(rows); +}; + +export { DecisionTable2c }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts new file mode 100644 index 00000000..29782766 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts @@ -0,0 +1,53 @@ +import { $t } from 'platform-core'; + +class DecisionTree { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'decisionTree', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TREE'), + icon: 'bi-tree', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'DECISION_TREE'); + }, + }; + } + + public static format(row: any) { + const div = document.createElement('div'); + div.textContent = row.decisionTree; + const result = div.outerHTML; + div.parentNode?.removeChild(div); + return result; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'decisionTree', + label: $t('re.resources.designer.processor.grid.entity.decisionTree'), + type: 'w-code-mirror', + rows: 20, + lineNumber: true, + toolbar: false, + showIf: (args: any) => { + return 'DECISION_TREE' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return []; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) {} +} + +export { DecisionTree }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts new file mode 100644 index 00000000..f4a367a5 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts @@ -0,0 +1,53 @@ +import { $t } from 'platform-core'; + +class ExecutionFlow { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'executionFlow', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.EXECUTION_FLOW'), + icon: 'bi-bounding-box-circles', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'EXECUTION_FLOW'); + }, + }; + } + + public static format(row: any) { + const div = document.createElement('div'); + div.textContent = row.executionFlow; + const result = div.outerHTML; + div.parentNode?.removeChild(div); + return result; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'executionFlow', + label: $t('re.resources.designer.processor.grid.entity.executionFlow'), + type: 'w-code-mirror', + rows: 20, + lineNumber: true, + toolbar: false, + showIf: (args: any) => { + return 'EXECUTION_FLOW' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return []; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) {} +} + +export { ExecutionFlow }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts new file mode 100644 index 00000000..253ed7a8 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts @@ -0,0 +1,69 @@ +import { $t, Environment } from 'platform-core'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class GroovyScript { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'groovyScript', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.GROOVY_SCRIPT'), + icon: 'bi-code', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args) => { + args.grid.getEditorForm().setFieldValue('type', 'GROOVY_SCRIPT'); + }, + }; + } + public static format(row: any) { + const div = document.createElement('div'); + div.textContent = row.groovyScript; + const result = div.outerHTML; + div.parentNode?.removeChild(div); + return result; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'groovyScript', + label: $t('re.resources.designer.processor.grid.entity.groovyScript'), + type: 'w-code-mirror', + rows: 20, + lineNumber: true, + lang: 'java', + lineWrap: false, + lineBreak: true, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args) => { + return 'GROOVY_SCRIPT' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'groovyScript', label: $t('re.resources.designer.processor.grid.entity.groovyScript') }]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + } +} + +export { GroovyScript }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts new file mode 100644 index 00000000..4cc354f7 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts @@ -0,0 +1,67 @@ +import { $t, Environment } from 'platform-core'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class MathFormula { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'mathFormula', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA'), + icon: 'bi-calculator', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'MATH_FORMULA'); + }, + }; + } + + public static format(row: any) { + return { + componentType: 'w-math', + attrs: { + modelValue: row.mathFormula, + readOnly: true, + zoom: 2, + }, + }; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'mathFormula', + label: $t('re.resources.designer.processor.grid.entity.mathFormula'), + type: 'w-math', + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'MATH_FORMULA' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return []; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + } +} + +export { MathFormula }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts new file mode 100644 index 00000000..9f5cc35a --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts @@ -0,0 +1,215 @@ +import { $t, Environment, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class NumberRange { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'numberRange', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE'), + icon: 'bi-justify', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'NUMBER_RANGE'); + }, + }; + } + + public static format(row: any) { + const objs: any[] = Tools.json2Object(row.numberRange); + if (objs) { + let str = `
`; + str += ``; + objs.forEach((obj, index) => { + str += ''; + if (index == 0) { + str += ' '; + } + str += ' '; + str += ' '; + str += ''; + }); + str += '
' + PlaceHolder.replace(row.numberRangeVar) + '' + Tools.generateIntervalRange(obj.minIncluded, obj.min, obj.max, obj.maxIncluded) + '' + ('' + PlaceHolder.replace('' + obj.value)) + '
'; + str += '
'; + return str; + } + return ''; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'numberRangeVar', + label: $t('re.resources.designer.processor.grid.entity.numberRangeVar'), + showIf: (args: any) => { + return 'NUMBER_RANGE' === args.form.getFieldValue('type'); + }, + type: 'w-code-mirror', + lang: 'java', + rows: 3, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + }, + { + colSpan: 5, + name: 'numberRange', + label: $t('re.resources.designer.processor.grid.entity.numberRange'), + showIf: (args: any) => { + return 'NUMBER_RANGE' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 300, + dbClickOperation: 'edit', + autoFetchData: false, + denseBody: true, + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + 'add', + 'clone', + 'edit', + { + extend: 'remove', + click: (arg: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange'); + grid.removeLocalData(arg.selecteds); + }, + }, + 'separator', + { + name: 'example', + label: $t('example'), + icon: 'bi-balloon', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange'); + const sampleData = [ + { uuid: Tools.uuid(), minIncluded: false, min: null, max: 0, maxIncluded: false, value: 1 }, + { uuid: Tools.uuid(), minIncluded: true, min: 0, max: 1, maxIncluded: false, value: 2 }, + { uuid: Tools.uuid(), minIncluded: true, min: 1, max: 2, maxIncluded: false, value: 3 }, + { uuid: Tools.uuid(), minIncluded: true, min: 2, max: 3, maxIncluded: false, value: 4 }, + { uuid: Tools.uuid(), minIncluded: true, min: 3, max: null, maxIncluded: false, value: 5 }, + { uuid: Tools.uuid(), minIncluded: false, min: null, max: null, maxIncluded: false, value: 0 }, + ]; + grid.setLocalData(sampleData); + }, + }, + ], + primaryKey: 'uuid', + columns: [ + { width: 200, name: 'uuid', label: 'uuid', hidden: true }, + { + width: 60, + name: 'minIncluded', + label: $t('include'), + align: 'center', + sortable: false, + format: (value: any) => { + if (value) { + return '['; + } else { + return '('; + } + }, + }, + { width: 150, name: 'min', label: $t('minValue'), align: 'right', sortable: false }, + { width: 150, name: 'max', label: $t('maxValue'), align: 'right', sortable: false }, + { + width: 60, + name: 'maxIncluded', + label: $t('include'), + align: 'center', + sortable: false, + format: (value: any) => { + if (value) { + return ']'; + } else { + return ')'; + } + }, + }, + { width: '100%', name: 'value', label: $t('value'), sortable: false }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 4, + fields: [ + { name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 }, + { name: 'min', label: $t('minValue'), type: 'w-text', colSpan: 3 }, + { name: 'minIncluded', label: $t('include'), type: 'w-checkbox' }, + { name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 }, + { name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' }, + { name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 }, + ], + }, + }, + onBeforeEditorDataSubmit: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange'); + const form = grid.getEditorForm(); + if ('add' == form.getStatus() || 'clone' == form.getStatus()) { + args.data.uuid = Tools.uuid(); + grid.addLocalData(args.data); + args.callback(false); + } else if ('edit' == form.getStatus()) { + grid.updateLocalData(args.data); + args.callback(false); + } + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'numberRange', label: $t('re.resources.designer.processor.grid.entity.numberRange') }]; + } + + public static beforeEditorDataSubmit(args: any) { + const form = args.grid.getEditorForm(); + const grid = form.getFieldComponent('numberRange'); + const localData: any[] = grid.getRows(); + const ranges: any[] = []; + localData.forEach((item) => { + ranges.push({ + uuid: item.uuid, + minIncluded: item.minIncluded, + min: item.min, + max: item.max, + maxIncluded: item.maxIncluded, + value: item.value, + }); + }); + args.data.numberRange = Tools.object2Json(ranges); + } + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + + const form = args.grid.getEditorForm(); + const row = args.data; + const grid = form.getFieldComponent('numberRange'); + const rows = Tools.json2Object(row.numberRange); + grid.setLocalData(rows); + } +} + +export { NumberRange }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts new file mode 100644 index 00000000..c0ffd788 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts @@ -0,0 +1,266 @@ +import { $t, axios, Environment, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class ObjectProperties { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'objectProperties', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES'), + icon: 'bi-card-list', + enableIf: (args: any) => { + const valueType = parameter.valueType; + return ( + valueType !== 'java.lang.Boolean' && + valueType !== 'java.lang.Long' && + valueType !== 'java.lang.Float' && + valueType !== 'Float' && + valueType !== 'java.math.BigDecimal' && + valueType !== 'java.lang.String' && + valueType !== 'java.util.Date' && + valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' && + valueType !== 'io.sc.engine.rule.core.classes.RuleResult' && + valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' && + !valueType.startsWith('List') && + !valueType.startsWith('Map') + ); + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'OBJECT_PROPERTIES'); + }, + }; + } + + public static format(row: any) { + let str = ''; + if (row.objectCondition) { + str += `
When ` + PlaceHolder.replace(row.objectCondition) + ' Then
'; + } + const objs = Tools.json2Object(row.objectProperties); + if (objs) { + str += `
`; + str += ``; + objs.forEach((obj: any) => { + str += ''; + str += ` `; + str += ` '; + str += ''; + }); + str += '
` + obj.name + `` + ('' + PlaceHolder.replace(obj.expression)) + '
'; + str += `
`; + } + return str; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'objectCondition', + label: $t('re.resources.designer.processor.grid.entity.objectCondition'), + type: 'w-code-mirror', + lang: 'java', + rows: 3, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'OBJECT_PROPERTIES' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 5, + name: 'objectProperties', + label: $t('re.resources.designer.processor.grid.entity.objectProperties'), + showIf: (args: any) => { + return 'OBJECT_PROPERTIES' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + title: $t('re.resources.designer.processor.grid.entity.objectProperties'), + height: 400, + autoFetchData: false, + dbClickOperation: 'edit', + dense: true, + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + 'separator', + { + name: 'autoMatch', + label: $t('autoMatch'), + icon: 'bi-link-45deg', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties'); + const localData = grid.getRows(); + const objectProperties: any[] = []; + localData.forEach((item: any) => { + objectProperties.push({ + code: item.code, + name: item.name, + expression: item.expression, + }); + }); + properties.objectPropertiesMatcherDialogRef.open(objectProperties); + }, + }, + 'edit', + { + extend: 'remove', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties'); + const selecteds: any[] = args.selecteds; + selecteds.forEach((selected) => { + selected.expression = ''; + grid.updateLocalData(selected); + }); + }, + }, + 'separator', + { + extend: 'remove', + name: 'removeAll', + label: $t('removeAll'), + icon: 'bi-trash3', + enableIf: () => { + return true; + }, + click: (args) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties'); + const rows: any[] = grid.getRows(); + rows.forEach((row) => { + row.expression = ''; + }); + grid.setLocalData(rows); + }, + }, + ], + primaryKey: 'code', + columns: [ + { name: 'code', label: 'code', hidden: true }, + { + width: 300, + name: 'name', + label: $t('propertyName'), + align: 'left', + sortable: false, + format: (value: any, row: any) => { + if (row.expression) { + const expression = row.expression.replace(/\$\{(.+?)\.(.+?)\}/g, '$2'); + if (expression.trim() !== value.trim()) { + return `` + value + ''; + } + } + return value; + }, + }, + { + width: '100%', + name: 'expression', + label: $t('expression'), + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + ], + editor: { + dialog: { + width: '800px', + }, + form: { + colsNum: 1, + fields: [ + { name: 'code', label: 'code', showIf: false }, + { + name: 'expression', + label: $t('expression'), + type: 'w-code-mirror', + lang: 'java', + rows: 3, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + }, + ], + }, + }, + onBeforeEditorDataSubmit: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties'); + const form = grid.getEditorForm(); + if ('edit' == form.getStatus()) { + grid.updateLocalData(args.data); + args.callback(false); + } + }, + }, + ]; + } + + public static getViewerFields(properties) { + return []; + } + + public static beforeEditorDataSubmit(args: any) { + const form = args.grid.getEditorForm(); + const grid = form.getFieldComponent('objectProperties'); + const localData: any[] = grid.getRows(); + const objectProperties: any[] = []; + localData.forEach((item) => { + objectProperties.push({ + code: item.code, + name: item.name, + expression: item.expression, + }); + }); + args.data.objectProperties = Tools.object2Json(objectProperties); + } + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + + const form = args.grid.getEditorForm(); + const row = args.data; + if ('add' == form.getStatus()) { + let listObejctPropertiesUrl = ''; + if (args.type === 'parameter') { + listObejctPropertiesUrl = '/api/re/model/parameter/listObejctPropertiesByParameterId/' + args.parameter.id; + } else if (args.type === 'indicator') { + listObejctPropertiesUrl = '/api/re/indicator/listObejctPropertiesByIndicatorId/' + args.indicator.id; + } + axios.get(Environment.apiContextPath(listObejctPropertiesUrl)).then((response) => { + const properties = response.data; + const grid = form.getFieldComponent('objectProperties'); + grid?.setLocalData(properties); + }); + } else if ('edit' == form.getStatus()) { + let listObejctPropertiesUrl = ''; + if (args.type === 'parameter') { + listObejctPropertiesUrl = '/api/re/model/parameter/processor/listObejctPropertiesByProcessorId/' + row.id; + } else if (args.type === 'indicator') { + listObejctPropertiesUrl = '/api/re/indicator/processor/listObejctPropertiesByProcessorId/' + row.id; + } + axios.get(Environment.apiContextPath(listObejctPropertiesUrl)).then((response) => { + const properties = response.data; + const grid = form.getFieldComponent('objectProperties'); + grid?.setLocalData(properties); + }); + } + } +} + +export { ObjectProperties }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts new file mode 100644 index 00000000..ede5e108 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts @@ -0,0 +1,62 @@ +import { ref } from 'vue'; +import { $t, axios, Environment } from 'platform-core'; + +const optionOptionsRef = ref([]); + +class OptionValue { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'optionValue', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE'), + icon: 'bi-card-list', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'OPTION_VALUE'); + }, + }; + } + + public static format(row: any) { + return row.optionCode; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'optionCode', + label: $t('re.resources.designer.processor.grid.entity.optionCode'), + type: 'w-select', + options: optionOptionsRef, + showIf: (args: any) => { + return 'OPTION_VALUE' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [{ name: 'optionCode', label: $t('re.resources.designer.processor.grid.entity.optionCode') }]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) { + // 获取选项输入参数列表 + axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + args.parameter.id)).then((response) => { + const parameters: any[] = response.data; + const options: any[] = []; + parameters.forEach((item) => { + if (item.type === 'IN_OPTION') { + options.push({ label: item.name, value: item.code }); + } + }); + optionOptionsRef.value = options; + }); + } +} + +export { OptionValue }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts new file mode 100644 index 00000000..953f3bd6 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts @@ -0,0 +1,54 @@ +import { $t } from 'platform-core'; + +class Pmml { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'pmml', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.PMML'), + icon: 'bi-filetype-xml', + enableIf: (args) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'PMML'); + }, + }; + } + + public static format(row: any) { + const div = document.createElement('div'); + div.textContent = row.pmml; + const result = div.outerHTML; + div.parentNode?.removeChild(div); + return result; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'pmml', + label: $t('re.resources.designer.processor.grid.entity.pmml'), + type: 'w-code-mirror', + rows: 20, + lineNumber: true, + toolbar: false, + lang: 'xml', + showIf: (args: any) => { + return 'PMML' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return []; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) {} +} + +export { Pmml }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts new file mode 100644 index 00000000..5797d24b --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts @@ -0,0 +1,36 @@ +import { $t } from 'platform-core'; + +class Rule { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'rule', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.RULE'), + icon: 'bi-shadows', + enableIf: (args: any) => { + return parameter.type === 'RULE_RESULT' || parameter.type === 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'RULE'); + }, + }; + } + + public static format(row: any) { + return row.rule; + } + + public static getEditorFields(properties: any) { + return []; + } + + public static getViewerFields(properties: any) { + return [{ name: 'rule', label: $t('re.resources.designer.processor.grid.entity.rule') }]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) {} +} + +export { Rule }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts new file mode 100644 index 00000000..c057f2cf --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts @@ -0,0 +1,37 @@ +import { $t } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; + +class SingleRule { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'singleRule', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE'), + icon: 'bi-noise-reduction', + enableIf: (args: any) => { + return parameter.type === 'RULE_RESULT' || parameter.type === 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE'); + }, + }; + } + + public static format(row: any) { + return row.singleRule; + } + + public static getEditorFields(properties: any) { + return []; + } + + public static getViewerFields(properties: any) { + return [{ name: 'singleRule', label: $t('re.resources.designer.processor.grid.entity.singleRule') }]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) {} +} + +export { SingleRule }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts new file mode 100644 index 00000000..b3a800b9 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts @@ -0,0 +1,418 @@ +import { ref, computed } from 'vue'; +import { axios, Environment, $t, Tools } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; + +const autoCompletionManager = new AutoCompletionManager(); + +const dsOptionsRef = ref([]); +const parameterOptionsRef = ref([]); +const sqlQueryResultFieldsRef = ref([]); + +class Sql { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'sql', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.SQL'), + icon: 'bi-filetype-sql', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'SQL'); + }, + }; + } + + public static format(row: any) { + return { + componentType: 'w-code-mirror', + attrs: { + lang: 'sql', + rows: 4, + editable: false, + modelValue: row.sql, + placeholder: true, + }, + }; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'sqlDatasourceName', + label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName'), + type: 'w-select', + clearable: true, + options: dsOptionsRef, + rows: 1, + showIf: (args: any) => { + return 'SQL' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 3, + name: 'sql', + label: $t('re.resources.designer.processor.grid.entity.sql'), + type: 'w-code-mirror', + height: 180, + lang: 'sql', + toolbar: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + showIf: (args: any) => { + return 'SQL' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 2, + name: 'sqlParameterValues', + label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), + showIf: (args: any) => { + return 'SQL' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 150, + title: $t('re.resources.designer.processor.grid.entity.sqlParameterValues'), + autoFetchData: false, + dense: true, + dbClickOperation: 'edit', + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + { + name: 'analyze', + label: $t('analyze'), + icon: 'bi-tag', + click: (args: any) => { + const sql = properties.gridRef.getEditorForm().getFieldValue('sql'); + const regex = /\$\{[\u0000-\uFFFF]+?\}/g; + const array: any[] = sql.match(regex); + const rows: any[] = []; + array.forEach((item) => { + rows.push({ uuid: Tools.uuid(), name: item, value: '' }); + }); + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); + grid.setLocalData(rows); + }, + }, + 'separator', + 'add', + 'edit', + [ + { + extend: 'remove', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); + grid.removeRows(args.selecteds); + }, + }, + { + extend: 'remove', + name: 'removeAll', + label: $t('deleteAll'), + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); + grid.setLocalData([]); + }, + }, + ], + ], + primaryKey: 'uuid', + columns: [ + { name: 'uuid', label: 'uuid', hidden: true }, + { + width: '50%', + name: 'name', + label: $t('name'), + align: 'left', + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + { + width: '100%', + name: 'value', + label: $t('value'), + sortable: false, + }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: [ + { name: 'uuid', label: 'uuid', showIf: false }, + { + name: 'name', + label: $t('name'), + type: 'w-code-mirror', + toolbar: false, + lang: 'java', + rows: 1, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + }, + { + name: 'value', + label: $t('value'), + type: 'w-text', + }, + ], + }, + }, + onBeforeEditorDataSubmit: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); + const form = grid.getEditorForm(); + if ('add' == form.getStatus() || 'clone' == form.getStatus()) { + args.data.uuid = Tools.uuid(); + grid.addLocalData(args.data); + args.callback(false); + } else if ('edit' == form.getStatus()) { + grid.updateLocalData(args.data); + args.callback(false); + } + }, + }, + { + colSpan: 3, + name: 'sqlQueryResult', + label: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), + showIf: (args: any) => { + return 'SQL' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 250, + autoFetchData: false, + title: $t('re.resources.designer.processor.grid.entity.sqlQueryResult'), + dense: true, + draggable: 'local', + pageable: false, + checkboxSelection: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + { + name: 'execute', + label: $t('execute'), + icon: 'bi-caret-right', + click: (args: any) => { + const sql = properties.gridRef.getEditorForm().getFieldValue('sql'); + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues'); + const sqlParameterValues = grid?.getRows(); + axios + .post(Environment.apiContextPath('/api/re/model/parameter/processor/executeSql'), { + sql: sql, + sqlParameterValues: sqlParameterValues, + }) + .then((response) => { + const fieldMetaDatas: any[] = response.data.fieldMetaDatas; + fieldMetaDatas.forEach((field) => { + field.value = field.name; + field.label = field.name; + }); + const data = response.data.data; + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlQueryResult'); + sqlQueryResultFieldsRef.value = fieldMetaDatas; + grid.setLocalData(data); + }); + }, + }, + ], + columns: computed(() => { + return sqlQueryResultFieldsRef.value; + }), + }, + { + colSpan: 2, + name: 'sqlFieldMapping', + label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), + showIf: (args: any) => { + return 'SQL' === args.form.getFieldValue('type'); + }, + type: 'w-grid', + height: 250, + width: '100%', + autoFetchData: false, + title: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping'), + dense: true, + dbClickOperation: 'edit', + draggable: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + 'add', + 'edit', + [ + { + extend: 'remove', + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); + grid.removeLocalData(args.selecteds); + }, + }, + { + extend: 'remove', + name: 'removeAll', + label: $t('deleteAll'), + click: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); + grid.setLocalData([]); + }, + }, + ], + ], + primaryKey: 'uuid', + columns: [ + { name: 'uuid', label: 'uuid', hidden: true }, + { + width: '50%', + name: 'parameter', + label: $t('parameterName'), + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + { + width: '50%', + name: 'field', + label: $t('fieldName'), + align: 'left', + sortable: false, + }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: [ + { name: 'uuid', label: 'uuid', showIf: false }, + { + name: 'parameter', + label: $t('parameterName'), + type: 'w-select', + options: properties.parameterOptionsRef, + }, + { + name: 'field', + label: $t('fieldName'), + type: 'w-select', + options: sqlQueryResultFieldsRef.value, + }, + ], + }, + }, + onBeforeEditorDataSubmit: (args: any) => { + const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping'); + const form = grid.getEditorForm(); + if ('add' == form.getStatus() || 'clone' == form.getStatus()) { + args.data.uuid = Tools.uuid(); + grid.addLocalData(args.data); + args.callback(false); + } else if ('edit' == form.getStatus()) { + grid.updateLocalData(args.data); + args.callback(false); + } + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [ + { name: 'sqlDatasourceName', label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName') }, + { name: 'sql', label: $t('re.resources.designer.processor.grid.entity.sql') }, + { name: 'sqlParameterValues', label: $t('re.resources.designer.processor.grid.entity.sqlParameterValues') }, + { name: 'sqlFieldMapping', label: $t('re.resources.designer.processor.grid.entity.sqlFieldMapping') }, + ]; + } + + public static beforeEditorDataSubmit(args: any) { + axios.get(Environment.apiContextPath('/api/system/datasource')).then((response) => { + const items: any[] = response.data?.content; + if (items) { + const options: any[] = []; + items.forEach((item) => { + options.push({ label: item.name, value: item.name }); + }); + dsOptionsRef.value = options; + } + }); + + const form = args.grid.getEditorForm(); + const sqlParameterValuesGrid = form.getFieldComponent('sqlParameterValues'); + const sqlParameterValuesLocalData: any[] = sqlParameterValuesGrid.getRows(); + const sqlParameterValues: any[] = []; + sqlParameterValuesLocalData.forEach((item) => { + sqlParameterValues.push({ + uuid: item.uuid, + name: item.name, + value: item.value, + }); + }); + args.data.sqlParameterValues = Tools.object2Json(sqlParameterValues); + + const sqlFieldMappingGrid = form.getFieldComponent('sqlFieldMapping'); + const sqlFieldMappingLocalData: any[] = sqlFieldMappingGrid.getRows(); + const sqlFieldMapping: any[] = []; + sqlFieldMappingLocalData.forEach((item) => { + sqlFieldMapping.push({ + uuid: item.uuid, + field: item.field, + parameter: item.parameter, + }); + }); + args.data.sqlFieldMapping = Tools.object2Json(sqlFieldMapping); + } + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + + const form = args.grid.getEditorForm(); + const row = args.data; + + axios.get(Environment.apiContextPath('/api/system/datasource')).then((response) => { + const items: any[] = response.data?.content; + if (items) { + const options: any[] = []; + items.forEach((item) => { + options.push({ label: item.name, value: item.name }); + }); + dsOptionsRef.value = options; + } + }); + + axios.get(Environment.apiContextPath('api/re/model/parameter/findParametersByParameterId?parameterId=' + args.parameter.id)).then((response) => { + const options: any[] = []; + response.data.forEach((parameter) => { + options.push({ label: parameter.name, value: '${' + parameter.name + '}' }); + }); + parameterOptionsRef.value = options; + }); + + const sqlParameterValuesGrid = form.getFieldComponent('sqlParameterValues'); + const sqlParameterValuesRows = Tools.json2Object(row.sqlParameterValues); + sqlParameterValuesGrid.setLocalData(sqlParameterValuesRows); + + const sqlFieldMappingGrid = form.getFieldComponent('sqlFieldMapping'); + const sqlFieldMappingRows = Tools.json2Object(row.sqlFieldMapping); + sqlFieldMappingGrid.setLocalData(sqlFieldMappingRows); + } +} + +export { Sql }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts new file mode 100644 index 00000000..c062704e --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts @@ -0,0 +1,108 @@ +import { $t, Environment } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class Ternary { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'ternary', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.TERNARY'), + icon: 'bi-question', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'TERNARY'); + }, + }; + } + + public static format(row: any) { + return ( + PlaceHolder.replace(row.ternaryCondition) + + ' ? ' + + PlaceHolder.replace(row.ternaryTrue) + + ' : ' + + PlaceHolder.replace(row.ternaryFalse) + ); + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'ternaryCondition', + label: $t('re.resources.designer.processor.grid.entity.ternaryCondition'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'TERNARY' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 5, + name: 'ternaryTrue', + label: $t('re.resources.designer.processor.grid.entity.ternaryTrue'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'TERNARY' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 5, + name: 'ternaryFalse', + label: $t('re.resources.designer.processor.grid.entity.ternaryFalse'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'TERNARY' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [ + { name: 'ternaryCondition', label: $t('re.resources.designer.processor.grid.entity.ternaryCondition') }, + { name: 'ternaryTrue', label: $t('re.resources.designer.processor.grid.entity.ternaryTrue') }, + { name: 'ternaryFalse', label: $t('re.resources.designer.processor.grid.entity.ternaryFalse') }, + ]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + } +} + +export { Ternary }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts new file mode 100644 index 00000000..c687d899 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts @@ -0,0 +1,105 @@ +import { $t, Environment } from 'platform-core'; +import { PlaceHolder } from '@/utils/PlaceHolder'; +import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; +import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; + +const autoCompletionManager = new AutoCompletionManager(); +const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); + +class WhenThen { + public static getToolbarAction(parameter: any) { + return { + extend: 'add', + name: 'whenThen', + label: $t('io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN'), + icon: 'bi-sliders', + enableIf: (args: any) => { + return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT'; + }, + afterClick: (args: any) => { + args.grid.getEditorForm().setFieldValue('type', 'WHEN_THEN'); + }, + }; + } + + public static format(row: any) { + let str = ''; + if (row.isWhenThenShorted) { + str += '' + $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') + ', '; + } + if (row.when) { + str += 'When ' + PlaceHolder.replace(row.when) + ' '; + } + if (row.then) { + str += 'Then ' + PlaceHolder.replace(row.then); + } + return str; + } + + public static getEditorFields(properties: any) { + return [ + { + colSpan: 5, + name: 'when', + label: $t('re.resources.designer.processor.grid.entity.when'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'WHEN_THEN' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 5, + name: 'then', + label: $t('re.resources.designer.processor.grid.entity.then'), + type: 'w-code-mirror', + lang: 'java', + rows: 4, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + showIf: (args: any) => { + return 'WHEN_THEN' === args.form.getFieldValue('type'); + }, + }, + { + colSpan: 5, + name: 'isWhenThenShorted', + label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted'), + type: 'w-checkbox', + showIf: (args: any) => { + return 'WHEN_THEN' === args.form.getFieldValue('type'); + }, + }, + ]; + } + + public static getViewerFields(properties: any) { + return [ + { name: 'when', label: $t('re.resources.designer.processor.grid.entity.when') }, + { name: 'then', label: $t('re.resources.designer.processor.grid.entity.then') }, + { name: 'isWhenThenShorted', label: $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') }, + ]; + } + + public static beforeEditorDataSubmit(args: any) {} + + public static afterEditorOpen(args: any) { + if (args.type === 'parameter') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id)); + } else if (args.type === 'indicator') { + autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id)); + } + userDefinedFunctionsManager.load(); + } +} + +export { WhenThen }; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/index.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/index.ts new file mode 100644 index 00000000..1ed68db3 --- /dev/null +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/index.ts @@ -0,0 +1,17 @@ +export { Arithmetic } from './Arithmetic'; +export { ConditionRange } from './ConditionRange'; +export { DecisionTable } from './DecisionTable'; +export { DecisionTable2c } from './DecisionTable2c'; +export { DecisionTree } from './DecisionTree'; +export { ExecutionFlow } from './ExecutionFlow'; +export { GroovyScript } from './GroovyScript'; +export { MathFormula } from './MathFormula'; +export { NumberRange } from './NumberRange'; +export { ObjectProperties } from './ObjectProperties'; +export { OptionValue } from './OptionValue'; +export { Pmml } from './Pmml'; +export { Rule } from './Rule'; +export { SingleRule } from './SingleRule'; +export { Sql } from './Sql'; +export { Ternary } from './Ternary'; +export { WhenThen } from './WhenThen'; diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java index 07315e43..ca9d8da7 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java @@ -177,18 +177,18 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl objectProperties =autoMatchObjectProperties.getObjectProperties(); - if(!StringUtils.hasText(parameterId) || objectProperties==null || objectProperties.isEmpty()){ + if(!StringUtils.hasText(indicatorId) || objectProperties==null || objectProperties.isEmpty()){ return objectProperties; } - IndicatorEntity parameter =indicatorService.findById(parameterId); - if(parameter==null){ + IndicatorEntity indicator =indicatorService.findById(indicatorId); + if(indicator==null){ return objectProperties; } - String valueType =parameter.getValueType(); - Integer valueTypeVersion =parameter.getValueTypeVersion(); + String valueType =indicator.getValueType(); + Integer valueTypeVersion =indicator.getValueTypeVersion(); if( "java.lang.Boolean".equals(valueType) || "java.lang.Long".equals(valueType) || @@ -228,7 +228,7 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl objectProperties =autoMatchObjectProperties.getObjectProperties(); if(!StringUtils.hasText(parameterId) || objectProperties==null || objectProperties.isEmpty()){ return objectProperties; diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/support/AutoMatchObjectProperties.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/support/AutoMatchObjectProperties.java index 692ea0ac..b0e27533 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/support/AutoMatchObjectProperties.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/support/AutoMatchObjectProperties.java @@ -4,15 +4,15 @@ import java.util.ArrayList; import java.util.List; public class AutoMatchObjectProperties { - private String parameterId; + private String id; private List objectProperties =new ArrayList(); - public String getParameterId() { - return parameterId; + public String getId() { + return id; } - public void setParameterId(String parameterId) { - this.parameterId = parameterId; + public void setId(String id) { + this.id = id; } public List getObjectProperties() { diff --git a/io.sc.engine.st.frontend/.eslintrc.cjs b/io.sc.engine.st.frontend/.eslintrc.cjs index 181a97a6..b8726ddf 100644 --- a/io.sc.engine.st.frontend/.eslintrc.cjs +++ b/io.sc.engine.st.frontend/.eslintrc.cjs @@ -1,36 +1,69 @@ module.exports = { - root: true, + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, - env: { - browser: true, - es2022: true, - "vue/setup-compiler-macros": true, - }, + env: { + browser: true, + es2022: true, + node: true, + 'vue/setup-compiler-macros': true, + }, - parserOptions:{ - ecmaVersion: 2022, - sourceType:"module", - }, + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + 'eslint:recommended', - extends:[ - "eslint:recommended", - "plugin:vue/vue3-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - ], - - parser: "vue-eslint-parser", - parserOptions: { - ecmaVersion: 2022, - parser: "@typescript-eslint/parser", - sourceType: "module", - }, + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Vue ESLint recommended rules + // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + 'plugin:vue/vue3-recommended', + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'plugin:prettier/recommended', // Recommended + ], - rules:{ - 'semi':[1], - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/no-unused-vars": 'off', - 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */ + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: false, }, + }, + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + rules: { + semi: [1], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-this-alias': 'off', + 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, + 'no-prototype-builtins': 'off', + 'prefer-rest-params': 'off', + 'no-control-regex': 'off', + }, }; diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index fb753100..95aeee78 100644 --- a/io.sc.engine.st.frontend/package.json +++ b/io.sc.engine.st.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.st.frontend", - "version": "8.1.49", + "version": "8.1.50", "description": "", "private": false, "keywords": [], @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.2", "pinia": "2.2.2", "pinia-undo": "0.2.4", - "platform-core": "8.1.410", + "platform-core": "8.1.414", "quasar": "2.17.0", "svg-path-commander": "2.0.10", "tailwindcss": "3.4.10", diff --git a/io.sc.platform.core.frontend/.bin/sync.js b/io.sc.platform.core.frontend/.bin/sync.js index e3aaf6e8..938493b4 100644 --- a/io.sc.platform.core.frontend/.bin/sync.js +++ b/io.sc.platform.core.frontend/.bin/sync.js @@ -54,6 +54,7 @@ const syncFrontendProject = () => { cp(sourceDir + 'src/boostrap.ts', targetDir + 'src/boostrap.ts'); cp(sourceDir + '.browserslistrc', targetDir + '.browserslistrc'); cp(sourceDir + '.editorconfig', targetDir + '.editorconfig'); + cp(sourceDir + '.eslintrc.cjs', targetDir + '.eslintrc.cjs'); cp(sourceDir + '.gitignore', targetDir + '.gitignore'); cp(sourceDir + '.npmignore', targetDir + '.npmignore'); cp(sourceDir + '.npmrc', targetDir + '.npmrc'); diff --git a/io.sc.platform.core.frontend/.eslintrc.cjs b/io.sc.platform.core.frontend/.eslintrc.cjs index f7fab5cc..b8726ddf 100644 --- a/io.sc.platform.core.frontend/.eslintrc.cjs +++ b/io.sc.platform.core.frontend/.eslintrc.cjs @@ -64,5 +64,6 @@ module.exports = { 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, 'no-prototype-builtins': 'off', 'prefer-rest-params': 'off', + 'no-control-regex': 'off', }, }; diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index c2a89bd1..4da65b07 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.1.410", + "version": "8.1.416", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", diff --git a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/Toolbar.vue b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/Toolbar.vue index ae374e7f..f0bd9379 100644 --- a/io.sc.platform.core.frontend/src/platform/components/math/toolbar/Toolbar.vue +++ b/io.sc.platform.core.frontend/src/platform/components/math/toolbar/Toolbar.vue @@ -1,6 +1,6 @@