Browse Source

1. 更新JPA实体字符串长度验证,从 254 -> 255

main
wangshaoping 1 month ago
parent
commit
2cb5f97f2f
  1. 1
      build-version.gradle
  2. 2
      build.gradle
  3. 2
      erm.frontend/package.json
  4. 2
      gradle.properties
  5. 2
      io.sc.engine.mv.frontend/package.json
  6. 8
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgCustomerDistribution.java
  7. 4
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgCutOffPoint.java
  8. 4
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgDataExtractor.java
  9. 12
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgThreshold.java
  10. 4
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/jpa/entity/RuntimeParameter.java
  11. 2
      io.sc.engine.rule.frontend/package.json
  12. 2
      io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue
  13. 2
      io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue
  14. 5
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  15. 2
      io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts
  16. 10
      io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts
  17. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/DictionaryEntity.java
  18. 5
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterWebController.java
  19. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterValidatorEntity.java
  20. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/PatternParameterValidatorEntity.java
  21. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterService.java
  22. 33
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterServiceImpl.java
  23. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterVo.java
  24. 10
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ResourceEntity.java
  25. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseEntity.java
  26. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseParameterEntity.java
  27. 2343
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json
  28. 2
      io.sc.engine.st.frontend/package.json
  29. 2
      io.sc.platform.core.frontend/package.json
  30. 2
      io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts
  31. 1
      io.sc.platform.core.frontend/src/platform/types/ConfigureType.ts
  32. 11
      io.sc.platform.core.frontend/src/platform/utils/Downloader.ts
  33. 4
      io.sc.platform.core.frontend/template-project/package.json
  34. 20
      io.sc.platform.core/src/main/java/io/sc/platform/core/constraints/IdentifierConstraint.java
  35. 40
      io.sc.platform.core/src/main/java/io/sc/platform/core/constraints/validator/IdentifierConstraintValidator.java
  36. 21
      io.sc.platform.core/src/main/java/io/sc/platform/core/validation/CodeValidator.java
  37. 43
      io.sc.platform.core/src/main/java/io/sc/platform/core/validation/annotation/Code.java
  38. 1
      io.sc.platform.core/src/main/resources/META-INF/platform/plugins/messages.json
  39. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints.properties
  40. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints_tw_CN.properties
  41. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints_zh_CN.properties
  42. 2
      io.sc.platform.developer.doc/package.json
  43. 2
      io.sc.platform.developer.frontend/package.json
  44. 1
      io.sc.platform.gradle/templates/pgp/setup/build-version.gradle
  45. 2
      io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt
  46. 2
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties
  47. 2
      io.sc.platform.lcdp.frontend/package.json
  48. 4
      io.sc.platform.lcdp.frontend/src/components/index.ts
  49. 6
      io.sc.platform.lcdp.frontend/src/routes/routes.json
  50. 2
      io.sc.platform.lcdp.frontend/src/views/excel-template/ExcelReport.vue
  51. 11
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateConfig.vue
  52. 358
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateConfigDialog.vue
  53. 131
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateGrid.vue
  54. 464
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateParamsDialog.vue
  55. 234
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateParamsSelectDialog.vue
  56. 34
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateReportDialog.vue
  57. 91
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateSetColumnParamsDialog.vue
  58. 250
      io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateSetForeachPropsDialog.vue
  59. 339
      io.sc.platform.lcdp.frontend/src/views/excel_template/luckysheet/LuckySheet.vue
  60. 319
      io.sc.platform.lcdp.frontend/src/views/excel_template/luckysheet/export.js
  61. 27
      io.sc.platform.lcdp.frontend/src/views/excel_template/template.ts
  62. 9
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java
  63. 12
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java
  64. 2
      io.sc.platform.license.keygen.frontend/package.json
  65. 2
      io.sc.platform.mvc.frontend/package.json
  66. 2
      io.sc.platform.scheduler.manager.frontend/package.json
  67. 2
      io.sc.platform.scheduler.manager.frontend/src/views/task/Task.vue
  68. 2
      io.sc.platform.security/src/main/java/io/sc/platform/security/jwt/JwtEncoderUtil.java
  69. 2
      io.sc.platform.system.frontend/package.json
  70. 10
      io.sc.platform.system/src/main/java/io/sc/platform/system/application/jpa/entity/ApplicationEntity.java
  71. 14
      io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java
  72. 2
      io.sc.standard.frontend/package.json
  73. 4
      io.sc.standard/src/main/java/io/sc/standard/jpa/entity/IndustryEntity.java
  74. 2
      io.sc.website/package.json

1
build-version.gradle

