Browse Source

update

main
wangshaoping 6 months ago
parent
commit
4dabbc5147
  1. 4
      build.gradle
  2. 4
      erm.frontend/package.json
  3. 47
      erm.frontend/util-components-generator.cjs
  4. 15
      erm.frontend/webpack.config.common.cjs
  5. 2
      erm/src/main/java/erm/kpi/service/impl/LibServiceImpl.java
  6. 2
      gradle.properties
  7. 4
      io.sc.engine.mv.frontend/package.json
  8. 47
      io.sc.engine.mv.frontend/util-components-generator.cjs
  9. 15
      io.sc.engine.mv.frontend/webpack.config.common.cjs
  10. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/CoeBinomialHistoryWebController.java
  11. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/CoeChiSquareHistoryWebController.java
  12. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/GeneralSampleHistoryWebController.java
  13. 1
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScCapHistoryWebController.java
  14. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScKsHistoryWebController.java
  15. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScRocHistoryWebController.java
  16. 3
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/StPsiHistoryWebController.java
  17. 2
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java
  18. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/JacksonObjectMapper.java
  19. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ObjectUtil.java
  20. 4
      io.sc.engine.rule.frontend/package.json
  21. 2
      io.sc.engine.rule.frontend/src/menus/menus.json
  22. 1
      io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue
  23. 1
      io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue
  24. 1
      io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
  25. 1
      io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
  26. 1
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  27. 1
      io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue
  28. 1
      io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue
  29. 47
      io.sc.engine.rule.frontend/util-components-generator.cjs
  30. 15
      io.sc.engine.rule.frontend/webpack.config.common.cjs
  31. 28
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java
  32. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/service/impl/DictionaryServiceImpl.java
  33. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/service/impl/EnumItemServiceImpl.java
  34. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/DictionaryEntityEventHandler.java
  35. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorEntityEventHandler.java
  36. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorProcessorEntityEventHandler.java
  37. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorValidatorEntityEventHandler.java
  38. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/LibEntityEventHandler.java
  39. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ModelEntityEventHandler.java
  40. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterEntityEventHandler.java
  41. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterProcessorEntityEventHandler.java
  42. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterValidatorEntityEventHandler.java
  43. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ScoreCardVarEntityEventHandler.java
  44. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/UserDefinedJavaClassFieldEntityEventHandler.java
  45. 6
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java
  46. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorServiceImpl.java
  47. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java
  48. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java
  49. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java
  50. 6
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java
  51. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  52. 4
      io.sc.engine.st.frontend/package.json
  53. 1
      io.sc.engine.st.frontend/src/views/DepFactor/DepFactorDefine.vue
  54. 1
      io.sc.engine.st.frontend/src/views/IndepFactor/IndepFactor.vue
  55. 1
      io.sc.engine.st.frontend/src/views/IndepFactor/IndepFactorDefine.vue
  56. 1
      io.sc.engine.st.frontend/src/views/Scenario/ScenarioFactorDefine.vue
  57. 47
      io.sc.engine.st.frontend/util-components-generator.cjs
  58. 15
      io.sc.engine.st.frontend/webpack.config.common.cjs
  59. 2
      io.sc.platform.core.frontend/package.json
  60. 70
      io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue
  61. 51
      io.sc.platform.core.frontend/src/platform/components/graph/base/PlatformGraph.ts
  62. 129
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangeRoleDialog.vue
  63. 6
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/Sider.vue
  64. 24
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue
  65. 2
      io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts
  66. 13
      io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts
  67. 4
      io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts
  68. 1
      io.sc.platform.core.frontend/src/platform/types/UserType.ts
  69. 25
      io.sc.platform.core.frontend/src/platform/views/LoginDialog.vue
  70. 4
      io.sc.platform.core.frontend/template-project/package.json
  71. 47
      io.sc.platform.core.frontend/template-project/util-components-generator.cjs
  72. 15
      io.sc.platform.core.frontend/template-project/webpack.config.common.cjs
  73. 47
      io.sc.platform.core.frontend/util-components-generator.cjs
  74. 15
      io.sc.platform.core.frontend/webpack.config.common.cjs
  75. 1
      io.sc.platform.core/src/main/java/io/sc/platform/core/Environment.java
  76. 2
      io.sc.platform.core/src/main/java/io/sc/platform/core/controller/EnumWebController.java
  77. 4
      io.sc.platform.developer.frontend/package.json
  78. 8
      io.sc.platform.developer.frontend/src/views/plugin/Menus.vue
  79. 47
      io.sc.platform.developer.frontend/util-components-generator.cjs
  80. 15
      io.sc.platform.developer.frontend/webpack.config.common.cjs
  81. 3
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java
  82. 4
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/AgentServiceImpl.java
  83. 16
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/FlowableModelerServiceImpl.java
  84. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessEntityServiceImpl.java
  85. 2
      io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml
  86. 4
      io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt
  87. 2
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties
  88. 4
      io.sc.platform.lcdp.frontend/package.json
  89. 47
      io.sc.platform.lcdp.frontend/util-components-generator.cjs
  90. 15
      io.sc.platform.lcdp.frontend/webpack.config.common.cjs
  91. 4
      io.sc.platform.mvc.frontend/package.json
  92. 47
      io.sc.platform.mvc.frontend/util-components-generator.cjs
  93. 15
      io.sc.platform.mvc.frontend/webpack.config.common.cjs
  94. 31
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java
  95. 3
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/support/FileDownloader.java
  96. 1
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/converter/types/DesensitizeStringWrapperTypeDescriptor.java
  97. 4
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/entity/DesensitizedEntity.java
  98. 3
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/repository/DaoRepository.java
  99. 94
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/repository/impl/DaoRepositoryImpl.java
  100. 2
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java

4
build.gradle

@ -150,8 +150,8 @@ subprojects {
} }
clean { clean {
delete 'dist' // //delete 'dist' //
delete 'bin' // eclipse bin //delete 'bin' // eclipse bin
delete 'build' // gradle delete 'build' // gradle
} }

4
erm.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "erm.frontend", "name": "erm.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

47
erm.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
erm.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

2
erm/src/main/java/erm/kpi/service/impl/LibServiceImpl.java

