diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java index bd4d63ce..19f3c659 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java +++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/config/FilterConfig.java @@ -28,10 +28,14 @@ public class FilterConfig { UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); if (StringUtils.isNotBlank(applicationConfig.getCredentialIpList())) { - String[] credentialIpList = StringUtils.split(applicationConfig.getCredentialIpList(), ","); - if (credentialIpList.length > 0) { - for (String ip : credentialIpList) { - corsConfiguration.addAllowedOrigin(ip); + if ("*".equals(applicationConfig.getCredentialIpList())) { + corsConfiguration.addAllowedOriginPattern("*"); + } else { + String[] credentialIpList = StringUtils.split(applicationConfig.getCredentialIpList(), ","); + if (credentialIpList.length > 0) { + for (String ip : credentialIpList) { + corsConfiguration.addAllowedOrigin(ip); + } } } corsConfiguration.addAllowedHeader("*"); diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/SysDeptRelationMapper.java b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/SysDeptRelationMapper.java index 4c438921..a6d7151a 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/SysDeptRelationMapper.java +++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/SysDeptRelationMapper.java @@ -26,7 +26,7 @@ public interface SysDeptRelationMapper extends BaseDaoMapper { /** * 批量插入部门关联数据。 * 由于目前版本(3.4.1)的Mybatis Plus没有提供真正的批量插入,为了保证效率需要自己实现。 - * 目前我们仅仅给出MySQL的insert list实现作为参考,其他数据库需要自行修改。 + * 目前我们仅仅给出MySQL和PostgresSQL的insert list实现作为参考,其他数据库需要自行修改。 * * @param deptRelationList 部门关联关系数据列表。 */ diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/mapper/SysPostMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/mapper/SysPostMapper.xml index 56fec569..1be28260 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/mapper/SysPostMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/java/com/orangeforms/webadmin/upms/dao/mapper/SysPostMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application-dev.yml b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application-dev.yml new file mode 100644 index 00000000..c5d04f87 --- /dev/null +++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application-dev.yml @@ -0,0 +1,98 @@ +spring: + # aj-captcha 对redis缓存的依赖。 + redis: + database: 2 + host: localhost + port: 6379 + password: '' + timeout: 60000 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + # 数据库链接 [主数据源] + main: + url: jdbc:mysql://localhost:3306/zzdemo-online?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + name: application-webadmin + initialSize: 10 + minIdle: 10 + maxActive: 50 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + maxOpenPreparedStatements: 20 + validationQuery: SELECT 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + filters: stat,wall + useGlobalDataSourceStat: true + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*,/actuator/*" + stat-view-servlet: + enabled: true + urlPattern: /druid/* + resetEnable: true + +application: + # Jwt令牌加密的签名值。该值的长度要超过10个字符(过短会报错)。 + tokenSigningKey: DemoFlow-signing-key + # Jwt令牌在Http Header中的键名称。 + tokenHeaderKey: Authorization + # Jwt令牌刷新后在Http Header中的键名称。 + refreshedTokenHeaderKey: RefreshedToken + # Jwt令牌过期时间(毫秒)。 + expiration: 72000000 + # 初始化密码。 + defaultUserPassword: 123456 + # 缺省的文件上传根目录。 + uploadFileBaseDir: ./zz-resource/upload-files/app + # 跨域的IP(http://192.168.10.10:8086)白名单列表,多个IP之间逗号分隔(* 表示全部信任,空白表示禁用跨域信任)。 + credentialIpList: "*" + # Session的用户和数据权限在Redis中的过期时间(秒)。 + sessionExpiredSeconds: 86400 + +sequence: + # Snowflake 分布式Id生成算法所需的WorkNode参数值。 + snowflakeWorkNode: 1 + +# 存储session数据的Redis,所有服务均需要,因此放到公共配置中。 +# 根据实际情况,该Redis也可以用于存储其他数据。 +redis: + # redisson的配置。每个服务可以自己的配置文件中覆盖此选项。 + redisson: + # 如果该值为false,系统将不会创建RedissionClient的bean。 + enabled: true + # mode的可用值为,single/cluster/sentinel/master-slave + mode: single + # single: 单机模式 + # address: redis://localhost:6379 + # cluster: 集群模式 + # 每个节点逗号分隔,同时每个节点前必须以redis://开头。 + # address: redis://localhost:6379,redis://localhost:6378,... + # sentinel: + # 每个节点逗号分隔,同时每个节点前必须以redis://开头。 + # address: redis://localhost:6379,redis://localhost:6378,... + # master-slave: + # 每个节点逗号分隔,第一个为主节点,其余为从节点。同时每个节点前必须以redis://开头。 + # address: redis://localhost:6379,redis://localhost:6378,... + address: redis://localhost:6379 + # 链接超时,单位毫秒。 + timeout: 6000 + # 单位毫秒。分布式锁的超时检测时长。 + # 如果一次锁内操作超该毫秒数,或在释放锁之前异常退出,Redis会在该时长之后主动删除该锁使用的key。 + lockWatchdogTimeout: 60000 + # redis 密码,空可以不填。 + password: + pool: + # 连接池数量。 + poolSize: 20 + # 连接池中最小空闲数量。 + minIdle: 5 diff --git a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application.yml b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application.yml index 63b7e8d0..07ac1eb7 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application.yml +++ b/orange-demo-flowable/orange-demo-flowable-service/application-webadmin/src/main/resources/application.yml @@ -59,43 +59,13 @@ pagehelper: supportMethodsArguments: false params: count=countSql -# 存储session数据的Redis,所有服务均需要,因此放到公共配置中。 -# 根据实际情况,该Redis也可以用于存储其他数据。 -redis: - # redisson的配置。每个服务可以自己的配置文件中覆盖此选项。 - redisson: - # 如果该值为false,系统将不会创建RedissionClient的bean。 - enabled: true - # mode的可用值为,single/cluster/sentinel/master-slave - mode: single - # single: 单机模式 - # address: redis://localhost:6379 - # cluster: 集群模式 - # 每个节点逗号分隔,同时每个节点前必须以redis://开头。 - # address: redis://localhost:6379,redis://localhost:6378,... - # sentinel: - # 每个节点逗号分隔,同时每个节点前必须以redis://开头。 - # address: redis://localhost:6379,redis://localhost:6378,... - # master-slave: - # 每个节点逗号分隔,第一个为主节点,其余为从节点。同时每个节点前必须以redis://开头。 - # address: redis://localhost:6379,redis://localhost:6378,... - address: redis://localhost:6379 - # 链接超时,单位毫秒。 - timeout: 6000 - # 单位毫秒。分布式锁的超时检测时长。 - # 如果一次锁内操作超该毫秒数,或在释放锁之前异常退出,Redis会在该时长之后主动删除该锁使用的key。 - lockWatchdogTimeout: 60000 - # redis 密码,空可以不填。 - password: - pool: - # 连接池数量。 - poolSize: 20 - # 连接池中最小空闲数量。 - minIdle: 5 +common-core: + # 可选值为 mysql / postgresql + databaseType: mysql common-online: # 可选值为 mysql / postgresql - datasourceType: mysql + databaseType: mysql # 注意不要以反斜杠(/)结尾。 operationUrlPrefix: /admin/online # 在线表单业务数据上传资源路径 @@ -108,21 +78,25 @@ common-online-api: urlPrefix: /admin/online # 下面的url列表,请保持反斜杠(/)结尾。 viewUrlList: - - ${common-online.operationUrlPrefix}/onlineOperation/viewByDatasourceId/ - - ${common-online.operationUrlPrefix}/onlineOperation/viewByOneToManyRelationId/ - - ${common-online.operationUrlPrefix}/onlineOperation/listByDatasourceId/ - - ${common-online.operationUrlPrefix}/onlineOperation/listByOneToManyRelationId/ - - ${common-online.operationUrlPrefix}/onlineOperation/downloadDatasource/ - - ${common-online.operationUrlPrefix}/onlineOperation/downloadOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/viewByDatasourceId/ + - ${common-online.operationUrlPrefix}/onlineOperation/viewByOneToManyRelationId/ + - ${common-online.operationUrlPrefix}/onlineOperation/listByDatasourceId/ + - ${common-online.operationUrlPrefix}/onlineOperation/listByOneToManyRelationId/ + - ${common-online.operationUrlPrefix}/onlineOperation/exportByDatasourceId/ + - ${common-online.operationUrlPrefix}/onlineOperation/exportByOneToManyRelationId/ + - ${common-online.operationUrlPrefix}/onlineOperation/downloadDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/downloadOneToManyRelation/ editUrlList: - - ${common-online.operationUrlPrefix}/onlineOperation/addDatasource/ - - ${common-online.operationUrlPrefix}/onlineOperation/addOneToManyRelation/ - - ${common-online.operationUrlPrefix}/onlineOperation/updateDatasource/ - - ${common-online.operationUrlPrefix}/onlineOperation/updateOneToManyRelation/ - - ${common-online.operationUrlPrefix}/onlineOperation/deleteDatasource/ - - ${common-online.operationUrlPrefix}/onlineOperation/deleteOneToManyRelation/ - - ${common-online.operationUrlPrefix}/onlineOperation/uploadDatasource/ - - ${common-online.operationUrlPrefix}/onlineOperation/uploadOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/addDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/addOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/updateDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/updateOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/deleteDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/deleteOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/deleteBatchDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/deleteBatchOneToManyRelation/ + - ${common-online.operationUrlPrefix}/onlineOperation/uploadDatasource/ + - ${common-online.operationUrlPrefix}/onlineOperation/uploadOneToManyRelation/ common-flow: # 请慎重修改urlPrefix的缺省配置,注意不要以反斜杠(/)结尾。如必须修改其他路径,请同步修改数据库脚本。 @@ -168,8 +142,7 @@ management: # keys-to-sanitize: keys-to-sanitize: password server: - servlet: - context-path: "/" + base-path: "/" aj: captcha: @@ -206,137 +179,3 @@ aj: aes-status: true # 滑动干扰项(0/1/2) interference-options: 2 - -# 开发数据库相关配置 ---- -spring: - profiles: dev - # aj-captcha 对redis缓存的依赖。 - redis: - database: 2 - host: localhost - port: 6379 - password: '' - timeout: 60000 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - main: - url: jdbc:mysql://localhost:3306/zzdemo-online?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai - username: root - password: 123456 - driver-class-name: com.mysql.cj.jdbc.Driver - name: application-webadmin - initialSize: 10 - minIdle: 10 - maxActive: 50 - maxWait: 60000 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - poolPreparedStatements: true - maxPoolPreparedStatementPerConnectionSize: 20 - maxOpenPreparedStatements: 20 - validationQuery: SELECT 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - filters: stat,wall - useGlobalDataSourceStat: true - web-stat-filter: - enabled: true - url-pattern: /* - exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*,/actuator/*" - stat-view-servlet: - enabled: true - urlPattern: /druid/* - resetEnable: true - -application: - # Jwt令牌加密的签名值。该值的长度要超过10个字符(过短会报错)。 - tokenSigningKey: DemoFlow-signing-key - # Jwt令牌在Http Header中的键名称。 - tokenHeaderKey: Authorization - # Jwt令牌刷新后在Http Header中的键名称。 - refreshedTokenHeaderKey: RefreshedToken - # Jwt令牌过期时间(毫秒)。 - expiration: 72000000 - # 初始化密码。 - defaultUserPassword: 123456 - # 缺省的文件上传根目录。 - uploadFileBaseDir: ./zz-resource/upload-files/app - # 跨域的IP(http://192.168.10.10:8086)白名单列表,多个IP之间逗号分隔(* 表示全部信任,空白表示禁用跨域信任)。 - credentialIpList: "*" - # Session的用户和数据权限在Redis中的过期时间(秒)。 - sessionExpiredSeconds: 86400 - -sequence: - # Snowflake 分布式Id生成算法所需的WorkNode参数值。 - snowflakeWorkNode: 1 - -# 发布数据库相关配置 ---- -spring: - profiles: product - # aj-captcha 对redis缓存的依赖。 - redis: - database: 2 - host: localhost - port: 6379 - password: '' - timeout: 60000 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - main: - url: jdbc:mysql://localhost:3306/zzdemo-online?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai - username: root - password: 123456 - driver-class-name: com.mysql.cj.jdbc.Driver - name: application-webadmin - initialSize: 10 - minIdle: 10 - maxActive: 50 - maxWait: 60000 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - poolPreparedStatements: true - maxPoolPreparedStatementPerConnectionSize: 20 - maxOpenPreparedStatements: 20 - validationQuery: SELECT 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - filters: stat,wall - useGlobalDataSourceStat: true - web-stat-filter: - enabled: true - url-pattern: /* - exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*,/actuator/*" - stat-view-servlet: - enabled: true - urlPattern: /druid/* - resetEnable: true - -application: - # Jwt令牌加密的签名值。该值的长度要超过10个字符(过短会报错)。 - tokenSigningKey: DemoFlow-signing-key - # Jwt令牌在Http Header中的键名称。 - tokenHeaderKey: Authorization - # Jwt令牌刷新后在Http Header中的键名称。 - refreshedTokenHeaderKey: RefreshedToken - # Jwt令牌过期时间(毫秒)。 - expiration: 72000000 - # 初始化密码。 - defaultUserPassword: 123456 - # 缺省的文件上传根目录。 - uploadFileBaseDir: ./zz-resource/upload-files/app - # 跨域的IP(http://192.168.10.10:8086)白名单列表,多个IP之间逗号分隔(* 表示全部信任,空白表示禁用跨域信任)。 - credentialIpList: "*" - # Session的用户和数据权限在Redis中的过期时间(秒)。 - sessionExpiredSeconds: 86400 - -sequence: - # Snowflake 分布式Id生成算法所需的WorkNode参数值。 - snowflakeWorkNode: 1 \ No newline at end of file diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/base/service/BaseService.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/base/service/BaseService.java index 69ae86d1..05d1cdcc 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/base/service/BaseService.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/base/service/BaseService.java @@ -156,8 +156,8 @@ public abstract class BaseService extends ServiceImpl */ private final TableModelInfo tableModelInfo = new TableModelInfo(); - private static final String GROUPED_KEY = "groupedKey"; - private static final String AGGREGATED_VALUE = "aggregatedValue"; + private static final String GROUPED_KEY = "grouped_key"; + private static final String AGGREGATED_VALUE = "aggregated_value"; private static final String AND_OP = " AND "; @Override diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/util/MyDateUtil.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/util/MyDateUtil.java index b6db705e..3e80aa73 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/util/MyDateUtil.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-core/src/main/java/com/orangeforms/common/core/util/MyDateUtil.java @@ -43,6 +43,12 @@ public class MyDateUtil { private static final DateTimeFormatter DATETIME_PARSE_FORMATTER = DateTimeFormat.forPattern(MyDateUtil.COMMON_DATETIME_FORMAT); + /** + * 缺省短日期时间格式化器,提前获取提升运行时效率。 + */ + private static final DateTimeFormatter DATETIME_SHORT_PARSE_FORMATTER = + DateTimeFormat.forPattern(MyDateUtil.COMMON_SHORT_DATETIME_FORMAT); + /** * 获取一天的开始时间的字符串格式,如2019-08-03 00:00:00.000。 * @@ -144,6 +150,16 @@ public class MyDateUtil { return DATETIME_PARSE_FORMATTER.parseDateTime(dateTimeString); } + /** + * 将缺省格式的(不包含毫秒的)日期时间字符串解析为日期对象。 + * + * @param dateTimeString 待解析的字符串。 + * @return 解析后的日期对象。 + */ + public static DateTime toDateTimeWithoutMs(String dateTimeString) { + return DATETIME_SHORT_PARSE_FORMATTER.parseDateTime(dateTimeString); + } + /** * 截取时间到天。如2019-10-03 01:20:30 转换为 2019-10-03 00:00:00。 * 由于没有字符串的中间转换,因此效率更高。 diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishMapper.xml index f222b357..f9ffa126 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishMapper.xml @@ -7,8 +7,8 @@ - - + + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishVariableMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishVariableMapper.xml index c3be0cf1..68bd83ff 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishVariableMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryPublishVariableMapper.xml @@ -10,7 +10,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryVariableMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryVariableMapper.xml index c72fea71..09a4ea8e 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryVariableMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowEntryVariableMapper.xml @@ -10,7 +10,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowMessageMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowMessageMapper.xml index c4360fcf..5e0b41f4 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowMessageMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-flow/src/main/java/com/orangeforms/common/flow/dao/mapper/FlowMessageMapper.xml @@ -17,9 +17,9 @@ - + - + @@ -30,7 +30,7 @@ SELECT COUNT(1) FROM zz_flow_message a - a.task_finished = 0 + a.task_finished = false AND a.message_type = 0 AND (a.task_assignee = #{loginName} OR EXISTS (SELECT * FROM zz_flow_message_candicate_identity b WHERE a.message_id = b.message_id AND b.candidate_id in diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-log/src/main/java/com/orangeforms/common/log/dao/mapper/SysOperationLogMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-log/src/main/java/com/orangeforms/common/log/dao/mapper/SysOperationLogMapper.xml index 891a882d..4523c8af 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-log/src/main/java/com/orangeforms/common/log/dao/mapper/SysOperationLogMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-log/src/main/java/com/orangeforms/common/log/dao/mapper/SysOperationLogMapper.xml @@ -16,7 +16,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online-api/src/main/java/com/orangeforms/common/online/api/controller/OnlineColumnController.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online-api/src/main/java/com/orangeforms/common/online/api/controller/OnlineColumnController.java index 18a2252a..4f3aec06 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online-api/src/main/java/com/orangeforms/common/online/api/controller/OnlineColumnController.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online-api/src/main/java/com/orangeforms/common/online/api/controller/OnlineColumnController.java @@ -154,22 +154,19 @@ public class OnlineColumnController { * 列出符合过滤条件的字段数据列表。 * * @param onlineColumnDtoFilter 过滤对象。 - * @param orderParam 排序参数。 * @param pageParam 分页参数。 * @return 应答结果对象,包含查询结果集。 */ @PostMapping("/list") public ResponseResult> list( @MyRequestBody OnlineColumnDto onlineColumnDtoFilter, - @MyRequestBody MyOrderParam orderParam, @MyRequestBody MyPageParam pageParam) { if (pageParam != null) { PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize()); } OnlineColumn onlineColumnFilter = MyModelUtil.copyTo(onlineColumnDtoFilter, OnlineColumn.class); - String orderBy = MyOrderParam.buildOrderBy(orderParam, OnlineColumn.class); List onlineColumnList = - onlineColumnService.getOnlineColumnListWithRelation(onlineColumnFilter, orderBy); + onlineColumnService.getOnlineColumnListWithRelation(onlineColumnFilter); return ResponseResult.success(MyPageUtil.makeResponseData(onlineColumnList, OnlineColumn.INSTANCE)); } diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java index e14548ac..ba6ce63d 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/controller/OnlineOperationController.java @@ -1,6 +1,7 @@ package com.orangeforms.common.online.controller; import io.swagger.annotations.Api; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; @@ -8,9 +9,7 @@ import com.alibaba.fastjson.JSONObject; import com.orangeforms.common.core.annotation.MyRequestBody; import com.orangeforms.common.core.constant.ErrorCodeEnum; import com.orangeforms.common.core.object.*; -import com.orangeforms.common.core.util.ContextUtil; -import com.orangeforms.common.core.util.MyCommonUtil; -import com.orangeforms.common.core.util.MyPageUtil; +import com.orangeforms.common.core.util.*; import com.orangeforms.common.online.util.OnlineOperationHelper; import com.orangeforms.common.online.dto.OnlineFilterDto; import com.orangeforms.common.online.model.*; @@ -20,7 +19,9 @@ import com.orangeforms.common.online.object.ColumnData; import com.orangeforms.common.online.service.*; import com.orangeforms.common.online.util.OnlineConstant; import com.github.pagehelper.page.PageMethod; +import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.web.bind.annotation.*; @@ -56,6 +57,8 @@ public class OnlineOperationController { private OnlineTableService onlineTableService; @Autowired private OnlineOperationHelper onlineOperationHelper; + @Autowired + private OnlineVirtualColumnService onlineVirtualColumnService; /** * 新增数据接口。 @@ -237,28 +240,23 @@ public class OnlineOperationController { @PathVariable("datasourceVariableName") String datasourceVariableName, @MyRequestBody(required = true) Long datasourceId, @MyRequestBody(required = true) String dataId) { - String errorMessage; - ResponseResult datasourceResult = - onlineOperationHelper.verifyAndGetDatasource(datasourceId); - if (!datasourceResult.isSuccess()) { - return ResponseResult.errorFrom(datasourceResult); - } - OnlineDatasource datasource = datasourceResult.getData(); - if (!datasource.getVariableName().equals(datasourceVariableName)) { - ContextUtil.getHttpResponse().setStatus(HttpServletResponse.SC_FORBIDDEN); - return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); - } - OnlineTable masterTable = datasource.getMasterTable(); - ResponseResult> relationListResult = - onlineOperationHelper.verifyAndGetRelationList(datasourceId, RelationType.ONE_TO_MANY); - if (!relationListResult.isSuccess()) { - return ResponseResult.errorFrom(relationListResult); - } - List relationList = relationListResult.getData(); - if (!onlineOperationService.delete(masterTable, relationList, dataId)) { - return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); - } - return ResponseResult.success(); + return this.doDelete(datasourceVariableName, datasourceId, CollUtil.newArrayList(dataId)); + } + + /** + * 批量删除主数据接口。 + * + * @param datasourceVariableName 数据源名称。 + * @param datasourceId 主表数据源Id。 + * @param dataIdList 待删除的数据表主键Id列表。 + * @return 应该结果。 + */ + @PostMapping("/deleteBatchDatasource/{datasourceVariableName}") + public ResponseResult deleteBatchDatasource( + @PathVariable("datasourceVariableName") String datasourceVariableName, + @MyRequestBody(required = true) Long datasourceId, + @MyRequestBody(required = true, elementType = String.class) List dataIdList) { + return this.doDelete(datasourceVariableName, datasourceId, dataIdList); } /** @@ -276,26 +274,25 @@ public class OnlineOperationController { @MyRequestBody(required = true) Long datasourceId, @MyRequestBody(required = true) Long relationId, @MyRequestBody(required = true) String dataId) { - String errorMessage; - OnlineDatasource datasource = onlineDatasourceService.getById(datasourceId); - if (datasource == null) { - errorMessage = "数据验证失败,数据源Id并不存在!"; - return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); - } - if (!datasource.getVariableName().equals(datasourceVariableName)) { - ContextUtil.getHttpResponse().setStatus(HttpServletResponse.SC_FORBIDDEN); - return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); - } - ResponseResult relationResult = - onlineOperationHelper.verifyAndGetOneToManyRelation(datasourceId, relationId); - if (!relationResult.isSuccess()) { - return ResponseResult.errorFrom(relationResult); - } - OnlineDatasourceRelation relation = relationResult.getData(); - if (!onlineOperationService.delete(relation.getSlaveTable(), null, dataId)) { - return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); - } - return ResponseResult.success(); + return this.doDelete(datasourceVariableName, datasourceId, relationId, CollUtil.newArrayList(dataId)); + } + + /** + * 批量删除一对多关联表单条数据接口。 + * + * @param datasourceVariableName 数据源名称。 + * @param datasourceId 主表数据源Id。 + * @param relationId 一对多关联Id。 + * @param dataIdList 一对多关联表主键Id列表。 + * @return 应该结果。 + */ + @PostMapping("/deleteBatchOneToManyRelation/{datasourceVariableName}") + public ResponseResult deleteBatchOneToManyRelation( + @PathVariable("datasourceVariableName") String datasourceVariableName, + @MyRequestBody(required = true) Long datasourceId, + @MyRequestBody(required = true) Long relationId, + @MyRequestBody(required = true, elementType = String.class) List dataIdList) { + return this.doDelete(datasourceVariableName, datasourceId, relationId, dataIdList); } /** @@ -593,6 +590,66 @@ public class OnlineOperationController { return ResponseResult.success(MyPageUtil.makeResponseData(resultList)); } + /** + * 根据数据源Id,以及接口参数,为动态表单导出数据列表。 + * + * @param datasourceVariableName 数据源名称。 + * @param datasourceId 数据源Id。 + * @param filterDtoList 多虑数据对象列表。 + * @param orderParam 排序对象。 + * @param exportInfoList 导出字段信息列表。 + */ + @PostMapping("/exportByDatasourceId/{datasourceVariableName}") + public void exportByDatasourceId( + @PathVariable("datasourceVariableName") String datasourceVariableName, + @MyRequestBody(required = true) Long datasourceId, + @MyRequestBody(elementType = OnlineFilterDto.class) List filterDtoList, + @MyRequestBody MyOrderParam orderParam, + @MyRequestBody(elementType = ExportInfo.class, required = true) List exportInfoList) throws IOException { + // 1. 验证数据源及其关联 + ResponseResult datasourceResult = + onlineOperationHelper.verifyAndGetDatasource(datasourceId); + if (!datasourceResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, datasourceResult); + } + OnlineDatasource datasource = datasourceResult.getData(); + if (!datasource.getVariableName().equals(datasourceVariableName)) { + ResponseResult.output(HttpServletResponse.SC_FORBIDDEN); + } + OnlineTable masterTable = datasource.getMasterTable(); + ResponseResult> relationListResult = + onlineOperationHelper.verifyAndGetRelationList(datasourceId, null); + if (!relationListResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, relationListResult); + } + List allRelationList = relationListResult.getData(); + // 2. 验证数据过滤对象中的表名和字段,确保没有sql注入。 + ResponseResult filterDtoListResult = this.verifyFilterDtoList(filterDtoList); + if (!filterDtoListResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, filterDtoListResult); + } + // 3. 解析排序参数,同时确保没有sql注入。 + Map tableMap = new HashMap<>(4); + tableMap.put(masterTable.getTableName(), masterTable); + List oneToOneRelationList = relationListResult.getData().stream() + .filter(r -> r.getRelationType().equals(RelationType.ONE_TO_ONE)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(oneToOneRelationList)) { + Map relationTableMap = oneToOneRelationList.stream() + .map(OnlineDatasourceRelation::getSlaveTable).collect(Collectors.toMap(OnlineTable::getTableName, c -> c)); + tableMap.putAll(relationTableMap); + } + ResponseResult orderByResult = this.makeOrderBy(orderParam, masterTable, tableMap); + if (!orderByResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, orderByResult); + } + String orderBy = orderByResult.getData(); + List> resultList = onlineOperationService.getMasterDataList( + masterTable, oneToOneRelationList, allRelationList, filterDtoList, orderBy); + Map headerMap = this.makeExportHeaderMap(masterTable, allRelationList, exportInfoList); + String filename = datasourceVariableName + "-" + MyDateUtil.toDateTimeString(DateTime.now()) + ".xlsx"; + ExportUtil.doExport(resultList, headerMap, filename); + } + /** * 根据数据源Id和数据源关联Id,以及接口参数,为动态表单查询该一对多关联的数据列表。 * @@ -655,6 +712,68 @@ public class OnlineOperationController { onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy); return ResponseResult.success(MyPageUtil.makeResponseData(resultList)); } + + /** + * 根据数据源Id和数据源关联Id,以及接口参数,为动态表单查询该一对多关联的数据列表。 + * + * @param datasourceVariableName 数据源名称。 + * @param datasourceId 数据源Id。 + * @param relationId 数据源的一对多关联Id。 + * @param filterDtoList 多虑数据对象列表。 + * @param orderParam 排序对象。 + * @param exportInfoList 导出字段信息列表。 + */ + @PostMapping("/exportByOneToManyRelationId/{datasourceVariableName}") + public void exportByOneToManyRelationId( + @PathVariable("datasourceVariableName") String datasourceVariableName, + @MyRequestBody(required = true) Long datasourceId, + @MyRequestBody(required = true) Long relationId, + @MyRequestBody(elementType = OnlineFilterDto.class) List filterDtoList, + @MyRequestBody MyOrderParam orderParam, + @MyRequestBody(elementType = ExportInfo.class, required = true) List exportInfoList) throws IOException { + String errorMessage; + OnlineDatasource datasource = onlineDatasourceService.getById(datasourceId); + if (datasource == null) { + errorMessage = "数据验证失败,数据源Id并不存在!"; + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, + ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage)); + } + if (!datasource.getVariableName().equals(datasourceVariableName)) { + ResponseResult.output(HttpServletResponse.SC_FORBIDDEN); + } + ResponseResult relationResult = + onlineOperationHelper.verifyAndGetOneToManyRelation(datasourceId, relationId); + if (!relationResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, relationResult); + } + OnlineDatasourceRelation relation = relationResult.getData(); + OnlineTable slaveTable = relation.getSlaveTable(); + // 验证数据过滤对象中的表名和字段,确保没有sql注入。 + ResponseResult filterDtoListResult = this.verifyFilterDtoList(filterDtoList); + if (!filterDtoListResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, filterDtoListResult); + } + Map tableMap = new HashMap<>(1); + tableMap.put(slaveTable.getTableName(), slaveTable); + if (CollUtil.isNotEmpty(orderParam)) { + for (MyOrderParam.OrderInfo orderInfo : orderParam) { + orderInfo.setFieldName(StrUtil.removePrefix(orderInfo.getFieldName(), + relation.getVariableName() + OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR)); + } + } + ResponseResult orderByResult = this.makeOrderBy(orderParam, slaveTable, tableMap); + if (!orderByResult.isSuccess()) { + ResponseResult.output(HttpServletResponse.SC_BAD_REQUEST, orderByResult); + } + String orderBy = orderByResult.getData(); + List> resultList = + onlineOperationService.getSlaveDataList(relation, filterDtoList, orderBy); + Map headerMap = this.makeExportHeaderMap( + null, CollUtil.newArrayList(relation), exportInfoList); + String filename = datasourceVariableName + "-relation-" + + MyDateUtil.toDateTimeString(DateTime.now()) + ".xlsx"; + ExportUtil.doExport(resultList, headerMap, filename); + } /** * 查询字典数据,并以字典的约定方式,返回数据结果集。 @@ -690,6 +809,60 @@ public class OnlineOperationController { return ResponseResult.success(resultList); } + private ResponseResult doDelete( + String datasourceVariableName, Long datasourceId, List dataIdList) { + String errorMessage; + ResponseResult datasourceResult = + onlineOperationHelper.verifyAndGetDatasource(datasourceId); + if (!datasourceResult.isSuccess()) { + return ResponseResult.errorFrom(datasourceResult); + } + OnlineDatasource datasource = datasourceResult.getData(); + if (!datasource.getVariableName().equals(datasourceVariableName)) { + ContextUtil.getHttpResponse().setStatus(HttpServletResponse.SC_FORBIDDEN); + return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); + } + OnlineTable masterTable = datasource.getMasterTable(); + ResponseResult> relationListResult = + onlineOperationHelper.verifyAndGetRelationList(datasourceId, RelationType.ONE_TO_MANY); + if (!relationListResult.isSuccess()) { + return ResponseResult.errorFrom(relationListResult); + } + List relationList = relationListResult.getData(); + for (String dataId : dataIdList) { + if (!onlineOperationService.delete(masterTable, relationList, dataId)) { + return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); + } + } + return ResponseResult.success(); + } + + private ResponseResult doDelete( + String datasourceVariableName, Long datasourceId, Long relationId, List dataIdList) { + String errorMessage; + OnlineDatasource datasource = onlineDatasourceService.getById(datasourceId); + if (datasource == null) { + errorMessage = "数据验证失败,数据源Id并不存在!"; + return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); + } + if (!datasource.getVariableName().equals(datasourceVariableName)) { + ContextUtil.getHttpResponse().setStatus(HttpServletResponse.SC_FORBIDDEN); + return ResponseResult.error(ErrorCodeEnum.NO_OPERATION_PERMISSION); + } + ResponseResult relationResult = + onlineOperationHelper.verifyAndGetOneToManyRelation(datasourceId, relationId); + if (!relationResult.isSuccess()) { + return ResponseResult.errorFrom(relationResult); + } + OnlineDatasourceRelation relation = relationResult.getData(); + for (String dataId : dataIdList) { + if (!onlineOperationService.delete(relation.getSlaveTable(), null, dataId)) { + return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); + } + } + return ResponseResult.success(); + } + private ResponseResult verifyFilterDtoList(List filterDtoList) { if (CollUtil.isEmpty(filterDtoList)) { return ResponseResult.success(); @@ -785,4 +958,57 @@ public class OnlineOperationController { } return ResponseResult.success(sb.toString()); } + + private Map makeExportHeaderMap( + OnlineTable masterTable, + List allRelationList, + List exportInfoList) { + Map headerMap = new LinkedHashMap<>(16); + Map allRelationMap = null; + if (CollUtil.isNotEmpty(allRelationList)) { + allRelationMap = allRelationList.stream() + .collect(Collectors.toMap(OnlineDatasourceRelation::getSlaveTableId, r -> r)); + } + for (ExportInfo exportInfo : exportInfoList) { + if (masterTable != null && exportInfo.getTableId().equals(masterTable.getTableId())) { + if (exportInfo.getVirtualColumnId() != null) { + OnlineVirtualColumn virtualColumn = + onlineVirtualColumnService.getById(exportInfo.getVirtualColumnId()); + if (virtualColumn != null) { + headerMap.put(virtualColumn.getObjectFieldName(), exportInfo.showName); + } + } else { + OnlineColumn column = masterTable.getColumnMap().get(exportInfo.getColumnId()); + if (column.getDictId() != null) { + headerMap.put(column.getColumnName() + "__DictMap.name", exportInfo.getShowName()); + } else { + headerMap.put(column.getColumnName(), exportInfo.getShowName()); + } + } + } else { + if (MapUtil.isEmpty(allRelationMap)) { + continue; + } + OnlineDatasourceRelation relation = allRelationMap.get(exportInfo.getTableId()); + if (relation != null) { + OnlineColumn column = relation.getSlaveTable().getColumnMap().get(exportInfo.getColumnId()); + String columnName = relation.getVariableName() + + OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR + column.getColumnName(); + if (column.getDictId() != null) { + columnName = columnName + "__DictMap.name"; + } + headerMap.put(columnName, exportInfo.getShowName()); + } + } + } + return headerMap; + } + + @Data + public static class ExportInfo { + private Long tableId; + private Long columnId; + private Long virtualColumnId; + private String showName; + } } diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/OnlineColumnMapper.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/OnlineColumnMapper.java index abbd3b22..4a2eeaca 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/OnlineColumnMapper.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/OnlineColumnMapper.java @@ -18,9 +18,7 @@ public interface OnlineColumnMapper extends BaseDaoMapper { * 获取过滤后的对象列表。 * * @param onlineColumnFilter 主表过滤对象。 - * @param orderBy 排序字符串,order by从句的参数。 * @return 对象列表。 */ - List getOnlineColumnList( - @Param("onlineColumnFilter") OnlineColumn onlineColumnFilter, @Param("orderBy") String orderBy); + List getOnlineColumnList(@Param("onlineColumnFilter") OnlineColumn onlineColumnFilter); } diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineColumnMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineColumnMapper.xml index c6bc89ac..10389b5f 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineColumnMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineColumnMapper.xml @@ -7,18 +7,18 @@ - - - + + + - - - + + + @@ -49,8 +49,6 @@ - - ORDER BY ${orderBy} - + ORDER BY column_show_order diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDatasourceRelationMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDatasourceRelationMapper.xml index a9200b1d..4f92c5f5 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDatasourceRelationMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDatasourceRelationMapper.xml @@ -10,8 +10,8 @@ - - + + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDictMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDictMapper.xml index a0cd621b..d036e704 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDictMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineDictMapper.xml @@ -14,7 +14,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml index 9f72c41a..bd3fde4e 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlinePageMapper.xml @@ -7,7 +7,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineRuleMapper.xml b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineRuleMapper.xml index f9d1c8ba..9d688d40 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineRuleMapper.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/dao/mapper/OnlineRuleMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/object/ConstDictInfo.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/object/ConstDictInfo.java new file mode 100644 index 00000000..f58e6429 --- /dev/null +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/object/ConstDictInfo.java @@ -0,0 +1,24 @@ +package com.orangeforms.common.online.object; + +import lombok.Data; + +import java.util.List; + +/** + * 在线表单常量字典的数据结构。 + * + * @author Jerry + * @date 2021-06-06 + */ +@Data +public class ConstDictInfo { + + private List dictData; + + @Data + public static class ConstDictData { + private String type; + private Object id; + private String name; + } +} diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/OnlineColumnService.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/OnlineColumnService.java index 7b278284..19174be7 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/OnlineColumnService.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/OnlineColumnService.java @@ -1,7 +1,6 @@ package com.orangeforms.common.online.service; import com.orangeforms.common.core.base.service.IBaseService; -import com.orangeforms.common.core.object.CallResult; import com.orangeforms.common.online.model.OnlineColumn; import com.orangeforms.common.online.model.OnlineColumnRule; import com.orangeforms.common.online.object.SqlTableColumn; @@ -105,22 +104,20 @@ public interface OnlineColumnService extends IBaseService { * 获取单表查询结果。由于没有关联数据查询,因此在仅仅获取单表数据的场景下,效率更高。 * 如果需要同时获取关联数据,请移步(getOnlineColumnListWithRelation)方法。 * - * @param filter 过滤对象。 - * @param orderBy 排序参数。 + * @param filter 过滤对象。 * @return 查询结果集。 */ - List getOnlineColumnList(OnlineColumn filter, String orderBy); + List getOnlineColumnList(OnlineColumn filter); /** * 获取主表的查询结果,以及主表关联的字典数据和一对一从表数据,以及一对一从表的字典数据。 * 该查询会涉及到一对一从表的关联过滤,或一对多从表的嵌套关联过滤,因此性能不如单表过滤。 * 如果仅仅需要获取主表数据,请移步(getOnlineColumnList),以便获取更好的查询性能。 * - * @param filter 主表过滤对象。 - * @param orderBy 排序参数。 + * @param filter 主表过滤对象。 * @return 查询结果集。 */ - List getOnlineColumnListWithRelation(OnlineColumn filter, String orderBy); + List getOnlineColumnListWithRelation(OnlineColumn filter); /** * 获取指定数据表Id集合的字段对象列表。 diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineColumnServiceImpl.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineColumnServiceImpl.java index 4736b222..f878598b 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineColumnServiceImpl.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineColumnServiceImpl.java @@ -8,8 +8,10 @@ import com.orangeforms.common.core.base.dao.BaseDaoMapper; import com.orangeforms.common.core.base.service.BaseService; import com.orangeforms.common.core.object.CallResult; import com.orangeforms.common.core.object.MyRelationParam; +import com.orangeforms.common.core.config.CoreProperties; import com.orangeforms.common.core.util.RedisKeyUtil; import com.orangeforms.common.sequence.wrapper.IdGeneratorWrapper; +import com.orangeforms.common.online.config.OnlineProperties; import com.orangeforms.common.online.dao.OnlineColumnMapper; import com.orangeforms.common.online.dao.OnlineColumnRuleMapper; import com.orangeforms.common.online.model.OnlineColumn; @@ -51,6 +53,8 @@ public class OnlineColumnServiceImpl extends BaseService imp private IdGeneratorWrapper idGenerator; @Autowired private RedissonClient redissonClient; + @Autowired + private OnlineProperties onlineProperties; /** * 返回当前Service的主表Mapper对象。 @@ -168,13 +172,12 @@ public class OnlineColumnServiceImpl extends BaseService imp * 获取单表查询结果。由于没有关联数据查询,因此在仅仅获取单表数据的场景下,效率更高。 * 如果需要同时获取关联数据,请移步(getOnlineColumnListWithRelation)方法。 * - * @param filter 过滤对象。 - * @param orderBy 排序参数。 + * @param filter 过滤对象。 * @return 查询结果集。 */ @Override - public List getOnlineColumnList(OnlineColumn filter, String orderBy) { - return onlineColumnMapper.getOnlineColumnList(filter, orderBy); + public List getOnlineColumnList(OnlineColumn filter) { + return onlineColumnMapper.getOnlineColumnList(filter); } /** @@ -182,13 +185,12 @@ public class OnlineColumnServiceImpl extends BaseService imp * 该查询会涉及到一对一从表的关联过滤,或一对多从表的嵌套关联过滤,因此性能不如单表过滤。 * 如果仅仅需要获取主表数据,请移步(getOnlineColumnList),以便获取更好的查询性能。 * - * @param filter 主表过滤对象。 - * @param orderBy 排序参数。 + * @param filter 主表过滤对象。 * @return 查询结果集。 */ @Override - public List getOnlineColumnListWithRelation(OnlineColumn filter, String orderBy) { - List resultList = onlineColumnMapper.getOnlineColumnList(filter, orderBy); + public List getOnlineColumnListWithRelation(OnlineColumn filter) { + List resultList = onlineColumnMapper.getOnlineColumnList(filter); // 在缺省生成的代码中,如果查询结果resultList不是Page对象,说明没有分页,那么就很可能是数据导出接口调用了当前方法。 // 为了避免一次性的大量数据关联,规避因此而造成的系统运行性能冲击,这里手动进行了分批次读取,开发者可按需修改该值。 int batchSize = resultList instanceof Page ? 0 : 1000; @@ -325,41 +327,75 @@ public class OnlineColumnServiceImpl extends BaseService imp } private String convertToJavaType(String columnType) { - if ("varchar".equals(columnType) - || "char".equals(columnType) - || "text".equals(columnType) - || "longtext".equals(columnType) - || "mediumtext".equals(columnType) - || "tinytext".equals(columnType)) { - return "String"; - } - if ("int".equals(columnType) - || "mediumint".equals(columnType) - || "smallint".equals(columnType) - || "tinyint".equals(columnType)) { - return "Integer"; - } - if ("bit".equals(columnType)) { - return "Boolean"; - } - if ("bigint".equals(columnType)) { - return "Long"; - } - if ("decimal".equals(columnType)) { - return "BigDecimal"; - } - if ("float".equals(columnType) - || "double".equals(columnType)) { - return "Double"; - } - if ("date".equals(columnType) - || "datetime".equals(columnType) - || "timestamp".equals(columnType) - || "time".equals(columnType)) { - return "Date"; - } - if ("blob".equals(columnType)) { - return "byte[]"; + if (onlineProperties.getDatabaseType().equals(CoreProperties.MYSQL_TYPE)) { + if ("varchar".equals(columnType) + || "char".equals(columnType) + || "text".equals(columnType) + || "longtext".equals(columnType) + || "mediumtext".equals(columnType) + || "tinytext".equals(columnType)) { + return "String"; + } + if ("int".equals(columnType) + || "mediumint".equals(columnType) + || "smallint".equals(columnType) + || "tinyint".equals(columnType)) { + return "Integer"; + } + if ("bit".equals(columnType)) { + return "Boolean"; + } + if ("bigint".equals(columnType)) { + return "Long"; + } + if ("decimal".equals(columnType)) { + return "BigDecimal"; + } + if ("float".equals(columnType) + || "double".equals(columnType)) { + return "Double"; + } + if ("date".equals(columnType) + || "datetime".equals(columnType) + || "timestamp".equals(columnType) + || "time".equals(columnType)) { + return "Date"; + } + if ("blob".equals(columnType)) { + return "byte[]"; + } + } else if (onlineProperties.getDatabaseType().equals(CoreProperties.POSTGRESQL_TYPE)) { + if ("varchar".equals(columnType) + || "char".equals(columnType) + || "text".equals(columnType)) { + return "String"; + } + if ("int4".equals(columnType) + || "int2".equals(columnType) + || "bit".equals(columnType)) { + return "Integer"; + } + if ("bool".equals(columnType)) { + return "Boolean"; + } + if ("int8".equals(columnType)) { + return "Long"; + } + if ("numeric".equals(columnType)) { + return "BigDecimal"; + } + if ("float4".equals(columnType) + || "float8".equals(columnType)) { + return "Double"; + } + if ("date".equals(columnType) + || "timestamp".equals(columnType) + || "time".equals(columnType)) { + return "Date"; + } + if ("bytea".equals(columnType)) { + return "byte[]"; + } } throw new RuntimeException("Unsupported Data Type"); } diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineDblinkServiceImpl.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineDblinkServiceImpl.java index f25b4270..a72e7bf2 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineDblinkServiceImpl.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineDblinkServiceImpl.java @@ -1,8 +1,11 @@ package com.orangeforms.common.online.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.StrUtil; import com.orangeforms.common.core.base.dao.BaseDaoMapper; import com.orangeforms.common.core.base.service.BaseService; +import com.orangeforms.common.core.config.CoreProperties; import com.orangeforms.common.core.config.DataSourceContextHolder; import com.orangeforms.common.core.object.MyRelationParam; import com.orangeforms.common.sequence.wrapper.IdGeneratorWrapper; @@ -166,7 +169,16 @@ public class OnlineDblinkServiceImpl extends BaseService imp resultList.forEach(r -> { SqlTableColumn sqlTableColumn = BeanUtil.mapToBean(r, SqlTableColumn.class, false, null); - sqlTableColumn.setAutoIncrement("auto_increment".equals(sqlTableColumn.getExtra())); + if (onlineProperties.getDatabaseType().equals(CoreProperties.POSTGRESQL_TYPE)) { + if (StrUtil.equalsAny(sqlTableColumn.getColumnType(), "char", "varchar")) { + sqlTableColumn.setFullColumnType( + sqlTableColumn.getColumnType() + "(" + sqlTableColumn.getStringPrecision() + ")"); + } else { + sqlTableColumn.setFullColumnType(sqlTableColumn.getColumnType()); + } + } else if (onlineProperties.getDatabaseType().equals(CoreProperties.MYSQL_TYPE)) { + sqlTableColumn.setAutoIncrement("auto_increment".equals(sqlTableColumn.getExtra())); + } columnList.add(sqlTableColumn); }); return columnList; @@ -191,9 +203,18 @@ public class OnlineDblinkServiceImpl extends BaseService imp if (result == null) { return null; } - SqlTableColumn sqlTableColumn = - BeanUtil.mapToBean(result, SqlTableColumn.class, false, null); - sqlTableColumn.setAutoIncrement("auto_increment".equals(sqlTableColumn.getExtra())); + SqlTableColumn sqlTableColumn = BeanUtil.mapToBean( + result, SqlTableColumn.class, false, CopyOptions.create().ignoreCase()); + if (onlineProperties.getDatabaseType().equals(CoreProperties.POSTGRESQL_TYPE)) { + if (StrUtil.equalsAny(sqlTableColumn.getColumnType(), "char", "varchar")) { + sqlTableColumn.setFullColumnType( + sqlTableColumn.getColumnType() + "(" + sqlTableColumn.getStringPrecision() + ")"); + } else { + sqlTableColumn.setFullColumnType(sqlTableColumn.getColumnType()); + } + } else if (onlineProperties.getDatabaseType().equals(CoreProperties.MYSQL_TYPE)) { + sqlTableColumn.setAutoIncrement("auto_increment".equals(sqlTableColumn.getExtra())); + } return sqlTableColumn; } finally { DataSourceContextHolder.unset(originalType); diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java index d751b34f..c55f308f 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/service/impl/OnlineOperationServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.map.MapUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import com.orangeforms.common.core.annotation.MyDataSourceResolver; import com.orangeforms.common.core.config.CoreProperties; @@ -19,6 +20,7 @@ import com.orangeforms.common.datafilter.constant.DataPermRuleType; import com.orangeforms.common.datafilter.config.DataFilterProperties; import com.orangeforms.common.online.config.OnlineProperties; import com.orangeforms.common.online.model.constant.*; +import com.orangeforms.common.online.object.ConstDictInfo; import com.orangeforms.common.online.service.OnlineVirtualColumnService; import com.orangeforms.common.online.util.OnlineOperationHelper; import com.orangeforms.common.sequence.wrapper.IdGeneratorWrapper; @@ -75,14 +77,14 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { /** * 聚合返回数据中,聚合键的常量字段名。 - * 如select groupColumn groupedKey, max(aggregationColumn) aggregatedValue。 + * 如select groupColumn grouped_key, max(aggregationColumn) aggregated_value。 */ - private static final String KEY_NAME = "groupedKey"; + private static final String KEY_NAME = "grouped_key"; /** * 聚合返回数据中,聚合值的常量字段名。 - * 如select groupColumn groupedKey, max(aggregationColumn) aggregatedValue。 + * 如select groupColumn grouped_key, max(aggregationColumn) aggregated_value。 */ - private static final String VALUE_NAME = "aggregatedValue"; + private static final String VALUE_NAME = "aggregated_value"; @Transactional(rollbackFor = Exception.class) @Override @@ -556,8 +558,10 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { if (CollUtil.isEmpty(dictIdSet)) { return; } - List dictList = onlineDictService.getOnlineDictList(dictIdSet) - .stream().filter(d -> d.getDictType() == DictType.TABLE).collect(Collectors.toList()); + List allDictList = onlineDictService.getOnlineDictList(dictIdSet); + List dictList = allDictList.stream() + .filter(d -> d.getDictType() == DictType.TABLE || d.getDictType() == DictType.CUSTOM) + .collect(Collectors.toList()); for (OnlineDict dict : dictList) { Collection columnNameList = dictColumnMap.get(dict.getDictId()); for (String columnName : columnNameList) { @@ -571,27 +575,38 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { if (CollUtil.isEmpty(dictIdDataSet)) { continue; } - String selectFields = this.makeDictSelectFields(dict, true); - List filterList = new LinkedList<>(); - if (StrUtil.isNotBlank(dict.getDeletedColumnName())) { - OnlineFilterDto filter = new OnlineFilterDto(); - filter.setColumnName(dict.getDeletedColumnName()); - filter.setColumnValue(GlobalDeletedFlag.NORMAL); - filterList.add(filter); - } - OnlineFilterDto inlistFilter = new OnlineFilterDto(); - inlistFilter.setColumnName(dict.getKeyColumnName()); - inlistFilter.setColumnValueList(dictIdDataSet); - inlistFilter.setFilterType(FieldFilterType.IN_LIST_FILTER); - filterList.add(inlistFilter); - List> dictResultList = - onlineOperationMapper.getDictList(dict.getTableName(), selectFields, filterList, null); - if (CollUtil.isEmpty(dictResultList)) { - continue; - } - Map dictResultMap = new HashMap<>(dictResultList.size()); - for (Map dictResult : dictResultList) { - dictResultMap.put(dictResult.get("id"), dictResult.get("name")); + Map dictResultMap; + if (dict.getDictType().equals(DictType.CUSTOM)) { + ConstDictInfo dictInfo = + JSONObject.parseObject(dict.getDictDataJson(), ConstDictInfo.class); + List dictDataList = dictInfo.getDictData(); + dictResultMap = new HashMap<>(dictDataList.size()); + for (ConstDictInfo.ConstDictData dictData : dictDataList) { + dictResultMap.put(dictData.getId(), dictData.getName()); + } + } else { + String selectFields = this.makeDictSelectFields(dict, true); + List filterList = new LinkedList<>(); + if (StrUtil.isNotBlank(dict.getDeletedColumnName())) { + OnlineFilterDto filter = new OnlineFilterDto(); + filter.setColumnName(dict.getDeletedColumnName()); + filter.setColumnValue(GlobalDeletedFlag.NORMAL); + filterList.add(filter); + } + OnlineFilterDto inlistFilter = new OnlineFilterDto(); + inlistFilter.setColumnName(dict.getKeyColumnName()); + inlistFilter.setColumnValueList(dictIdDataSet); + inlistFilter.setFilterType(FieldFilterType.IN_LIST_FILTER); + filterList.add(inlistFilter); + List> dictResultList = + onlineOperationMapper.getDictList(dict.getTableName(), selectFields, filterList, null); + if (CollUtil.isEmpty(dictResultList)) { + continue; + } + dictResultMap = new HashMap<>(dictResultList.size()); + for (Map dictResult : dictResultList) { + dictResultMap.put(dictResult.get("id"), dictResult.get("name")); + } } String dictKeyName = columnName + "__DictMap"; for (Map result : resultList) { @@ -664,32 +679,32 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { .append(column.getColumnName()) .append(" AS ") .append(intString) - .append(") ") + .append(") \"") .append(relationVariableName) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } else if ("date".equals(column.getColumnType())) { selectFieldBuider .append("CAST(") .append(slaveTable.getTableName()) .append(".") .append(column.getColumnName()) - .append(" AS CHAR(10)) ") + .append(" AS CHAR(10)) \"") .append(relationVariableName) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } else { selectFieldBuider .append(slaveTable.getTableName()) .append(".") .append(column.getColumnName()) - .append(" ") + .append(" \"") .append(relationVariableName) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } } return selectFieldBuider.substring(0, selectFieldBuider.length() - 1); @@ -718,32 +733,32 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { .append(column.getColumnName()) .append(" AS ") .append(intString) - .append(") ") + .append(") \"") .append(relation.getVariableName()) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } else if ("date".equals(column.getColumnType())) { selectFieldBuider .append("CAST(") .append(slaveTable.getTableName()) .append(".") .append(column.getColumnName()) - .append(" AS CHAR(10)) ") + .append(" AS CHAR(10)) \"") .append(relation.getVariableName()) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } else { selectFieldBuider .append(slaveTable.getTableName()) .append(".") .append(column.getColumnName()) - .append(" ") + .append(" \"") .append(relation.getVariableName()) .append(OnlineConstant.RELATION_TABLE_COLUMN_SEPARATOR) .append(column.getColumnName()) - .append(","); + .append("\","); } } } @@ -762,18 +777,18 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { .append(column.getColumnName()) .append(" AS ") .append(intString) - .append(") ") + .append(") \"") .append(column.getColumnName()) - .append(","); + .append("\","); } else if ("date".equals(column.getColumnType())) { selectFieldBuider .append("CAST(") .append(masterTable.getTableName()) .append(".") .append(column.getColumnName()) - .append(" AS CHAR(10)) ") + .append(" AS CHAR(10)) \"") .append(column.getColumnName()) - .append(","); + .append("\","); } else { selectFieldBuider .append(masterTable.getTableName()) @@ -787,10 +802,10 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { private String makeDictSelectFields(OnlineDict onlineDict, boolean ignoreParentId) { StringBuilder sb = new StringBuilder(128); - sb.append(onlineDict.getKeyColumnName()).append(" id, "); - sb.append(onlineDict.getValueColumnName()).append(" name"); + sb.append(onlineDict.getKeyColumnName()).append(" \"id\", "); + sb.append(onlineDict.getValueColumnName()).append(" \"name\""); if (!ignoreParentId && onlineDict.getTreeFlag()) { - sb.append(", ").append(onlineDict.getParentKeyColumnName()).append(" parentId"); + sb.append(", ").append(onlineDict.getParentKeyColumnName()).append(" \"parentId\""); } return sb.toString(); } diff --git a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java index 9b253947..7dbee80a 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java +++ b/orange-demo-flowable/orange-demo-flowable-service/common/common-online/src/main/java/com/orangeforms/common/online/util/OnlineOperationHelper.java @@ -1,6 +1,7 @@ package com.orangeforms.common.online.util; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -114,10 +115,6 @@ public class OnlineOperationHelper { if (relation == null || !relation.getDatasourceId().equals(datasourceId)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); } - if (!relation.getRelationType().equals(RelationType.ONE_TO_MANY)) { - errorMessage = "数据验证失败,数据源关联 [" + relation.getRelationName() + " ] 不是一对多关联,不能调用该接口!"; - return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); - } OnlineTable slaveTable = onlineTableService.getOnlineTableFromCache(relation.getSlaveTableId()); if (slaveTable == null) { errorMessage = "数据验证失败,数据源关联 [" + relation.getRelationName() + " ] 引用的从表不存在!"; @@ -173,6 +170,13 @@ public class OnlineOperationHelper { continue; } Object value = tableData.get(column.getColumnName()); + if (value != null) { + if ("Long".equals(column.getObjectFieldType())) { + value = Long.valueOf(value.toString()); + } else if ("Date".equals(column.getObjectFieldType())) { + value = Convert.toDate(value); + } + } // 对于主键数据的处理。 if (column.getPrimaryKey()) { // 如果是更新则必须包含主键参数。 diff --git a/orange-demo-flowable/orange-demo-flowable-service/pom.xml b/orange-demo-flowable/orange-demo-flowable-service/pom.xml index 2caaa016..7a3bcd0e 100644 --- a/orange-demo-flowable/orange-demo-flowable-service/pom.xml +++ b/orange-demo-flowable/orange-demo-flowable-service/pom.xml @@ -10,8 +10,8 @@ pom - 2.3.10.RELEASE - 2.3.1 + 2.5.8 + 2.5.5 UTF-8 1.8 1.8 diff --git a/orange-demo-flowable/orange-demo-flowable-service/zz-resource/db-scripts/.DS_Store b/orange-demo-flowable/orange-demo-flowable-service/zz-resource/db-scripts/.DS_Store deleted file mode 100644 index 5008ddfc..00000000 Binary files a/orange-demo-flowable/orange-demo-flowable-service/zz-resource/db-scripts/.DS_Store and /dev/null differ diff --git a/orange-demo-flowable/orange-demo-flowable-web/src/staticDict/onlineStaticDict.js b/orange-demo-flowable/orange-demo-flowable-web/src/staticDict/onlineStaticDict.js index 00ebfea3..077fe589 100644 --- a/orange-demo-flowable/orange-demo-flowable-web/src/staticDict/onlineStaticDict.js +++ b/orange-demo-flowable/orange-demo-flowable-web/src/staticDict/onlineStaticDict.js @@ -216,7 +216,7 @@ const SysOnlineRuleType = new DictionaryBase('验证规则类型', [ symbol: 'MOBILE' }, { - id: 7, + id: 100, name: '自定义验证', symbol: 'CUSTOM' } @@ -381,6 +381,11 @@ const SysCustomWidgetOperationType = new DictionaryBase('操作类型', [ name: '导出', symbol: 'EXPORT' }, + { + id: 10, + name: '批量删除', + symbol: 'BATCH_DELETE' + }, { id: 20, name: '自定义操作', diff --git a/orange-demo-flowable/orange-demo-flowable-web/src/views/layout/index.vue b/orange-demo-flowable/orange-demo-flowable-web/src/views/layout/index.vue index ed29ec97..9eb6c72c 100644 --- a/orange-demo-flowable/orange-demo-flowable-web/src/views/layout/index.vue +++ b/orange-demo-flowable/orange-demo-flowable-web/src/views/layout/index.vue @@ -14,7 +14,7 @@
+ style="height: 18px; line-height: 18px; cursor: pointer;"> diff --git a/orange-demo-flowable/orange-demo-flowable-web/src/views/onlineForm/components/customTable.vue b/orange-demo-flowable/orange-demo-flowable-web/src/views/onlineForm/components/customTable.vue index fa891ca4..4e2a514e 100644 --- a/orange-demo-flowable/orange-demo-flowable-web/src/views/onlineForm/components/customTable.vue +++ b/orange-demo-flowable/orange-demo-flowable-web/src/views/onlineForm/components/customTable.vue @@ -11,7 +11,8 @@ v-for="operation in getTableOperation(false)" :key="operation.id" :plain="operation.plain" :type="operation.btnType" - @click.stop="onOperationClick(operation)"> + @click.stop="onOperationClick(operation)" + > {{operation.name}}
@@ -22,7 +23,8 @@ :style="{height: (widgetConfig.tableInfo.height != null && widgetConfig.tableInfo.height !== '') ? widgetConfig.tableInfo.height + 'px' : undefined}" :height="(widgetConfig.tableInfo.height != null && widgetConfig.tableInfo.height !== '') ? widgetConfig.tableInfo.height + 'px' : undefined" :data="tableWidget.dataList" :row-key="primaryColumnName" - @sort-change="tableWidget.onSortChange"> + @sort-change="tableWidget.onSortChange" @selection-change="onTableSelectionChange"> +