@ -15,6 +15,7 @@ ext['PlatformDependencyVersions'] =[
"org.codehaus.groovy:groovy-json" : "${groovy_version}", "org.codehaus.groovy:groovy-json" : "${groovy_version}",
"org.codehaus.groovy:groovy-sql" : "${groovy_version}", "org.codehaus.groovy:groovy-sql" : "${groovy_version}",
"org.codehaus.groovy:groovy-xml" : "${groovy_version}", "org.codehaus.groovy:groovy-xml" : "${groovy_version}",
"mysql:mysql-connector-java" : "${jdbc_mysql_version}",
]; ];
/*********************************************************************** /***********************************************************************

2
build.gradle

@ -59,7 +59,7 @@ subprojects {
// exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j" // exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j"
// exclude group: "org.slf4j", module: "slf4j-jdk14" // exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-nop" exclude group: "org.slf4j", module: "slf4j-nop"
exclude group: "com.mysql", module: "mysql-connector-j" //exclude group: "com.mysql", module: "mysql-connector-j"
if(PlatformDependencyVersions!=null && PlatformDependencyVersions.size()>0) { if(PlatformDependencyVersions!=null && PlatformDependencyVersions.size()>0) {
resolutionStrategy.eachDependency { DependencyResolveDetails detail -> resolutionStrategy.eachDependency { DependencyResolveDetails detail ->

2
erm.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.2.7 platform_version=8.2.7
platform_plugin_version=8.2.7 platform_plugin_version=8.2.7
platform_core_frontend_version=8.2.31 platform_core_frontend_version=8.2.33
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

8
io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgCustomerDistribution.java

@ -28,13 +28,13 @@ public class CfgCustomerDistribution extends AuditorEntity<CfgCustomerDistributi
private String id; private String id;
//模型标识 //模型标识
@Column(name="FD_MODEL_ID", length=254) @Column(name="FD_MODEL_ID", length=255)
@Size(max=254) @Size(max=255)
private String modelId; private String modelId;
//模型名称 //模型名称
@Column(name="FD_MODEL_NAME", length=254) @Column(name="FD_MODEL_NAME", length=255)
@Size(max=254) @Size(max=255)
private String modelName; private String modelName;
//分数段开始值_含该值 //分数段开始值_含该值

4
io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgCutOffPoint.java

@ -59,8 +59,8 @@ public class CfgCutOffPoint extends AuditorEntity<CfgCutOffPointVo> {
private String id; private String id;
//截断点配置名称 //截断点配置名称
@Column(name="FD_NAME", length=254) @Column(name="FD_NAME", length=255)
@Size(max=254) @Size(max=255)
private String name; private String name;
//截断点起始值 //截断点起始值

4
io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgDataExtractor.java

@ -23,11 +23,11 @@ public class CfgDataExtractor extends AuditorEntity<CfgDataExtractorVo> {
private String id; private String id;
//名称 //名称
@Column(name="FD_NAME", length=254) @Column(name="FD_NAME", length=255)
private String name; private String name;
//是否可用 //是否可用
@Column(name="FD_ENABLE", length=254) @Column(name="FD_ENABLE", length=255)
@Convert(converter= NumericBooleanConverter.class) @Convert(converter= NumericBooleanConverter.class)
private Boolean enable =true; private Boolean enable =true;

12
io.sc.engine.mv/src/main/java/io/sc/engine/mv/configure/jpa/entity/CfgThreshold.java

@ -24,27 +24,27 @@ public class CfgThreshold extends AuditorEntity<CfgThresholdVo> {
private String id; private String id;
//阈值名称 //阈值名称
@Column(name="FD_NAME", length=254) @Column(name="FD_NAME", length=255)
private String name; private String name;
//等级(越大越好) //等级(越大越好)
@Column(name="FD_LEVEL", length=254) @Column(name="FD_LEVEL", length=255)
private Integer level; private Integer level;
//颜色 //颜色
@Column(name="FD_COLOR", length=254) @Column(name="FD_COLOR", length=255)
private String color; private String color;
//阈值范围 //阈值范围
@Column(name="FD_RANGE", length=254) @Column(name="FD_RANGE", length=255)
private String range; private String range;
//阈值范围(定量) //阈值范围(定量)
@Column(name="FD_QUANTITATIVE_RANGE", length=254) @Column(name="FD_QUANTITATIVE_RANGE", length=255)
private String quantitativeRange; private String quantitativeRange;
//阈值范围(定性) //阈值范围(定性)
@Column(name="FD_QUALITATIVE_RANGE", length=254) @Column(name="FD_QUALITATIVE_RANGE", length=255)
private String qualitativeRange; private String qualitativeRange;
public CfgThreshold(){} public CfgThreshold(){}

4
io.sc.engine.mv/src/main/java/io/sc/engine/mv/viewer/jpa/entity/RuntimeParameter.java

@ -24,11 +24,11 @@ public class RuntimeParameter extends BaseEntity<RuntimeParameterVo> {
//运行时参数名称 //运行时参数名称
@Id @Id
@Column(name="FD_PARAM_NAME", length=254) @Column(name="FD_PARAM_NAME", length=255)
private String name; private String name;
//运行时参数值 //运行时参数值
@Column(name="FD_PARAM_VALUE", length=254) @Column(name="FD_PARAM_VALUE", length=255)
private String value; private String value;
//参数显示顺序号 //参数显示顺序号

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue

@ -198,7 +198,7 @@
return arg.selected; return arg.selected;
}, },
click: (arg) => { click: (arg) => {
Downloader.get(Environment.apiContextPath('/api/re/dictionary/export/' + arg.selected.id)); Downloader.get(Environment.apiContextPath('/api/re/dictionary/export/' + arg.selected.id), { loading: true });
}, },
}, },
]" ]"

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

@ -175,7 +175,7 @@
return args.selected; return args.selected;
}, },
click: (args: any) => { click: (args: any) => {
Downloader.get(Environment.apiContextPath('/api/re/lib/export/' + args.selected.id)); Downloader.get(Environment.apiContextPath('/api/re/lib/export/' + args.selected.id), { loading: true });
}, },
}, },
]" ]"

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

@ -34,6 +34,7 @@
icon: 'bi-tag', icon: 'bi-tag',
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'CONSTANT'); args.grid.getEditorForm().setFieldValue('type', 'CONSTANT');
args.grid.getEditorForm().setFieldValue('code', null);
}, },
}, },
'separator', 'separator',
@ -44,6 +45,7 @@
icon: 'bi-terminal', icon: 'bi-terminal',
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'IN'); args.grid.getEditorForm().setFieldValue('type', 'IN');
args.grid.getEditorForm().setFieldValue('code', null);
}, },
}, },
{ {
@ -53,6 +55,7 @@
icon: 'bi-list-check', icon: 'bi-list-check',
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'IN_OPTION'); args.grid.getEditorForm().setFieldValue('type', 'IN_OPTION');
args.grid.getEditorForm().setFieldValue('code', null);
args.grid.getEditorForm().setFieldValue('valueTypeSelect', 'java.lang.String'); args.grid.getEditorForm().setFieldValue('valueTypeSelect', 'java.lang.String');
}, },
}, },
@ -72,6 +75,7 @@
icon: 'bi-superscript', icon: 'bi-superscript',
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'INTERMEDIATE'); args.grid.getEditorForm().setFieldValue('type', 'INTERMEDIATE');
args.grid.getEditorForm().setFieldValue('code', null);
}, },
}, },
{ {
@ -81,6 +85,7 @@
icon: 'bi-shuffle', icon: 'bi-shuffle',
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'OUT'); args.grid.getEditorForm().setFieldValue('type', 'OUT');
args.grid.getEditorForm().setFieldValue('code', null);
}, },
}, },
'separator', 'separator',

2
io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts

@ -148,7 +148,7 @@ class NumberRange extends Processor {
{ name: 'minIncluded', label: $t('include'), type: 'w-checkbox' }, { name: 'minIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 }, { name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 },
{ name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' }, { name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 }, { name: 'value', label: $t('value'), type: 'w-text', colSpan: 3 },
], ],
}, },
}, },

10
io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts

@ -20,9 +20,11 @@ class ScoreCard extends Processor {
this.#numberRange = new NumberRange(Processor.SCORE_CARD, context); this.#numberRange = new NumberRange(Processor.SCORE_CARD, context);
if (this.targetType === Processor.PARAMETER) { if (this.targetType === Processor.PARAMETER) {
axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + this.context.target.id)).then((response) => { axios
this.#parameterOptionsRef.value = Tools.objects2Options(response.data, 'name', 'code'); .get(Environment.apiContextPath('/api/re/model/parameter/findParametersAndParentParametersByParameterId?parameterId=' + this.context.target.id))
}); .then((response) => {
this.#parameterOptionsRef.value = Tools.objects2Options(response.data, 'name', 'code');
});
} }
} }
@ -156,7 +158,7 @@ class ScoreCard extends Processor {
fields: [ fields: [
{ name: 'type', label: $t('type'), type: 'w-text', showIf: false }, { name: 'type', label: $t('type'), type: 'w-text', showIf: false },
{ colSpan: 7, name: 'code', label: $t('name'), type: 'w-select', options: this.#parameterOptionsRef.value }, { colSpan: 7, name: 'code', label: $t('name'), type: 'w-select', options: this.#parameterOptionsRef.value },
{ colSpan: 5, name: 'weight', label: $t('weight'), type: 'w-number', precision: 6 }, { colSpan: 5, name: 'weight', label: $t('weight'), type: 'w-number', precision: 6, defaultValue: 1.0 },
...this.#conditionRange.getEditorFields(), ...this.#conditionRange.getEditorFields(),
...this.#numberRange.getEditorFields(), ...this.#numberRange.getEditorFields(),
], ],

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/dictionary/entity/DictionaryEntity.java

@ -45,13 +45,13 @@ public class DictionaryEntity extends CorporationAuditorEntity<DictionaryVo> imp
protected String id; protected String id;
//代码 //代码
@Column(name="CODE_", length=254) @Column(name="CODE_", length=255)
@Size(max=254) @Size(max=255)
protected String code; protected String code;
//名称 //名称
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(max=254) @Size(max=255)
protected String name; protected String name;
//名称(字母) //名称(字母)

5
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterWebController.java

@ -37,6 +37,11 @@ public class ParameterWebController extends RestCrudController<ParameterVo,Param
return EntityVoUtil.toVo(service.findParametersByParameterId(parameterId)); return EntityVoUtil.toVo(service.findParametersByParameterId(parameterId));
} }
@GetMapping("findParametersAndParentParametersByParameterId")
public List<ParameterVo> findParametersAndParentParametersByParameterId(@RequestParam(name="parameterId",required = false)String parameterId) throws Exception {
return EntityVoUtil.toVo(service.findParametersAndParentParametersByParameterId(parameterId));
}
// @Override // @Override
// protected ResponseWrapper<ParameterEntity> iscFetch(HttpServletRequest request, HttpServletResponse response,ParameterEntity queryExampleEntity, QueryParameter queryParameter) throws Exception { // protected ResponseWrapper<ParameterEntity> iscFetch(HttpServletRequest request, HttpServletResponse response,ParameterEntity queryExampleEntity, QueryParameter queryParameter) throws Exception {
// List<ParameterEntity> result =new ArrayList<ParameterEntity>(); // List<ParameterEntity> result =new ArrayList<ParameterEntity>();

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterValidatorEntity.java

@ -53,8 +53,8 @@ public class ParameterValidatorEntity extends CorporationAuditorEntity<Parameter
protected ParameterEntity parameter; protected ParameterEntity parameter;
//描述 //描述
@Column(name="DESCRIPTION_", length=254) @Column(name="DESCRIPTION_", length=255)
@Size(max=254) @Size(max=255)
protected String description; protected String description;
//排序 //排序

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/PatternParameterValidatorEntity.java

@ -17,7 +17,7 @@ import javax.persistence.Entity;
@JsonTypeName("PATTERN") @JsonTypeName("PATTERN")
public class PatternParameterValidatorEntity extends ParameterValidatorEntity { public class PatternParameterValidatorEntity extends ParameterValidatorEntity {
//正则表达式 //正则表达式
@Column(name="PATTERN_",length=254) @Column(name="PATTERN_",length=255)
protected String pattern; protected String pattern;
@Override @Override

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

@ -34,6 +34,14 @@ public interface ParameterService extends DaoService<ParameterEntity, String, Pa
*/ */
public List<ParameterEntity> findParametersByParameterId(String parameterId) throws Exception; public List<ParameterEntity> findParametersByParameterId(String parameterId) throws Exception;
/**
* 通过参数ID查找参数列表及其父模型包含的输入参数列表
* @param parameterId 参数ID
* @return 参数实体列表
* @throws Exception 违例
*/
public List<ParameterEntity> findParametersAndParentParametersByParameterId(String parameterId) throws Exception;
/** /**
* 深度克隆模型参数实体 * 深度克隆模型参数实体
* @param parameterId 模型参数ID * @param parameterId 模型参数ID

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

@ -6,6 +6,7 @@ import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.util.CodeConvertor; import io.sc.engine.rule.core.util.CodeConvertor;
import io.sc.engine.rule.core.util.ExpressionReplacer; import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil; import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.engine.rule.server.common.service.support.Parameter;
import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity;
import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity;
import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity;
@ -33,6 +34,7 @@ import io.sc.platform.core.Environment;
import io.sc.platform.orm.entity.support.EntityChangedEventType; import io.sc.platform.orm.entity.support.EntityChangedEventType;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.util.EntityVoUtil; import io.sc.platform.orm.util.EntityVoUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.FileUtil; import io.sc.platform.util.FileUtil;
import org.dmg.pmml.DataType; import org.dmg.pmml.DataType;
import org.dmg.pmml.PMML; import org.dmg.pmml.PMML;
@ -102,6 +104,37 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
return findParametersByModelId(modelEntity.getId()); return findParametersByModelId(modelEntity.getId());
} }
@Override
public List<ParameterEntity> findParametersAndParentParametersByParameterId(String parameterId) throws Exception {
List<ParameterEntity> result =new ArrayList<>();
if(!StringUtils.hasText(parameterId)){
return Collections.emptyList();
}
ParameterEntity parameterEntity =this.findById(parameterId);
if(parameterEntity==null){
return Collections.emptyList();
}
ModelEntity modelEntity =parameterEntity.getModel();
if(modelEntity==null){
return Collections.emptyList();
}
result.addAll(findParametersByModelId(modelEntity.getId()));
//父模型参数
ModelEntity parentModelEntity =modelEntity.getParent();
while(parentModelEntity!=null){
List<ParameterEntity> parentParameterEntities =parentModelEntity.getParameters();
if(CollectionUtil.hasElements(parentParameterEntities)){
for(ParameterEntity entity : parentParameterEntities) {
result.add(entity);
}
}
parentModelEntity =parentModelEntity.getParent();
}
return result;
}
@Override @Override
@Transactional @Transactional
public ParameterEntity add(ParameterEntity entity) throws Exception { public ParameterEntity add(ParameterEntity entity) throws Exception {

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterVo.java

@ -42,7 +42,7 @@ public class ParameterVo extends CorporationAuditorVo {
protected Boolean valueTypeIsList; protected Boolean valueTypeIsList;
//默认值 //默认值
@Column(name="FD_DEFAULT_VALUE", length=254) @Column(name="FD_DEFAULT_VALUE", length=255)
protected String defaultValue; protected String defaultValue;
//排序 //排序

10
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ResourceEntity.java

@ -8,6 +8,7 @@ import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.server.resource.vo.ResourceVo; import io.sc.engine.rule.server.resource.vo.ResourceVo;
import io.sc.engine.rule.server.testcase.entity.ResourceTestCaseEntity; import io.sc.engine.rule.server.testcase.entity.ResourceTestCaseEntity;
import io.sc.platform.core.util.PinyinUtil; import io.sc.platform.core.util.PinyinUtil;
import io.sc.platform.core.constraints.IdentifierConstraint;
import io.sc.platform.orm.DeepClone; import io.sc.platform.orm.DeepClone;
import io.sc.platform.orm.IdClearable; import io.sc.platform.orm.IdClearable;
import io.sc.platform.orm.entity.CorporationAuditorEntity; import io.sc.platform.orm.entity.CorporationAuditorEntity;
@ -49,13 +50,14 @@ public class ResourceEntity extends CorporationAuditorEntity<ResourceVo> impleme
protected ResourceType type; protected ResourceType type;
//代码 //代码
@Column(name="CODE_", length=254) @Column(name="CODE_", length=255)
@Size(max=254) @Size(max=255)
@IdentifierConstraint
protected String code; protected String code;
//名称 //名称
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(max=254) @Size(max=255)
protected String name; protected String name;
//名称 //名称

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseEntity.java

@ -49,13 +49,13 @@ public class TestCaseEntity extends CorporationAuditorEntity<TestCaseVo> impleme
protected String id; protected String id;
//名称 //名称
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(max=254) @Size(max=255)
protected String name; protected String name;
//描述 //描述
@Column(name="DESCRIPTION_", length=254) @Column(name="DESCRIPTION_", length=255)
@Size(max=254) @Size(max=255)
protected String description; protected String description;
//最近一次执行测试用例的日期 //最近一次执行测试用例的日期

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseParameterEntity.java

@ -29,8 +29,8 @@ public class TestCaseParameterEntity extends CorporationAuditorEntity<TestCasePa
protected String id; protected String id;
//对应的参数代码 //对应的参数代码
@Column(name="CODE_", length=254) @Column(name="CODE_", length=255)
@Size(max=254) @Size(max=255)
protected String code; protected String code;
//是否跳过检查 //是否跳过检查

2343
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json

File diff suppressed because one or more lines are too long

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

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

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

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

@ -22,7 +22,7 @@ class SessionManager {
* @returns * @returns
*/ */
public static isTimeout() { public static isTimeout() {
return new Date().getTime() - SessionManager.#lastRequestDatetime > 30 * 60 * 1000; return new Date().getTime() - SessionManager.#lastRequestDatetime > Environment.getConfigure().setting.sessionTimeout * 4 * 1000;
} }
/** /**

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

@ -51,6 +51,7 @@ export type ConfigureType = {
// 前端设置 // 前端设置
// --------------------------------------------- // ---------------------------------------------
setting: { setting: {
sessionTimeout: number; //会话过期时间,单位:秒
notifyTimeout: number; // 通知提示框显示时间单位:毫秒 notifyTimeout: number; // 通知提示框显示时间单位:毫秒
homePage: string; // 首页路由 path homePage: string; // 首页路由 path
i18n: { i18n: {

11
io.sc.platform.core.frontend/src/platform/utils/Downloader.ts

@ -1,8 +1,13 @@
import { blobAxios } from '@/platform'; import { blobAxios } from '@/platform';
class Downloader { class Downloader {
public static get(url: string) { public static get(url: string, option: any) {
blobAxios.get(url, { responseType: 'blob' }).then((response) => { if (option) {
option.responseType = 'blob';
} else {
option = { responseType: 'blob' };
}
blobAxios.get(url, option).then((response) => {
Downloader.download(response); Downloader.download(response);
}); });
} }
@ -21,7 +26,7 @@ class Downloader {
}); });
} }
private static download(response) { private static download(response: any) {
if (response) { if (response) {
const { data, headers } = response; const { data, headers } = response;
let fileName = headers['content-disposition-url-encode'].match(/filename=(.*)/)[1]; let fileName = headers['content-disposition-url-encode'].match(/filename=(.*)/)[1];

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.31", "version": "8.2.33",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -110,7 +110,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

20
io.sc.platform.core/src/main/java/io/sc/platform/core/constraints/IdentifierConstraint.java

@ -0,0 +1,20 @@
package io.sc.platform.core.constraints;
import io.sc.platform.core.constraints.validator.IdentifierConstraintValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 约束限制(代码)
*/
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy= IdentifierConstraintValidator.class)
public @interface IdentifierConstraint {
String message() default "{io.sc.platform.core.constraints.IdentifierConstraint.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

40
io.sc.platform.core/src/main/java/io/sc/platform/core/constraints/validator/IdentifierConstraintValidator.java

@ -0,0 +1,40 @@
package io.sc.platform.core.constraints.validator;
import io.sc.platform.core.constraints.IdentifierConstraint;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 代码限制验证器
*/
public class IdentifierConstraintValidator implements ConstraintValidator<IdentifierConstraint, String> {
// 标识符: 字母、数字和下划线,且首字符必须为字母
private static final Pattern pattern =Pattern.compile("[A-Za-z][A-Za-z0-9_]*");
private IdentifierConstraint constraintAnnotation;
@Override
public void initialize(IdentifierConstraint constraintAnnotation) {
this.constraintAnnotation =constraintAnnotation;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(!StringUtils.hasText(value)) { return true; }
Matcher matcher = pattern.matcher(value);
if(matcher.find()) {
int start =matcher.start();
int end =matcher.end();
if(start==0 && end==value.length()){
return true;
}else{
return false;
}
}else{
return false;
}
}
}

21
io.sc.platform.core/src/main/java/io/sc/platform/core/validation/CodeValidator.java

@ -1,21 +0,0 @@
package io.sc.platform.core.validation;
import io.sc.platform.core.validation.annotation.Code;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CodeValidator implements ConstraintValidator<Code, String> {
@Override
public void initialize(Code constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
System.out.println(">>>>>>>>" + value);
return false;
}
}

43
io.sc.platform.core/src/main/java/io/sc/platform/core/validation/annotation/Code.java

@ -1,43 +0,0 @@
package io.sc.platform.core.validation.annotation;
import io.sc.platform.core.validation.CodeValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(Code.List.class)
@Documented
@Constraint(validatedBy= CodeValidator.class)
public @interface Code {
/**
* @return the error message template
*/
String message() default "{javax.validation.constraints.Pattern.message}";
/**
* @return the groups the constraint belongs to
*/
Class<?>[] groups() default { };
/**
* @return the payload associated to the constraint
*/
Class<? extends Payload>[] payload() default { };
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@interface List {
Code[] value();
}
}

1
io.sc.platform.core/src/main/resources/META-INF/platform/plugins/messages.json

@ -1,5 +1,6 @@
{ {
"includes":[ "includes":[
"io/sc/platform/core/i18n/constraints",
"io/sc/platform/core/i18n/enums", "io/sc/platform/core/i18n/enums",
"io/sc/platform/core/i18n/exception", "io/sc/platform/core/i18n/exception",
"io/sc/platform/core/i18n/language", "io/sc/platform/core/i18n/language",

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints.properties

@ -0,0 +1 @@
io.sc.platform.core.constraints.IdentifierConstraint.message=Contains only letters, numbers, or underscores, Note: The first character must be a letter.

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints_tw_CN.properties

@ -0,0 +1 @@
io.sc.platform.core.constraints.IdentifierConstraint.message=\u50C5\u5305\u542B\u5B57\u6BCD\u3001\u6578\u5B57\u6216\u4E0B\u5283\u7DDA, \u6CE8\u610F: \u9996\u5B57\u6BCD\u5FC5\u9808\u70BA\u5B57\u6BCD\u3002

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/constraints_zh_CN.properties

@ -0,0 +1 @@
io.sc.platform.core.constraints.IdentifierConstraint.message=\u4EC5\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF, \u6CE8\u610F: \u9996\u5B57\u7B26\u5FC5\u987B\u4E3A\u5B57\u6BCD\u3002

2
io.sc.platform.developer.doc/package.json

@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15" "vuepress": "2.0.0-rc.15"
}, },
"dependencies": { "dependencies": {
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"vue": "3.5.13", "vue": "3.5.13",
"vue-i18n": "10.0.4" "vue-i18n": "10.0.4"

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

1
io.sc.platform.gradle/templates/pgp/setup/build-version.gradle

@ -15,6 +15,7 @@ ext['PlatformDependencyVersions'] =[
"org.codehaus.groovy:groovy-json" : "${groovy_version}", "org.codehaus.groovy:groovy-json" : "${groovy_version}",
"org.codehaus.groovy:groovy-sql" : "${groovy_version}", "org.codehaus.groovy:groovy-sql" : "${groovy_version}",
"org.codehaus.groovy:groovy-xml" : "${groovy_version}", "org.codehaus.groovy:groovy-xml" : "${groovy_version}",
"mysql:mysql-connector-java" : "${jdbc_mysql_version}",
]; ];
/*********************************************************************** /***********************************************************************

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

@ -59,7 +59,7 @@ subprojects {
// exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j" // exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j"
// exclude group: "org.slf4j", module: "slf4j-jdk14" // exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-nop" exclude group: "org.slf4j", module: "slf4j-nop"
exclude group: "com.mysql", module: "mysql-connector-j" //exclude group: "com.mysql", module: "mysql-connector-j"
if(PlatformDependencyVersions!=null && PlatformDependencyVersions.size()>0) { if(PlatformDependencyVersions!=null && PlatformDependencyVersions.size()>0) {
resolutionStrategy.eachDependency { DependencyResolveDetails detail -> resolutionStrategy.eachDependency { DependencyResolveDetails detail ->

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

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.2.7 platform_version=8.2.7
platform_plugin_version=8.2.7 platform_plugin_version=8.2.7
platform_core_frontend_version=8.2.31 platform_core_frontend_version=8.2.33
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

4
io.sc.platform.lcdp.frontend/src/components/index.ts

@ -6,9 +6,9 @@ import component_lcdp_Frontend from '@/views/Frontend.vue';
import component_lcdp_Theme from '@/views/Theme.vue'; import component_lcdp_Theme from '@/views/Theme.vue';
import component_lcdp_bpm from '@/views/bpm/Bpm.vue'; import component_lcdp_bpm from '@/views/bpm/Bpm.vue';
import component_lcdp_form_page from '@/views/form/Page.vue'; import component_lcdp_form_page from '@/views/form/Page.vue';
import component_lcdp_excel_report from '@/views/excel_template/ExcelReport.vue'; import component_lcdp_excel_report from '@/views/excel-template/ExcelReport.vue';
import component_lcdp_formConfig from '@/views/form/FormConfig.vue'; import component_lcdp_formConfig from '@/views/form/FormConfig.vue';
import component_lcdp_excel_template from '@/views/excel_template/TemplateGrid.vue'; import component_lcdp_excel_template from '@/views/excel-template/TemplateGrid.vue';
const localComponents = { const localComponents = {
'component.lcdp.Frontend': component_lcdp_Frontend, 'component.lcdp.Frontend': component_lcdp_Frontend,

6
io.sc.platform.lcdp.frontend/src/routes/routes.json

@ -54,7 +54,7 @@
"path": "lcdp/excel/report", "path": "lcdp/excel/report",
"priority": 0, "priority": 0,
"component": "component.lcdp.excel.report", "component": "component.lcdp.excel.report",
"componentPath": "@/views/excel_template/ExcelReport.vue", "componentPath": "@/views/excel-template/ExcelReport.vue",
"redirect": null, "redirect": null,
"meta": { "meta": {
"permissions": ["/example/**/*"] "permissions": ["/example/**/*"]
@ -68,6 +68,7 @@
"component": "component.lcdp.formConfig", "component": "component.lcdp.formConfig",
"componentPath": "@/views/form/FormConfig.vue", "componentPath": "@/views/form/FormConfig.vue",
"meta": { "meta": {
"permissions": ["/example/**/*"]
}, },
"children": [] "children": []
}, },
@ -76,8 +77,9 @@
"name": "route.lcdp.excel.template", "name": "route.lcdp.excel.template",
"path": "lcdp/excel/template", "path": "lcdp/excel/template",
"component": "component.lcdp.excel.template", "component": "component.lcdp.excel.template",
"componentPath": "@/views/excel_template/TemplateGrid.vue", "componentPath": "@/views/excel-template/TemplateGrid.vue",
"meta": { "meta": {
"permissions": ["/example/**/*"]
}, },
"children": [] "children": []
} }

