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. 37
      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. 34
      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. 18
      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. 106
      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 {
delete 'dist' //
delete 'bin' // eclipse bin
//delete 'dist' //
//delete 'bin' // eclipse bin
delete 'build' // gradle
}

4
erm.frontend/package.json

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

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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 {
if(StringUtils.hasText(libId)){
removeAllIndicators(libId);
LibEntity Lib =repository.getOne(libId);
LibEntity Lib =this.findById(libId);
if(Lib!=null){
final SqlBatcher sqlBatcher =new SqlBatcher("insert into RP_INDICATOR_LIB(INDICATOR_ID_,LIB_ID_) values(?,?)");
String query ="select ID_ from RP_INDICATOR";

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_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

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

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

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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;
@GetMapping("data")
@SuppressWarnings("unchecked")
public Page<CoeBinomialHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("modelId") String modelId,
@ -32,7 +33,7 @@ public class CoeBinomialHistoryWebController extends RestCrudController<CoeBinom
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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;
@GetMapping("data")
@SuppressWarnings("unchecked")
public Page<CoeChiSquareHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("modelId") String modelId,
@ -32,7 +33,7 @@ public class CoeChiSquareHistoryWebController extends RestCrudController<CoeChiS
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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
@RequestMapping("/api/mv/viewer/sample")
@SuppressWarnings("unchecked")
public class GeneralSampleHistoryWebController extends RestCrudController<GeneralSampleHistoryVo,GeneralSampleHistory, GeneralSampleHistoryId, GeneralSampleHistoryRepository, GeneralSampleHistoryService> {
@GetMapping("data")
public Page<GeneralSampleHistoryVo> data(HttpServletRequest request,
@ -36,7 +37,7 @@ public class GeneralSampleHistoryWebController extends RestCrudController<Genera
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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;
@GetMapping("data")
@SuppressWarnings("unchecked")
public Page<ScCapHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@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;
@GetMapping("data")
@SuppressWarnings("unchecked")
public Page<ScKsHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("modelId") String modelId,
@ -52,7 +53,7 @@ public class ScKsHistoryWebController extends RestCrudController<ScKsHistoryVo,
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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")
@SuppressWarnings("unchecked")
public Page<ScRocHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("modelId") String modelId,
@ -51,7 +52,7 @@ public class ScRocHistoryWebController extends RestCrudController<ScRocHistoryVo
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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;
@GetMapping("data")
@SuppressWarnings("unchecked")
public Page<StPsiHistoryVo> data(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("modelId") String modelId,
@ -50,7 +51,7 @@ public class StPsiHistoryWebController extends RestCrudController<StPsiHistoryVo
QueryParameter queryParameter
) throws Exception {
if(!queryParameter.existsCriteria()){
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder();
CriteriaBuilder<ScRocHistory> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("modelId",modelId),
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;
}
@SuppressWarnings("all")
@Override
@SuppressWarnings("unchecked")
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception {
Object bean =applicationContext.getBean("reResourceService");
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;
public class JacksonObjectMapper {
@SuppressWarnings("deprecation")
public static ObjectMapper getDefaultObjectMapper(){
ObjectMapper result =new ObjectMapper();
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> 泛型类型
*/
@SuppressWarnings("all")
@SuppressWarnings("unchecked")
public static <T> T clone(T obj) throws ClassNotFoundException,IOException{
T cloneObj = null;
ObjectOutputStream oos = null;

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

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.rule.frontend",
"version": "8.1.46",
"version": "8.1.47",
"description": "",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.308",
"platform-core": "8.1.312",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"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":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"},
/*/*/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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;
static {
valueTypeAndMessages.add(new KeyValue("java.lang.Boolean","java.lang.Boolean"));
valueTypeAndMessages.add(new KeyValue("java.lang.Long","java.lang.Long"));
valueTypeAndMessages.add(new KeyValue("java.lang.Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue("Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue("java.math.BigDecimal","java.math.BigDecimal"));
valueTypeAndMessages.add(new KeyValue("java.lang.String","java.lang.String"));
valueTypeAndMessages.add(new KeyValue("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("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("List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue("java.lang.List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue("Map","java.lang.Map"));
valueTypeAndMessages.add(new KeyValue("java.lang.Map","java.lang.Map"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Boolean","java.lang.Boolean"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Long","java.lang.Long"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue<String,String>("Float","java.lang.Float"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.math.BigDecimal","java.math.BigDecimal"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.String","java.lang.String"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.util.Date","java.util.Date"));
valueTypeAndMessages.add(new KeyValue<String,String>("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.RuleResult","io.sc.engine.rule.core.classes.RuleResult"));
valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.SingleRuleResult","io.sc.engine.rule.core.classes.SingleRuleResult"));
valueTypeAndMessages.add(new KeyValue<String,String>("List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("Map","java.lang.Map"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Map","java.lang.Map"));
}
@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
public DictionaryEntity deepClone(String id) throws Exception {
if(StringUtils.hasText(id)) {
DictionaryEntity entity =repository.getOne(id);
DictionaryEntity entity =this.findById(id);
if(entity!=null) {
DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone();
cloneEntity.clearId();
@ -184,7 +184,7 @@ public class DictionaryServiceImpl extends DaoServiceImpl<DictionaryEntity, Stri
@Override
public DictionaryEntity deepCloneNew(String id) throws Exception {
if(StringUtils.hasText(id)) {
DictionaryEntity entity =repository.getOne(id);
DictionaryEntity entity =this.findById(id);
if(entity!=null) {
DictionaryEntity cloneEntity =(DictionaryEntity)entity.deepClone();
cloneEntity.clearId();

37
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 java.util.List;
import java.util.Optional;
@Service("reDictionaryOptionItemService")
public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String, EnumItemRepository> implements EnumItemService{
@ -22,13 +23,16 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
throw exceptionProvider.getCreateNullObjectException();
}
String dictionaryId =entity.getDictionary().getId();
EnumDictionaryEntity dictionaryEntity =enumDictionaryRepository.getOne(dictionaryId);
if(dictionaryEntity!=null) {
List<EnumItemEntity> items =dictionaryEntity.getItems();
if(items!=null && items.size()>0) {
for(EnumItemEntity item : items) {
if(item.getValue().equals(entity.getValue()) || item.getTitle().equals(entity.getTitle())) {
throw new EnumItemEntityAlreadyExistsException();
Optional<EnumDictionaryEntity> optional =enumDictionaryRepository.findById(dictionaryId);
if(optional.isPresent()){
EnumDictionaryEntity dictionaryEntity =optional.get();
if(dictionaryEntity!=null) {
List<EnumItemEntity> items =dictionaryEntity.getItems();
if(items!=null && items.size()>0) {
for(EnumItemEntity item : items) {
if(item.getValue().equals(entity.getValue()) || item.getTitle().equals(entity.getTitle())) {
throw new EnumItemEntityAlreadyExistsException();
}
}
}
}
@ -52,14 +56,17 @@ public class EnumItemServiceImpl extends DaoServiceImpl<EnumItemEntity, String,
throw exceptionProvider.getUpdateNullNewObjectException();
}
String dictionaryId =entity.getDictionary().getId();
EnumDictionaryEntity dictionaryEntity =enumDictionaryRepository.getOne(dictionaryId);
if(dictionaryEntity!=null) {
List<EnumItemEntity> items =dictionaryEntity.getItems();
if(items!=null && items.size()>0) {
for(EnumItemEntity item : items) {
if(!item.getId().equals(entity.getId())) {
if(item.getValue().equals(entity.getValue()) || item.getTitle().equals(entity.getTitle())) {
throw new EnumItemEntityAlreadyExistsException();
Optional<EnumDictionaryEntity> optional =enumDictionaryRepository.findById(dictionaryId);
if(optional.isPresent()) {
EnumDictionaryEntity dictionaryEntity = optional.get();
if (dictionaryEntity != null) {
List<EnumItemEntity> items = dictionaryEntity.getItems();
if (items != null && items.size() > 0) {
for (EnumItemEntity item : items) {
if (!item.getId().equals(entity.getId())) {
if (item.getValue().equals(entity.getValue()) || item.getTitle().equals(entity.getTitle())) {
throw new EnumItemEntityAlreadyExistsException();
}
}
}
}

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) {
DictionaryEntity parent =entity.getParent();
if(parent!=null) {
DictionaryEntity parentEntity =dictionaryService.getRepository().getOne(parent.getId());
DictionaryEntity parentEntity =dictionaryService.findById(parent.getId());
if(parentEntity!=null) {
if(log.isDebugEnabled()) {log.debug("更新 [父数据字典] 最后修改日期");}
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) {
LibEntity libEntity =entity.getLib();
if(libEntity!=null) {
libEntity =libService.getRepository().getOne(libEntity.getId());
libEntity =libService.findById(libEntity.getId());
}
if(libEntity!=null) {
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) {
IndicatorEntity indicatorEntity =entity.getIndicator();
if(indicatorEntity!=null) {
indicatorEntity =indicatorService.getRepository().getOne(indicatorEntity.getId());
indicatorEntity =indicatorService.findById(indicatorEntity.getId());
}
if(indicatorEntity!=null) {
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) {
IndicatorEntity indicatorEntity =entity.getIndicator();
if(indicatorEntity!=null) {
indicatorEntity =indicatorService.getRepository().getOne(indicatorEntity.getId());
indicatorEntity =indicatorService.findById(indicatorEntity.getId());
}
if(indicatorEntity!=null) {
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) {
LibEntity parent =entity.getParent();
if(parent!=null) {
LibEntity parentEntity =libService.getRepository().getOne(parent.getId());
LibEntity parentEntity =libService.findById(parent.getId());
if(parentEntity!=null) {
parentEntity.setLastModifyDate(new Date());
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) {
ModelEntity parent =entity.getParent();
if(parent!=null) {
ModelEntity parentEntity =modelService.getRepository().getOne(parent.getId());
ModelEntity parentEntity =modelService.findById(parent.getId());
if(parentEntity!=null) {
parentEntity.setLastModifyDate(new Date());
modelService.getRepository().save(parentEntity);
@ -54,7 +54,7 @@ public class ModelEntityEventHandler extends AbstractJpaEntityPersistentEventHan
}else {
ResourceEntity resource =entity.getResource();
if(resource!=null) {
ResourceEntity resourceEntity =resourceService.getRepository().getOne(resource.getId());
ResourceEntity resourceEntity =resourceService.findById(resource.getId());
resourceEntity.setLastModifyDate(new Date());
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) {
ModelEntity parameterEntity =entity.getModel();
if(parameterEntity!=null) {
parameterEntity =modelService.getRepository().getOne(parameterEntity.getId());
parameterEntity =modelService.findById(parameterEntity.getId());
}
if(parameterEntity!=null) {
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) {
ParameterEntity parameterEntity =entity.getParameter();
if(parameterEntity!=null) {
parameterEntity =parameterService.getRepository().getOne(parameterEntity.getId());
parameterEntity =parameterService.findById(parameterEntity.getId());
}
if(parameterEntity!=null) {
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) {
ParameterEntity parameterEntity =entity.getParameter();
if(parameterEntity!=null) {
parameterEntity =parameterService.getRepository().getOne(parameterEntity.getId());
parameterEntity =parameterService.findById(parameterEntity.getId());
}
if(parameterEntity!=null) {
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) {
ResourceEntity resourceEntity =entity.getResource();
if(resourceEntity!=null) {
resourceEntity =resourceService.getRepository().getOne(resourceEntity.getId());
resourceEntity =resourceService.findById(resourceEntity.getId());
}
if(resourceEntity!=null) {
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) {
DictionaryEntity dictionaryEntityEntity =entity.getDictionary();
if(dictionaryEntityEntity!=null) {
dictionaryEntityEntity =dictionaryService.getRepository().getOne(dictionaryEntityEntity.getId());
dictionaryEntityEntity =dictionaryService.findById(dictionaryEntityEntity.getId());
}
if(dictionaryEntityEntity!=null) {
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)) {
return Collections.emptyList();
}
IndicatorProcessorVo processorVo =repository.getReferenceById(processorId).toVo();
IndicatorProcessorVo processorVo =this.findById(processorId).toVo();
if(processorVo==null){
return Collections.emptyList();
}
@ -275,12 +275,12 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl<IndicatorProce
if(StringUtils.hasText(sql)) {
Map<String,String> mapping =request.getSqlParameterValueMap();
String replacedSql = ExpressionReplacer.replace(sql, mapping);
return jdbcTemplate.query(replacedSql, new Object[] {}, new ResultSetExtractor<SqlQueryResult>() {
return jdbcTemplate.query(replacedSql, new ResultSetExtractor<SqlQueryResult>() {
@Override
public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException {
return SqlQueryResult.from(rs);
}
});
},new Object[] {});
}
}
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
public IndicatorEntity deepClone(String indicatorId) throws Exception {
if(StringUtils.hasText(indicatorId)) {
IndicatorEntity parameter =repository.getOne(indicatorId);
IndicatorEntity parameter =this.findById(indicatorId);
if(parameter!=null) {
IndicatorEntity entity =(IndicatorEntity)parameter.deepClone();
entity.clearId();
@ -364,7 +364,7 @@ public class IndicatorServiceImpl extends DaoServiceImpl<IndicatorEntity, String
if(!StringUtils.hasText(indicatorId)) {
return Collections.emptyList();
}
IndicatorEntity indicator =repository.getOne(indicatorId);
IndicatorEntity indicator =this.findById(indicatorId);
if(indicator==null){
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
public ModelEntity findRootModelByModelId(String modelId) {
ModelEntity modelEntity =repository.getOne(modelId);
ModelEntity modelEntity =this.findById(modelId);
if(modelEntity!=null) {
while(modelEntity.getParent()!=null) {
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)) {
return Collections.emptyList();
}
ParameterProcessorVo processorVo =repository.getReferenceById(processorId).toVo();
ParameterProcessorVo processorVo =this.findById(processorId).toVo();
if(processorVo==null){
return Collections.emptyList();
}
@ -298,7 +298,7 @@ public class ParameterProcessorServiceImpl
@Override
public void importFromCsv(String parameterId, String csvContent, String splitChar) throws Exception {
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())) {
List<String> lines =IOUtils.readLines(new ByteArrayInputStream(csvContent.getBytes("UTF-8")), "UTF-8");
if(lines!=null && lines.size()>0) {
@ -361,12 +361,12 @@ public class ParameterProcessorServiceImpl
if(StringUtils.hasText(sql)) {
Map<String,String> mapping =request.getSqlParameterValueMap();
String replacedSql =ExpressionReplacer.replace(sql, mapping);
return jdbcTemplate.query(replacedSql, new Object[] {}, new ResultSetExtractor<SqlQueryResult>() {
return jdbcTemplate.query(replacedSql, new ResultSetExtractor<SqlQueryResult>() {
@Override
public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException {
return SqlQueryResult.from(rs);
}
});
},new Object[] {});
}
}
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
public ParameterEntity deepClone(String parameterId) throws Exception {
if(StringUtils.hasText(parameterId)) {
ParameterEntity parameter =repository.getOne(parameterId);
ParameterEntity parameter =this.findById(parameterId);
if(parameter!=null) {
ParameterEntity entity =(ParameterEntity)parameter.deepClone();
entity.clearId();
@ -435,7 +435,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(!StringUtils.hasText(parameterId)) {
return Collections.emptyList();
}
ParameterEntity parameter =repository.getOne(parameterId);
ParameterEntity parameter =this.findById(parameterId);
if(parameter==null){
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
public ResourceEntity deepClone(String id) throws Exception {
if(StringUtils.hasText(id)) {
ResourceEntity entity =repository.getOne(id);
ResourceEntity entity =this.findById(id);
if(entity!=null) {
ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone();
cloneEntity.clearId();
@ -286,7 +286,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
@Transactional
public ResourceEntity deepCloneNew(String id) throws Exception {
if(StringUtils.hasText(id)) {
ResourceEntity entity =repository.getOne(id);
ResourceEntity entity =this.findById(id);
if(entity!=null) {
ResourceEntity cloneEntity =(ResourceEntity)entity.deepClone();
cloneEntity.clearId();
@ -827,7 +827,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
private void updateResourceAndRoleRelationship(String roleId,String 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) {
//如果存在 资源-角色关系表中存在某个角色,表示该角色已经配置了资源访问权限,对于该角色新建的资源,需要也赋予响应的权限,否则会出现
//当前用户新建的资源无法查看到的问题

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.TestCaseParameterWrapper;
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.support.CriteriaBuilder;
import io.sc.platform.orm.service.support.QueryParameter;
@ -89,12 +90,12 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
private GroovyScriptEngineService groovyScriptEngineService =new GroovyScriptEngineServiceImpl();
@Override
@SuppressWarnings("unchecked")
public Page<TestCaseEntity> findByOwnerId(String ownerId,QueryParameter queryParameter) throws Exception {
CriteriaBuilder<TestCaseEntity> cb =new CriteriaBuilder();
CriteriaBuilder<TestCaseEntity> cb =new CriteriaBuilder<>();
queryParameter.addCriteria(cb.and(
cb.equals("ownerId",ownerId)
));
//queryParameter.addCriterias(new CriteriaBuilder().equals("ownerId",ownerId).getCriteria());
return this.query(queryParameter);
}
@ -118,7 +119,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
@Override
public TestCaseEntity deepClone(String testCaseId) throws Exception {
if(StringUtils.hasText(testCaseId)) {
TestCaseEntity entity =repository.getOne(testCaseId);
TestCaseEntity entity =this.findById(testCaseId);
if(entity!=null) {
TestCaseEntity _entity =(TestCaseEntity)entity.deepClone();
_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"));
// 设置附件名称(通过 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.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"));
// 设置附件名称(通过 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.close();

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

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.st.frontend",
"version": "8.1.46",
"version": "8.1.47",
"description": "",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.308",
"platform-core": "8.1.312",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"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 });
}
}
console.log(factorDefineOptionsRef.value);
factorDefineOptionsRef.value = options;
}
});

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

@ -154,7 +154,6 @@
},
],
};
console.log(echartsOptionRef);
}
"
></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 });
}
}
console.log(factorDefineOptionsRef.value);
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 });
}
}
console.log(factorDefineOptionsRef.value);
factorDefineOptionsRef.value = options;
}
});

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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",
"version": "8.1.308",
"version": "8.1.312",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"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 :title="$t('graph.toolbar.actions.path')" stretch flat icon="bi-bezier2" padding="4px 10px"> </q-btn-dropdown>
</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>
<div style="height: 100%">
<q-list>
<q-expansion-item label="组件" model-value="true">
<q-expansion-item label="组件">
<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>
@ -46,11 +46,22 @@
<q-splitter v-model="splitterRightWidthRef" unit="px" reverse style="height: 100%">
<template #before>
<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>
</template>
<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-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')" />
@ -68,53 +79,38 @@
</div>
</template>
<script setup lang="ts">
import { onMounted, vue, ref } from 'vue';
import { type CellStyle, Graph, InternalEvent } from '@maxgraph/core';
import { ref, onMounted } from 'vue';
import { Graph } from '@maxgraph/core';
import { PlatformGraph, PlatformGeometryClass } from './base/PlatformGraph';
const splitterLeftWidthRef = ref(150);
const splitterRightWidthRef = ref(300);
const currentSelectedTabNameRef = ref('properties');
const graphContainerRef = ref();
onMounted(() => {
const container = <HTMLElement>document.getElementById('graph-container');
// Disables the built-in context menu
InternalEvent.disableContextMenu(container);
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 graph: Graph = new PlatformGraph(graphContainerRef.value);
graph.setConnectable(true);
graph.getStylesheet().getDefaultEdgeStyle().edgeStyle = 'orthogonalEdgeStyle';
const parent = graph.getDefaultParent();
// Adds cells to the model in a single step
graph.batchUpdate(() => {
const vertex01 = graph.insertVertex({
const v1 = graph.insertVertex({
parent,
position: [10, 10],
size: [100, 100],
value: 'rectangle',
value: 'Hello,',
position: [20, 20],
size: [80, 30],
});
const vertex02 = graph.insertVertex({
const v2 = graph.insertVertex({
parent,
position: [350, 90],
size: [50, 50],
style: {
fillColor: 'orange',
shape: 'ellipse',
verticalAlign: 'top',
verticalLabelPosition: 'bottom',
},
value: 'ellipse',
value: 'World!',
position: [200, 150],
size: [80, 30],
});
graph.insertEdge({
parent,
source: vertex01,
target: vertex02,
value: 'edge',
style: {
edgeStyle: 'orthogonalEdgeStyle',
rounded: true,
},
value: '',
source: v1,
target: v2,
});
});
});

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',
}"
>
<ExpansionMenuItem v-if="$gc.theme.sider.isSiderExpaned" :menus="menus"></ExpansionMenuItem>
<IconMenuItem v-else :menus="menus"></IconMenuItem>
<ExpansionMenuItem v-if="$gc.theme.sider.isSiderExpaned" :menus="SessionManager.getSession().menus"></ExpansionMenuItem>
<IconMenuItem v-else :menus="SessionManager.getSession().menus"></IconMenuItem>
</q-scroll-area>
</template>
@ -15,6 +15,4 @@
import ExpansionMenuItem from './ExpansionMenuItem.vue';
import IconMenuItem from './IconMenuItem.vue';
import { SessionManager } from '@/platform';
const menus = SessionManager.getSession().menus;
</script>

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

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

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

@ -62,7 +62,7 @@ class ApplicationInitializer {
// 构建路由
SessionManager.setRoutes(userSession.routes);
RouterManager.setLocalRoutes(parameter.localRoutes);
RouterManager.buildRoutes(toRaw(userSession.routes));
RouterManager.buildRoutes(userSession.routes);
// 加载远程入口
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 { PConst } from '@/platform/PConst';
import { Environment } from '@/platform/plugin/environment';
@ -9,12 +10,12 @@ import { axios } from '@/platform/plugin';
class SessionManager {
static #lastRequestDatetime = new Date().getTime();
static #session: UserSessionType = {
static #session: UserSessionType = reactive({
user: {},
menus: [],
routes: [],
remoteEntries: new Map<string, string>(),
};
});
/**
*
@ -62,6 +63,14 @@ class SessionManager {
return Environment.isMultiCorporationMode() && SessionManager.getUser()?.corporationCode === '_PRIMARY_';
}
/**
*
* @returns
*/
public static getMenus() {
return SessionManager.#session.menus;
}
/**
*
* @param menus

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

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

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

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

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

@ -56,17 +56,10 @@
<script setup lang="ts">
import Axios from 'axios';
import { ref, toRaw } from 'vue';
import {
Environment,
ApplicationInitializer,
AuthenticationManager,
SessionManager,
MenuManager,
ComponentManager,
RouterManager,
JavascriptLoader,
} from '@/platform';
import { useRouter } from 'vue-router';
import { Environment, ApplicationInitializer, AuthenticationManager, SessionManager, MenuManager, ComponentManager, RouterManager } from '@/platform';
const router = useRouter();
const session = SessionManager.getSession();
const dialogRef = ref();
const username = ref('');
@ -146,6 +139,18 @@ const loginFormSubmit = (event) => {
//
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",
"version": "8.1.308",
"version": "8.1.312",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -104,7 +104,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.308",
"platform-core": "8.1.312",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"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 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 文件
@ -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 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 文件
@ -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);
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_URL_ENCODE_NAME = StandardCharsets.UTF_8.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_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")
public class EnumWebController {
@GetMapping("list/{type}")
@SuppressWarnings("unchecked")
public Option[] list(@PathVariable(name = "type",required = false) String type) throws Exception{
if(StringUtils.hasText(type)){
Class<?> clazz =Class.forName(type);
@ -46,6 +47,7 @@ public class EnumWebController {
return Collections.emptyMap();
}
@SuppressWarnings("unchecked")
private Option<String>[] convert(Enum<?>[] enums){
Option<String>[] result =new Option[enums.length];
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",
"version": "8.1.46",
"version": "8.1.47",
"description": "",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.308",
"platform-core": "8.1.312",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"vue": "3.4.31",

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

@ -1,7 +1,6 @@
<template>
<w-grid
:tree="true"
dense-body
:title="$t('menu.developer.plugin.menus')"
:data-url="Environment.apiContextPath('/api/system/menu/getAllMenuPlugins')"
primary-key="id"
@ -14,8 +13,6 @@
(row) => {
if (row.type === 'SEPARATOR') {
return { name: 'bi-dash-lg' };
} else if (row.type === 'ROUTE_ACTION') {
return { name: 'sym_o_crop_16_9' };
} else {
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 },
]"
:viewer="{
@ -75,5 +73,5 @@
></w-grid>
</template>
<script setup lang="ts">
import { Environment } from 'platform-core';
import { Environment, Formater } from 'platform-core';
</script>

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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")
@ResponseBody
@SuppressWarnings("unchecked")
public Page<MappingWrapper> dispatcherServletMappingDescriptions(QueryParameter queryParameter){
List<MappingWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
@ -69,6 +70,7 @@ public class SpringbootRequestMappingWebController {
@GetMapping("filterRegistrationMappingDescriptions")
@ResponseBody
@SuppressWarnings("unchecked")
public Page<FilterWrapper> filterRegistrationMappingDescriptions(QueryParameter queryParameter){
List<FilterWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
@ -97,6 +99,7 @@ public class SpringbootRequestMappingWebController {
@GetMapping("servletRegistrationMappingDescriptions")
@ResponseBody
@SuppressWarnings("unchecked")
public Page<ServletWrapper> servletRegistrationMappingDescriptions(QueryParameter queryParameter){
List<ServletWrapper> result =new ArrayList<>();
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
public AgentEntity agree(String agentId) {
AgentEntity agent =repository.getOne(agentId);
AgentEntity agent =this.findById(agentId);
if(agent!=null) {
agent.setEffective(true);
return repository.save(agent);
@ -68,7 +68,7 @@ public class AgentServiceImpl extends DaoServiceImpl<AgentEntity, String, AgentR
@Override
public AgentEntity reject(String agentId, String comments) {
AgentEntity agent =repository.getOne(agentId);
AgentEntity agent =this.findById(agentId);
if(agent!=null) {
agent.setEffective(false);
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;
import java.util.Collection;
import java.util.Map;
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.ProcessEntityService;
import io.sc.platform.flowable.support.BpmnModelWrapper;
import io.sc.platform.flowable.util.BpmnConverterUtil;
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.util.StringUtils;
import java.util.Collection;
import java.util.Map;
@Service
public class FlowableModelerServiceImpl implements FlowableModelerService {
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:BPMNDiagram>\n" +
"</definitions>";
@Autowired private ProcessEntityRepository repository;
@Autowired private ProcessEntityService processEntityService;
@Override
public BpmnModelWrapper getModelJson(String id) throws Exception {
if(StringUtils.hasText(id)){
ProcessEntity entity =repository.getOne(id);
ProcessEntity entity =processEntityService.findById(id);
if(entity!=null){
BpmnModel model = BpmnConverterUtil.xml2BpmnModel(entity.getXml());
@ -57,14 +57,14 @@ public class FlowableModelerServiceImpl implements FlowableModelerService {
String jsonXml =values.get("json_xml");
if(StringUtils.hasText(id)){
ProcessEntity entity =repository.getOne(id);
ProcessEntity entity =processEntityService.findById(id);
if(entity!=null){
//将修改后的流程定义转成 xml 进行存储
entity.setXml(getModifiedBpmnModelXml(entity,jsonXml));
entity.setKey(key);
entity.setName(name);
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
public void deploy(String id) throws Exception {
ProcessEntity entity =repository.getOne(id);
ProcessEntity entity =this.findById(id);
if(entity!=null){
Deployment deployment =repositoryService.createDeployment()
.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
"
>
<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="流程定义表">
<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 {
delete 'dist' //删除前端自动生成的资源目录
delete 'bin' //删除 eclipse 编译的 bin 目录
//delete 'dist' //删除前端自动生成的资源目录
//delete 'bin' //删除 eclipse 编译的 bin 目录
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_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

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

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

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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",
"version": "8.1.46",
"version": "8.1.47",
"description": "",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.308",
"platform-core": "8.1.312",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"vue": "3.4.31",

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

@ -1,36 +1,6 @@
const fs = require('fs');
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 文件
@ -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);
}
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 response Http 响应对象
* @param entitys 实体对象集合
* @param entities 实体对象集合
* @return 更新后的实体 VO 对象
* @throws Exception 违例
*/
@AuditLog(action=AuditLogAction.UPDATE)
@PutMapping("updates")
@ResponseBody
public List<V> updates(HttpServletRequest request,HttpServletResponse response,@RequestBody List<E> entitys) throws Exception{
Map<ID, E> map = new HashMap<>();
List<E> list = new ArrayList<>();
if (entitys!=null && entitys.size() > 0) {
for(E entity: entitys) {
ID id = service.getRepository().getId(entity);
map.put(id, entity);
}
list = service.update(map);
}
public List<V> updates(HttpServletRequest request,HttpServletResponse response,@RequestBody List<E> entities) throws Exception{
Collections.reverse(entities);
List<E> list =service.update(entities);
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;
import io.sc.platform.core.Environment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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"));
// 设置附件名称(通过 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;
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
@SuppressWarnings("unchecked")
public <X> X unwrap(DesensitizeStringWrapper value, Class<X> type, WrapperOptions options) {
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> List<S> saveAll(Iterable<S> entities, 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);
}

106
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 javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.SingularAttribute;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
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.*;
public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepository<E,ID> implements DaoRepository<E,ID> {
private JpaEntityInformation<E, ID> jpaEntityInformation;
private EntityManager entityManager;
private ApplicationContext applicationContext;
public DaoRepositoryImpl(Class<E> domainClass, EntityManager entityManager) {
super(domainClass, entityManager);
@ -34,6 +40,7 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
super(jpaEntityInformation, entityManager);
this.jpaEntityInformation =jpaEntityInformation;
this.entityManager =entityManager;
this.applicationContext =Environment.getInstance().getApplicationContext();
}
@Override
@ -99,18 +106,22 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
Assert.notNull(entity, "Entity must not be null.");
if (jpaEntityInformation.isNew(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;
} else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增
setId(entity,null);
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;
}else {
E oldEntity = this.getReferenceById(getId(entity));
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(), JpaEntityPersistentEventType.BEFORE_UPDATE, oldEntity, entity));
S result = entityManager.merge(entity);
return result;
Optional<E> optional =this.findById(getId(entity));
if(optional.isPresent()){
E oldEntity =optional.get();
applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(), JpaEntityPersistentEventType.BEFORE_UPDATE, oldEntity, entity));
S result = entityManager.merge(entity);
return result;
}
return entity;
}
}
@ -119,18 +130,22 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
public <S extends E> S save(S entity, boolean isSendEvent) {
if (jpaEntityInformation.isNew(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;
} else if("".equals(getId(entity))){//当单一主键为空字符串时,也认为需要新增
setId(entity,null);
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;
}else {
E oldEntity =this.getReferenceById(getId(entity));
if(isSendEvent) {applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_UPDATE,oldEntity, entity));}
S result =entityManager.merge(entity);
return result;
Optional<E> optional =this.findById(getId(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);
return result;
}
return entity;
}
}
@ -155,7 +170,7 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
@Transactional
public void delete(E entity) {
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));
}
@ -164,49 +179,52 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
public void delete(E entity,boolean isSendEvent) {
Assert.notNull(entity, "The entity must not be null!");
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));
}
@Override
@Transactional
public void deleteInBatch(Iterable<E> entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
public void deleteAllInBatch(Iterable<E> entities, boolean isSendEvent) {
Assert.notNull(entities, "Entities must not be null!");
if (!entities.iterator().hasNext()) {
return;
}
E entity =entities.iterator().next();
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null));
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager)
.executeUpdate();
if(isSendEvent) {
applicationContext.publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null));
}
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager).executeUpdate();
}
@Override
@Transactional
public void deleteInBatch(Iterable<E> entities,boolean isSendEvent) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
if (!entities.iterator().hasNext()) {
public void deleteAllByIdInBatch(Iterable<ID> ids, boolean isSendEvent) {
Assert.notNull(ids, "Ids must not be null!");
if (!ids.iterator().hasNext()) {
return;
}
E entity =entities.iterator().next();
if(isSendEvent) {
applicationContext().publishEvent(new JpaEntityPersistentEvent(entity.getClass(),JpaEntityPersistentEventType.BEFORE_DELETE,entities, null));
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) {
applicationContext.publishEvent(new JpaEntityPersistentEvent(jpaEntityInformation.getJavaType(), JpaEntityPersistentEventType.BEFORE_DELETE_ALL, null, null));
}
query.executeUpdate();
}
applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, jpaEntityInformation.getEntityName()), entities, entityManager)
.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
@ -215,13 +233,9 @@ public class DaoRepositoryImpl<E,ID extends Serializable> extends SimpleJpaRepos
String entityName =jpaEntityInformation.getEntityName();
Assert.hasText(entityName, "Entity name must not be null or empty!");
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);
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 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 void resetDefaultValues() throws Exception;

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

Loading…
Cancel
Save