From d2b97c0f8b4d99d72ae0b895abd72a424ecf989a Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Wed, 20 Aug 2025 16:19:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.34=20=20=201)=20=E4=BF=AE=E5=A4=8D=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=88=91=E7=9A=84=E5=B7=B2=E5=8A=9E=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=20=20=202)=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=92=8C=E6=95=B0=E6=8D=AE=E5=AD=98=E5=82=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端核心发布: 8.2.127 1) 增加异步任务 --- cips.frontend/package.json | 5 +- cips.frontend/public/configure.js | 2 +- erm.frontend/package.json | 5 +- erm.frontend/public/configure.js | 2 +- gradle.properties | 5 +- io.sc.engine.mv.frontend/package.json | 5 +- io.sc.engine.mv.frontend/public/configure.js | 2 +- io.sc.engine.rule.frontend/package.json | 5 +- .../public/configure.js | 2 +- io.sc.engine.st.frontend/package.json | 5 +- io.sc.engine.st.frontend/public/configure.js | 2 +- io.sc.platform.ai.frontend/package.json | 5 +- .../public/configure.js | 2 +- .../package copy.json | 151 ++++++++++++++++++ io.sc.platform.core.frontend/package.json | 2 +- .../public/configure.js | 2 +- .../src/platform/components/grid/WGrid.vue | 1 + .../platform/components/grid/ts/GridTools.ts | 1 + .../grid/ts/expose-api/ExposeApiManager.ts | 1 + .../grid/ts/expose-api/src/ResetProperty.ts | 13 ++ .../grid/ts/toolbar/buttons/Export.ts | 4 +- .../components/grid/ts/types/PropsType.ts | 140 ++++++++-------- .../components/grid/ts/types/table/UrlType.ts | 13 +- .../platform/components/radio/WExtRadio.vue | 13 +- .../src/platform/i18n/messages.json | 1 + .../src/platform/i18n/messages_tw_CN.json | 1 + .../src/platform/i18n/messages_zh_CN.json | 1 + .../layout/sub-layout/AsyncTaskDialog.vue | 25 ++- .../src/views/testcase/excel/Excel copy.vue | 92 +++++++++++ .../src/views/testcase/excel/Excel.vue | 109 +++---------- .../src/views/testcase/form/form.vue | 1 - .../template-project/package.json | 4 +- .../template-project/public/configure.js | 2 +- .../src/views/testcase/excel/Excel copy.vue | 92 +++++++++++ .../src/views/testcase/excel/Excel.vue | 109 +++---------- .../src/views/testcase/form/form.vue | 1 - .../AsyncExecutorAutoConfiguration.java | 24 +-- .../plugins/application-properties.json | 18 +++ io.sc.platform.developer.doc/package.json | 4 +- .../package.json | 5 +- .../public/configure.js | 2 +- io.sc.platform.lcdp.frontend/package.json | 5 +- .../public/configure.js | 2 +- .../package.json | 5 +- .../public/configure.js | 2 +- io.sc.platform.mvc.frontend/package.json | 5 +- .../public/configure.js | 2 +- .../sc/platform/orm/service/DaoService.java | 5 - .../orm/service/impl/DaoServiceImpl.java | 125 ++------------- .../service/support/ExportExcelThread.java | 77 --------- .../io/sc/platform/orm/task/ExportTask.java | 12 ++ .../platform/orm/task/ExportTaskBuilder.java | 133 +++++++++++++++ .../io/sc/platform/orm/task/TaskBuilder.java | 119 ++++++++++++++ .../AsyncTaskAllreadyExistsException.java | 4 + .../JxlsTemplateNotFoundException.java | 4 + .../orm/task/service/TaskService.java | 8 +- .../task/service/impl/TaskServiceImpl.java | 42 +++-- .../orm/task/thread/ExportTaskThread.java | 93 +++++++++++ .../platform/orm/task/thread/TaskThread.java | 147 +++++++++++++++++ .../sc/platform/orm/task/i18n/task.properties | 5 +- .../orm/task/i18n/task_tw_CN.properties | 5 +- .../orm/task/i18n/task_zh_CN.properties | 5 +- io.sc.platform.poi/build.gradle | 2 + .../src/test/java/WordTest.java | 19 +++ .../package.json | 5 +- .../public/configure.js | 2 +- io.sc.platform.system.frontend/package.json | 5 +- .../public/configure.js | 2 +- .../initializer/ParameterInitializer.java | 10 +- .../task/controller/TaskWebController.java | 5 + .../system/task/service/TaskService.java | 2 + .../task/service/impl/TaskServiceImpl.java | 10 ++ io.sc.standard.frontend/package.json | 5 +- io.sc.standard.frontend/public/configure.js | 2 +- io.sc.website/package.json | 4 +- wra.report.frontend/package.json | 5 +- wra.report.frontend/public/configure.js | 2 +- 77 files changed, 1207 insertions(+), 557 deletions(-) create mode 100644 io.sc.platform.core.frontend/package copy.json create mode 100644 io.sc.platform.core.frontend/src/views/testcase/excel/Excel copy.vue create mode 100644 io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel copy.vue delete mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/ExportExcelThread.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/ExportTaskBuilder.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/TaskBuilder.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/exception/AsyncTaskAllreadyExistsException.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/exception/JxlsTemplateNotFoundException.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java create mode 100644 io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java create mode 100644 io.sc.platform.poi/src/test/java/WordTest.java diff --git a/cips.frontend/package.json b/cips.frontend/package.json index 25697081..88e9e7a6 100644 --- a/cips.frontend/package.json +++ b/cips.frontend/package.json @@ -1,6 +1,6 @@ { "name": "cips.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/cips.frontend/public/configure.js b/cips.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/cips.frontend/public/configure.js +++ b/cips.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/erm.frontend/package.json b/erm.frontend/package.json index a87a71e1..2f899ea1 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -1,6 +1,6 @@ { "name": "erm.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/erm.frontend/public/configure.js b/erm.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/erm.frontend/public/configure.js +++ b/erm.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/gradle.properties b/gradle.properties index 9f6db34d..b8850e93 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,9 +37,9 @@ application_version=1.0.0 # platform ########################################################### platform_group=io.sc -platform_version=8.2.33 +platform_version=8.2.34 platform_plugin_version=8.2.10 -platform_core_frontend_version=8.2.126 +platform_core_frontend_version=8.2.127 ########################################################### # dependencies version @@ -85,6 +85,7 @@ oshi_version=6.6.1 p6spy_version=3.9.1 pinyin4j_version=2.5.1 poi_version=5.2.5 +poi_tl_version=1.12.2 reflections_version=0.10.2 schemacrawler_version=16.21.4 shadow_gradle_plugin_version=8.3.1 diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index 10751b61..ccfcf15b 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.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.mv.frontend/public/configure.js b/io.sc.engine.mv.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.engine.mv.frontend/public/configure.js +++ b/io.sc.engine.mv.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index 2fec5f6b..c6e9e5d3 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.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.rule.frontend/public/configure.js b/io.sc.engine.rule.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.engine.rule.frontend/public/configure.js +++ b/io.sc.engine.rule.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index 64e94712..e673ac90 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.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.st.frontend/public/configure.js b/io.sc.engine.st.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.engine.st.frontend/public/configure.js +++ b/io.sc.engine.st.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.ai.frontend/package.json b/io.sc.platform.ai.frontend/package.json index 63e77bda..4a5c1e68 100644 --- a/io.sc.platform.ai.frontend/package.json +++ b/io.sc.platform.ai.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.ai.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.ai.frontend/public/configure.js b/io.sc.platform.ai.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.ai.frontend/public/configure.js +++ b/io.sc.platform.ai.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.core.frontend/package copy.json b/io.sc.platform.core.frontend/package copy.json new file mode 100644 index 00000000..4add8742 --- /dev/null +++ b/io.sc.platform.core.frontend/package copy.json @@ -0,0 +1,151 @@ +{ + "name": "platform-core", + "version": "8.2.126", + "description": "前端核心包,用于快速构建前端的脚手架", + "//main": "库的主文件", + "main": "dist/platform-core.js", + "//files": "打包时需要包含的文件列表", + "files": [ + ".bin", + "dist/configure.js", + "dist/css", + "dist/favicon.svg", + "dist/fonts", + "dist/index.html", + "dist/login-bg.jpg", + "dist/logo.svg", + "dist/platform-core.js", + "dist/types", + "template-project/*.*", + "template-project/public", + "template-project/src" + ], + "//types": "类型申明主文件", + "types": "./dist/types/index.d.ts", + "private": false, + "keywords": [], + "author": "", + "license": "ISC", + "//bin": "可直接通过 npx 执行的命令", + "bin": { + "//platform": "npx platform", + "platform": "./.bin/platform.js" + }, + "scripts": { + "dev": "nodemon", + "serve": "node ./util-components-generator.cjs && cross-env NODE_ENV=development webpack serve --config webpack.env.serve.cjs", + "build": "node ./util-components-generator.cjs && cross-env NODE_ENV=development webpack --config webpack.env.build.cjs", + "prod": "node ./util-components-generator.cjs && cross-env NODE_ENV=production webpack --config webpack.env.prod.cjs", + "lib": "node ./util.template-generator.cjs && cross-env NODE_ENV=production webpack --config webpack.env.lib.cjs && tsc --project tsconfig.json --emitDeclarationOnly --noEmit false", + "check": "tsc --project tsconfig.json --emitDeclarationOnly --noEmit false", + "template": "node ./util.template-generator.cjs", + "clean": "platform clean dist ./node_modules ./pnpm-lock.yaml ./package-lock.json", + "sync": "platform sync" + }, + "engines": { + "node": ">=18", + "pnpm": ">=7" + }, + "publishConfig": { + "registry": "http://nexus.sc.io:8000/repository/npm-releases/", + "access": "public", + "no-git-checks": true + }, + "devDependencies": { + "@babel/core": "7.26.0", + "@babel/plugin-transform-class-properties": "7.25.9", + "@babel/plugin-transform-object-rest-spread": "7.25.9", + "@babel/preset-env": "7.26.0", + "@babel/preset-typescript": "7.26.0", + "@quasar/app-webpack": "4.0.7", + "@quasar/cli": "2.4.1", + "@types/mockjs": "1.0.10", + "@types/node": "22.10.7", + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@vue/babel-plugin-jsx": "1.2.5", + "@vue/compiler-sfc": "3.5.13", + "@vuepress/bundler-webpack": "2.0.0-rc.15", + "@vuepress/theme-default": "2.0.0-rc.49", + "@webpack-cli/serve": "3.0.1", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", + "clean-webpack-plugin": "4.0.0", + "copy-webpack-plugin": "12.0.2", + "cross-env": "7.0.3", + "css-loader": "7.1.2", + "eslint": "9.18.0", + "eslint-config-prettier": "10.0.1", + "eslint-plugin-prettier": "5.2.2", + "eslint-plugin-vue": "9.32.0", + "eslint-webpack-plugin": "4.2.0", + "html-webpack-plugin": "5.6.3", + "json5": "2.2.3", + "mini-css-extract-plugin": "2.9.2", + "nodemon": "3.1.9", + "postcss": "8.5.1", + "postcss-import": "16.1.0", + "postcss-loader": "8.1.1", + "postcss-preset-env": "10.1.3", + "prettier": "3.4.2", + "sass": "1.83.4", + "sass-loader": "16.0.4", + "tailwindcss": "3.4.17", + "typescript": "5.5.4", + "vue-loader": "17.4.2", + "vuepress": "2.0.0-rc.15", + "webpack": "5.97.1", + "webpack-bundle-analyzer": "4.10.2", + "webpack-cli": "6.0.1", + "webpack-dev-server": "5.2.0", + "webpack-merge": "6.0.1" + }, + "dependencies": { + "@codemirror/autocomplete": "6.18.6", + "@codemirror/commands": "6.8.1", + "@codemirror/lang-html": "6.4.9", + "@codemirror/lang-java": "6.0.1", + "@codemirror/lang-javascript": "6.2.3", + "@codemirror/lang-json": "6.0.1", + "@codemirror/lang-sql": "6.8.0", + "@codemirror/lang-xml": "6.1.0", + "@codemirror/language": "6.11.0", + "@codemirror/search": "6.5.10", + "@codemirror/state": "6.5.2", + "@codemirror/view": "6.36.5", + "@maxgraph/core": "0.14.0", + "@quasar/extras": "1.16.15", + "@quasar/quasar-ui-qmarkdown": "2.0.5", + "@univerjs/core": "0.5.4", + "@univerjs/design": "0.5.4", + "@univerjs/docs": "0.5.4", + "@univerjs/docs-ui": "0.5.4", + "@univerjs/engine-formula": "0.5.4", + "@univerjs/engine-render": "0.5.4", + "@univerjs/facade": "0.5.4", + "@univerjs/sheets": "0.5.4", + "@univerjs/sheets-formula": "0.5.4", + "@univerjs/sheets-ui": "0.5.4", + "@univerjs/thread-comment": "0.5.4", + "@univerjs/ui": "0.5.4", + "@vueuse/core": "12.4.0", + "axios": "1.8.2", + "codemirror": "6.0.1", + "dayjs": "1.11.13", + "echarts": "5.6.0", + "exceljs": "4.4.0", + "file-saver": "2.0.5", + "luckyexcel": "1.0.1", + "mockjs": "1.1.0", + "pinia": "2.3.0", + "quasar": "2.17.6", + "sort-array": "5.0.0", + "svg-path-commander": "2.1.7", + "vue": "3.5.13", + "vue-dompurify-html": "5.2.0", + "vue-i18n": "11.0.1", + "vue-router": "4.5.0", + "xml-formatter": "3.6.3", + "node-sql-parser": "5.3.6" + } +} diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index 4add8742..1b3b6ae0 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/io.sc.platform.core.frontend/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.126", + "version": "8.2.127", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", diff --git a/io.sc.platform.core.frontend/public/configure.js b/io.sc.platform.core.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.core.frontend/public/configure.js +++ b/io.sc.platform.core.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/WGrid.vue b/io.sc.platform.core.frontend/src/platform/components/grid/WGrid.vue index 6dce37a9..05aefd2d 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/WGrid.vue +++ b/io.sc.platform.core.frontend/src/platform/components/grid/WGrid.vue @@ -143,6 +143,7 @@ watchEffect(() => { tools.table.url.addDataUrl = props.addDataUrl; tools.table.url.editDataUrl = props.editDataUrl; tools.table.url.removeDataUrl = props.removeDataUrl; + tools.table.url.exportDataUrl = props.exportDataUrl; let flag = false; if (props.dense !== undefined) { diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/GridTools.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/GridTools.ts index 62b3b09e..945696f1 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/GridTools.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/GridTools.ts @@ -138,6 +138,7 @@ export class GridTools { addDataUrl: props.addDataUrl, editDataUrl: props.editDataUrl, removeDataUrl: props.removeDataUrl, + exportDataUrl: props.exportDataUrl, }, configStore: { showConfigPanel: false, diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/ExposeApiManager.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/ExposeApiManager.ts index 0b1c4943..9ad16fde 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/ExposeApiManager.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/ExposeApiManager.ts @@ -94,6 +94,7 @@ export class ExposeApiManager { setAddDataUrl: tools.apiFM.resetProperty.setAddDataUrl, setEditDataUrl: tools.apiFM.resetProperty.setEditDataUrl, setRemoveDataUrl: tools.apiFM.resetProperty.setRemoveDataUrl, + setExportDataUrl: tools.apiFM.resetProperty.setExportDataUrl, // 内置按钮api query: tools.apiFM.button.query, diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/src/ResetProperty.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/src/ResetProperty.ts index e9fd0291..2c07faeb 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/src/ResetProperty.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/expose-api/src/ResetProperty.ts @@ -14,6 +14,7 @@ export class ResetProperty extends Base { this.setAddDataUrl = this.setAddDataUrl.bind(this); this.setEditDataUrl = this.setEditDataUrl.bind(this); this.setRemoveDataUrl = this.setRemoveDataUrl.bind(this); + this.setExportDataUrl = this.setExportDataUrl.bind(this); this.setQueryCriteriaFieldValueHandler = this.setQueryCriteriaFieldValueHandler.bind(this); } @@ -102,6 +103,18 @@ export class ResetProperty extends Base { this.table.url.removeDataUrl = url; } + /** + * 设置导出url + * @param url + * @returns + */ + setExportDataUrl(url: string) { + if (!this.table) { + return; + } + this.table.url.exportDataUrl = url; + } + private setQueryCriteriaFieldValueHandler(criteria: any, fieldName: string, fieldValue: any) { if (criteria.criteria && criteria.criteria.length > 0) { criteria.criteria.forEach((item) => { diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/toolbar/buttons/Export.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/toolbar/buttons/Export.ts index c7fae580..ab3d672d 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/toolbar/buttons/Export.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/toolbar/buttons/Export.ts @@ -14,8 +14,8 @@ export class Export extends Button { } async click(args) { - const reqParams: any = { pageable: false }; - const urlSearchParams = this.tools?.criteriaFM.buildURLSearchParams(reqParams); + console.log(this.table?.url.exportDataUrl); + const urlSearchParams = this.tools?.apiFM.getData.getURLSearchParams(false); //导出不分页 let url = this.table?.url.exportDataUrl || this.table.url.dataUrl + '/exportExcel'; if (!Tools.isEmpty(this.tools?.props.title)) { url = url + '?downloadFileName=' + encodeURIComponent(this.tools?.props.title); diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts index 18e13b18..89e0f360 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts @@ -1,267 +1,271 @@ export type PropsType = { - refreshAfterActive: Boolean,// 当组件被激活时自动刷新一次 + refreshAfterActive: Boolean; // 当组件被激活时自动刷新一次 /** * 表格高度 */ - height: number, + height: number; /** * 表格标题 */ - title: string, + title: string; /** * 自动加载数据 */ - autoFetchData: boolean, + autoFetchData: boolean; /** * 本地模式,启用该模式后,除了查询数据依旧通过 autoFetchData 与 url 控制外,其他所有与后端交互的请求都失效,同时分页属性也失效 */ - localMode: boolean, + localMode: boolean; /** * 选择模式 */ - selectMode: string, + selectMode: string; /** * 拖拽数据行排序的模式,默认不可拖拽,字符串`local`为本地排序,只根据配置的字段进行本地排序,不会将数据发送至后端,字符串`server`为远程排序,拖拽完成后会将数据发送至后端。 */ - dndMode?: undefined | string, + dndMode?: undefined | string; /** * 拖拽排序时根据哪个字段进行排序,默认为`order`字段 */ - dndOrderBy: string, + dndOrderBy: string; /** * 是否需要分页,当启用树形表格模式时该属性失效,树形表格不支持分页。 */ - pageable: boolean, + pageable: boolean; /** * 是否显示表格配置按钮 */ - configButton: boolean, + configButton: boolean; /** * 表格数据操作请求的URL前缀 */ - dataUrl: string, + dataUrl: string; /** * 获取数据URL */ - fetchDataUrl: string, + fetchDataUrl: string; /** * 新增数据url */ - addDataUrl: string, + addDataUrl: string; /** * 修改数据url */ - editDataUrl: string, + editDataUrl: string; /** * 删除数据url */ - removeDataUrl: string, + removeDataUrl: string; + /** + * 导出数据url + */ + exportDataUrl: string; /** * 自定义获取数据函数,若表格内置的查询参数或方式(GET、POST)等不满足使用场景,可使用该函数自定义进行查询,只需返回的结果结构与内置查询一致即可。 */ - customFetch?: Function | undefined, + customFetch?: Function | undefined; /** * 表格整体紧凑模式 */ - dense?: undefined | boolean, + dense?: undefined | boolean; /** * 表格列标题紧凑模式 */ - denseHeader?: undefined | boolean, + denseHeader?: undefined | boolean; /** * 表格数据行紧凑模式 */ - denseBody?: undefined | boolean, + denseBody?: undefined | boolean; /** * 表格底部分页栏紧凑模式 */ - denseBottom?: undefined | boolean, + denseBottom?: undefined | boolean; /** * 表格toolbar按钮栏紧凑模式 */ - denseToolbar?: undefined | boolean, + denseToolbar?: undefined | boolean; /** * 是否显示排序号 */ - sortNo: boolean, + sortNo: boolean; /** * 从左侧开始冻结列数,复选框与排序列不计算在内,支持1-10列。 */ - stickyNum: number, + stickyNum: number; /** * 斑马纹,当传入布尔值时斑马纹颜色默认,当传入字符串颜色时使用传入的颜色,支持rgb颜色。 */ - stripe: boolean | string, + stripe: boolean | string; /** * checkbox选择模式,默认启用 */ - checkboxSelection: boolean, + checkboxSelection: boolean; /** * 行数据中记录checkbox勾选状态的字段名 */ - tickedField: string, + tickedField: string; /** * 行数据中记录行点击选中状态的字段名 */ - selectedField: string, + selectedField: string; /** * 树形表格模式,按照层级关系构建数据并以树形展现 */ - tree: boolean, + tree: boolean; /** * 树型表格模式, 懒加载 */ - treeLazyLoad: boolean, + treeLazyLoad: boolean; /** * 树形表格模式,图标函数,带有一个参数,行数据 */ - treeIcon?: Function | undefined, + treeIcon?: Function | undefined; /** * 树形表格模式,树形表格数据加载后是否全部展开 */ - treeDefaultExpandAll: boolean, + treeDefaultExpandAll: boolean; /** * 树形表格模式,树勾选策略,strict:节点自己,leaf:包含子节点 */ - treeTickStrategy: string, + treeTickStrategy: string; /** * 树形表格模式的数据关系,包括:parent, children,当为parent时组件根据数据主键与数据外键构建树形数据,否则需要自己构建好树形数据放到children属性中。 */ - treeRelationship: string, + treeRelationship: string; /** * 数据主键(常规表格模式时,该字段可用作内置的编辑删除等功能对应的后端API入参,如:继承RestCrudController的update所需的入参。树形表格模式时,该字段为构建树数据的主键) */ - primaryKey: string, + primaryKey: string; /** * 数据外键(常规表格模式时,该字段暂时无用,将来可用作多个表格的数据关系字段。树形表格模式时,该字段为构建树数据的关系字段) */ - foreignKey: string, + foreignKey: string; /** * 新增、删除、修改成功后是否刷新数据列表,默认不刷新但是新增修改后台必须返回对应的行数据对象,删除则必须返回删除的记录集primaryKey集合。 */ - refreshData?: boolean, + refreshData?: boolean; /** * 默认的双击操作:可填写内置或自定义按钮name,执行的操作为按钮对应的click,固定值提供:expand(展开双击的行)、none(双击不执行任何动作) */ - dbClickOperation: string, + dbClickOperation: string; /** * 表格分割线,支持:horizontal、vertical、cell、none */ - separator: string, + separator: string; /** * 隐藏表头 */ - hideHeader?: boolean, + hideHeader?: boolean; /** * 隐藏底部 */ - hideBottom?: boolean, + hideBottom?: boolean; /** * 分组模式,支持:alone、merge */ - groupMode?: undefined | string, + groupMode?: undefined | string; /** * alone分组模式下默认展开的组,字符串支持:all、first、none,数组可配置多个组名。 */ - groupStartOpen?: string | Array | Function, + groupStartOpen?: string | Array | Function; /** * 分组字段配置,当分组模式为 alone 时若配置的为数组,取数组第一个字段。 */ - groupByField: string | Array, + groupByField: string | Array; /** * 分组显示内容,仅 alone 模式有效,支持字符串 `format` 使用分组字段列定义中配置的format进行内容显示处理,函数支持自定义显示内容 */ - groupByTitle?: string | Function, + groupByTitle?: string | Function; /** * 表格追加行,添加到当前表格数据行尾,可添加多行,支持跨行跨列配置,用于添加合计或者额外信息。 */ - appendRows: Array, + appendRows: Array; /** * 默认排序字段,示例:['userName', '-lastModifyDate'],其中“-”开头表示倒序。 */ - sortBy: Array, + sortBy: Array; /** * 默认勾选的记录,传入一个对象,包含:columnName(列名称,字符串类型,该属性不传默认根据数据主键查找)、data(需要勾选的数据,数组类型) */ - tickedRecord: any, + tickedRecord: any; /** * 高级查询 */ - advancedQuery: boolean, + advancedQuery: boolean; /** * 查询条件,查询、翻页、刷新等操作都会带上的查询条件 */ - queryCriteria: any, + queryCriteria: any; /** * 列定义 */ - columns: Array, + columns: Array; /** * 查询表单字段 */ - queryFormFields: Array, + queryFormFields: Array; /** * 查询表单一行显示几个元素 */ - queryFormColsNum: any, + queryFormColsNum: any; /** * 查询表单显示几行 */ - queryFormRowsNum: number, + queryFormRowsNum: number; /** * 查询表单 form 组件属性 */ - queryFormAttrs: any, + queryFormAttrs: any; /** * toolbar 按钮 */ - toolbarActions: Array, + toolbarActions: Array; /** * toolbar 属性 */ - toolbarConfigure: any, + toolbarConfigure: any; /** * 数据行可选规则配置函数 */ - selectableIf?: Function, + selectableIf?: Function; /** * 数据行可选规则配置函数 */ - treeTickableIf?: Function, + treeTickableIf?: Function; /** * 分页大小,后台初始页码等配置 */ - pagination: any, + pagination: any; /** * 编辑相关窗口、表单、字段配置 */ - editor?: any, + editor?: any; /** * 查看抽屉、字段配置 */ - viewer?: any, + viewer?: any; /** * 作为form中的组件使用时控制表格是否显示 */ - showIf?: boolean | Function, + showIf?: boolean | Function; /** * 作为form中的组件使用时配置表单form实例 */ - form?: any, + form?: any; /** * 用户自定义单击函数 */ - onRowClick?: Function, + onRowClick?: Function; /** * 用户自定义双击函数 */ - onRowDbClick?: Function, + onRowDbClick?: Function; /** * 用户自定义数据勾选函数 */ - onUpdateTicked?: Function, + onUpdateTicked?: Function; /** * 用户自定义拖拽回调函数 */ - onAfterDragAndDrop?: Function, -} \ No newline at end of file + onAfterDragAndDrop?: Function; +}; diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/table/UrlType.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/table/UrlType.ts index c4d0d1b1..c3cf2368 100644 --- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/table/UrlType.ts +++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/table/UrlType.ts @@ -1,7 +1,8 @@ export type UrlType = { - dataUrl: string, - fetchDataUrl: string, - addDataUrl: string, - editDataUrl: string, - removeDataUrl: string, -} \ No newline at end of file + dataUrl: string; + fetchDataUrl: string; + addDataUrl: string; + editDataUrl: string; + removeDataUrl: string; + exportDataUrl: string; +}; diff --git a/io.sc.platform.core.frontend/src/platform/components/radio/WExtRadio.vue b/io.sc.platform.core.frontend/src/platform/components/radio/WExtRadio.vue index a852e92a..e4f4452e 100644 --- a/io.sc.platform.core.frontend/src/platform/components/radio/WExtRadio.vue +++ b/io.sc.platform.core.frontend/src/platform/components/radio/WExtRadio.vue @@ -6,14 +6,7 @@
@@ -66,7 +59,7 @@ interface FieldProps extends FormFieldProps { selectedLabelColor?: string; hideOptions?: boolean; // 隐藏选项 lightNotHideOptionsLabel?: boolean; // 高亮非隐藏选项的label - onExpand?: (args: any) => void;// 展开与隐藏选项时触发的事件 + onExpand?: (args: any) => void; // 展开与隐藏选项时触发的事件 } const props = withDefaults(defineProps(), { showIf: true, @@ -127,7 +120,7 @@ const expandOptions = () => { form: props['form'], }); } -} +}; const lightLabelComputed = computed(() => { if (props.lightNotHideOptionsLabel && !props.hideOptions) { diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages.json b/io.sc.platform.core.frontend/src/platform/i18n/messages.json index a716946f..bdf40f14 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages.json @@ -19,6 +19,7 @@ "confirm": "Confirm", "expandSiderMenu": "Expand Sider Menu", "asyncTasks": "Async Tasks", + "cancelAsyncTasksTip": "Are you sure to cancel the task list?", "cleanAsyncTasksTip": "Are you sure to clean the task list?", "removeAsyncTaskTip": "Are you sure to remove the task?", "fullScreen": "Full Screen", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json index 2351524c..d56f7db8 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json @@ -19,6 +19,7 @@ "confirm": "確定", "expandSiderMenu": "展開邊欄菜單", "asyncTasks": "異步任務", + "cancelAsyncTasksTip": "您確定要取消該異步任務?", "cleanAsyncTasksTip": "您確定要清空異步任務列表?", "removeAsyncTaskTip": "您確定要刪除該異步任務?", "fullScreen": "全屏", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json index 4a790b6b..819695ee 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json @@ -19,6 +19,7 @@ "confirm": "确定", "expandSiderMenu": "展开边栏菜单", "asyncTasks": "异步任务", + "cancelAsyncTasksTip": "您确定要取消该异步任务?", "cleanAsyncTasksTip": "您确定要清空异步任务列表?", "removeAsyncTaskTip": "您确定要删除该异步任务?", "fullScreen": "全屏", diff --git a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/AsyncTaskDialog.vue b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/AsyncTaskDialog.vue index 7b06f740..6b90b033 100644 --- a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/AsyncTaskDialog.vue +++ b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/AsyncTaskDialog.vue @@ -14,14 +14,14 @@ - {{ $t('io.sc.platform.system.enums.TaskStatus.COMPLETED') }} + {{ $t('io.sc.platform.orm.task.TaskStatus.COMPLETED') }} - {{ $t('io.sc.platform.system.enums.TaskStatus.CANCELED') }} + {{ $t('io.sc.platform.orm.task.TaskStatus.CANCELED') }} - {{ $t('io.sc.platform.system.enums.TaskStatus.ERROR') + '!' }}
+ {{ $t('io.sc.platform.orm.task.TaskStatus.ERROR') + '!' }}
{{ task.exception ? $t('task.exception') : task.exceptionMessage }}
@@ -39,9 +39,11 @@ {{ $t('running') + ' : ' + (100 * task.currentWeight) / task.totalWeight + ' %' }}
- -
{{ task.name }}
-
+
{{ task.name }}
{{ task.message }}
@@ -55,7 +57,7 @@ {{ task.createDate }}
- + {{ $t('cancel') }} @@ -93,6 +95,14 @@ const onHide = () => { removeInterval(); }; +const cancel = (task) => { + DialogManager.confirm($t('cancelAsyncTasksTip'), () => { + axios.post(Environment.apiContextPath('/api/system/task/cancelAsyncTask/' + task.id)).then((response) => { + refresh(); + }); + }); +}; + const clean = () => { DialogManager.confirm($t('cleanAsyncTasksTip'), () => { axios.post(Environment.apiContextPath('/api/system/task/cleanMyAsyncTaskList')).then((response) => { @@ -110,7 +120,6 @@ const remove = (task) => { }; const refresh = () => { - console.log('refresh'); axios.get(Environment.apiContextPath('/api/system/task?page=1&size=10&pageable=true&sortBy=-createDate')).then((response) => { tasksRef.value = response.data.content; }); diff --git a/io.sc.platform.core.frontend/src/views/testcase/excel/Excel copy.vue b/io.sc.platform.core.frontend/src/views/testcase/excel/Excel copy.vue new file mode 100644 index 00000000..d1b80251 --- /dev/null +++ b/io.sc.platform.core.frontend/src/views/testcase/excel/Excel copy.vue @@ -0,0 +1,92 @@ + + diff --git a/io.sc.platform.core.frontend/src/views/testcase/excel/Excel.vue b/io.sc.platform.core.frontend/src/views/testcase/excel/Excel.vue index d1b80251..6e7bf304 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/excel/Excel.vue +++ b/io.sc.platform.core.frontend/src/views/testcase/excel/Excel.vue @@ -2,91 +2,30 @@
diff --git a/io.sc.platform.core.frontend/src/views/testcase/form/form.vue b/io.sc.platform.core.frontend/src/views/testcase/form/form.vue index f0e34b14..a793640d 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/form/form.vue +++ b/io.sc.platform.core.frontend/src/views/testcase/form/form.vue @@ -77,7 +77,6 @@ import { ref } from 'vue'; import { Environment, SessionManager, axios, Options, Formater, EnumTools } from '@/platform'; import SelectUserGrid from './shared/SelectUserGrid.vue'; import SelectMenuTreeGrid from './shared/SelectMenuTreeGrid.vue'; -import { onMounted } from 'vue'; const userGridRef = ref(); diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 13068fb3..49ddf4a5 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/io.sc.platform.core.frontend/template-project/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.126", + "version": "8.2.127", "description": "前端核心包,用于快速构建前端的脚手架", "private": false, "keywords": [], @@ -111,7 +111,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.6", "pinia": "2.3.0", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.core.frontend/template-project/public/configure.js b/io.sc.platform.core.frontend/template-project/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.core.frontend/template-project/public/configure.js +++ b/io.sc.platform.core.frontend/template-project/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel copy.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel copy.vue new file mode 100644 index 00000000..d1b80251 --- /dev/null +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel copy.vue @@ -0,0 +1,92 @@ + + diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel.vue index d1b80251..6e7bf304 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/excel/Excel.vue @@ -2,91 +2,30 @@
diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue index f0e34b14..a793640d 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/form/form.vue @@ -77,7 +77,6 @@ import { ref } from 'vue'; import { Environment, SessionManager, axios, Options, Formater, EnumTools } from '@/platform'; import SelectUserGrid from './shared/SelectUserGrid.vue'; import SelectMenuTreeGrid from './shared/SelectMenuTreeGrid.vue'; -import { onMounted } from 'vue'; const userGridRef = ref(); diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/autoconfigure/AsyncExecutorAutoConfiguration.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/autoconfigure/AsyncExecutorAutoConfiguration.java index 04a9e117..07d5bb0a 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/autoconfigure/AsyncExecutorAutoConfiguration.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/autoconfigure/AsyncExecutorAutoConfiguration.java @@ -37,18 +37,18 @@ public class AsyncExecutorAutoConfiguration implements AsyncConfigurer { } } - @Bean - @ConditionalOnMissingBean - @Override - public Executor getAsyncExecutor() { - executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); - executor.setMaxPoolSize(20); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setThreadNamePrefix("Platform-AsyncExecutor-"); - executor.initialize(); - return executor; - } +// @Bean +// @ConditionalOnMissingBean +// @Override +// public Executor getAsyncExecutor() { +// executor = new ThreadPoolTaskExecutor(); +// executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); +// executor.setMaxPoolSize(20); +// executor.setWaitForTasksToCompleteOnShutdown(true); +// executor.setThreadNamePrefix("Platform-AsyncExecutor-"); +// executor.initialize(); +// return executor; +// } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { diff --git a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json index 7cbf1785..b1765f50 100644 --- a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json +++ b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json @@ -66,5 +66,23 @@ "server.error.include-message = always", "server.error.include-stacktrace = always" ] + }, + + { + "module" : "io.sc.platform.core", + "order": 400, + "description": "Configuration properties for task execution", + "properties": [ + "spring.task.execution.threadNamePrefix = async-task-", + + "spring.task.execution.pool.coreSize = 4", + "spring.task.execution.pool.maxSize = 20", + "spring.task.execution.pool.queueCapacity = 10", + "spring.task.execution.pool.allowCoreThreadTimeout = true", + "spring.task.execution.pool.keepAlive = 60s", + + "spring.task.execution.shutdown.awaitTermination = false", + "spring.task.execution.shutdown.awaitTerminationPeriod = 10s" + ] } ] \ No newline at end of file diff --git a/io.sc.platform.developer.doc/package.json b/io.sc.platform.developer.doc/package.json index cd263860..ae233086 100644 --- a/io.sc.platform.developer.doc/package.json +++ b/io.sc.platform.developer.doc/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.doc", - "version": "8.2.33", + "version": "8.2.34", "description": "", "main": "index.js", "scripts": { @@ -28,7 +28,7 @@ "vuepress": "2.0.0-rc.15" }, "dependencies": { - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "vue": "3.5.13", "vue-i18n": "11.0.1" diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index 29b95ed6..6aaeaf1a 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.developer.frontend/public/configure.js b/io.sc.platform.developer.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.developer.frontend/public/configure.js +++ b/io.sc.platform.developer.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index a1bc4872..dc8f364b 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.lcdp.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.lcdp.frontend/public/configure.js b/io.sc.platform.lcdp.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.lcdp.frontend/public/configure.js +++ b/io.sc.platform.lcdp.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.license.keygen.frontend/package.json b/io.sc.platform.license.keygen.frontend/package.json index 9e73ec08..abc81b05 100644 --- a/io.sc.platform.license.keygen.frontend/package.json +++ b/io.sc.platform.license.keygen.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.license.keygen.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.license.keygen.frontend/public/configure.js b/io.sc.platform.license.keygen.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.license.keygen.frontend/public/configure.js +++ b/io.sc.platform.license.keygen.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.mvc.frontend/package.json b/io.sc.platform.mvc.frontend/package.json index 77f9e1ea..3b80b089 100644 --- a/io.sc.platform.mvc.frontend/package.json +++ b/io.sc.platform.mvc.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.mvc.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.mvc.frontend/public/configure.js b/io.sc.platform.mvc.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.mvc.frontend/public/configure.js +++ b/io.sc.platform.mvc.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java index 724e9987..36664e3d 100644 --- a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java @@ -24,8 +24,6 @@ import java.util.stream.Stream; public interface DaoService>{ public R getRepository(); public DaoExceptionProvider getExceptionProvider(); - public StorageService getStorageService(); - public TaskService getTaskService(); public E findById(ID id); public E findByUniqueKey(E entity); @@ -70,8 +68,5 @@ public interface DaoService stream(Specification specification, Sort sort) throws Exception; public DataExportTemplateConfigure getExportTemplateConfigure(); - public byte[] getTemplateBytes(DataExportTemplateConfigure configure) throws IOException; public Task export(QueryParameter queryParameter, String exportResourceName) throws Exception; - - public long getSynchronousExportMaxCount(); } diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/impl/DaoServiceImpl.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/impl/DaoServiceImpl.java index a5ce24d6..0cdc1c02 100644 --- a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/impl/DaoServiceImpl.java +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/impl/DaoServiceImpl.java @@ -9,27 +9,19 @@ import io.sc.platform.orm.entity.support.JpaEntityPersistentEventType; import io.sc.platform.orm.repository.DaoRepository; import io.sc.platform.orm.service.DaoService; import io.sc.platform.orm.service.DesensitizerAuthorizerService; -import io.sc.platform.orm.service.JxlsTemplateService; import io.sc.platform.orm.service.support.*; import io.sc.platform.orm.service.support.criteria.Criteria; import io.sc.platform.orm.service.support.criteria.impl.Equals; import io.sc.platform.orm.service.support.criteria.impl.IContains; import io.sc.platform.orm.service.support.criteria.impl.IsNull; -import io.sc.platform.orm.storage.service.StorageService; import io.sc.platform.orm.task.ExportTask; import io.sc.platform.orm.task.Task; -import io.sc.platform.orm.task.TaskExecuteMode; -import io.sc.platform.orm.task.TaskType; -import io.sc.platform.orm.task.service.TaskService; +import io.sc.platform.orm.task.TaskBuilder; +import io.sc.platform.orm.task.thread.ExportTaskThread; import io.sc.platform.security.util.SecurityUtil; -import io.sc.platform.util.ByteUtil; -import org.jxls.common.Context; -import org.jxls.util.JxlsHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.core.convert.ConversionService; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -37,14 +29,13 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.repository.core.EntityInformation; import org.springframework.data.repository.support.Repositories; import org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.persistence.criteria.Predicate; import javax.persistence.metamodel.PluralAttribute; import javax.persistence.metamodel.SingularAttribute; -import java.io.*; +import java.io.Serializable; import java.lang.reflect.Modifier; import java.util.*; import java.util.function.Consumer; @@ -57,10 +48,6 @@ public abstract class DaoServiceImpl exceptionProvider =getExceptionProvider(); @Override @@ -73,16 +60,6 @@ public abstract class DaoServiceImpl(){}; } - @Override - public StorageService getStorageService() { - return storageService; - } - - @Override - public TaskService getTaskService() { - return taskService; - } - @Override @Transactional public E findById(ID id) { @@ -662,50 +639,20 @@ public abstract class DaoServiceImpl> list =jdbcTemplate.queryForList("select ID_ from SYS_TASK where CREATOR_=? and NAME_=? and STATUS_='STARTED'",SecurityUtil.getLoginName(),task.getName()); + if(list!=null && !list.isEmpty()){ + throw new AsyncTaskAllreadyExistsException(); + } + String id =UUID.randomUUID().toString(); + task.setId(id); + task.setCreateDate(new Date()); + String taskSql ="insert into SYS_TASK(ID_,NAME_,TYPE_,EXECUTE_MODE_,STATUS_,CREATOR_,CREATE_DATE_,TOTAL_WEIGHT_,CURRENT_WEIGHT_,MESSAGE_) values(?,?,?,?,?,?,?,?,?,?)"; String exportTaskSql ="insert into SYS_TASK(ID_,NAME_,TYPE_,EXECUTE_MODE_,STATUS_,CREATOR_,CREATE_DATE_,TOTAL_WEIGHT_,CURRENT_WEIGHT_,MESSAGE_,EXPORT_RESOURCE_NAME_,EXPORT_RESOURCE_URL_) values(?,?,?,?,?,?,?,?,?,?,?,?)"; + Date now =new Date(); if(TaskType.EXPORT.equals(task.getType())){ ExportTask exportTask =(ExportTask)task; jdbcTemplate.update(exportTaskSql, @@ -34,9 +46,9 @@ public class TaskServiceImpl implements TaskService { task.getExecuteMode().name(), TaskStatus.STARTED.name(), SecurityUtil.getLoginName(), - new Date(), - task.getTotalWeight(), - task.getCurrentWeight(), + now, + 100, + 1, task.getMessage(), exportTask.getExportResourceName(), exportTask.getExportResourceUrl() @@ -49,29 +61,35 @@ public class TaskServiceImpl implements TaskService { task.getExecuteMode().name(), TaskStatus.STARTED.name(), SecurityUtil.getLoginName(), - new Date(),task.getTotalWeight(), - task.getCurrentWeight(), + now, + 100, + 1, task.getMessage() ); } - return id; + + return task; } @Override @Transactional - public void changeStatus(String taskId, TaskStatus status) { - jdbcTemplate.update("update SYS_TASK set STATUS_=? where ID_=?",status.name(),taskId); + public void setTotalWeight(String taskId, long totalWeight) { + jdbcTemplate.update("update SYS_TASK set TOTAL_WEIGHT_=? where ID_=?",totalWeight,taskId); } @Override @Transactional - public void changeCurrentWeight(String taskId, long currentWeight) { - jdbcTemplate.update("update SYS_TASK set CURRENT_WEIGHT_=? where ID_=?",currentWeight,taskId); + public void setCurrentWeight(String taskId, long currentWeight,String message) { + if(StringUtils.hasText(message)) { + jdbcTemplate.update("update SYS_TASK set CURRENT_WEIGHT_=?, MESSAGE_=? where ID_=?", currentWeight, message,taskId); + }else{ + jdbcTemplate.update("update SYS_TASK set CURRENT_WEIGHT_=? where ID_=?", currentWeight, taskId); + } } @Override @Transactional - public void changeMessage(String taskId, String message) { + public void setMessage(String taskId, String message) { jdbcTemplate.update("update SYS_TASK set MESSAGE_=? where ID_=?",message,taskId); } diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java new file mode 100644 index 00000000..1177c752 --- /dev/null +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/ExportTaskThread.java @@ -0,0 +1,93 @@ +package io.sc.platform.orm.task.thread; + +import io.sc.platform.orm.service.DaoService; +import io.sc.platform.orm.service.support.QueryParameter; +import io.sc.platform.orm.storage.service.StorageService; +import io.sc.platform.orm.task.ExportTask; +import io.sc.platform.orm.task.Task; +import io.sc.platform.orm.task.exception.JxlsTemplateNotFoundException; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.jxls.common.Context; +import org.jxls.util.JxlsHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; + +public class ExportTaskThread extends TaskThread { + private static final Logger log = LoggerFactory.getLogger(ExportTaskThread.class); + private long totalRowCount =0; + + public ExportTaskThread(Task task) { + super(task); + if(!(task instanceof ExportTask)) { + throw new IllegalArgumentException("task must been a ExportTask instance"); + } + } + + @Override + boolean isAsyncExeucte() { + DaoService daoService =(DaoService)getContextObject("daoService"); + QueryParameter queryParameter =(QueryParameter)getContextObject("queryParameter"); + try { + totalRowCount = daoService.count(queryParameter); + return totalRowCount>getSynchronousExportMaxCount(); + } catch (Exception e) { + log.error("",e); + return false; + } + } + + @Override + public void run() { + DaoService daoService =(DaoService)getContextObject("daoService"); + QueryParameter queryParameter =(QueryParameter)getContextObject("queryParameter"); + ExportTask task =(ExportTask)this.task; + + setTotalWeight(totalRowCount);//设置进度条总量 + setCurrentWeight(1, "Query Database ......");//启动时设置当前进度 + try { + //获取模版 + byte[] templateBytes = getTemplateBytes(task.getTemplateConfigure()); + if(templateBytes==null){ + //未找到 jxls 模版错误 + error(JxlsTemplateNotFoundException.class.getName(),null,null); + return; + } + + //查询数据 + Context context = new Context(); + context.putVar("list", daoService.list(queryParameter)); + + //查询完毕后设置进度为 1/2 + setCurrentWeight(totalRowCount/2,"Generate Excel ......"); + + //导出 Excel 文件 + String outputFilePath = task.getOutputPath(); + try ( + InputStream inputStream = new ByteArrayInputStream(templateBytes); + FileOutputStream outputStream = new FileOutputStream(outputFilePath); + ) { + JxlsHelper.getInstance().setEvaluateFormulas(true).processTemplate(inputStream, outputStream, context); + } + + //查询完毕后设置进度为 1/2 + setCurrentWeight((long)(totalRowCount/1.1), "Save Excel ......"); + + //存储到存储服务中 + StorageService storageService =getSpringBean(StorageService.class); + storageService.add(outputFilePath, outputFilePath); + + sleep(10000); + + //完成 + complete(); + } catch (Exception e) { + //发生错误 + error(e.getClass().getName(),e.getMessage(), ExceptionUtils.getStackTrace(e)); + throw new RuntimeException(e); + } + } +} diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java new file mode 100644 index 00000000..01c82195 --- /dev/null +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/task/thread/TaskThread.java @@ -0,0 +1,147 @@ +package io.sc.platform.orm.task.thread; + +import io.sc.platform.core.Environment; +import io.sc.platform.orm.service.JxlsTemplateService; +import io.sc.platform.orm.service.support.DataExportTemplateConfigure; +import io.sc.platform.orm.service.support.JxlsTemplate; +import io.sc.platform.orm.task.Task; +import io.sc.platform.orm.task.TaskExecuteMode; +import io.sc.platform.orm.task.service.TaskService; +import io.sc.platform.util.ByteUtil; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executor; + +public abstract class TaskThread extends Thread { + protected Task task; + protected Map context =new HashMap<>(); + + public TaskThread(Task task){ + this.task =task; + } + + public void addContextObject(String name,Object value){ + context.put(name,value); + } + + abstract boolean isAsyncExeucte(); + + + public Task execute(){ + if(isAsyncExeucte()){ + TaskService taskService = getSpringBean(TaskService.class); + task.setExecuteMode(TaskExecuteMode.ASYNCHRONOUS); + Task _task =taskService.create(task); + Executor executor =getSpringBean(Executor.class); + executor.execute(this); + return _task; + }else{ + run(); + return this.task; + } + } + + @Override + public void run() { + + } + + protected Object getContextObject(String name){ + return context.get(name); + } + + protected void setTotalWeight(long totalWeight){ + TaskService taskService =getSpringBean(TaskService.class); + taskService.setTotalWeight(task.getId(),totalWeight); + } + + protected void setCurrentWeight(long currentWeight,String message){ + TaskService taskService =getSpringBean(TaskService.class); + taskService.setCurrentWeight(task.getId(),currentWeight,message); + } + + protected void setMessage(String message){ + TaskService taskService =getSpringBean(TaskService.class); + taskService.setMessage(task.getId(),message); + } + + protected void error(String exception,String exceptionMessage,String exceptionStackTrace){ + TaskService taskService =getSpringBean(TaskService.class); + taskService.error(task.getId(),exception,exceptionMessage,exceptionStackTrace); + } + + protected void complete(){ + TaskService taskService =getSpringBean(TaskService.class); + taskService.complete(task.getId()); + } + + protected boolean isCanceled(){ + TaskService taskService =getSpringBean(TaskService.class); + return taskService.isCanceled(task.getId()); + } + + protected long getSynchronousExportMaxCount() { + JdbcTemplate jdbcTemplate =getSpringBean(JdbcTemplate.class); + Map row =jdbcTemplate.queryForMap("select VALUE_ from SYS_PARAMETER where CODE_=?","parameter.orm.exportExcel.synchronousExportMaxCount"); + if(row==null || row.isEmpty()){ + return 1000; + } + return Long.parseLong(row.get("VALUE_").toString()); + } + + /** + * 获取导出JXLS模版 + * @param configure 模版配置 + * @return 模版 + * @throws IOException 违例 + */ + protected byte[] getTemplateBytes(DataExportTemplateConfigure configure) throws IOException { + if(configure==null){ + return null; + } + + JxlsTemplateService jxlsTemplateService =getSpringBean(JxlsTemplateService.class); + // 先查找 JXLS 模版中匹配的 code 的模版 + String templateCode =configure.getJxlsTemplateCode(); + if(StringUtils.hasText(templateCode)) { + JxlsTemplate template =jxlsTemplateService.findTemplateByCode(templateCode); + if(template!=null){ + return template.getBytes(); + } + } + + // 再查找 JXLS 模版中匹配的实体类名的模版 + String templateJpaEntityClass =configure.getJxlsTemplateJpaEntityClass(); + if(StringUtils.hasText(templateJpaEntityClass)) { + JxlsTemplate template =jxlsTemplateService.findTemplateByJpaEntityClass(templateJpaEntityClass); + if(template!=null){ + return template.getBytes(); + } + } + + // 最后查找预定义的模版类路径 + String templateClassPath =configure.getJxlsTemplateClassPath(); + if(StringUtils.hasText(templateClassPath)) { + Resource resource = new DefaultResourceLoader().getResource("classpath:/" + templateClassPath); + if (resource != null && resource.exists()) { + try (InputStream inputStream = resource.getInputStream();) { + return ByteUtil.read(inputStream); + } + } + } + return null; + } + + protected T getSpringBean(Class clazz){ + ApplicationContext applicationContext =Environment.getInstance().getApplicationContext(); + return applicationContext.getBean(clazz); + } +} diff --git a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task.properties b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task.properties index 673e2520..f24e6534 100644 --- a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task.properties +++ b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task.properties @@ -6,4 +6,7 @@ io.sc.platform.orm.task.TaskExecuteMode.ASYNCHRONOUS=Asynchronous io.sc.platform.orm.task.TaskStatus.STARTED=Started io.sc.platform.orm.task.TaskStatus.COMPLETED=Completed io.sc.platform.orm.task.TaskStatus.CANCELED=Canceled -io.sc.platform.orm.task.TaskStatus.ERROR=Error Occur \ No newline at end of file +io.sc.platform.orm.task.TaskStatus.ERROR=Error Occur + +io.sc.platform.orm.task.exception.AsyncTaskAllreadyExistsException=Asynchronous task allready exists and running! +io.sc.platform.orm.task.exception.JxlsTemplateNotFoundException=Excel template NOT exists! \ No newline at end of file diff --git a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_tw_CN.properties b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_tw_CN.properties index cb733748..23da0199 100644 --- a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_tw_CN.properties +++ b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_tw_CN.properties @@ -6,4 +6,7 @@ io.sc.platform.orm.task.TaskExecuteMode.ASYNCHRONOUS=\u7570\u6B65 io.sc.platform.orm.task.TaskStatus.STARTED=\u5DF2\u555F\u52D5 io.sc.platform.orm.task.TaskStatus.COMPLETED=\u5DF2\u5B8C\u6210 io.sc.platform.orm.task.TaskStatus.CANCELED=\u5DF2\u53D6\u6D88 -io.sc.platform.orm.task.TaskStatus.ERROR=\u767C\u751F\u932F\u8AA4 \ No newline at end of file +io.sc.platform.orm.task.TaskStatus.ERROR=\u767C\u751F\u932F\u8AA4 + +io.sc.platform.orm.task.exception.AsyncTaskAllreadyExistsException=\u7570\u6B65\u4EFB\u52D9\u6B63\u5728\u57F7\u884C\u4E2D! +io.sc.platform.orm.task.exception.JxlsTemplateNotFoundException=Excel \u6A21\u7248\u4E0D\u5B58\u5728! \ No newline at end of file diff --git a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_zh_CN.properties b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_zh_CN.properties index b9cf235c..73c95361 100644 --- a/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_zh_CN.properties +++ b/io.sc.platform.orm/src/main/resources/io/sc/platform/orm/task/i18n/task_zh_CN.properties @@ -6,4 +6,7 @@ io.sc.platform.orm.task.TaskExecuteMode.ASYNCHRONOUS=\u5F02\u6B65 io.sc.platform.orm.task.TaskStatus.STARTED=\u5DF2\u542F\u52A8 io.sc.platform.orm.task.TaskStatus.COMPLETED=\u5DF2\u5B8C\u6210 io.sc.platform.orm.task.TaskStatus.CANCELED=\u5DF2\u53D6\u6D88 -io.sc.platform.orm.task.TaskStatus.ERROR=\u53D1\u751F\u9519\u8BEF \ No newline at end of file +io.sc.platform.orm.task.TaskStatus.ERROR=\u53D1\u751F\u9519\u8BEF + +io.sc.platform.orm.task.exception.AsyncTaskAllreadyExistsException=\u5F02\u6B65\u4EFB\u52A1\u6B63\u5728\u6267\u884C\u4E2D! +io.sc.platform.orm.task.exception.JxlsTemplateNotFoundException=Excel \u6A21\u7248\u4E0D\u5B58\u5728! \ No newline at end of file diff --git a/io.sc.platform.poi/build.gradle b/io.sc.platform.poi/build.gradle index 181f82d9..9f786592 100644 --- a/io.sc.platform.poi/build.gradle +++ b/io.sc.platform.poi/build.gradle @@ -8,5 +8,7 @@ dependencies { "org.jxls:jxls:${jxls_version}", "org.jxls:jxls-poi:${jxls_version}", "org.apache.commons:commons-jexl3:${commons_jexl3_version}", + + "com.deepoove:poi-tl:${poi_tl_version}", ) } diff --git a/io.sc.platform.poi/src/test/java/WordTest.java b/io.sc.platform.poi/src/test/java/WordTest.java new file mode 100644 index 00000000..77cc493d --- /dev/null +++ b/io.sc.platform.poi/src/test/java/WordTest.java @@ -0,0 +1,19 @@ +import com.deepoove.poi.XWPFTemplate; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class WordTest { + public static void main(String[] args) throws IOException { + Map context =new HashMap<>(); + context.put("title", "Hi, poi-tl Word模板引擎"); + context.put("date", new Date()); + + XWPFTemplate template = XWPFTemplate.compile("/Users/wangshaoping/Desktop/test/template.docx").render(context); + template.writeAndClose(new FileOutputStream("/Users/wangshaoping/Desktop/test/out.docx")); + } +} diff --git a/io.sc.platform.scheduler.manager.frontend/package.json b/io.sc.platform.scheduler.manager.frontend/package.json index 8a2cf8cb..bb2759fe 100644 --- a/io.sc.platform.scheduler.manager.frontend/package.json +++ b/io.sc.platform.scheduler.manager.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.scheduler.manager.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.scheduler.manager.frontend/public/configure.js b/io.sc.platform.scheduler.manager.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.scheduler.manager.frontend/public/configure.js +++ b/io.sc.platform.scheduler.manager.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index 6ecb0986..8e2482fc 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/io.sc.platform.system.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.system.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -112,7 +111,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.6", "pinia": "2.3.0", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.system.frontend/public/configure.js b/io.sc.platform.system.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.platform.system.frontend/public/configure.js +++ b/io.sc.platform.system.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/initializer/ParameterInitializer.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/initializer/ParameterInitializer.java index 8e0f5358..15e7635f 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/initializer/ParameterInitializer.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/initializer/ParameterInitializer.java @@ -47,15 +47,23 @@ public class ParameterInitializer implements ApplicationInitializer { } List needAddedParameters =getNeedAddedParameters(); try { + // 先插入实体 for(Parameter item : needAddedParameters){ ParameterEntity entity =new ParameterEntity(); entity.setCode(StringUtils.hasText(item.getCode())?item.getCode():item.getId()); entity.setValue(item.getDefaultValue()); entity.setOrder(item.getOrder()); - entity.setParent(cache.get(item.getParentId())); ParameterEntity added =parameterService.add(entity); cache.put(added.getCode(),added); } + // 再设置父子关系 + for(Parameter item : needAddedParameters){ + ParameterEntity entity =cache.get(item.getId()); + if(entity.getParent()==null && StringUtils.hasText(item.getParentId())){ + entity.setParent(cache.get(item.getParentId())); + parameterService.update(entity.getId(),entity); + } + } } catch (Exception e) { throw new ApplicationInitializerExecuteException(e); } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/task/controller/TaskWebController.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/task/controller/TaskWebController.java index a009bb1d..48b32bae 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/task/controller/TaskWebController.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/task/controller/TaskWebController.java @@ -22,4 +22,9 @@ public class TaskWebController extends RestCrudController { public void cleanMyAsyncTaskList(); public void removeAsyncTask(String taskId); + public void cancelAsyncTask(String taskId); + } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/task/service/impl/TaskServiceImpl.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/task/service/impl/TaskServiceImpl.java index e0578f40..1bce42ea 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/task/service/impl/TaskServiceImpl.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/task/service/impl/TaskServiceImpl.java @@ -11,6 +11,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.util.Date; + @Service("io.sc.platform.system.task.service.impl.TaskServiceImpl") public class TaskServiceImpl extends DaoServiceImpl implements TaskService { @Autowired private JdbcTemplate jdbcTemplate; @@ -29,4 +31,12 @@ public class TaskServiceImpl extends DaoServiceImpl'STARTED' and ID_=?", taskId); } + + @Override + public void cancelAsyncTask(String taskId) { + if(!StringUtils.hasText(taskId)){ + return; + } + jdbcTemplate.update("update SYS_TASK set STATUS_='CANCELED', CANCELED_DATE_=? where ID_=?", new Date(),taskId); + } } diff --git a/io.sc.standard.frontend/package.json b/io.sc.standard.frontend/package.json index 03153f45..ce868a97 100644 --- a/io.sc.standard.frontend/package.json +++ b/io.sc.standard.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.standard.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -113,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.standard.frontend/public/configure.js b/io.sc.standard.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/io.sc.standard.frontend/public/configure.js +++ b/io.sc.standard.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin', diff --git a/io.sc.website/package.json b/io.sc.website/package.json index 909539e3..f0e6da6e 100644 --- a/io.sc.website/package.json +++ b/io.sc.website/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.website", - "version": "8.2.33", + "version": "8.2.34", "description": "", "main": "index.js", "scripts": { @@ -28,6 +28,6 @@ }, "dependencies": { "vue": "3.5.13", - "platform-core": "8.2.126" + "platform-core": "8.2.127" } } \ No newline at end of file diff --git a/wra.report.frontend/package.json b/wra.report.frontend/package.json index 580b8fb0..8f71981e 100644 --- a/wra.report.frontend/package.json +++ b/wra.report.frontend/package.json @@ -1,6 +1,6 @@ { "name": "wra.report.frontend", - "version": "8.2.33", + "version": "8.2.34", "description": "", "private": false, "keywords": [], @@ -102,7 +102,6 @@ "@univerjs/ui": "0.5.4", "@vueuse/core": "12.4.0", "axios": "1.8.2", - "bpmn-js": "18.6.2", "codemirror": "6.0.1", "dayjs": "1.11.13", "echarts": "5.6.0", @@ -112,7 +111,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.6", "pinia": "2.3.0", - "platform-core": "8.2.126", + "platform-core": "8.2.127", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/wra.report.frontend/public/configure.js b/wra.report.frontend/public/configure.js index 292827c6..6428ab6f 100644 --- a/wra.report.frontend/public/configure.js +++ b/wra.report.frontend/public/configure.js @@ -37,7 +37,7 @@ window.APP.configure = { // axios 配置 axios: { baseURL: '', - timeout: 1000 * 60, + timeout: 1000 * 60 * 5, crossdomain: true, basicAuth: { username: 'admin',