2
io.sc.platform.lcdp.frontend/src/views/excel_template/ExcelReport.vue → io.sc.platform.lcdp.frontend/src/views/excel-template/ExcelReport.vue

@ -12,7 +12,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, computed, reactive } from 'vue'; import { ref, onMounted, computed, reactive } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { exportExcel } from './luckysheet/export'; import { exportExcel } from './luckysheet/exportExcel';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { axios, Environment, Tools } from 'platform-core'; import { axios, Environment, Tools } from 'platform-core';

11
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateConfig.vue

@ -1,11 +0,0 @@
<template>
<div>
<LuckySheet></LuckySheet>
</div>
</template>
<script setup lang="ts">
import LuckySheet from './luckysheet/LuckySheet.vue';
</script>
<style scoped></style>

358
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateConfigDialog.vue

@ -1,358 +0,0 @@
<template>
<w-dialog ref="dialogRef" :title="state.dialogTitle" :maximized="true" :buttons="dialog.buttons" body-padding="0px 0px 0px 0px">
<div class="flex justify-end gap-2 p-1.5">
<q-file v-model="impFile" label="导入Excel文件" input-class="w-[400px]" filled dense accept=".xlsx,.xls" @update:model-value="loadExcel($event)">
<template #append>
<q-icon name="attachment" />
</template>
</q-file>
<div class="flex flex-none">
<q-btn label="选取变量" :icon="PlatformIconEnum.选取变量" @click="selectParams"></q-btn>
</div>
<div class="flex flex-none">
<q-btn-dropdown :icon="PlatformIconEnum.设置" label="循环属性配置" unelevated outline>
<q-list>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label @click="openConfigDialog('main')"><q-icon :name="PlatformIconEnum.更多查询"></q-icon> ()</q-item-label>
</q-item-section>
</q-item>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label @click="openConfigDialog('column')"><q-icon :name="PlatformIconEnum.更多查询"></q-icon> ()</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</div>
<TemplateParamsSelectDialog ref="paramsSelectDialogRef" @set-params="setParams"></TemplateParamsSelectDialog>
<TemplateSetForeachPropsDialog ref="setForeachPropsDialogRef" @set-for-each-params="setForEachParams"></TemplateSetForeachPropsDialog>
<TemplateSetColumnParamsDialog ref="setColumnParamsDialogRef" @set-for-each-params="setForEachParams"></TemplateSetColumnParamsDialog>
</div>
<div id="luckysheet"></div>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick, onBeforeMount } from 'vue';
import LuckyExcel from 'luckyexcel';
import { exportExcel } from './luckysheet/export';
import { useQuasar } from 'quasar';
import { axios, Environment, NotifyManager, PlatformIconEnum, Tools } from 'platform-core';
import TemplateParamsSelectDialog from './TemplateParamsSelectDialog.vue';
import TemplateSetForeachPropsDialog from './TemplateSetForeachPropsDialog.vue';
import TemplateSetColumnParamsDialog from './TemplateSetColumnParamsDialog.vue';
const $q = useQuasar();
const dialogRef = ref();
const state = reactive({
dialogTitle: '模板制定',
dataId: '',
});
const dialog = {
buttons: [
{
icon: PlatformIconEnum.保存,
label: '保存',
click: () => {
save();
},
},
],
};
const show = async (tableSelectedRow: any) => {
state.dialogTitle = '模板制定——' + tableSelectedRow.templateName + '(' + tableSelectedRow.templateCode + ')';
state.dataId = tableSelectedRow.id;
dialogRef.value.show();
nextTick(async () => {
if (window.luckysheet) {
window.luckysheet.destroy();
}
const resp = await axios.get(Environment.apiContextPath('api/excel/template/') + state.dataId);
if (resp?.data?.templateConfig) {
luckysheetOptions.data = [eval('(' + resp.data.templateConfig + ')')];
}
// eslint-disable-next-line
luckysheet.create(luckysheetOptions);
});
};
const hide = () => {
dialogRef.value.hide();
};
const impFile = ref(null);
const paramsSelectDialogRef = ref();
const setForeachPropsDialogRef = ref();
const setColumnParamsDialogRef = ref();
const loadExcel = (value) => {
const { name } = value;
const suffixArr = name.split('.');
const suffix = suffixArr[suffixArr.length - 1];
if (suffix !== 'xlsx') {
NotifyManager.warn('只能导入 .xlsx 格式的Excel文件');
return;
}
LuckyExcel.transformExcelToLucky(value, (exportJson) => {
if (exportJson.sheets === null || exportJson.sheets.length === 0) {
NotifyManager.warn('导入的Excel为空文件');
return;
}
window.luckysheet.destroy();
const data = [
{
...exportJson.sheets[0],
...{
column: 26,
row: 30,
},
},
];
luckysheetOptions.data = data;
window.luckysheet.create({
lang: 'zh',
container: 'luckysheet',
showinfobar: false,
showtoolbar: true, //
sheetFormulaBar: true, //
showsheetbar: false, // sheet
data: data,
title: exportJson.info.name,
userInfo: exportJson.info.name.creator,
});
});
};
const downloadExcel = () => {
// eslint-disable-next-line
exportExcel(luckysheet.getAllSheets(), '下载');
};
const luckysheetData = [
{
name: 'Cell', //
color: '', //
index: 0, //
status: 1, //
order: 0, //
hide: 0, //
defaultRowHeight: 19, //
defaultColWidth: 73, //
column: 26,
row: 30,
celldata: [], // 使
config: {
merge: {}, //
rowlen: {}, //
columnlen: {}, //
rowhidden: {}, //
colhidden: {}, //
borderInfo: [], //
authority: {}, //
},
scrollLeft: 0, //
scrollTop: 0, //
luckysheet_select_save: [], //
calcChain: [], //
isPivotTable: false, //
pivotTable: {}, //
filter_select: {}, //
filter: null, //
luckysheet_alternateformat_save: [], //
luckysheet_alternateformat_save_modelCustom: [], //
luckysheet_conditionformat_save: {}, //
frozen: {}, //
chart: [], //
zoomRatio: 1, //
image: [], //
showGridLines: 1, // 线
dataVerification: {}, //
},
];
const luckysheetOptions = {
container: 'luckysheet', // DOMid
lang: 'zh', //
title: '测试', //
allowEdit: true, //
rowHeaderWidth: 46, // 0A,B,C46
columnHeaderHeight: 20, // 020
showtoolbar: true, //
showinfobar: false, // luckysheetlogo
userInfo: 'likunming', // showinfobar使
sheetFormulaBar: true, //
defaultFontSize: 11, // ,11
showsheetbar: false, // sheet
data: luckysheetData, //
};
const selectParams = () => {
// eslint-disable-next-line
const selectRange = luckysheet.getRange();
if (!selectRange || selectRange.length === 0) {
NotifyManager.warn('请选择要插入变量的Excel单元格');
return;
} else if (selectRange && selectRange.length > 1) {
NotifyManager.warn('只支持单个选区选取变量');
return;
}
paramsSelectDialogRef.value.show(state.dataId);
};
const setParams = (paramsCode: string | Array<string>) => {
if (typeof paramsCode === 'string') {
// eslint-disable-next-line
let rangeValue = luckysheet.getRangeValue();
rangeValue[0][0] = { ...rangeValue[0][0], ...{ m: paramsCode, v: paramsCode } };
// eslint-disable-next-line
luckysheet.setRangeValue(rangeValue);
} else {
// eslint-disable-next-line
const currRange = luckysheet.getRange();
paramsCode.forEach((item, index) => {
const tmpRangeValue = [[{ m: item, v: item }]];
const tmp = {
row: [currRange[0].row[0], currRange[0].row[1]],
column: [currRange[0].column[0] + index, currRange[0].column[1] + index],
};
// eslint-disable-next-line
luckysheet.setRangeValue(tmpRangeValue, { range: tmp });
});
}
};
// eslint-disable-next-line
const psReg = /\@\{(.*)\}\@/;
const openConfigDialog = (configType) => {
// eslint-disable-next-line
const range = luckysheet.getRange();
// eslint-disable-next-line
const rangeValue = luckysheet.getRangeValue();
if (!range) {
NotifyManager.info('请选择要配置属性的单元格');
return;
} else if (range && range.length > 1) {
NotifyManager.warn('多个选区无法配置属性,选择单元格既可');
return;
}
let data = {};
if (rangeValue[0] && rangeValue[0][0] && rangeValue[0][0].ps && rangeValue[0][0].ps.value) {
let tmp = rangeValue[0][0].ps.value.replaceAll('\n', '');
data = JSON.parse(psReg.exec(tmp)[1]);
}
if (configType === 'main') {
setForeachPropsDialogRef.value.show(state.dataId, data);
} else {
setColumnParamsDialogRef.value.show(data);
}
};
const setForEachParams = (formData) => {
// eslint-disable-next-line
const range = luckysheet.getRange();
let tmp = '@{{\n';
Object.keys(formData).forEach((item) => {
if (!Tools.isEmpty(formData[item])) {
tmp += '"' + item + '"' + ':' + '"' + formData[item] + '"' + ',' + '\n';
}
});
tmp = tmp.substring(0, tmp.length - 2);
tmp += '\n}}@';
// eslint-disable-next-line
luckysheet.insertComment(range[0].row[0], range[0].column[0], tmp);
//
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.width = 300;
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.height = 150;
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.isShow = false;
// eslint-disable-next-line
luckysheet.refresh();
};
const save = async () => {
// eslint-disable-next-line
if (!luckysheet.getAllSheets() || luckysheet.getAllSheets().length === 0) {
NotifyManager.warn('系统异常,未获取到需要保存的Sheet数据');
return;
}
// celldata使data
// eslint-disable-next-line
const saveData = { ...luckysheet.getAllSheets()[0], ...{ celldata: [] } };
//
let requestParams = {
method: 'POST',
headers: { 'content-type': 'application/json;charset=utf-8;' },
data: { templateConfig: JSON.stringify(saveData) },
url: Environment.apiContextPath('api/excel/template/updateConfig/') + state.dataId,
};
const resp = await axios(requestParams).catch((error) => {
console.info('error====', error);
NotifyManager.error('保存失败');
});
NotifyManager.info('保存成功');
// dialogRef.value.dialogHide();
};
const buttons = ref([
{
name: 'selectParams',
icon: 'find_in_page',
label: '选取变量',
click: selectParams,
},
[
{
name: 'foreachPropsConfig',
icon: 'settings',
label: '循环属性配置',
},
{
name: 'mainConfig',
icon: 'build_circle',
label: '整体配置(首列)',
click: () => {
openConfigDialog('main');
},
},
{
name: 'columnConfig',
icon: 'build_circle',
label: '列配置(非首列)',
click: () => {
openConfigDialog('column');
},
},
],
{
name: 'download',
icon: 'download',
label: '导出文件',
click: downloadExcel,
},
]);
onBeforeMount(() => {
window.setInputZIndex = () => {
return true;
};
window.setRightClickMenuZIndex = () => {
return true;
};
});
defineExpose({
show,
hide,
});
</script>
<style scoped>
#luckysheet {
margin: 0px;
padding: 0px;
position: absolute;
width: 100%;
left: 0px;
top: 50px;
bottom: 0px;
}
</style>