@ -86,7 +86,7 @@ public class LibServiceImpl extends DaoServiceImpl<LibEntity, String, LibReposit
public void addAllIndicators(final String libId) throws Exception { public void addAllIndicators(final String libId) throws Exception {
if(StringUtils.hasText(libId)){ if(StringUtils.hasText(libId)){
removeAllIndicators(libId); removeAllIndicators(libId);
LibEntity Lib =repository.getOne(libId); LibEntity Lib =this.findById(libId);
if(Lib!=null){ if(Lib!=null){
final SqlBatcher sqlBatcher =new SqlBatcher("insert into RP_INDICATOR_LIB(INDICATOR_ID_,LIB_ID_) values(?,?)"); final SqlBatcher sqlBatcher =new SqlBatcher("insert into RP_INDICATOR_LIB(INDICATOR_ID_,LIB_ID_) values(?,?)");
String query ="select ID_ from RP_INDICATOR"; String query ="select ID_ from RP_INDICATOR";

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.1.47 platform_version=8.1.47
platform_plugin_version=8.1.47 platform_plugin_version=8.1.47
platform_core_frontend_version=8.1.308 platform_core_frontend_version=8.1.312
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.mv.frontend", "name": "io.sc.engine.mv.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

47
io.sc.engine.mv.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.engine.mv.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/CoeBinomialHistoryWebController.java

@ -25,6 +25,7 @@ public class CoeBinomialHistoryWebController extends RestCrudController<CoeBinom
@Autowired private CoeBinomialHistoryRepository coeBinomialHistoryRepository; @Autowired private CoeBinomialHistoryRepository coeBinomialHistoryRepository;
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<CoeBinomialHistoryVo> data(HttpServletRequest request, public Page<CoeBinomialHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,
@ -32,7 +33,7 @@ public class CoeBinomialHistoryWebController extends RestCrudController<CoeBinom
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/CoeChiSquareHistoryWebController.java

@ -25,6 +25,7 @@ public class CoeChiSquareHistoryWebController extends RestCrudController<CoeChiS
@Autowired private CoeChiSquareHistoryRepository coeChiSquareHistoryRepository; @Autowired private CoeChiSquareHistoryRepository coeChiSquareHistoryRepository;
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<CoeChiSquareHistoryVo> data(HttpServletRequest request, public Page<CoeChiSquareHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,
@ -32,7 +33,7 @@ public class CoeChiSquareHistoryWebController extends RestCrudController<CoeChiS
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/GeneralSampleHistoryWebController.java

@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse;
*/ */
@RestController @RestController
@RequestMapping("/api/mv/viewer/sample") @RequestMapping("/api/mv/viewer/sample")
@SuppressWarnings("unchecked")
public class GeneralSampleHistoryWebController extends RestCrudController<GeneralSampleHistoryVo,GeneralSampleHistory, GeneralSampleHistoryId, GeneralSampleHistoryRepository, GeneralSampleHistoryService> { public class GeneralSampleHistoryWebController extends RestCrudController<GeneralSampleHistoryVo,GeneralSampleHistory, GeneralSampleHistoryId, GeneralSampleHistoryRepository, GeneralSampleHistoryService> {
@GetMapping("data") @GetMapping("data")
public Page<GeneralSampleHistoryVo> data(HttpServletRequest request, public Page<GeneralSampleHistoryVo> data(HttpServletRequest request,
@ -36,7 +37,7 @@ public class GeneralSampleHistoryWebController extends RestCrudController<Genera
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

1
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScCapHistoryWebController.java

@ -47,6 +47,7 @@ public class ScCapHistoryWebController extends RestCrudController<ScCapHistoryVo
@Autowired private MessageSource messageSource; @Autowired private MessageSource messageSource;
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<ScCapHistoryVo> data(HttpServletRequest request, public Page<ScCapHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScKsHistoryWebController.java

@ -45,6 +45,7 @@ public class ScKsHistoryWebController extends RestCrudController<ScKsHistoryVo,
@Autowired private MessageSource messageSource; @Autowired private MessageSource messageSource;
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<ScKsHistoryVo> data(HttpServletRequest request, public Page<ScKsHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,
@ -52,7 +53,7 @@ public class ScKsHistoryWebController extends RestCrudController<ScKsHistoryVo,
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/ScRocHistoryWebController.java

@ -44,6 +44,7 @@ public class ScRocHistoryWebController extends RestCrudController<ScRocHistoryVo
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<ScRocHistoryVo> data(HttpServletRequest request, public Page<ScRocHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,
@ -51,7 +52,7 @@ public class ScRocHistoryWebController extends RestCrudController<ScRocHistoryVo
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

3
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/controller/StPsiHistoryWebController.java

@ -43,6 +43,7 @@ public class StPsiHistoryWebController extends RestCrudController<StPsiHistoryVo
@Autowired private MessageSource messageSource; @Autowired private MessageSource messageSource;
@GetMapping("data") @GetMapping("data")
@SuppressWarnings("unchecked")
public Page<StPsiHistoryVo> data(HttpServletRequest request, public Page<StPsiHistoryVo> data(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@RequestParam("modelId") String modelId, @RequestParam("modelId") String modelId,
@ -50,7 +51,7 @@ public class StPsiHistoryWebController extends RestCrudController<StPsiHistoryVo
QueryParameter queryParameter QueryParameter queryParameter
) throws Exception { ) throws Exception {
if(!queryParameter.existsCriteria()){ if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder(); CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId), cb.equals("modelId",modelId),
cb.equals("validateDate",validateDate) cb.equals("validateDate",validateDate)

2
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java

@ -68,8 +68,8 @@ public class LocalLoaderImpl implements LocalLoader{
return null; return null;
} }
@SuppressWarnings("all")
@Override @Override
@SuppressWarnings("unchecked")
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception { public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception {
Object bean =applicationContext.getBean("reResourceService"); Object bean =applicationContext.getBean("reResourceService");
if(bean!=null) { if(bean!=null) {

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/JacksonObjectMapper.java

@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
public class JacksonObjectMapper { public class JacksonObjectMapper {
@SuppressWarnings("deprecation")
public static ObjectMapper getDefaultObjectMapper(){ public static ObjectMapper getDefaultObjectMapper(){
ObjectMapper result =new ObjectMapper(); ObjectMapper result =new ObjectMapper();
result.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); result.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ObjectUtil.java

@ -21,7 +21,7 @@ public class ObjectUtil {
* *
* @param <T> 泛型类型 * @param <T> 泛型类型
*/ */
@SuppressWarnings("all") @SuppressWarnings("unchecked")
public static <T> T clone(T obj) throws ClassNotFoundException,IOException{ public static <T> T clone(T obj) throws ClassNotFoundException,IOException{
T cloneObj = null; T cloneObj = null;
ObjectOutputStream oos = null; ObjectOutputStream oos = null;

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.rule.frontend", "name": "io.sc.engine.rule.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

2
io.sc.engine.rule.frontend/src/menus/menus.json

@ -30,7 +30,7 @@
/*/*/ /*/*/
{"type":"ROUTE", "order":500, "parentId":"menu.engine.rule", "id":"menu.engine.rule.lib", "titleI18nKey":"menu.engine.rule.lib", "icon":"bi-folder2", "routeName":"route.engine.rule.lib"}, {"type":"ROUTE", "order":500, "parentId":"menu.engine.rule", "id":"menu.engine.rule.lib", "titleI18nKey":"menu.engine.rule.lib", "icon":"bi-folder2", "routeName":"route.engine.rule.lib"},
/*/*/ /*/*/
{"type":"ROUTE", "order":600, "parentId":"menu.engine.rule", "id":"menu.engine.rule.function", "titleI18nKey":"menu.engine.rule.function", "icon":"bi-folder2", "routeName":"route.engine.rule.function"}, {"type":"ROUTE", "order":600, "parentId":"menu.engine.rule", "id":"menu.engine.rule.function", "titleI18nKey":"menu.engine.rule.function", "icon":"sym_o_function", "routeName":"route.engine.rule.function"},
/*/*/ /*/*/
{"type":"ROUTE", "order":700, "parentId":"menu.engine.rule", "id":"menu.engine.rule.testcase", "titleI18nKey":"menu.engine.rule.testcase", "icon":"bi-suitcase-lg", "routeName":"route.engine.rule.testcase"}, {"type":"ROUTE", "order":700, "parentId":"menu.engine.rule", "id":"menu.engine.rule.testcase", "titleI18nKey":"menu.engine.rule.testcase", "icon":"bi-suitcase-lg", "routeName":"route.engine.rule.testcase"},
/*/*/ /*/*/

1
io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.lib.tab.indicator.title')" :title="$t('re.lib.tab.indicator.title')"
:draggable="true"
dense dense
hide-bottom hide-bottom
db-click-operation="edit" db-click-operation="edit"

1
io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="treeGridRef" ref="treeGridRef"
:title="$t('re.lib.grid.title')" :title="$t('re.lib.grid.title')"
:draggable="true"
dense-body dense-body
hide-bottom hide-bottom
db-click-operation="edit" db-click-operation="edit"

1
io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.resources.designer.processor.grid.title')" :title="$t('re.resources.designer.processor.grid.title')"
:draggable="true"
dense dense
hide-bottom hide-bottom
db-click-operation="edit" db-click-operation="edit"

1
io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="treeGridRef" ref="treeGridRef"
:title="$t('re.resources.designer.model.grid.title')" :title="$t('re.resources.designer.model.grid.title')"
:draggable="true"
dense-body dense-body
class="px-1" class="px-1"
hide-bottom hide-bottom

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

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.resources.designer.parameter.grid.title')" :title="$t('re.resources.designer.parameter.grid.title')"
:draggable="true"
dense-body dense-body
class="px-1" class="px-1"
hide-bottom hide-bottom

1
io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue

@ -3,6 +3,7 @@
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.resources.designer.processor.grid.title')" :title="$t('re.resources.designer.processor.grid.title')"
:draggable="true"
dense-body dense-body
class="px-1" class="px-1"
hide-bottom hide-bottom

1
io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue

@ -2,6 +2,7 @@
<w-grid <w-grid
ref="gridRef" ref="gridRef"
:title="$t('re.resources.designer.validator.grid.title')" :title="$t('re.resources.designer.validator.grid.title')"
:draggable="true"
dense-body dense-body
class="px-1" class="px-1"
hide-bottom hide-bottom

47
io.sc.engine.rule.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.engine.rule.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

28
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java

@ -42,20 +42,20 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
@Autowired private MessageSource messageSource; @Autowired private MessageSource messageSource;
static { static {
valueTypeAndMessages.add(new KeyValue("java.lang.Boolean","java.lang.Boolean")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Boolean","java.lang.Boolean"));
valueTypeAndMessages.add(new KeyValue("java.lang.Long","java.lang.Long")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Long","java.lang.Long"));
valueTypeAndMessages.add(new KeyValue("java.lang.Float","java.lang.Float")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue("Float","java.lang.Float")); valueTypeAndMessages.add(new KeyValue<String,String>("Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue("java.math.BigDecimal","java.math.BigDecimal")); valueTypeAndMessages.add(new KeyValue<String,String>("java.math.BigDecimal","java.math.BigDecimal"));
valueTypeAndMessages.add(new KeyValue("java.lang.String","java.lang.String")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.String","java.lang.String"));
valueTypeAndMessages.add(new KeyValue("java.util.Date","java.util.Date")); valueTypeAndMessages.add(new KeyValue<String,String>("java.util.Date","java.util.Date"));
valueTypeAndMessages.add(new KeyValue("io.sc.engine.rule.core.classes.ResourceAbstract","io.sc.engine.rule.core.classes.ResourceAbstract")); valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.ResourceAbstract","io.sc.engine.rule.core.classes.ResourceAbstract"));
valueTypeAndMessages.add(new KeyValue("io.sc.engine.rule.core.classes.RuleResult","io.sc.engine.rule.core.classes.RuleResult")); valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.RuleResult","io.sc.engine.rule.core.classes.RuleResult"));
valueTypeAndMessages.add(new KeyValue("io.sc.engine.rule.core.classes.SingleRuleResult","io.sc.engine.rule.core.classes.SingleRuleResult")); valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.SingleRuleResult","io.sc.engine.rule.core.classes.SingleRuleResult"));
valueTypeAndMessages.add(new KeyValue("List","java.lang.List")); valueTypeAndMessages.add(new KeyValue<String,String>("List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue("java.lang.List","java.lang.List")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue("Map","java.lang.Map")); valueTypeAndMessages.add(new KeyValue<String,String>("Map","java.lang.Map"));
valueTypeAndMessages.add(new KeyValue("java.lang.Map","java.lang.Map")); valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Map","java.lang.Map"));
} }
@Override @Override

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/service/impl/DictionaryServiceImpl.java

@ -156,7 +156,7 @@ public class DictionaryServiceImpl extends DaoServiceImpl<DictionaryEntity, Stri
@Override @Override
public DictionaryEntity deepClone(String id) throws Exception { public DictionaryEntity deepClone(String id) throws Exception {
if(StringUtils.hasText(id)) { if(StringUtils.hasText(id)) {
DictionaryEntity entity =repository.getOne(id); DictionaryEntity entity =this.findById(id);
if(entity!=null) { if(entity!=null) {
DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone(); DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone();
cloneEntity.clearId(); cloneEntity.clearId();
@ -184,7 +184,7 @@ public class DictionaryServiceImpl extends DaoServiceImpl<DictionaryEntity, Stri
@Override @Override
public DictionaryEntity deepCloneNew(String id) throws Exception { public DictionaryEntity deepCloneNew(String id) throws Exception {
if(StringUtils.hasText(id)) { if(StringUtils.hasText(id)) {
DictionaryEntity entity =repository.getOne(id); DictionaryEntity entity =this.findById(id);
if(entity!=null) { if(entity!=null) {
DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone(); DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone();
cloneEntity.clearId(); cloneEntity.clearId();

11
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/service/impl/EnumItemServiceImpl.java

@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Optional;
@Service("reDictionaryOptionItemService") @Service("reDictionaryOptionItemService")
public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String, EnumItemRepository> implements EnumItemService{ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String, EnumItemRepository> implements EnumItemService{
@ -22,7 +23,9 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
throw exceptionProvider.getCreateNullObjectException(); throw exceptionProvider.getCreateNullObjectException();
} }
String dictionaryId =entity.getDictionary().getId(); String dictionaryId =entity.getDictionary().getId();
EnumDictionaryEntity dictionaryEntity =enumDictionaryRepository.getOne(dictionaryId); Optional<EnumDictionaryEntity> optional =enumDictionaryRepository.findById(dictionaryId);
if(optional.isPresent()){
EnumDictionaryEntity dictionaryEntity =optional.get();
if(dictionaryEntity!=null) { if(dictionaryEntity!=null) {
List<EnumItemEntity> items =dictionaryEntity.getItems(); List<EnumItemEntity> items =dictionaryEntity.getItems();
if(items!=null && items.size()>0) { if(items!=null && items.size()>0) {
@ -33,6 +36,7 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
} }
} }
} }
}
Integer nextOrder =repository.getNextOrder(entity.getDictionary().getId()); Integer nextOrder =repository.getNextOrder(entity.getDictionary().getId());
if(nextOrder!=null) { if(nextOrder!=null) {
@ -52,7 +56,9 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
throw exceptionProvider.getUpdateNullNewObjectException(); throw exceptionProvider.getUpdateNullNewObjectException();
} }
String dictionaryId =entity.getDictionary().getId(); String dictionaryId =entity.getDictionary().getId();
EnumDictionaryEntity dictionaryEntity =enumDictionaryRepository.getOne(dictionaryId); Optional<EnumDictionaryEntity> optional =enumDictionaryRepository.findById(dictionaryId);
if(optional.isPresent()) {
EnumDictionaryEntity dictionaryEntity = optional.get();
if (dictionaryEntity != null) { if (dictionaryEntity != null) {
List<EnumItemEntity> items = dictionaryEntity.getItems(); List<EnumItemEntity> items = dictionaryEntity.getItems();
if (items != null && items.size() > 0) { if (items != null && items.size() > 0) {
@ -65,6 +71,7 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
} }
} }
} }
}
return super.update(primaryKey, entity); return super.update(primaryKey, entity);
} }
} }

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/DictionaryEntityEventHandler.java

@ -68,7 +68,7 @@ public class DictionaryEntityEventHandler extends AbstractJpaEntityPersistentEve
if(entity!=null) { if(entity!=null) {
DictionaryEntity parent =entity.getParent(); DictionaryEntity parent =entity.getParent();
if(parent!=null) { if(parent!=null) {
DictionaryEntity parentEntity =dictionaryService.getRepository().getOne(parent.getId()); DictionaryEntity parentEntity =dictionaryService.findById(parent.getId());
if(parentEntity!=null) { if(parentEntity!=null) {
if(log.isDebugEnabled()) {log.debug("更新 [父数据字典] 最后修改日期");} if(log.isDebugEnabled()) {log.debug("更新 [父数据字典] 最后修改日期");}
parentEntity.setLastModifyDate(new Date()); parentEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorEntityEventHandler.java

@ -61,7 +61,7 @@ public class IndicatorEntityEventHandler extends AbstractJpaEntityPersistentEven
if(entity!=null) { if(entity!=null) {
LibEntity libEntity =entity.getLib(); LibEntity libEntity =entity.getLib();
if(libEntity!=null) { if(libEntity!=null) {
libEntity =libService.getRepository().getOne(libEntity.getId()); libEntity =libService.findById(libEntity.getId());
} }
if(libEntity!=null) { if(libEntity!=null) {
libEntity.setLastModifyDate(new Date()); libEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorProcessorEntityEventHandler.java

@ -44,7 +44,7 @@ public class IndicatorProcessorEntityEventHandler extends AbstractJpaEntityPersi
if(entity!=null) { if(entity!=null) {
IndicatorEntity indicatorEntity =entity.getIndicator(); IndicatorEntity indicatorEntity =entity.getIndicator();
if(indicatorEntity!=null) { if(indicatorEntity!=null) {
indicatorEntity =indicatorService.getRepository().getOne(indicatorEntity.getId()); indicatorEntity =indicatorService.findById(indicatorEntity.getId());
} }
if(indicatorEntity!=null) { if(indicatorEntity!=null) {
indicatorEntity.setLastModifyDate(new Date()); indicatorEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorValidatorEntityEventHandler.java

@ -44,7 +44,7 @@ public class IndicatorValidatorEntityEventHandler extends AbstractJpaEntityPersi
if(entity!=null) { if(entity!=null) {
IndicatorEntity indicatorEntity =entity.getIndicator(); IndicatorEntity indicatorEntity =entity.getIndicator();
if(indicatorEntity!=null) { if(indicatorEntity!=null) {
indicatorEntity =indicatorService.getRepository().getOne(indicatorEntity.getId()); indicatorEntity =indicatorService.findById(indicatorEntity.getId());
} }
if(indicatorEntity!=null) { if(indicatorEntity!=null) {
indicatorEntity.setLastModifyDate(new Date()); indicatorEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/LibEntityEventHandler.java

@ -80,7 +80,7 @@ public class LibEntityEventHandler extends AbstractJpaEntityPersistentEventHandl
if(entity!=null) { if(entity!=null) {
LibEntity parent =entity.getParent(); LibEntity parent =entity.getParent();
if(parent!=null) { if(parent!=null) {
LibEntity parentEntity =libService.getRepository().getOne(parent.getId()); LibEntity parentEntity =libService.findById(parent.getId());
if(parentEntity!=null) { if(parentEntity!=null) {
parentEntity.setLastModifyDate(new Date()); parentEntity.setLastModifyDate(new Date());
libService.getRepository().save(parentEntity); libService.getRepository().save(parentEntity);

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ModelEntityEventHandler.java

@ -46,7 +46,7 @@ public class ModelEntityEventHandler extends AbstractJpaEntityPersistentEventHan
if(entity!=null) { if(entity!=null) {
ModelEntity parent =entity.getParent(); ModelEntity parent =entity.getParent();
if(parent!=null) { if(parent!=null) {
ModelEntity parentEntity =modelService.getRepository().getOne(parent.getId()); ModelEntity parentEntity =modelService.findById(parent.getId());
if(parentEntity!=null) { if(parentEntity!=null) {
parentEntity.setLastModifyDate(new Date()); parentEntity.setLastModifyDate(new Date());
modelService.getRepository().save(parentEntity); modelService.getRepository().save(parentEntity);
@ -54,7 +54,7 @@ public class ModelEntityEventHandler extends AbstractJpaEntityPersistentEventHan
}else { }else {
ResourceEntity resource =entity.getResource(); ResourceEntity resource =entity.getResource();
if(resource!=null) { if(resource!=null) {
ResourceEntity resourceEntity =resourceService.getRepository().getOne(resource.getId()); ResourceEntity resourceEntity =resourceService.findById(resource.getId());
resourceEntity.setLastModifyDate(new Date()); resourceEntity.setLastModifyDate(new Date());
resourceService.getRepository().save(resourceEntity); resourceService.getRepository().save(resourceEntity);
} }

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterEntityEventHandler.java

@ -59,7 +59,7 @@ public class ParameterEntityEventHandler extends AbstractJpaEntityPersistentEven
if(entity!=null) { if(entity!=null) {
ModelEntity parameterEntity =entity.getModel(); ModelEntity parameterEntity =entity.getModel();
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity =modelService.getRepository().getOne(parameterEntity.getId()); parameterEntity =modelService.findById(parameterEntity.getId());
} }
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity.setLastModifyDate(new Date()); parameterEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterProcessorEntityEventHandler.java

@ -44,7 +44,7 @@ public class ParameterProcessorEntityEventHandler extends AbstractJpaEntityPersi
if(entity!=null) { if(entity!=null) {
ParameterEntity parameterEntity =entity.getParameter(); ParameterEntity parameterEntity =entity.getParameter();
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity =parameterService.getRepository().getOne(parameterEntity.getId()); parameterEntity =parameterService.findById(parameterEntity.getId());
} }
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity.setLastModifyDate(new Date()); parameterEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ParameterValidatorEntityEventHandler.java

@ -44,7 +44,7 @@ public class ParameterValidatorEntityEventHandler extends AbstractJpaEntityPersi
if(entity!=null) { if(entity!=null) {
ParameterEntity parameterEntity =entity.getParameter(); ParameterEntity parameterEntity =entity.getParameter();
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity =parameterService.getRepository().getOne(parameterEntity.getId()); parameterEntity =parameterService.findById(parameterEntity.getId());
} }
if(parameterEntity!=null) { if(parameterEntity!=null) {
parameterEntity.setLastModifyDate(new Date()); parameterEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ScoreCardVarEntityEventHandler.java

@ -52,7 +52,7 @@ public class ScoreCardVarEntityEventHandler extends AbstractJpaEntityPersistentE
if(entity!=null) { if(entity!=null) {
ResourceEntity resourceEntity =entity.getResource(); ResourceEntity resourceEntity =entity.getResource();
if(resourceEntity!=null) { if(resourceEntity!=null) {
resourceEntity =resourceService.getRepository().getOne(resourceEntity.getId()); resourceEntity =resourceService.findById(resourceEntity.getId());
} }
if(resourceEntity!=null) { if(resourceEntity!=null) {
resourceEntity.setLastModifyDate(new Date()); resourceEntity.setLastModifyDate(new Date());

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/UserDefinedJavaClassFieldEntityEventHandler.java

@ -78,7 +78,7 @@ public class UserDefinedJavaClassFieldEntityEventHandler extends AbstractJpaEnti
if(entity!=null) { if(entity!=null) {
DictionaryEntity dictionaryEntityEntity =entity.getDictionary(); DictionaryEntity dictionaryEntityEntity =entity.getDictionary();
if(dictionaryEntityEntity!=null) { if(dictionaryEntityEntity!=null) {
dictionaryEntityEntity =dictionaryService.getRepository().getOne(dictionaryEntityEntity.getId()); dictionaryEntityEntity =dictionaryService.findById(dictionaryEntityEntity.getId());
} }
if(dictionaryEntityEntity!=null) { if(dictionaryEntityEntity!=null) {
dictionaryEntityEntity.setLastModifyDate(new Date()); dictionaryEntityEntity.setLastModifyDate(new Date());

6
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java

@ -134,7 +134,7 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl<IndicatorProce
if(!StringUtils.hasText(processorId)) { if(!StringUtils.hasText(processorId)) {
return Collections.emptyList(); return Collections.emptyList();
} }
IndicatorProcessorVo processorVo =repository.getReferenceById(processorId).toVo(); IndicatorProcessorVo processorVo =this.findById(processorId).toVo();
if(processorVo==null){ if(processorVo==null){
return Collections.emptyList(); return Collections.emptyList();
} }
@ -275,12 +275,12 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl<IndicatorProce
if(StringUtils.hasText(sql)) { if(StringUtils.hasText(sql)) {
Map<String,String> mapping =request.getSqlParameterValueMap(); Map<String,String> mapping =request.getSqlParameterValueMap();
String replacedSql = ExpressionReplacer.replace(sql, mapping); String replacedSql = ExpressionReplacer.replace(sql, mapping);
return jdbcTemplate.query(replacedSql, new Object[] {}, new ResultSetExtractor<SqlQueryResult>() { return jdbcTemplate.query(replacedSql, new ResultSetExtractor<SqlQueryResult>() {
@Override @Override
public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException {
return SqlQueryResult.from(rs); return SqlQueryResult.from(rs);
} }
}); },new Object[] {});
} }
} }
return null; return null;

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorServiceImpl.java

@ -277,7 +277,7 @@ public class IndicatorServiceImpl extends DaoServiceImpl<IndicatorEntity, String
@Override @Override
public IndicatorEntity deepClone(String indicatorId) throws Exception { public IndicatorEntity deepClone(String indicatorId) throws Exception {
if(StringUtils.hasText(indicatorId)) { if(StringUtils.hasText(indicatorId)) {
IndicatorEntity parameter =repository.getOne(indicatorId); IndicatorEntity parameter =this.findById(indicatorId);
if(parameter!=null) { if(parameter!=null) {
IndicatorEntity entity =(IndicatorEntity)parameter.deepClone(); IndicatorEntity entity =(IndicatorEntity)parameter.deepClone();
entity.clearId(); entity.clearId();
@ -364,7 +364,7 @@ public class IndicatorServiceImpl extends DaoServiceImpl<IndicatorEntity, String
if(!StringUtils.hasText(indicatorId)) { if(!StringUtils.hasText(indicatorId)) {
return Collections.emptyList(); return Collections.emptyList();
} }
IndicatorEntity indicator =repository.getOne(indicatorId); IndicatorEntity indicator =this.findById(indicatorId);
if(indicator==null){ if(indicator==null){
return Collections.emptyList(); return Collections.emptyList();
} }

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java

@ -36,7 +36,7 @@ public class ModelServiceImpl extends DaoServiceImpl<ModelEntity, String, ModelR
@Override @Override
public ModelEntity findRootModelByModelId(String modelId) { public ModelEntity findRootModelByModelId(String modelId) {
ModelEntity modelEntity =repository.getOne(modelId); ModelEntity modelEntity =this.findById(modelId);
if(modelEntity!=null) { if(modelEntity!=null) {
while(modelEntity.getParent()!=null) { while(modelEntity.getParent()!=null) {
modelEntity =modelEntity.getParent(); modelEntity =modelEntity.getParent();

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java

@ -73,7 +73,7 @@ public class ParameterProcessorServiceImpl
if(!StringUtils.hasText(processorId)) { if(!StringUtils.hasText(processorId)) {
return Collections.emptyList(); return Collections.emptyList();
} }
ParameterProcessorVo processorVo =repository.getReferenceById(processorId).toVo(); ParameterProcessorVo processorVo =this.findById(processorId).toVo();
if(processorVo==null){ if(processorVo==null){
return Collections.emptyList(); return Collections.emptyList();
} }
@ -298,7 +298,7 @@ public class ParameterProcessorServiceImpl
@Override @Override
public void importFromCsv(String parameterId, String csvContent, String splitChar) throws Exception { public void importFromCsv(String parameterId, String csvContent, String splitChar) throws Exception {
if(StringUtils.hasText(parameterId) && StringUtils.hasText(csvContent)) { if(StringUtils.hasText(parameterId) && StringUtils.hasText(csvContent)) {
ParameterEntity parameterEntity =parameterService.getRepository().getOne(parameterId); ParameterEntity parameterEntity =parameterService.findById(parameterId);
if(parameterEntity!=null && ParameterType.RULE_RESULT.equals(parameterEntity.getType())) { if(parameterEntity!=null && ParameterType.RULE_RESULT.equals(parameterEntity.getType())) {
List<String> lines =IOUtils.readLines(new ByteArrayInputStream(csvContent.getBytes("UTF-8")), "UTF-8"); List<String> lines =IOUtils.readLines(new ByteArrayInputStream(csvContent.getBytes("UTF-8")), "UTF-8");
if(lines!=null && lines.size()>0) { if(lines!=null && lines.size()>0) {
@ -361,12 +361,12 @@ public class ParameterProcessorServiceImpl
if(StringUtils.hasText(sql)) { if(StringUtils.hasText(sql)) {
Map<String,String> mapping =request.getSqlParameterValueMap(); Map<String,String> mapping =request.getSqlParameterValueMap();
String replacedSql =ExpressionReplacer.replace(sql, mapping); String replacedSql =ExpressionReplacer.replace(sql, mapping);
return jdbcTemplate.query(replacedSql, new Object[] {}, new ResultSetExtractor<SqlQueryResult>() { return jdbcTemplate.query(replacedSql, new ResultSetExtractor<SqlQueryResult>() {
@Override @Override
public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException {
return SqlQueryResult.from(rs); return SqlQueryResult.from(rs);
} }
}); },new Object[] {});
} }
} }
return null; return null;

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java

@ -255,7 +255,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
@Override @Override
public ParameterEntity deepClone(String parameterId) throws Exception { public ParameterEntity deepClone(String parameterId) throws Exception {
if(StringUtils.hasText(parameterId)) { if(StringUtils.hasText(parameterId)) {
ParameterEntity parameter =repository.getOne(parameterId); ParameterEntity parameter =this.findById(parameterId);
if(parameter!=null) { if(parameter!=null) {
ParameterEntity entity =(ParameterEntity)parameter.deepClone(); ParameterEntity entity =(ParameterEntity)parameter.deepClone();
entity.clearId(); entity.clearId();
@ -435,7 +435,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(!StringUtils.hasText(parameterId)) { if(!StringUtils.hasText(parameterId)) {
return Collections.emptyList(); return Collections.emptyList();
} }
ParameterEntity parameter =repository.getOne(parameterId); ParameterEntity parameter =this.findById(parameterId);
if(parameter==null){ if(parameter==null){
return Collections.emptyList(); return Collections.emptyList();
} }

6
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java

@ -263,7 +263,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
@Transactional @Transactional
public ResourceEntity deepClone(String id) throws Exception { public ResourceEntity deepClone(String id) throws Exception {
if(StringUtils.hasText(id)) { if(StringUtils.hasText(id)) {
ResourceEntity entity =repository.getOne(id); ResourceEntity entity =this.findById(id);
if(entity!=null) { if(entity!=null) {
ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone(); ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone();
cloneEntity.clearId(); cloneEntity.clearId();
@ -286,7 +286,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
@Transactional @Transactional
public ResourceEntity deepCloneNew(String id) throws Exception { public ResourceEntity deepCloneNew(String id) throws Exception {
if(StringUtils.hasText(id)) { if(StringUtils.hasText(id)) {
ResourceEntity entity =repository.getOne(id); ResourceEntity entity =this.findById(id);
if(entity!=null) { if(entity!=null) {
ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone(); ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone();
cloneEntity.clearId(); cloneEntity.clearId();
@ -827,7 +827,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
private void updateResourceAndRoleRelationship(String roleId,String resourceId) { private void updateResourceAndRoleRelationship(String roleId,String resourceId) {
if(StringUtils.hasText(roleId) && StringUtils.hasText(resourceId)) { if(StringUtils.hasText(roleId) && StringUtils.hasText(resourceId)) {
//首先在 资源-角色表中查找是否存在角色和资源的关系 //首先在 资源-角色表中查找是否存在角色和资源的关系
long count =jdbcTemplate.queryForObject("select count(*) from RE_RESOURCE_ROLE where ROLE_ID_=?", new String[] {roleId},Long.class); long count =jdbcTemplate.queryForObject("select count(*) from RE_RESOURCE_ROLE where ROLE_ID_=?", Long.class,roleId);
if(count>0) { if(count>0) {
//如果存在 资源-角色关系表中存在某个角色,表示该角色已经配置了资源访问权限,对于该角色新建的资源,需要也赋予响应的权限,否则会出现 //如果存在 资源-角色关系表中存在某个角色,表示该角色已经配置了资源访问权限,对于该角色新建的资源,需要也赋予响应的权限,否则会出现
//当前用户新建的资源无法查看到的问题 //当前用户新建的资源无法查看到的问题

11
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java

@ -45,6 +45,7 @@ import io.sc.engine.rule.server.testcase.support.CellStyleBuilder;
import io.sc.engine.rule.server.testcase.wrapper.Option; import io.sc.engine.rule.server.testcase.wrapper.Option;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper; import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseWrapper; import io.sc.engine.rule.server.testcase.wrapper.TestCaseWrapper;
import io.sc.platform.core.Environment;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.service.support.CriteriaBuilder; import io.sc.platform.orm.service.support.CriteriaBuilder;
import io.sc.platform.orm.service.support.QueryParameter; import io.sc.platform.orm.service.support.QueryParameter;
@ -89,12 +90,12 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
private GroovyScriptEngineService groovyScriptEngineService =new GroovyScriptEngineServiceImpl(); private GroovyScriptEngineService groovyScriptEngineService =new GroovyScriptEngineServiceImpl();
@Override @Override
@SuppressWarnings("unchecked")
public Page<TestCaseEntity> findByOwnerId(String ownerId,QueryParameter queryParameter) throws Exception { public Page<TestCaseEntity> findByOwnerId(String ownerId,QueryParameter queryParameter) throws Exception {
CriteriaBuilder<TestCaseEntity> cb =new CriteriaBuilder(); CriteriaBuilder<TestCaseEntity> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and( queryParameter.addCriteria(cb.and(
cb.equals("ownerId",ownerId) cb.equals("ownerId",ownerId)
)); ));
//queryParameter.addCriterias(new CriteriaBuilder().equals("ownerId",ownerId).getCriteria());
return this.query(queryParameter); return this.query(queryParameter);
} }
@ -118,7 +119,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
@Override @Override
public TestCaseEntity deepClone(String testCaseId) throws Exception { public TestCaseEntity deepClone(String testCaseId) throws Exception {
if(StringUtils.hasText(testCaseId)) { if(StringUtils.hasText(testCaseId)) {
TestCaseEntity entity =repository.getOne(testCaseId); TestCaseEntity entity =this.findById(testCaseId);
if(entity!=null) { if(entity!=null) {
TestCaseEntity _entity =(TestCaseEntity)entity.deepClone(); TestCaseEntity _entity =(TestCaseEntity)entity.deepClone();
_entity.clearId(); _entity.clearId();
@ -511,7 +512,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
// 设置附件名称(通过浏览器直接下载时,可正常保存中文名称) // 设置附件名称(通过浏览器直接下载时,可正常保存中文名称)
response.setHeader("Content-Disposition", "attachment; filename=" + new String(resoureName.getBytes("UTF-8"), "ISO8859-1")); response.setHeader("Content-Disposition", "attachment; filename=" + new String(resoureName.getBytes("UTF-8"), "ISO8859-1"));
// 设置附件名称(通过 axios 下载时,可正常保存中文名称) // 设置附件名称(通过 axios 下载时,可正常保存中文名称)
response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(resoureName)); response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(resoureName, Environment.DEFAULT_URL_ENCODE_NAME));
} }
workbook.write(response.getOutputStream()); workbook.write(response.getOutputStream());
workbook.close(); workbook.close();
@ -645,7 +646,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
// 设置附件名称(通过浏览器直接下载时,可正常保存中文名称) // 设置附件名称(通过浏览器直接下载时,可正常保存中文名称)
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")); response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1"));
// 设置附件名称(通过 axios 下载时,可正常保存中文名称) // 设置附件名称(通过 axios 下载时,可正常保存中文名称)
response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(fileName)); response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(fileName, Environment.DEFAULT_URL_ENCODE_NAME));
} }
workbook.write(response.getOutputStream()); workbook.write(response.getOutputStream());
workbook.close(); workbook.close();

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.st.frontend", "name": "io.sc.engine.st.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

1
io.sc.engine.st.frontend/src/views/DepFactor/DepFactorDefine.vue

@ -259,7 +259,6 @@ const findAllWithoutById = (id) => {
options.push({ value: define.id, label: define.name }); options.push({ value: define.id, label: define.name });
} }
} }
console.log(factorDefineOptionsRef.value);
factorDefineOptionsRef.value = options; factorDefineOptionsRef.value = options;
} }
}); });

1
io.sc.engine.st.frontend/src/views/IndepFactor/IndepFactor.vue

@ -154,7 +154,6 @@
}, },
], ],
}; };
console.log(echartsOptionRef);
} }
" "
></w-grid> ></w-grid>

1
io.sc.engine.st.frontend/src/views/IndepFactor/IndepFactorDefine.vue

@ -249,7 +249,6 @@ const findAllWithoutById = (id) => {
options.push({ value: define.id, label: define.name }); options.push({ value: define.id, label: define.name });
} }
} }
console.log(factorDefineOptionsRef.value);
factorDefineOptionsRef.value = options; factorDefineOptionsRef.value = options;
} }
}); });

1
io.sc.engine.st.frontend/src/views/Scenario/ScenarioFactorDefine.vue

@ -212,7 +212,6 @@ const findAllWithoutById = (id) => {
options.push({ value: define.id, label: define.name }); options.push({ value: define.id, label: define.name });
} }
} }
console.log(factorDefineOptionsRef.value);
factorDefineOptionsRef.value = options; factorDefineOptionsRef.value = options;
} }
}); });

47
io.sc.engine.st.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.engine.st.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

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

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

70
io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue

@ -27,11 +27,11 @@
</q-btn-dropdown> </q-btn-dropdown>
<q-btn-dropdown :title="$t('graph.toolbar.actions.path')" stretch flat icon="bi-bezier2" padding="4px 10px"> </q-btn-dropdown> <q-btn-dropdown :title="$t('graph.toolbar.actions.path')" stretch flat icon="bi-bezier2" padding="4px 10px"> </q-btn-dropdown>
</q-toolbar> </q-toolbar>
<q-splitter v-model="splitterLeftWidthRef" unit="px" style="height: calc(100% - 50px)" separator-style="width: 3px"> <q-splitter v-model="splitterLeftWidthRef" unit="px" style="height: calc(100% - 50px)">
<template #before> <template #before>
<div style="height: 100%"> <div style="height: 100%">
<q-list> <q-list>
<q-expansion-item label="组件" model-value="true"> <q-expansion-item label="组件">
<div class="flex items-center px-1"> <div class="flex items-center px-1">
<div><q-btn flat dense icon="save"></q-btn></div> <div><q-btn flat dense icon="save"></q-btn></div>
<div><q-btn flat dense icon="save"></q-btn></div> <div><q-btn flat dense icon="save"></q-btn></div>
@ -46,11 +46,22 @@
<q-splitter v-model="splitterRightWidthRef" unit="px" reverse style="height: 100%"> <q-splitter v-model="splitterRightWidthRef" unit="px" reverse style="height: 100%">
<template #before> <template #before>
<div style="height: 100%"> <div style="height: 100%">
<div id="graph-container" style="height: 100%"></div> <div
ref="graphContainerRef"
style="
width: 100%;
height: 100%;
border-color: rgb(255, 255, 255);
border-style: solid;
background-color: rgb(255, 255, 255);
background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UwZTBlMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=');
background-position: 0px 0px;
"
></div>
</div> </div>
</template> </template>
<template #after> <template #after>
<div style="height: 100%"> <div class="px-1" style="height: 100%">
<q-tabs v-model="currentSelectedTabNameRef" inline-label shrink outside-arrows mobile-arrows> <q-tabs v-model="currentSelectedTabNameRef" inline-label shrink outside-arrows mobile-arrows>
<q-tab name="properties" no-caps :label="$t('graph.setting.panel.properties.title')" /> <q-tab name="properties" no-caps :label="$t('graph.setting.panel.properties.title')" />
<q-tab name="style" no-caps :label="$t('graph.setting.panel.style.title')" /> <q-tab name="style" no-caps :label="$t('graph.setting.panel.style.title')" />
@ -68,53 +79,38 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, vue, ref } from 'vue'; import { ref, onMounted } from 'vue';
import { type CellStyle, Graph, InternalEvent } from '@maxgraph/core'; import { Graph } from '@maxgraph/core';
import { PlatformGraph, PlatformGeometryClass } from './base/PlatformGraph';
const splitterLeftWidthRef = ref(150); const splitterLeftWidthRef = ref(150);
const splitterRightWidthRef = ref(300); const splitterRightWidthRef = ref(300);
const currentSelectedTabNameRef = ref('properties'); const currentSelectedTabNameRef = ref('properties');
const graphContainerRef = ref();
onMounted(() => { onMounted(() => {
const container = <HTMLElement>document.getElementById('graph-container'); const graph: Graph = new PlatformGraph(graphContainerRef.value);
// Disables the built-in context menu graph.setConnectable(true);
InternalEvent.disableContextMenu(container); graph.getStylesheet().getDefaultEdgeStyle().edgeStyle = 'orthogonalEdgeStyle';
const graph = new Graph(container);
graph.setPanning(true); // Use mouse right button for panning
// Gets the default parent for inserting new cells. This
// is normally the first child of the root (ie. layer 0).
const parent = graph.getDefaultParent(); const parent = graph.getDefaultParent();
// Adds cells to the model in a single step
graph.batchUpdate(() => { graph.batchUpdate(() => {
const vertex01 = graph.insertVertex({ const v1 = graph.insertVertex({
parent, parent,
position: [10, 10], value: 'Hello,',
size: [100, 100], position: [20, 20],
value: 'rectangle', size: [80, 30],
}); });
const vertex02 = graph.insertVertex({ const v2 = graph.insertVertex({
parent, parent,
position: [350, 90], value: 'World!',
size: [50, 50], position: [200, 150],
style: { size: [80, 30],
fillColor: 'orange',
shape: 'ellipse',
verticalAlign: 'top',
verticalLabelPosition: 'bottom',
},
value: 'ellipse',
}); });
graph.insertEdge({ graph.insertEdge({
parent, parent,
source: vertex01, value: '',
target: vertex02, source: v1,
value: 'edge', target: v2,
style: {
edgeStyle: 'orthogonalEdgeStyle',
rounded: true,
},
}); });
}); });
}); });

51
io.sc.platform.core.frontend/src/platform/components/graph/base/PlatformGraph.ts

@ -0,0 +1,51 @@
import type { InternalMouseEvent, GraphPluginConstructor } from '@maxgraph/core';
import {
Graph,
Geometry,
Point,
CellState,
ConnectionHandler,
CellEditorHandler,
SelectionCellsHandler,
SelectionHandler,
RubberBandHandler,
ConnectionConstraint,
} from '@maxgraph/core';
class PlatformGeometryClass extends Geometry {
constraints = [
new ConnectionConstraint(new Point(0.25, 0), true),
new ConnectionConstraint(new Point(0.5, 0), true),
new ConnectionConstraint(new Point(0.75, 0), true),
new ConnectionConstraint(new Point(0, 0.25), true),
new ConnectionConstraint(new Point(0, 0.5), true),
new ConnectionConstraint(new Point(0, 0.75), true),
new ConnectionConstraint(new Point(1, 0.25), true),
new ConnectionConstraint(new Point(1, 0.5), true),
new ConnectionConstraint(new Point(1, 0.75), true),
new ConnectionConstraint(new Point(0.25, 1), true),
new ConnectionConstraint(new Point(0.5, 1), true),
new ConnectionConstraint(new Point(0.75, 1), true),
];
}
class PlatformConnectionHandler extends ConnectionHandler {
createEdgeState(_me: InternalMouseEvent) {
const edge = this.graph.createEdge(null, null!, null, null, null);
return new CellState(this.graph.view, edge, this.graph.getCellStyle(edge));
}
}
const plugins: GraphPluginConstructor[] = [CellEditorHandler, SelectionCellsHandler, PlatformConnectionHandler, SelectionHandler, RubberBandHandler];
class PlatformGraph extends Graph {
constructor(container: HTMLElement) {
super(container, undefined, plugins);
new RubberBandHandler(this);
}
getAllConnectionConstraints = (terminal: CellState | null, _source: boolean) => {
return (terminal?.cell?.geometry as PlatformGeometryClass)?.constraints ?? null;
};
}
export { PlatformGraph };

129
io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangeRoleDialog.vue

@ -0,0 +1,129 @@
<template>
<w-dialog
ref="dialogRef"
width="500px"
:title="$t('changeRole')"
:can-maximize="false"
:buttons="[
{
label: $t('submit'),
noCaps: true,
click: () => {
axios.post(Environment.apiContextPath('api/security/changDefaultRole'), formRef.getData()).then((response) => {
const token = response.data;
if (token) {
AuthenticationManager.setLocalAccessToken(token);
//
const parameter = ApplicationInitializer.getInitializeParameter();
// ,
SessionManager.updateLastRequestDatetime();
SessionManager.loadUserSession().then((userSession) => {
if (userSession) {
//
SessionManager.setUser(userSession.user);
//
MenuManager.setLocalMenus(parameter.localMenus);
SessionManager.setMenus(MenuManager.buildMenus(userSession.menus));
//
ComponentManager.setLocalComponents(parameter.localComponents);
//
SessionManager.setRoutes(userSession.routes);
RouterManager.removeAllRoutes();
RouterManager.setLocalRoutes(parameter.localRoutes);
RouterManager.buildRoutes(toRaw(userSession.routes));
//
close();
if (RouterManager.getRouteByName(router.currentRoute.value.name)) {
router.push({
name: router.currentRoute.value.name,
params: router.currentRoute.value.params,
query: router.currentRoute.value.query,
});
} else {
router.push({
name: '/',
});
}
}
});
}
});
},
},
]"
>
<w-form
ref="formRef"
:cols-num="1"
class="p-2"
:fields="[
{
name: 'roleId',
label: $t('role'),
type: 'select',
required: true,
options: avaiableRoleOptionsRef,
defaultValue: currentRoleRef,
},
]"
></w-form>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, toRaw } from 'vue';
import { useRouter } from 'vue-router';
import type { UserSessionType } from '@/platform';
import {
axios,
Environment,
SessionManager,
AuthenticationManager,
MenuManager,
ComponentManager,
RouterManager,
ApplicationInitializer,
TagViewManager,
} from '@/platform';
const emit = defineEmits(['change']);
const router = useRouter();
const dialogRef = ref();
const formRef = ref();
const avaiableRoleOptionsRef = ref([]);
const currentRoleRef = ref();
const open = () => {
const session: UserSessionType = SessionManager.getSession() as UserSessionType;
axios.get(Environment.apiContextPath('api/system/role/queryRolesByUser?userId=' + session.user.userId)).then((response) => {
const roles = response.data?.content;
if (roles && roles.length > 0) {
const options = [];
for (const role of roles) {
options.push({ label: role.name, value: role.id });
}
avaiableRoleOptionsRef.value = options;
}
});
currentRoleRef.value = session.user.defaultRoleId;
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
</script>

6
io.sc.platform.core.frontend/src/platform/layout/sub-layout/Sider.vue

@ -6,8 +6,8 @@
'max-width': $gc.theme.sider.isSiderExpaned ? $gc.theme.sider.width + 'px' : $gc.theme.sider.miniWidth + 'px', 'max-width': $gc.theme.sider.isSiderExpaned ? $gc.theme.sider.width + 'px' : $gc.theme.sider.miniWidth + 'px',
}" }"
> >
<ExpansionMenuItem v-if="$gc.theme.sider.isSiderExpaned" :menus="menus"></ExpansionMenuItem> <ExpansionMenuItem v-if="$gc.theme.sider.isSiderExpaned" :menus="SessionManager.getSession().menus"></ExpansionMenuItem>
<IconMenuItem v-else :menus="menus"></IconMenuItem> <IconMenuItem v-else :menus="SessionManager.getSession().menus"></IconMenuItem>
</q-scroll-area> </q-scroll-area>
</template> </template>
@ -15,6 +15,4 @@
import ExpansionMenuItem from './ExpansionMenuItem.vue'; import ExpansionMenuItem from './ExpansionMenuItem.vue';
import IconMenuItem from './IconMenuItem.vue'; import IconMenuItem from './IconMenuItem.vue';
import { SessionManager } from '@/platform'; import { SessionManager } from '@/platform';
const menus = SessionManager.getSession().menus;
</script> </script>

24
io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue

@ -86,8 +86,8 @@
<div class="row items-center no-wrap"> <div class="row items-center no-wrap">
<q-icon left name="bi-person-circle" size="md" /> <q-icon left name="bi-person-circle" size="md" />
<div class="text-left"> <div class="text-left">
<div class="truncate flex-nowrap">{{ session.user?.userName }}</div> <div class="truncate flex-nowrap">{{ SessionManager.getSession().user.userName }}</div>
<div class="truncate text-xs">{{ session.user?.defaultRoleName }}</div> <div class="truncate text-xs">{{ SessionManager.getSession().user.defaultRoleName }}</div>
</div> </div>
</div> </div>
<q-menu> <q-menu>
@ -135,12 +135,14 @@
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-separator inset spaced /> <q-separator inset spaced />
<q-item v-close-popup clickable> <template v-if="SessionManager.getSession().user?.authorities?.length > 1">
<q-item v-close-popup clickable @click="Environment.executeAction('changeRole')">
<q-item-section> <q-item-section>
<q-item-label><q-icon name="group" left size="20px"></q-icon>{{ t('changeRole') }}</q-item-label> <q-item-label><q-icon name="group" left size="20px"></q-icon>{{ t('changeRole') }}</q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-separator inset spaced /> <q-separator inset spaced />
</template>
<q-item v-close-popup clickable @click="Environment.executeAction('logout')"> <q-item v-close-popup clickable @click="Environment.executeAction('logout')">
<q-item-section> <q-item-section>
<q-item-label><q-icon name="logout" left size="20px"></q-icon>{{ t('logout') }}</q-item-label> <q-item-label><q-icon name="logout" left size="20px"></q-icon>{{ t('logout') }}</q-item-label>
@ -151,18 +153,13 @@
</q-btn> </q-btn>
</q-toolbar> </q-toolbar>
<!--
<q-form ref="logoutForm" :action="Environment.apiContextPath('/logout')" method="post" target="platformLogoutIframe"></q-form>
<iframe name="platformLogoutIframe" style="display: none"></iframe>
-->
<LoginDialog ref="loginDialog"></LoginDialog> <LoginDialog ref="loginDialog"></LoginDialog>
<AboutDialog ref="aboutDialog"></AboutDialog> <AboutDialog ref="aboutDialog"></AboutDialog>
<ChangePasswordDialog ref="changePasswordDialog"></ChangePasswordDialog> <ChangePasswordDialog ref="changePasswordDialog"></ChangePasswordDialog>
<ChangeRoleDialog ref="changeRoleDialog"></ChangeRoleDialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { UserSessionType } from '@/platform/types';
import { ref } from 'vue'; import { ref } from 'vue';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
@ -171,6 +168,7 @@ import { Environment, SessionManager, I18nMessageManager, AuthenticationManager
import LoginDialog from '@/platform/views/LoginDialog'; import LoginDialog from '@/platform/views/LoginDialog';
import AboutDialog from './AboutDialog.vue'; import AboutDialog from './AboutDialog.vue';
import ChangePasswordDialog from './ChangePasswordDialog.vue'; import ChangePasswordDialog from './ChangePasswordDialog.vue';
import ChangeRoleDialog from './ChangeRoleDialog.vue';
const gc = Environment.getConfigure(); const gc = Environment.getConfigure();
const quasar = useQuasar(); const quasar = useQuasar();
@ -178,9 +176,8 @@ const searchContent = ref('');
const loginDialog = ref(); const loginDialog = ref();
const aboutDialog = ref(); const aboutDialog = ref();
const changePasswordDialog = ref(); const changePasswordDialog = ref();
const changeRoleDialog = ref();
const { t } = useI18n(); const { t } = useI18n();
const session: UserSessionType = SessionManager.getSession() as UserSessionType;
const logoutForm = ref();
const search = () => { const search = () => {
console.log(searchContent); console.log(searchContent);
@ -202,6 +199,10 @@ const changePassword = () => {
changePasswordDialog.value.open(); changePasswordDialog.value.open();
}; };
const changeRole = () => {
changeRoleDialog.value.open();
};
const openLoginDialog = () => { const openLoginDialog = () => {
loginDialog.value.open(); loginDialog.value.open();
}; };
@ -242,6 +243,7 @@ const doLogout = () => {
Environment.registAction('about', about); Environment.registAction('about', about);
Environment.registAction('changePassword', changePassword); Environment.registAction('changePassword', changePassword);
Environment.registAction('changeRole', changeRole);
Environment.registAction('openLoginDialog', openLoginDialog); Environment.registAction('openLoginDialog', openLoginDialog);
Environment.registAction('logout', logout); Environment.registAction('logout', logout);
</script> </script>

2
io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts

@ -62,7 +62,7 @@ class ApplicationInitializer {
// 构建路由 // 构建路由
SessionManager.setRoutes(userSession.routes); SessionManager.setRoutes(userSession.routes);
RouterManager.setLocalRoutes(parameter.localRoutes); RouterManager.setLocalRoutes(parameter.localRoutes);
RouterManager.buildRoutes(toRaw(userSession.routes)); RouterManager.buildRoutes(userSession.routes);
// 加载远程入口 // 加载远程入口
RemoteEntryManager.loadRemoteEntries(parameter.callback); RemoteEntryManager.loadRemoteEntries(parameter.callback);

13
io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts

@ -1,3 +1,4 @@
import { reactive } from 'vue';
import type { UserSessionType, UserType, MenuItemType, FrontEndRouteType } from '@/platform/types'; import type { UserSessionType, UserType, MenuItemType, FrontEndRouteType } from '@/platform/types';
import { PConst } from '@/platform/PConst'; import { PConst } from '@/platform/PConst';
import { Environment } from '@/platform/plugin/environment'; import { Environment } from '@/platform/plugin/environment';
@ -9,12 +10,12 @@ import { axios } from '@/platform/plugin';
class SessionManager { class SessionManager {
static #lastRequestDatetime = new Date().getTime(); static #lastRequestDatetime = new Date().getTime();
static #session: UserSessionType = { static #session: UserSessionType = reactive({
user: {}, user: {},
menus: [], menus: [],
routes: [], routes: [],
remoteEntries: new Map<string, string>(), remoteEntries: new Map<string, string>(),
}; });
/** /**
* *
@ -62,6 +63,14 @@ class SessionManager {
return Environment.isMultiCorporationMode() && SessionManager.getUser()?.corporationCode === '_PRIMARY_'; return Environment.isMultiCorporationMode() && SessionManager.getUser()?.corporationCode === '_PRIMARY_';
} }
/**
*
* @returns
*/
public static getMenus() {
return SessionManager.#session.menus;
}
/** /**
* *
* @param menus * @param menus

4
io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts

@ -14,7 +14,6 @@ const gr = Environment.getGlobalReactive();
* TagView * TagView
*/ */
class TagViewManager { class TagViewManager {
static #updated = false;
static #DEFAULT_JSON = '{"version":"-1","tagVeiws":[],"breadcrumbs":[]}'; static #DEFAULT_JSON = '{"version":"-1","tagVeiws":[],"breadcrumbs":[]}';
static #tagViewsAndBreadcrumbs = reactive({ static #tagViewsAndBreadcrumbs = reactive({
version: '' + Environment.getPlatformCoreVersion(), version: '' + Environment.getPlatformCoreVersion(),
@ -107,7 +106,6 @@ class TagViewManager {
} }
private static update(storage: any) { private static update(storage: any) {
if (!TagViewManager.#updated) {
const tagViews = []; const tagViews = [];
if (storage.tagViews && storage.tagViews.length > 0) { if (storage.tagViews && storage.tagViews.length > 0) {
for (const tagView of storage.tagViews) { for (const tagView of storage.tagViews) {
@ -118,8 +116,6 @@ class TagViewManager {
} }
storage.tagViews = tagViews; storage.tagViews = tagViews;
TagViewManager.#tagViewsAndBreadcrumbs.tagViews = tagViews; TagViewManager.#tagViewsAndBreadcrumbs.tagViews = tagViews;
TagViewManager.#updated = true;
}
} }
private static createTagViews(storage: any): TagViewType[] { private static createTagViews(storage: any): TagViewType[] {

1
io.sc.platform.core.frontend/src/platform/types/UserType.ts

@ -1,4 +1,5 @@
export type UserType = { export type UserType = {
userId?: string;
loginName?: string; loginName?: string;
userName?: string; userName?: string;
defaultAppId?: string; defaultAppId?: string;

25
io.sc.platform.core.frontend/src/platform/views/LoginDialog.vue

@ -56,17 +56,10 @@
<script setup lang="ts"> <script setup lang="ts">
import Axios from 'axios'; import Axios from 'axios';
import { ref, toRaw } from 'vue'; import { ref, toRaw } from 'vue';
import { import { useRouter } from 'vue-router';
Environment, import { Environment, ApplicationInitializer, AuthenticationManager, SessionManager, MenuManager, ComponentManager, RouterManager } from '@/platform';
ApplicationInitializer,
AuthenticationManager,
SessionManager,
MenuManager,
ComponentManager,
RouterManager,
JavascriptLoader,
} from '@/platform';
const router = useRouter();
const session = SessionManager.getSession(); const session = SessionManager.getSession();
const dialogRef = ref(); const dialogRef = ref();
const username = ref(''); const username = ref('');
@ -146,6 +139,18 @@ const loginFormSubmit = (event) => {
// //
close(); close();
if (RouterManager.getRouteByName(router.currentRoute.value.name)) {
router.push({
name: router.currentRoute.value.name,
params: router.currentRoute.value.params,
query: router.currentRoute.value.query,
});
} else {
router.push({
name: '/',
});
}
} }
}); });
} }

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.308", "version": "8.1.312",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -104,7 +104,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

47
io.sc.platform.core.frontend/template-project/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.platform.core.frontend/template-project/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

47
io.sc.platform.core.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.platform.core.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

1
io.sc.platform.core/src/main/java/io/sc/platform/core/Environment.java

@ -16,6 +16,7 @@ public class Environment {
private static final Logger log = LoggerFactory.getLogger(Environment.class); private static final Logger log = LoggerFactory.getLogger(Environment.class);
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
public static final String DEFAULT_CHARSET_NAME = StandardCharsets.UTF_8.name(); public static final String DEFAULT_CHARSET_NAME = StandardCharsets.UTF_8.name();
public static final String DEFAULT_URL_ENCODE_NAME = StandardCharsets.UTF_8.name();
public static final String KEY_APPLICATION_NAME ="application.name"; public static final String KEY_APPLICATION_NAME ="application.name";
public static final String KEY_IS_RUNNING_IN_DEVELOPMENT ="application.is-running-in-development"; public static final String KEY_IS_RUNNING_IN_DEVELOPMENT ="application.is-running-in-development";
public static final String KEY_IS_RUNNING_IN_WEB_CONTAINER ="application.is-running-in-web-container"; public static final String KEY_IS_RUNNING_IN_WEB_CONTAINER ="application.is-running-in-web-container";

2
io.sc.platform.core/src/main/java/io/sc/platform/core/controller/EnumWebController.java

@ -15,6 +15,7 @@ import java.util.*;
@RequestMapping("/api/enum") @RequestMapping("/api/enum")
public class EnumWebController { public class EnumWebController {
@GetMapping("list/{type}") @GetMapping("list/{type}")
@SuppressWarnings("unchecked")
public Option[] list(@PathVariable(name = "type",required = false) String type) throws Exception{ public Option[] list(@PathVariable(name = "type",required = false) String type) throws Exception{
if(StringUtils.hasText(type)){ if(StringUtils.hasText(type)){
Class<?> clazz =Class.forName(type); Class<?> clazz =Class.forName(type);
@ -46,6 +47,7 @@ public class EnumWebController {
return Collections.emptyMap(); return Collections.emptyMap();
} }
@SuppressWarnings("unchecked")
private Option<String>[] convert(Enum<?>[] enums){ private Option<String>[] convert(Enum<?>[] enums){
Option<String>[] result =new Option[enums.length]; Option<String>[] result =new Option[enums.length];
for(int i=0;i<enums.length;i++){ for(int i=0;i<enums.length;i++){

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.developer.frontend", "name": "io.sc.platform.developer.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

8
io.sc.platform.developer.frontend/src/views/plugin/Menus.vue

@ -1,7 +1,6 @@
<template> <template>
<w-grid <w-grid
:tree="true" :tree="true"
dense-body
:title="$t('menu.developer.plugin.menus')" :title="$t('menu.developer.plugin.menus')"
:data-url="Environment.apiContextPath('/api/system/menu/getAllMenuPlugins')" :data-url="Environment.apiContextPath('/api/system/menu/getAllMenuPlugins')"
primary-key="id" primary-key="id"
@ -14,8 +13,6 @@
(row) => { (row) => {
if (row.type === 'SEPARATOR') { if (row.type === 'SEPARATOR') {
return { name: 'bi-dash-lg' }; return { name: 'bi-dash-lg' };
} else if (row.type === 'ROUTE_ACTION') {
return { name: 'sym_o_crop_16_9' };
} else { } else {
return { name: row.icon }; return { name: row.icon };
} }
@ -39,7 +36,8 @@
} }
}, },
}, },
{ width: 100, name: 'order', label: $t('order'), align: 'right', sortable: false }, { width: 80, name: 'type', label: $t('type'), sortable: false, format: Formater.menuType() },
{ width: 80, name: 'order', label: $t('order'), align: 'right', sortable: false },
{ width: '100%', name: 'configurationFileUrl', label: $t('url'), sortable: false }, { width: '100%', name: 'configurationFileUrl', label: $t('url'), sortable: false },
]" ]"
:viewer="{ :viewer="{
@ -75,5 +73,5 @@
></w-grid> ></w-grid>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Environment } from 'platform-core'; import { Environment, Formater } from 'platform-core';
</script> </script>

47
io.sc.platform.developer.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.platform.developer.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

3
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java

@ -29,6 +29,7 @@ public class SpringbootRequestMappingWebController {
@GetMapping("dispatcherServletMappingDescriptions") @GetMapping("dispatcherServletMappingDescriptions")
@ResponseBody @ResponseBody
@SuppressWarnings("unchecked")
public Page<MappingWrapper> dispatcherServletMappingDescriptions(QueryParameter queryParameter){ public Page<MappingWrapper> dispatcherServletMappingDescriptions(QueryParameter queryParameter){
List<MappingWrapper> result =new ArrayList<>(); List<MappingWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings(); ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
@ -69,6 +70,7 @@ public class SpringbootRequestMappingWebController {
@GetMapping("filterRegistrationMappingDescriptions") @GetMapping("filterRegistrationMappingDescriptions")
@ResponseBody @ResponseBody
@SuppressWarnings("unchecked")
public Page<FilterWrapper> filterRegistrationMappingDescriptions(QueryParameter queryParameter){ public Page<FilterWrapper> filterRegistrationMappingDescriptions(QueryParameter queryParameter){
List<FilterWrapper> result =new ArrayList<>(); List<FilterWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings(); ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
@ -97,6 +99,7 @@ public class SpringbootRequestMappingWebController {
@GetMapping("servletRegistrationMappingDescriptions") @GetMapping("servletRegistrationMappingDescriptions")
@ResponseBody @ResponseBody
@SuppressWarnings("unchecked")
public Page<ServletWrapper> servletRegistrationMappingDescriptions(QueryParameter queryParameter){ public Page<ServletWrapper> servletRegistrationMappingDescriptions(QueryParameter queryParameter){
List<ServletWrapper> result =new ArrayList<>(); List<ServletWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings(); ApplicationMappings applicationMappings =mappingsEndpoint.mappings();

4
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/AgentServiceImpl.java

@ -58,7 +58,7 @@ public class AgentServiceImpl extends DaoServiceImpl<AgentEntity, String, AgentR
@Override @Override
public AgentEntity agree(String agentId) { public AgentEntity agree(String agentId) {
AgentEntity agent =repository.getOne(agentId); AgentEntity agent =this.findById(agentId);
if(agent!=null) { if(agent!=null) {
agent.setEffective(true); agent.setEffective(true);
return repository.save(agent); return repository.save(agent);
@ -68,7 +68,7 @@ public class AgentServiceImpl extends DaoServiceImpl<AgentEntity, String, AgentR
@Override @Override
public AgentEntity reject(String agentId, String comments) { public AgentEntity reject(String agentId, String comments) {
AgentEntity agent =repository.getOne(agentId); AgentEntity agent =this.findById(agentId);
if(agent!=null) { if(agent!=null) {
agent.setEffective(false); agent.setEffective(false);
agent.setComments(comments); agent.setComments(comments);

16
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/FlowableModelerServiceImpl.java

@ -1,11 +1,8 @@
package io.sc.platform.flowable.service.impl; package io.sc.platform.flowable.service.impl;
import java.util.Collection;
import java.util.Map;
import io.sc.platform.flowable.jpa.entity.ProcessEntity; import io.sc.platform.flowable.jpa.entity.ProcessEntity;
import io.sc.platform.flowable.jpa.repository.ProcessEntityRepository;
import io.sc.platform.flowable.service.FlowableModelerService; import io.sc.platform.flowable.service.FlowableModelerService;
import io.sc.platform.flowable.service.ProcessEntityService;
import io.sc.platform.flowable.support.BpmnModelWrapper; import io.sc.platform.flowable.support.BpmnModelWrapper;
import io.sc.platform.flowable.util.BpmnConverterUtil; import io.sc.platform.flowable.util.BpmnConverterUtil;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
@ -15,6 +12,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Collection;
import java.util.Map;
@Service @Service
public class FlowableModelerServiceImpl implements FlowableModelerService { public class FlowableModelerServiceImpl implements FlowableModelerService {
private static final String DEFAULT_MODEL_XML ="<?xml version='1.0' encoding='UTF-8'?>\n" + private static final String DEFAULT_MODEL_XML ="<?xml version='1.0' encoding='UTF-8'?>\n" +
@ -26,12 +26,12 @@ public class FlowableModelerServiceImpl implements FlowableModelerService {
" </bpmndi:BPMNPlane>\n" + " </bpmndi:BPMNPlane>\n" +
" </bpmndi:BPMNDiagram>\n" + " </bpmndi:BPMNDiagram>\n" +
"</definitions>"; "</definitions>";
@Autowired private ProcessEntityRepository repository; @Autowired private ProcessEntityService processEntityService;
@Override @Override
public BpmnModelWrapper getModelJson(String id) throws Exception { public BpmnModelWrapper getModelJson(String id) throws Exception {
if(StringUtils.hasText(id)){ if(StringUtils.hasText(id)){
ProcessEntity entity =repository.getOne(id); ProcessEntity entity =processEntityService.findById(id);
if(entity!=null){ if(entity!=null){
BpmnModel model = BpmnConverterUtil.xml2BpmnModel(entity.getXml()); BpmnModel model = BpmnConverterUtil.xml2BpmnModel(entity.getXml());
@ -57,14 +57,14 @@ public class FlowableModelerServiceImpl implements FlowableModelerService {
String jsonXml =values.get("json_xml"); String jsonXml =values.get("json_xml");
if(StringUtils.hasText(id)){ if(StringUtils.hasText(id)){
ProcessEntity entity =repository.getOne(id); ProcessEntity entity =processEntityService.findById(id);
if(entity!=null){ if(entity!=null){
//将修改后的流程定义转成 xml 进行存储 //将修改后的流程定义转成 xml 进行存储
entity.setXml(getModifiedBpmnModelXml(entity,jsonXml)); entity.setXml(getModifiedBpmnModelXml(entity,jsonXml));
entity.setKey(key); entity.setKey(key);
entity.setName(name); entity.setName(name);
entity.setDescription(description); entity.setDescription(description);
repository.save(entity); processEntityService.getRepository().save(entity);
} }
} }
} }

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessEntityServiceImpl.java

@ -116,7 +116,7 @@ public class ProcessEntityServiceImpl extends DaoServiceImpl<ProcessEntity, Stri
@Override @Override
public void deploy(String id) throws Exception { public void deploy(String id) throws Exception {
ProcessEntity entity =repository.getOne(id); ProcessEntity entity =this.findById(id);
if(entity!=null){ if(entity!=null){
Deployment deployment =repositoryService.createDeployment() Deployment deployment =repositoryService.createDeployment()
.addString(entity.getName() + ".bpmn", entity.getXml()) .addString(entity.getName() + ".bpmn", entity.getXml())

2
io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml

@ -10,7 +10,7 @@
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
" "
> >
<changeSet id="io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL" author="framework"> <changeSet id="io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL" author="platform">
<!-- 流程定义表 --> <!-- 流程定义表 -->
<createTable tableName="SYS_PROCESS" remarks="流程定义表"> <createTable tableName="SYS_PROCESS" remarks="流程定义表">
<column name="ID_" type="NVARCHAR(36)" remarks="ID"> <column name="ID_" type="NVARCHAR(36)" remarks="ID">

4
io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt

@ -150,8 +150,8 @@ subprojects {
} }
clean { clean {
delete 'dist' //删除前端自动生成的资源目录 //delete 'dist' //删除前端自动生成的资源目录
delete 'bin' //删除 eclipse 编译的 bin 目录 //delete 'bin' //删除 eclipse 编译的 bin 目录
delete 'build' //删除 gradle 构建目录 delete 'build' //删除 gradle 构建目录
} }

2
io.sc.platform.gradle/templates/pgp/setup/gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.1.47 platform_version=8.1.47
platform_plugin_version=8.1.47 platform_plugin_version=8.1.47
platform_core_frontend_version=8.1.308 platform_core_frontend_version=8.1.312
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.lcdp.frontend", "name": "io.sc.platform.lcdp.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

47
io.sc.platform.lcdp.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.platform.lcdp.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

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

@ -1,6 +1,6 @@
{ {
"name": "io.sc.platform.mvc.frontend", "name": "io.sc.platform.mvc.frontend",
"version": "8.1.46", "version": "8.1.47",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.308", "platform-core": "8.1.312",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

47
io.sc.platform.mvc.frontend/util-components-generator.cjs

@ -1,36 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const Json5 =require('json5'); const Json5 =require('json5');
const packageJsonObject =JSON.parse(fs.readFileSync('./package.json').toString());
/**
* 特殊处理, 用于解决 @maxgraph/core 不能正常使用的问题, 会出现以下错误:
* ERROR in ./node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist/index.js 174:0-24
* Module not found: Error: Can't resolve './types' in 'io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.12.0/node_modules/@maxgraph/core/dist'
* Did you mean 'types.js'?
* BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
* (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
* The extension in the request is mandatory for it to be fully specified.
* Add the extension to the request.
*
* 解决方案:
* 1. 删除 node_modules/@maxgraph/core/package.json 文件中 [ "type" : "module" ] 属性
* 2. 删除 node_modules/.pnpm/@maxgraph+core@xxx/package.json 文件中 [ "type" : "module" ] 属性
*/
let path ='./node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
path ='./node_modules/.pnpm/@maxgraph+core@' + packageJsonObject['dependencies']['@maxgraph/core'] + '/node_modules/@maxgraph/core/package.json';
if(fs.existsSync(path)){
const packageJson =JSON.parse(fs.readFileSync(path).toString());
delete packageJson['type'];
fs.writeFileSync(path, JSON.stringify(packageJson, null, ' '));
}
/** /**
* 用于自动生成前端组件 * 用于自动生成前端组件
* 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件 * 通过 src/routes/routes.json 文件构建 src/components/index.ts 文件
@ -78,20 +48,3 @@ function generateComonents(route){
} }
} }
} }
/**
* 判断一个文件是否存在
* @param {*} file 文件路径
* @returns 文件是否存在
*/
function isFileExisted(file) {
return new Promise((resolve, reject) => {
fs.access(file, (err) => {
if (err) {
reject(false);
} else {
resolve(true);
}
});
})
}

15
io.sc.platform.mvc.frontend/webpack.config.common.cjs

@ -87,6 +87,21 @@ module.exports = {
} }
] ]
}, },
// 解决 @maxgraph/core 的问题, 避免出现以下错误
// ERROR in ./node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist/index.js 175:0-24
// Module not found: Error: Can't resolve './types' in '/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/io.sc.platform.core.frontend/node_modules/.pnpm/@maxgraph+core@0.13.0/node_modules/@maxgraph/core/dist'
// Did you mean 'types.js'?
// BREAKING CHANGE: The request './types' failed to resolve only because it was resolved as fully specified
// (probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
// The extension in the request is mandatory for it to be fully specified.
{
test: /\.js$/,
include: /node_modules\/@maxgraph\/core/,
resolve:{
fullySpecified: false,
}
},
], ],
}, },

31
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java

@ -125,37 +125,32 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return update(request,response,id,entity); return update(request,response,id,entity);
} }
protected V update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity) throws Exception{
E updatedEntity =service.update(id,entity);
if(updatedEntity instanceof BaseEntity){
return ((BaseEntity<V>)updatedEntity).toVo();
}
return null;
}
/** /**
* 更新多个实体 * 更新多个实体
* @param request Http 请求对象 * @param request Http 请求对象
* @param response Http 响应对象 * @param response Http 响应对象
* @param entitys 实体对象集合 * @param entities 实体对象集合
* @return 更新后的实体 VO 对象 * @return 更新后的实体 VO 对象
* @throws Exception 违例 * @throws Exception 违例
*/ */
@AuditLog(action=AuditLogAction.UPDATE) @AuditLog(action=AuditLogAction.UPDATE)
@PutMapping("updates") @PutMapping("updates")
@ResponseBody @ResponseBody
public List<V> updates(HttpServletRequest request,HttpServletResponse response,@RequestBody List<E> entitys) throws Exception{ public List<V> updates(HttpServletRequest request,HttpServletResponse response,@RequestBody List<E> entities) throws Exception{
Map<ID, E> map = new HashMap<>(); Collections.reverse(entities);
List<E> list = new ArrayList<>(); List<E> list =service.update(entities);
if (entitys!=null && entitys.size() > 0) {
for(E entity: entitys) {
ID id = service.getRepository().getId(entity);
map.put(id, entity);
}
list = service.update(map);
}
return EntityVoUtil.toVo(list); return EntityVoUtil.toVo(list);
} }
protected V update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity) throws Exception{
E updatedEntity =service.update(id,entity);
if(updatedEntity instanceof BaseEntity){
return ((BaseEntity<V>)updatedEntity).toVo();
}
return null;
}
/** /**
* 通过唯一主键查询实体对象 * 通过唯一主键查询实体对象

3
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/support/FileDownloader.java

@ -1,5 +1,6 @@
package io.sc.platform.mvc.support; package io.sc.platform.mvc.support;
import io.sc.platform.core.Environment;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
@ -29,7 +30,7 @@ public class FileDownloader {
// 设置附件名称(通过浏览器直接下载时,可正常保存中文名称) // 设置附件名称(通过浏览器直接下载时,可正常保存中文名称)
response.setHeader("Content-Disposition", "attachment; filename=" + new String(name.getBytes("UTF-8"), "ISO8859-1")); response.setHeader("Content-Disposition", "attachment; filename=" + new String(name.getBytes("UTF-8"), "ISO8859-1"));
// 设置附件名称(通过 axios 下载时,可正常保存中文名称) // 设置附件名称(通过 axios 下载时,可正常保存中文名称)
response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(name)); response.setHeader("Content-Disposition-Url-Encode", "attachment; filename=" + URLEncoder.encode(name, Environment.DEFAULT_URL_ENCODE_NAME));
} }
BufferedInputStream bis = null; BufferedInputStream bis = null;
BufferedOutputStream bos = null; BufferedOutputStream bos = null;

1
io.sc.platform.orm/src/main/java/io/sc/platform/orm/converter/types/DesensitizeStringWrapperTypeDescriptor.java

@ -31,6 +31,7 @@ public class DesensitizeStringWrapperTypeDescriptor extends AbstractTypeDescript
} }
@Override @Override
@SuppressWarnings("unchecked")
public <X> X unwrap(DesensitizeStringWrapper value, Class<X> type, WrapperOptions options) { public <X> X unwrap(DesensitizeStringWrapper value, Class<X> type, WrapperOptions options) {
if(desensitizeFieldKey!=null){ if(desensitizeFieldKey!=null){
} }

4
io.sc.platform.orm/src/main/java/io/sc/platform/orm/entity/DesensitizedEntity.java

@ -0,0 +1,4 @@
package io.sc.platform.orm.entity;
public interface DesensitizedEntity {
}

3
io.sc.platform.orm/src/main/java/io/sc/platform/orm/repository/DaoRepository.java

@ -30,6 +30,7 @@ public interface DaoRepository<E,ID extends Serializable> extends JpaRepository<
public <S extends E> S save(S entity,boolean isSendEvent); public <S extends E> S save(S entity,boolean isSendEvent);
public <S extends E> List<S> saveAll(Iterable<S> entities, boolean isSendEvent); public <S extends E> List<S> saveAll(Iterable<S> entities, boolean isSendEvent);
public void delete(E entity,boolean isSendEvent); public void delete(E entity,boolean isSendEvent);
public void deleteInBatch(Iterable<E> entities,boolean isSendEvent); public void deleteAllInBatch(Iterable<E> entities,boolean isSendEvent);
public void deleteAllByIdInBatch(Iterable<ID> ids,boolean isSendEvent);
public void deleteAllInBatch(boolean isSendEvent); public void deleteAllInBatch(boolean isSendEvent);
} }

94
io.sc.platform.orm/src/main/java/io/sc/platform/orm/repository/impl/DaoRepositoryImpl.java

@ -14,17 +14,23 @@ import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.metamodel.ManagedType; import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import static org.springframework.data.jpa.repository.query.QueryUtils.*; import static org.springframework.data.jpa.repository.query.QueryUtils.*;
public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepository<E,ID> implements DaoRepository<E,ID> { public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepository<E,ID> implements DaoRepository<E,ID> {
private JpaEntityInformation<E, ID> jpaEntityInformation; private JpaEntityInformation<E, ID> jpaEntityInformation;
private EntityManager entityManager; private EntityManager entityManager;
private ApplicationContext applicationContext;
public DaoRepositoryImpl(Class<E> domainClass, EntityManager entityManager) { public DaoRepositoryImpl(Class<E> domainClass, EntityManager entityManager) {
super(domainClass, entityManager); super(domainClass, entityManager);
@ -34,6 +40,7 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
super(jpaEntityInformation, entityManager); super(jpaEntityInformation, entityManager);
this.jpaEntityInformation =jpaEntityInformation; this.jpaEntityInformation =jpaEntityInformation;
this.entityManager =entityManager; this.entityManager =entityManager;
this.applicationContext =Environment.getInstance().getApplicationContext();
} }
@Override @Override
@ -99,19 +106,23 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
Assert.notNull(entity, "Entity must not be null."); Assert.notNull(entity, "Entity must not be null.");
if (jpaEntityInformation.isNew(entity)) { if (jpaEntityInformation.isNew(entity)) {
entityManager.persist(entity); entityManager.persist(entity);
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity)); applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));
return entity; return entity;
} else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增 } else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增
setId(entity,null); setId(entity,null);
entityManager.persist(entity); entityManager.persist(entity);
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity)); applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));
return entity; return entity;
}else { }else {
E oldEntity = this.getReferenceById(getId(entity)); Optional<E> optional =this.findById(getId(entity));
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(), JpaEntityPersistentEventType.BEFORE_UPDATE, oldEntity, entity)); if(optional.isPresent()){
E oldEntity =optional.get();
applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(), JpaEntityPersistentEventType.BEFORE_UPDATE, oldEntity, entity));
S result = entityManager.merge(entity); S result = entityManager.merge(entity);
return result; return result;
} }
return entity;
}
} }
@Override @Override
@ -119,19 +130,23 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
public <S extends E> S save(S entity, boolean isSendEvent) { public <S extends E> S save(S entity, boolean isSendEvent) {
if (jpaEntityInformation.isNew(entity)) { if (jpaEntityInformation.isNew(entity)) {
entityManager.persist(entity); entityManager.persist(entity);
if(isSendEvent) {applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));} if(isSendEvent) {applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));}
return entity; return entity;
} else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增 } else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增
setId(entity,null); setId(entity,null);
entityManager.persist(entity); entityManager.persist(entity);
if(isSendEvent) {applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));} if(isSendEvent) {applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.AFTER_ADD,null, entity));}
return entity; return entity;
}else { }else {
E oldEntity =this.getReferenceById(getId(entity)); Optional<E> optional =this.findById(getId(entity));
if(isSendEvent) {applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_UPDATE,oldEntity, entity));} if(optional.isPresent()){
E oldEntity =optional.get();
if(isSendEvent) {applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_UPDATE,oldEntity, entity));}
S result = entityManager.merge(entity); S result = entityManager.merge(entity);
return result; return result;
} }
return entity;
}
} }
@Override @Override
@ -155,7 +170,7 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
@Transactional @Transactional
public void delete(E entity) { public void delete(E entity) {
Assert.notNull(entity, "The entity must not be null!"); Assert.notNull(entity, "The entity must not be null!");
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entity, null)); applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entity, null));
entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity)); entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
} }
@ -164,49 +179,52 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
public void delete(E entity,boolean isSendEvent) { public void delete(E entity,boolean isSendEvent) {
Assert.notNull(entity, "The entity must not be null!"); Assert.notNull(entity, "The entity must not be null!");
if(isSendEvent) { if(isSendEvent) {
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entity, null)); applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entity, null));
} }
entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity)); entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
} }
@Override @Override
@Transactional public void deleteAllInBatch(Iterable<E> entities, boolean isSendEvent) {
public void deleteInBatch(Iterable<E> entities) { Assert.notNull(entities, "Entities must not be null!");
Assert.notNull(entities, "The given Iterable of entities not be null!");
if (!entities.iterator().hasNext()) { if (!entities.iterator().hasNext()) {
return; return;
} }
E entity =entities.iterator().next(); E entity =entities.iterator().next();
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null)); if(isSendEvent) {
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager) applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null));
.executeUpdate(); }
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager).executeUpdate();
} }
@Override @Override
@Transactional public void deleteAllByIdInBatch(Iterable<ID> ids, boolean isSendEvent) {
public void deleteInBatch(Iterable<E> entities,boolean isSendEvent) { Assert.notNull(ids, "Ids must not be null!");
Assert.notNull(entities, "The given Iterable of entities not be null!"); if (!ids.iterator().hasNext()) {
if (!entities.iterator().hasNext()) {
return; return;
} }
E entity =entities.iterator().next(); if (jpaEntityInformation.hasCompositeId()) {
List<E> entities = new ArrayList<>();
// generate entity (proxies) without accessing the database.
ids.forEach(id -> entities.add(getReferenceById(id)));
deleteAllInBatch(entities,isSendEvent);
} else {
String queryString = String.format(DELETE_ALL_QUERY_BY_ID_STRING, jpaEntityInformation.getEntityName(),jpaEntityInformation.getIdAttribute().getName());
Query query = entityManager.createQuery(queryString);
/**
* Some JPA providers require {@code ids} to be a {@link Collection} so we must convert if it's not already.
*/
if (Collection.class.isInstance(ids)) {
query.setParameter("ids", ids);
} else {
Collection<ID> idsCollection = StreamSupport.stream(ids.spliterator(), false).collect(Collectors.toCollection(ArrayList::new));
query.setParameter("ids", idsCollection);
}
if(isSendEvent) { if(isSendEvent) {
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null)); applicationContext.publishEvent(new JpaEntityPersistentEvent(jpaEntityInformation.getJavaType(), JpaEntityPersistentEventType.BEFORE_DELETE_ALL, null, null));
} }
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager) query.executeUpdate();
.executeUpdate();
} }
@Override
@Transactional
public void deleteAllInBatch() {
String entityName =jpaEntityInformation.getEntityName();
Assert.hasText(entityName, "Entity name must not be null or empty!");
applicationContext().publishEvent(new JpaEntityPersistentEvent(jpaEntityInformation.getJavaType(),JpaEntityPersistentEventType.BEFORE_DELETE_ALL,null, null));
String sql =String.format("delete from %s x", entityName);
entityManager.createQuery(sql).executeUpdate();
} }
@Override @Override
@ -215,13 +233,9 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
String entityName =jpaEntityInformation.getEntityName(); String entityName =jpaEntityInformation.getEntityName();
Assert.hasText(entityName, "Entity name must not be null or empty!"); Assert.hasText(entityName, "Entity name must not be null or empty!");
if(isSendEvent) { if(isSendEvent) {
applicationContext().publishEvent(new JpaEntityPersistentEvent(jpaEntityInformation.getJavaType(),JpaEntityPersistentEventType.BEFORE_DELETE_ALL,null, null)); applicationContext.publishEvent(new JpaEntityPersistentEvent(jpaEntityInformation.getJavaType(),JpaEntityPersistentEventType.BEFORE_DELETE_ALL,null, null));
} }
String sql =String.format("delete from %s x", entityName); String sql =String.format("delete from %s x", entityName);
entityManager.createQuery(sql).executeUpdate(); entityManager.createQuery(sql).executeUpdate();
} }
private ApplicationContext applicationContext(){
return Environment.getInstance().getApplicationContext();
}
} }

2
io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/DaoService.java

@ -33,7 +33,7 @@ public interface DaoService<E,ID extends Serializable,R extends DaoRepository<E,
public void removeAll() throws Exception; public void removeAll() throws Exception;
public E update(ID id, E entity) throws Exception; public E update(ID id, E entity) throws Exception;
public List<E> update(Map<ID, E> entities) throws Exception; public List<E> update(List<E> entities) throws Exception;
public List<E> getDefaultValues() throws Exception; public List<E> getDefaultValues() throws Exception;
public void resetDefaultValues() throws Exception; public void resetDefaultValues() throws Exception;

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save