131
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateGrid.vue

@ -1,131 +0,0 @@
<template>
<div style="height: 100%">
<w-grid
ref="templateGridRef"
title="Excel模板列表"
sort-no
:data-url="Environment.apiContextPath('api/excel/template')"
:query-form-cols-num="2"
:query-form-fields="templateGrid.queryFormFields"
:toolbar-actions="templateGrid.toolbarActions"
:columns="templateGrid.columns"
:editor="templateGrid.editor"
:viewer="templateGrid.viewer"
:sort-by="['-lastModifyDate']"
></w-grid>
<TemplateParamsDialog ref="templateParamsDialogRef"></TemplateParamsDialog>
<TemplateConfigDialog ref="templateConfigDialogRef"></TemplateConfigDialog>
<TemplateReportDialog ref="templateReportDialogRef"></TemplateReportDialog>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { Environment } from 'platform-core';
import TemplateParamsDialog from './TemplateParamsDialog.vue';
import TemplateConfigDialog from './TemplateConfigDialog.vue';
import TemplateReportDialog from './TemplateReportDialog.vue';
const templateGridRef = ref();
const templateParamsDialogRef = ref();
const templateConfigDialogRef = ref();
const templateReportDialogRef = ref();
const templateGrid = {
queryFormFields: [
{ label: '模板编码', name: 'templateCode', type: 'w-text' },
{ label: '模板名称', name: 'templateName', type: 'w-text' },
],
toolbarActions: [
'query',
'reset',
'separator',
[
{
name: 'operate',
icon: 'difference',
label: '操作',
},
'add',
{
extend: 'edit',
afterClick: (args) => {
args.grid.setEditDataUrl(Environment.apiContextPath('api/excel/template/updateField'));
},
},
'remove',
],
{
name: 'params',
icon: 'settings',
label: '变量维护',
click: (args) => {
templateParamsDialogRef.value.show(args.selecteds);
},
},
{
name: 'templateConfig',
icon: 'build_circle',
label: '模板制定',
enableIf: (args) => {
if (args.selected) {
return true;
} else {
return false;
}
},
click: (args) => {
templateConfigDialogRef.value.show(args.selected);
},
},
'separator',
{
name: 'reportView',
icon: 'visibility',
label: '报表查看',
enableIf: (args) => {
if (args.selected) {
return true;
} else {
return false;
}
},
click: (args) => {
templateReportDialogRef.value.show(args.selected);
},
},
'separator',
],
columns: [
{ name: 'templateCode', label: '模板编码' },
{ name: 'templateName', label: '模板名称' },
{ name: 'lastModifier', label: '最后修改人' },
{ name: 'lastModifyDate', label: '最后修改时间' },
],
editor: {
dialog: {
width: '50%',
height: '30%',
},
form: {
colsNum: 1,
fields: [
{ label: '模板编码', name: 'templateCode', type: 'w-text', requiredIf: true },
{ label: '模板名称', name: 'templateName', type: 'w-text', requiredIf: true },
],
},
},
viewer: {
panel: {
fields: [
{ name: 'id', label: '模板ID' },
{ name: 'templateCode', label: '模板编码' },
{ name: 'templateName', label: '模板名称' },
{ name: 'lastModifier', label: '最后修改人' },
{ name: 'lastModifyDate', label: '最后修改时间' },
],
},
},
};
</script>

464
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateParamsDialog.vue

@ -1,464 +0,0 @@
<template>
<w-dialog ref="dialogRef" title="变量维护" :maximized="true">
<w-grid
ref="templateParamsGridRef"
title="模板变量列表"
:auto-fetch-data="false"
:data-url="Environment.apiContextPath('api/excel/template/params')"
:sort-no="true"
:columns="templateParamsGrid.columns"
:toolbar-actions="templateParamsGrid.toolbarActions"
:query-form-cols-num="4"
:query-form-fields="templateParamsGrid.queryFormFields"
:pagination="{
sortBy: 'lastModifyDate',
descending: true,
}"
></w-grid>
<w-dialog ref="templateParamsDialogRef" :title="state.templateParamsDialogTitle" width="80%" height="80%" :buttons="templateParamsDialog.buttons">
<w-form ref="templateParamsAddEditFormRef" :cols-num="3" :fields="templateParamsDialog.formFields" class="p-1.5"> </w-form>
<w-grid
v-show="state.paramsType && state.paramsType === 'LIST'"
ref="templateParamsListFieldGridRef"
title="字段列表"
dense
:draggable="true"
:pageable="false"
:config-button="false"
:auto-fetch-data="false"
:fetch-data-url="Environment.apiContextPath('api/excel/template/params/list?sortBy=sortNo')"
:toolbar-actions="templateParamsListFieldGrid.toolbarActions"
:columns="templateParamsListFieldGrid.columns"
></w-grid>
<w-dialog
ref="templateParamsListFieldDialogRef"
:title="state.templateParamsListFieldDialogTitle"
width="60%"
height="50%"
:buttons="templateParamsListFieldDialog.buttons"
>
<w-form ref="templateParamsListFieldAddEditFormRef" :cols-num="1" :fields="templateParamsListFieldDialog.formFields" class="p-1.5"> </w-form>
</w-dialog>
</w-dialog>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue';
import { axios, Environment, NotifyManager } from 'platform-core';
const dialogRef = ref();
const templateParamsGridRef = ref();
const templateParamsDialogRef = ref();
const templateParamsAddEditFormRef = ref();
const templateParamsListFieldGridRef = ref();
const templateParamsListFieldDialogRef = ref();
const templateParamsListFieldAddEditFormRef = ref();
const state = reactive({
templateArray: [],
tableSelectedTemplateId: null,
paramsType: null,
templateParamsDialogTitle: '新增变量',
templateParamsListFieldDialogTitle: '新增字段',
});
const templateParamsGrid = {
queryFormFields: [
{ label: '变量编码', name: 'paramsCode', type: 'w-text' },
{ label: '变量名称', name: 'paramsName', type: 'w-text' },
{
label: '变量类型',
name: 'paramsType',
type: 'w-select',
queryOperator: 'equals',
options: [
{ label: '单值', value: 'SING' },
{ label: '列表', value: 'LIST' },
],
},
{
label: '所属模板',
name: 'reportExcelTemplate',
queryOperator: 'equals',
type: 'w-select',
clearable: true,
colspan: 2,
options: [],
},
],
toolbarActions: [
'query',
'reset',
'separator',
{
extend: 'add',
click: () => {
templateParamsDialogRef.value.show();
},
afterClick: () => {
templateParamsAddEditFormRef.value.setStatus('add');
state.templateParamsDialogTitle = '新增变量';
templateParamsAddEditFormRef.value.getFields()['reportExcelTemplate'].options = state.templateArray;
state.paramsType = null;
if (state.tableSelectedTemplateId) {
templateParamsAddEditFormRef.value.setFieldValue('paramsIsCommon', false);
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', state.tableSelectedTemplateId);
}
},
},
{
extend: 'edit',
click: () => {
templateParamsDialogRef.value.show();
},
afterClick: (args) => {
templateParamsAddEditFormRef.value.setStatus('edit');
state.templateParamsDialogTitle = '编辑变量';
templateParamsAddEditFormRef.value.getFields()['reportExcelTemplate'].options = state.templateArray;
templateParamsAddEditFormRef.value.setData(args.selected);
state.paramsType = args.selected.paramsType;
if (args.selected['paramsIsCommon']) {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', null);
} else if (args.selected['reportExcelTemplate']) {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', args.selected['reportExcelTemplate']);
}
if (state.paramsType === 'LIST') {
const urlSearchParams = new URLSearchParams();
urlSearchParams.append('criteria', JSON.stringify({ fieldName: 'reportExcelTemplateParams', operator: 'equals', value: args.selected.id }));
axios
.get(Environment.apiContextPath('api/excel/template/params/list?pageable=false&sortBy=sortNo'), { params: urlSearchParams })
.then((resp) => {
if (resp.data.content) {
templateParamsListFieldGridRef.value.setLocalData(resp.data.content);
}
})
.catch((error) => {
console.info('error====', error);
});
}
},
},
{
extend: 'clone',
click: () => {
templateParamsDialogRef.value.show();
},
afterClick: (args) => {
templateParamsAddEditFormRef.value.setStatus('clone');
state.templateParamsDialogTitle = '复制变量';
templateParamsAddEditFormRef.value.getFields()['reportExcelTemplate'].options = state.templateArray;
templateParamsAddEditFormRef.value.setData(args.selected);
state.paramsType = args.selected.paramsType;
if (args.selected['paramsIsCommon']) {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', null);
} else if (args.selected['reportExcelTemplate']) {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', args.selected['reportExcelTemplate']);
}
if (state.paramsType === 'LIST') {
const urlSearchParams = new URLSearchParams();
urlSearchParams.append('criteria', JSON.stringify({ fieldName: 'reportExcelTemplateParams', operator: 'equals', value: args.selected.id }));
axios
.get(Environment.apiContextPath('api/excel/template/params/list?pageable=false&sortBy=sortNo'), { params: urlSearchParams })
.then((resp) => {
if (resp.data.content) {
templateParamsListFieldGridRef.value.setLocalData(resp.data.content);
}
})
.catch((error) => {
console.info('error====', error);
});
}
},
},
'remove',
'separator',
],
columns: [
{ name: 'paramsCode', label: '变量编码' },
{ name: 'paramsName', label: '变量名称' },
{
name: 'paramsType',
label: '变量类型',
format: (val, row) => {
if (val === 'SING') {
return '单值';
} else if (val === 'LIST') {
return '列表';
} else {
return val;
}
},
},
{
name: 'paramsIsCommon',
label: '变量是否通用',
format: (val, row) => {
if (val === true) {
return '所有模板均可使用';
} else if (val === false) {
return '指定模板可使用';
} else {
return val;
}
},
},
{ name: 'reportExcelTemplateName', label: '所属模板名称' },
{ name: 'lastModifier', label: '最后修改人' },
{ name: 'lastModifyDate', label: '最后修改时间' },
],
};
const templateParamsDialog = {
buttons: [
{
icon: 'beenhere',
label: '提交',
click: async () => {
const validate = await templateParamsAddEditFormRef.value.validate();
if (validate) {
const formStatus = templateParamsAddEditFormRef.value.getStatus();
const formData = templateParamsAddEditFormRef.value.getData();
if (formData.reportExcelTemplate) {
formData.reportExcelTemplate = { id: formData.reportExcelTemplate };
} else {
formData.reportExcelTemplate = null;
}
const fieldRows = templateParamsListFieldGridRef.value.getRows();
let url = Environment.apiContextPath('api/excel/template/params');
if (formStatus === 'edit') {
url += '/edit';
formData.id = templateParamsGridRef.value.getSelectedRows()[0].id;
fieldRows.forEach((item) => {
delete item.reportExcelTemplateParams;
});
} else {
url += '/add';
}
const resp = await axios
.post(url, {
params: formData,
list: formData.paramsType === 'LIST' ? fieldRows : [],
})
.catch((error) => {
console.info('error====', error);
NotifyManager.error('操作失败');
});
NotifyManager.info('保存成功');
templateParamsDialogRef.value.hide();
templateParamsGridRef.value.refresh();
}
},
},
{
icon: 'published_with_changes',
label: 'SQL校验',
click: async () => {
const paramsSqlValue = templateParamsAddEditFormRef.value.getFieldValue('paramsSql');
if (!paramsSqlValue) {
NotifyManager.warn('取值SQL为空');
return;
}
const requestParams = {
method: 'POST',
headers: { 'content-type': 'text/plain;charset=utf-8;' },
data: paramsSqlValue,
url: Environment.apiContextPath('api/jdbc/fetchMetaDataBySql'),
};
const resp = await axios(requestParams);
if (resp && resp.data) {
NotifyManager.info('校验通过');
} else {
NotifyManager.error('校验失败');
}
},
},
],
formFields: [
{ label: '变量编码', name: 'paramsCode', type: 'w-text', requiredIf: true },
{ label: '变量名称', name: 'paramsName', type: 'w-text', requiredIf: true },
{
label: '变量类型',
name: 'paramsType',
type: 'w-select',
requiredIf: true,
options: [
{ label: '单值', value: 'SING' },
{ label: '列表', value: 'LIST' },
],
'onUpdate:modelValue': (value) => {
state.paramsType = value;
},
},
{
label: '变量是否通用',
name: 'paramsIsCommon',
type: 'w-select',
requiredIf: true,
options: [
{ label: '所有模板均可使用', value: true },
{ label: '指定模板可使用', value: false },
],
'onUpdate:modelValue': (value) => {
if (typeof value === 'boolean' && value === false) {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', state.tableSelectedTemplateId);
} else {
templateParamsAddEditFormRef.value.setFieldValue('reportExcelTemplate', null);
}
},
},
{
label: '所属模板',
name: 'reportExcelTemplate',
type: 'w-select',
colspan: 2,
requiredIf: true,
options: [],
showIf: (args) => {
const value = args.form?.getFieldValue('paramsIsCommon');
if (typeof value === 'boolean' && value === false) {
return true;
} else {
return false;
}
},
},
{
label: '取值SQL',
name: 'paramsSql',
type: 'w-textarea',
requiredIf: true,
colspan: 'full',
},
],
};
const templateParamsListFieldGrid = {
toolbarActions: [
{
name: 'generateFieldsBySql',
icon: 'playlist_add_circle',
label: '根据取值SQL生成',
click: async () => {
const paramsSqlValue = templateParamsAddEditFormRef.value.getFieldValue('paramsSql');
if (!paramsSqlValue) {
NotifyManager.warn('取值SQL为空,无法生成');
return;
}
const requestParams = {
method: 'POST',
headers: { 'content-type': 'text/plain;charset=utf-8;' },
data: paramsSqlValue,
url: Environment.apiContextPath('api/jdbc/fetchMetaDataBySql'),
};
const resp: any = await axios(requestParams).catch((error) => {
console.info('error====', error);
NotifyManager.error('操作失败');
});
const listFieldsRow = { name: '', desc: '' };
const listFields = <any>[];
if (resp.data) {
resp.data.forEach((item, index) => {
listFields.push({ ...listFieldsRow, ...{ sortNo: index + 1, name: item.columnName, type: item.columnTypeName } });
});
templateParamsListFieldGridRef.value.setLocalData(listFields);
}
},
},
{
extend: 'edit',
click: () => {
state.templateParamsListFieldDialogTitle = '编辑字段';
templateParamsListFieldDialogRef.value.show();
},
afterClick: (args) => {
templateParamsListFieldAddEditFormRef.value.setStatus('edit');
templateParamsListFieldAddEditFormRef.value.setData(args.selected);
},
},
{
extend: 'remove',
click: (args) => {
if (args.tickeds) {
templateParamsListFieldGridRef.value.removeLocalData(args.tickeds);
} else {
templateParamsListFieldGridRef.value.removeLocalData(args.selecteds);
}
},
},
],
columns: [
{ name: 'sortNo', label: '排序号' },
{ name: 'name', label: '字段名' },
{ name: 'desc', label: '字段描述' },
],
};
const templateParamsListFieldDialog = {
buttons: [
{
icon: 'save',
label: '确定',
click: async () => {
const validateResult = await templateParamsListFieldAddEditFormRef.value.validate();
if (validateResult) {
const formData = templateParamsListFieldAddEditFormRef.value.getData();
const formStatus = templateParamsListFieldAddEditFormRef.value.getStatus();
if (formStatus === 'add') {
templateParamsListFieldGridRef.value.addRow(formData, null);
} else {
templateParamsListFieldGridRef.value.replaceRow({
...formData,
_rowKey_: templateParamsListFieldGridRef.value.getSelectedRows()[0]['_rowKey_'],
});
}
templateParamsListFieldDialogRef.value.hide();
}
},
},
],
formFields: [
{ label: '字段名', name: 'name', type: 'w-text', requiredIf: true },
{ label: '字段描述', name: 'desc', type: 'w-text' },
],
};
const getTemplateListFun = async () => {
const resp = await axios.get(Environment.apiContextPath('api/excel/template?pageable=false'));
if (resp && resp.data?.content) {
const options = <any>[];
resp.data.content.forEach((item) => {
options.push({ label: item.templateName, value: item.id });
});
state.templateArray = options;
templateParamsGridRef.value.getQueryForm().getFields()['reportExcelTemplate'].options = options;
setTimeout(() => {
if (state.tableSelectedTemplateId) {
templateParamsGridRef.value.getQueryForm().setFieldValue('reportExcelTemplate', state.tableSelectedTemplateId);
}
//
templateParamsGridRef.value.refresh();
}, 100);
}
};
const show = (tableSelected) => {
dialogRef.value.show();
if (tableSelected && tableSelected.length > 0) {
state.tableSelectedTemplateId = tableSelected[0].id;
} else {
state.tableSelectedTemplateId = null;
}
nextTick(() => {
getTemplateListFun();
});
};
const hide = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
});
</script>

234
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateParamsSelectDialog.vue

@ -1,234 +0,0 @@
<template>
<w-dialog ref="dialogRef" title="选取变量" width="80%" height="80%" :buttons="dialog.buttons">
<div class="h-full">
<div class="h-[300px]">
<w-grid
ref="templateParamsGridRef"
dense
sort-no
title="模板变量列表"
:auto-fetch-data="false"
:data-url="Environment.apiContextPath('api/excel/template/params')"
:columns="templateParamsGrid.columns"
:toolbar-actions="templateParamsGrid.toolbarActions"
:config-button="false"
:query-form-cols-num="3"
:query-form-fields="templateParamsGrid.queryFormFields"
:sort-by="['-lastModifyDate']"
@row-click="templateParamsGridClick"
></w-grid>
</div>
<div style="height: calc(100% - 300px)">
<w-grid
v-show="state.showListFieldGrid"
ref="templateParamsListFieldGridRef"
dense
sort-no
:config-button="false"
:hide-bottom="false"
:pageable="false"
title="字段列表"
:auto-fetch-data="false"
:fetch-data-url="Environment.apiContextPath('api/excel/template/params/list')"
:columns="templateParamsListFieldGrid.columns"
></w-grid>
</div>
</div>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue';
import { useQuasar } from 'quasar';
import { axios, Environment, NotifyManager, OperatorTypeEnum } from 'platform-core';
const $q = useQuasar();
const emit = defineEmits<{
(
e: 'setParams', //
paramsCode: string | Array<string>, //
): void;
}>();
const dialogRef = ref();
const templateParamsGridRef = ref();
const templateParamsListFieldGridRef = ref();
const state = reactive({
templateArray: [],
tableSelectedTemplateId: null,
showListFieldGrid: false,
});
const dialog = {
buttons: [
{
icon: 'save',
label: '确定',
click: async () => {
const paramsSelected = templateParamsGridRef.value.getSelectedRows();
const listFieldSelected = templateParamsListFieldGridRef.value.getSelectedRows();
if (paramsSelected && paramsSelected.length > 0) {
if (paramsSelected[0].paramsType === 'LIST' && (!listFieldSelected || listFieldSelected.length === 0)) {
const listFieldRows = templateParamsListFieldGridRef.value.getRows();
const arr = <string[]>[];
listFieldRows.forEach((item) => {
arr.push('#{' + item.name + '}');
});
emit('setParams', arr);
hide();
return;
} else if (paramsSelected[0].paramsType === 'LIST' && listFieldSelected && listFieldSelected.length > 0) {
emit('setParams', '#{' + listFieldSelected[0].name + '}');
hide();
return;
}
} else {
NotifyManager.warn('请选择要插入的变量');
return;
}
},
},
],
};
const templateParamsGrid = reactive({
queryFormFields: [
{ label: '变量名称', name: 'paramsName', type: 'w-text' },
{
label: '变量类型',
name: 'paramsType',
type: 'w-select',
queryOperator: 'equals',
options: [
{ label: '单值', value: 'SING' },
{ label: '列表', value: 'LIST' },
],
},
{
label: '所属模板',
name: 'reportExcelTemplate',
type: 'w-select',
queryOperator: 'equals',
clearable: true,
colspan: 2,
options: [],
},
],
toolbarActions: ['query', 'reset'],
columns: [
{ name: 'paramsCode', label: '变量编码' },
{ name: 'paramsName', label: '变量名称' },
{
name: 'paramsType',
label: '变量类型',
format: (val) => {
if (val === 'SING') {
return '单值';
} else if (val === 'LIST') {
return '列表';
} else {
return val;
}
},
},
{
name: 'paramsIsCommon',
label: '变量是否通用',
format: (val) => {
if (val === true) {
return '所有模板均可使用';
} else if (val === false) {
return '指定模板可使用';
} else {
return val;
}
},
},
{ name: 'reportExcelTemplateName', label: '所属模板名称' },
{ name: 'lastModifier', label: '最后修改人' },
{ name: 'lastModifyDate', label: '最后修改时间' },
],
});
const templateParamsListFieldGrid = reactive({
columns: [
{ name: 'name', label: '字段名' },
{ name: 'desc', label: '字段描述' },
{
name: 'formatType',
label: '格式化类型',
format: (val) => {
if (val && OperatorTypeEnum[val]) {
return OperatorTypeEnum[val];
} else {
return val;
}
},
},
{ name: 'formatValue', label: '格式化值' },
],
});
const templateParamsGridClick = (args) => {
const { evt, row, index } = args;
if (row.paramsType === 'LIST') {
state.showListFieldGrid = true;
const urlSearchParams = new URLSearchParams();
urlSearchParams.append('criteria', JSON.stringify({ fieldName: 'reportExcelTemplateParams', operator: 'equals', value: row.id }));
axios
.get(Environment.apiContextPath('api/excel/template/params/list?pageable=false&sortBy=sortNo'), { params: urlSearchParams })
.then((resp) => {
if (resp.data.content) {
templateParamsListFieldGridRef.value.setLocalData(resp.data.content);
}
})
.catch((error) => {
console.info('error====', error);
});
} else {
//
templateParamsListFieldGridRef.value.setLocalData([]);
//
state.showListFieldGrid = false;
}
};
const getTemplateListFun = async () => {
const resp = await axios.get(Environment.apiContextPath('api/excel/template?pageable=false'));
if (resp && resp.data?.content) {
const options = <any>[];
resp.data.content.forEach((item) => {
options.push({ label: item.templateName, value: item.id });
});
state.templateArray = options;
templateParamsGridRef.value.getQueryForm().getFields()['reportExcelTemplate'].options = options;
setTimeout(() => {
if (state.tableSelectedTemplateId) {
templateParamsGridRef.value.getQueryForm().setFieldValue('reportExcelTemplate', state.tableSelectedTemplateId);
}
//
templateParamsGridRef.value.refresh();
}, 100);
}
};
const show = (templateId) => {
dialogRef.value.show();
if (templateId) {
state.tableSelectedTemplateId = templateId;
} else {
state.tableSelectedTemplateId = null;
}
nextTick(() => {
getTemplateListFun();
});
};
const hide = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
});
</script>

34
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateReportDialog.vue

@ -1,34 +0,0 @@
<template>
<w-dialog ref="dialogRef" :title="state.dialogTitle" width="100%" height="100%" :maximized="true" :can-maximize="false" body-padding="0px 0px 0px 0px">
<ExcelReport v-if="state.dataId" ref="excelReportRef" :template-id="state.dataId" style="height: 100%"></ExcelReport>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import ExcelReport from './ExcelReport.vue';
const dialogRef = ref();
const excelReportRef = ref();
const state = reactive({
dialogTitle: '模板制定',
dataId: '',
});
const show = (tableSelectedRow: any) => {
state.dataId = tableSelectedRow.id;
state.dialogTitle = '模板报表查看——' + tableSelectedRow.templateName + '(' + tableSelectedRow.templateCode + ')';
dialogRef.value.show();
};
const hide = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
});
</script>
<style scoped></style>

91
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateSetColumnParamsDialog.vue

@ -1,91 +0,0 @@
<template>
<w-dialog ref="dialogRef" title="属性配置" width="80%" height="80%" :buttons="dialog.buttons">
<w-form ref="formRef" :cols-num="1" :fields="form.fields" class="p-1.5"> </w-form>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, nextTick } from 'vue';
import { NotifyManager, Tools } from 'platform-core';
const emit = defineEmits<{
(
e: 'setForEachParams', //
formData: any, //
): void;
}>();
const dialogRef = ref();
const formRef = ref();
const dialog = {
buttons: [
{
icon: 'save',
label: '确定',
click: async () => {
const validate = await formRef.value.validate();
if (validate) {
const formData = formRef.value.getData();
let flag = false;
Object.keys(formData).forEach((item) => {
if (!Tools.isEmpty(formData[item])) {
flag = true;
}
});
if (flag) {
emit('setForEachParams', formData);
dialogRef.value.hide();
} else {
NotifyManager.warn('未配置任何属性');
}
}
},
},
],
};
const form = {
fields: [
{
label: '单元格格式',
name: 'cellFormat',
type: 'w-select',
options: [
{ label: '纯文本', value: '1' },
{ label: '数字格式-整数', value: '2' },
{ label: '数字格式-两位小数', value: '3' },
{ label: '数字格式-四位小数', value: '4' },
{ label: '百分比整数', value: '5' },
{ label: '百分比两位小数', value: '6' },
{ label: '万元两位小数(示例:12万3456.00)', value: '7' },
{ label: '千位符整数(示例:1,235)', value: '8' },
{ label: '千位符两位小数(示例:1,234.56)', value: '9' },
],
},
{
label: '单元格码值转换',
name: 'cellValueTransformed',
type: 'w-text',
hint: `当值匹配上时显示转换后的值,等号左边为原始值,右边为转换值,位置需对应,英文逗号分隔。示例:1,2=年,月 转换为空示例:-999=NULL`,
},
{ label: '单元格批注', name: 'cellComment', type: 'w-textarea' },
],
};
const show = (data) => {
dialogRef.value.show();
nextTick(() => {
if (data) {
formRef.value.setData(data);
}
});
};
const hide = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
});
</script>

250
io.sc.platform.lcdp.frontend/src/views/excel_template/TemplateSetForeachPropsDialog.vue

@ -1,250 +0,0 @@
<template>
<w-dialog ref="dialogRef" title="属性配置" width="80%" height="80%" :buttons="dialog.buttons">
<w-form ref="formRef" :cols-num="1" :fields="form.fields" class="p-1.5"></w-form>
<w-dialog ref="listParamsDialogRef" dialog-title="选择循环的列表名" width="70%" height="70%" :buttons="listParamsDialog.buttons">
<w-grid
ref="templateParamsGridRef"
title="模板变量列表"
sort-no
dense
:checkbox-selection="false"
:auto-fetch-data="false"
:data-url="Environment.apiContextPath('api/excel/template/params')"
:columns="templateParamsGrid.columns"
:toolbar-actions="templateParamsGrid.toolbarActions"
:query-form-cols-num="2"
:query-form-row-num="2"
:query-form-fields="templateParamsGrid.queryFormFields"
:sort-by="['-lastModifyDate']"
></w-grid>
</w-dialog>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue';
import { axios, Environment, NotifyManager, Tools } from 'platform-core';
const emit = defineEmits<{
(
e: 'setForEachParams', //
formData: any, //
): void;
}>();
const dialogRef = ref();
const formRef = ref();
const listParamsDialogRef = ref();
const templateParamsGridRef = ref();
const state = reactive({
templateArray: [],
tableSelectedTemplateId: null,
});
const dialog = {
buttons: [
{
icon: 'save',
label: '确定',
click: async () => {
const validate = await formRef.value.validate();
if (validate) {
const formData = formRef.value.getData();
let flag = false;
Object.keys(formData).forEach((item) => {
if (!Tools.isEmpty(formData[item])) {
flag = true;
}
});
if (flag) {
emit('setForEachParams', formData);
dialogRef.value.hide();
} else {
NotifyManager.warn('未配置任何属性');
}
}
},
},
],
};
const templateParamsGrid = {
queryFormFields: [
{ label: '变量编码', name: 'paramsCode', type: 'w-text' },
{ label: '变量名称', name: 'paramsName', type: 'w-text' },
{
label: '所属模板',
name: 'reportExcelTemplate',
type: 'w-select',
clearable: true,
queryOperator: 'equals',
options: [],
},
{
label: '变量类型',
name: 'paramsType',
type: 'w-select',
queryOperator: 'equals',
options: [
{ label: '单值', value: 'SING' },
{ label: '列表', value: 'LIST' },
],
},
],
toolbarActions: ['query', 'reset', 'separator'],
columns: [
{ name: 'paramsCode', label: '变量编码' },
{ name: 'paramsName', label: '变量名称' },
{
name: 'paramsType',
label: '变量类型',
format: (val) => {
if (val === 'SING') {
return '单值';
} else if (val === 'LIST') {
return '列表';
} else {
return val;
}
},
},
{
name: 'paramsIsCommon',
label: '变量是否通用',
format: (val) => {
if (val === true) {
return '所有模板均可使用';
} else if (val === false) {
return '指定模板可使用';
} else {
return val;
}
},
},
{ name: 'reportExcelTemplateName', label: '所属模板名称' },
{ name: 'lastModifier', label: '最后修改人' },
{ name: 'lastModifyDate', label: '最后修改时间' },
],
};
const form = {
fields: [
{
label: '循环的列表名',
name: 'listName',
type: 'w-grid-select',
requiredIf: true,
displayValue: 'paramsName',
grid: {
title: '模板变量列表',
primaryKey: 'paramsCode',
sortNo: true,
dense: true,
dataUrl: Environment.apiContextPath('api/excel/template/params'),
columns: templateParamsGrid.columns,
queryFormFields: templateParamsGrid.queryFormFields,
queryFormColsNum: 2,
queryFormRowNum: 2,
sortBy: ['-lastModifyDate'],
},
},
{ label: '循环列表中一行数据占几行', name: 'dataRowNum', type: 'w-number' },
{
label: '单元格值相等时字体加粗',
name: 'fontWeight',
type: 'w-text',
hint: `当值匹配上任意值字体加粗,英文逗号分隔。示例:合计,不适用`,
},
{
label: '单元格值相等时字体加粗-该行后续列都加粗',
name: 'fontWeightRow',
type: 'w-select',
options: [
{ label: '是', value: 'true' },
{ label: '否', value: 'false' },
],
},
{
label: '单元格根据值设置背景色',
name: 'cellBgColor',
type: 'w-text',
hint: `当值匹配上时设置对应的背景色,等号左边为单元格值,右边为设置的背景色,位置需对应,英文逗号分隔。示例:不达标,达标,其他=#f44336,#2196f3,#bdbdbd`,
},
{
label: '单元格根据值设置背景色-该行后续列都设置相同背景色',
name: 'cellBgColorRow',
type: 'w-select',
options: [
{ label: '是', value: 'true' },
{ label: '否', value: 'false' },
],
},
{
label: '单元格码值转换',
name: 'cellValueTransformed',
type: 'w-text',
hint: `当值匹配上时显示转换后的值,等号左边为原始值,右边为转换值,位置需对应,英文逗号分隔。示例:1,2=年,月 转换为空示例:-999=NULL`,
},
{ label: '单元格批注', name: 'cellComment', type: 'w-textarea', rows: 2 },
],
};
const listParamsDialog = {
buttons: [
{
icon: 'save',
label: '确定',
click: () => {
const tableSelected = templateParamsGridRef.value.getSelectedRows();
if (!tableSelected || tableSelected.length === 0) {
NotifyManager.info('请选择模板变量');
return;
}
formRef.value.setFieldValue('listName', tableSelected[0].paramsCode);
listParamsDialogRef.value.hide();
},
},
],
};
const getTemplateListFun = async () => {
const resp = await axios.get(Environment.apiContextPath('api/excel/template?pageable=false'));
if (resp.data?.content) {
const options = <any>[];
resp.data.content.forEach((item) => {
options.push({ label: item.templateName, value: item.id });
});
state.templateArray = options;
templateParamsGridRef.value.getQueryForm().getFields()['reportExcelTemplate'].options = options;
setTimeout(() => {
if (state.tableSelectedTemplateId) {
templateParamsGridRef.value.getQueryForm().setFieldValue('reportExcelTemplate', state.tableSelectedTemplateId);
templateParamsGridRef.value.getQueryForm().setFieldValue('paramsType', 'LIST');
}
templateParamsGridRef.value.refresh();
}, 100);
}
};
const show = (templateId, data) => {
dialogRef.value.show();
if (templateId) {
state.tableSelectedTemplateId = templateId;
} else {
state.tableSelectedTemplateId = null;
}
nextTick(() => {
if (data) {
formRef.value.setData(data);
}
});
};
const hide = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
});
</script>

339
io.sc.platform.lcdp.frontend/src/views/excel_template/luckysheet/LuckySheet.vue

@ -1,339 +0,0 @@
<template>
<q-card ref="cardRef" flat bordered :style="cardHeightComponent">
<q-card-section class="p-2.5">
<div class="flex gap-2">
<div class="grow">
<q-file v-model="impFile" label="导入Excel文件" outlined dense accept=".xlsx,.xls" @update:model-value="loadExcel($event)">
<template #append>
<q-icon name="attachment" />
</template>
</q-file>
</div>
<div class="flex flex-none">
<q-btn label="选取变量" :icon="PlatformIconEnum.选取变量" @click="selectParams"></q-btn>
</div>
<div class="flex flex-none">
<q-btn-dropdown :icon="PlatformIconEnum.设置" label="循环属性配置" unelevated outline>
<q-list>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label @click="openConfigDialog('main')"><q-icon :name="PlatformIconEnum.更多查询"></q-icon> ()</q-item-label>
</q-item-section>
</q-item>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label @click="openConfigDialog('column')"><q-icon :name="PlatformIconEnum.更多查询"></q-icon> ()</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</div>
<div class="flex flex-none">
<q-btn label="保存并关闭" :icon="PlatformIconEnum.保存" @click="save"></q-btn>
</div>
<div class="flex flex-none">
<q-btn label="导出文件" :icon="PlatformIconEnum.下载" @click="downloadExcel"></q-btn>
</div>
</div>
</q-card-section>
<TemplateParamsSelectDialog ref="paramsSelectDialogRef" @set-params="setParams"></TemplateParamsSelectDialog>
<TemplateSetForEachParamsDialog ref="setForEachParamsDialogRef" @set-for-each-params="setForEachParams"></TemplateSetForEachParamsDialog>
<TemplateSetColumnParamsDialog ref="setColumnParamsDialogRef" @set-for-each-params="setForEachParams"></TemplateSetColumnParamsDialog>
<div id="luckysheet"></div>
</q-card>
</template>
<script setup lang="ts">
import { ref, onMounted, computed, reactive } from 'vue';
import { useRoute, onBeforeRouteUpdate } from 'vue-router';
import LuckyExcel from 'luckyexcel';
import { exportExcel } from './export';
import { useQuasar } from 'quasar';
import { axios, TagViewManager, Environment, PlatformIconEnum, Tools, NotifyManager } from 'platform-core';
import TemplateParamsSelectDialog from '@/views/excel_template/TemplateParamsSelectDialog.vue';
import TemplateSetForEachParamsDialog from '@/views/excel_template/TemplateSetForeachPropsDialog.vue';
import TemplateSetColumnParamsDialog from '@/views/excel_template/TemplateSetColumnParamsDialog.vue';
const gc = Environment.getConfigure();
const $q = useQuasar();
const impFile = ref(null);
const paramsSelectDialogRef = ref();
const setForEachParamsDialogRef = ref();
const setColumnParamsDialogRef = ref();
const route = useRoute();
const cardRef = ref();
console.info('route------------', route);
//
onBeforeRouteUpdate((to, from, next) => {
console.info('to------------', to);
initExcel(to.query.templateId);
next();
});
const state = reactive({
cardY: 0,
});
const cardHeightComponent = computed(() => {
//
const screenHeight = $q.screen.height;
// XX
const footerHeight = gc.theme.footer.enable ? gc.theme.footer.height : 0;
const cardHeight = screenHeight - footerHeight - state.cardY - 10;
return {
height: cardHeight + 'px',
};
});
const loadExcel = (value) => {
const { name } = value;
const suffixArr = name.split('.');
const suffix = suffixArr[suffixArr.length - 1];
if (suffix !== 'xlsx') {
NotifyManager.info('只能导入xlsx格式的Excel文件');
return;
}
LuckyExcel.transformExcelToLucky(value, (exportJson) => {
if (exportJson.sheets === null || exportJson.sheets.length === 0) {
NotifyManager.info(`只能导入'xlsx'格式的Excel文件`);
return;
}
window.luckysheet.destroy();
const data = [
{
...exportJson.sheets[0],
...{
column: 26,
row: 30,
},
},
];
luckysheetOptions.data = data;
window.luckysheet.create({
lang: 'zh',
container: 'luckysheet',
showinfobar: false,
showtoolbar: true, //
sheetFormulaBar: true, //
showsheetbar: false, // sheet
data: data,
title: exportJson.info.name,
userInfo: exportJson.info.name.creator,
});
});
};
const downloadExcel = () => {
// eslint-disable-next-line
exportExcel(luckysheet.getAllSheets(), '下载');
};
const luckysheetData = [
{
name: 'Cell', //
color: '', //
index: 0, //
status: 1, //
order: 0, //
hide: 0, //
defaultRowHeight: 19, //
defaultColWidth: 73, //
column: 26,
row: 30,
celldata: [], // 使
config: {
merge: {}, //
rowlen: {}, //
columnlen: {}, //
rowhidden: {}, //
colhidden: {}, //
borderInfo: [], //
authority: {}, //
},
scrollLeft: 0, //
scrollTop: 0, //
luckysheet_select_save: [], //
calcChain: [], //
isPivotTable: false, //
pivotTable: {}, //
filter_select: {}, //
filter: null, //
luckysheet_alternateformat_save: [], //
luckysheet_alternateformat_save_modelCustom: [], //
luckysheet_conditionformat_save: {}, //
frozen: {}, //
chart: [], //
zoomRatio: 1, //
image: [], //
showGridLines: 1, // 线
dataVerification: {}, //
},
];
const luckysheetOptions = {
container: 'luckysheet', // DOMid
lang: 'zh', //
title: '测试', //
allowEdit: true, //
rowHeaderWidth: 46, // 0A,B,C46
columnHeaderHeight: 20, // 020
showtoolbar: true, //
showinfobar: false, // luckysheetlogo
userInfo: 'likunming', // showinfobar使
sheetFormulaBar: true, //
defaultFontSize: 11, // ,11
showsheetbar: false, // sheet
data: luckysheetData, //
};
const luckySheetEdit = () => {
luckysheetOptions.allowEdit = true;
luckysheetOptions.showtoolbar = true;
luckysheetOptions.sheetFormulaBar = true;
// eslint-disable-next-line
luckysheet.create(luckysheetOptions);
};
const luckySheetSave = () => {
luckysheetOptions.allowEdit = false;
luckysheetOptions.showtoolbar = false;
luckysheetOptions.sheetFormulaBar = false;
// eslint-disable-next-line
luckysheet.create(luckysheetOptions);
};
const selectParams = () => {
// eslint-disable-next-line
const selectRange = luckysheet.getRange();
if (!selectRange || selectRange.length === 0) {
platformNotify($q, '请选择要插入变量的Excel单元格');
return;
} else if (selectRange && selectRange.length > 1) {
platformNotify($q, '只支持单个选区选取变量');
return;
}
paramsSelectDialogRef.value.dialogShow(route.query?.templateId);
};
const setParams = (paramsCode: string | Array<string>) => {
if (typeof paramsCode === 'string') {
// eslint-disable-next-line
let rangeValue = luckysheet.getRangeValue();
rangeValue[0][0] = { ...rangeValue[0][0], ...{ m: paramsCode, v: paramsCode } };
// eslint-disable-next-line
luckysheet.setRangeValue(rangeValue);
} else {
// eslint-disable-next-line
const currRange = luckysheet.getRange();
paramsCode.forEach((item, index) => {
const tmpRangeValue = [[{ m: item, v: item }]];
const tmp = {
row: [currRange[0].row[0], currRange[0].row[1]],
column: [currRange[0].column[0] + index, currRange[0].column[1] + index],
};
// eslint-disable-next-line
luckysheet.setRangeValue(tmpRangeValue, { range: tmp });
});
}
};
// eslint-disable-next-line
const psReg = /\@\{(.*)\}\@/;
const openConfigDialog = (configType) => {
// eslint-disable-next-line
const range = luckysheet.getRange();
// eslint-disable-next-line
const rangeValue = luckysheet.getRangeValue();
if (!range) {
NotifyManager.info('请选择要配置属性的单元格');
return;
} else if (range && range.length > 1) {
NotifyManager.info('多个选区无法配置属性,选择单元格既可');
return;
}
let data = {};
if (rangeValue[0] && rangeValue[0][0] && rangeValue[0][0].ps && rangeValue[0][0].ps.value) {
let tmp = rangeValue[0][0].ps.value.replaceAll('\n', '');
data = JSON.parse(psReg.exec(tmp)[1]);
}
if (configType === 'main') {
setForEachParamsDialogRef.value.dialogShow(route.query?.templateId, data);
} else {
setColumnParamsDialogRef.value.dialogShow(data);
}
};
const setForEachParams = (formData) => {
// eslint-disable-next-line
const range = luckysheet.getRange();
let tmp = '@{{\n';
Object.keys(formData).forEach((item) => {
if (!Tools.isEmpty(formData[item])) {
tmp += '"' + item + '"' + ':' + '"' + formData[item] + '"' + ',' + '\n';
}
});
tmp = tmp.substring(0, tmp.length - 2);
tmp += '\n}}@';
// eslint-disable-next-line
luckysheet.insertComment(range[0].row[0], range[0].column[0], tmp);
//
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.width = 300;
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.height = 150;
luckysheetOptions.data[0].data[range[0].row[0]][range[0].column[0]].ps.isShow = false;
// eslint-disable-next-line
luckysheet.refresh();
};
const save = async () => {
// eslint-disable-next-line
if (!luckysheet.getAllSheets() || luckysheet.getAllSheets().length === 0) {
NotifyManager.info('系统异常,未获取到需要保存的Sheet数据')
return;
}
// celldata使data
// eslint-disable-next-line
const saveData = { ...luckysheet.getAllSheets()[0], ...{ celldata: [] } };
//
let requestParams = {
method: 'POST',
headers: { 'content-type': 'application/json;charset=utf-8;' },
data: { templateConfig: JSON.stringify(saveData) },
url: Environment.apiContextPath('api/excel/template/updateConfig/') + route.query.templateId,
};
const resp = await axios(requestParams).catch((error) => {
console.info('error====', error);
NotifyManager.error('保存失败');
});
NotifyManager.error('保存成功')
//
// const index = TagViewManager.getTagViews().findIndex((item) => item.fullPath.indexOf(route.query.templateId) > -1);
TagViewManager.removeTagView({ mode: 'current' });
};
const initExcel = async (templateId?: any) => {
if (window.luckysheet) {
window.luckysheet.destroy();
}
const resp = await axios.get(Environment.apiContextPath('api/excel/template/') + (templateId ?? route.query.templateId));
if (resp?.data?.templateConfig) {
luckysheetOptions.data = [eval('(' + resp.data.templateConfig + ')')];
}
// eslint-disable-next-line
luckysheet.create(luckysheetOptions);
};
onMounted(async () => {
state.cardY = cardRef.value.$el.getBoundingClientRect()?.y;
initExcel();
});
</script>
<style scoped>
#luckysheet {
margin: 0px;
padding: 0px;
position: absolute;
width: 100%;
left: 0px;
top: 70px;
bottom: 0px;
}
</style>

319
io.sc.platform.lcdp.frontend/src/views/excel_template/luckysheet/export.js

@ -1,319 +0,0 @@
import Excel from 'exceljs';
import FileSaver from 'file-saver';
const exportExcel = function (luckysheet, value) {
// 参数为luckysheet.getluckysheetfile()获取的对象
// 1.创建工作簿,可以为工作簿添加属性
const workbook = new Excel.Workbook();
// 2.创建表格,第二个参数可以配置创建什么样的工作表
if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
luckysheet = [luckysheet];
}
luckysheet.forEach(function (table) {
if (table.data.length === 0) return true;
// ws.getCell('B2').fill = fills.
const worksheet = workbook.addWorksheet(table.name);
const merge = (table.config && table.config.merge) || {};
const borderInfo = (table.config && table.config.borderInfo) || {};
// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
setStyleAndValue(table.data, worksheet);
setMerge(merge, worksheet);
setBorder(borderInfo, worksheet);
return true;
});
// return
// 4.写入 buffer
const buffer = workbook.xlsx.writeBuffer().then((data) => {
// console.log('data', data)
const blob = new Blob([data], {
type: 'application/vnd.ms-excel;charset=utf-8',
});
console.log('导出成功!');
FileSaver.saveAs(blob, `${value}.xlsx`);
});
return buffer;
};
var setMerge = function (luckyMerge = {}, worksheet) {
const mergearr = Object.values(luckyMerge);
mergearr.forEach(function (elem) {
// elem格式:{r: 0, c: 0, rs: 1, cs: 2}
// 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs);
});
};
var setBorder = function (luckyBorderInfo, worksheet) {
if (!Array.isArray(luckyBorderInfo)) return;
// console.log('luckyBorderInfo', luckyBorderInfo)
luckyBorderInfo.forEach(function (elem) {
// 现在只兼容到borderType 为range的情况
// console.log('ele', elem)
if (elem.rangeType === 'range') {
let border = borderConvert(elem.borderType, elem.style, elem.color);
let rang = elem.range[0];
// console.log('range', rang)
let row = rang.row;
let column = rang.column;
for (let i = row[0] + 1; i < row[1] + 2; i++) {
for (let y = column[0] + 1; y < column[1] + 2; y++) {
worksheet.getCell(i, y).border = border;
}
}
}
if (elem.rangeType === 'cell') {
// col_index: 2
// row_index: 1
// b: {
// color: '#d0d4e3'
// style: 1
// }
const { col_index, row_index } = elem.value;
const borderData = Object.assign({}, elem.value);
delete borderData.col_index;
delete borderData.row_index;
let border = addborderToCell(borderData, row_index, col_index);
// console.log('bordre', border, borderData)
worksheet.getCell(row_index + 1, col_index + 1).border = border;
}
// console.log(rang.column_focus + 1, rang.row_focus + 1)
// worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
});
};
var setStyleAndValue = function (cellArr, worksheet) {
if (!Array.isArray(cellArr)) return;
cellArr.forEach(function (row, rowid) {
row.every(function (cell, columnid) {
if (!cell) return true;
let fill = fillConvert(cell.bg);
let font = fontConvert(cell.ff, cell.fc, cell.bl, cell.it, cell.fs, cell.cl, cell.ul);
let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr);
let value = '';
if (cell.f) {
value = { formula: cell.f, result: cell.v };
} else if (!cell.v && cell.ct && cell.ct.s) {
// xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后
// value = cell.ct.s[0].v
cell.ct.s.forEach((arr) => {
value += arr.v;
});
} else {
value = cell.v;
}
// style 填入到_value中可以实现填充色
let letter = createCellPos(columnid);
let target = worksheet.getCell(letter + (rowid + 1));
// console.log('1233', letter + (rowid + 1))
for (const key in fill) {
target.fill = fill;
break;
}
target.font = font;
target.alignment = alignment;
target.value = value;
return true;
});
});
};
var fillConvert = function (bg) {
if (!bg) {
return {};
}
// const bgc = bg.replace('#', '')
let fill = {
type: 'pattern',
pattern: 'solid',
fgColor: { argb: bg.replace('#', '') },
};
return fill;
};
var fontConvert = function (ff = 0, fc = '#000000', bl = 0, it = 0, fs = 10, cl = 0, ul = 0) {
// luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
const luckyToExcel = {
0: '微软雅黑',
1: '宋体(Song)',
2: '黑体(ST Heiti)',
3: '楷体(ST Kaiti)',
4: '仿宋(ST FangSong)',
5: '新宋体(ST Song)',
6: '华文新魏',
7: '华文行楷',
8: '华文隶书',
9: 'Arial',
10: 'Times New Roman ',
11: 'Tahoma ',
12: 'Verdana',
num2bl: function (num) {
return num === 0 ? false : true;
},
};
// 出现Bug,导入的时候ff为luckyToExcel的val
let font = {
name: typeof ff === 'number' ? luckyToExcel[ff] : ff,
family: 1,
size: fs,
color: { argb: fc.replace('#', '') },
bold: luckyToExcel.num2bl(bl),
italic: luckyToExcel.num2bl(it),
underline: luckyToExcel.num2bl(ul),
strike: luckyToExcel.num2bl(cl),
};
return font;
};
var alignmentConvert = function (vt = 'default', ht = 'default', tb = 'default', tr = 'default') {
// luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
const luckyToExcel = {
vertical: {
0: 'middle',
1: 'top',
2: 'bottom',
default: 'top',
},
horizontal: {
0: 'center',
1: 'left',
2: 'right',
default: 'left',
},
wrapText: {
0: false,
1: false,
2: true,
default: false,
},
textRotation: {
0: 0,
1: 45,
2: -45,
3: 'vertical',
4: 90,
5: -90,
default: 0,
},
};
let alignment = {
vertical: luckyToExcel.vertical[vt],
horizontal: luckyToExcel.horizontal[ht],
wrapText: luckyToExcel.wrapText[tb],
textRotation: luckyToExcel.textRotation[tr],
};
return alignment;
};
var borderConvert = function (borderType, style = 1, color = '#000') {
// 对应luckysheet的config中borderinfo的的参数
if (!borderType) {
return {};
}
const luckyToExcel = {
type: {
'border-all': 'all',
'border-top': 'top',
'border-right': 'right',
'border-bottom': 'bottom',
'border-left': 'left',
},
style: {
0: 'none',
1: 'thin',
2: 'hair',
3: 'dotted',
4: 'dashDot', // 'Dashed',
5: 'dashDot',
6: 'dashDotDot',
7: 'double',
8: 'medium',
9: 'mediumDashed',
10: 'mediumDashDot',
11: 'mediumDashDotDot',
12: 'slantDashDot',
13: 'thick',
},
};
let template = {
style: luckyToExcel.style[style],
color: { argb: color.replace('#', '') },
};
let border = {};
if (luckyToExcel.type[borderType] === 'all') {
border['top'] = template;
border['right'] = template;
border['bottom'] = template;
border['left'] = template;
} else {
border[luckyToExcel.type[borderType]] = template;
}
// console.log('border', border)
return border;
};
function addborderToCell(borders, row_index, col_index) {
let border = {};
const luckyExcel = {
type: {
l: 'left',
r: 'right',
b: 'bottom',
t: 'top',
},
style: {
0: 'none',
1: 'thin',
2: 'hair',
3: 'dotted',
4: 'dashDot', // 'Dashed',
5: 'dashDot',
6: 'dashDotDot',
7: 'double',
8: 'medium',
9: 'mediumDashed',
10: 'mediumDashDot',
11: 'mediumDashDotDot',
12: 'slantDashDot',
13: 'thick',
},
};
// console.log('borders', borders)
for (const bor in borders) {
// console.log(bor)
if (borders[bor].color.indexOf('rgb') === -1) {
border[luckyExcel.type[bor]] = {
style: luckyExcel.style[borders[bor].style],
color: { argb: borders[bor].color.replace('#', '') },
};
} else {
border[luckyExcel.type[bor]] = {
style: luckyExcel.style[borders[bor].style],
color: { argb: borders[bor].color },
};
}
}
return border;
}
function createCellPos(n) {
let ordA = 'A'.charCodeAt(0);
let ordZ = 'Z'.charCodeAt(0);
let len = ordZ - ordA + 1;
let s = '';
while (n >= 0) {
s = String.fromCharCode((n % len) + ordA) + s;
n = Math.floor(n / len) - 1;
}
return s;
}
export { exportExcel };

27
io.sc.platform.lcdp.frontend/src/views/excel_template/template.ts

@ -1,27 +0,0 @@
const cellFormatMap = new Map();
// 纯文本
cellFormatMap.set('1', { fa: '@', t: 's' });
// 数字格式-整数
cellFormatMap.set('2', { fa: '0', t: 'n' });
// 数字格式-两位小数
cellFormatMap.set('3', { fa: '0.00', t: 'n' });
// 数字格式-四位小数
cellFormatMap.set('4', { fa: '0.0000', t: 'n' });
// 百分比整数
cellFormatMap.set('5', { fa: '0%', t: 'n' });
// 百分比两位小数
cellFormatMap.set('6', { fa: '0.00%', t: 'n' });
// 万元两位小数(示例:12万3456.00)
cellFormatMap.set('7', { fa: 'w0.00', t: 'n' });
// 千位符整数(示例:1,235)
cellFormatMap.set('8', { fa: '#,##0', t: 'n' });
// 千位符两位小数(示例:1,234.56)
cellFormatMap.set('9', { fa: '#,##0.00', t: 'n' });
/**
*
* @param index
*/
export function getExcelCellFormatObject(index: string) {
return cellFormatMap.get(index);
}

9
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java

@ -1,10 +1,19 @@
package io.sc.platform.lcdp.configure.api; package io.sc.platform.lcdp.configure.api;
public class Setting { public class Setting {
private long sessionTimeout =30 * 60; // 会话过期时间(单位:秒)
private String homePage ="/home"; // 首页路由 path private String homePage ="/home"; // 首页路由 path
private I18n i18n =new I18n(); // 多语言国际化 private I18n i18n =new I18n(); // 多语言国际化
private boolean isMultiCorporationMode =false; // 是否是多法人模式 private boolean isMultiCorporationMode =false; // 是否是多法人模式
public long getSessionTimeout() {
return sessionTimeout;
}
public void setSessionTimeout(long sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
public String getHomePage() { public String getHomePage() {
return homePage; return homePage;
} }

12
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java

@ -1,21 +1,24 @@
package io.sc.platform.lcdp.configure.service.impl; package io.sc.platform.lcdp.configure.service.impl;
import io.sc.platform.lcdp.configure.api.Configure;
import io.sc.platform.lcdp.configure.api.Oauth2; import io.sc.platform.lcdp.configure.api.Oauth2;
import io.sc.platform.lcdp.configure.api.Setting; import io.sc.platform.lcdp.configure.api.Setting;
import io.sc.platform.lcdp.configure.api.Theme; import io.sc.platform.lcdp.configure.api.Theme;
import io.sc.platform.lcdp.configure.jpa.entity.ConfigureEntity; import io.sc.platform.lcdp.configure.jpa.entity.ConfigureEntity;
import io.sc.platform.lcdp.configure.jpa.repository.ConfigureRepository; import io.sc.platform.lcdp.configure.jpa.repository.ConfigureRepository;
import io.sc.platform.lcdp.configure.service.ConfigureService; import io.sc.platform.lcdp.configure.service.ConfigureService;
import io.sc.platform.lcdp.configure.api.Configure;
import io.sc.platform.mvc.service.SystemParameterService; import io.sc.platform.mvc.service.SystemParameterService;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.session.SessionProperties;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.Duration;
import java.time.temporal.TemporalUnit;
@Service("io.sc.platform.lcdp.configure.service.impl.ConfigureServiceImpl") @Service("io.sc.platform.lcdp.configure.service.impl.ConfigureServiceImpl")
public class ConfigureServiceImpl extends DaoServiceImpl<ConfigureEntity, String, ConfigureRepository> implements ConfigureService { public class ConfigureServiceImpl extends DaoServiceImpl<ConfigureEntity, String, ConfigureRepository> implements ConfigureService {
@ -42,6 +45,13 @@ public class ConfigureServiceImpl extends DaoServiceImpl<ConfigureEntity, String
configure.setSetting(entity.getSetting()); configure.setSetting(entity.getSetting());
configure.setTheme(entity.getTheme()); configure.setTheme(entity.getTheme());
} }
Duration duration =environment.getProperty("server.servlet.session.timeout", Duration.class,null);
if(duration==null) {
configure.getSetting().setSessionTimeout(30*60);
}else{
configure.getSetting().setSessionTimeout(duration.getSeconds());
}
String homePage =systemParameterService.getParameter("parameter.system.homePage"); String homePage =systemParameterService.getParameter("parameter.system.homePage");
if(StringUtils.hasText(homePage)) { if(StringUtils.hasText(homePage)) {
configure.getSetting().setHomePage(homePage); configure.getSetting().setHomePage(homePage);

2
io.sc.platform.license.keygen.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

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

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
io.sc.platform.scheduler.manager.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
io.sc.platform.scheduler.manager.frontend/src/views/task/Task.vue

@ -101,7 +101,7 @@
label: $t('lcdp.scheduler.task.grid.entity.type'), label: $t('lcdp.scheduler.task.grid.entity.type'),
format: Formater.enum(Enums.TaskType), format: Formater.enum(Enums.TaskType),
}, },
{ width: 150, name: 'name', label: $t('name') }, { width: 300, name: 'name', label: $t('name') },
{ {
width: 100, width: 100,
name: 'scheduleType', name: 'scheduleType',

2
io.sc.platform.security/src/main/java/io/sc/platform/security/jwt/JwtEncoderUtil.java

@ -39,7 +39,7 @@ public class JwtEncoderUtil {
builder.id(UUID.randomUUID().toString()); builder.id(UUID.randomUUID().toString());
Instant now =Instant.now(); Instant now =Instant.now();
builder.issuedAt(now); builder.issuedAt(now);
builder.expiresAt(now.plusSeconds(60*60));//1小时后过期 builder.expiresAt(now.plusSeconds(8*60*60));//8小时后过期
for(String key : map.keySet()){ for(String key : map.keySet()){
builder.claim(key,map.get(key)); builder.claim(key,map.get(key));
} }

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

@ -110,7 +110,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.system/src/main/java/io/sc/platform/system/application/jpa/entity/ApplicationEntity.java

@ -24,18 +24,18 @@ public class ApplicationEntity extends CorporationAuditorEntity<ApplicationVo> {
private String id; private String id;
//代码 //代码
@Column(name="CODE_",nullable=false,length=254) @Column(name="CODE_",nullable=false,length=255)
@Size(max=254) @Size(max=255)
private String code; private String code;
//名称 //名称
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(min=1,max=255) @Size(min=1,max=255)
private String name; private String name;
//描述 //描述
@Column(name="DESCRIPTION_", length=254) @Column(name="DESCRIPTION_", length=255)
@Size(max=254) @Size(max=255)
private String description; private String description;
//是否可用 //是否可用

14
io.sc.platform.system/src/main/java/io/sc/platform/system/role/jpa/entity/RoleEntity.java

@ -33,18 +33,18 @@ public class RoleEntity extends CorporationAuditorEntity<RoleVo> {
private String id; private String id;
//代码 //代码
@Column(name="CODE_",nullable=false,length=254) @Column(name="CODE_",nullable=false,length=255)
@Size(max=254) @Size(max=255)
private String code; private String code;
//名称 //名称
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(min=1,max=255) @Size(min=1,max=255)
private String name; private String name;
//描述 //描述
@Column(name="DESCRIPTION_", length=254) @Column(name="DESCRIPTION_", length=255)
@Size(max=254) @Size(max=255)
private String description; private String description;
//是否可用 //是否可用
@ -53,8 +53,8 @@ public class RoleEntity extends CorporationAuditorEntity<RoleVo> {
private Boolean enable; private Boolean enable;
//默认首页面模版路径 //默认首页面模版路径
@Column(name="INDEX_PAGE_URL_", length=254) @Column(name="INDEX_PAGE_URL_", length=255)
@Size(max=254) @Size(max=255)
private String indexPageUrl; private String indexPageUrl;
//角色包含的用户集合 //角色包含的用户集合

2
io.sc.standard.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.31", "platform-core": "8.2.33",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

4
io.sc.standard/src/main/java/io/sc/standard/jpa/entity/IndustryEntity.java

@ -17,8 +17,8 @@ public class IndustryEntity extends AuditorEntity<IndustryVo> {
@Size(max=5) @Size(max=5)
private String code; private String code;
@Column(name="NAME_", length=254) @Column(name="NAME_", length=255)
@Size(max=254) @Size(max=255)
private String name; private String name;
@Column(name="DESCRIPTION_", length=1024) @Column(name="DESCRIPTION_", length=1024)

2
io.sc.website/package.json

@ -28,6 +28,6 @@
}, },
"dependencies": { "dependencies": {
"vue": "3.5.13", "vue": "3.5.13",
"platform-core": "8.2.31" "platform-core": "8.2.33"
} }
} }
Loading…
Cancel
Save